From cb7e85a49d3eb32ba0be9fa6dd60446a5fc1818d Mon Sep 17 00:00:00 2001 From: ultrapeer Date: Fri, 8 Jan 2016 19:04:53 +0100 Subject: [PATCH 001/189] Translated using Weblate (Turkish) Currently translated at 100.0% (552 of 552 strings) --- plinth/locale/tr/LC_MESSAGES/django.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plinth/locale/tr/LC_MESSAGES/django.po b/plinth/locale/tr/LC_MESSAGES/django.po index 95f2971a6..e8c31bd57 100644 --- a/plinth/locale/tr/LC_MESSAGES/django.po +++ b/plinth/locale/tr/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-01-08 15:55+0100\n" -"PO-Revision-Date: 2016-01-08 16:25+0000\n" +"PO-Revision-Date: 2016-01-08 19:04+0000\n" "Last-Translator: ultrapeer \n" "Language-Team: Turkish " "\n" @@ -610,7 +610,7 @@ msgid "" "may find the services which are provided by FreedomBox (like your ownCloud)." msgstr "" "Eğer İnternet erişim sağlayıcınız IP adresinizi periyodik bir şekilde (" -"mesela her 24 saatte bir) değiştiriyorsa diğerler kişiler sizi ağda bulmakta " +"mesela her 24 saatte bir) değiştiriyorsa diğer kişiler sizi ağda bulmakta " "zorlanabilir. Ve bu sebeple kimse FreedomBox tarafından sunulan servisleri (" "sizin ownCloud'unuz gibi) bulamayabilir." @@ -2968,7 +2968,7 @@ msgid "" "change the password." msgstr "" "Parolayı değiştirmek için parola " -"değşitirme formunu kullanın." +"değiştirme formunu kullanın." #: plinth/modules/users/templates/users_update.html:53 msgid "Save Changes" From 447f067734c369281d9a414fdcee3d372c478661 Mon Sep 17 00:00:00 2001 From: ultrapeer Date: Sat, 9 Jan 2016 19:43:17 +0100 Subject: [PATCH 002/189] Translated using Weblate (French) Currently translated at 100.0% (537 of 537 strings) --- plinth/locale/fr/LC_MESSAGES/django.po | 81 +++++++++++++------------- 1 file changed, 41 insertions(+), 40 deletions(-) diff --git a/plinth/locale/fr/LC_MESSAGES/django.po b/plinth/locale/fr/LC_MESSAGES/django.po index 955ec3c4d..eb0050dfe 100644 --- a/plinth/locale/fr/LC_MESSAGES/django.po +++ b/plinth/locale/fr/LC_MESSAGES/django.po @@ -9,8 +9,8 @@ msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-12-20 13:58+0530\n" -"PO-Revision-Date: 2016-01-09 19:37+0000\n" -"Last-Translator: Philippe Baret \n" +"PO-Revision-Date: 2016-01-09 19:43+0000\n" +"Last-Translator: ultrapeer \n" "Language-Team: French " "\n" "Language: fr\n" @@ -525,7 +525,7 @@ msgstr "" "l'Internet (si par exemple votre routeur fait du \"NAT\" Network Address " "Translation), cette URL est utilisée pour trouver l'IP Internet réelle. " "L'URL doit retourner l'IP correspondante à l'endroit où le client se trouve. " -"Example : http://myip.datasystems24.de" +"Exemple : http://myip.datasystems24.de" #: plinth/modules/dynamicdns/dynamicdns.py:101 msgid "" @@ -603,7 +603,7 @@ msgstr "Configurer le DNS Dynamique" #: plinth/modules/dynamicdns/dynamicdns.py:236 msgid "Status of Dynamic DNS" -msgstr "Etat du DNS Dynamique" +msgstr "État du DNS Dynamique" #: plinth/modules/dynamicdns/templates/dynamicdns.html:25 msgid "DynamicDNS client" @@ -695,9 +695,9 @@ msgid "" "will not detect IP changes). It may take up to %(timer)s minutes until we " "update your DNS entry in case of WAN IP change." msgstr "" -"Derrière le NAT, un service DNS dynamique sondera la résolution IP/URL ou " -"\"IP check URL\" pour vérifier des modifications (nous avons besoin de la " -"résoultion \"IP check URL\" pour cette raison - sinon, nous ne détecterons " +"Derrière le NAT, un service DNS dynamique sondera la résolution IP/URL ou \"" +"IP check URL\" pour vérifier des modifications (nous avons besoin de la " +"résolution \"IP check URL\" pour cette raison - sinon, nous ne détecterons " "pas les modifications de l'IP). Cela pourrait prendre jusque %(timer)s " "minutes avant de mettre à jour votre entrée DNS en cas de modification de " "l'IP WAN." @@ -802,7 +802,7 @@ msgstr "Félicitations ! Votre FreedomBox fonctionne !" msgid "" "Please provide the following basic information to complete the setup process." msgstr "" -"Cliquer sur « Suivant» pour achever la configuration en enregistrant les " +"Cliquer sur « Suivant » pour achever la configuration en enregistrant les " "informations de base." #: plinth/modules/first_boot/templates/firstboot_state0.html:62 @@ -890,7 +890,7 @@ msgstr "Documentation et FAQ" #: plinth/modules/help/help.py:55 #, python-brace-format msgid "About {box_name}" -msgstr "A Propos de {box_name}" +msgstr "À Propos de {box_name}" #: plinth/modules/help/templates/help_about.html:30 msgid "" @@ -908,7 +908,7 @@ msgstr "" "interface entre vous et le reste de l'Internet afin de protéger votre vie " "privée et vos données. FreedomBox intègre des applications permettant " "notamment de publier un blog, un wiki, un site Internet, un réseau social, " -"de gérer des emails, un proxy Web et un relai Tor sur une machine pouvant " +"de gérer des emails, un proxy Web et un relais Tor sur une machine pouvant " "remplacer votre routeur Wi-Fi. Vos données restent donc avec vous." #: plinth/modules/help/templates/help_about.html:43 @@ -966,7 +966,7 @@ msgid "" "start for information regarding %(box_name)s." msgstr "" "Le Manuel FreedomBox propose des informations " -"des informations de base sur %(box_name)s." +"de base sur %(box_name)s." #: plinth/modules/help/templates/help_index.html:36 msgid "" @@ -1128,11 +1128,11 @@ msgstr "{name} supprimé." #: plinth/modules/ikiwiki/views.py:176 #, python-brace-format msgid "Could not delete {name}: {error}" -msgstr "La supression de {name} n'a pas abouti : {error}" +msgstr "La suppression de {name} n'a pas abouti : {error}" #: plinth/modules/ikiwiki/views.py:182 msgid "Delete Wiki/Blog" -msgstr "Suprimer Wiki/Blogue" +msgstr "Supprimer Wiki/Blogue" #: plinth/modules/mumble/__init__.py:38 #: plinth/modules/mumble/templates/mumble.html:26 @@ -1153,7 +1153,7 @@ msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " "software." msgstr "" -"Mumble est un logiciel de chat vocal de haute qualité, open source, encrypté " +"Mumble est un logiciel de chat vocal de haute qualité, open source, crypté " "et à faible temps de latence." #: plinth/modules/mumble/templates/mumble.html:36 @@ -1226,7 +1226,7 @@ msgstr "L'appareil réseau auquel cette connexion devrait être liée." #: plinth/modules/networks/forms.py:56 plinth/modules/networks/forms.py:113 #: plinth/modules/networks/forms.py:140 msgid "Firewall Zone" -msgstr "Zone Pare-Feu" +msgstr "Zone pare-feu" #: plinth/modules/networks/forms.py:57 plinth/modules/networks/forms.py:114 #: plinth/modules/networks/forms.py:141 @@ -1333,7 +1333,7 @@ msgstr "" #: plinth/modules/networks/forms.py:158 msgid "Passphrase" -msgstr "Phrase Secrète" +msgstr "Phrase secrète" #: plinth/modules/networks/forms.py:166 msgid "" @@ -1356,7 +1356,7 @@ msgstr "Réseaux Wi-Fi à Proximité" #: plinth/modules/networks/networks.py:40 #: plinth/modules/networks/networks.py:295 msgid "Add Connection" -msgstr "Ajouter Connection" +msgstr "Ajouter connexion" #: plinth/modules/networks/networks.py:46 msgid "Networks" @@ -1368,21 +1368,21 @@ msgstr "Impossible de montrer la connexion : connexion introuvable." #: plinth/modules/networks/networks.py:100 msgid "Show Connection information" -msgstr "Montrer les informations sur la connection" +msgstr "Montrer les informations sur la connexion" #: plinth/modules/networks/networks.py:113 msgid "Cannot edit connection: Connection not found." -msgstr "Impossible de modifier la connection : connexion introuvable." +msgstr "Impossible de modifier la connexion : connexion introuvable." #: plinth/modules/networks/networks.py:119 msgid "This type of connection is not yet understood." -msgstr "Ce type de connection n'est pas encore intelligible." +msgstr "Ce type de connexion n'est pas encore intelligible." #: plinth/modules/networks/networks.py:170 #: plinth/modules/networks/networks.py:229 #: plinth/modules/networks/templates/connections_edit.html:34 msgid "Edit Connection" -msgstr "Modifier Connexion" +msgstr "Modifier connexion" #: plinth/modules/networks/networks.py:240 #, python-brace-format @@ -1397,7 +1397,7 @@ msgstr "Échec de l'activation de la connexion : connexion introuvable." #, python-brace-format msgid "Failed to activate connection {name}: No suitable device is available." msgstr "" -"Echec de l'activation de la connexion {name} : pas d'appareil adequat " +"Échec de l'activation de la connexion {name} : pas d'appareil adéquat " "disponible." #: plinth/modules/networks/networks.py:260 @@ -1487,7 +1487,7 @@ msgstr "Appareil" #: plinth/modules/networks/templates/connection_show.html:88 msgid "State" -msgstr "Etat" +msgstr "État" #: plinth/modules/networks/templates/connection_show.html:93 msgid "State reason" @@ -1511,7 +1511,7 @@ msgstr "Lien Physique" #: plinth/modules/networks/templates/connection_show.html:121 msgid "Link state" -msgstr "Etat du lien" +msgstr "État du lien" #: plinth/modules/networks/templates/connection_show.html:125 msgid "cable is connected" @@ -1603,7 +1603,7 @@ msgid "" "your a local network/machine, many services meant to available only " "internally will not be available." msgstr "" -"Cette inferface doit recevoir votre connexion internet. Si vous la connectez " +"Cette interface doit recevoir votre connexion internet. Si vous la connectez " "à une machine ou un réseau local, beaucoup de services conçus pour un usage " "interne ne seront pas disponibles." @@ -1795,7 +1795,7 @@ msgstr "Installation terminée." #: plinth/modules/openvpn/views.py:126 msgid "Setup failed." -msgstr "Echec de l'installation." +msgstr "Échec de l'installation." #: plinth/modules/owncloud/owncloud.py:38 msgid "Enable ownCloud" @@ -1867,7 +1867,7 @@ msgid "" "Select your pagekite server. Set \"pagekite.net\" to use the default " "pagekite.net server." msgstr "" -"Sélectionner votre serveur pagekite. Etablir \"pagekite.net\" pour une " +"Sélectionner votre serveur pagekite. Établir \"pagekite.net\" pour une " "utilisation par défaut du serveur pagekite.net." #: plinth/modules/pagekite/forms.py:55 @@ -1876,7 +1876,7 @@ msgstr "Port serveur" #: plinth/modules/pagekite/forms.py:56 msgid "Port of your pagekite server (default: 80)" -msgstr "Port de votre serveur pagekite (default: 80)" +msgstr "Port de votre serveur pagekite (par défaut : 80)" #: plinth/modules/pagekite/forms.py:58 msgid "Kite name" @@ -1884,7 +1884,7 @@ msgstr "Nom Kite" #: plinth/modules/pagekite/forms.py:59 msgid "Example: mybox.pagekite.me" -msgstr "Example: monpc.pagekite.me" +msgstr "Exemple : monpc.pagekite.me" #: plinth/modules/pagekite/forms.py:62 msgid "Invalid kite name" @@ -2031,7 +2031,7 @@ msgstr "%(box_name)s est derrière un pare-feu restrictif." msgid "" "%(box_name)s is connected to a (wireless) router which you don't control." msgstr "" -"%(box_name)s est connecté à un réseau (sans fil) que vous ne contrôlez pas." +"%(box_name)s est connecté à un réseau (sans fil) que vous ne contrôlez pas." #: plinth/modules/pagekite/templates/pagekite_introduction.html:50 msgid "" @@ -2130,7 +2130,7 @@ msgstr "Pagekite" #: plinth/modules/pagekite/views.py:34 msgid "About PageKite" -msgstr "A propos de PageKite" +msgstr "À propos de PageKite" #: plinth/modules/pagekite/views.py:38 msgid "Standard Services" @@ -2359,12 +2359,13 @@ msgid "" "imap.example.com. For IMAP over SSL (recommended), fill the " "server field like imaps://imap.example.com." msgstr "" -"Vous pouvez accéder à RoundCube depuis /roundcube. Rensigner le nom d'utilisateur et le mot de passe de votre compte de " +"Vous pouvez accéder à RoundCube depuis /roundcube" +". Renseigner le nom d'utilisateur et le mot de passe de votre compte de " "courrier électronique auquel vous souhaitez accéder, suivis du nom de " -"domaine du serveur IMAP de votre fournisseur d'email, comme imap." -"example.com. Pour de l'IMAP sur du SSL (recommandé), remplissez les " -"champs du serveur avec par exemple imaps://imap.example.com." +"domaine du serveur IMAP de votre fournisseur d'email, comme " +"imap.example.com. Pour de l'IMAP sur du SSL (recommandé), " +"remplissez les champs du serveur avec par exemple " +"imaps://imap.example.com." #: plinth/modules/roundcube/templates/roundcube.html:50 msgid "" @@ -2438,7 +2439,7 @@ msgstr "" #: plinth/modules/tor/__init__.py:50 msgid "Tor relay port available" -msgstr "Port du relai Tor disponible" +msgstr "Port du relais Tor disponible" #: plinth/modules/tor/__init__.py:58 msgid "Obfs3 transport registered" @@ -2672,7 +2673,7 @@ msgid "" "When enabled, the unattended-upgrades program will be run once per day. It " "will attempt to perform any package upgrades that are available." msgstr "" -"Lorsqu'activé, le programme unattended-upgrades sera mis en oeuvre une fois " +"Lorsqu'activé, le programme unattended-upgrades sera mis en œuvre une fois " "par jour. Il essayera de réaliser l'ensemble des mises à niveau disponibles." #: plinth/modules/upgrades/templates/upgrades.html:40 @@ -2780,7 +2781,7 @@ msgstr "" #: plinth/modules/users/forms.py:80 #, python-brace-format msgid "Failed to add new user to {group} group." -msgstr "Echec de l'ajout d'un nouvel utilisateur au groupe {group}." +msgstr "Échec de l'ajout d'un nouvel utilisateur au groupe {group}." #: plinth/modules/users/forms.py:126 msgid "Renaming LDAP user failed." @@ -2883,7 +2884,7 @@ msgstr "Changer Mot de Passe" #: plinth/modules/users/views.py:130 msgid "Password changed successfully." -msgstr "Mot de passe changé avec succés." +msgstr "Mot de passe changé avec succès." #: plinth/modules/xmpp/__init__.py:41 plinth/modules/xmpp/__init__.py:46 #: plinth/modules/xmpp/templates/xmpp.html:26 plinth/modules/xmpp/views.py:75 From 70d85cbd6fdb669bd1a0937b43b54fec296ef104 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Tue, 22 Dec 2015 16:00:27 -0500 Subject: [PATCH 003/189] monkeysphere: New module for verifying SSH servers monkeysphere: Run publish as background task, allow user to cancel. Small fixes to names module: - Remove unused ugettext import. - Change SERVICES to tuple. - If a domain is not available for a service type, return None instead of (translated) "Not Available". - Rename get_services -> get_enabled_services. --- actions/monkeysphere | 126 +++++++++++++++ data/etc/plinth/modules-enabled/monkeysphere | 1 + plinth/modules/monkeysphere/__init__.py | 33 ++++ .../monkeysphere/templates/monkeysphere.html | 108 +++++++++++++ plinth/modules/monkeysphere/tests/__init__.py | 0 plinth/modules/monkeysphere/urls.py | 34 +++++ plinth/modules/monkeysphere/views.py | 144 ++++++++++++++++++ plinth/modules/names/__init__.py | 21 ++- plinth/modules/names/tests/test_names.py | 14 +- plinth/modules/names/views.py | 2 +- 10 files changed, 464 insertions(+), 19 deletions(-) create mode 100755 actions/monkeysphere create mode 100644 data/etc/plinth/modules-enabled/monkeysphere create mode 100644 plinth/modules/monkeysphere/__init__.py create mode 100644 plinth/modules/monkeysphere/templates/monkeysphere.html create mode 100644 plinth/modules/monkeysphere/tests/__init__.py create mode 100644 plinth/modules/monkeysphere/urls.py create mode 100644 plinth/modules/monkeysphere/views.py diff --git a/actions/monkeysphere b/actions/monkeysphere new file mode 100755 index 000000000..bce21c8fd --- /dev/null +++ b/actions/monkeysphere @@ -0,0 +1,126 @@ +#!/usr/bin/python3 +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Configuration helper for monkeysphere. +""" + +import argparse +import os +import subprocess + +HOST_TOOL = 'monkeysphere-host' + + +def parse_arguments(): + """Return parsed command line arguments as dictionary.""" + parser = argparse.ArgumentParser() + subparsers = parser.add_subparsers(dest='subcommand', help='Sub command') + + host_show_key = subparsers.add_parser('host-show-key', + help='Show host key fingerprint') + host_show_key.add_argument('keyid', nargs='*', + help='Optional list of KEYIDs') + + host_import_ssh_key = subparsers.add_parser('host-import-ssh-key', + help='Import host SSH key') + host_import_ssh_key.add_argument('hostname', + help='Fully-qualified hostname') + + host_publish_key = subparsers.add_parser( + 'host-publish-key', + help='Push host key to keyserver') + host_publish_key.add_argument( + 'keyid', nargs='*', + help='Optional list of KEYIDs') + + return parser.parse_args() + + +def subcommand_host_show_key(arguments): + """Show host key fingerprint.""" + keyid = ' '.join(arguments.keyid) + try: + output = subprocess.check_output([HOST_TOOL, 'show-key', keyid]) + except subprocess.CalledProcessError: + # no keys available + return + + # parse output + keys = [dict()] + lines = output.decode().strip().split('\n') + for line in lines: + if line.startswith('pub'): + data = line.lstrip('pub').split() + keys[-1]['pub'] = data[0] + keys[-1]['date'] = data[1] + elif line.startswith('uid'): + keys[-1]['uid'] = line.lstrip('uid').strip() + elif line.startswith('OpenPGP fingerprint:'): + keys[-1]['pgp_fingerprint'] = line.lstrip('Open PGP fingerprint:') + elif line.startswith('ssh fingerprint:'): + data = line.lstrip('ssh fingerprint:').split() + keys[-1]['ssh_keysize'] = data[0] + keys[-1]['ssh_fingerprint'] = data[1] + keys[-1]['ssh_keytype'] = data[2].strip('()') + elif line == '': + keys.append(dict()) + + for key in keys: + print(key['pub'], key['date'], key['uid'], key['pgp_fingerprint'], + key['ssh_keysize'], key['ssh_fingerprint'], key['ssh_keytype']) + + +def subcommand_host_import_ssh_key(arguments): + """Import host SSH key.""" + output = subprocess.check_output( + [HOST_TOOL, 'import-key', + '/etc/ssh/ssh_host_rsa_key', arguments.hostname]) + print(output.decode()) + + +def subcommand_host_publish_key(arguments): + """Push host key to keyserver.""" + keyid = ' '.join(arguments.keyid) + # setting TMPDIR as workaround for Debian bug #656750 + proc = subprocess.Popen( + [HOST_TOOL, 'publish-keys', keyid], + stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False, + env=dict( + os.environ, + TMPDIR='/var/lib/monkeysphere/authentication/tmp/', + MONKEYSPHERE_PROMPT='false')) + output, error = proc.communicate() + output, error = output.decode(), error.decode() + if proc.returncode != 0: + raise Exception(output, error) + + print(output) + + +def main(): + """Parse arguments and perform all duties.""" + arguments = parse_arguments() + + subcommand = arguments.subcommand.replace('-', '_') + subcommand_method = globals()['subcommand_' + subcommand] + subcommand_method(arguments) + + +if __name__ == '__main__': + main() diff --git a/data/etc/plinth/modules-enabled/monkeysphere b/data/etc/plinth/modules-enabled/monkeysphere new file mode 100644 index 000000000..2de664397 --- /dev/null +++ b/data/etc/plinth/modules-enabled/monkeysphere @@ -0,0 +1 @@ +plinth.modules.monkeysphere diff --git a/plinth/modules/monkeysphere/__init__.py b/plinth/modules/monkeysphere/__init__.py new file mode 100644 index 000000000..d9501870d --- /dev/null +++ b/plinth/modules/monkeysphere/__init__.py @@ -0,0 +1,33 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Plinth module for monkeysphere. +""" + +from django.utils.translation import ugettext_lazy as _ + +from plinth import cfg + +depends = ['plinth.modules.system'] + + +def init(): + """Initialize the monkeysphere module.""" + menu = cfg.main_menu.get('system:index') + menu.add_urlname(_('Monkeysphere'), 'glyphicon-certificate', + 'monkeysphere:index', 970) diff --git a/plinth/modules/monkeysphere/templates/monkeysphere.html b/plinth/modules/monkeysphere/templates/monkeysphere.html new file mode 100644 index 000000000..fbab833e0 --- /dev/null +++ b/plinth/modules/monkeysphere/templates/monkeysphere.html @@ -0,0 +1,108 @@ +{% extends "base.html" %} +{% comment %} +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +{% endcomment %} + +{% load bootstrap %} +{% load i18n %} + +{% block page_head %} + + {% if running %} + + {% endif %} + +{% endblock %} + + +{% block content %} + +

{% trans "Monkeysphere" %}

+ +

+ {% blocktrans trimmed with box_name=cfg.box_name %} + With Monkeysphere, a PGP key can be generated for each domain + serving SSH on this {{ box_name }}. The PGP public key can then be + uploaded to the PGP keyservers. Users connecting to this {{ box_name }} + through SSH can verify that they are connecting to the correct + host. See the + + Monkeysphere SSH documentation for more details. + {% endblocktrans %} +

+ +{% if running %} +

+ + {% trans "Publishing key to keyserver..." %} + +

+ {% csrf_token %} + + +
+

+{% endif %} + +
+
+ + {% for name_service in status.name_services %} + + + + + + {% endfor %} +
+ {{ name_service.type }}
+ {{ name_service.name }} +
+ {% if name_service.key %} + {{ name_service.key.pgp_fingerprint }} + {% else %} + {% trans "Not Available" %} + {% endif %} + + {% if name_service.available %} + {% if not name_service.key %} +
+ {% csrf_token %} + + +
+ + {% elif not running %} +
+ {% csrf_token %} + + +
+ {% endif %} + {% endif %} +
+
+
+ +{% endblock %} diff --git a/plinth/modules/monkeysphere/tests/__init__.py b/plinth/modules/monkeysphere/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/plinth/modules/monkeysphere/urls.py b/plinth/modules/monkeysphere/urls.py new file mode 100644 index 000000000..d45cd3855 --- /dev/null +++ b/plinth/modules/monkeysphere/urls.py @@ -0,0 +1,34 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +URLs for the monkeysphere module. +""" + +from django.conf.urls import url + +from . import views + + +urlpatterns = [ + url(r'^sys/monkeysphere/$', views.index, name='index'), + url(r'^sys/monkeysphere/(?P[\w]+)/generate/$', + views.generate, name='generate'), + url(r'^sys/monkeysphere/(?P[\w]+)/publish/$', + views.publish, name='publish'), + url(r'^sys/monkeysphere/cancel/$', views.cancel, name='cancel'), +] diff --git a/plinth/modules/monkeysphere/views.py b/plinth/modules/monkeysphere/views.py new file mode 100644 index 000000000..c3184e47d --- /dev/null +++ b/plinth/modules/monkeysphere/views.py @@ -0,0 +1,144 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Views for the monkeysphere module. +""" + +from django.contrib import messages +from django.core.urlresolvers import reverse_lazy +from django.shortcuts import redirect +from django.template.response import TemplateResponse +from django.utils.translation import ugettext as _ +from django.views.decorators.http import require_POST + +from plinth import actions +from plinth import package +from plinth.modules import names + +publish_process = None + + +@package.required(['monkeysphere']) +def index(request): + """Serve configuration page.""" + _collect_publish_result(request) + status = get_status() + return TemplateResponse( + request, 'monkeysphere.html', + {'title': _('Monkeysphere'), + 'status': status, + 'running': bool(publish_process)}) + + +@require_POST +def generate(request, service): + """Generate PGP key for SSH service.""" + for domain_type in sorted(names.get_domain_types()): + if domain_type == service: + domain = names.get_domain(domain_type) + + try: + actions.superuser_run( + 'monkeysphere', + ['host-import-ssh-key', 'ssh://' + domain]) + messages.success(request, _('Generated PGP key')) + except actions.ActionError as exception: + messages.error(request, str(exception)) + + return redirect(reverse_lazy('monkeysphere:index')) + + +@require_POST +def publish(request, fingerprint): + """Publish PGP key for SSH service.""" + global publish_process + if not publish_process: + publish_process = actions.superuser_run( + 'monkeysphere', ['host-publish-key', fingerprint], async=True) + + return redirect(reverse_lazy('monkeysphere:index')) + + +@require_POST +def cancel(request): + """Cancel ongoing process.""" + global publish_process + if publish_process: + publish_process.terminate() + publish_process = None + messages.info(request, _('Cancelled publish key.')) + + return redirect(reverse_lazy('monkeysphere:index')) + + +def get_status(): + """Get the current status.""" + output = actions.superuser_run('monkeysphere', ['host-show-key']) + keys = [] + for line in output.split('\n'): + data = line.strip().split() + if data and len(data) == 7: + keys.append(dict()) + keys[-1]['pub'] = data[0] + keys[-1]['date'] = data[1] + keys[-1]['uid'] = data[2] + keys[-1]['name'] = data[2].replace('ssh://', '') + keys[-1]['pgp_fingerprint'] = data[3] + keys[-1]['ssh_keysize'] = data[4] + keys[-1]['ssh_fingerprint'] = data[5] + keys[-1]['ssh_keytype'] = data[6] + + name_services = [] + for domain_type in sorted(names.get_domain_types()): + domain = names.get_domain(domain_type) + name_services.append({ + 'type': names.get_description(domain_type), + 'short_type': domain_type, + 'name': domain or _('Not Available'), + 'available': bool(domain), + 'key': None, + }) + + # match up keys with name services + for key in keys: + for name_service in name_services: + if key['name'] == name_service['name']: + name_service['key'] = key + continue + + return {'name_services': name_services} + + +def _collect_publish_result(request): + """Handle publish process completion.""" + global publish_process + if not publish_process: + return + + return_code = publish_process.poll() + + # Publish process is not complete yet + if return_code is None: + return + + if not return_code: + messages.success(request, _('Published key to keyserver.')) + else: + messages.error(request, _('Error occurred while publishing key.')) + + publish_process = None diff --git a/plinth/modules/names/__init__.py b/plinth/modules/names/__init__.py index 36e4d03ec..841b95f7f 100644 --- a/plinth/modules/names/__init__.py +++ b/plinth/modules/names/__init__.py @@ -19,18 +19,17 @@ Plinth module to configure name services """ -from django.utils.translation import ugettext as _, ugettext_lazy +from django.utils.translation import ugettext_lazy as _ import logging from plinth import cfg from plinth.signals import domain_added, domain_removed - -SERVICES = [ - ('http', ugettext_lazy('HTTP'), 80), - ('https', ugettext_lazy('HTTPS'), 443), - ('ssh', ugettext_lazy('SSH'), 22), -] +SERVICES = ( + ('http', _('HTTP'), 80), + ('https', _('HTTPS'), 443), + ('ssh', _('SSH'), 22), +) depends = ['plinth.modules.system'] @@ -43,7 +42,7 @@ def init(): """Initialize the names module.""" menu = cfg.main_menu.get('system:index') - menu.add_urlname(ugettext_lazy('Name Services'), 'glyphicon-tag', + menu.add_urlname(_('Name Services'), 'glyphicon-tag', 'names:index', 19) domain_added.connect(on_domain_added) @@ -104,10 +103,10 @@ def get_domain(domain_type): if domain_type in domains and len(domains[domain_type]) > 0: return list(domains[domain_type].keys())[0] else: - return _('Not Available') + return None -def get_services(domain_type, domain): +def get_enabled_services(domain_type, domain): """Get list of enabled services for a domain.""" try: return domains[domain_type][domain] @@ -118,5 +117,5 @@ def get_services(domain_type, domain): def get_services_status(domain_type, domain): """Get list of whether each service is enabled for a domain.""" - enabled = get_services(domain_type, domain) + enabled = get_enabled_services(domain_type, domain) return [service[0] in enabled for service in SERVICES] diff --git a/plinth/modules/names/tests/test_names.py b/plinth/modules/names/tests/test_names.py index 6c98ca9d4..6c28aa3a3 100644 --- a/plinth/modules/names/tests/test_names.py +++ b/plinth/modules/names/tests/test_names.py @@ -24,7 +24,7 @@ from .. import domain_types, domains from .. import on_domain_added, on_domain_removed from .. import get_domain_types, get_description -from .. import get_domain, get_services, get_services_status +from .. import get_domain, get_enabled_services, get_services_status class TestNames(unittest.TestCase): @@ -73,20 +73,20 @@ def test_get_domain(self): on_domain_added('', 'hiddenservice', 'aaaaa.onion') self.assertEqual(get_domain('hiddenservice'), 'aaaaa.onion') - self.assertEqual('Not Available', get_domain('abcdef')) + self.assertEqual(None, get_domain('abcdef')) on_domain_removed('', 'hiddenservice') - self.assertEqual('Not Available', get_domain('hiddenservice')) + self.assertEqual(None, get_domain('hiddenservice')) - def test_get_services(self): + def test_get_enabled_services(self): """Test getting enabled services for a domain.""" on_domain_added('', 'domainname', 'bbbbb', '', ['http', 'https', 'ssh']) - self.assertEqual(get_services('domainname', 'bbbbb'), + self.assertEqual(get_enabled_services('domainname', 'bbbbb'), ['http', 'https', 'ssh']) - self.assertEqual(get_services('xxxxx', 'yyyyy'), []) - self.assertEqual(get_services('domainname', 'zzzzz'), []) + self.assertEqual(get_enabled_services('xxxxx', 'yyyyy'), []) + self.assertEqual(get_enabled_services('domainname', 'zzzzz'), []) def test_get_services_status(self): """Test getting whether each service is enabled for a domain.""" diff --git a/plinth/modules/names/views.py b/plinth/modules/names/views.py index cd5d94267..c95ea0b00 100644 --- a/plinth/modules/names/views.py +++ b/plinth/modules/names/views.py @@ -42,7 +42,7 @@ def get_status(): domain = get_domain(domain_type) name_services.append({ 'type': get_description(domain_type), - 'name': domain, + 'name': domain or _('Not Available'), 'services_enabled': get_services_status(domain_type, domain), }) From 6afe350fe5192e43c51bfb8de238ac78b65a3464 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Thu, 14 Jan 2016 13:47:54 +0530 Subject: [PATCH 004/189] monkeysphere: Proper domain handling Action: - Don't use const for HOST_TOOL, it is unlikely to be ever changed. - Don't pass multiple key ids as single string to monkeysphere-host. - Use JSON for data transfer with action instead of custom format and parsing. - Minor styling fixes. Template: - More consistent indentation. - Improve the description. - Add headers to the table. - List domains instead of domain types. URLs: - Take domain as argument for key generation. - Narrow down fingerprint matching regex. Views: - Take domain as argument for key generation. Verify that domain is valid. - Minor grammer fix to cancel message. - Use JSON format for getting key status. - List domains instead of domain types. --- actions/monkeysphere | 48 +++--- .../monkeysphere/templates/monkeysphere.html | 140 +++++++++--------- plinth/modules/monkeysphere/urls.py | 4 +- plinth/modules/monkeysphere/views.py | 74 ++++----- 4 files changed, 122 insertions(+), 144 deletions(-) diff --git a/actions/monkeysphere b/actions/monkeysphere index bce21c8fd..6a8b0fc75 100755 --- a/actions/monkeysphere +++ b/actions/monkeysphere @@ -21,42 +21,39 @@ Configuration helper for monkeysphere. """ import argparse +import json import os import subprocess -HOST_TOOL = 'monkeysphere-host' - def parse_arguments(): """Return parsed command line arguments as dictionary.""" parser = argparse.ArgumentParser() subparsers = parser.add_subparsers(dest='subcommand', help='Sub command') - host_show_key = subparsers.add_parser('host-show-key', - help='Show host key fingerprint') - host_show_key.add_argument('keyid', nargs='*', - help='Optional list of KEYIDs') + host_show_keys = subparsers.add_parser( + 'host-show-keys', help='Show host key fingerprints') + host_show_keys.add_argument( + 'key_ids', nargs='*', help='Optional list of KEYIDs') - host_import_ssh_key = subparsers.add_parser('host-import-ssh-key', - help='Import host SSH key') - host_import_ssh_key.add_argument('hostname', - help='Fully-qualified hostname') + host_import_ssh_key = subparsers.add_parser( + 'host-import-ssh-key', help='Import host SSH key') + host_import_ssh_key.add_argument( + 'hostname', help='Fully-qualified hostname') host_publish_key = subparsers.add_parser( - 'host-publish-key', - help='Push host key to keyserver') + 'host-publish-key', help='Push host key to keyserver') host_publish_key.add_argument( - 'keyid', nargs='*', - help='Optional list of KEYIDs') + 'key_ids', nargs='*', help='Optional list of KEYIDs') return parser.parse_args() -def subcommand_host_show_key(arguments): - """Show host key fingerprint.""" - keyid = ' '.join(arguments.keyid) +def subcommand_host_show_keys(arguments): + """Show host key fingerprints.""" try: - output = subprocess.check_output([HOST_TOOL, 'show-key', keyid]) + output = subprocess.check_output( + ['monkeysphere-host', 'show-keys'] + arguments.key_ids) except subprocess.CalledProcessError: # no keys available return @@ -75,32 +72,29 @@ def subcommand_host_show_key(arguments): keys[-1]['pgp_fingerprint'] = line.lstrip('Open PGP fingerprint:') elif line.startswith('ssh fingerprint:'): data = line.lstrip('ssh fingerprint:').split() - keys[-1]['ssh_keysize'] = data[0] + keys[-1]['ssh_key_size'] = data[0] keys[-1]['ssh_fingerprint'] = data[1] - keys[-1]['ssh_keytype'] = data[2].strip('()') + keys[-1]['ssh_key_type'] = data[2].strip('()') elif line == '': keys.append(dict()) - for key in keys: - print(key['pub'], key['date'], key['uid'], key['pgp_fingerprint'], - key['ssh_keysize'], key['ssh_fingerprint'], key['ssh_keytype']) + print(json.dumps({'keys': keys})) def subcommand_host_import_ssh_key(arguments): """Import host SSH key.""" output = subprocess.check_output( - [HOST_TOOL, 'import-key', + ['monkeysphere-host', 'import-key', '/etc/ssh/ssh_host_rsa_key', arguments.hostname]) print(output.decode()) def subcommand_host_publish_key(arguments): """Push host key to keyserver.""" - keyid = ' '.join(arguments.keyid) # setting TMPDIR as workaround for Debian bug #656750 proc = subprocess.Popen( - [HOST_TOOL, 'publish-keys', keyid], - stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False, + ['monkeysphere-host', 'publish-keys'] + arguments.key_ids, + stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=dict( os.environ, TMPDIR='/var/lib/monkeysphere/authentication/tmp/', diff --git a/plinth/modules/monkeysphere/templates/monkeysphere.html b/plinth/modules/monkeysphere/templates/monkeysphere.html index fbab833e0..2e67c5204 100644 --- a/plinth/modules/monkeysphere/templates/monkeysphere.html +++ b/plinth/modules/monkeysphere/templates/monkeysphere.html @@ -32,77 +32,81 @@ {% block content %} -

{% trans "Monkeysphere" %}

- -

- {% blocktrans trimmed with box_name=cfg.box_name %} - With Monkeysphere, a PGP key can be generated for each domain - serving SSH on this {{ box_name }}. The PGP public key can then be - uploaded to the PGP keyservers. Users connecting to this {{ box_name }} - through SSH can verify that they are connecting to the correct - host. See the - - Monkeysphere SSH documentation for more details. - {% endblocktrans %} -

- -{% if running %} -

- - {% trans "Publishing key to keyserver..." %} - -

- {% csrf_token %} - - -
+

{% trans "Monkeysphere" %}

+ +

+ {% blocktrans trimmed %} + With Monkeysphere, a PGP key can be generated for each configured domain + serving SSH. The PGP public key can then be uploaded to the PGP + keyservers. Users connecting to this machine through SSH can verify that + they are connecting to the correct host. For users to trust the key, at + least one person (usually the machine owner) must sign the key using the + regular PGP key signing process. See the + + Monkeysphere SSH documentation for more details. + {% endblocktrans %}

-{% endif %} -
-
- - {% for name_service in status.name_services %} - - - - - - {% endfor %} -
- {{ name_service.type }}
- {{ name_service.name }} -
- {% if name_service.key %} - {{ name_service.key.pgp_fingerprint }} - {% else %} - {% trans "Not Available" %} - {% endif %} - - {% if name_service.available %} - {% if not name_service.key %} -
- {% csrf_token %} - - -
- - {% elif not running %} -
- {% csrf_token %} + {% if running %} +

+ + {% trans "Publishing key to keyserver..." %} + + + {% csrf_token %} + + +

+

+ {% endif %} - - - {% endif %} - {% endif %} -
+
+
+ + + + + + + + + + {% for domain in status.domains %} + + + + + + {% endfor %} + +
{% trans "Domain" %}{% trans "GPG Fingerprint" %}{% trans "Actions" %}
{{ domain.name }} + {% if domain.key %} + {{ domain.key.pgp_fingerprint }} + {% else %} + {% trans "Not Available" %} + {% endif %} + + {% if not domain.key %} +
+ {% csrf_token %} + + +
+ {% elif not running %} +
+ {% csrf_token %} + + +
+ {% endif %} +
+
-
{% endblock %} diff --git a/plinth/modules/monkeysphere/urls.py b/plinth/modules/monkeysphere/urls.py index d45cd3855..5d5e20dea 100644 --- a/plinth/modules/monkeysphere/urls.py +++ b/plinth/modules/monkeysphere/urls.py @@ -26,9 +26,9 @@ urlpatterns = [ url(r'^sys/monkeysphere/$', views.index, name='index'), - url(r'^sys/monkeysphere/(?P[\w]+)/generate/$', + url(r'^sys/monkeysphere/(?P[^/]+)/generate/$', views.generate, name='generate'), - url(r'^sys/monkeysphere/(?P[\w]+)/publish/$', + url(r'^sys/monkeysphere/(?P[0-9A-Fa-f]+)/publish/$', views.publish, name='publish'), url(r'^sys/monkeysphere/cancel/$', views.cancel, name='cancel'), ] diff --git a/plinth/modules/monkeysphere/views.py b/plinth/modules/monkeysphere/views.py index c3184e47d..777c64b25 100644 --- a/plinth/modules/monkeysphere/views.py +++ b/plinth/modules/monkeysphere/views.py @@ -25,6 +25,7 @@ from django.template.response import TemplateResponse from django.utils.translation import ugettext as _ from django.views.decorators.http import require_POST +import json from plinth import actions from plinth import package @@ -46,19 +47,17 @@ def index(request): @require_POST -def generate(request, service): +def generate(request, domain): """Generate PGP key for SSH service.""" - for domain_type in sorted(names.get_domain_types()): - if domain_type == service: - domain = names.get_domain(domain_type) - - try: - actions.superuser_run( - 'monkeysphere', - ['host-import-ssh-key', 'ssh://' + domain]) - messages.success(request, _('Generated PGP key')) - except actions.ActionError as exception: - messages.error(request, str(exception)) + valid_domain = any((domain in domains + for domains in names.domains.values())) + if valid_domain: + try: + actions.superuser_run( + 'monkeysphere', ['host-import-ssh-key', 'ssh://' + domain]) + messages.success(request, _('Generated PGP key.')) + except actions.ActionError as exception: + messages.error(request, str(exception)) return redirect(reverse_lazy('monkeysphere:index')) @@ -81,47 +80,28 @@ def cancel(request): if publish_process: publish_process.terminate() publish_process = None - messages.info(request, _('Cancelled publish key.')) + messages.info(request, _('Cancelled key publishing.')) return redirect(reverse_lazy('monkeysphere:index')) def get_status(): """Get the current status.""" - output = actions.superuser_run('monkeysphere', ['host-show-key']) - keys = [] - for line in output.split('\n'): - data = line.strip().split() - if data and len(data) == 7: - keys.append(dict()) - keys[-1]['pub'] = data[0] - keys[-1]['date'] = data[1] - keys[-1]['uid'] = data[2] - keys[-1]['name'] = data[2].replace('ssh://', '') - keys[-1]['pgp_fingerprint'] = data[3] - keys[-1]['ssh_keysize'] = data[4] - keys[-1]['ssh_fingerprint'] = data[5] - keys[-1]['ssh_keytype'] = data[6] - - name_services = [] - for domain_type in sorted(names.get_domain_types()): - domain = names.get_domain(domain_type) - name_services.append({ - 'type': names.get_description(domain_type), - 'short_type': domain_type, - 'name': domain or _('Not Available'), - 'available': bool(domain), - 'key': None, - }) - - # match up keys with name services - for key in keys: - for name_service in name_services: - if key['name'] == name_service['name']: - name_service['key'] = key - continue - - return {'name_services': name_services} + output = actions.superuser_run('monkeysphere', ['host-show-keys']) + keys = {} + for key in json.loads(output)['keys']: + key['name'] = key['uid'].replace('ssh://', '') + keys[key['name']] = key + + domains = [] + for domains_of_a_type in names.domains.values(): + for domain in domains_of_a_type: + domains.append({ + 'name': domain, + 'key': keys.get(domain), + }) + + return {'domains': domains} def _collect_publish_result(request): From 1a17819380770c5d8956c3541b22111784becdf1 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 8 Jan 2016 12:35:53 +0530 Subject: [PATCH 005/189] letsencrypt: New basic module for SSL certficates This is the first implementation for obtaining certificates from Let's Encrypt. Following the features and limitations. - Requires manual operation. - Registrations are done anonymously. - Supports revoking and re-obtaining certificates. Does not have a way to show if a certficate is already renewed. - Automatic renewal is not available. - Details messages in case of errors. - Has ability to switch to testing mode by using LE's staging servers. - Sets up Apache configuration for the domain and enables/disables it. When certificates are not available for a domain, default website configuration is used. When certificates are available, separate SSL website configuration for each domain is used. - Many domain will work with a single IP address with the help of Server Name Indication (SNI) which is supported by all modern browsers. - Supports diagnostics on websites. --- actions/letsencrypt | 184 ++++++++++++++++++ data/etc/plinth/modules-enabled/letsencrypt | 1 + plinth/modules/letsencrypt/__init__.py | 58 ++++++ .../letsencrypt/templates/letsencrypt.html | 128 ++++++++++++ plinth/modules/letsencrypt/tests/__init__.py | 0 plinth/modules/letsencrypt/urls.py | 33 ++++ plinth/modules/letsencrypt/views.py | 92 +++++++++ 7 files changed, 496 insertions(+) create mode 100755 actions/letsencrypt create mode 100644 data/etc/plinth/modules-enabled/letsencrypt create mode 100644 plinth/modules/letsencrypt/__init__.py create mode 100644 plinth/modules/letsencrypt/templates/letsencrypt.html create mode 100644 plinth/modules/letsencrypt/tests/__init__.py create mode 100644 plinth/modules/letsencrypt/urls.py create mode 100644 plinth/modules/letsencrypt/views.py diff --git a/actions/letsencrypt b/actions/letsencrypt new file mode 100755 index 000000000..6999590de --- /dev/null +++ b/actions/letsencrypt @@ -0,0 +1,184 @@ +#!/usr/bin/python3 +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Configuration helper for Let's Encrypt. +""" + +import argparse +import json +import os +import subprocess +import sys + +from plinth import action_utils + +TEST_MODE = False +LIVE_DIRECTORY = '/etc/letsencrypt/live/' +APACHE_PREFIX = '/etc/apache2/sites-available/' +APACHE_CONFIGURATION = ''' + + + ServerAdmin webmaster@localhost + ServerName {domain} + DocumentRoot /var/www/html + + Options FollowSymLinks + AllowOverride None + + + Options Indexes FollowSymLinks MultiViews + AllowOverride None + Order allow,deny + allow from all + + ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ + + AllowOverride None + Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch + Order allow,deny + Allow from all + + ErrorLog ${{APACHE_LOG_DIR}}/error.log + # Possible values include: debug, info, notice, warn, error, crit, alert, emerg. + LogLevel warn + CustomLog ${{APACHE_LOG_DIR}}/ssl_access.log combined + # GnuTLS Switch: Enable/Disable SSL/TLS for this virtual host. + GnuTLSEnable On + # Automatically obtained certficates from Let's Encrypt + GnuTLSCertificateFile /etc/letsencrypt/live/{domain}/fullchain.pem + GnuTLSKeyFile /etc/letsencrypt/live/{domain}/privkey.pem + # See http://www.outoforder.cc/projects/apache/mod_gnutls/docs/#GnuTLSPriorities + GnuTLSPriorities NORMAL + + +''' + + +def parse_arguments(): + """Return parsed command line arguments as dictionary.""" + parser = argparse.ArgumentParser() + subparsers = parser.add_subparsers(dest='subcommand', help='Sub command') + + subparsers.add_parser( + 'get-status', help='Return the status of configured domains.') + revoke_parser = subparsers.add_parser( + 'revoke', help='Disable and domain and revoke its certificate.') + revoke_parser.add_argument( + '--domain', help='Domain name to revoke certificate for') + obtain_parser = subparsers.add_parser( + 'obtain', help='Obtain certficate for a domain and setup website.') + obtain_parser.add_argument( + '--domain', help='Domain name to obtain certificate for') + + return parser.parse_args() + + +def get_certficate_expiry(domain): + """Return the expiry date of a certificate.""" + certificate_file = os.path.join(LIVE_DIRECTORY, domain, 'cert.pem') + output = subprocess.check_output(['openssl', 'x509', '-enddate', '-noout', + '-in', certificate_file]) + return output.decode().strip().split('=')[1] + + +def subcommand_get_status(_): + """Return a JSON dictionary of currently configured domains.""" + domains = os.listdir(LIVE_DIRECTORY) + domains = [domain for domain in domains + if os.path.isdir(os.path.join(LIVE_DIRECTORY, domain))] + + domain_status = {} + for domain in domains: + domain_status[domain] = { + 'certificate_available': True, + 'expiry_date': get_certficate_expiry(domain), + 'web_enabled': + action_utils.webserver_is_enabled(domain, kind='site') + } + + print(json.dumps({'domains': domain_status})) + + +def subcommand_revoke(arguments): + """Disable a domain and revoke the certificate.""" + domain = arguments.domain + + command = ['letsencrypt', 'revoke', '--domain', domain, '--cert-path', + os.path.join(LIVE_DIRECTORY, domain, 'cert.pem')] + if TEST_MODE: + command.append('--staging') + + process = subprocess.Popen(command, stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + stdout, stderr = process.communicate() + if process.returncode: + print(stderr.decode(), file=sys.stderr) + sys.exit(1) + + action_utils.webserver_disable(domain, kind='site') + + +def subcommand_obtain(arguments): + """Obtain a certificate for a domain and setup website.""" + domain = arguments.domain + + command = [ + 'letsencrypt', 'certonly', '--agree-tos', + '--register-unsafely-without-email', '--domain', arguments.domain, + '--authenticator', 'webroot', '--webroot-path', '/var/www/html/', + '--renew-by-default'] + if TEST_MODE: + command.append('--staging') + + process = subprocess.Popen(command, stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + stdin, stderr = process.communicate() + if process.returncode: + print(stderr.decode(), file=sys.stderr) + sys.exit(1) + + setup_webserver_config(domain) + + action_utils.webserver_enable(domain, kind='site') + + +def setup_webserver_config(domain): + """Create SSL web server configuration for a domain. + + Do so only if there is no configuration existing. + """ + file_name = os.path.join(APACHE_PREFIX, domain + '.conf') + if os.path.isfile(file_name): + return + + with open(file_name, 'w') as file_handle: + file_handle.write(APACHE_CONFIGURATION.format(domain=domain)) + + +def main(): + """Parse arguments and perform all duties.""" + arguments = parse_arguments() + + subcommand = arguments.subcommand.replace('-', '_') + subcommand_method = globals()['subcommand_' + subcommand] + subcommand_method(arguments) + + +if __name__ == '__main__': + main() diff --git a/data/etc/plinth/modules-enabled/letsencrypt b/data/etc/plinth/modules-enabled/letsencrypt new file mode 100644 index 000000000..92134d1c2 --- /dev/null +++ b/data/etc/plinth/modules-enabled/letsencrypt @@ -0,0 +1 @@ +plinth.modules.letsencrypt diff --git a/plinth/modules/letsencrypt/__init__.py b/plinth/modules/letsencrypt/__init__.py new file mode 100644 index 000000000..565d78bed --- /dev/null +++ b/plinth/modules/letsencrypt/__init__.py @@ -0,0 +1,58 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Plinth module for using Let's Encrypt. +""" + +from django.utils.translation import ugettext_lazy as _ +import json + +from plinth import actions +from plinth import action_utils +from plinth import cfg +from plinth import service as service_module +from plinth.modules import names + + +depends = [ + 'plinth.modules.apps', + 'plinth.modules.names' +] + +service = None + + +def init(): + """Intialize the module.""" + menu = cfg.main_menu.get('system:index') + menu.add_urlname(_('Certificates (Let\'s Encrypt)'), + 'glyphicon-lock', 'letsencrypt:index', 20) + + +def diagnose(): + """Run diagnostics and return the results.""" + results = [] + + for domain_type, domains in names.domains.items(): + if domain_type == 'hiddenservice': + continue + + for domain in domains: + results.append(action_utils.diagnose_url('https://' + domain)) + + return results diff --git a/plinth/modules/letsencrypt/templates/letsencrypt.html b/plinth/modules/letsencrypt/templates/letsencrypt.html new file mode 100644 index 000000000..ba92f871d --- /dev/null +++ b/plinth/modules/letsencrypt/templates/letsencrypt.html @@ -0,0 +1,128 @@ +{% extends "base.html" %} +{% comment %} +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +{% endcomment %} + +{% load bootstrap %} +{% load i18n %} + +{% block page_head %} + +{% endblock %} + +{% block content %} + +

{% trans "Certificates (Let's Encrypt)" %}

+ +

+ {% blocktrans trimmed with box_name=cfg.box_name %} + A digital certficate allows users of a web service to verify the + identity of the service and to securely communicate with it. + {{ box_name }} can automatically obtain and setup digital + certificates for each available domain. It does so by proving + itself to be the owner of a domain to Let's Encrypt, a + certficate authority (CA). + {% endblocktrans %} +

+ +

+ {% blocktrans trimmed %} + Let's Encrypt is a free, automated, and open certificate + authority, run for the public’s benefit by the Internet Security + Research Group (ISRG). Please read and agree with the + Let's Encrypt + Subscriber Agreement before using this service. + {% endblocktrans %} +

+ +
+
+ + + + + + + + + + + {% for domain, domain_status in status.domains.items %} + + + + + + + {% endfor %} + +
{% trans "Domain" %}{% trans "Certificate Status" %}{% trans "Website Security" %}{% trans "Actions" %}
{{ domain }} + {% if domain_status.certificate_available %} + + {% blocktrans trimmed with expiry_date=domain_status.expiry_date %} + Expires on {{ expiry_date }} + {% endblocktrans %} + + {% else %} + + {% trans "No certficate" %} + + {% endif %} + + {% if domain_status.web_enabled %} + {% trans "Enabled" %} + {% else %} + {% trans "Disabled" %} + {% endif %} + + {% if domain_status.certificate_available %} +
+ {% csrf_token %} + +
+
+ {% csrf_token %} + +
+ {% else %} +
+ {% csrf_token %} + +
+ {% endif %} +
+
+
+ + {% include "diagnostics_button.html" with module="letsencrypt" %} + +{% endblock %} diff --git a/plinth/modules/letsencrypt/tests/__init__.py b/plinth/modules/letsencrypt/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/plinth/modules/letsencrypt/urls.py b/plinth/modules/letsencrypt/urls.py new file mode 100644 index 000000000..09d0bdb9a --- /dev/null +++ b/plinth/modules/letsencrypt/urls.py @@ -0,0 +1,33 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +URLs for the Let's Encrypt module. +""" + +from django.conf.urls import url + +from . import views + + +urlpatterns = [ + url(r'^sys/letsencrypt/$', views.index, name='index'), + url(r'^sys/letsencrypt/revoke/(?P[^/]+)/$', views.revoke, + name='revoke'), + url(r'^sys/letsencrypt/obtain/(?P[^/]+)/$', views.obtain, + name='obtain'), +] diff --git a/plinth/modules/letsencrypt/views.py b/plinth/modules/letsencrypt/views.py new file mode 100644 index 000000000..eb8660759 --- /dev/null +++ b/plinth/modules/letsencrypt/views.py @@ -0,0 +1,92 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Plinth module for using Let's Encrypt. +""" + +from django.contrib import messages +from django.core.urlresolvers import reverse_lazy +from django.shortcuts import redirect +from django.template.response import TemplateResponse +from django.utils.translation import ugettext as _ +from django.views.decorators.http import require_POST +import json +import logging + +from plinth import actions +from plinth import package +from plinth.errors import ActionError +from plinth.modules import names + +logger = logging.getLogger(__name__) + + +@package.required(['letsencrypt']) +def index(request): + """Serve configuration page.""" + status = get_status() + + return TemplateResponse(request, 'letsencrypt.html', + {'title': _('Certificates (Let\'s Encrypt)'), + 'status': status}) + + +@require_POST +def revoke(request, domain): + """Revoke a certficate for a given domain.""" + try: + actions.superuser_run('letsencrypt', ['revoke', '--domain', domain]) + messages.success( + request, _('Certificate successfully revoked for domain {domain}') + .format(domain=domain)) + except ActionError as exception: + messages.error( + request, + _('Failed to revoke certificate for domain {domain}: {error}') + .format(domain=domain, error=exception.args[2])) + + return redirect(reverse_lazy('letsencrypt:index')) + + +@require_POST +def obtain(request, domain): + """Obtain and install a certficate for a given domain.""" + try: + actions.superuser_run('letsencrypt', ['obtain', '--domain', domain]) + messages.success( + request, _('Certificate successfully obtained for domain {domain}') + .format(domain=domain)) + except ActionError as exception: + messages.error( + request, + _('Failed to obtain certificate for domain {domain}: {error}') + .format(domain=domain, error=exception.args[2])) + + return redirect(reverse_lazy('letsencrypt:index')) + + +def get_status(): + """Get the current settings.""" + status = actions.superuser_run('letsencrypt', ['get-status']) + status = json.loads(status) + + for domains in names.domains.values(): + for domain in domains: + status['domains'].setdefault(domain, {}) + + return status From 429d26d96167acaa9ac6d3e5193e436324e4e31f Mon Sep 17 00:00:00 2001 From: caitlin Date: Sat, 9 Jan 2016 14:48:20 +0000 Subject: [PATCH 006/189] letsencrypt: Don't fail if live dir does not exist --- actions/letsencrypt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/actions/letsencrypt b/actions/letsencrypt index 6999590de..7461081a8 100755 --- a/actions/letsencrypt +++ b/actions/letsencrypt @@ -99,7 +99,11 @@ def get_certficate_expiry(domain): def subcommand_get_status(_): """Return a JSON dictionary of currently configured domains.""" - domains = os.listdir(LIVE_DIRECTORY) + try: + domains = os.listdir(LIVE_DIRECTORY) + except OSError: + domains = [] + domains = [domain for domain in domains if os.path.isdir(os.path.join(LIVE_DIRECTORY, domain))] From a5642972ac62891dfe0c123920d0f979758e6acb Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 15 Jan 2016 19:44:31 +0530 Subject: [PATCH 007/189] New locale file for Swedish (sv) --- plinth/locale/sv/LC_MESSAGES/django.po | 2826 ++++++++++++++++++++++++ 1 file changed, 2826 insertions(+) create mode 100644 plinth/locale/sv/LC_MESSAGES/django.po diff --git a/plinth/locale/sv/LC_MESSAGES/django.po b/plinth/locale/sv/LC_MESSAGES/django.po new file mode 100644 index 000000000..a55696056 --- /dev/null +++ b/plinth/locale/sv/LC_MESSAGES/django.po @@ -0,0 +1,2826 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-01-15 19:42+0530\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: plinth/action_utils.py:203 +#, python-brace-format +msgid "Listening on {kind} port {listen_address}:{port}" +msgstr "" + +#: plinth/action_utils.py:206 +#, python-brace-format +msgid "Listening on {kind} port {port}" +msgstr "" + +#: plinth/action_utils.py:287 +#, python-brace-format +msgid "Access URL {url} on tcp{kind}" +msgstr "" + +#: plinth/action_utils.py:290 +#, python-brace-format +msgid "Access URL {url}" +msgstr "" + +#: plinth/action_utils.py:321 +#, python-brace-format +msgid "Connect to {host}:{port}" +msgstr "" + +#: plinth/action_utils.py:324 +#, python-brace-format +msgid "Cannot connect to {host}:{port}" +msgstr "" + +#: plinth/modules/apps/apps.py:26 +msgid "Apps" +msgstr "" + +#: plinth/modules/apps/apps.py:32 plinth/templates/base.html.py:91 +msgid "Applications" +msgstr "" + +#: plinth/modules/apps/templates/apps.html:25 +msgid "Services and Applications" +msgstr "" + +#: plinth/modules/apps/templates/apps.html:28 +#, python-format +msgid "" +"You can install and run various services and applications on your " +"%(box_name)s. Click on any app page link on the left to read a description " +"of the application and choose to install it." +msgstr "" + +#: plinth/modules/apps/templates/apps.html:36 +msgid "" +"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!" +msgstr "" + +#: plinth/modules/avahi/__init__.py:40 plinth/modules/avahi/__init__.py:45 +#: plinth/modules/avahi/templates/avahi.html:26 +#: plinth/modules/avahi/views.py:53 +msgid "Service Discovery" +msgstr "" + +#: plinth/modules/avahi/forms.py:29 +msgid "Enable service discovery" +msgstr "" + +#: plinth/modules/avahi/templates/avahi.html:29 +msgid "" +"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." +msgstr "" + +#: plinth/modules/avahi/templates/avahi.html:40 +#: plinth/modules/datetime/templates/datetime.html:35 +#: plinth/modules/deluge/templates/deluge.html:39 +#: plinth/modules/dynamicdns/dynamicdns.py:38 +#: plinth/modules/firewall/templates/firewall.html:57 +#: plinth/modules/mumble/templates/mumble.html:44 +#: plinth/modules/networks/templates/connection_show.html:261 +#: plinth/modules/openvpn/templates/openvpn.html:81 +#: plinth/modules/privoxy/templates/privoxy.html:48 +#: plinth/modules/quassel/templates/quassel.html:50 +#: plinth/modules/tor/templates/tor.html:39 +#: plinth/modules/transmission/templates/transmission.html:42 +#: plinth/modules/xmpp/templates/xmpp.html:58 +msgid "Status" +msgstr "" + +#: plinth/modules/avahi/templates/avahi.html:45 +msgid "Service discovery server is running" +msgstr "" + +#: plinth/modules/avahi/templates/avahi.html:48 +msgid "Service discovery server is not running" +msgstr "" + +#: plinth/modules/avahi/templates/avahi.html:52 +#: plinth/modules/datetime/templates/datetime.html:48 +#: plinth/modules/deluge/templates/deluge.html:53 +#: plinth/modules/ikiwiki/templates/ikiwiki.html:35 +#: plinth/modules/mumble/templates/mumble.html:59 +#: plinth/modules/openvpn/templates/openvpn.html:130 +#: plinth/modules/owncloud/templates/owncloud.html:51 +#: plinth/modules/privoxy/templates/privoxy.html:62 +#: plinth/modules/quassel/templates/quassel.html:65 +#: plinth/modules/roundcube/templates/roundcube.html:62 +#: plinth/modules/shaarli/templates/shaarli.html:40 +#: plinth/modules/tor/templates/tor.html:74 +#: plinth/modules/transmission/templates/transmission.html:56 +#: plinth/modules/xmpp/templates/xmpp.html:72 +msgid "Configuration" +msgstr "" + +#: plinth/modules/avahi/templates/avahi.html:60 +#: plinth/modules/datetime/templates/datetime.html:56 +#: plinth/modules/deluge/templates/deluge.html:61 +#: plinth/modules/dynamicdns/templates/dynamicdns_configure.html:40 +#: plinth/modules/ikiwiki/templates/ikiwiki.html:43 +#: plinth/modules/ikiwiki/templates/ikiwiki_create.html:32 +#: plinth/modules/mumble/templates/mumble.html:67 +#: plinth/modules/openvpn/templates/openvpn.html:138 +#: plinth/modules/privoxy/templates/privoxy.html:70 +#: plinth/modules/quassel/templates/quassel.html:73 +#: plinth/modules/restore/templates/restore_index.html:54 +#: plinth/modules/roundcube/templates/roundcube.html:70 +#: plinth/modules/shaarli/templates/shaarli.html:48 +#: plinth/modules/tor/templates/tor.html:82 +#: plinth/modules/transmission/templates/transmission.html:64 +#: plinth/modules/upgrades/templates/upgrades_configure.html:34 +#: plinth/modules/xmpp/templates/xmpp.html:80 +msgid "Update setup" +msgstr "" + +#: plinth/modules/avahi/views.py:73 plinth/modules/datetime/views.py:85 +#: plinth/modules/deluge/views.py:80 +#: plinth/modules/dynamicdns/dynamicdns.py:368 +#: plinth/modules/ikiwiki/views.py:95 plinth/modules/mumble/views.py:80 +#: plinth/modules/openvpn/views.py:142 plinth/modules/privoxy/views.py:83 +#: plinth/modules/quassel/views.py:76 plinth/modules/restore/views.py:68 +#: plinth/modules/roundcube/views.py:84 plinth/modules/shaarli/views.py:74 +#: plinth/modules/transmission/views.py:109 plinth/modules/xmpp/views.py:100 +msgid "Configuration updated" +msgstr "" + +#: plinth/modules/avahi/views.py:76 plinth/modules/datetime/views.py:99 +#: plinth/modules/deluge/views.py:82 plinth/modules/ikiwiki/views.py:97 +#: plinth/modules/mumble/views.py:82 plinth/modules/openvpn/views.py:144 +#: plinth/modules/owncloud/owncloud.py:93 plinth/modules/privoxy/views.py:85 +#: plinth/modules/quassel/views.py:78 plinth/modules/restore/views.py:70 +#: plinth/modules/roundcube/views.py:86 plinth/modules/shaarli/views.py:76 +#: plinth/modules/tor/tor.py:250 plinth/modules/transmission/views.py:111 +#: plinth/modules/upgrades/views.py:103 plinth/modules/xmpp/views.py:102 +msgid "Setting unchanged" +msgstr "" + +#: plinth/modules/config/config.py:83 plinth/modules/config/config.py:120 +#: plinth/modules/dynamicdns/dynamicdns.py:145 +msgid "Invalid domain name" +msgstr "" + +#: plinth/modules/config/config.py:94 +msgid "Hostname" +msgstr "" + +#: plinth/modules/config/config.py:96 +msgid "" +"Hostname is the local name by which other machines on the local network " +"reach your machine. It must start and end with an alphabet or a digit and " +"have as interior characters only alphabets, digits and hyphens. Total " +"length must be 63 characters or less." +msgstr "" + +#: plinth/modules/config/config.py:104 +msgid "Invalid hostname" +msgstr "" + +#: plinth/modules/config/config.py:107 plinth/modules/config/config.py:153 +#: plinth/modules/config/config.py:265 +#: plinth/modules/dynamicdns/dynamicdns.py:140 +msgid "Domain Name" +msgstr "" + +#: plinth/modules/config/config.py:109 +msgid "" +"Domain name is the global name by which other machines on the Internet can " +"reach you. It must consist of labels separated by dots. Each label must " +"start and end with an alphabet or a digit and have as interior characters " +"only alphabets, digits and hyphens. Length of each label must be 63 " +"characters or less. Total length of domain name must be 253 characters or " +"less." +msgstr "" + +#: plinth/modules/config/config.py:124 +msgid "Language" +msgstr "" + +#: plinth/modules/config/config.py:126 +msgid "Language for this FreedomBox web administration interface" +msgstr "" + +#: plinth/modules/config/config.py:135 +#: plinth/modules/dynamicdns/dynamicdns.py:36 +#: plinth/modules/ikiwiki/views.py:36 +msgid "Configure" +msgstr "" + +#: plinth/modules/config/config.py:176 +msgid "General Configuration" +msgstr "" + +#: plinth/modules/config/config.py:193 +#, python-brace-format +msgid "Error setting hostname: {exception}" +msgstr "" + +#: plinth/modules/config/config.py:196 +msgid "Hostname set" +msgstr "" + +#: plinth/modules/config/config.py:202 +#, python-brace-format +msgid "Error setting domain name: {exception}" +msgstr "" + +#: plinth/modules/config/config.py:205 +msgid "Domain name set" +msgstr "" + +#: plinth/modules/config/config.py:213 +#, python-brace-format +msgid "Error setting language: {exception}" +msgstr "" + +#: plinth/modules/config/config.py:216 +msgid "Language changed" +msgstr "" + +#: plinth/modules/config/templates/config.html:32 +msgid "Submit" +msgstr "" + +#: plinth/modules/datetime/__init__.py:39 +#: plinth/modules/datetime/templates/datetime.html:26 +#: plinth/modules/datetime/views.py:58 +msgid "Date & Time" +msgstr "" + +#: plinth/modules/datetime/__init__.py:44 +msgid "Network Time Server" +msgstr "" + +#: plinth/modules/datetime/__init__.py:76 +msgid "NTP client in contact with servers" +msgstr "" + +#: plinth/modules/datetime/forms.py:31 +msgid "Enable network time" +msgstr "" + +#: plinth/modules/datetime/forms.py:35 +msgid "Time Zone" +msgstr "" + +#: plinth/modules/datetime/forms.py:36 +msgid "" +"Set your time zone to get accurate timestamps. This will set the systemwide " +"time zone." +msgstr "" + +#: plinth/modules/datetime/forms.py:47 +msgid "-- no time zone set --" +msgstr "" + +#: plinth/modules/datetime/templates/datetime.html:29 +msgid "" +"Network time server is a program that maintians the system time in " +"synchronization with servers on the Internet." +msgstr "" + +#: plinth/modules/datetime/templates/datetime.html:40 +msgid "Network time server is running" +msgstr "" + +#: plinth/modules/datetime/templates/datetime.html:43 +msgid "Network time server is not running" +msgstr "" + +#: plinth/modules/datetime/views.py:93 +#, python-brace-format +msgid "Error setting time zone: {exception}" +msgstr "" + +#: plinth/modules/datetime/views.py:96 +msgid "Time zone set" +msgstr "" + +#: plinth/modules/deluge/__init__.py:38 plinth/modules/deluge/views.py:56 +msgid "BitTorrent (Deluge)" +msgstr "" + +#: plinth/modules/deluge/__init__.py:43 +msgid "Deluge BitTorrent" +msgstr "" + +#: plinth/modules/deluge/forms.py:29 +msgid "Enable Deluge" +msgstr "" + +#: plinth/modules/deluge/templates/deluge.html:26 +msgid "BitTorrent Web Client (Deluge)" +msgstr "" + +#: plinth/modules/deluge/templates/deluge.html:28 +msgid "Deluge is a BitTorrent client that features a Web UI." +msgstr "" + +#: plinth/modules/deluge/templates/deluge.html:31 +msgid "" +"When enabled, the Deluge web client will be available from /deluge path on the web server. The default password is 'deluge', but " +"you should log in and change it immediately after enabling this service." +msgstr "" + +#: plinth/modules/deluge/templates/deluge.html:44 +msgid "deluge-web is running" +msgstr "" + +#: plinth/modules/deluge/templates/deluge.html:47 +msgid "deluge-web is not running" +msgstr "" + +#: plinth/modules/diagnostics/diagnostics.py:45 +msgid "Diagnostics" +msgstr "" + +#: plinth/modules/diagnostics/diagnostics.py:55 +msgid "System Diagnostics" +msgstr "" + +#: plinth/modules/diagnostics/diagnostics.py:78 +msgid "Diagnostic Test" +msgstr "" + +#: plinth/modules/diagnostics/templates/diagnostics.html:37 +msgid "" +"The system diagnostic test will run a number of checks on your system to " +"confirm that applications and services are working as expected." +msgstr "" + +#: plinth/modules/diagnostics/templates/diagnostics.html:50 +#: plinth/modules/diagnostics/templates/diagnostics_button.html:27 +msgid "Run Diagnostics" +msgstr "" + +#: plinth/modules/diagnostics/templates/diagnostics.html:53 +msgid "Diagnotics test is currently running" +msgstr "" + +#: plinth/modules/diagnostics/templates/diagnostics.html:66 +msgid "Results" +msgstr "" + +#: plinth/modules/diagnostics/templates/diagnostics.html:74 +#, python-format +msgid "Module: %(module)s" +msgstr "" + +#: plinth/modules/diagnostics/templates/diagnostics_module.html:25 +msgid "Diagnostic Results" +msgstr "" + +#: plinth/modules/diagnostics/templates/diagnostics_module.html:27 +#, python-format +msgid "Module: %(module_name)s" +msgstr "" + +#: plinth/modules/diagnostics/templates/diagnostics_module.html:32 +msgid "This module does not support diagnostics" +msgstr "" + +#: plinth/modules/diagnostics/templates/diagnostics_results.html:27 +msgid "Test" +msgstr "" + +#: plinth/modules/diagnostics/templates/diagnostics_results.html:28 +msgid "Result" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:34 plinth/modules/help/help.py:40 +msgid "About" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:44 +#: plinth/modules/dynamicdns/dynamicdns.py:53 +msgid "Dynamic DNS" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:70 +msgid "" +"The Variables <User>, <Pass>, <Ip>, <Domain> may be " +"used within the URL. For details see the update URL templates of the example " +"providers." +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:74 +msgid "" +"Please choose an update protocol according to your provider. If your " +"provider does not support the GnudIP protocol or your provider is not listed " +"you may use the update URL of your provider." +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:79 +msgid "" +"Please do not enter a URL here (like \"https://example.com/\") but only the " +"hostname of the GnuDIP server (like \"example.pcom\")." +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:83 +msgid "The public domain name you want use to reach your box." +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:85 +msgid "Use this option if your provider uses self signed certificates." +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:88 +msgid "" +"If this option is selected, your username and password will be used for HTTP " +"basic authentication." +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:91 +msgid "" +"Leave this field empty if you want to keep your previous configured password." +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:94 +msgid "" +"Optional Value. If your FreedomBox is not connected directly to the Internet " +"(i.e. connected to a NAT router) this URL is used to figure out the real " +"Internet IP. The URL should simply return the IP wherethe client comes from. " +"Example: http://myip.datasystems24.de" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:101 +msgid "" +"You should have been requested to select a username when you created the " +"account." +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:112 +msgid "Enable Dynamic DNS" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:115 +msgid "Service type" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:120 +msgid "GnudIP Server Address" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:125 +msgid "Invalid server name" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:128 +msgid "Update URL" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:132 +msgid "accept all SSL certificates" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:136 +msgid "use HTTP basic authentication" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:148 +#: plinth/modules/networks/forms.py:146 plinth/modules/transmission/forms.py:39 +msgid "Username" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:151 +#: plinth/modules/networks/forms.py:147 plinth/modules/transmission/forms.py:43 +msgid "Password" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:154 +msgid "show password" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:158 +msgid "IP check URL" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:184 +msgid "Please provide update URL or a GnuDIP Server" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:187 +msgid "Please provide GnuDIP username" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:190 +msgid "Please provide GnuDIP domain" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:195 +msgid "Please provide a password" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:214 +msgid "Configure Dynamic DNS" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:236 +msgid "Status of Dynamic DNS" +msgstr "" + +#: plinth/modules/dynamicdns/templates/dynamicdns.html:25 +msgid "DynamicDNS client" +msgstr "" + +#: plinth/modules/dynamicdns/templates/dynamicdns.html:28 +msgid "" +"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)." +msgstr "" + +#: plinth/modules/dynamicdns/templates/dynamicdns.html:37 +msgid "" +"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 gnudip 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." +msgstr "" + +#: plinth/modules/dynamicdns/templates/dynamicdns.html:50 +msgid "" +"If you are looking for a free dynamic DNS account, you may find a free " +"GnuDIP service at gnudip.datasystems24.net or you may find free update URL " +"based services on " +"freedns.afraid.org." +msgstr "" + +#: plinth/modules/dynamicdns/templates/dynamicdns.html:61 +msgid "" +"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." +msgstr "" + +#: plinth/modules/dynamicdns/templates/dynamicdns_configure.html:30 +msgid "" +"You have disabled Javascript. Dynamic form mode is disabled and some helper " +"functions may not work (but the main functionality should work)." +msgstr "" + +#: plinth/modules/dynamicdns/templates/dynamicdns_status.html:25 +msgid "NAT type" +msgstr "" + +#: plinth/modules/dynamicdns/templates/dynamicdns_status.html:29 +msgid "" +"NAT type not detected yet, if you do not provide a \"IP check URL\" we will " +"not detect a NAT type." +msgstr "" + +#: plinth/modules/dynamicdns/templates/dynamicdns_status.html:35 +msgid "Direct connection to the internet." +msgstr "" + +#: plinth/modules/dynamicdns/templates/dynamicdns_status.html:37 +#, python-format +msgid "" +"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)s minutes until we " +"update your DNS entry in case of WAN IP change." +msgstr "" + +#: plinth/modules/dynamicdns/templates/dynamicdns_status.html:48 +msgid "Last update" +msgstr "" + +#: plinth/modules/firewall/firewall.py:39 +#: plinth/modules/firewall/firewall.py:49 +#: plinth/modules/firewall/firewall.py:57 +msgid "Firewall" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:28 +#, python-format +msgid "" +"Firewall is a network security system that controls the incoming and " +"outgoing network traffic on your %(box_name)s. Keeping a firewall enabled " +"and properly configured reduces risk of security threat from the Internet." +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:36 +msgid "The following is the current status:" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:41 +#, python-format +msgid "" +"Firewall daemon is not running. Please run it. Firewall comes enabled by " +"default on %(box_name)s. On any Debian based system (such as %(box_name)s) " +"you may run it using the command 'service firewalld start' or in case of a " +"system with systemd 'systemctl start firewalld'." +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:56 +msgid "Service/Port" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:67 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:91 +#: plinth/modules/names/templates/names.html:51 +msgid "Enabled" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:70 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:93 +#: plinth/modules/names/templates/names.html:53 +msgid "Disabled" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:81 +msgid "Permitted" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:84 +msgid "Permitted (internal only)" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:87 +msgid "Permitted (external only)" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:90 +msgid "Blocked" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:103 +msgid "" +"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." +msgstr "" + +#: plinth/modules/first_boot/forms.py:48 plinth/modules/users/forms.py:70 +msgid "Creating LDAP user failed." +msgstr "" + +#: plinth/modules/first_boot/forms.py:56 +msgid "Failed to add new user to admin group." +msgstr "" + +#: plinth/modules/first_boot/forms.py:78 +msgid "User account created, you are now logged in" +msgstr "" + +#: plinth/modules/first_boot/templates/firstboot_navbar.html:23 +#: plinth/modules/help/templates/help_index.html:25 +#: plinth/templates/base.html:100 +msgid "Help" +msgstr "" + +#: plinth/modules/first_boot/templates/firstboot_state0.html:45 +msgid "Start Setup" +msgstr "" + +#: plinth/modules/first_boot/templates/firstboot_state0.html:49 +#, python-format +msgid "" +"To complete the setup of your %(box_name)s, please provide some basic " +"information." +msgstr "" + +#: plinth/modules/first_boot/templates/firstboot_state1.html:41 +msgid "Administrator Account" +msgstr "" + +#: plinth/modules/first_boot/templates/firstboot_state1.html:44 +msgid "" +"Choose a username and password to access this web interface. The password " +"can be changed later. This user will be granted administrative privileges. " +"Other users can be added later." +msgstr "" + +#: plinth/modules/first_boot/templates/firstboot_state1.html:57 +msgid "Box it up!" +msgstr "" + +#: plinth/modules/first_boot/templates/firstboot_state10.html:29 +msgid "Setup Complete!" +msgstr "" + +#: plinth/modules/first_boot/templates/firstboot_state10.html:32 +#, python-format +msgid "" +"%(box_name)s setup is now complete. To make your %(box_name)s functional, " +"you need some applications. Applications will be installed the first time " +"you access them." +msgstr "" + +#: plinth/modules/first_boot/templates/firstboot_state10.html:41 +msgid "Go to Apps" +msgstr "" + +#: plinth/modules/first_boot/templates/firstboot_state10.html:44 +msgid "Current Network Configuration" +msgstr "" + +#: plinth/modules/first_boot/templates/firstboot_state10.html:47 +msgid "" +"You should check the network setup and modify it if necessary. Do not forget " +"to change the default Wi-Fi passwords!" +msgstr "" + +#: plinth/modules/first_boot/templates/firstboot_state10.html:57 +msgid "Go to Networks" +msgstr "" + +#: plinth/modules/first_boot/views.py:60 +msgid "Setup Complete" +msgstr "" + +#: plinth/modules/help/help.py:34 +msgid "Documentation" +msgstr "" + +#: plinth/modules/help/help.py:36 +msgid "Where to Get Help" +msgstr "" + +#: plinth/modules/help/help.py:38 plinth/modules/help/help.py:72 +msgid "FreedomBox Manual" +msgstr "" + +#: plinth/modules/help/help.py:48 +msgid "Documentation and FAQ" +msgstr "" + +#: plinth/modules/help/help.py:55 +#, python-brace-format +msgid "About {box_name}" +msgstr "" + +#: plinth/modules/help/templates/help_about.html:30 +msgid "" +"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." +msgstr "" + +#: plinth/modules/help/templates/help_about.html:43 +msgid "" +"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." +msgstr "" + +#: plinth/modules/help/templates/help_about.html:56 +msgid "" +"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." +msgstr "" + +#: plinth/modules/help/templates/help_about.html:64 +msgid "" +"For more information about the FreedomBox project, see the FreedomBox Wiki." +msgstr "" + +#: plinth/modules/help/templates/help_about.html:72 +msgid "Learn more »" +msgstr "" + +#: plinth/modules/help/templates/help_about.html:75 +#, python-format +msgid "You are running Plinth version %(version)s." +msgstr "" + +#: plinth/modules/help/templates/help_base.html:36 +#, python-format +msgid "%(box_name)s Setup" +msgstr "" + +#: plinth/modules/help/templates/help_index.html:29 +#, python-format +msgid "" +"The FreedomBox Manual is the best place to " +"start for information regarding %(box_name)s." +msgstr "" + +#: plinth/modules/help/templates/help_index.html:36 +msgid "" +" FreedomBox " +"project wiki contains further information." +msgstr "" + +#: plinth/modules/help/templates/help_index.html:43 +msgid "" +"To seek help from FreedomBox community, queries may be posted on the " +"mailing list. The list archives also contain information about problems " +"faced by other users and possible solutions." +msgstr "" + +#: plinth/modules/help/templates/help_index.html:53 +msgid "" +"Many FreedomBox contributors and users are also available on the irc.oftc." +"net IRC network. Join and request help on the #freedombox channel " +"using the IRC web interface." +msgstr "" + +#: plinth/modules/ikiwiki/__init__.py:38 +msgid "Wiki & Blog (Ikiwiki)" +msgstr "" + +#: plinth/modules/ikiwiki/__init__.py:43 +msgid "Ikiwiki wikis and blogs" +msgstr "" + +#: plinth/modules/ikiwiki/forms.py:29 +msgid "Enable Ikiwiki" +msgstr "" + +#: plinth/modules/ikiwiki/forms.py:36 +#: plinth/modules/networks/templates/connection_show.html:98 +msgid "Type" +msgstr "" + +#: plinth/modules/ikiwiki/forms.py:39 +#: plinth/modules/networks/templates/connection_show.html:78 +msgid "Name" +msgstr "" + +#: plinth/modules/ikiwiki/forms.py:41 +msgid "Admin Account Name" +msgstr "" + +#: plinth/modules/ikiwiki/forms.py:44 +msgid "Admin Account Password" +msgstr "" + +#: plinth/modules/ikiwiki/templates/ikiwiki.html:27 +msgid "" +"When enabled, the blogs and wikis will be available from /ikiwiki." +msgstr "" + +#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:27 +#, python-format +msgid "Delete Wiki/Blog %(name)s" +msgstr "" + +#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:33 +msgid "" +"This action will remove all the posts, pages and comments including revision " +"history. Delete this wiki/blog permanently?" +msgstr "" + +#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:43 +#, python-format +msgid "Delete %(name)s" +msgstr "" + +#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:46 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:60 +#: plinth/modules/networks/templates/connections_delete.html:41 +#: plinth/modules/users/templates/users_delete.html:41 +msgid "Cancel" +msgstr "" + +#: plinth/modules/ikiwiki/templates/ikiwiki_manage.html:41 +msgid "No wikis or blogs available." +msgstr "" + +#: plinth/modules/ikiwiki/templates/ikiwiki_manage.html:45 +msgid "Create a Wiki or Blog" +msgstr "" + +#: plinth/modules/ikiwiki/templates/ikiwiki_manage.html:55 +#, python-format +msgid "Delete site %(site)s" +msgstr "" + +#: plinth/modules/ikiwiki/templates/ikiwiki_manage.html:61 +#, python-format +msgid "Go to site %(site)s" +msgstr "" + +#: plinth/modules/ikiwiki/views.py:38 +msgid "Manage" +msgstr "" + +#: plinth/modules/ikiwiki/views.py:40 +msgid "Create" +msgstr "" + +#: plinth/modules/ikiwiki/views.py:73 +msgid "Wiki & Blog" +msgstr "" + +#: plinth/modules/ikiwiki/views.py:106 +msgid "Manage Wikis and Blogs" +msgstr "" + +#: plinth/modules/ikiwiki/views.py:132 +msgid "Create Wiki/Blog" +msgstr "" + +#: plinth/modules/ikiwiki/views.py:145 +#, python-brace-format +msgid "Created wiki {name}." +msgstr "" + +#: plinth/modules/ikiwiki/views.py:147 +#, python-brace-format +msgid "Could not create wiki: {error}" +msgstr "" + +#: plinth/modules/ikiwiki/views.py:159 +#, python-brace-format +msgid "Created blog {name}." +msgstr "" + +#: plinth/modules/ikiwiki/views.py:161 +#, python-brace-format +msgid "Could not create blog: {error}" +msgstr "" + +#: plinth/modules/ikiwiki/views.py:174 +#, python-brace-format +msgid "{name} deleted." +msgstr "" + +#: plinth/modules/ikiwiki/views.py:176 +#, python-brace-format +msgid "Could not delete {name}: {error}" +msgstr "" + +#: plinth/modules/ikiwiki/views.py:182 +msgid "Delete Wiki/Blog" +msgstr "" + +#: plinth/modules/letsencrypt/__init__.py:43 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:38 +#: plinth/modules/letsencrypt/views.py:45 +msgid "Certificates (Let's Encrypt)" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:41 +#, python-format +msgid "" +"A digital certficate allows users of a web service to verify the identity of " +"the service and to securely communicate with it. %(box_name)s can " +"automatically obtain and setup digital certificates for each available " +"domain. It does so by proving itself to be the owner of a domain to Let's " +"Encrypt, a certficate authority (CA)." +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:52 +msgid "" +"Let's Encrypt is a free, automated, and open certificate authority, run for " +"the public’s benefit by the Internet Security Research Group (ISRG). Please " +"read and agree with the Let's Encrypt Subscriber Agreement before using this service." +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:66 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:70 +msgid "Domain" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:67 +msgid "Certificate Status" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:68 +msgid "Website Security" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:69 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:72 +msgid "Actions" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:79 +#, python-format +msgid "Expires on %(expiry_date)s" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:85 +msgid "No certficate" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:102 +msgid "Revoke" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:108 +msgid "Re-obtain" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:115 +msgid "Obtain" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:55 +#, python-brace-format +msgid "Certificate successfully revoked for domain {domain}" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:60 +#, python-brace-format +msgid "Failed to revoke certificate for domain {domain}: {error}" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:72 +#, python-brace-format +msgid "Certificate successfully obtained for domain {domain}" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:77 +#, python-brace-format +msgid "Failed to obtain certificate for domain {domain}: {error}" +msgstr "" + +#: plinth/modules/monkeysphere/__init__.py:32 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:35 +#: plinth/modules/monkeysphere/views.py:44 +msgid "Monkeysphere" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:38 +msgid "" +"With Monkeysphere, a PGP key can be generated for each configured domain " +"serving SSH. The PGP public key can then be uploaded to the PGP keyservers. " +"Users connecting to this machine through SSH can verify that they are " +"connecting to the correct host. For users to trust the key, at least one " +"person (usually the machine owner) must sign the key using the regular PGP " +"key signing process. See the Monkeysphere SSH documentation for more details." +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:53 +msgid "Publishing key to keyserver..." +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:71 +msgid "GPG Fingerprint" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:83 +#: plinth/modules/names/views.py:45 +msgid "Not Available" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:93 +msgid "Generate PGP Key" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:101 +msgid "Publish Key" +msgstr "" + +#: plinth/modules/monkeysphere/views.py:58 +msgid "Generated PGP key." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:83 +msgid "Cancelled key publishing." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:120 +msgid "Published key to keyserver." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:122 +msgid "Error occurred while publishing key." +msgstr "" + +#: plinth/modules/mumble/__init__.py:38 +#: plinth/modules/mumble/templates/mumble.html:26 +#: plinth/modules/mumble/views.py:58 +msgid "Voice Chat (Mumble)" +msgstr "" + +#: plinth/modules/mumble/__init__.py:43 +msgid "Mumble Voice Chat Server" +msgstr "" + +#: plinth/modules/mumble/forms.py:29 +msgid "Enable Mumble daemon" +msgstr "" + +#: plinth/modules/mumble/templates/mumble.html:29 +msgid "" +"Mumble is an open source, low-latency, encrypted, high quality voice chat " +"software." +msgstr "" + +#: plinth/modules/mumble/templates/mumble.html:36 +msgid "" +"You can connect to your Mumble server on the regular Mumble port 64738. Clients to connect to Mumble from your " +"desktop and Android devices are available." +msgstr "" + +#: plinth/modules/mumble/templates/mumble.html:49 +msgid "Mumble server is running" +msgstr "" + +#: plinth/modules/mumble/templates/mumble.html:52 +msgid "Mumble server is not running" +msgstr "" + +#: plinth/modules/names/__init__.py:29 +msgid "HTTP" +msgstr "" + +#: plinth/modules/names/__init__.py:30 +msgid "HTTPS" +msgstr "" + +#: plinth/modules/names/__init__.py:31 +msgid "SSH" +msgstr "" + +#: plinth/modules/names/__init__.py:45 plinth/modules/names/views.py:34 +msgid "Name Services" +msgstr "" + +#: plinth/modules/networks/__init__.py:108 +#, python-brace-format +msgid "Using DNSSEC on IPv{kind}" +msgstr "" + +#: plinth/modules/networks/forms.py:30 +msgid "Connection Type" +msgstr "" + +#: plinth/modules/networks/forms.py:37 +msgid "Connection Name" +msgstr "" + +#: plinth/modules/networks/forms.py:39 +msgid "Physical Interface" +msgstr "" + +#: plinth/modules/networks/forms.py:41 +msgid "The network device that this connection should be bound to." +msgstr "" + +#: plinth/modules/networks/forms.py:44 +msgid "Firewall Zone" +msgstr "" + +#: plinth/modules/networks/forms.py:45 +msgid "" +"The firewall zone will control which services are available over this " +"interfaces. Select Internal only for trusted networks." +msgstr "" + +#: plinth/modules/networks/forms.py:49 +msgid "IPv4 Addressing Method" +msgstr "" + +#: plinth/modules/networks/forms.py:50 +msgid "" +"\"Shared\" method will start a DHCP server and \"Automatic\" method will " +"acquire configuration from a DHCP server." +msgstr "" + +#: plinth/modules/networks/forms.py:56 +msgid "Address" +msgstr "" + +#: plinth/modules/networks/forms.py:60 +msgid "Netmask" +msgstr "" + +#: plinth/modules/networks/forms.py:61 +msgid "" +"Optional value. If left blank, a default netmask based on the address will " +"be used." +msgstr "" + +#: plinth/modules/networks/forms.py:66 +#: plinth/modules/networks/templates/connection_show.html:202 +#: plinth/modules/networks/templates/connection_show.html:241 +msgid "Gateway" +msgstr "" + +#: plinth/modules/networks/forms.py:67 +msgid "Optional value." +msgstr "" + +#: plinth/modules/networks/forms.py:71 +msgid "DNS Server" +msgstr "" + +#: plinth/modules/networks/forms.py:72 +msgid "" +"Optional value. If this value is given and IPv4 addressing method is " +"\"Automatic\", the DNS Servers provided by a DHCP server will be ignored." +msgstr "" + +#: plinth/modules/networks/forms.py:78 +msgid "Second DNS Server" +msgstr "" + +#: plinth/modules/networks/forms.py:79 +msgid "" +"Optional value. If this value is given and IPv4 Addressing Method is " +"\"Automatic\", the DNS Servers provided by a DHCP server will be ignored." +msgstr "" + +#: plinth/modules/networks/forms.py:89 +msgid "-- select --" +msgstr "" + +#: plinth/modules/networks/forms.py:149 +msgid "Show password" +msgstr "" + +#: plinth/modules/networks/forms.py:175 +#: plinth/modules/networks/templates/connection_show.html:144 +msgid "SSID" +msgstr "" + +#: plinth/modules/networks/forms.py:176 +msgid "The visible name of the network." +msgstr "" + +#: plinth/modules/networks/forms.py:178 +#: plinth/modules/networks/templates/connection_show.html:157 +msgid "Mode" +msgstr "" + +#: plinth/modules/networks/forms.py:183 +msgid "Authentication Mode" +msgstr "" + +#: plinth/modules/networks/forms.py:184 +msgid "" +"Select WPA if the wireless network is secured and requires clients to have " +"the password to connect." +msgstr "" + +#: plinth/modules/networks/forms.py:188 +msgid "Passphrase" +msgstr "" + +#: plinth/modules/networks/networks.py:36 +#: plinth/modules/networks/networks.py:56 +msgid "Network Connections" +msgstr "" + +#: plinth/modules/networks/networks.py:38 +#: plinth/modules/networks/networks.py:242 +msgid "Nearby Wi-Fi Networks" +msgstr "" + +#: plinth/modules/networks/networks.py:40 +#: plinth/modules/networks/networks.py:264 +msgid "Add Connection" +msgstr "" + +#: plinth/modules/networks/networks.py:46 +msgid "Networks" +msgstr "" + +#: plinth/modules/networks/networks.py:66 +msgid "Cannot show connection: Connection not found." +msgstr "" + +#: plinth/modules/networks/networks.py:100 +msgid "Show Connection information" +msgstr "" + +#: plinth/modules/networks/networks.py:113 +msgid "Cannot edit connection: Connection not found." +msgstr "" + +#: plinth/modules/networks/networks.py:119 +msgid "This type of connection is not yet understood." +msgstr "" + +#: plinth/modules/networks/networks.py:139 +#: plinth/modules/networks/networks.py:198 +#: plinth/modules/networks/templates/connections_edit.html:34 +msgid "Edit Connection" +msgstr "" + +#: plinth/modules/networks/networks.py:209 +#, python-brace-format +msgid "Activated connection {name}." +msgstr "" + +#: plinth/modules/networks/networks.py:212 +msgid "Failed to activate connection: Connection not found." +msgstr "" + +#: plinth/modules/networks/networks.py:216 +#, python-brace-format +msgid "Failed to activate connection {name}: No suitable device is available." +msgstr "" + +#: plinth/modules/networks/networks.py:229 +#, python-brace-format +msgid "Deactivated connection {name}." +msgstr "" + +#: plinth/modules/networks/networks.py:232 +msgid "Failed to de-activate connection: Connection not found." +msgstr "" + +#: plinth/modules/networks/networks.py:282 +msgid "Adding New Ethernet Connection" +msgstr "" + +#: plinth/modules/networks/networks.py:300 +msgid "Adding New PPPoE Connection" +msgstr "" + +#: plinth/modules/networks/networks.py:332 +msgid "Adding New Wi-Fi Connection" +msgstr "" + +#: plinth/modules/networks/networks.py:346 +#, python-brace-format +msgid "Connection {name} deleted." +msgstr "" + +#: plinth/modules/networks/networks.py:349 +#: plinth/modules/networks/networks.py:358 +msgid "Failed to delete connection: Connection not found." +msgstr "" + +#: plinth/modules/networks/networks.py:363 +#: plinth/modules/networks/templates/connections_delete.html:26 +msgid "Delete Connection" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:43 +msgid "Edit connection" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:43 +#: plinth/templates/base.html:121 +msgid "Edit" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:50 +#: plinth/modules/networks/templates/connections_list.html:78 +msgid "Deactivate" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:57 +#: plinth/modules/networks/templates/connections_list.html:86 +msgid "Activate" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:63 +msgid "Delete connection" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:63 +msgid "Delete" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:66 +#: plinth/modules/networks/templates/connections_diagram.html:73 +#: plinth/modules/networks/templates/connections_diagram.html:76 +#: plinth/modules/networks/templates/connections_diagram.html:105 +#: plinth/modules/networks/templates/connections_diagram.html:127 +msgid "Connection" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:71 +msgid "Primary connection" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:73 +#: plinth/modules/networks/templates/connection_show.html:217 +#: plinth/modules/networks/templates/connection_show.html:256 +msgid "yes" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:84 +msgid "Device" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:88 +msgid "State" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:93 +msgid "State reason" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:102 +msgid "MAC address" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:106 +msgid "Interface" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:110 +msgid "Description" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:116 +msgid "Physical Link" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:121 +msgid "Link state" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:125 +msgid "cable is connected" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:128 +msgid "please check cable" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:133 +#: plinth/modules/networks/templates/connection_show.html:149 +msgid "Speed" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:135 +#, python-format +msgid "%(ethernet_speed)s Mbit/s" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:151 +#, python-format +msgid "%(wireless_bitrate)s Mbit/s" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:163 +msgid "Signal strength" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:173 +msgid "Channel" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:181 +msgid "IPv4" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:186 +#: plinth/modules/networks/templates/connection_show.html:227 +msgid "Method" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:193 +#: plinth/modules/networks/templates/connection_show.html:234 +msgid "IP address" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:209 +#: plinth/modules/networks/templates/connection_show.html:248 +msgid "DNS server" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:216 +#: plinth/modules/networks/templates/connection_show.html:255 +msgid "Default" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:222 +msgid "IPv6" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:263 +msgid "This connection is not active." +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:266 +msgid "Security" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:271 +#: plinth/modules/networks/templates/connection_show.html:291 +#: plinth/modules/networks/templates/connection_show.html:310 +msgid "Firewall zone" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:280 +msgid "" +"This interface should be connected to a 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." +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:300 +msgid "" +"This interface should receive your Internet connection. If you connect it to " +"a local network/machine, many services meant to available only internally " +"will not be available." +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:319 +msgid "" +"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." +msgstr "" + +#: plinth/modules/networks/templates/connections_add.html:34 +#: plinth/modules/networks/templates/connections_type_select.html:34 +msgid "Create..." +msgstr "" + +#: plinth/modules/networks/templates/connections_create.html:34 +msgid "Create Connection" +msgstr "" + +#: plinth/modules/networks/templates/connections_delete.html:29 +#, python-format +msgid "Delete connection %(name)s permanently?" +msgstr "" + +#: plinth/modules/networks/templates/connections_diagram.html:65 +msgid "Internet" +msgstr "" + +#: plinth/modules/networks/templates/connections_diagram.html:70 +#: plinth/modules/networks/templates/connections_diagram.html:102 +msgid "Spacing" +msgstr "" + +#: plinth/modules/networks/templates/connections_diagram.html:78 +msgid "External" +msgstr "" + +#: plinth/modules/networks/templates/connections_diagram.html:83 +#: plinth/modules/networks/templates/connections_diagram.html:113 +#: plinth/network.py:37 +msgid "Ethernet" +msgstr "" + +#: plinth/modules/networks/templates/connections_diagram.html:86 +#: plinth/modules/networks/templates/connections_diagram.html:116 +#: plinth/network.py:38 +msgid "Wi-Fi" +msgstr "" + +#: plinth/modules/networks/templates/connections_diagram.html:89 +#, python-format +msgid "Show connection %(connection.name)s" +msgstr "" + +#: plinth/modules/networks/templates/connections_diagram.html:107 +msgid "Internal" +msgstr "" + +#: plinth/modules/networks/templates/connections_diagram.html:119 +#, python-format +msgid "Show connection %(name)s" +msgstr "" + +#: plinth/modules/networks/templates/connections_diagram.html:131 +msgid "Computer" +msgstr "" + +#: plinth/modules/networks/templates/connections_list.html:67 +#, python-format +msgid "Delete connection %(name)s" +msgstr "" + +#: plinth/modules/networks/templates/connections_list.html:92 +msgid "Active" +msgstr "" + +#: plinth/modules/networks/templates/connections_list.html:95 +msgid "Inactive" +msgstr "" + +#: plinth/modules/openvpn/__init__.py:38 +#: plinth/modules/openvpn/templates/openvpn.html:35 +#: plinth/modules/openvpn/views.py:62 +msgid "Virtual Private Network (OpenVPN)" +msgstr "" + +#: plinth/modules/openvpn/__init__.py:43 +msgid "OpenVPN" +msgstr "" + +#: plinth/modules/openvpn/forms.py:29 +msgid "Enable OpenVPN server" +msgstr "" + +#: plinth/modules/openvpn/templates/openvpn.html:38 +#, python-format +msgid "" +"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 %(box_name)s in order to join your " +"home network and access private/internal services provided by %(box_name)s. " +"You can also access the rest of the Internet via %(box_name)s for added " +"security and anonymity." +msgstr "" + +#: plinth/modules/openvpn/templates/openvpn.html:51 +msgid "Profile" +msgstr "" + +#: plinth/modules/openvpn/templates/openvpn.html:54 +#, python-format +msgid "" +"To connect to %(box_name)s'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 documentation on recommended clients and instructions on how to " +"configure them." +msgstr "" + +#: plinth/modules/openvpn/templates/openvpn.html:66 +#, python-format +msgid "Profile is specific to each user of %(box_name)s. Keep it a secret." +msgstr "" + +#: plinth/modules/openvpn/templates/openvpn.html:76 +msgid "Download my profile" +msgstr "" + +#: plinth/modules/openvpn/templates/openvpn.html:85 +#, python-format +msgid "" +"OpenVPN has not yet been setup. Performing a secure setup takes a very long " +"time. Depending on how fast your %(box_name)s is, it may even take hours. " +"If the setup is interrupted, you may start it again." +msgstr "" + +#: plinth/modules/openvpn/templates/openvpn.html:97 +msgid "Start setup" +msgstr "" + +#: plinth/modules/openvpn/templates/openvpn.html:104 +msgid "OpenVPN setup is running" +msgstr "" + +#: plinth/modules/openvpn/templates/openvpn.html:108 +#, python-format +msgid "" +"To perform a secure setup, this process takes a very long time. Depending " +"on how fast your %(box_name)s is, it may even take hours. If the setup is " +"interrupted, you may start it again." +msgstr "" + +#: plinth/modules/openvpn/templates/openvpn.html:121 +msgid "OpenVPN server is running" +msgstr "" + +#: plinth/modules/openvpn/templates/openvpn.html:124 +msgid "OpenVPN server is not running" +msgstr "" + +#: plinth/modules/openvpn/views.py:124 +msgid "Setup completed." +msgstr "" + +#: plinth/modules/openvpn/views.py:126 +msgid "Setup failed." +msgstr "" + +#: plinth/modules/owncloud/owncloud.py:38 +msgid "Enable ownCloud" +msgstr "" + +#: plinth/modules/owncloud/owncloud.py:44 +#: plinth/modules/owncloud/templates/owncloud.html:26 +msgid "File Hosting (ownCloud)" +msgstr "" + +#: plinth/modules/owncloud/owncloud.py:51 +#: plinth/modules/owncloud/owncloud.py:80 +msgid "ownCloud" +msgstr "" + +#: plinth/modules/owncloud/owncloud.py:97 +msgid "ownCloud enabled" +msgstr "" + +#: plinth/modules/owncloud/owncloud.py:100 +msgid "ownCloud disabled" +msgstr "" + +#: plinth/modules/owncloud/templates/owncloud.html:29 +msgid "" +"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." +msgstr "" + +#: plinth/modules/owncloud/templates/owncloud.html:41 +msgid "" +"When enabled, the ownCloud installation will be available from /owncloud path on the web server. Visit this URL to set up " +"the initial administration account for ownCloud." +msgstr "" + +#: plinth/modules/owncloud/templates/owncloud.html:59 +msgid "Apply changes" +msgstr "" + +#: plinth/modules/pagekite/__init__.py:35 plinth/modules/pagekite/views.py:46 +msgid "Public Visibility (PageKite)" +msgstr "" + +#: plinth/modules/pagekite/forms.py:46 +msgid "Enable PageKite" +msgstr "" + +#: plinth/modules/pagekite/forms.py:49 +msgid "Server domain" +msgstr "" + +#: plinth/modules/pagekite/forms.py:51 +msgid "" +"Select your pagekite server. Set \"pagekite.net\" to use the default " +"pagekite.net server." +msgstr "" + +#: plinth/modules/pagekite/forms.py:55 +msgid "Server port" +msgstr "" + +#: plinth/modules/pagekite/forms.py:56 +msgid "Port of your pagekite server (default: 80)" +msgstr "" + +#: plinth/modules/pagekite/forms.py:58 +msgid "Kite name" +msgstr "" + +#: plinth/modules/pagekite/forms.py:59 +msgid "Example: mybox.pagekite.me" +msgstr "" + +#: plinth/modules/pagekite/forms.py:62 +msgid "Invalid kite name" +msgstr "" + +#: plinth/modules/pagekite/forms.py:65 +msgid "Kite secret" +msgstr "" + +#: plinth/modules/pagekite/forms.py:67 +msgid "" +"A secret associated with the kite or the default secret for your account if " +"no secret is set on the kite." +msgstr "" + +#: plinth/modules/pagekite/forms.py:83 +msgid "Kite details set" +msgstr "" + +#: plinth/modules/pagekite/forms.py:90 +msgid "Pagekite server set" +msgstr "" + +#: plinth/modules/pagekite/forms.py:96 +msgid "PageKite enabled" +msgstr "" + +#: plinth/modules/pagekite/forms.py:99 +msgid "PageKite disabled" +msgstr "" + +#: plinth/modules/pagekite/forms.py:135 +#, python-brace-format +msgid "Service enabled: {name}" +msgstr "" + +#: plinth/modules/pagekite/forms.py:139 +#, python-brace-format +msgid "Service disabled: {name}" +msgstr "" + +#: plinth/modules/pagekite/forms.py:150 +msgid "protocol" +msgstr "" + +#: plinth/modules/pagekite/forms.py:153 +msgid "external (frontend) port" +msgstr "" + +#: plinth/modules/pagekite/forms.py:156 +msgid "internal (freedombox) port" +msgstr "" + +#: plinth/modules/pagekite/forms.py:158 +msgid "Enable Subdomains" +msgstr "" + +#: plinth/modules/pagekite/forms.py:191 +msgid "Deleted custom service" +msgstr "" + +#: plinth/modules/pagekite/forms.py:225 +msgid "" +"This service is available as a standard service. Please use the \"Standard " +"Services\" page to enable it." +msgstr "" + +#: plinth/modules/pagekite/forms.py:234 +msgid "Added custom service" +msgstr "" + +#: plinth/modules/pagekite/forms.py:237 +msgid "This service already exists" +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_configure.html:33 +msgid "PageKite Account" +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_configure.html:41 +msgid "Save settings" +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_custom_services.html:44 +msgid "" +"Warning:
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." +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_custom_services.html:56 +msgid "Create a custom service" +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_custom_services.html:64 +msgid "Add Service" +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_custom_services.html:71 +msgid "Existing custom services" +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_custom_services.html:74 +msgid "You don't have any Custom Services enabled" +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_custom_services.html:89 +#, python-format +msgid "connected to %(backend_host)s:%(backend_port)s" +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_custom_services.html:101 +msgid "Delete this service" +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_introduction.html:26 +#, python-format +msgid "" +"PageKite is a system for exposing %(box_name)s services when you don't have " +"a direct connection to the Internet. You only need this if your %(box_name)s " +"services are unreachable from the rest of the Internet. This includes the " +"following situations:" +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_introduction.html:37 +#, python-format +msgid "%(box_name)s is behind a restricted firewall." +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_introduction.html:43 +#, python-format +msgid "" +"%(box_name)s is connected to a (wireless) router which you don't control." +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_introduction.html:50 +msgid "" +"Your ISP does not provide you an external IP address and instead provides " +"Internet connection through NAT." +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_introduction.html:57 +msgid "" +"Your ISP does not provide you a static IP address and your IP address " +"changes evertime you connect to Internet." +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_introduction.html:63 +msgid "Your ISP limits incoming connections." +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_introduction.html:67 +#, python-format +msgid "" +"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 pagekite.net. In " +"future it might be possible to use your buddy's %(box_name)s for this." +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_introduction.html:78 +#: plinth/modules/pagekite/views.py:36 +msgid "Configure PageKite" +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_standard_services.html:40 +msgid "Warning:
" +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_standard_services.html:43 +msgid "" +"Published services are accessible and attackable from the evil internet." +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_standard_services.html:50 +msgid "Exposing SSH with the default password for 'fbx' is a VERY BAD idea." +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_standard_services.html:65 +msgid "Save Services" +msgstr "" + +#: plinth/modules/pagekite/utils.py:53 +msgid "Web Server (HTTP)" +msgstr "" + +#: plinth/modules/pagekite/utils.py:54 +#, python-brace-format +msgid "Site will be available at http://{0}" +msgstr "" + +#: plinth/modules/pagekite/utils.py:63 +msgid "Web Server (HTTPS)" +msgstr "" + +#: plinth/modules/pagekite/utils.py:64 +#, python-brace-format +msgid "Site will be available at https://{0}" +msgstr "" + +#: plinth/modules/pagekite/utils.py:73 +msgid "Secure Shell (SSH)" +msgstr "" + +#: plinth/modules/pagekite/utils.py:74 +msgid "" +"See SSH client setup instructions" +msgstr "" + +#: plinth/modules/pagekite/utils.py:276 +msgid "Pagekite" +msgstr "" + +#: plinth/modules/pagekite/views.py:34 +msgid "About PageKite" +msgstr "" + +#: plinth/modules/pagekite/views.py:38 +msgid "Standard Services" +msgstr "" + +#: plinth/modules/pagekite/views.py:40 +msgid "Custom Services" +msgstr "" + +#: plinth/modules/power/__init__.py:32 plinth/modules/power/views.py:33 +#: plinth/modules/power/views.py:47 plinth/modules/power/views.py:62 +msgid "Power" +msgstr "" + +#: plinth/modules/power/templates/power.html:29 +msgid "Restart or shut down the system." +msgstr "" + +#: plinth/modules/power/templates/power.html:34 +msgid "Restart »" +msgstr "" + +#: plinth/modules/power/templates/power.html:37 +msgid "Shut Down »" +msgstr "" + +#: plinth/modules/power/templates/power_restart.html:29 +msgid "" +"Are you sure you want to restart? You will not be able to access this web " +"interface for a few minutes until the system is restarted." +msgstr "" + +#: plinth/modules/power/templates/power_restart.html:42 +msgid "Restart Now" +msgstr "" + +#: plinth/modules/power/templates/power_shutdown.html:29 +msgid "" +"Are you sure you want to shut down? You will not be able to access this web " +"interface after shut down." +msgstr "" + +#: plinth/modules/power/templates/power_shutdown.html:41 +msgid "Shut Down Now" +msgstr "" + +#: plinth/modules/privoxy/__init__.py:39 +#: plinth/modules/privoxy/templates/privoxy.html:26 +#: plinth/modules/privoxy/views.py:59 +msgid "Web Proxy (Privoxy)" +msgstr "" + +#: plinth/modules/privoxy/__init__.py:44 +msgid "Privoxy Web Proxy" +msgstr "" + +#: plinth/modules/privoxy/__init__.py:86 +#, python-brace-format +msgid "Access {url} with proxy {proxy} on tcp{kind}" +msgstr "" + +#: plinth/modules/privoxy/forms.py:29 +msgid "Enable Privoxy" +msgstr "" + +#: plinth/modules/privoxy/templates/privoxy.html:29 +msgid "" +"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." +msgstr "" + +#: plinth/modules/privoxy/templates/privoxy.html:38 +#, python-format +msgid "" +"You can use Privoxy by modifying your browser proxy settings to your " +"%(box_name)s hostname (or IP address) with port 8118. While using Privoxy, " +"you can see its configuration details and documentation at http://config.privoxy.org/ or http://p.p." +msgstr "" + +#: plinth/modules/privoxy/templates/privoxy.html:53 +msgid "Privoxy is running" +msgstr "" + +#: plinth/modules/privoxy/templates/privoxy.html:56 +msgid "Privoxy is not running" +msgstr "" + +#: plinth/modules/quassel/__init__.py:36 +#: plinth/modules/quassel/templates/quassel.html:26 +#: plinth/modules/quassel/views.py:54 +msgid "IRC Client (Quassel)" +msgstr "" + +#: plinth/modules/quassel/__init__.py:41 +msgid "Quassel IRC Client" +msgstr "" + +#: plinth/modules/quassel/forms.py:29 +msgid "Enable Quassel core service" +msgstr "" + +#: plinth/modules/quassel/templates/quassel.html:29 +#, python-format +msgid "" +"Quassel is an IRC application that is split into two parts, a \"core\" and a " +"\"client\". This allows the core to remain connected to IRC servers, and to " +"continue receiving messages, even when the client is disconnected. " +"%(box_name)s can run the Quassel core service keeping you always online and " +"one or more Quassel clients from a desktop or a mobile can be used to " +"connect and disconnect from it." +msgstr "" + +#: plinth/modules/quassel/templates/quassel.html:41 +msgid "" +"You can connect to your Quassel core on the default Quassel port 4242. " +"Clients to connect to Quassel from your desktop and mobile devices are available." +msgstr "" + +#: plinth/modules/quassel/templates/quassel.html:55 +msgid "Quassel core service is running" +msgstr "" + +#: plinth/modules/quassel/templates/quassel.html:58 +msgid "Quassel core service is not running" +msgstr "" + +#: plinth/modules/restore/__init__.py:36 +#: plinth/modules/restore/templates/restore_index.html:26 +#: plinth/modules/restore/views.py:46 +msgid "Unhosted Storage (reStore)" +msgstr "" + +#: plinth/modules/restore/__init__.py:41 +msgid "reStore" +msgstr "" + +#: plinth/modules/restore/forms.py:29 +msgid "Enable reStore" +msgstr "" + +#: plinth/modules/restore/templates/restore_index.html:29 +#, python-format +msgid "" +"reStore is a server for unhosted web " +"applications. The idea is to uncouple web applications from data. No " +"matter where a web application is served from, the data can be stored on an " +"unhosted storage server of user's choice. With reStore, your " +"%(cfg.box_name)s becomes your unhosted storage server." +msgstr "" + +#: plinth/modules/restore/templates/restore_index.html:40 +msgid "" +"You can create and edit accounts in the reStore web-" +"interface." +msgstr "" + +#: plinth/modules/roundcube/__init__.py:36 +#: plinth/modules/roundcube/templates/roundcube.html:26 +#: plinth/modules/roundcube/views.py:64 +msgid "Email Client (Roundcube)" +msgstr "" + +#: plinth/modules/roundcube/forms.py:29 +msgid "Enable Roundcube" +msgstr "" + +#: plinth/modules/roundcube/templates/roundcube.html:29 +msgid "" +"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." +msgstr "" + +#: plinth/modules/roundcube/templates/roundcube.html:39 +msgid "" +"You can access Roundcube from /roundcube. 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 " +"imap.example.com. For IMAP over SSL (recommended), fill the " +"server field like imaps://imap.example.com." +msgstr "" + +#: plinth/modules/roundcube/templates/roundcube.html:50 +msgid "" +"For Gmail, username will be your Gmail address, password will be your Google " +"account password and server will be imaps://imap.gmail.com. " +"Note that you will also need to enable \"Less secure apps\" in your Google " +"account settings (https://www.google.com/settings/security/lesssecureapps)." +msgstr "" + +#: plinth/modules/shaarli/__init__.py:37 +#: plinth/modules/shaarli/templates/shaarli.html:26 +#: plinth/modules/shaarli/views.py:52 +msgid "Bookmarks (Shaarli)" +msgstr "" + +#: plinth/modules/shaarli/__init__.py:42 +msgid "Shaarli" +msgstr "" + +#: plinth/modules/shaarli/forms.py:29 +msgid "Enable Shaarli" +msgstr "" + +#: plinth/modules/shaarli/templates/shaarli.html:28 +msgid "Shaarli allows you to save and share bookmarks." +msgstr "" + +#: plinth/modules/shaarli/templates/shaarli.html:31 +msgid "" +"When enabled, Shaarli will be available from /shaarli path on the web server. Note that Shaarli only supports a single user " +"account, which you will need to setup on the initial visit." +msgstr "" + +#: plinth/modules/system/system.py:26 +msgid "System" +msgstr "" + +#: plinth/modules/system/system.py:33 +#: plinth/modules/system/templates/system.html:25 +#: plinth/templates/base.html:107 +msgid "System Configuration" +msgstr "" + +#: plinth/modules/system/templates/system.html:28 +#, python-format +msgid "Here you can administrate the underlying system of your %(box_name)s." +msgstr "" + +#: plinth/modules/system/templates/system.html:35 +#, python-format +msgid "" +"The options affect the %(box_name)s at its most general level, so be careful!" +msgstr "" + +#: plinth/modules/tor/__init__.py:50 +msgid "Tor relay port available" +msgstr "" + +#: plinth/modules/tor/__init__.py:58 +msgid "Obfs3 transport registered" +msgstr "" + +#: plinth/modules/tor/__init__.py:64 +msgid "Obfs4 transport registered" +msgstr "" + +#: plinth/modules/tor/__init__.py:101 +#, python-brace-format +msgid "Access URL {url} on tcp{kind} via Tor" +msgstr "" + +#: plinth/modules/tor/__init__.py:112 +#, python-brace-format +msgid "Confirm Tor usage at {url} on tcp{kind}" +msgstr "" + +#: plinth/modules/tor/templates/tor.html:26 plinth/modules/tor/tor.py:66 +msgid "Anonymity Network (Tor)" +msgstr "" + +#: plinth/modules/tor/templates/tor.html:29 +msgid "" +"Tor is an anonymous communication system. You can learn more about it from " +"the Tor Project website. For " +"best protection when web surfing, the Tor Project recommends that you use " +"the " +"Tor Browser." +msgstr "" + +#: plinth/modules/tor/templates/tor.html:44 +msgid "Tor is running" +msgstr "" + +#: plinth/modules/tor/templates/tor.html:47 +msgid "Tor is not running" +msgstr "" + +#: plinth/modules/tor/templates/tor.html:59 +msgid "Hidden Service" +msgstr "" + +#: plinth/modules/tor/templates/tor.html:60 +#: plinth/modules/tor/templates/tor.html:102 +msgid "Port" +msgstr "" + +#: plinth/modules/tor/templates/tor.html:85 +msgid "Bridge" +msgstr "" + +#: plinth/modules/tor/templates/tor.html:88 +#, python-format +msgid "" +"Your %(box_name)s is configured as a Tor bridge with obfsproxy, so it can " +"help circumvent censorship. If your %(box_name)s is behind a router or " +"firewall, you should make sure the following ports are open, and port-" +"forwarded, if necessary:" +msgstr "" + +#: plinth/modules/tor/templates/tor.html:101 +msgid "Service" +msgstr "" + +#: plinth/modules/tor/templates/tor.html:117 +msgid "SOCKS" +msgstr "" + +#: plinth/modules/tor/templates/tor.html:120 +#, python-format +msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." +msgstr "" + +#: plinth/modules/tor/tor.py:46 +msgid "Enable Tor" +msgstr "" + +#: plinth/modules/tor/tor.py:49 +msgid "Enable Tor Hidden Service" +msgstr "" + +#: plinth/modules/tor/tor.py:51 +msgid "" +"A hidden service will allow FreedomBox to provide selected services (such as " +"ownCloud or Chat) without revealing its location." +msgstr "" + +#: plinth/modules/tor/tor.py:55 +msgid "Download software packages over Tor" +msgstr "" + +#: plinth/modules/tor/tor.py:57 +msgid "" +"When enabled, software will be downloaded over the Tor network for " +"installations and upgrades. This adds a degree of privacy and security " +"during software downloads." +msgstr "" + +#: plinth/modules/tor/tor.py:85 plinth/modules/tor/tor.py:285 +msgid "Tor Hidden Service" +msgstr "" + +#: plinth/modules/tor/tor.py:115 +msgid "Tor Control Panel" +msgstr "" + +#: plinth/modules/tor/tor.py:240 +#, python-brace-format +msgid "Action error: {0} [{1}] [{2}]" +msgstr "" + +#: plinth/modules/tor/tor.py:256 +msgid "Tor enabled" +msgstr "" + +#: plinth/modules/tor/tor.py:259 +msgid "Tor disabled" +msgstr "" + +#: plinth/modules/tor/tor.py:264 +msgid "Tor hidden service enabled" +msgstr "" + +#: plinth/modules/tor/tor.py:267 +msgid "Tor hidden service disabled" +msgstr "" + +#: plinth/modules/tor/tor.py:292 +msgid "Enabled package download over Tor" +msgstr "" + +#: plinth/modules/tor/tor.py:295 +msgid "Disabled package download over Tor" +msgstr "" + +#: plinth/modules/transmission/__init__.py:38 +#: plinth/modules/transmission/templates/transmission.html:26 +#: plinth/modules/transmission/views.py:67 +msgid "BitTorrent (Transmission)" +msgstr "" + +#: plinth/modules/transmission/__init__.py:43 +msgid "Transmission BitTorrent" +msgstr "" + +#: plinth/modules/transmission/forms.py:29 +msgid "Enable Transmission daemon" +msgstr "" + +#: plinth/modules/transmission/forms.py:33 +msgid "Download directory" +msgstr "" + +#: plinth/modules/transmission/forms.py:34 +msgid "" +"Directory where downloads are saved. If you change the default directory, " +"ensure that the new directory exists and is writable by \"debian-transmission" +"\" user." +msgstr "" + +#: plinth/modules/transmission/forms.py:40 +msgid "Username to login to the web interface." +msgstr "" + +#: plinth/modules/transmission/forms.py:44 +msgid "" +"Password to login to the web interface. Current password is shown in a " +"hashed format. To set a new password, enter the password in plain text." +msgstr "" + +#: plinth/modules/transmission/templates/transmission.html:29 +msgid "" +"BitTorrent is a peer-to-peer file sharing protocol. Transmission daemon " +"handles Bitorrent file sharing. Note that BitTorrent is not anonymous." +msgstr "" + +#: plinth/modules/transmission/templates/transmission.html:37 +msgid "" +"Access the web interface at /transmission." +msgstr "" + +#: plinth/modules/transmission/templates/transmission.html:47 +msgid "Transmission daemon is running" +msgstr "" + +#: plinth/modules/transmission/templates/transmission.html:50 +msgid "Transmission daemon is not running." +msgstr "" + +#: plinth/modules/upgrades/__init__.py:33 +msgid "Software Upgrades" +msgstr "" + +#: plinth/modules/upgrades/forms.py:29 +msgid "Enable automatic upgrades" +msgstr "" + +#: plinth/modules/upgrades/forms.py:30 +msgid "" +"When enabled, the unattended-upgrades program will be run once per day. It " +"will attempt to perform any package upgrades that are available." +msgstr "" + +#: plinth/modules/upgrades/templates/upgrades.html:40 +msgid "There was an error while upgrading." +msgstr "" + +#: plinth/modules/upgrades/templates/upgrades.html:43 +#: plinth/modules/upgrades/templates/upgrades.html:59 +msgid "Output from unattended-upgrades:" +msgstr "" + +#: plinth/modules/upgrades/templates/upgrades.html:50 +msgid "The operating system is up to date now.  " +msgstr "" + +#: plinth/modules/upgrades/templates/upgrades.html:53 +msgid "Show Details" +msgstr "" + +#: plinth/modules/upgrades/templates/upgrades.html:69 +msgid "" +"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." +msgstr "" + +#: plinth/modules/upgrades/templates/upgrades.html:80 +msgid "Upgrade now »" +msgstr "" + +#: plinth/modules/upgrades/templates/upgrades.html:87 +msgid "System is being upgraded." +msgstr "" + +#: plinth/modules/upgrades/views.py:35 plinth/modules/upgrades/views.py:64 +msgid "Automatic Upgrades" +msgstr "" + +#: plinth/modules/upgrades/views.py:37 +msgid "Upgrade Packages" +msgstr "" + +#: plinth/modules/upgrades/views.py:75 +msgid "Package Upgrades" +msgstr "" + +#: plinth/modules/upgrades/views.py:116 +#, python-brace-format +msgid "Error when configuring unattended-upgrades: {error}" +msgstr "" + +#: plinth/modules/upgrades/views.py:121 +msgid "Automatic upgrades enabled" +msgstr "" + +#: plinth/modules/upgrades/views.py:123 +msgid "Automatic upgrades disabled" +msgstr "" + +#: plinth/modules/upgrades/views.py:142 +msgid "Upgrade completed." +msgstr "" + +#: plinth/modules/upgrades/views.py:144 +msgid "Upgrade failed." +msgstr "" + +#: plinth/modules/users/__init__.py:36 +msgid "Users and Groups" +msgstr "" + +#: plinth/modules/users/__init__.py:65 +#, python-brace-format +msgid "Check LDAP entry \"{search_item}\"" +msgstr "" + +#: plinth/modules/users/forms.py:28 +msgid "admin" +msgstr "" + +#: plinth/modules/users/forms.py:29 +msgid "wiki" +msgstr "" + +#: plinth/modules/users/forms.py:41 +msgid "Groups" +msgstr "" + +#: plinth/modules/users/forms.py:45 +msgid "" +"Select which services should be available to the new user. The user will be " +"able to log in to services that support single sign-on through LDAP, if they " +"are in the appropriate group.

Users in the admin group will be " +"able to log in to all services. They can also log in to the system through " +"SSH and have administrative privileges (sudo)." +msgstr "" + +#: plinth/modules/users/forms.py:80 +#, python-brace-format +msgid "Failed to add new user to {group} group." +msgstr "" + +#: plinth/modules/users/forms.py:126 +msgid "Renaming LDAP user failed." +msgstr "" + +#: plinth/modules/users/forms.py:138 +msgid "Failed to remove user from group." +msgstr "" + +#: plinth/modules/users/forms.py:149 +msgid "Failed to add user to group." +msgstr "" + +#: plinth/modules/users/forms.py:174 +msgid "Changing LDAP user password failed." +msgstr "" + +#: plinth/modules/users/templates/users_change_password.html:27 +#, python-format +msgid "Change Password for %(username)s" +msgstr "" + +#: plinth/modules/users/templates/users_change_password.html:40 +msgid "Save Password" +msgstr "" + +#: plinth/modules/users/templates/users_create.html:42 +#: plinth/modules/users/views.py:36 plinth/modules/users/views.py:56 +msgid "Create User" +msgstr "" + +#: plinth/modules/users/templates/users_delete.html:26 +#: plinth/modules/users/views.py:103 +msgid "Delete User" +msgstr "" + +#: plinth/modules/users/templates/users_delete.html:29 +#, python-format +msgid "Delete user %(username)s permanently?" +msgstr "" + +#: plinth/modules/users/templates/users_delete.html:38 +#, python-format +msgid "Delete %(username)s" +msgstr "" + +#: plinth/modules/users/templates/users_list.html:46 +#, python-format +msgid "Delete user %(username)s" +msgstr "" + +#: plinth/modules/users/templates/users_list.html:53 +#, python-format +msgid "Edit user %(username)s" +msgstr "" + +#: plinth/modules/users/templates/users_update.html:39 +#, python-format +msgid "" +"Use the change password form to " +"change the password." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:53 +msgid "Save Changes" +msgstr "" + +#: plinth/modules/users/views.py:34 plinth/modules/users/views.py:69 +msgid "Users" +msgstr "" + +#: plinth/modules/users/views.py:54 +#, python-format +msgid "User %(username)s created." +msgstr "" + +#: plinth/modules/users/views.py:78 +#, python-format +msgid "User %(username)s updated." +msgstr "" + +#: plinth/modules/users/views.py:79 +msgid "Edit User" +msgstr "" + +#: plinth/modules/users/views.py:113 +#, python-brace-format +msgid "User {user} deleted." +msgstr "" + +#: plinth/modules/users/views.py:120 +msgid "Deleting LDAP user failed." +msgstr "" + +#: plinth/modules/users/views.py:129 +msgid "Change Password" +msgstr "" + +#: plinth/modules/users/views.py:130 +msgid "Password changed successfully." +msgstr "" + +#: plinth/modules/xmpp/__init__.py:41 plinth/modules/xmpp/__init__.py:46 +#: plinth/modules/xmpp/templates/xmpp.html:26 plinth/modules/xmpp/views.py:75 +msgid "Chat Server (XMPP)" +msgstr "" + +#: plinth/modules/xmpp/forms.py:29 +msgid "Enable XMPP" +msgstr "" + +#: plinth/modules/xmpp/templates/xmpp.html:29 +msgid "" +"XMPP is an open and standardized communication protocol. Here you can run " +"and configure your XMPP server, called ejabberd." +msgstr "" + +#: plinth/modules/xmpp/templates/xmpp.html:36 +msgid "" +"To actually communicate, you can use the web client or " +"any other XMPP client." +msgstr "" + +#: plinth/modules/xmpp/templates/xmpp.html:45 +#, python-format +msgid "" +"Your XMPP server domain is set to %(domainname)s. User IDs will look " +"like username@%(domainname)s. You can setup your domain on the system " +"Configure page." +msgstr "" + +#: plinth/modules/xmpp/templates/xmpp.html:55 +msgid "Launch web client" +msgstr "" + +#: plinth/modules/xmpp/templates/xmpp.html:63 +msgid "ejabberd is running" +msgstr "" + +#: plinth/modules/xmpp/templates/xmpp.html:66 +msgid "ejabberd is not running" +msgstr "" + +#: plinth/network.py:39 +msgid "PPPoE" +msgstr "" + +#: plinth/package.py:156 +msgid "packages not found" +msgstr "" + +#: plinth/package.py:263 +msgid "Installed and configured packages successfully." +msgstr "" + +#: plinth/package.py:268 +#, python-brace-format +msgid "Error installing packages: {string} {details}" +msgstr "" + +#: plinth/service.py:73 +msgid "Web Server" +msgstr "" + +#: plinth/service.py:74 +msgid "Web Server over Secure Socket Layer" +msgstr "" + +#: plinth/service.py:76 +msgid "Secure Shell (SSH) Server" +msgstr "" + +#: plinth/service.py:78 +msgid "FreedomBox Web Interface (Plinth)" +msgstr "" + +#: plinth/templates/404.html:25 +msgid "404" +msgstr "" + +#: plinth/templates/404.html:28 +#, python-format +msgid "Requested page %(request_path)s was not found." +msgstr "" + +#: plinth/templates/404.html:34 +msgid "" +"If you believe this missing page should exist, please file a bug at the " +"Plinth project issue " +"tracker." +msgstr "" + +#: plinth/templates/500.html:25 +msgid "500" +msgstr "" + +#: plinth/templates/500.html:28 +msgid "" +"This is an internal error and not something you caused or can fix. Please " +"report the error on the bug tracker so we can fix it." +msgstr "" + +#: plinth/templates/base.html:49 +msgid "Plinth administrative interface for the FreedomBox" +msgstr "" + +#: plinth/templates/base.html:52 +msgid "FreedomBox" +msgstr "" + +#: plinth/templates/base.html:81 +msgid "Toggle navigation" +msgstr "" + +#: plinth/templates/base.html:123 plinth/templates/base.html.py:124 +msgid "Change password" +msgstr "" + +#: plinth/templates/base.html:127 plinth/templates/base.html.py:128 +#: plinth/templates/base.html:141 plinth/templates/base.html.py:143 +msgid "Log out" +msgstr "" + +#: plinth/templates/base.html:133 plinth/templates/base.html.py:135 +msgid "Log in" +msgstr "" + +#: plinth/templates/login.html:35 +msgid "Login" +msgstr "" + +#: plinth/templates/package_install.html:35 +msgid "Installation" +msgstr "" + +#: plinth/templates/package_install.html:40 +msgid "" +"This feature requires addtional packages to be installed. Do you wish to " +"install them?" +msgstr "" + +#: plinth/templates/package_install.html:49 +msgid "Package" +msgstr "" + +#: plinth/templates/package_install.html:50 +msgid "Summary" +msgstr "" + +#: plinth/templates/package_install.html:67 +msgid "Install" +msgstr "" + +#: plinth/templates/package_install.html:74 +#, python-format +msgid "Installing %(package_names)s: %(status)s" +msgstr "" + +#: plinth/templates/package_install.html:84 +#, python-format +msgid "%(percentage)s%% complete" +msgstr "" From d3f104c7d998718c0f8c37baef15e8a4cace1ad2 Mon Sep 17 00:00:00 2001 From: Caly Date: Sat, 16 Jan 2016 02:11:03 +0100 Subject: [PATCH 008/189] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (537 of 537 strings) --- plinth/locale/nb/LC_MESSAGES/django.po | 57 +++++++++++++------------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/plinth/locale/nb/LC_MESSAGES/django.po b/plinth/locale/nb/LC_MESSAGES/django.po index 1c566953d..760a7a09e 100644 --- a/plinth/locale/nb/LC_MESSAGES/django.po +++ b/plinth/locale/nb/LC_MESSAGES/django.po @@ -15,15 +15,16 @@ msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-12-23 11:51+0530\n" -"PO-Revision-Date: 2015-12-20 14:20+0000\n" -"Last-Translator: pere \n" -"Language-Team: Norwegian Bokmål (http://www.transifex.com/freedombox/plinth/" -"language/nb/)\n" +"PO-Revision-Date: 2016-01-16 02:12+0000\n" +"Last-Translator: Caly \n" +"Language-Team: Norwegian Bokmål " +"\n" "Language: nb\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 2.5-dev\n" #: plinth/action_utils.py:203 #, python-brace-format @@ -303,7 +304,7 @@ msgstr "Dato og tid" #: plinth/modules/datetime/__init__.py:44 msgid "Network Time Server" -msgstr "Nettverkets tidstjener " +msgstr "Nettverkets Tidstjener" #: plinth/modules/datetime/__init__.py:76 msgid "NTP client in contact with servers" @@ -383,7 +384,7 @@ msgstr "" "Når den er aktivert, vil Deluge nett-tjeneren være tilgjengelig fra /deluge \n" "på nettserveren. Standardpassordet er 'deluge', men du bør logge inn og " -"endre det umiddelbart etter at denne tjenesten er aktivert. " +"endre det umiddelbart etter at denne tjenesten er aktivert." #: plinth/modules/deluge/templates/deluge.html:44 msgid "deluge-web is running" @@ -479,7 +480,7 @@ msgid "" msgstr "" "Velg en oppdateringsprotokoll i samsvar med din leverandør. Hvis " "leverandøren ikke støtter GnudIP-protokollen, eller leverandøren din ikke er " -"oppført, kan du bruke leverandørens nettadresse for oppdatering. " +"oppført, kan du bruke leverandørens nettadresse for oppdatering." #: plinth/modules/dynamicdns/dynamicdns.py:79 msgid "" @@ -487,13 +488,11 @@ msgid "" "hostname of the GnuDIP server (like \"example.pcom\")." msgstr "" "Vennligst ikke kjør en nettadresse her (som \"https://example.com/\") men " -"bare vertsnavnet til GnuDIP-tjeneren (som \"example.pcom\")." +"bare vertsnavnet til GnuDIP-tjeneren (som \"example.com\")." #: plinth/modules/dynamicdns/dynamicdns.py:83 msgid "The public domain name you want use to reach your box." -msgstr "" -"The public domain navnet (det offentlige domenenavnet) du vil bruke for å nå " -"mottakeren." +msgstr "Det offentlige domenenavnet du vil bruke for å nå mottakeren." #: plinth/modules/dynamicdns/dynamicdns.py:85 msgid "Use this option if your provider uses self signed certificates." @@ -1010,8 +1009,8 @@ msgid "" "When enabled, the blogs and wikis will be available from /ikiwiki." msgstr "" -"Aktivert, blir bloggene og wikiene tilgjengelig fra /" -"ikiwiki" +"Aktivert, blir bloggene og wikiene tilgjengelig fra /ikiwiki." #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:27 #, python-format @@ -1176,7 +1175,7 @@ msgstr "Bruker DNSSEC på IPv{kind}" #: plinth/modules/networks/forms.py:30 msgid "-- select --" -msgstr " – velg – " +msgstr "– velg –" #: plinth/modules/networks/forms.py:42 msgid "Connection Type" @@ -1280,7 +1279,7 @@ msgstr "Vis passord" #: plinth/modules/networks/forms.py:145 #: plinth/modules/networks/templates/connection_show.html:144 msgid "SSID" -msgstr "SSID (Service Set Identifier) " +msgstr "SSID (Service Set Identifier)" #: plinth/modules/networks/forms.py:146 msgid "The visible name of the network." @@ -1708,10 +1707,10 @@ msgid "" msgstr "" "For å koble til %(box_name)s VPN, må du laste ned en profil og legge den til " "en OpenVPN-klient på mobilen eller på en stasjonære maskin. OpenVPN-klienter " -"er tilgjengelig for de fleste plattformer. Se " -"documentation om anbefate klienter og instruksjoner om hvordan de " -"settes opp. " +"er tilgjengelig for de fleste plattformer. Se documentation om anbefate klienter og instruksjoner " +"om hvordan de settes opp." #: plinth/modules/openvpn/templates/openvpn.html:66 #, python-format @@ -1733,7 +1732,7 @@ msgid "" msgstr "" "OpenVPN er ennå ikke satt opp. Å utføre et sikkert oppsett tar svært lang " "tid. Avhengig av hvor fort din %(box_name)s er, kan det hende at det tar " -"timer. Hvis oppsettingen blir avbrutt, kan du starte den igjen. " +"timer. Hvis oppsettingen blir avbrutt, kan du starte den igjen." #: plinth/modules/openvpn/templates/openvpn.html:97 msgid "Start setup" @@ -1848,7 +1847,7 @@ msgstr "Tjenerport" #: plinth/modules/pagekite/forms.py:56 msgid "Port of your pagekite server (default: 80)" -msgstr " Overføre din PageKite tjener (default: 80)" +msgstr "Overføre din PageKite tjener (default: 80)" #: plinth/modules/pagekite/forms.py:58 msgid "Kite name" @@ -2125,7 +2124,7 @@ msgstr "Omstart »" #: plinth/modules/power/templates/power.html:37 msgid "Shut Down »" -msgstr "Slå av " +msgstr "Slå av »" #: plinth/modules/power/templates/power_restart.html:29 msgid "" @@ -2208,11 +2207,11 @@ msgstr "Privoxy kjører ikke" #: plinth/modules/quassel/templates/quassel.html:26 #: plinth/modules/quassel/views.py:54 msgid "IRC Client (Quassel)" -msgstr "IRC Client (Quassel)" +msgstr "IRC Klient (Quassel)" #: plinth/modules/quassel/__init__.py:41 msgid "Quassel IRC Client" -msgstr "Quassel IRC Client" +msgstr "Quassel IRC Klient" #: plinth/modules/quassel/forms.py:29 msgid "Enable Quassel core service" @@ -2395,7 +2394,7 @@ msgid "" "The options affect the %(box_name)s at its most general level, so be careful!" msgstr "" "Mulighetene som berører %(box_name)s er oftet på generelt nivå, så vær " -"forsiktig! " +"forsiktig!" #: plinth/modules/tor/__init__.py:50 msgid "Tor relay port available" @@ -2412,7 +2411,7 @@ msgstr "Obfs4-transport registrert" #: plinth/modules/tor/__init__.py:101 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" -msgstr " Adgang til URL {url} på tcp{kind} via Tor" +msgstr "Adgang til URL {url} på tcp{kind} via Tor" #: plinth/modules/tor/__init__.py:112 #, python-brace-format @@ -2638,7 +2637,7 @@ msgstr "Det var en feil under oppgradering." #: plinth/modules/upgrades/templates/upgrades.html:43 #: plinth/modules/upgrades/templates/upgrades.html:59 msgid "Output from unattended-upgrades:" -msgstr "Resultat fra oppgraderinger uten tilsyn" +msgstr "Resultat fra oppgraderinger uten tilsyn:" #: plinth/modules/upgrades/templates/upgrades.html:50 msgid "The operating system is up to date now.  " @@ -2838,7 +2837,7 @@ msgstr "Endre passord" #: plinth/modules/users/views.py:130 msgid "Password changed successfully." -msgstr "Vellykket passordbytte" +msgstr "Vellykket passordbytte." #: plinth/modules/xmpp/__init__.py:41 plinth/modules/xmpp/__init__.py:46 #: plinth/modules/xmpp/templates/xmpp.html:26 plinth/modules/xmpp/views.py:75 From 7a06802d5d5b48d1a12a4ab6ff148d5eb732bf58 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sat, 16 Jan 2016 14:33:19 +0530 Subject: [PATCH 009/189] =?UTF-8?q?Translated=20using=20Transifex=20(Norwe?= =?UTF-8?q?gian=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plinth/locale/nb/LC_MESSAGES/django.po | 119 ++++++++++++------------- 1 file changed, 59 insertions(+), 60 deletions(-) diff --git a/plinth/locale/nb/LC_MESSAGES/django.po b/plinth/locale/nb/LC_MESSAGES/django.po index 760a7a09e..9119c5cc7 100644 --- a/plinth/locale/nb/LC_MESSAGES/django.po +++ b/plinth/locale/nb/LC_MESSAGES/django.po @@ -7,24 +7,23 @@ # Ingrid Yrvin , 2015 # Ingrid Yrvin , 2015 # oeyrvin , 2015 -# pere , 2015 +# pere , 2015-2016 # Petter Reinholdtsen , 2015 # Philippe Baret , 2015 msgid "" msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-12-23 11:51+0530\n" -"PO-Revision-Date: 2016-01-16 02:12+0000\n" -"Last-Translator: Caly \n" -"Language-Team: Norwegian Bokmål " -"\n" +"POT-Creation-Date: 2015-12-20 13:58+0530\n" +"PO-Revision-Date: 2016-01-16 08:50+0000\n" +"Last-Translator: pere \n" +"Language-Team: Norwegian Bokmål (http://www.transifex.com/freedombox/plinth/" +"language/nb/)\n" "Language: nb\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 2.5-dev\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" #: plinth/action_utils.py:203 #, python-brace-format @@ -304,15 +303,15 @@ msgstr "Dato og tid" #: plinth/modules/datetime/__init__.py:44 msgid "Network Time Server" -msgstr "Nettverkets Tidstjener" +msgstr "Nettverktidstjener" #: plinth/modules/datetime/__init__.py:76 msgid "NTP client in contact with servers" -msgstr "NTP-klient i kontakt med server" +msgstr "NTP-klient har kontakt med tjenere" #: plinth/modules/datetime/forms.py:31 msgid "Enable network time" -msgstr "Aktiver nettverkstid" +msgstr "Aktiver nettverktid" #: plinth/modules/datetime/forms.py:35 msgid "Time Zone" @@ -335,16 +334,16 @@ msgid "" "Network time server is a program that maintians the system time in " "synchronization with servers on the Internet." msgstr "" -"Nettverkstidstjeneren er et program som synkroniserer systemets tid med " -"servere på Internettet." +"Nettverktidstjeneren er et program som synkroniserer systemets klokke med " +"tjenere på Internettet." #: plinth/modules/datetime/templates/datetime.html:40 msgid "Network time server is running" -msgstr "Nettverkstidsserver kjører" +msgstr "Nettverktidstjeneren kjører" #: plinth/modules/datetime/templates/datetime.html:43 msgid "Network time server is not running" -msgstr "Nettverkstidsserver kjører ikke" +msgstr "Nettverktidstjeneren kjører ikke" #: plinth/modules/datetime/views.py:93 #, python-brace-format @@ -381,10 +380,10 @@ msgid "" "\">/deluge path on the web server. The default password is 'deluge', but " "you should log in and change it immediately after enabling this service." msgstr "" -"Når den er aktivert, vil Deluge nett-tjeneren være tilgjengelig fra /deluge \n" -"på nettserveren. Standardpassordet er 'deluge', men du bør logge inn og " -"endre det umiddelbart etter at denne tjenesten er aktivert." +"Når den er aktivert, vil Deluge nett-klienten være tilgjengelig fra /deluge på netttjeneren. Standardpassordet er 'deluge', men " +"du bør logge inn og endre det umiddelbart etter at denne tjenesten er " +"aktivert." #: plinth/modules/deluge/templates/deluge.html:44 msgid "deluge-web is running" @@ -492,7 +491,7 @@ msgstr "" #: plinth/modules/dynamicdns/dynamicdns.py:83 msgid "The public domain name you want use to reach your box." -msgstr "Det offentlige domenenavnet du vil bruke for å nå mottakeren." +msgstr "Det offentlige domenenavnet du vil bruke for å nå din boks." #: plinth/modules/dynamicdns/dynamicdns.py:85 msgid "Use this option if your provider uses self signed certificates." @@ -724,8 +723,8 @@ msgid "" "you may run it using the command 'service firewalld start' or in case of a " "system with systemd 'systemctl start firewalld'." msgstr "" -"Brannmurnissen kjører ikke. Kjør den. Brannmuren kommer som standard " -"aktivert på %(box_name)s. På et Debian-basert system (slik som " +"Brannmur-bakgrunnsprosessen kjører ikke. Den må kjøre. Brannmuren kommer som " +"standard aktivert på %(box_name)s. På et Debian-basert system (slik som " "%(box_name)s), kan du kjøre den med kommandoen «service firewalld start\" " "eller alternativt i et system med systemd, «systemctl start firewalld»." @@ -883,10 +882,10 @@ msgid "" "data stays with you." msgstr "" "FreedomBox er et fellesskapsprosjekt for å utvikle, designe og fremme " -"personlige servere som kjører gratis programvare for privat, personlig " -"kommunikasjon. Det er et nettverksprogram utviklet for å tillate samvirke " -"med resten av Internett med beskyttet personvern og datasikkerhet. Det har " -"applikasjoner som blogg, wiki, hjemmeside, sosiale nettverk, e-post, " +"personlige tjenermaskiner som kjører gratis programvare for privat, " +"personlig kommunikasjon. Det er et nettverksprogram utviklet for å tillate " +"samvirke med resten av Internett med beskyttet personvern og datasikkerhet. " +"Det har applikasjoner som blogg, wiki, hjemmeside, sosiale nettverk, e-post, " "nettmellomtjener og et Tor relé på en enhet som kan erstatte din Wi-Fi-" "ruter, slik at dataene blir hos deg." @@ -1009,8 +1008,8 @@ msgid "" "When enabled, the blogs and wikis will be available from /ikiwiki." msgstr "" -"Aktivert, blir bloggene og wikiene tilgjengelig fra /ikiwiki." +"Aktivert, blir bloggene og wikiene tilgjengelig fra /" +"ikiwiki." #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:27 #, python-format @@ -1136,8 +1135,8 @@ msgid "" "href=\"http://mumble.info\">Clients to connect to Mumble from your " "desktop and Android devices are available." msgstr "" -"Du kan koble til din Mumble-server på den vanlige Mumble-port 64738. Clients for å koble til Mumble når skrivebordet " +"Du kan koble til din Mumble-tjener på den vanlige Mumble-port 64738. Klienter for å koble til Mumble når skrivebordet " "og/eller Android-enheter er tilgjengelige." #: plinth/modules/mumble/templates/mumble.html:49 @@ -1175,7 +1174,7 @@ msgstr "Bruker DNSSEC på IPv{kind}" #: plinth/modules/networks/forms.py:30 msgid "-- select --" -msgstr "– velg –" +msgstr "-- velg --" #: plinth/modules/networks/forms.py:42 msgid "Connection Type" @@ -1219,7 +1218,7 @@ msgid "" "\"Shared\" method will start a DHCP server and \"Automatic\" method will " "acquire configuration from a DHCP server." msgstr "" -"«Shared»-metoden vil starte en DHCP-server, og «Automatic»-metoden vil hente " +"«Shared»-metoden vil starte en DHCP-tjener, og «Automatic»-metoden vil hente " "konfigurasjon fra en DHCP-tjener." #: plinth/modules/networks/forms.py:68 plinth/modules/networks/forms.py:170 @@ -1258,7 +1257,7 @@ msgid "" "\"Automatic\", the DNS Servers provided by a DHCP server will be ignored." msgstr "" "Valgfri verdi. Hvis denne verdien er gitt, og IPv4 adresseringsmetoden er " -"«Automatic», vil DNS-tjenere levert av en DHCP-server, bli ignorert." +"«Automatic», vil DNS-tjenere levert av en DHCP-tjener, bli ignorert." #: plinth/modules/networks/forms.py:90 plinth/modules/networks/forms.py:192 msgid "Second DNS Server" @@ -1270,7 +1269,7 @@ msgid "" "\"Automatic\", the DNS Servers provided by a DHCP server will be ignored." msgstr "" "Valgfri verdi. Hvis denne verdien er gitt, og IPv4 adresseringsmetoden er " -"«Automatic», vil DNS-servere som tilbys av en DHCP-server, bli ignorert." +"«Automatic», vil DNS-servere som tilbys av en DHCP-tjener, bli ignorert." #: plinth/modules/networks/forms.py:121 msgid "Show password" @@ -1279,7 +1278,7 @@ msgstr "Vis passord" #: plinth/modules/networks/forms.py:145 #: plinth/modules/networks/templates/connection_show.html:144 msgid "SSID" -msgstr "SSID (Service Set Identifier)" +msgstr "SSID" #: plinth/modules/networks/forms.py:146 msgid "The visible name of the network." @@ -1707,10 +1706,10 @@ msgid "" msgstr "" "For å koble til %(box_name)s VPN, må du laste ned en profil og legge den til " "en OpenVPN-klient på mobilen eller på en stasjonære maskin. OpenVPN-klienter " -"er tilgjengelig for de fleste plattformer. Se documentation om anbefate klienter og instruksjoner " -"om hvordan de settes opp." +"er tilgjengelig for de fleste plattformer. Se dokumentasjon om anbefate klienter og instruksjoner om hvordan de " +"settes opp." #: plinth/modules/openvpn/templates/openvpn.html:66 #, python-format @@ -1847,7 +1846,7 @@ msgstr "Tjenerport" #: plinth/modules/pagekite/forms.py:56 msgid "Port of your pagekite server (default: 80)" -msgstr "Overføre din PageKite tjener (default: 80)" +msgstr "Port for din PageKitetjener (default: 80)" #: plinth/modules/pagekite/forms.py:58 msgid "Kite name" @@ -2207,11 +2206,11 @@ msgstr "Privoxy kjører ikke" #: plinth/modules/quassel/templates/quassel.html:26 #: plinth/modules/quassel/views.py:54 msgid "IRC Client (Quassel)" -msgstr "IRC Klient (Quassel)" +msgstr "IRC-klient (Quassel)" #: plinth/modules/quassel/__init__.py:41 msgid "Quassel IRC Client" -msgstr "Quassel IRC Klient" +msgstr "Quassel IRC-klient" #: plinth/modules/quassel/forms.py:29 msgid "Enable Quassel core service" @@ -2228,7 +2227,7 @@ msgid "" "connect and disconnect from it." msgstr "" "Quassel er et IRC-applikasjon som er delt i to deler, en «kjerne» og en " -"«klient». Dette tillater kjernen å være koblet til IRC-servere, og for å " +"«klient». Dette tillater kjernen å være koblet til IRC-tjenere, og for å " "fortsette å motta meldinger, selv når klienten er frakoblet. %(box_name)s " "kan kjøre Quassel kjernetjeneste, og holder deg alltid på nettet, og en " "eller flere Quassel-klienter kan brukes fra et skrivebord, eller mobilt til " @@ -2420,7 +2419,7 @@ msgstr "Bekreft Tor-bruk på {url} via tcp{kind}" #: plinth/modules/tor/templates/tor.html:26 plinth/modules/tor/tor.py:66 msgid "Anonymity Network (Tor)" -msgstr "Anonymity Network (Tor)" +msgstr "Anonymitetsnettverk (Tor)" #: plinth/modules/tor/templates/tor.html:29 msgid "" @@ -2465,10 +2464,10 @@ msgid "" "firewall, you should make sure the following ports are open, and port-" "forwarded, if necessary:" msgstr "" -"Ditt %(box_name)s er satt opp som en Tor-bro med obfsproxy, så det kan " -"hjelpe til med å komme forbi sensur. Hvis din %(box_name)s er bak en ruter " -"eller brannvegg, må du forsikre deg om at de følgende portene er åpne, og " -"port-videre (videreportert), om nødvendig:" +"Ditt %(box_name)s er satt opp som en Tor-bro med obfsproxy, så det kan bidra " +"med å motvirke sensur. Hvis din %(box_name)s er bak en ruter eller " +"brannvegg, må du forsikre deg om at de følgende portene er åpne, og at " +"portene er videresendt, om nødvendig:" #: plinth/modules/tor/templates/tor.html:101 msgid "Service" @@ -2555,7 +2554,7 @@ msgstr "Deaktivert pakke lastet ned over Tor" #: plinth/modules/transmission/templates/transmission.html:26 #: plinth/modules/transmission/views.py:63 msgid "BitTorrent (Transmission)" -msgstr "BitTorrent (Transmission) (Transmission: Overføring)" +msgstr "BitTorrent (Transmission)" #: plinth/modules/transmission/__init__.py:43 msgid "Transmission BitTorrent" @@ -2563,7 +2562,7 @@ msgstr "Overføring BitTorrent" #: plinth/modules/transmission/forms.py:29 msgid "Enable Transmission daemon" -msgstr "Aktiver Transmission (overføring) i bakgrunnen" +msgstr "Aktiver bakgrunnsprosess for Transmission" #: plinth/modules/transmission/forms.py:33 msgid "Download directory" @@ -2596,8 +2595,8 @@ msgid "" "BitTorrent is a peer-to-peer file sharing protocol. Transmission daemon " "handles Bitorrent file sharing. Note that BitTorrent is not anonymous." msgstr "" -"BitTorrent er en like-til-like fildelingsprotokoll. Transmission i " -"bakgrunnen håndterer BitTorrent fildeling. Merk at BitTorrent er ikke anonym." +"BitTorrent er en like-til-like fildelingsprotokoll. Transmission håndterer " +"BitTorrent-fildeling i bakgrunnen. Merk at BitTorrent er ikke anonym." #: plinth/modules/transmission/templates/transmission.html:37 msgid "" @@ -2612,7 +2611,7 @@ msgstr "Transmission kjører i bakgrunnen" #: plinth/modules/transmission/templates/transmission.html:50 msgid "Transmission daemon is not running." -msgstr "Transmission-nissen kjører ikke." +msgstr "Transmission kjører ikke i bakgrunnen." #: plinth/modules/upgrades/__init__.py:33 msgid "Software Upgrades" @@ -2627,8 +2626,8 @@ msgid "" "When enabled, the unattended-upgrades program will be run once per day. It " "will attempt to perform any package upgrades that are available." msgstr "" -"Når den er aktivert, vil oppgraderingsprogrammet uten tilyn kjøres én gang " -"per dag. Det vil søke å utføre de pakkeoppgraderinger som er tilgjengelige." +"Når den er aktivert, vil oppgraderingsprogrammet kjøres én gang per dag uten " +"tilsyn. Det vil forsøke å utføre de pakkeoppgraderinger som er tilgjengelige." #: plinth/modules/upgrades/templates/upgrades.html:40 msgid "There was an error while upgrading." @@ -2637,7 +2636,7 @@ msgstr "Det var en feil under oppgradering." #: plinth/modules/upgrades/templates/upgrades.html:43 #: plinth/modules/upgrades/templates/upgrades.html:59 msgid "Output from unattended-upgrades:" -msgstr "Resultat fra oppgraderinger uten tilsyn:" +msgstr "Resultat fra unattended-upgrades:" #: plinth/modules/upgrades/templates/upgrades.html:50 msgid "The operating system is up to date now.  " @@ -2862,9 +2861,9 @@ msgid "" "any other XMPP client." msgstr "" -"For faktisk å kommunisere, kan du bruke web client eller hvilken som helst annen XMPP client ." +"For faktisk å kommunisere, kan du bruke webklient " +"eller hvilken som helst annen XMPP client." #: plinth/modules/xmpp/templates/xmpp.html:45 #, python-format @@ -2908,7 +2907,7 @@ msgstr "Pakkeinstallasjonsfeil: {string} {details}" #: plinth/service.py:73 msgid "Web Server" -msgstr "Webserver" +msgstr "Nettjener" #: plinth/service.py:74 msgid "Web Server over Secure Socket Layer" From e58a661072d9a4bee9fef983999e8b451714deb2 Mon Sep 17 00:00:00 2001 From: Caly Date: Fri, 15 Jan 2016 21:18:47 +0100 Subject: [PATCH 010/189] Translated using Weblate (French) Currently translated at 100.0% (537 of 537 strings) --- plinth/locale/fr/LC_MESSAGES/django.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plinth/locale/fr/LC_MESSAGES/django.po b/plinth/locale/fr/LC_MESSAGES/django.po index eb0050dfe..d824b3855 100644 --- a/plinth/locale/fr/LC_MESSAGES/django.po +++ b/plinth/locale/fr/LC_MESSAGES/django.po @@ -9,8 +9,8 @@ msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-12-20 13:58+0530\n" -"PO-Revision-Date: 2016-01-09 19:43+0000\n" -"Last-Translator: ultrapeer \n" +"PO-Revision-Date: 2016-01-15 21:18+0000\n" +"Last-Translator: Caly \n" "Language-Team: French " "\n" "Language: fr\n" @@ -486,7 +486,7 @@ msgid "" "hostname of the GnuDIP server (like \"example.pcom\")." msgstr "" "Ne saisissez pas une URL (comme \"https://example.com/\"), seulement le nom " -"de machine du serveur GnuDIP (comme \"example.pcom\")." +"de machine du serveur GnuDIP (comme \"example.com\")." #: plinth/modules/dynamicdns/dynamicdns.py:83 msgid "The public domain name you want use to reach your box." From fd43cef1689aeafc16f37de366c333e6fc5264b5 Mon Sep 17 00:00:00 2001 From: Caly Date: Sat, 16 Jan 2016 01:59:09 +0100 Subject: [PATCH 011/189] Translated using Weblate (Swedish) Currently translated at 18.5% (104 of 562 strings) --- plinth/locale/sv/LC_MESSAGES/django.po | 244 ++++++++++++++++--------- 1 file changed, 155 insertions(+), 89 deletions(-) diff --git a/plinth/locale/sv/LC_MESSAGES/django.po b/plinth/locale/sv/LC_MESSAGES/django.po index a55696056..138583293 100644 --- a/plinth/locale/sv/LC_MESSAGES/django.po +++ b/plinth/locale/sv/LC_MESSAGES/django.po @@ -3,62 +3,63 @@ # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # -#, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-01-15 19:42+0530\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" +"PO-Revision-Date: 2016-01-16 01:59+0000\n" +"Last-Translator: Caly \n" +"Language-Team: Swedish " +"\n" +"Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 2.5-dev\n" #: plinth/action_utils.py:203 #, python-brace-format msgid "Listening on {kind} port {listen_address}:{port}" -msgstr "" +msgstr "Lyssnar på {kind} port {listen_address}:{port}" #: plinth/action_utils.py:206 #, python-brace-format msgid "Listening on {kind} port {port}" -msgstr "" +msgstr "Lyssnar på {kind} port {port}" #: plinth/action_utils.py:287 #, python-brace-format msgid "Access URL {url} on tcp{kind}" -msgstr "" +msgstr "Ansluter till adress {url} on tcp{kind}" #: plinth/action_utils.py:290 #, python-brace-format msgid "Access URL {url}" -msgstr "" +msgstr "Ansluter till adress {url}" #: plinth/action_utils.py:321 #, python-brace-format msgid "Connect to {host}:{port}" -msgstr "" +msgstr "Anslut till {host}:{port}" #: plinth/action_utils.py:324 #, python-brace-format msgid "Cannot connect to {host}:{port}" -msgstr "" +msgstr "Kan inte ansluta till {host}:{port}" #: plinth/modules/apps/apps.py:26 msgid "Apps" -msgstr "" +msgstr "Appar" #: plinth/modules/apps/apps.py:32 plinth/templates/base.html.py:91 msgid "Applications" -msgstr "" +msgstr "Applikationer" #: plinth/modules/apps/templates/apps.html:25 msgid "Services and Applications" -msgstr "" +msgstr "Tjänster och Applikationer" #: plinth/modules/apps/templates/apps.html:28 #, python-format @@ -67,6 +68,9 @@ msgid "" "%(box_name)s. Click on any app page link on the left to read a description " "of the application and choose to install it." msgstr "" +"Du kan installera och köra diverse tjänster och applikationer på din " +"%(box_name)s. Klicka på valfri länk till vänster för att läsa beskrivning av " +"applikationen och välja för att installera den." #: plinth/modules/apps/templates/apps.html:36 msgid "" @@ -75,16 +79,20 @@ msgid "" "one of those too. Many of the services you use on the web could soon be on " "site and under your control!" msgstr "" +"FreedomBox kan vara din sida för att dela foton, din meddelandesida, din " +"sida för socialt nätverkande, eller din nyhetssida. Minns du webb-portaler? " +"Vi kan vara en sådan också. Många tjänster du använder på webben kan snart " +"vara på din egen sida, under din kontroll!" #: plinth/modules/avahi/__init__.py:40 plinth/modules/avahi/__init__.py:45 #: plinth/modules/avahi/templates/avahi.html:26 #: plinth/modules/avahi/views.py:53 msgid "Service Discovery" -msgstr "" +msgstr "Identifiera tjänster" #: plinth/modules/avahi/forms.py:29 msgid "Enable service discovery" -msgstr "" +msgstr "Aktivera tjänstidentifiering" #: plinth/modules/avahi/templates/avahi.html:29 msgid "" @@ -95,6 +103,12 @@ msgid "" "disabled to improve security especially when connecting to a hostile local " "network." msgstr "" +"Tjänstidentifiering tilllåter andra enheter i nätverket att upptäcka din " +"FreedomBox och se vilka tjänster den kör. Det tillåter även din FreedomBox " +"att upptäcka andra maskiner och vilka tjänster de kör på ditt lokala " +"nätverk. Tjänstidentifiering är inte nödvändigt och fungerar bara på interna " +"nätverk. Du kan låta den vara inaktiverad för att förbättra din säkerhet, " +"särskilt om du ansluter till ett osäkert lokalt nätverk." #: plinth/modules/avahi/templates/avahi.html:40 #: plinth/modules/datetime/templates/datetime.html:35 @@ -110,15 +124,15 @@ msgstr "" #: plinth/modules/transmission/templates/transmission.html:42 #: plinth/modules/xmpp/templates/xmpp.html:58 msgid "Status" -msgstr "" +msgstr "Status" #: plinth/modules/avahi/templates/avahi.html:45 msgid "Service discovery server is running" -msgstr "" +msgstr "Server för tjänsteidentifiering är aktiverad" #: plinth/modules/avahi/templates/avahi.html:48 msgid "Service discovery server is not running" -msgstr "" +msgstr "Server för tjänsteidentifiering är inaktiverad" #: plinth/modules/avahi/templates/avahi.html:52 #: plinth/modules/datetime/templates/datetime.html:48 @@ -135,7 +149,7 @@ msgstr "" #: plinth/modules/transmission/templates/transmission.html:56 #: plinth/modules/xmpp/templates/xmpp.html:72 msgid "Configuration" -msgstr "" +msgstr "Konfiguration" #: plinth/modules/avahi/templates/avahi.html:60 #: plinth/modules/datetime/templates/datetime.html:56 @@ -155,7 +169,7 @@ msgstr "" #: plinth/modules/upgrades/templates/upgrades_configure.html:34 #: plinth/modules/xmpp/templates/xmpp.html:80 msgid "Update setup" -msgstr "" +msgstr "Uppdatera inställningar" #: plinth/modules/avahi/views.py:73 plinth/modules/datetime/views.py:85 #: plinth/modules/deluge/views.py:80 @@ -166,7 +180,7 @@ msgstr "" #: plinth/modules/roundcube/views.py:84 plinth/modules/shaarli/views.py:74 #: plinth/modules/transmission/views.py:109 plinth/modules/xmpp/views.py:100 msgid "Configuration updated" -msgstr "" +msgstr "Konfiguration uppdaterad" #: plinth/modules/avahi/views.py:76 plinth/modules/datetime/views.py:99 #: plinth/modules/deluge/views.py:82 plinth/modules/ikiwiki/views.py:97 @@ -177,16 +191,16 @@ msgstr "" #: plinth/modules/tor/tor.py:250 plinth/modules/transmission/views.py:111 #: plinth/modules/upgrades/views.py:103 plinth/modules/xmpp/views.py:102 msgid "Setting unchanged" -msgstr "" +msgstr "Instänllningar oförändrade" #: plinth/modules/config/config.py:83 plinth/modules/config/config.py:120 #: plinth/modules/dynamicdns/dynamicdns.py:145 msgid "Invalid domain name" -msgstr "" +msgstr "Ogiltigt domännamn" #: plinth/modules/config/config.py:94 msgid "Hostname" -msgstr "" +msgstr "Värdnamn" #: plinth/modules/config/config.py:96 msgid "" @@ -195,16 +209,19 @@ msgid "" "have as interior characters only alphabets, digits and hyphens. Total " "length must be 63 characters or less." msgstr "" +"Värdnamn är namnet på din enhet som andra enheter i det lokala nätverket kan " +"nå dig via. Det får endast bestå av bokstäver, siffror och bindestreck, men " +"får inte börja eller sluta med bindestreck. Värdnamn får vara max 63 tecken." #: plinth/modules/config/config.py:104 msgid "Invalid hostname" -msgstr "" +msgstr "Ogiltigt värdnamn" #: plinth/modules/config/config.py:107 plinth/modules/config/config.py:153 #: plinth/modules/config/config.py:265 #: plinth/modules/dynamicdns/dynamicdns.py:140 msgid "Domain Name" -msgstr "" +msgstr "Domännamn" #: plinth/modules/config/config.py:109 msgid "" @@ -215,130 +232,141 @@ msgid "" "characters or less. Total length of domain name must be 253 characters or " "less." msgstr "" +"Domännamn är det globala namn som andra maskiner på Internet kan nå dig " +"via. Det skall bestå av ord åtskilda av punkter. Varje ord får endast bestå " +"av bokstäver, siffror och bindestreck, men får inte börja eller sluta med " +"bindestreck. Varje ord får vara max 63 tecken. Total längd på domännamnet " +"får max vara 253 tecken." #: plinth/modules/config/config.py:124 msgid "Language" -msgstr "" +msgstr "Språkval" #: plinth/modules/config/config.py:126 msgid "Language for this FreedomBox web administration interface" -msgstr "" +msgstr "Språkval för webbgränssnittet att administrera denna FreedomBox med" #: plinth/modules/config/config.py:135 #: plinth/modules/dynamicdns/dynamicdns.py:36 #: plinth/modules/ikiwiki/views.py:36 msgid "Configure" -msgstr "" +msgstr "Konfigurera" #: plinth/modules/config/config.py:176 msgid "General Configuration" -msgstr "" +msgstr "Allmän Konfiguration" #: plinth/modules/config/config.py:193 #, python-brace-format msgid "Error setting hostname: {exception}" -msgstr "" +msgstr "Fel inställning av värdnamn: {exception}" #: plinth/modules/config/config.py:196 msgid "Hostname set" -msgstr "" +msgstr "Värdnamn inställt" #: plinth/modules/config/config.py:202 #, python-brace-format msgid "Error setting domain name: {exception}" -msgstr "" +msgstr "Fel inställning av domännamn: {exception}" #: plinth/modules/config/config.py:205 msgid "Domain name set" -msgstr "" +msgstr "Domännamn inställt" #: plinth/modules/config/config.py:213 #, python-brace-format msgid "Error setting language: {exception}" -msgstr "" +msgstr "Fel i språkinställning: {exception}" #: plinth/modules/config/config.py:216 msgid "Language changed" -msgstr "" +msgstr "Språkval ändrat" #: plinth/modules/config/templates/config.html:32 msgid "Submit" -msgstr "" +msgstr "Sänd" #: plinth/modules/datetime/__init__.py:39 #: plinth/modules/datetime/templates/datetime.html:26 #: plinth/modules/datetime/views.py:58 msgid "Date & Time" -msgstr "" +msgstr "Datum & Tid" #: plinth/modules/datetime/__init__.py:44 msgid "Network Time Server" -msgstr "" +msgstr "Tidsserver för nätverket" #: plinth/modules/datetime/__init__.py:76 msgid "NTP client in contact with servers" -msgstr "" +msgstr "NTP-klient i kontakt med servrar" #: plinth/modules/datetime/forms.py:31 msgid "Enable network time" -msgstr "" +msgstr "Aktivera nätverkstid" #: plinth/modules/datetime/forms.py:35 msgid "Time Zone" -msgstr "" +msgstr "Tidszon" #: plinth/modules/datetime/forms.py:36 msgid "" "Set your time zone to get accurate timestamps. This will set the systemwide " "time zone." msgstr "" +"Ställ in din tidszon för att få korrekta tidsstämplar. Detta ställer in " +"tidszonen för hela systemet." #: plinth/modules/datetime/forms.py:47 msgid "-- no time zone set --" -msgstr "" +msgstr "-- ingen tidszon inställd --" #: plinth/modules/datetime/templates/datetime.html:29 msgid "" "Network time server is a program that maintians the system time in " "synchronization with servers on the Internet." msgstr "" +"Tidsserver för nätverket är ett program som sköter synkronisering av " +"systemtiden mot servrar på Internet." #: plinth/modules/datetime/templates/datetime.html:40 msgid "Network time server is running" -msgstr "" +msgstr "Tidsserver för nätverket är aktiverad" #: plinth/modules/datetime/templates/datetime.html:43 msgid "Network time server is not running" -msgstr "" +msgstr "Tidsserver för nätverket är inaktiverad" #: plinth/modules/datetime/views.py:93 #, python-brace-format msgid "Error setting time zone: {exception}" -msgstr "" +msgstr "Fel i inställning av tidszon: {exception}" #: plinth/modules/datetime/views.py:96 msgid "Time zone set" -msgstr "" +msgstr "Tidszon inställd" #: plinth/modules/deluge/__init__.py:38 plinth/modules/deluge/views.py:56 msgid "BitTorrent (Deluge)" -msgstr "" +msgstr "BitTorrent (Deluge)" #: plinth/modules/deluge/__init__.py:43 msgid "Deluge BitTorrent" -msgstr "" +msgstr "Deluge BitTorrent" #: plinth/modules/deluge/forms.py:29 msgid "Enable Deluge" -msgstr "" +msgstr "Aktivera Deluge" #: plinth/modules/deluge/templates/deluge.html:26 msgid "BitTorrent Web Client (Deluge)" -msgstr "" +msgstr "BitTorrent Webbklient (Deluge)" #: plinth/modules/deluge/templates/deluge.html:28 msgid "Deluge is a BitTorrent client that features a Web UI." msgstr "" +"Deluge är en BitTorrentklient som inkluderar ett Webbaserat " +"användargränssnitt." #: plinth/modules/deluge/templates/deluge.html:31 msgid "" @@ -346,80 +374,85 @@ msgid "" "\">/deluge path on the web server. The default password is 'deluge', but " "you should log in and change it immediately after enabling this service." msgstr "" +"När aktiverad blir Deluges webbklient tillgänglig via / " +"deluge address på webbservern. Standardlösenordet är \"deluge\", men du " +"bör logga in och ändra det omedelbart efter att du aktiverat tjänsten." #: plinth/modules/deluge/templates/deluge.html:44 msgid "deluge-web is running" -msgstr "" +msgstr "Deluges webbgränssnitt är aktiverat" #: plinth/modules/deluge/templates/deluge.html:47 msgid "deluge-web is not running" -msgstr "" +msgstr "Deluges webbgränssnitt är inaktiverat" #: plinth/modules/diagnostics/diagnostics.py:45 msgid "Diagnostics" -msgstr "" +msgstr "Diagnostik" #: plinth/modules/diagnostics/diagnostics.py:55 msgid "System Diagnostics" -msgstr "" +msgstr "Systemdiagnostik" #: plinth/modules/diagnostics/diagnostics.py:78 msgid "Diagnostic Test" -msgstr "" +msgstr "Diagnostiktest" #: plinth/modules/diagnostics/templates/diagnostics.html:37 msgid "" "The system diagnostic test will run a number of checks on your system to " "confirm that applications and services are working as expected." msgstr "" +"Systemets diagnostiktest utför ett antal kontroller av ditt system för att " +"bekräfta att program och tjänster fungerar som de ska." #: plinth/modules/diagnostics/templates/diagnostics.html:50 #: plinth/modules/diagnostics/templates/diagnostics_button.html:27 msgid "Run Diagnostics" -msgstr "" +msgstr "Utför diagnostik" #: plinth/modules/diagnostics/templates/diagnostics.html:53 msgid "Diagnotics test is currently running" -msgstr "" +msgstr "Diagnotiktest körs för närvarande" #: plinth/modules/diagnostics/templates/diagnostics.html:66 msgid "Results" -msgstr "" +msgstr "Resultat" #: plinth/modules/diagnostics/templates/diagnostics.html:74 #, python-format msgid "Module: %(module)s" -msgstr "" +msgstr "Modul: %(module)s" #: plinth/modules/diagnostics/templates/diagnostics_module.html:25 msgid "Diagnostic Results" -msgstr "" +msgstr "Diagnostikresultat" #: plinth/modules/diagnostics/templates/diagnostics_module.html:27 #, python-format msgid "Module: %(module_name)s" -msgstr "" +msgstr "Modul: %(module_name)s" #: plinth/modules/diagnostics/templates/diagnostics_module.html:32 msgid "This module does not support diagnostics" -msgstr "" +msgstr "Denna modul har inte stöd för diagnostik" #: plinth/modules/diagnostics/templates/diagnostics_results.html:27 msgid "Test" -msgstr "" +msgstr "Test" #: plinth/modules/diagnostics/templates/diagnostics_results.html:28 msgid "Result" -msgstr "" +msgstr "Resultat" #: plinth/modules/dynamicdns/dynamicdns.py:34 plinth/modules/help/help.py:40 msgid "About" -msgstr "" +msgstr "Om" #: plinth/modules/dynamicdns/dynamicdns.py:44 #: plinth/modules/dynamicdns/dynamicdns.py:53 msgid "Dynamic DNS" -msgstr "" +msgstr "Dynamisk DNS (DomänNamnsServer)" #: plinth/modules/dynamicdns/dynamicdns.py:70 msgid "" @@ -427,6 +460,9 @@ msgid "" "used within the URL. For details see the update URL templates of the example " "providers." msgstr "" +"Variablerna <User>, <Pass>, <Ip>, <Domain> kan " +"användas i webbadressen. Se mallar från de olika tjänsteleverantörerna för " +"information om uppdateringsadress." #: plinth/modules/dynamicdns/dynamicdns.py:74 msgid "" @@ -434,31 +470,41 @@ msgid "" "provider does not support the GnudIP protocol or your provider is not listed " "you may use the update URL of your provider." msgstr "" +"Välj ett uppdateringsprotokoll enligt din leverantör. Om din leverantör inte " +"stöder protokollet GnudIP, eller din leverantör saknas i listan, använd din " +"leverantörs uppdateringsadress." #: plinth/modules/dynamicdns/dynamicdns.py:79 msgid "" "Please do not enter a URL here (like \"https://example.com/\") but only the " "hostname of the GnuDIP server (like \"example.pcom\")." msgstr "" +"Skriv inte en full webadress här (tex: \"https://exempel.com/\"), utan " +"endast värdnamnet för GnuDIP servern (tex: \"exempel.com\")." #: plinth/modules/dynamicdns/dynamicdns.py:83 msgid "The public domain name you want use to reach your box." msgstr "" +"Publikt domännamn du önskar använda för att ansluta till din FreedomBox." #: plinth/modules/dynamicdns/dynamicdns.py:85 msgid "Use this option if your provider uses self signed certificates." msgstr "" +"Använd denna funktion om din tjänsteleverantör använder självsignerade " +"certifikat." #: plinth/modules/dynamicdns/dynamicdns.py:88 msgid "" "If this option is selected, your username and password will be used for HTTP " "basic authentication." msgstr "" +"Om detta alternativ är markerat, kommer ditt användarnamn och lösenord " +"användas för grundläggande HTTP autentisering." #: plinth/modules/dynamicdns/dynamicdns.py:91 msgid "" "Leave this field empty if you want to keep your previous configured password." -msgstr "" +msgstr "Lämna fältet tomt om du vill behålla tidigare konfigurerat lösenord." #: plinth/modules/dynamicdns/dynamicdns.py:94 msgid "" @@ -467,86 +513,90 @@ msgid "" "Internet IP. The URL should simply return the IP wherethe client comes from. " "Example: http://myip.datasystems24.de" msgstr "" +"Tillval. Om din FreedomBox inte är direkt ansluten till Internet (dvs " +"anslutna via en NAT-router) används denna webbadress för att hitta korrekt " +"IP. Webbadressen ska helt enkelt returnera det IP som klienten kommer från. " +"(exempel: http://myip.datasystems24.de)" #: plinth/modules/dynamicdns/dynamicdns.py:101 msgid "" "You should have been requested to select a username when you created the " "account." -msgstr "" +msgstr "Du bör har uppmanats att välja ett användarnamn när du skapade kontot." #: plinth/modules/dynamicdns/dynamicdns.py:112 msgid "Enable Dynamic DNS" -msgstr "" +msgstr "Aktivera Dynamisk DNS" #: plinth/modules/dynamicdns/dynamicdns.py:115 msgid "Service type" -msgstr "" +msgstr "Typ av tjänst" #: plinth/modules/dynamicdns/dynamicdns.py:120 msgid "GnudIP Server Address" -msgstr "" +msgstr "GnudIP Serveradress" #: plinth/modules/dynamicdns/dynamicdns.py:125 msgid "Invalid server name" -msgstr "" +msgstr "Du har angett ett ogiltigt servernamn" #: plinth/modules/dynamicdns/dynamicdns.py:128 msgid "Update URL" -msgstr "" +msgstr "Adress för uppdateringar" #: plinth/modules/dynamicdns/dynamicdns.py:132 msgid "accept all SSL certificates" -msgstr "" +msgstr "Acceptera alla SSL-certifikat" #: plinth/modules/dynamicdns/dynamicdns.py:136 msgid "use HTTP basic authentication" -msgstr "" +msgstr "Avänd grundläggande HTTP-autentisering" #: plinth/modules/dynamicdns/dynamicdns.py:148 #: plinth/modules/networks/forms.py:146 plinth/modules/transmission/forms.py:39 msgid "Username" -msgstr "" +msgstr "Användarnamn" #: plinth/modules/dynamicdns/dynamicdns.py:151 #: plinth/modules/networks/forms.py:147 plinth/modules/transmission/forms.py:43 msgid "Password" -msgstr "" +msgstr "Lösenord" #: plinth/modules/dynamicdns/dynamicdns.py:154 msgid "show password" -msgstr "" +msgstr "Visa lösenord" #: plinth/modules/dynamicdns/dynamicdns.py:158 msgid "IP check URL" -msgstr "" +msgstr "Webbadress för att kontrollera IP" #: plinth/modules/dynamicdns/dynamicdns.py:184 msgid "Please provide update URL or a GnuDIP Server" -msgstr "" +msgstr "Ange uppdateringsadress eller GnuDIP-server" #: plinth/modules/dynamicdns/dynamicdns.py:187 msgid "Please provide GnuDIP username" -msgstr "" +msgstr "Ange användarnamn för GnuDIP" #: plinth/modules/dynamicdns/dynamicdns.py:190 msgid "Please provide GnuDIP domain" -msgstr "" +msgstr "Ange GnuDIP-domän" #: plinth/modules/dynamicdns/dynamicdns.py:195 msgid "Please provide a password" -msgstr "" +msgstr "Ange ett lösenord" #: plinth/modules/dynamicdns/dynamicdns.py:214 msgid "Configure Dynamic DNS" -msgstr "" +msgstr "Konfigurera Dynamisk DNS" #: plinth/modules/dynamicdns/dynamicdns.py:236 msgid "Status of Dynamic DNS" -msgstr "" +msgstr "Status för Dynamisk DNS" #: plinth/modules/dynamicdns/templates/dynamicdns.html:25 msgid "DynamicDNS client" -msgstr "" +msgstr "Klient för Dynamisk DNS" #: plinth/modules/dynamicdns/templates/dynamicdns.html:28 msgid "" @@ -554,6 +604,9 @@ msgid "" "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)." msgstr "" +"Om din Internetleverantör periodiskt ändrar din IP-adress (dvs varje 24h) " +"kan det vara svårt för andra att hitta dig på nätet. Då kan ingen hitta de " +"tjänster som tillhandahålls av FreedomBox (tex. din ownCloud)." #: plinth/modules/dynamicdns/templates/dynamicdns.html:37 msgid "" @@ -564,6 +617,12 @@ msgid "" "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." msgstr "" +"Lösningen är att tilldela DNS-namn till din IP-adress och uppdatera DNS-namn " +"varje gång din IP ändras av din Internetleverantör. Dynamisk DNS kopplar din " +"nuvarande offentliga IP-adressen till en gnudip server. " +"Därefter tilldelar servern ditt DNS-namn med din nya IP, och om någon från " +"Internet ber om din DNS-namn, kommer han bli skickad till din aktuella IP." #: plinth/modules/dynamicdns/templates/dynamicdns.html:50 msgid "" @@ -573,6 +632,11 @@ msgid "" "based services on " "freedns.afraid.org." msgstr "" +"Om du önskar ett gratis konto för dynamiskt DNS, kan du hitta en gratis " +"GnuDIP-tjänst på " +"gnudip.datasystems24.net eller så kan du hitta tjänster baserade på " +"gratis uppdateringsadress från freedns.afraid.org." #: plinth/modules/dynamicdns/templates/dynamicdns.html:61 msgid "" @@ -580,6 +644,8 @@ msgid "" "portforwarding (i.e. forward some standard ports like 80 and 443) to your " "freedombox device." msgstr "" +"Om din FreedomBox är ansluten bakom en NAT-router, glöm inte att lägga till " +"port forwarding (dvs vidarebefordra några standardportar, såsom 80 och 443)." #: plinth/modules/dynamicdns/templates/dynamicdns_configure.html:30 msgid "" From 13f8407b810d6ea628df6ff31f37e9db0242a90d Mon Sep 17 00:00:00 2001 From: Caly Date: Sat, 16 Jan 2016 02:37:35 +0100 Subject: [PATCH 012/189] Translated using Weblate (Telugu) Currently translated at 42.0% (226 of 537 strings) --- plinth/locale/te/LC_MESSAGES/django.po | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/plinth/locale/te/LC_MESSAGES/django.po b/plinth/locale/te/LC_MESSAGES/django.po index edfb98e9f..6ea3643b1 100644 --- a/plinth/locale/te/LC_MESSAGES/django.po +++ b/plinth/locale/te/LC_MESSAGES/django.po @@ -10,10 +10,10 @@ msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-12-20 13:58+0530\n" -"PO-Revision-Date: 2015-12-07 20:20+0000\n" -"Last-Translator: ikmaak \n" -"Language-Team: Telugu \n" +"PO-Revision-Date: 2016-01-16 02:37+0000\n" +"Last-Translator: Caly \n" +"Language-Team: Telugu " +"\n" "Language: te\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -602,7 +602,7 @@ msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:35 msgid "Direct connection to the internet." -msgstr "అంతర్జాలిక కు నేరుగా బంధం" +msgstr "అంతర్జాలిక కు నేరుగా బంధం." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:37 #, python-format @@ -633,7 +633,7 @@ msgstr "" #: plinth/modules/firewall/templates/firewall.html:36 msgid "The following is the current status:" -msgstr "ఇది ప్రస్తుత స్థితి" +msgstr "ఇది ప్రస్తుత స్థితి:" #: plinth/modules/firewall/templates/firewall.html:41 #, python-format @@ -968,7 +968,7 @@ msgstr "బ్లాగ్ సృష్టించలేము: {error}" #: plinth/modules/ikiwiki/views.py:174 #, python-brace-format msgid "{name} deleted." -msgstr "తొలగించు {name}" +msgstr "తొలగించు {name}." #: plinth/modules/ikiwiki/views.py:176 #, python-brace-format @@ -1259,7 +1259,7 @@ msgstr "అనుసంధానం తొలగించడం విఫలమ #: plinth/modules/networks/networks.py:430 #: plinth/modules/networks/templates/connections_delete.html:26 msgid "Delete Connection" -msgstr "అనుసంధానం తొలగించారు." +msgstr "అనుసంధానం తొలగించారు" #: plinth/modules/networks/templates/connection_show.html:43 msgid "Edit connection" @@ -1436,11 +1436,11 @@ msgstr "" #: plinth/modules/networks/templates/connections_add.html:34 #: plinth/modules/networks/templates/connections_type_select.html:34 msgid "Create..." -msgstr "సృష్టించు" +msgstr "సృష్టించు..." #: plinth/modules/networks/templates/connections_create.html:34 msgid "Create Connection" -msgstr "అనుసంధానం సృష్టించు." +msgstr "అనుసంధానం సృష్టించు" #: plinth/modules/networks/templates/connections_delete.html:29 #, fuzzy, python-format @@ -1587,11 +1587,11 @@ msgstr "అమర్చిపెటినా తెరిచినVPN నడం #: plinth/modules/openvpn/views.py:124 msgid "Setup completed." -msgstr "అమరక పూర్తయ్యింది" +msgstr "అమరక పూర్తయ్యింది." #: plinth/modules/openvpn/views.py:126 msgid "Setup failed." -msgstr "అమరక విఫలమైంది" +msgstr "అమరక విఫలమైంది." #: plinth/modules/owncloud/owncloud.py:38 msgid "Enable ownCloud" From b548881232cd25a2d80a8bc88bf9810af7dbdf2f Mon Sep 17 00:00:00 2001 From: Caly Date: Fri, 15 Jan 2016 21:21:42 +0100 Subject: [PATCH 013/189] Translated using Weblate (Turkish) Currently translated at 100.0% (552 of 552 strings) --- plinth/locale/tr/LC_MESSAGES/django.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plinth/locale/tr/LC_MESSAGES/django.po b/plinth/locale/tr/LC_MESSAGES/django.po index e8c31bd57..983591431 100644 --- a/plinth/locale/tr/LC_MESSAGES/django.po +++ b/plinth/locale/tr/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-01-08 15:55+0100\n" -"PO-Revision-Date: 2016-01-08 19:04+0000\n" -"Last-Translator: ultrapeer \n" +"PO-Revision-Date: 2016-01-15 21:21+0000\n" +"Last-Translator: Caly \n" "Language-Team: Turkish " "\n" "Language: tr\n" @@ -483,7 +483,7 @@ msgid "" "hostname of the GnuDIP server (like \"example.pcom\")." msgstr "" "Buraya lütfen \"https://example.com/\" gibi bir URL girmeyin, sadece GnuDIP " -"sunucusunun makine ismini girin (\"example.pcom\" gibi)." +"sunucusunun makine ismini girin (\"example.com\" gibi)." #: plinth/modules/dynamicdns/dynamicdns.py:83 msgid "The public domain name you want use to reach your box." From f800cd8c715e3f1d47fd19ff8d37c85d9d8eea37 Mon Sep 17 00:00:00 2001 From: cat-git Date: Sun, 17 Jan 2016 13:49:07 +0000 Subject: [PATCH 014/189] get a page up in preparation to display snapper things --- actions/snapper | 60 +++++++++++ data/etc/plinth/modules-enabled/snapper | 1 + plinth/modules/snapper/__init__.py | 76 ++++++++++++++ plinth/modules/snapper/forms.py | 32 ++++++ plinth/modules/snapper/templates/snapper.html | 58 +++++++++++ plinth/modules/snapper/tests/__init__.py | 0 plinth/modules/snapper/urls.py | 28 ++++++ plinth/modules/snapper/views.py | 99 +++++++++++++++++++ 8 files changed, 354 insertions(+) create mode 100644 actions/snapper create mode 100644 data/etc/plinth/modules-enabled/snapper create mode 100644 plinth/modules/snapper/__init__.py create mode 100644 plinth/modules/snapper/forms.py create mode 100644 plinth/modules/snapper/templates/snapper.html create mode 100644 plinth/modules/snapper/tests/__init__.py create mode 100644 plinth/modules/snapper/urls.py create mode 100644 plinth/modules/snapper/views.py diff --git a/actions/snapper b/actions/snapper new file mode 100644 index 000000000..c3bd44d7a --- /dev/null +++ b/actions/snapper @@ -0,0 +1,60 @@ +#!/usr/bin/python3 +# -*- mode: python -*- +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Configuration helper for Snapper. +""" + +import argparse + +from plinth import action_utils + + +def parse_arguments(): + """Return parsed command line arguments as dictionary.""" + parser = argparse.ArgumentParser() + subparsers = parser.add_subparsers(dest='subcommand', help='Sub command') + + subparsers.add_parser('enable', help='Enable Snapper') + subparsers.add_parser('disable', help='Disable Snapper') + + return parser.parse_args() + + +def subcommand_enable(_): + """Start service.""" + action_utils.service_enable('snapper') + + +def subcommand_disable(_): + """Stop service.""" + action_utils.service_disable('snapper') + + +def main(): + """Parse arguments and perform all duties.""" + arguments = parse_arguments() + + subcommand = arguments.subcommand.replace('-', '_') + subcommand_method = globals()['subcommand_' + subcommand] + subcommand_method(arguments) + + +if __name__ == '__main__': + main() diff --git a/data/etc/plinth/modules-enabled/snapper b/data/etc/plinth/modules-enabled/snapper new file mode 100644 index 000000000..77371c54b --- /dev/null +++ b/data/etc/plinth/modules-enabled/snapper @@ -0,0 +1 @@ +plinth.modules.snapper diff --git a/plinth/modules/snapper/__init__.py b/plinth/modules/snapper/__init__.py new file mode 100644 index 000000000..fe06a9103 --- /dev/null +++ b/plinth/modules/snapper/__init__.py @@ -0,0 +1,76 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Plinth module to configure snapper backups +""" + +from django.utils.translation import ugettext_lazy as _ +import subprocess + +from plinth import actions +from plinth import action_utils +from plinth import cfg +from plinth import service as service_module + + +depends = ['plinth.modules.system'] + +service = None + + +def init(): + """Intialize the Snapper module.""" + menu = cfg.main_menu.get('system:index') + menu.add_urlname(_('Backup Freedombox'), 'glyphicon-save', + 'snapper:index', 1000) + + global service + service = service_module.Service( + 'snapper', _('Freedombox Backups'), + is_external=False, enabled=is_enabled()) + + +def is_enabled(): + """Return whether the module is enabled.""" + return action_utils.service_is_enabled('snapper') + + +def is_running(): + """Return whether the service is running.""" + return action_utils.service_is_running('snapper') + + +#def diagnose(): +# """Run diagnostics and return the results.""" +# results = [] +# results.append(_diagnose_ntp_server_count()) +# +# return results +# +# +#def _diagnose_ntp_server_count(): +# """Diagnose minimum NTP server count.""" +# result = 'failed' +# try: +# output = subprocess.check_output(['ntpq', '-n', '-c', 'lpeers']) +# if len(output.decode().splitlines()[2:]): +# result = 'passed' +# except subprocess.CalledProcessError: +# pass +# +# return [_('NTP client in contact with servers'), result] diff --git a/plinth/modules/snapper/forms.py b/plinth/modules/snapper/forms.py new file mode 100644 index 000000000..f0d17d5d5 --- /dev/null +++ b/plinth/modules/snapper/forms.py @@ -0,0 +1,32 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Forms for configuring snapper backups +""" + +from django import forms +from django.utils.translation import ugettext_lazy as _ +import glob +import re + + +class SnapperForm(forms.Form): + """Snapper configuration form.""" + enabled = forms.BooleanField( + label=_('Enable Snapper Backups'), + required=False) diff --git a/plinth/modules/snapper/templates/snapper.html b/plinth/modules/snapper/templates/snapper.html new file mode 100644 index 000000000..7e52a687a --- /dev/null +++ b/plinth/modules/snapper/templates/snapper.html @@ -0,0 +1,58 @@ +{% extends "base.html" %} +{% comment %} +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +{% endcomment %} + +{% load bootstrap %} +{% load i18n %} + +{% block content %} + +

{% trans "Snapper" %}

+ +

+ {% blocktrans trimmed %} + Something about snapper + {% endblocktrans %} +

+ +

{% trans "Status" %}

+ +

+ {% if status.is_running %} + + {% trans "Snapper is running" %} + {% else %} + + {% trans "Snapper is not running" %} + {% endif %} +

+ {% include "diagnostics_button.html" with module="datetime" %} + +

{% trans "Configuration" %}

+ +
+ {% csrf_token %} + + {{ form|bootstrap }} + + +
+ +{% endblock %} diff --git a/plinth/modules/snapper/tests/__init__.py b/plinth/modules/snapper/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/plinth/modules/snapper/urls.py b/plinth/modules/snapper/urls.py new file mode 100644 index 000000000..07bc27847 --- /dev/null +++ b/plinth/modules/snapper/urls.py @@ -0,0 +1,28 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +URLs for the snapper module +""" + +from django.conf.urls import url + +from . import views + +urlpatterns = [ + url(r'^sys/snapper/$', views.index, name='index'), +] diff --git a/plinth/modules/snapper/views.py b/plinth/modules/snapper/views.py new file mode 100644 index 000000000..d30af23e1 --- /dev/null +++ b/plinth/modules/snapper/views.py @@ -0,0 +1,99 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Plinth module for configuring date and time +""" + +from django.contrib import messages +from django.template.response import TemplateResponse +from django.utils.translation import ugettext as _ +import logging + +from .forms import SnapperForm +from plinth import actions +from plinth import package +from plinth.modules import snapper + +logger = logging.getLogger(__name__) + + +def on_install(): + """Notify that the service is now enabled.""" + snapper.service.notify_enabled(None, True) + + +@package.required(['snapper'], on_install=on_install) +def index(request): + """Serve configuration page.""" + status = get_status() + + form = None + + if request.method == 'POST': + form = SnapperForm(request.POST, prefix='snapper') + # pylint: disable=E1101 + if form.is_valid(): + _apply_changes(request, status, form.cleaned_data) + status = get_status() + form = SnapperForm(initial=status, prefix='snapper') + else: + form = SnapperForm(initial=status, prefix='snapper') + + return TemplateResponse(request, 'snapper.html', + {'title': _('Backup Freedombox'), + 'status': status, + 'form': form}) + + +def get_status(): + """Get the current settings from server.""" + return {'enabled': snapper.is_enabled(), + 'is_running': snapper.is_running(), + 'time_zone': get_current_time_zone()} + + +def get_current_time_zone(): + """Get current time zone.""" + time_zone = open('/etc/timezone').read().rstrip() + return time_zone or 'none' + + +def _apply_changes(request, old_status, new_status): + """Apply the changes.""" + modified = False + + if old_status['enabled'] != new_status['enabled']: + sub_command = 'enable' if new_status['enabled'] else 'disable' + modified = True + actions.superuser_run('snapper', [sub_command]) + snapper.service.notify_enabled(None, new_status['enabled']) + messages.success(request, _('Configuration updated')) + + if old_status['time_zone'] != new_status['time_zone'] and \ + new_status['time_zone'] != 'none': + modified = True + try: + actions.superuser_run('timezone-change', [new_status['time_zone']]) + except Exception as exception: + messages.error(request, _('Error setting time zone: {exception}') + .format(exception=exception)) + else: + messages.success(request, _('Time zone set')) + + if not modified: + messages.info(request, _('Setting unchanged')) From a0d7b4c8dd77683d690ff2a092e40b091938af5b Mon Sep 17 00:00:00 2001 From: cat-git Date: Sun, 17 Jan 2016 17:35:20 +0000 Subject: [PATCH 015/189] some backups listed on a page, with much spurious code --- actions/snapper | 4 ++++ plinth/action_utils.py | 13 +++++++++++++ plinth/modules/snapper/templates/snapper.html | 12 +++++++++++- plinth/modules/snapper/views.py | 17 +++++++++++++++-- 4 files changed, 43 insertions(+), 3 deletions(-) diff --git a/actions/snapper b/actions/snapper index c3bd44d7a..65dfcb754 100644 --- a/actions/snapper +++ b/actions/snapper @@ -46,6 +46,10 @@ def subcommand_disable(_): """Stop service.""" action_utils.service_disable('snapper') +def subcommand_ls(_): + """List Snapshots.""" + action_utils.get_snapshot_ls() + def main(): """Parse arguments and perform all duties.""" diff --git a/plinth/action_utils.py b/plinth/action_utils.py index c102311a5..eb0cea6c8 100644 --- a/plinth/action_utils.py +++ b/plinth/action_utils.py @@ -351,6 +351,19 @@ def get_ip_addresses(): return addresses +def get_snapper_ls(): + """Return a list of snapshots made by snapper.""" + snapshots = [] + + output = subprocess.check_output(['snapper', '-q', '--iso', 'ls', '-t', 'single']) + for line in output.decode().splitlines(): + parts = line.split('|') + if not parts[0].startswith('-') and not parts[0].startswith('#'): + snapshots.append({'number': parts[0], 'date': parts[1]}) + + return snapshots + + def get_hostname(): """Return the current hostname.""" diff --git a/plinth/modules/snapper/templates/snapper.html b/plinth/modules/snapper/templates/snapper.html index 7e52a687a..cae7c46ee 100644 --- a/plinth/modules/snapper/templates/snapper.html +++ b/plinth/modules/snapper/templates/snapper.html @@ -42,7 +42,7 @@

{% trans "Status" %}

{% trans "Snapper is not running" %} {% endif %}

- {% include "diagnostics_button.html" with module="datetime" %} + {% include "diagnostics_button.html" with module="snapper" %}

{% trans "Configuration" %}

@@ -55,4 +55,14 @@

{% trans "Configuration" %}

value="{% trans "Update setup" %}"/> +

{% trans "Backups" %}

+ +

+ Something about backups + {% for backup in backups %} +

{{ backup.number }}:{{ backup.date }}

+ {% endfor %} +

+ {% endblock %} diff --git a/plinth/modules/snapper/views.py b/plinth/modules/snapper/views.py index d30af23e1..828213ffa 100644 --- a/plinth/modules/snapper/views.py +++ b/plinth/modules/snapper/views.py @@ -23,6 +23,7 @@ from django.template.response import TemplateResponse from django.utils.translation import ugettext as _ import logging +import subprocess from .forms import SnapperForm from plinth import actions @@ -41,6 +42,7 @@ def on_install(): def index(request): """Serve configuration page.""" status = get_status() + backups = get_backups() form = None @@ -57,15 +59,26 @@ def index(request): return TemplateResponse(request, 'snapper.html', {'title': _('Backup Freedombox'), 'status': status, + 'backups': backups, 'form': form}) def get_status(): """Get the current settings from server.""" return {'enabled': snapper.is_enabled(), - 'is_running': snapper.is_running(), - 'time_zone': get_current_time_zone()} + 'is_running': snapper.is_running()} +def get_backups(): + """Get the list of backups from snapper.""" + snapshots = [] + + output = subprocess.check_output(['snapper', '-q', '--iso', 'ls', '-t', 'single']) + for line in output.decode().splitlines(): + parts = line.split('|') + if not parts[0].startswith('-') and not parts[0].startswith('#'): + snapshots.append({'number': parts[0], 'date': parts[1]}) + + return snapshots def get_current_time_zone(): """Get current time zone.""" From afb00f98ab1af578d7b2747acd9569739dd0b14a Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sun, 17 Jan 2016 13:43:05 +0530 Subject: [PATCH 016/189] upgrades: Make manual upgrade a background process - Closes #366 and closes #304 (all sub-tasks). - Start new process group with setsid() by sending start_new_session=True - Detach from parent process fds by closing all FDs and attaching stdin, stdou and stderr to /dev/null. - Don't wait for the process to complete. - This allows for upgrading Plinth while upgrades are trigged from Plinth itself. - Show log of upgrade exection instead of output and error log of the process which can no longer be collected. This has the advantage of showing automatic executions also. - Rewrite the mechanism to detect whether upgrades can be run. It is now based on whether the package manager is busy. This has the advantage of working properly if other apt processes are running, automatic upgrades are running, etc. - Busy status works even if Plinth is restarted while upgrades are in progress. - More descriptive messages showing that upgrades don't have to be triggered manually. - Warn that other packages can't be installed while upgrades are running, which may take a long time. - Warn the users of potential temporary unavailability of Plinth/Apache2. --- actions/upgrades | 6 +- .../modules/upgrades/templates/upgrades.html | 72 +++++++----------- plinth/modules/upgrades/urls.py | 1 - plinth/modules/upgrades/views.py | 74 ++++++++----------- 4 files changed, 64 insertions(+), 89 deletions(-) diff --git a/actions/upgrades b/actions/upgrades index 2d130660e..561edcc8c 100755 --- a/actions/upgrades +++ b/actions/upgrades @@ -61,7 +61,11 @@ def subcommand_run(_): sys.exit(1) try: - subprocess.check_call(['unattended-upgrades', '-v']) + subprocess.Popen( + ['unattended-upgrades', '-v'], + stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, close_fds=True, + start_new_session=True) except FileNotFoundError: print('Error: unattended-upgrades is not available.', file=sys.stderr) sys.exit(2) diff --git a/plinth/modules/upgrades/templates/upgrades.html b/plinth/modules/upgrades/templates/upgrades.html index 6bc6f0391..15b0167b2 100644 --- a/plinth/modules/upgrades/templates/upgrades.html +++ b/plinth/modules/upgrades/templates/upgrades.html @@ -22,7 +22,7 @@ {% block page_head %} - {% if running %} + {% if is_busy %} {% endif %} @@ -33,47 +33,25 @@

{{ title }}

- {% if result %} - - {% if result.return_code %} -

- {% trans "There was an error while upgrading." %} -

- -
{% trans "Output from unattended-upgrades:" %}
-
{{ result.error }}
- {% if result.output %} -
{{ result.output }}
- {% endif %} - {% else %} -

- {% trans "The operating system is up to date now.  " %} - -

- -
-
{% trans "Output from unattended-upgrades:" %}
-
{{ result.output }}
-
- {% endif %} - - {% endif %} - - - {% if not result and not running %} -

- {% 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 %} -

- -
+

+ {% blocktrans trimmed %} + Upgrades install the latest software and security updates. When automatic + upgrades are enabled, upgrades are automatically run every night. You + don't normally need to start the upgrade process. + {% endblocktrans %} +

+ +

+ {% blocktrans trimmed %} + Depending on the number of packages to install, this may take a long time + to complete. While upgrades are in progress, you will not be able to + install other packages. During the upgrade, this web interface may be + temporarily unavailable and show an error. Refresh the page to continue. + {% endblocktrans %} +

+ + {% if not is_busy %} + {% csrf_token %} {% trans "Output from unattended-upgrades:" %}
{% endif %} - {% if running %} + {% if is_busy %}

- {% trans "System is being upgraded." %} + {% trans "A package manager is running." %}

{% endif %} + {% if log %} +
{% trans "Recent log from upgrades:" %}
+ +
{{ log }}
+ {% endif %} + {% endblock %} {% block page_js %} diff --git a/plinth/modules/upgrades/urls.py b/plinth/modules/upgrades/urls.py index 5ff9f8788..9457c17dc 100644 --- a/plinth/modules/upgrades/urls.py +++ b/plinth/modules/upgrades/urls.py @@ -27,5 +27,4 @@ urlpatterns = [ url(r'^sys/upgrades/$', views.index, name='index'), url(r'^sys/upgrades/upgrade/$', views.upgrade, name='upgrade'), - url(r'^sys/upgrades/upgrade/run/$', views.run, name='run'), ] diff --git a/plinth/modules/upgrades/views.py b/plinth/modules/upgrades/views.py index 6e83faf8c..d08d6f291 100644 --- a/plinth/modules/upgrades/views.py +++ b/plinth/modules/upgrades/views.py @@ -25,6 +25,7 @@ from django.template.response import TemplateResponse from django.utils.translation import ugettext as _, ugettext_lazy from django.views.decorators.http import require_POST +import subprocess from .forms import ConfigureForm from plinth import actions @@ -36,7 +37,8 @@ {'url': reverse_lazy('upgrades:upgrade'), 'text': ugettext_lazy('Upgrade Packages')}] -upgrade_process = None +LOG_FILE = '/var/log/unattended-upgrades/unattended-upgrades.log' +LOCK_FILE = '/var/log/dpkg/lock' def on_install(): @@ -65,29 +67,42 @@ def index(request): 'form': form, 'subsubmenu': subsubmenu}) +def is_package_manager_busy(): + """Return whether a package manager is running.""" + try: + subprocess.check_output(['lsof', '/var/lib/dpkg/lock']) + return True + except subprocess.CalledProcessError: + return False + + +def get_log(): + """Return the current log for unattended upgrades.""" + try: + with open(LOG_FILE, 'r') as file_handle: + return file_handle.read() + except IOError: + return None + @package.required(['unattended-upgrades'], on_install=on_install) def upgrade(request): """Serve the upgrade page.""" - result = _collect_upgrade_result(request) + is_busy = is_package_manager_busy() + + if request.method == 'POST': + try: + actions.superuser_run('upgrades', ['run']) + messages.success(request, _('Upgrade process started.')) + is_busy = True + except ActionError: + messages.error(request, _('Starting upgrade failed.')) return TemplateResponse(request, 'upgrades.html', {'title': _('Package Upgrades'), 'subsubmenu': subsubmenu, - 'running': bool(upgrade_process), - 'result': result}) - - -@require_POST -@package.required(['unattended-upgrades'], on_install=on_install) -def run(_): - """Start the upgrade process.""" - global upgrade_process - if not upgrade_process: - upgrade_process = actions.superuser_run( - 'upgrades', ['run'], async=True) - - return redirect('upgrades:upgrade') + 'is_busy': is_busy, + 'log': get_log()}) def get_status(): @@ -121,30 +136,3 @@ def _apply_changes(request, old_status, new_status): messages.success(request, _('Automatic upgrades enabled')) else: messages.success(request, _('Automatic upgrades disabled')) - - -def _collect_upgrade_result(request): - """Handle upgrade process completion.""" - global upgrade_process - if not upgrade_process: - return - - return_code = upgrade_process.poll() - - # Upgrade process is not complete yet - if return_code is None: - return - - output, error = upgrade_process.communicate() - output, error = output.decode(), error.decode() - - if not return_code: - messages.success(request, _('Upgrade completed.')) - else: - messages.error(request, _('Upgrade failed.')) - - upgrade_process = None - - return {'return_code': return_code, - 'output': output, - 'error': error} From cda3863d1bdfde3772ef8375c754b65f34815f0f Mon Sep 17 00:00:00 2001 From: Caly Date: Wed, 20 Jan 2016 01:22:03 +0100 Subject: [PATCH 017/189] Translated using Weblate (Swedish) Currently translated at 40.0% (225 of 562 strings) --- plinth/locale/sv/LC_MESSAGES/django.po | 280 ++++++++++++++++--------- 1 file changed, 183 insertions(+), 97 deletions(-) diff --git a/plinth/locale/sv/LC_MESSAGES/django.po b/plinth/locale/sv/LC_MESSAGES/django.po index 138583293..48f17f29e 100644 --- a/plinth/locale/sv/LC_MESSAGES/django.po +++ b/plinth/locale/sv/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-01-15 19:42+0530\n" -"PO-Revision-Date: 2016-01-16 01:59+0000\n" +"PO-Revision-Date: 2016-01-20 01:22+0000\n" "Last-Translator: Caly \n" "Language-Team: Swedish " "\n" @@ -652,20 +652,25 @@ msgid "" "You have disabled Javascript. Dynamic form mode is disabled and some helper " "functions may not work (but the main functionality should work)." msgstr "" +"Du har inaktiverat Javascript. Funktionen dynamiskt formulär är inaktiverat " +"och vissa hjälpfunktioner fungerar inte (men alla huvudfunktioner bör " +"fungera)." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:25 msgid "NAT type" -msgstr "" +msgstr "NAT-typ" #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:29 msgid "" "NAT type not detected yet, if you do not provide a \"IP check URL\" we will " "not detect a NAT type." msgstr "" +"NAT-typ ännu inte upptäckt. Om du inte anger en \"IP-kontroll adress\" " +"kommer vi inte att upptäcka en NAT-typ." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:35 msgid "Direct connection to the internet." -msgstr "" +msgstr "Direktanslutning till Internet." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:37 #, python-format @@ -675,16 +680,20 @@ msgid "" "will not detect IP changes). It may take up to %(timer)s minutes until we " "update your DNS entry in case of WAN IP change." msgstr "" +"Bakom NAT. Detta innebär att tjänsten dynamisk DNS kommer att fråga \"IP-" +"kontrolladress\" för ändringar (vi behöver därför \"IP-kontrolladress\" - " +"annars kommer vi inte att upptäcka ändringar av IP). Det kan ta upp till " +"%(timer)s minuter tills vi uppdaterar din DNS-inställning om WAN IP ändrats." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:48 msgid "Last update" -msgstr "" +msgstr "Senaste uppdatering" #: plinth/modules/firewall/firewall.py:39 #: plinth/modules/firewall/firewall.py:49 #: plinth/modules/firewall/firewall.py:57 msgid "Firewall" -msgstr "" +msgstr "Brandvägg" #: plinth/modules/firewall/templates/firewall.html:28 #, python-format @@ -693,10 +702,13 @@ msgid "" "outgoing network traffic on your %(box_name)s. Keeping a firewall enabled " "and properly configured reduces risk of security threat from the Internet." msgstr "" +"Brandväggen är ett säkerhetssystem som styr den inkommande och utgående " +"nätverkstrafiken på din %(box_name)s. Att ha en brandvägg aktiverad och " +"korrekt konfigurerad minskar risken för säkerhetshot från Internet." #: plinth/modules/firewall/templates/firewall.html:36 msgid "The following is the current status:" -msgstr "" +msgstr "Aktuell status:" #: plinth/modules/firewall/templates/firewall.html:41 #, python-format @@ -706,38 +718,42 @@ msgid "" "you may run it using the command 'service firewalld start' or in case of a " "system with systemd 'systemctl start firewalld'." msgstr "" +"Brandväggsdemonen körs inte. Vänligen starta den. Brandväggen är aktiverad " +"som standard på %(box_name)s. På ett Debian-baserade system (till exempel " +"%(box_name)s) Du kan starta den med kommandot \"service firewalld start\", " +"alternativt, vid ett system med systemd \"systemctl start firewalld\"." #: plinth/modules/firewall/templates/firewall.html:56 msgid "Service/Port" -msgstr "" +msgstr "Service/Port" #: plinth/modules/firewall/templates/firewall.html:67 #: plinth/modules/letsencrypt/templates/letsencrypt.html:91 #: plinth/modules/names/templates/names.html:51 msgid "Enabled" -msgstr "" +msgstr "Aktiverad" #: plinth/modules/firewall/templates/firewall.html:70 #: plinth/modules/letsencrypt/templates/letsencrypt.html:93 #: plinth/modules/names/templates/names.html:53 msgid "Disabled" -msgstr "" +msgstr "Inaktiverad" #: plinth/modules/firewall/templates/firewall.html:81 msgid "Permitted" -msgstr "" +msgstr "Tillåtna" #: plinth/modules/firewall/templates/firewall.html:84 msgid "Permitted (internal only)" -msgstr "" +msgstr "Tillåtna (endast interna)" #: plinth/modules/firewall/templates/firewall.html:87 msgid "Permitted (external only)" -msgstr "" +msgstr "Tillåtna (endast externa)" #: plinth/modules/firewall/templates/firewall.html:90 msgid "Blocked" -msgstr "" +msgstr "Blockerade" #: plinth/modules/firewall/templates/firewall.html:103 msgid "" @@ -745,28 +761,31 @@ msgid "" "automatically permitted in the firewall and you disable a service is " "automatically disabled in the firewall." msgstr "" +"Brandväggen är automatisk. När du aktiverar en tjänst tillåts den " +"automatiskt i brandväggen och om du inaktiverar en tjänst, så inaktiveras " +"den även automatiskt i brandväggen." #: plinth/modules/first_boot/forms.py:48 plinth/modules/users/forms.py:70 msgid "Creating LDAP user failed." -msgstr "" +msgstr "Det gick inte att skapa LDAP-användare." #: plinth/modules/first_boot/forms.py:56 msgid "Failed to add new user to admin group." -msgstr "" +msgstr "Det gick inte att lägga till ny användare till administrationsgruppen." #: plinth/modules/first_boot/forms.py:78 msgid "User account created, you are now logged in" -msgstr "" +msgstr "Användarkonto skapat, du är nu inloggad" #: plinth/modules/first_boot/templates/firstboot_navbar.html:23 #: plinth/modules/help/templates/help_index.html:25 #: plinth/templates/base.html:100 msgid "Help" -msgstr "" +msgstr "Hjälp" #: plinth/modules/first_boot/templates/firstboot_state0.html:45 msgid "Start Setup" -msgstr "" +msgstr "Starta installationsprogrammet" #: plinth/modules/first_boot/templates/firstboot_state0.html:49 #, python-format @@ -774,10 +793,12 @@ msgid "" "To complete the setup of your %(box_name)s, please provide some basic " "information." msgstr "" +"För att slutföra installationen av din %(box_name)s, ange grundläggande " +"information." #: plinth/modules/first_boot/templates/firstboot_state1.html:41 msgid "Administrator Account" -msgstr "" +msgstr "Administratörskonto" #: plinth/modules/first_boot/templates/firstboot_state1.html:44 msgid "" @@ -785,14 +806,17 @@ msgid "" "can be changed later. This user will be granted administrative privileges. " "Other users can be added later." msgstr "" +"Välja ett användarnamn och lösenord för att komma åt detta webbgränssnitt. " +"Lösenordet kan ändras senare. Denna användare kommer att beviljas " +"administrativa privilegier. Andra användare kan läggas till senare." #: plinth/modules/first_boot/templates/firstboot_state1.html:57 msgid "Box it up!" -msgstr "" +msgstr "Starta upp!" #: plinth/modules/first_boot/templates/firstboot_state10.html:29 msgid "Setup Complete!" -msgstr "" +msgstr "Installation klar!" #: plinth/modules/first_boot/templates/firstboot_state10.html:32 #, python-format @@ -801,49 +825,54 @@ msgid "" "you need some applications. Applications will be installed the first time " "you access them." msgstr "" +"%(box_name)s installationen är klar. För att göra din %(box_name)s " +"funktionell, behöver du några applikationer. De kommer att installeras " +"första gången du använder dem." #: plinth/modules/first_boot/templates/firstboot_state10.html:41 msgid "Go to Apps" -msgstr "" +msgstr "Gå till Applikationer" #: plinth/modules/first_boot/templates/firstboot_state10.html:44 msgid "Current Network Configuration" -msgstr "" +msgstr "Aktuell Nätverkskonfiguration" #: plinth/modules/first_boot/templates/firstboot_state10.html:47 msgid "" "You should check the network setup and modify it if necessary. Do not forget " "to change the default Wi-Fi passwords!" msgstr "" +"Du bör kontrollera nätverksinställningarna och ändra dom om det behövs. Glöm " +"inte att byta ut standardösenordet för WiFi!" #: plinth/modules/first_boot/templates/firstboot_state10.html:57 msgid "Go to Networks" -msgstr "" +msgstr "Gå till Nätverk" #: plinth/modules/first_boot/views.py:60 msgid "Setup Complete" -msgstr "" +msgstr "Installationen Klar" #: plinth/modules/help/help.py:34 msgid "Documentation" -msgstr "" +msgstr "Dokumentation" #: plinth/modules/help/help.py:36 msgid "Where to Get Help" -msgstr "" +msgstr "Vart Du Kan Få Hjälp" #: plinth/modules/help/help.py:38 plinth/modules/help/help.py:72 msgid "FreedomBox Manual" -msgstr "" +msgstr "FreedomBox Manual" #: plinth/modules/help/help.py:48 msgid "Documentation and FAQ" -msgstr "" +msgstr "Dokumentation och Vanliga Frågor" #: plinth/modules/help/help.py:55 #, python-brace-format msgid "About {box_name}" -msgstr "" +msgstr "Om {box_name}" #: plinth/modules/help/templates/help_about.html:30 msgid "" @@ -855,6 +884,13 @@ msgid "" "and a Tor relay on a device that can replace your Wi-Fi router so that your " "data stays with you." msgstr "" +"FreedomBox är ett kollaborativtprojekt för att utveckla, designa och främja " +"personliga servrar med fri programvara för privat och personlig " +"kommunikation. Det är en nätverksenhet gjord för att kommunicera med resten " +"av Internet under skyddad sekretess och hög datasäkerhet. Den har " +"applikationer såsom blogg, wiki, hemsida, sociala nätverk, e-post, webbproxy " +"och en Tor-server, på en enhet som kan ersätta din Wi-Fi-router, så att din " +"personliga data alltid stannar hos dig och under din kontroll." #: plinth/modules/help/templates/help_about.html:43 msgid "" @@ -865,32 +901,44 @@ msgid "" "giving back power to the users over their networks and machines, we are " "returning the Internet to its intended peer-to-peer architecture." msgstr "" +"Vi lever i en värld där vår användning av Internet förmedlas av aktörer som " +"ofta inte har våra bästa intressen i åtanke. Genom att skapa programvara som " +"inte förlitar sig på en central tjänst, kan vi få kontroll och integritet. " +"Genom att lagra vår data i våra hem, få vi användbart rättsligt skydd över " +"den. Genom att ge kontrollen över nätverk och apparater tillbaka till " +"användare, återställer vi Internet till sin avsedda icke-hierarkiska peer-to-" +"peer-arkitektur." #: plinth/modules/help/templates/help_about.html:56 msgid "" "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." msgstr "" +"Det finns ett flertal projekt avsedda att förverkliga en framtid av " +"distribuerade tjänster. FreedomBox avser att samla dem alla tillsammans i " +"ett enda praktiskt paket." #: plinth/modules/help/templates/help_about.html:64 msgid "" "For more information about the FreedomBox project, see the FreedomBox Wiki." msgstr "" +"Mer information om FreedomBox-projektet finns på FreedomBox wiki." #: plinth/modules/help/templates/help_about.html:72 msgid "Learn more »" -msgstr "" +msgstr "Läs mer »" #: plinth/modules/help/templates/help_about.html:75 #, python-format msgid "You are running Plinth version %(version)s." -msgstr "" +msgstr "Du använder Plinth version %(version)s." #: plinth/modules/help/templates/help_base.html:36 #, python-format msgid "%(box_name)s Setup" -msgstr "" +msgstr "%(box_name)s Installation" #: plinth/modules/help/templates/help_index.html:29 #, python-format @@ -898,12 +946,16 @@ msgid "" "The FreedomBox Manual is the best place to " "start for information regarding %(box_name)s." msgstr "" +"FreedomBox Manual är det bästa stället att " +"börja för information om %(box_name)s." #: plinth/modules/help/templates/help_index.html:36 msgid "" " FreedomBox " "project wiki contains further information." msgstr "" +" FreedomBox " +"project wiki innehåller ytterligare information." #: plinth/modules/help/templates/help_index.html:43 msgid "" @@ -912,6 +964,10 @@ msgid "" "mailing list. The list archives also contain information about problems " "faced by other users and possible solutions." msgstr "" +"För att få hjälp från FreedomBox användargrupp kan du ställa frågor på " +" mailing list. Arkiven innehåller även information om möjliga lösningar " +"på problem som andra användare haft." #: plinth/modules/help/templates/help_index.html:53 msgid "" @@ -920,143 +976,151 @@ msgid "" "net/?randomnick=1&channels=freedombox&prompt=1\"> #freedombox channel " "using the IRC web interface." msgstr "" +"Många utvecklare och användare av FreedomBox finns också tillgängliga på IRC-" +"nätverket irc.oftc.net. Gå med, ställ frågor och be om hjälp i " +"#freedombox kanal via webbchatten." #: plinth/modules/ikiwiki/__init__.py:38 msgid "Wiki & Blog (Ikiwiki)" -msgstr "" +msgstr "Wiki & Blogg (Ikiwiki)" #: plinth/modules/ikiwiki/__init__.py:43 msgid "Ikiwiki wikis and blogs" -msgstr "" +msgstr "Ikiwiki wikis och bloggar" #: plinth/modules/ikiwiki/forms.py:29 msgid "Enable Ikiwiki" -msgstr "" +msgstr "Aktivera Ikiwiki" #: plinth/modules/ikiwiki/forms.py:36 #: plinth/modules/networks/templates/connection_show.html:98 msgid "Type" -msgstr "" +msgstr "Typ" #: plinth/modules/ikiwiki/forms.py:39 #: plinth/modules/networks/templates/connection_show.html:78 msgid "Name" -msgstr "" +msgstr "Namn" #: plinth/modules/ikiwiki/forms.py:41 msgid "Admin Account Name" -msgstr "" +msgstr "Namn på administratörskontot" #: plinth/modules/ikiwiki/forms.py:44 msgid "Admin Account Password" -msgstr "" +msgstr "Lösenord för administratörskontot" #: plinth/modules/ikiwiki/templates/ikiwiki.html:27 msgid "" "When enabled, the blogs and wikis will be available from /ikiwiki." msgstr "" +"När aktiverade kommer bloggar och wikis att vara tillgänglig på /ikiwiki." #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:27 #, python-format msgid "Delete Wiki/Blog %(name)s" -msgstr "" +msgstr "Ta bort Wiki/Blogg %(name)s" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:33 msgid "" "This action will remove all the posts, pages and comments including revision " "history. Delete this wiki/blog permanently?" msgstr "" +"Den här åtgärden tar bort alla inlägg, sidor och kommentarer, även " +"versionshistorik. Ta bort denna wiki/blogg permanent?" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:43 #, python-format msgid "Delete %(name)s" -msgstr "" +msgstr "Ta bort %(name)s" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:46 #: plinth/modules/monkeysphere/templates/monkeysphere.html:60 #: plinth/modules/networks/templates/connections_delete.html:41 #: plinth/modules/users/templates/users_delete.html:41 msgid "Cancel" -msgstr "" +msgstr "Avbryt" #: plinth/modules/ikiwiki/templates/ikiwiki_manage.html:41 msgid "No wikis or blogs available." -msgstr "" +msgstr "Ingen wiki eller blogg tillgänglig." #: plinth/modules/ikiwiki/templates/ikiwiki_manage.html:45 msgid "Create a Wiki or Blog" -msgstr "" +msgstr "Skapa en wiki eller blogg" #: plinth/modules/ikiwiki/templates/ikiwiki_manage.html:55 #, python-format msgid "Delete site %(site)s" -msgstr "" +msgstr "Ta bort webbsida %(site)s" #: plinth/modules/ikiwiki/templates/ikiwiki_manage.html:61 #, python-format msgid "Go to site %(site)s" -msgstr "" +msgstr "Gå till webbsidan %(site)s" #: plinth/modules/ikiwiki/views.py:38 msgid "Manage" -msgstr "" +msgstr "Hantera" #: plinth/modules/ikiwiki/views.py:40 msgid "Create" -msgstr "" +msgstr "Skapa" #: plinth/modules/ikiwiki/views.py:73 msgid "Wiki & Blog" -msgstr "" +msgstr "Wiki och blogg" #: plinth/modules/ikiwiki/views.py:106 msgid "Manage Wikis and Blogs" -msgstr "" +msgstr "Hantera wikis och bloggar" #: plinth/modules/ikiwiki/views.py:132 msgid "Create Wiki/Blog" -msgstr "" +msgstr "Skapa wiki eller blogg" #: plinth/modules/ikiwiki/views.py:145 #, python-brace-format msgid "Created wiki {name}." -msgstr "" +msgstr "Skapade wiki {name}." #: plinth/modules/ikiwiki/views.py:147 #, python-brace-format msgid "Could not create wiki: {error}" -msgstr "" +msgstr "Kunde inte skapa wiki: {error}" #: plinth/modules/ikiwiki/views.py:159 #, python-brace-format msgid "Created blog {name}." -msgstr "" +msgstr "Blogg skapad {name}." #: plinth/modules/ikiwiki/views.py:161 #, python-brace-format msgid "Could not create blog: {error}" -msgstr "" +msgstr "Kunde inte skapa blogg: {error}" #: plinth/modules/ikiwiki/views.py:174 #, python-brace-format msgid "{name} deleted." -msgstr "" +msgstr "{name} borttagen." #: plinth/modules/ikiwiki/views.py:176 #, python-brace-format msgid "Could not delete {name}: {error}" -msgstr "" +msgstr "Kunde inte ta bort {name}: {error}" #: plinth/modules/ikiwiki/views.py:182 msgid "Delete Wiki/Blog" -msgstr "" +msgstr "Ta bort wiki eller blogg" #: plinth/modules/letsencrypt/__init__.py:43 #: plinth/modules/letsencrypt/templates/letsencrypt.html:38 #: plinth/modules/letsencrypt/views.py:45 msgid "Certificates (Let's Encrypt)" -msgstr "" +msgstr "Certifikat (Let's Encrypt)" #: plinth/modules/letsencrypt/templates/letsencrypt.html:41 #, python-format @@ -1067,6 +1131,11 @@ msgid "" "domain. It does so by proving itself to be the owner of a domain to Let's " "Encrypt, a certficate authority (CA)." msgstr "" +"Ett digitalt certifikat låter användare av en webbtjänst verifiera " +"identiteten på tjänsten och kommunicera säkert med den. %(box_name)s kan " +"automatiskt hämta och installera digitala certifikat för varje tillgänglig " +"domän. Detta sker genom att den bevisar sig vara ägare till en domän för " +"Let's Encrypt, en auktoriserad certifikatutfärdare ." #: plinth/modules/letsencrypt/templates/letsencrypt.html:52 msgid "" @@ -1075,71 +1144,75 @@ msgid "" "read and agree with the Let's Encrypt Subscriber Agreement before using this service." msgstr "" +"Let's Encrypt en är gratis, automatiserad och öppen certifikatutfärdare, " +"använd för allmänhetens nytta av Internet Security Research Group (ISRG). " +"Läs igenom och acceptera " +"Let's Encryp användaravtal innan du använder denna tjänst." #: plinth/modules/letsencrypt/templates/letsencrypt.html:66 #: plinth/modules/monkeysphere/templates/monkeysphere.html:70 msgid "Domain" -msgstr "" +msgstr "Domän" #: plinth/modules/letsencrypt/templates/letsencrypt.html:67 msgid "Certificate Status" -msgstr "" +msgstr "Certifikatets status" #: plinth/modules/letsencrypt/templates/letsencrypt.html:68 msgid "Website Security" -msgstr "" +msgstr "Säkerhet för webbsida" #: plinth/modules/letsencrypt/templates/letsencrypt.html:69 #: plinth/modules/monkeysphere/templates/monkeysphere.html:72 msgid "Actions" -msgstr "" +msgstr "Åtgärder" #: plinth/modules/letsencrypt/templates/letsencrypt.html:79 #, python-format msgid "Expires on %(expiry_date)s" -msgstr "" +msgstr "Giltig tills %(expiry_date)s" #: plinth/modules/letsencrypt/templates/letsencrypt.html:85 msgid "No certficate" -msgstr "" +msgstr "Inget certfikat" #: plinth/modules/letsencrypt/templates/letsencrypt.html:102 msgid "Revoke" -msgstr "" +msgstr "Återkalla" #: plinth/modules/letsencrypt/templates/letsencrypt.html:108 msgid "Re-obtain" -msgstr "" +msgstr "Återfå" #: plinth/modules/letsencrypt/templates/letsencrypt.html:115 msgid "Obtain" -msgstr "" +msgstr "Skaffa" #: plinth/modules/letsencrypt/views.py:55 #, python-brace-format msgid "Certificate successfully revoked for domain {domain}" -msgstr "" +msgstr "Certifikatet återkallat för domänen {domain}" #: plinth/modules/letsencrypt/views.py:60 #, python-brace-format msgid "Failed to revoke certificate for domain {domain}: {error}" -msgstr "" +msgstr "Det gick inte att återkalla certifikatet för domänen {domain}: {error}" #: plinth/modules/letsencrypt/views.py:72 #, python-brace-format msgid "Certificate successfully obtained for domain {domain}" -msgstr "" +msgstr "Certifikat erhållet för domänen {domain}" #: plinth/modules/letsencrypt/views.py:77 #, python-brace-format msgid "Failed to obtain certificate for domain {domain}: {error}" -msgstr "" +msgstr "Det gick inte att erhålla certifikat för domänen {domain}: {error}" #: plinth/modules/monkeysphere/__init__.py:32 #: plinth/modules/monkeysphere/templates/monkeysphere.html:35 #: plinth/modules/monkeysphere/views.py:44 msgid "Monkeysphere" -msgstr "" +msgstr "Monkeysphere" #: plinth/modules/monkeysphere/templates/monkeysphere.html:38 msgid "" @@ -1151,63 +1224,73 @@ msgid "" "key signing process. See the Monkeysphere SSH documentation for more details." msgstr "" +"Med Monkeysphere, kan en PGP-nyckel genereras för varje konfigurerad domän " +"som erbjuder SSH. Den offentliga PGP-nyckeln kan sedan laddas upp till PGP " +"nyckelservrar. Användare som ansluter till denna enhet via SSH kan verifiera " +"att de ansluter till rätt värd. För att användare ska kunna lita på " +"nyckeln, måste minst en person (vanligtvis enheytens ägare) signera nyckeln " +"genom att använda den normala processen för PGP-nyckel signering. Se Monkeysphere SSH " +"dokumentation för mer information." #: plinth/modules/monkeysphere/templates/monkeysphere.html:53 msgid "Publishing key to keyserver..." -msgstr "" +msgstr "Publicerar nyckeln till nyckelserver..." #: plinth/modules/monkeysphere/templates/monkeysphere.html:71 msgid "GPG Fingerprint" -msgstr "" +msgstr "GPG Fingeravtryck" #: plinth/modules/monkeysphere/templates/monkeysphere.html:83 #: plinth/modules/names/views.py:45 msgid "Not Available" -msgstr "" +msgstr "Inte tillgänglig" #: plinth/modules/monkeysphere/templates/monkeysphere.html:93 msgid "Generate PGP Key" -msgstr "" +msgstr "Generera PGP-nyckel" #: plinth/modules/monkeysphere/templates/monkeysphere.html:101 msgid "Publish Key" -msgstr "" +msgstr "Publicera nyckel" #: plinth/modules/monkeysphere/views.py:58 msgid "Generated PGP key." -msgstr "" +msgstr "PGP-nyckel genererad." #: plinth/modules/monkeysphere/views.py:83 msgid "Cancelled key publishing." -msgstr "" +msgstr "Publicering av nyckel avbruten." #: plinth/modules/monkeysphere/views.py:120 msgid "Published key to keyserver." -msgstr "" +msgstr "Publicerade nyckeln till nyckelserver." #: plinth/modules/monkeysphere/views.py:122 msgid "Error occurred while publishing key." -msgstr "" +msgstr "Fel uppstod när nyckeln publicerades." #: plinth/modules/mumble/__init__.py:38 #: plinth/modules/mumble/templates/mumble.html:26 #: plinth/modules/mumble/views.py:58 msgid "Voice Chat (Mumble)" -msgstr "" +msgstr "Röstchatt (Mumble)" #: plinth/modules/mumble/__init__.py:43 msgid "Mumble Voice Chat Server" -msgstr "" +msgstr "Server för Mumble röstchatt" #: plinth/modules/mumble/forms.py:29 msgid "Enable Mumble daemon" -msgstr "" +msgstr "Aktivera Mumble-demon" #: plinth/modules/mumble/templates/mumble.html:29 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " "software." msgstr "" +"Mumble är ett program för röstchatt med öppen källkod, låg latens, " +"kryptering och hög ljudkvalitet." #: plinth/modules/mumble/templates/mumble.html:36 msgid "" @@ -1215,39 +1298,42 @@ msgid "" "href=\"http://mumble.info\">Clients to connect to Mumble from your " "desktop and Android devices are available." msgstr "" +"Du kan ansluta till din Mumble-server på Mumbles standardport 64738. Appar finns för att ansluta till Mumble från din " +"dator- och Android-enheter." #: plinth/modules/mumble/templates/mumble.html:49 msgid "Mumble server is running" -msgstr "" +msgstr "Mumble-servern är aktiverad" #: plinth/modules/mumble/templates/mumble.html:52 msgid "Mumble server is not running" -msgstr "" +msgstr "Mumble-servern är inaktiverad" #: plinth/modules/names/__init__.py:29 msgid "HTTP" -msgstr "" +msgstr "HTTP" #: plinth/modules/names/__init__.py:30 msgid "HTTPS" -msgstr "" +msgstr "HTTPS" #: plinth/modules/names/__init__.py:31 msgid "SSH" -msgstr "" +msgstr "SSH" #: plinth/modules/names/__init__.py:45 plinth/modules/names/views.py:34 msgid "Name Services" -msgstr "" +msgstr "Namntjänster" #: plinth/modules/networks/__init__.py:108 #, python-brace-format msgid "Using DNSSEC on IPv{kind}" -msgstr "" +msgstr "Använder DNSSEC på IPv{kind}" #: plinth/modules/networks/forms.py:30 msgid "Connection Type" -msgstr "" +msgstr "Anslutningstyp" #: plinth/modules/networks/forms.py:37 msgid "Connection Name" @@ -1255,15 +1341,15 @@ msgstr "" #: plinth/modules/networks/forms.py:39 msgid "Physical Interface" -msgstr "" +msgstr "Fysiskt gränssnitt" #: plinth/modules/networks/forms.py:41 msgid "The network device that this connection should be bound to." -msgstr "" +msgstr "Den nätverksenhet som denna anslutning ska knytas till." #: plinth/modules/networks/forms.py:44 msgid "Firewall Zone" -msgstr "" +msgstr "Brandväggs-zon" #: plinth/modules/networks/forms.py:45 msgid "" From a48068f775e9d4f3842a205afc2614a1000fa368 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sun, 24 Jan 2016 00:19:03 +0530 Subject: [PATCH 018/189] Ability to localize brand name in templates - Take the value from the configuration and run it throught the Django translate method and make it available in Context. - Use a no-op translate method to translate the text 'FreedomBox'. --- plinth/context_processors.py | 8 +++++++- plinth/tests/test_context_processors.py | 2 ++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/plinth/context_processors.py b/plinth/context_processors.py index 433e0dd4b..d7de023ee 100644 --- a/plinth/context_processors.py +++ b/plinth/context_processors.py @@ -19,6 +19,7 @@ Django context processors to provide common data to templates. """ +from django.utils.translation import ugettext as _, ugettext_noop import re from plinth import cfg @@ -30,10 +31,15 @@ def common(request): Any resources referenced in the return value are expected to have been initialized or configured externally beforehand. """ + # Allow a value in configuration file to be translated. Allow + # the brand name 'FreedomBox' itself to be translated. + ugettext_noop('FreedomBox') + slash_indices = [match.start() for match in re.finditer('/', request.path)] active_menu_urls = [request.path[:index + 1] for index in slash_indices] return { 'cfg': cfg, 'submenu': cfg.main_menu.active_item(request), - 'active_menu_urls': active_menu_urls + 'active_menu_urls': active_menu_urls, + 'box_name': _(cfg.box_name) } diff --git a/plinth/tests/test_context_processors.py b/plinth/tests/test_context_processors.py index bf627ff54..f92296b59 100644 --- a/plinth/tests/test_context_processors.py +++ b/plinth/tests/test_context_processors.py @@ -42,6 +42,8 @@ def test_common(self): self.assertIsNotNone(config) self.assertEqual('FreedomBox', config.box_name) + self.assertEqual('FreedomBox', response['box_name']) + submenu = response['submenu'] self.assertIsNone(submenu) From 8ccffcf02cd5ba8352bc8182d7be13ea015332ca Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sun, 24 Jan 2016 00:22:59 +0530 Subject: [PATCH 019/189] Add utility method to lazy format lazy string This method is useful to format strings that are lazy (such as those in Forms). --- plinth/utils.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/plinth/utils.py b/plinth/utils.py index edb76adc1..a8995332b 100644 --- a/plinth/utils.py +++ b/plinth/utils.py @@ -20,6 +20,7 @@ """ import importlib +from django.utils.functional import lazy def import_from_gi(library, version): @@ -34,3 +35,12 @@ def import_from_gi(library, version): package.require_version(library, version) return importlib.import_module(package_name + '.repository.' + library) + + +def _format_lazy(string, *args, **kwargs): + """Lazily format a lazy string.""" + string = str(string) + return string.format(*args, **kwargs) + + +format_lazy = lazy(_format_lazy, str) From 4602c5bfcec05a55d8465f565a886f48e752df44 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sun, 24 Jan 2016 00:37:01 +0530 Subject: [PATCH 020/189] Use translated brand name in templates Using brand name directly from configuration means that it can't be easily translated. Instead use the translated brand name sent in my the context processor. --- plinth/modules/apps/templates/apps.html | 2 +- plinth/modules/firewall/templates/firewall.html | 4 ++-- .../modules/first_boot/templates/firstboot_state0.html | 4 ++-- .../first_boot/templates/firstboot_state10.html | 2 +- plinth/modules/letsencrypt/templates/letsencrypt.html | 2 +- .../networks/templates/connections_diagram.html | 2 +- plinth/modules/openvpn/templates/openvpn.html | 10 +++++----- .../pagekite/templates/pagekite_introduction.html | 8 ++++---- plinth/modules/privoxy/templates/privoxy.html | 2 +- plinth/modules/quassel/templates/quassel.html | 2 +- plinth/modules/restore/templates/restore_index.html | 2 +- plinth/modules/system/templates/system.html | 4 ++-- plinth/modules/tor/templates/tor.html | 4 ++-- plinth/templates/base.html | 2 +- 14 files changed, 25 insertions(+), 25 deletions(-) diff --git a/plinth/modules/apps/templates/apps.html b/plinth/modules/apps/templates/apps.html index 303325e2a..266f6f079 100644 --- a/plinth/modules/apps/templates/apps.html +++ b/plinth/modules/apps/templates/apps.html @@ -25,7 +25,7 @@

{% trans "Services and Applications" %}

- {% blocktrans trimmed with box_name=cfg.box_name %} + {% blocktrans trimmed %} You can install and run various services and applications on your {{ box_name }}. Click on any app page link on the left to read a description of the application and choose to install it. diff --git a/plinth/modules/firewall/templates/firewall.html b/plinth/modules/firewall/templates/firewall.html index d391f9708..6646ac642 100644 --- a/plinth/modules/firewall/templates/firewall.html +++ b/plinth/modules/firewall/templates/firewall.html @@ -25,9 +25,9 @@

{{ title }}

- {% blocktrans trimmed with box_name=cfg.box_name %} Firewall is a network security system that controls the incoming and outgoing network traffic on your {{ box_name }}. Keeping a + {% blocktrans trimmed %} firewall enabled and properly configured reduces risk of security threat from the Internet. {% endblocktrans %} @@ -38,7 +38,7 @@

{{ title }}

{% if firewall_status == 'not_running' %}

- {% blocktrans trimmed with box_name=cfg.box_name %} + {% blocktrans trimmed %} Firewall daemon is not running. Please run it. Firewall comes enabled by default on {{ box_name }}. On any Debian based system (such as {{ box_name }}) you may run it using the diff --git a/plinth/modules/first_boot/templates/firstboot_state0.html b/plinth/modules/first_boot/templates/firstboot_state0.html index 517cd7df5..670a901cc 100644 --- a/plinth/modules/first_boot/templates/firstboot_state0.html +++ b/plinth/modules/first_boot/templates/firstboot_state0.html @@ -37,7 +37,7 @@ {% block content_row %}

{{ cfg.box_name }} + alt="{{ box_name }}" width="640"/>

@@ -46,7 +46,7 @@

- {% blocktrans trimmed with box_name=cfg.box_name %} + {% blocktrans trimmed %} To complete the setup of your {{ box_name }}, please provide some basic information. {% endblocktrans %} diff --git a/plinth/modules/first_boot/templates/firstboot_state10.html b/plinth/modules/first_boot/templates/firstboot_state10.html index b7b18cf9c..213ff09f2 100644 --- a/plinth/modules/first_boot/templates/firstboot_state10.html +++ b/plinth/modules/first_boot/templates/firstboot_state10.html @@ -29,7 +29,7 @@

{% trans "Setup Complete!" %}

- {% blocktrans trimmed with box_name=cfg.box_name %} + {% blocktrans trimmed %} {{ box_name }} setup is now complete. To make your {{ box_name }} functional, you need some applications. Applications will be installed the first time you access them. diff --git a/plinth/modules/letsencrypt/templates/letsencrypt.html b/plinth/modules/letsencrypt/templates/letsencrypt.html index ba92f871d..15043bdf2 100644 --- a/plinth/modules/letsencrypt/templates/letsencrypt.html +++ b/plinth/modules/letsencrypt/templates/letsencrypt.html @@ -38,7 +38,7 @@

{% trans "Certificates (Let's Encrypt)" %}

- {% blocktrans trimmed with box_name=cfg.box_name %} + {% blocktrans trimmed %} A digital certficate allows users of a web service to verify the identity of the service and to securely communicate with it. {{ box_name }} can automatically obtain and setup digital diff --git a/plinth/modules/networks/templates/connections_diagram.html b/plinth/modules/networks/templates/connections_diagram.html index 37e3baf70..9221daaea 100644 --- a/plinth/modules/networks/templates/connections_diagram.html +++ b/plinth/modules/networks/templates/connections_diagram.html @@ -94,7 +94,7 @@

{{ cfg.box_name }} + class="col-image network-entity" alt="{{ box_name }}"/>
{% trans "Virtual Private Network (OpenVPN)" %}

- {% blocktrans trimmed with box_name=cfg.box_name %} + {% 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 @@ -51,7 +51,7 @@

{% trans "Virtual Private Network (OpenVPN)" %}

{% trans "Profile" %}

- {% blocktrans trimmed with box_name=cfg.box_name %} + {% blocktrans trimmed %} To connect to {{ 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 @@ -63,7 +63,7 @@

{% trans "Profile" %}

- {% blocktrans trimmed with box_name=cfg.box_name %} + {% blocktrans trimmed %} Profile is specific to each user of {{ box_name }}. Keep it a secret. {% endblocktrans %} @@ -82,7 +82,7 @@

{% trans "Status" %}

{% if not status.is_setup and not status.setup_running %}

- {% blocktrans trimmed with box_name=cfg.box_name %} + {% blocktrans trimmed %} OpenVPN has not yet been setup. Performing a secure setup takes a very long time. Depending on how fast your {{ box_name }} is, it may even take hours. If the setup @@ -105,7 +105,7 @@

{% trans "Status" %}

- {% blocktrans trimmed with box_name=cfg.box_name %} + {% blocktrans trimmed %} To perform a secure setup, this process takes a very long time. Depending on how fast your {{ box_name }} is, it may even take hours. If the setup is interrupted, you may start diff --git a/plinth/modules/pagekite/templates/pagekite_introduction.html b/plinth/modules/pagekite/templates/pagekite_introduction.html index 73f711b36..92682064d 100644 --- a/plinth/modules/pagekite/templates/pagekite_introduction.html +++ b/plinth/modules/pagekite/templates/pagekite_introduction.html @@ -23,7 +23,7 @@ {% block content %}

- {% blocktrans trimmed with box_name=cfg.box_name %} + {% blocktrans trimmed %} PageKite is a system for exposing {{ box_name }} services when you don't have a direct connection to the Internet. You only need this if your {{ box_name }} services are unreachable from @@ -34,13 +34,13 @@

  • - {% blocktrans trimmed with box_name=cfg.box_name %} + {% blocktrans trimmed %} {{ box_name }} is behind a restricted firewall. {% endblocktrans %}
  • - {% blocktrans trimmed with box_name=cfg.box_name %} + {% blocktrans trimmed %} {{ box_name }} is connected to a (wireless) router which you don't control. {% endblocktrans %} @@ -64,7 +64,7 @@

- {% blocktrans trimmed with box_name=cfg.box_name %} + {% 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 diff --git a/plinth/modules/privoxy/templates/privoxy.html b/plinth/modules/privoxy/templates/privoxy.html index 3bb04cd75..4a4f82c00 100644 --- a/plinth/modules/privoxy/templates/privoxy.html +++ b/plinth/modules/privoxy/templates/privoxy.html @@ -35,7 +35,7 @@

{% trans "Web Proxy (Privoxy)" %}

- {% blocktrans trimmed with box_name=cfg.box_name %} + {% blocktrans trimmed %} You can use Privoxy by modifying your browser proxy settings to your {{ box_name }} hostname (or IP address) with port 8118. While using Privoxy, you can see its configuration details and diff --git a/plinth/modules/quassel/templates/quassel.html b/plinth/modules/quassel/templates/quassel.html index 286f01065..c2f47ce0c 100644 --- a/plinth/modules/quassel/templates/quassel.html +++ b/plinth/modules/quassel/templates/quassel.html @@ -26,7 +26,7 @@

{% trans "IRC Client (Quassel)" %}

- {% blocktrans trimmed with box_name=cfg.box_name %} + {% blocktrans trimmed %} Quassel is an IRC application that is split into two parts, a "core" and a "client". This allows the core to remain connected to IRC servers, and to continue receiving messages, even when diff --git a/plinth/modules/restore/templates/restore_index.html b/plinth/modules/restore/templates/restore_index.html index 28369dbd1..8c9402ba7 100644 --- a/plinth/modules/restore/templates/restore_index.html +++ b/plinth/modules/restore/templates/restore_index.html @@ -31,7 +31,7 @@

{% trans "Unhosted Storage (reStore)" %}

web applications. The idea is to uncouple web applications from data. No matter where a web application is served from, the data can be stored on an unhosted storage server of user's - choice. With reStore, your {{ cfg.box_name }} becomes your + choice. With reStore, your {{ box_name }} becomes your unhosted storage server. {% endblocktrans %}

diff --git a/plinth/modules/system/templates/system.html b/plinth/modules/system/templates/system.html index e3cc68759..e8c2a46f3 100644 --- a/plinth/modules/system/templates/system.html +++ b/plinth/modules/system/templates/system.html @@ -25,14 +25,14 @@

{% trans "System Configuration" %}

- {% blocktrans trimmed with box_name=cfg.box_name %} + {% blocktrans trimmed %} Here you can administrate the underlying system of your {{ box_name }}. {% endblocktrans %}

- {% blocktrans trimmed with box_name=cfg.box_name %} + {% blocktrans trimmed %} The options affect the {{ box_name }} at its most general level, so be careful! {% endblocktrans %} diff --git a/plinth/modules/tor/templates/tor.html b/plinth/modules/tor/templates/tor.html index a48d42011..4d4ebbd31 100644 --- a/plinth/modules/tor/templates/tor.html +++ b/plinth/modules/tor/templates/tor.html @@ -85,7 +85,7 @@

{% trans "Configuration" %}

{% trans "Bridge" %}

- {% blocktrans trimmed with box_name=cfg.box_name %} + {% blocktrans trimmed %} Your {{ box_name }} is configured as a Tor bridge with obfsproxy, so it can help circumvent censorship. If your {{ box_name }} is behind a router or firewall, you should make sure the following @@ -117,7 +117,7 @@

{% trans "Bridge" %}

{% trans "SOCKS" %}

- {% blocktrans trimmed with box_name=cfg.box_name %} + {% blocktrans trimmed %} A Tor SOCKS port is available on your {{ box_name }} on TCP port 9050. {% endblocktrans %} diff --git a/plinth/templates/base.html b/plinth/templates/base.html index 95060ef6a..d34fd28e1 100644 --- a/plinth/templates/base.html +++ b/plinth/templates/base.html @@ -86,7 +86,7 @@ {% block mainmenu_left %} {{ cfg.box_name }} + alt="{{ box_name }}" /> From 572e68dc36d8f73eb8a45cbff3569ffbec8a543b Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sun, 24 Jan 2016 00:50:14 +0530 Subject: [PATCH 021/189] Make remaining uses of brand name customizable --- plinth/modules/dynamicdns/templates/dynamicdns.html | 8 ++++---- plinth/modules/help/help.py | 11 ++++++----- plinth/modules/help/templates/help_about.html | 9 +++++---- plinth/modules/help/templates/help_base.html | 4 +--- plinth/modules/help/templates/help_index.html | 12 ++++++------ .../modules/networks/templates/connection_show.html | 4 ++-- plinth/modules/openvpn/templates/openvpn.html | 2 +- plinth/modules/tor/tor.py | 8 +++++--- plinth/service.py | 12 +++++++----- plinth/templates/base.html | 6 ++++-- 10 files changed, 41 insertions(+), 35 deletions(-) diff --git a/plinth/modules/dynamicdns/templates/dynamicdns.html b/plinth/modules/dynamicdns/templates/dynamicdns.html index 732679999..aa8e4b1af 100644 --- a/plinth/modules/dynamicdns/templates/dynamicdns.html +++ b/plinth/modules/dynamicdns/templates/dynamicdns.html @@ -29,7 +29,7 @@

{% trans "DynamicDNS client" %}

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). + provided by {{ box_name }}, such as ownCloud. {% endblocktrans %}

@@ -59,9 +59,9 @@

{% trans "DynamicDNS client" %}

{% 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. + If your {{ box_name }} is connected behind some NAT router, don't forget + to add port forwarding (i.e. forward some standard ports like 80 and + 443). {% endblocktrans %}

{% endblock %} diff --git a/plinth/modules/help/help.py b/plinth/modules/help/help.py index c59d5d753..4ffe73e87 100644 --- a/plinth/modules/help/help.py +++ b/plinth/modules/help/help.py @@ -35,7 +35,7 @@ def init(): 'glyphicon-book', 'help:index', 101) menu.add_urlname(ugettext_lazy('Where to Get Help'), 'glyphicon-search', 'help:index_explicit', 5) - menu.add_urlname(ugettext_lazy('FreedomBox Manual'), 'glyphicon-info-sign', + menu.add_urlname(ugettext_lazy('Manual'), 'glyphicon-info-sign', 'help:manual', 10) menu.add_urlname(ugettext_lazy('About'), 'glyphicon-star', 'help:about', 100) @@ -52,7 +52,7 @@ def index(request): def about(request): """Serve the about page""" context = { - 'title': _('About {box_name}').format(box_name=cfg.box_name), + 'title': _('About {box_name}').format(box_name=_(cfg.box_name)), 'version': __version__ } return TemplateResponse(request, 'help_about.html', context) @@ -68,6 +68,7 @@ def manual(request): except IOError: raise Http404 - return TemplateResponse(request, 'help_manual.html', - {'title': _('FreedomBox Manual'), - 'content': content}) + return TemplateResponse( + request, 'help_manual.html', + {'title': _('{box_name} Manual').format(box_name=_(cfg.box_name)), + 'content': content}) diff --git a/plinth/modules/help/templates/help_about.html b/plinth/modules/help/templates/help_about.html index d0c33e51f..83e44eeaf 100644 --- a/plinth/modules/help/templates/help_about.html +++ b/plinth/modules/help/templates/help_about.html @@ -55,15 +55,16 @@

{% 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. + distributed services; {{ box_name }} aims to bring them all + together in a convenient package. {% endblocktrans %}

{% blocktrans trimmed %} - For more information about the FreedomBox project, see the - FreedomBox Wiki. + For more information about the {{ box_name }} project, see the + {{ box_name }} + Wiki. {% endblocktrans %}

diff --git a/plinth/modules/help/templates/help_base.html b/plinth/modules/help/templates/help_base.html index aaf879b7b..5217c2542 100644 --- a/plinth/modules/help/templates/help_base.html +++ b/plinth/modules/help/templates/help_base.html @@ -33,9 +33,7 @@ {{ cfg.box_name }} - {% blocktrans trimmed with box_name=cfg.box_name %} - {{ box_name }} Setup - {% endblocktrans %} + {% blocktrans trimmed %}{{ box_name }} Setup{% endblocktrans %} diff --git a/plinth/modules/help/templates/help_index.html b/plinth/modules/help/templates/help_index.html index 4b41ac6b3..ee424d8e1 100644 --- a/plinth/modules/help/templates/help_index.html +++ b/plinth/modules/help/templates/help_index.html @@ -26,8 +26,8 @@

{% trans "Help" %}

{% url 'help:manual' as manual_url %} - {% blocktrans trimmed with box_name=cfg.box_name %} - The FreedomBox Manual is the + {% blocktrans trimmed %} + The {{ box_name }} Manual is the best place to start for information regarding {{ box_name }}. {% endblocktrans %}

@@ -35,13 +35,13 @@

{% trans "Help" %}

{% blocktrans trimmed %} - FreedomBox project wiki contains further information. + {{ box_name }} project wiki contains further information. {% endblocktrans %}

{% blocktrans trimmed %} - To seek help from FreedomBox community, queries may be posted on + To seek help from {{ box_name }} community, queries may be posted on the mailing list. The list archives also contain information @@ -51,8 +51,8 @@

{% trans "Help" %}

{% blocktrans trimmed %} - Many FreedomBox contributors and users are also available on the irc.oftc.net IRC network. - Join and request help on the + Many {{ box_name }} contributors and users are also available on + the irc.oftc.net IRC network. Join and request help on the #freedombox channel using the IRC web interface. {% endblocktrans %} diff --git a/plinth/modules/networks/templates/connection_show.html b/plinth/modules/networks/templates/connection_show.html index 476f6fe3b..9ef544235 100644 --- a/plinth/modules/networks/templates/connection_show.html +++ b/plinth/modules/networks/templates/connection_show.html @@ -317,8 +317,8 @@

{% trans "Security" %}

{% blocktrans trimmed %} - This interface is not maintained by FreedomBox. Its - security status is unknown to FreedomBox. Many FreedomBox + This interface is not maintained by {{ box_name }}. Its + security status is unknown to {{ box_name }}. Many {{ box_name }} services may not be available on this interface. It is recommended that you deactivate/delete this connection and re-configure it. diff --git a/plinth/modules/openvpn/templates/openvpn.html b/plinth/modules/openvpn/templates/openvpn.html index dcedf3d15..654c47722 100644 --- a/plinth/modules/openvpn/templates/openvpn.html +++ b/plinth/modules/openvpn/templates/openvpn.html @@ -57,7 +57,7 @@

{% trans "Profile" %}

desktop machine. OpenVPN Clients are available for most platforms. See documentation on + title="{{ box_name }} Manual - OpenVPN">documentation on recommended clients and instructions on how to configure them. {% endblocktrans %}

diff --git a/plinth/modules/tor/tor.py b/plinth/modules/tor/tor.py index ae80da907..d4f430284 100644 --- a/plinth/modules/tor/tor.py +++ b/plinth/modules/tor/tor.py @@ -34,6 +34,7 @@ from plinth.errors import ActionError from plinth.modules.names import SERVICES from plinth.signals import domain_added, domain_removed +from plinth.utils import format_lazy APT_SOURCES_URI_PATHS = ('/files/etc/apt/sources.list/*/uri', '/files/etc/apt/sources.list.d/*/*/uri') @@ -48,9 +49,10 @@ class TorForm(forms.Form): # pylint: disable=W0232 hs_enabled = forms.BooleanField( label=_('Enable Tor Hidden Service'), required=False, - help_text=_('A hidden service will allow FreedomBox to provide ' - 'selected services (such as ownCloud or Chat) without ' - 'revealing its location.')) + help_text=format_lazy(_( + 'A hidden service will allow {box_name} to provide selected ' + 'services (such as ownCloud or Chat) without revealing its ' + 'location.'), box_name=_(cfg.box_name))) apt_transport_tor_enabled = forms.BooleanField( label=_('Download software packages over Tor'), required=False, diff --git a/plinth/service.py b/plinth/service.py index ec3d28678..3a087ca32 100644 --- a/plinth/service.py +++ b/plinth/service.py @@ -19,12 +19,12 @@ Framework for working with servers and their services. """ -from django.utils.translation import ugettext_lazy as _ - import collections +from django.utils.translation import ugettext_lazy as _ +from plinth import cfg from plinth.signals import service_enabled - +from plinth.utils import format_lazy services = {} @@ -75,5 +75,7 @@ def init(): is_external=True, enabled=True) Service('ssh', _('Secure Shell (SSH) Server'), ['ssh'], is_external=True, enabled=True) - Service('plinth', _('FreedomBox Web Interface (Plinth)'), ['https'], - is_external=True, enabled=True) + Service('plinth', + format_lazy(_('{box_name} Web Interface (Plinth)'), + box_name=_(cfg.box_name)), + ['https'], is_external=True, enabled=True) diff --git a/plinth/templates/base.html b/plinth/templates/base.html index d34fd28e1..d3f76308d 100644 --- a/plinth/templates/base.html +++ b/plinth/templates/base.html @@ -46,10 +46,12 @@ + content="{% blocktrans trimmed %} + Plinth administrative interface for the {{ box_name }} + {% endblocktrans %}" /> {% block title %} - {% if title %} {{ title }} {% else %} {% trans "FreedomBox" %} {% endif %} + {% if title %} {{ title }} {% else %} {{ box_name }} {% endif %} {% endblock %} From 15312fe5953acc0e07e00ce901c501fd2ede6c2b Mon Sep 17 00:00:00 2001 From: Caly Date: Sun, 24 Jan 2016 01:04:31 +0530 Subject: [PATCH 022/189] Update messages for simplicity/consistency/grammer - Closes #375 and #380. - More use of configurable brand name. --- README.md | 6 ++-- plinth/modules/avahi/templates/avahi.html | 10 +++--- plinth/modules/config/config.py | 32 +++++++++---------- plinth/modules/dynamicdns/dynamicdns.py | 25 ++++++++------- .../dynamicdns/templates/dynamicdns.html | 4 +-- .../templates/dynamicdns_status.html | 12 +++---- .../modules/firewall/templates/firewall.html | 10 +++--- .../templates/firstboot_state10.html | 4 +-- plinth/modules/help/templates/help_about.html | 16 +++++----- plinth/modules/ikiwiki/__init__.py | 4 +-- plinth/modules/ikiwiki/forms.py | 2 +- .../ikiwiki/templates/ikiwiki_delete.html | 5 +-- plinth/modules/ikiwiki/views.py | 8 ++--- .../networks/templates/connection_show.html | 2 +- plinth/modules/openvpn/templates/openvpn.html | 2 +- plinth/modules/tor/tor.py | 2 +- 16 files changed, 74 insertions(+), 70 deletions(-) diff --git a/README.md b/README.md index 9f9d3d0c0..64dcd3529 100644 --- a/README.md +++ b/README.md @@ -13,9 +13,9 @@ 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. +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. Plinth is a web interface to administer the functions of the FreedomBox. It is extensible and provides various applications of diff --git a/plinth/modules/avahi/templates/avahi.html b/plinth/modules/avahi/templates/avahi.html index 80d55550a..c3d1b98d7 100644 --- a/plinth/modules/avahi/templates/avahi.html +++ b/plinth/modules/avahi/templates/avahi.html @@ -27,11 +27,11 @@

{% trans "Service Discovery" %}

{% 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 + Service discovery allows other devices on the network to + discover your {{ box_name }} and services running on it. It + also allows {{ box_name }} to discover other devices 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 %} diff --git a/plinth/modules/config/config.py b/plinth/modules/config/config.py index cd78025c1..f730f83d1 100644 --- a/plinth/modules/config/config.py +++ b/plinth/modules/config/config.py @@ -38,6 +38,7 @@ from plinth.signals import pre_hostname_change, post_hostname_change from plinth.signals import domainname_change from plinth.signals import domain_added, domain_removed +from plinth.utils import format_lazy HOSTNAME_REGEX = r'^[a-zA-Z0-9]([-a-zA-Z0-9]{,61}[a-zA-Z0-9])?$' @@ -92,12 +93,12 @@ class ConfigurationForm(forms.Form): # https://tools.ietf.org/html/rfc2181#section-11 hostname = TrimmedCharField( label=ugettext_lazy('Hostname'), - help_text=\ - ugettext_lazy('Hostname is the local name by which other machines on ' - 'the local network reach your machine. It must start ' - 'and end with an alphabet or a digit and have as ' - 'interior characters only alphabets, digits and ' - 'hyphens. Total length must be 63 characters or less.'), + help_text=format_lazy(ugettext_lazy( + 'Hostname is the local name by which other devices on the local ' + 'network can reach your {box_name}. It must start and end with ' + 'an alphabet or a digit and have as interior characters only ' + 'alphabets, digits and hyphens. Total length must be 63 ' + 'characters or less.'), box_name=ugettext_lazy(cfg.box_name)), validators=[ validators.RegexValidator( HOSTNAME_REGEX, @@ -105,14 +106,14 @@ class ConfigurationForm(forms.Form): domainname = TrimmedCharField( label=ugettext_lazy('Domain Name'), - help_text=\ - ugettext_lazy('Domain name is the global name by which other machines ' - 'on the Internet can reach you. It must consist of ' - 'labels separated by dots. Each label must start and ' - 'end with an alphabet or a digit and have as interior ' - 'characters only alphabets, digits and hyphens. Length ' - 'of each label must be 63 characters or less. Total ' - 'length of domain name must be 253 characters or less.'), + help_text=format_lazy(ugettext_lazy( + 'Domain name is the global name by which other devices on the ' + 'Internet can reach your {box_name}. It must consist of labels ' + 'separated by dots. Each label must start and end with an ' + 'alphabet or a digit and have as interior characters only ' + 'alphabets, digits and hyphens. Length of each label must be 63 ' + 'characters or less. Total length of domain name must be 253 ' + 'characters or less.'), box_name=ugettext_lazy(cfg.box_name)), required=False, validators=[ validators.RegexValidator( @@ -123,8 +124,7 @@ class ConfigurationForm(forms.Form): language = forms.ChoiceField( label=ugettext_lazy('Language'), help_text=\ - ugettext_lazy('Language for this FreedomBox web administration ' - 'interface'), + ugettext_lazy('Language for this web administration interface'), required=False, choices=settings.LANGUAGES) diff --git a/plinth/modules/dynamicdns/dynamicdns.py b/plinth/modules/dynamicdns/dynamicdns.py index 4fef37df6..490ec98c6 100644 --- a/plinth/modules/dynamicdns/dynamicdns.py +++ b/plinth/modules/dynamicdns/dynamicdns.py @@ -26,6 +26,7 @@ from plinth import actions from plinth import cfg from plinth import package +from plinth.utils import format_lazy logger = logging.getLogger(__name__) EMPTYSTRING = 'none' @@ -78,9 +79,10 @@ class ConfigureForm(forms.Form): help_server = \ ugettext_lazy('Please do not enter a URL here (like ' '"https://example.com/") but only the hostname of the ' - 'GnuDIP server (like "example.pcom").') - help_domain = \ - ugettext_lazy('The public domain name you want use to reach your box.') + 'GnuDIP server (like "example.com").') + help_domain = format_lazy( + ugettext_lazy('The public domain name you want use to reach your ' + '{box_name}.'), box_name=ugettext_lazy(cfg.box_name)) help_disable_ssl = \ ugettext_lazy('Use this option if your provider uses self signed ' 'certificates.') @@ -90,13 +92,14 @@ class ConfigureForm(forms.Form): help_secret = \ ugettext_lazy('Leave this field empty if you want to keep your ' 'previous configured password.') - help_ip_url = \ - ugettext_lazy('Optional Value. If your FreedomBox is not connected ' + help_ip_url = format_lazy( + ugettext_lazy('Optional Value. If your {box_name} is not connected ' 'directly to the Internet (i.e. connected to a NAT ' 'router) this URL is used to figure out the real ' - 'Internet IP. The URL should simply return the IP where' - 'the client comes from. Example: ' - 'http://myip.datasystems24.de') + 'Internet IP. The URL should simply return the IP where ' + 'the client comes from (example: ' + 'http://myip.datasystems24.de).'), + box_name=ugettext_lazy(cfg.box_name)) help_user = \ ugettext_lazy('You should have been requested to select a username ' 'when you created the account.') @@ -129,11 +132,11 @@ class ConfigureForm(forms.Form): help_text=help_update_url) disable_SSL_cert_check = forms.BooleanField( - label=ugettext_lazy('accept all SSL certificates'), + label=ugettext_lazy('Accept all SSL certificates'), help_text=help_disable_ssl, required=False) use_http_basic_auth = forms.BooleanField( - label=ugettext_lazy('use HTTP basic authentication'), + label=ugettext_lazy('Use HTTP basic authentication'), help_text=help_http_auth, required=False) dynamicdns_domain = TrimmedCharField( @@ -151,7 +154,7 @@ class ConfigureForm(forms.Form): label=ugettext_lazy('Password'), widget=forms.PasswordInput(), required=False, help_text=help_secret) - showpw = forms.BooleanField(label=ugettext_lazy('show password'), + showpw = forms.BooleanField(label=ugettext_lazy('Show password'), required=False) dynamicdns_ipurl = TrimmedCharField( diff --git a/plinth/modules/dynamicdns/templates/dynamicdns.html b/plinth/modules/dynamicdns/templates/dynamicdns.html index aa8e4b1af..5ad1ec90b 100644 --- a/plinth/modules/dynamicdns/templates/dynamicdns.html +++ b/plinth/modules/dynamicdns/templates/dynamicdns.html @@ -22,7 +22,7 @@ {% block content %} -

{% trans "DynamicDNS client" %}

+

{% trans "Dynamic DNS Client" %}

{% blocktrans trimmed %} @@ -41,7 +41,7 @@

{% trans "DynamicDNS client" %}

public IP address to an gnudip server. Afterwards the Server will assign your DNS name with the - new IP and if someone from the internet asks for your DNS name + new IP and if someone from the Internet asks for your DNS name he will get your current IP answered. {% endblocktrans %}

diff --git a/plinth/modules/dynamicdns/templates/dynamicdns_status.html b/plinth/modules/dynamicdns/templates/dynamicdns_status.html index dc11a96b9..74ad2d0b1 100644 --- a/plinth/modules/dynamicdns/templates/dynamicdns_status.html +++ b/plinth/modules/dynamicdns/templates/dynamicdns_status.html @@ -32,14 +32,14 @@

{% trans "NAT type" %}

{% endblocktrans %} {% else %} {% if no_nat %} - {% trans "Direct connection to the internet." %} + {% 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. + Behind NAT. This means that Dynamic DNS service will poll + the "IP check URL" for changes (the "IP check URL" entry is + needed for this - otherwise IP changes will not be + detected). In case the WAN IP changes, it may take up to + {{ timer }} minutes until your DNS entry is updated. {% endblocktrans %} {% endif %} {% endif %} diff --git a/plinth/modules/firewall/templates/firewall.html b/plinth/modules/firewall/templates/firewall.html index 6646ac642..e59d4052d 100644 --- a/plinth/modules/firewall/templates/firewall.html +++ b/plinth/modules/firewall/templates/firewall.html @@ -25,15 +25,15 @@

{{ title }}

- Firewall is a network security system that controls the incoming - and outgoing network traffic on your {{ box_name }}. Keeping a {% blocktrans trimmed %} + Firewall is a security system that controls the incoming and + outgoing network traffic on your {{ box_name }}. Keeping a firewall enabled and properly configured reduces risk of security threat from the Internet. {% endblocktrans %}

-

{% trans "The following is the current status:" %}

+

{% trans "Current status:" %}

{% if firewall_status == 'not_running' %} @@ -102,8 +102,8 @@

{{ title }}

{% 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. + a service it is also permitted in the firewall and when you + disable a service it is also disabled in the firewall. {% endblocktrans %}

diff --git a/plinth/modules/first_boot/templates/firstboot_state10.html b/plinth/modules/first_boot/templates/firstboot_state10.html index 213ff09f2..93fb7d5e2 100644 --- a/plinth/modules/first_boot/templates/firstboot_state10.html +++ b/plinth/modules/first_boot/templates/firstboot_state10.html @@ -31,8 +31,8 @@

{% trans "Setup Complete!" %}

{% blocktrans trimmed %} {{ box_name }} setup is now complete. To make your {{ box_name }} - functional, you need some applications. Applications will be - installed the first time you access them. + functional, you need some applications. They will be installed + the first time you access them. {% endblocktrans %}

diff --git a/plinth/modules/help/templates/help_about.html b/plinth/modules/help/templates/help_about.html index 83e44eeaf..1c7beafbd 100644 --- a/plinth/modules/help/templates/help_about.html +++ b/plinth/modules/help/templates/help_about.html @@ -28,14 +28,14 @@

{% 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. + {{ box_name }} 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 %}

diff --git a/plinth/modules/ikiwiki/__init__.py b/plinth/modules/ikiwiki/__init__.py index 5a67f0fd8..402f4b6ae 100644 --- a/plinth/modules/ikiwiki/__init__.py +++ b/plinth/modules/ikiwiki/__init__.py @@ -35,12 +35,12 @@ def init(): """Initialize the ikiwiki module.""" menu = cfg.main_menu.get('apps:index') - menu.add_urlname(_('Wiki & Blog (Ikiwiki)'), 'glyphicon-edit', + menu.add_urlname(_('Wiki and Blog (ikiwiki)'), 'glyphicon-edit', 'ikiwiki:index', 1100) global service service = service_module.Service( - 'ikiwiki', _('Ikiwiki wikis and blogs'), ['http', 'https'], + 'ikiwiki', _('ikiwiki wikis and blogs'), ['http', 'https'], is_external=True, enabled=is_enabled()) diff --git a/plinth/modules/ikiwiki/forms.py b/plinth/modules/ikiwiki/forms.py index 4c711c738..11d3c8020 100644 --- a/plinth/modules/ikiwiki/forms.py +++ b/plinth/modules/ikiwiki/forms.py @@ -26,7 +26,7 @@ class IkiwikiForm(forms.Form): """ikiwiki configuration form.""" enabled = forms.BooleanField( - label=_('Enable Ikiwiki'), + label=_('Enable ikiwiki'), required=False) diff --git a/plinth/modules/ikiwiki/templates/ikiwiki_delete.html b/plinth/modules/ikiwiki/templates/ikiwiki_delete.html index 19f00e291..ce7135096 100644 --- a/plinth/modules/ikiwiki/templates/ikiwiki_delete.html +++ b/plinth/modules/ikiwiki/templates/ikiwiki_delete.html @@ -25,14 +25,15 @@

{% blocktrans trimmed %} - Delete Wiki/Blog {{ name }} + Delete Wiki or Blog {{ name }} {% endblocktrans %}

{% blocktrans trimmed %} This action will remove all the posts, pages and comments - including revision history. Delete this wiki/blog permanently? + including revision history. Delete this wiki or blog + permanently? {% endblocktrans %}

diff --git a/plinth/modules/ikiwiki/views.py b/plinth/modules/ikiwiki/views.py index b8e2d6750..37bfaf5c3 100644 --- a/plinth/modules/ikiwiki/views.py +++ b/plinth/modules/ikiwiki/views.py @@ -41,7 +41,7 @@ def on_install(): - """Enable Ikiwiki on install.""" + """Enable ikiwiki on install.""" actions.superuser_run('ikiwiki', ['setup']) ikiwiki.service.notify_enabled(None, True) @@ -70,7 +70,7 @@ def index(request): form = IkiwikiForm(initial=status, prefix='ikiwiki') return TemplateResponse(request, 'ikiwiki.html', - {'title': _('Wiki & Blog'), + {'title': _('Wiki and Blog'), 'status': status, 'form': form, 'subsubmenu': subsubmenu}) @@ -129,7 +129,7 @@ def create(request): form = IkiwikiCreateForm(prefix='ikiwiki') return TemplateResponse(request, 'ikiwiki_create.html', - {'title': _('Create Wiki/Blog'), + {'title': _('Create Wiki or Blog'), 'form': form, 'subsubmenu': subsubmenu}) @@ -179,6 +179,6 @@ def delete(request, name): return redirect(reverse_lazy('ikiwiki:manage')) return TemplateResponse(request, 'ikiwiki_delete.html', - {'title': _('Delete Wiki/Blog'), + {'title': _('Delete Wiki or Blog'), 'subsubmenu': subsubmenu, 'name': name}) diff --git a/plinth/modules/networks/templates/connection_show.html b/plinth/modules/networks/templates/connection_show.html index 9ef544235..750f8dee9 100644 --- a/plinth/modules/networks/templates/connection_show.html +++ b/plinth/modules/networks/templates/connection_show.html @@ -320,7 +320,7 @@

{% trans "Security" %}

This interface is not maintained by {{ box_name }}. Its security status is unknown to {{ box_name }}. Many {{ box_name }} services may not be available on this interface. It is - recommended that you deactivate/delete this connection and + recommended that you deactivate or delete this connection and re-configure it. {% endblocktrans %}
diff --git a/plinth/modules/openvpn/templates/openvpn.html b/plinth/modules/openvpn/templates/openvpn.html index 654c47722..d2ff0c5d8 100644 --- a/plinth/modules/openvpn/templates/openvpn.html +++ b/plinth/modules/openvpn/templates/openvpn.html @@ -37,7 +37,7 @@

{% trans "Virtual Private Network (OpenVPN)" %}

{% blocktrans trimmed %} Virtual Private Network (VPN) is a technique for securely - connecting two machines in order to access resources of a + connecting two devices in order to access resources of a private network. While you are away from home, you can connect to your {{ box_name }} in order to join your home network and access private/internal services provided by {{ box_name }}. diff --git a/plinth/modules/tor/tor.py b/plinth/modules/tor/tor.py index d4f430284..cb93235b4 100644 --- a/plinth/modules/tor/tor.py +++ b/plinth/modules/tor/tor.py @@ -51,7 +51,7 @@ class TorForm(forms.Form): # pylint: disable=W0232 required=False, help_text=format_lazy(_( 'A hidden service will allow {box_name} to provide selected ' - 'services (such as ownCloud or Chat) without revealing its ' + 'services (such as ownCloud or chat) without revealing its ' 'location.'), box_name=_(cfg.box_name))) apt_transport_tor_enabled = forms.BooleanField( label=_('Download software packages over Tor'), From d32bfa1dd6f5d877714bb283d372c2efeef2f03c Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sun, 24 Jan 2016 01:07:55 +0530 Subject: [PATCH 023/189] Update fake translations --- plinth/locale/fake/LC_MESSAGES/django.po | 983 ++++++++++++++--------- 1 file changed, 609 insertions(+), 374 deletions(-) diff --git a/plinth/locale/fake/LC_MESSAGES/django.po b/plinth/locale/fake/LC_MESSAGES/django.po index d9b001ae4..3e616b71d 100644 --- a/plinth/locale/fake/LC_MESSAGES/django.po +++ b/plinth/locale/fake/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: Plinth 0.6\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-12-20 13:58+0530\n" -"PO-Revision-Date: 2015-12-20 13:57+0530\n" +"POT-Creation-Date: 2016-01-24 12:26+0530\n" +"PO-Revision-Date: 2016-01-24 12:16+0530\n" "Last-Translator: Sunil Mohan Adapa \n" "Language-Team: Plinth Developers \n" @@ -49,11 +49,15 @@ msgstr "CONNECT TO {host}:{port}" msgid "Cannot connect to {host}:{port}" msgstr "CANNOT CONNECT TO {host}:{port}" +#: plinth/context_processors.py:36 +msgid "FreedomBox" +msgstr "FREEDOMBOX" + #: plinth/modules/apps/apps.py:26 msgid "Apps" msgstr "APPS" -#: plinth/modules/apps/apps.py:32 plinth/templates/base.html.py:90 +#: plinth/modules/apps/apps.py:32 plinth/templates/base.html.py:93 msgid "Applications" msgstr "APPLICATIONS" @@ -95,17 +99,18 @@ msgid "Enable service discovery" msgstr "ENABLE SERVICE DISCOVERY" #: plinth/modules/avahi/templates/avahi.html:29 +#, python-format msgid "" -"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 " +"Service discovery allows other devices on the network to discover your " +"%(box_name)s and services running on it. It also allows %(box_name)s to " +"discover other devices 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." msgstr "" -"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 " +"SERVICE DISCOVERY ALLOWS OTHER DEVICES ON THE NETWORK TO DISCOVER YOUR " +"%(box_name)s AND SERVICES RUNNING ON IT. IT ALSO ALLOWS %(box_name)s TO " +"DISCOVER OTHER DEVICES 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." @@ -113,7 +118,7 @@ msgstr "" #: plinth/modules/avahi/templates/avahi.html:40 #: plinth/modules/datetime/templates/datetime.html:35 #: plinth/modules/deluge/templates/deluge.html:39 -#: plinth/modules/dynamicdns/dynamicdns.py:38 +#: plinth/modules/dynamicdns/dynamicdns.py:39 #: plinth/modules/firewall/templates/firewall.html:57 #: plinth/modules/mumble/templates/mumble.html:44 #: plinth/modules/networks/templates/connection_show.html:261 @@ -173,12 +178,12 @@ msgstr "UPDATE SETUP" #: plinth/modules/avahi/views.py:73 plinth/modules/datetime/views.py:85 #: plinth/modules/deluge/views.py:80 -#: plinth/modules/dynamicdns/dynamicdns.py:368 +#: plinth/modules/dynamicdns/dynamicdns.py:371 #: plinth/modules/ikiwiki/views.py:95 plinth/modules/mumble/views.py:80 #: plinth/modules/openvpn/views.py:142 plinth/modules/privoxy/views.py:83 #: plinth/modules/quassel/views.py:76 plinth/modules/restore/views.py:68 #: plinth/modules/roundcube/views.py:84 plinth/modules/shaarli/views.py:74 -#: plinth/modules/transmission/views.py:105 plinth/modules/xmpp/views.py:100 +#: plinth/modules/transmission/views.py:109 plinth/modules/xmpp/views.py:100 msgid "Configuration updated" msgstr "CONFIGURATION UPDATED" @@ -188,68 +193,70 @@ msgstr "CONFIGURATION UPDATED" #: plinth/modules/owncloud/owncloud.py:93 plinth/modules/privoxy/views.py:85 #: plinth/modules/quassel/views.py:78 plinth/modules/restore/views.py:70 #: plinth/modules/roundcube/views.py:86 plinth/modules/shaarli/views.py:76 -#: plinth/modules/tor/tor.py:250 plinth/modules/transmission/views.py:107 -#: plinth/modules/upgrades/views.py:103 plinth/modules/xmpp/views.py:102 +#: plinth/modules/tor/tor.py:252 plinth/modules/transmission/views.py:111 +#: plinth/modules/upgrades/views.py:118 plinth/modules/xmpp/views.py:102 msgid "Setting unchanged" msgstr "SETTING UNCHANGED" -#: plinth/modules/config/config.py:83 plinth/modules/config/config.py:120 -#: plinth/modules/dynamicdns/dynamicdns.py:145 +#: plinth/modules/config/config.py:84 plinth/modules/config/config.py:121 +#: plinth/modules/dynamicdns/dynamicdns.py:148 msgid "Invalid domain name" msgstr "INVALID DOMAIN NAME" -#: plinth/modules/config/config.py:94 +#: plinth/modules/config/config.py:95 msgid "Hostname" msgstr "HOSTNAME" -#: plinth/modules/config/config.py:96 +#: plinth/modules/config/config.py:97 +#, python-brace-format msgid "" -"Hostname is the local name by which other machines on the local network " -"reach your machine. It must start and end with an alphabet or a digit and " -"have as interior characters only alphabets, digits and hyphens. Total " +"Hostname is the local name by which other devices on the local network can " +"reach your {box_name}. It must start and end with an alphabet or a digit " +"and have as interior characters only alphabets, digits and hyphens. Total " "length must be 63 characters or less." msgstr "" -"HOSTNAME IS THE LOCAL NAME BY WHICH OTHER MACHINES ON THE LOCAL NETWORK " -"REACH YOUR MACHINE. IT MUST START AND END WITH AN ALPHABET OR A DIGIT AND " -"HAVE AS INTERIOR CHARACTERS ONLY ALPHABETS, DIGITS AND HYPHENS. TOTAL " +"HOSTNAME IS THE LOCAL NAME BY WHICH OTHER DEVICES ON THE LOCAL NETWORK CAN " +"REACH YOUR {box_name}. IT MUST START AND END WITH AN ALPHABET OR A DIGIT " +"AND HAVE AS INTERIOR CHARACTERS ONLY ALPHABETS, DIGITS AND HYPHENS. TOTAL " "LENGTH MUST BE 63 CHARACTERS OR LESS." -#: plinth/modules/config/config.py:104 +#: plinth/modules/config/config.py:105 msgid "Invalid hostname" msgstr "INVALID HOSTNAME" -#: plinth/modules/config/config.py:107 plinth/modules/config/config.py:153 +#: plinth/modules/config/config.py:108 plinth/modules/config/config.py:153 #: plinth/modules/config/config.py:265 -#: plinth/modules/dynamicdns/dynamicdns.py:140 +#: plinth/modules/dynamicdns/dynamicdns.py:143 msgid "Domain Name" msgstr "DOMAIN NAME" -#: plinth/modules/config/config.py:109 +#: plinth/modules/config/config.py:110 +#, python-brace-format msgid "" -"Domain name is the global name by which other machines on the Internet can " -"reach you. It must consist of labels separated by dots. Each label must " -"start and end with an alphabet or a digit and have as interior characters " -"only alphabets, digits and hyphens. Length of each label must be 63 " -"characters or less. Total length of domain name must be 253 characters or " -"less." -msgstr "" -"DOMAIN NAME IS THE GLOBAL NAME BY WHICH OTHER MACHINES ON THE INTERNET CAN " -"REACH YOU. IT MUST CONSIST OF LABELS SEPARATED BY DOTS. EACH LABEL MUST " -"START AND END WITH AN ALPHABET OR A DIGIT AND HAVE AS INTERIOR CHARACTERS " -"ONLY ALPHABETS, DIGITS AND HYPHENS. LENGTH OF EACH LABEL MUST BE 63 " -"CHARACTERS OR LESS. TOTAL LENGTH OF DOMAIN NAME MUST BE 253 CHARACTERS OR " -"LESS." - -#: plinth/modules/config/config.py:124 +"Domain name is the global name by which other devices on the Internet can " +"reach your {box_name}. It must consist of labels separated by dots. Each " +"label must start and end with an alphabet or a digit and have as interior " +"characters only alphabets, digits and hyphens. Length of each label must be " +"63 characters or less. Total length of domain name must be 253 characters " +"or less." +msgstr "" +"DOMAIN NAME IS THE GLOBAL NAME BY WHICH OTHER DEVICES ON THE INTERNET CAN " +"REACH YOUR {box_name}. IT MUST CONSIST OF LABELS SEPARATED BY DOTS. EACH " +"LABEL MUST START AND END WITH AN ALPHABET OR A DIGIT AND HAVE AS INTERIOR " +"CHARACTERS ONLY ALPHABETS, DIGITS AND HYPHENS. LENGTH OF EACH LABEL MUST BE " +"63 CHARACTERS OR LESS. TOTAL LENGTH OF DOMAIN NAME MUST BE 253 CHARACTERS " +"OR LESS." + +#: plinth/modules/config/config.py:125 msgid "Language" msgstr "LANGUAGE" -#: plinth/modules/config/config.py:126 -msgid "Language for this FreedomBox web administration interface" -msgstr "LANGUAGE FOR THIS FREEDOMBOX WEB ADMINISTRATION INTERFACE" +#: plinth/modules/config/config.py:127 +msgid "Language for this web administration interface" +msgstr "LANGUAGE FOR THIS WEB ADMINISTRATION INTERFACE" #: plinth/modules/config/config.py:135 -#: plinth/modules/dynamicdns/dynamicdns.py:36 +#: plinth/modules/dynamicdns/dynamicdns.py:37 #: plinth/modules/ikiwiki/views.py:36 msgid "Configure" msgstr "CONFIGURE" @@ -445,16 +452,16 @@ msgstr "TEST" msgid "Result" msgstr "RESULT" -#: plinth/modules/dynamicdns/dynamicdns.py:34 plinth/modules/help/help.py:40 +#: plinth/modules/dynamicdns/dynamicdns.py:35 plinth/modules/help/help.py:40 msgid "About" msgstr "ABOUT" -#: plinth/modules/dynamicdns/dynamicdns.py:44 -#: plinth/modules/dynamicdns/dynamicdns.py:53 +#: plinth/modules/dynamicdns/dynamicdns.py:45 +#: plinth/modules/dynamicdns/dynamicdns.py:54 msgid "Dynamic DNS" msgstr "DYNAMIC DNS" -#: plinth/modules/dynamicdns/dynamicdns.py:70 +#: plinth/modules/dynamicdns/dynamicdns.py:71 msgid "" "The Variables <User>, <Pass>, <Ip>, <Domain> may be " "used within the URL. For details see the update URL templates of the example " @@ -464,7 +471,7 @@ msgstr "" "USED WITHIN THE URL. FOR DETAILS SEE THE UPDATE URL TEMPLATES OF THE EXAMPLE " "PROVIDERS." -#: plinth/modules/dynamicdns/dynamicdns.py:74 +#: plinth/modules/dynamicdns/dynamicdns.py:75 msgid "" "Please choose an update protocol according to your provider. If your " "provider does not support the GnudIP protocol or your provider is not listed " @@ -474,23 +481,24 @@ msgstr "" "PROVIDER DOES NOT SUPPORT THE GNUDIP PROTOCOL OR YOUR PROVIDER IS NOT LISTED " "YOU MAY USE THE UPDATE URL OF YOUR PROVIDER." -#: plinth/modules/dynamicdns/dynamicdns.py:79 +#: plinth/modules/dynamicdns/dynamicdns.py:80 msgid "" "Please do not enter a URL here (like \"https://example.com/\") but only the " -"hostname of the GnuDIP server (like \"example.pcom\")." +"hostname of the GnuDIP server (like \"example.com\")." msgstr "" "PLEASE DO NOT ENTER A URL HERE (LIKE \"HTTPS://EXAMPLE.COM/\") BUT ONLY THE " -"HOSTNAME OF THE GNUDIP SERVER (LIKE \"EXAMPLE.PCOM\")." +"HOSTNAME OF THE GNUDIP SERVER (LIKE \"EXAMPLE.COM\")." -#: plinth/modules/dynamicdns/dynamicdns.py:83 -msgid "The public domain name you want use to reach your box." -msgstr "THE PUBLIC DOMAIN NAME YOU WANT USE TO REACH YOUR BOX." +#: plinth/modules/dynamicdns/dynamicdns.py:84 +#, python-brace-format +msgid "The public domain name you want use to reach your {box_name}." +msgstr "THE PUBLIC DOMAIN NAME YOU WANT USE TO REACH YOUR {box_name}." -#: plinth/modules/dynamicdns/dynamicdns.py:85 +#: plinth/modules/dynamicdns/dynamicdns.py:87 msgid "Use this option if your provider uses self signed certificates." msgstr "USE THIS OPTION IF YOUR PROVIDER USES SELF SIGNED CERTIFICATES." -#: plinth/modules/dynamicdns/dynamicdns.py:88 +#: plinth/modules/dynamicdns/dynamicdns.py:90 msgid "" "If this option is selected, your username and password will be used for HTTP " "basic authentication." @@ -498,25 +506,26 @@ msgstr "" "IF THIS OPTION IS SELECTED, YOUR USERNAME AND PASSWORD WILL BE USED FOR HTTP " "BASIC AUTHENTICATION." -#: plinth/modules/dynamicdns/dynamicdns.py:91 +#: plinth/modules/dynamicdns/dynamicdns.py:93 msgid "" "Leave this field empty if you want to keep your previous configured password." msgstr "" "LEAVE THIS FIELD EMPTY IF YOU WANT TO KEEP YOUR PREVIOUS CONFIGURED PASSWORD." -#: plinth/modules/dynamicdns/dynamicdns.py:94 +#: plinth/modules/dynamicdns/dynamicdns.py:96 +#, python-brace-format msgid "" -"Optional Value. If your FreedomBox is not connected directly to the Internet " +"Optional Value. If your {box_name} is not connected directly to the Internet " "(i.e. connected to a NAT router) this URL is used to figure out the real " -"Internet IP. The URL should simply return the IP wherethe client comes from. " -"Example: http://myip.datasystems24.de" +"Internet IP. The URL should simply return the IP where the client comes from " +"(example: http://myip.datasystems24.de)." msgstr "" -"OPTIONAL VALUE. IF YOUR FREEDOMBOX IS NOT CONNECTED DIRECTLY TO THE INTERNET " +"OPTIONAL VALUE. IF YOUR {box_name} IS NOT CONNECTED DIRECTLY TO THE INTERNET " "(I.E. CONNECTED TO A NAT ROUTER) THIS URL IS USED TO FIGURE OUT THE REAL " -"INTERNET IP. THE URL SHOULD SIMPLY RETURN THE IP WHERETHE CLIENT COMES FROM. " -"EXAMPLE: HTTP://MYIP.DATASYSTEMS24.DE" +"INTERNET IP. THE URL SHOULD SIMPLY RETURN THE IP WHERE THE CLIENT COMES FROM " +"(EXAMPLE: HTTP://MYIP.DATASYSTEMS24.DE)." -#: plinth/modules/dynamicdns/dynamicdns.py:101 +#: plinth/modules/dynamicdns/dynamicdns.py:104 msgid "" "You should have been requested to select a username when you created the " "account." @@ -524,89 +533,91 @@ msgstr "" "YOU SHOULD HAVE BEEN REQUESTED TO SELECT A USERNAME WHEN YOU CREATED THE " "ACCOUNT." -#: plinth/modules/dynamicdns/dynamicdns.py:112 +#: plinth/modules/dynamicdns/dynamicdns.py:115 msgid "Enable Dynamic DNS" msgstr "ENABLE DYNAMIC DNS" -#: plinth/modules/dynamicdns/dynamicdns.py:115 +#: plinth/modules/dynamicdns/dynamicdns.py:118 msgid "Service type" msgstr "SERVICE TYPE" -#: plinth/modules/dynamicdns/dynamicdns.py:120 +#: plinth/modules/dynamicdns/dynamicdns.py:123 msgid "GnudIP Server Address" msgstr "GNUDIP SERVER ADDRESS" -#: plinth/modules/dynamicdns/dynamicdns.py:125 +#: plinth/modules/dynamicdns/dynamicdns.py:128 msgid "Invalid server name" msgstr "INVALID SERVER NAME" -#: plinth/modules/dynamicdns/dynamicdns.py:128 +#: plinth/modules/dynamicdns/dynamicdns.py:131 msgid "Update URL" msgstr "UPDATE URL" -#: plinth/modules/dynamicdns/dynamicdns.py:132 -msgid "accept all SSL certificates" +#: plinth/modules/dynamicdns/dynamicdns.py:135 +msgid "Accept all SSL certificates" msgstr "ACCEPT ALL SSL CERTIFICATES" -#: plinth/modules/dynamicdns/dynamicdns.py:136 -msgid "use HTTP basic authentication" +#: plinth/modules/dynamicdns/dynamicdns.py:139 +msgid "Use HTTP basic authentication" msgstr "USE HTTP BASIC AUTHENTICATION" -#: plinth/modules/dynamicdns/dynamicdns.py:148 -#: plinth/modules/networks/forms.py:118 plinth/modules/transmission/forms.py:39 +#: plinth/modules/dynamicdns/dynamicdns.py:151 +#: plinth/modules/networks/forms.py:146 plinth/modules/transmission/forms.py:39 msgid "Username" msgstr "USERNAME" -#: plinth/modules/dynamicdns/dynamicdns.py:151 -#: plinth/modules/networks/forms.py:119 plinth/modules/transmission/forms.py:43 +#: plinth/modules/dynamicdns/dynamicdns.py:154 +#: plinth/modules/networks/forms.py:147 plinth/modules/transmission/forms.py:43 msgid "Password" msgstr "PASSWORD" -#: plinth/modules/dynamicdns/dynamicdns.py:154 -msgid "show password" +#: plinth/modules/dynamicdns/dynamicdns.py:157 +#: plinth/modules/networks/forms.py:149 +msgid "Show password" msgstr "SHOW PASSWORD" -#: plinth/modules/dynamicdns/dynamicdns.py:158 +#: plinth/modules/dynamicdns/dynamicdns.py:161 msgid "IP check URL" msgstr "IP CHECK URL" -#: plinth/modules/dynamicdns/dynamicdns.py:184 +#: plinth/modules/dynamicdns/dynamicdns.py:187 msgid "Please provide update URL or a GnuDIP Server" msgstr "PLEASE PROVIDE UPDATE URL OR A GNUDIP SERVER" -#: plinth/modules/dynamicdns/dynamicdns.py:187 +#: plinth/modules/dynamicdns/dynamicdns.py:190 msgid "Please provide GnuDIP username" msgstr "PLEASE PROVIDE GNUDIP USERNAME" -#: plinth/modules/dynamicdns/dynamicdns.py:190 +#: plinth/modules/dynamicdns/dynamicdns.py:193 msgid "Please provide GnuDIP domain" msgstr "PLEASE PROVIDE GNUDIP DOMAIN" -#: plinth/modules/dynamicdns/dynamicdns.py:195 +#: plinth/modules/dynamicdns/dynamicdns.py:198 msgid "Please provide a password" msgstr "PLEASE PROVIDE A PASSWORD" -#: plinth/modules/dynamicdns/dynamicdns.py:214 +#: plinth/modules/dynamicdns/dynamicdns.py:217 msgid "Configure Dynamic DNS" msgstr "CONFIGURE DYNAMIC DNS" -#: plinth/modules/dynamicdns/dynamicdns.py:236 +#: plinth/modules/dynamicdns/dynamicdns.py:239 msgid "Status of Dynamic DNS" msgstr "STATUS OF DYNAMIC DNS" #: plinth/modules/dynamicdns/templates/dynamicdns.html:25 -msgid "DynamicDNS client" -msgstr "DYNAMICDNS CLIENT" +msgid "Dynamic DNS Client" +msgstr "DYNAMIC DNS CLIENT" #: plinth/modules/dynamicdns/templates/dynamicdns.html:28 +#, python-format msgid "" "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)." +"may find the services which are provided by %(box_name)s, such as ownCloud." msgstr "" "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)." +"MAY FIND THE SERVICES WHICH ARE PROVIDED BY %(box_name)s, SUCH AS OWNCLOUD." #: plinth/modules/dynamicdns/templates/dynamicdns.html:37 msgid "" @@ -615,7 +626,7 @@ msgid "" "allows you to push your current public IP address to an gnudip 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." +"Internet asks for your DNS name he will get your current IP answered." msgstr "" "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 " @@ -639,14 +650,14 @@ msgstr "" "FREEDNS.AFRAID.ORG." #: plinth/modules/dynamicdns/templates/dynamicdns.html:61 +#, python-format msgid "" -"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." +"If your %(box_name)s is connected behind some NAT router, don't forget to " +"add port forwarding (i.e. forward some standard ports like 80 and 443)." msgstr "" -"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." +"IF YOUR %(box_name)s IS CONNECTED BEHIND SOME NAT ROUTER, DON'T FORGET TO " +"ADD PORT FORWARDING (I.E. FORWARD SOME STANDARD PORTS LIKE 80 AND 443) TO " +"YOUR %(box_name)s DEVICE." #: plinth/modules/dynamicdns/templates/dynamicdns_configure.html:30 msgid "" @@ -669,21 +680,21 @@ msgstr "" "NOT DETECT A NAT TYPE." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:35 -msgid "Direct connection to the internet." +msgid "Direct connection to the Internet." msgstr "DIRECT CONNECTION TO THE INTERNET." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:37 #, python-format msgid "" -"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)s minutes until we " -"update your DNS entry in case of WAN IP change." +"Behind NAT. This means that Dynamic DNS service will poll the \"IP check URL" +"\" for changes (the \"IP check URL\" entry is needed for this - otherwise IP " +"changes will not be detected). In case the WAN IP changes, it may take up " +"to %(timer)s minutes until your DNS entry is updated." msgstr "" -"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)s MINUTES UNTIL WE " -"UPDATE YOUR DNS ENTRY IN CASE OF WAN IP CHANGE." +"BEHIND NAT. THIS MEANS THAT DYNAMIC DNS SERVICE WILL POLL THE \"IP CHECK URL" +"\" FOR CHANGES (THE \"IP CHECK URL\" ENTRY IS NEEDED FOR THIS - OTHERWISE IP " +"CHANGES WILL NOT BE DETECTED). IN CASE THE WAN IP CHANGES, IT MAY TAKE UP " +"TO %(timer)s MINUTES UNTIL YOUR DNS ENTRY IS UPDATED." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:48 msgid "Last update" @@ -698,17 +709,17 @@ msgstr "FIREWALL" #: plinth/modules/firewall/templates/firewall.html:28 #, python-format msgid "" -"Firewall is a network security system that controls the incoming and " -"outgoing network traffic on your %(box_name)s. Keeping a firewall enabled " -"and properly configured reduces risk of security threat from the Internet." +"Firewall is a security system that controls the incoming and outgoing " +"network traffic on your %(box_name)s. Keeping a firewall enabled and " +"properly configured reduces risk of security threat from the Internet." msgstr "" -"FIREWALL IS A NETWORK SECURITY SYSTEM THAT CONTROLS THE INCOMING AND " -"OUTGOING NETWORK TRAFFIC ON YOUR %(box_name)s. KEEPING A FIREWALL ENABLED " -"AND PROPERLY CONFIGURED REDUCES RISK OF SECURITY THREAT FROM THE INTERNET." +"FIREWALL IS A SECURITY SYSTEM THAT CONTROLS THE INCOMING AND OUTGOING " +"NETWORK TRAFFIC ON YOUR %(box_name)s. KEEPING A FIREWALL ENABLED AND " +"PROPERLY CONFIGURED REDUCES RISK OF SECURITY THREAT FROM THE INTERNET." #: plinth/modules/firewall/templates/firewall.html:36 -msgid "The following is the current status:" -msgstr "THE FOLLOWING IS THE CURRENT STATUS:" +msgid "Current status:" +msgstr "CURRENT STATUS:" #: plinth/modules/firewall/templates/firewall.html:41 #, python-format @@ -728,11 +739,13 @@ msgid "Service/Port" msgstr "SERVICE/PORT" #: plinth/modules/firewall/templates/firewall.html:67 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:91 #: plinth/modules/names/templates/names.html:51 msgid "Enabled" msgstr "ENABLED" #: plinth/modules/firewall/templates/firewall.html:70 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:93 #: plinth/modules/names/templates/names.html:53 msgid "Disabled" msgstr "DISABLED" @@ -756,12 +769,12 @@ msgstr "BLOCKED" #: plinth/modules/firewall/templates/firewall.html:103 msgid "" "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." +"also permitted in the firewall and when you disable a service it is also " +"disabled in the firewall." msgstr "" "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." +"ALSO PERMITTED IN THE FIREWALL AND WHEN YOU DISABLE A SERVICE IT IS ALSO " +"DISABLED IN THE FIREWALL." #: plinth/modules/first_boot/forms.py:48 plinth/modules/users/forms.py:70 msgid "Creating LDAP user failed." @@ -775,25 +788,30 @@ msgstr "FAILED TO ADD NEW USER TO ADMIN GROUP." msgid "User account created, you are now logged in" msgstr "USER ACCOUNT CREATED, YOU ARE NOW LOGGED IN" -#: plinth/modules/first_boot/templates/firstboot_state0.html:50 -msgid "Congratulations! Your FreedomBox is up and running!" -msgstr "CONGRATULATIONS! YOUR FREEDOMBOX IS UP AND RUNNING!" +#: plinth/modules/first_boot/templates/firstboot_navbar.html:23 +#: plinth/modules/help/templates/help_index.html:25 +#: plinth/templates/base.html:102 +msgid "Help" +msgstr "HELP" + +#: plinth/modules/first_boot/templates/firstboot_state0.html:45 +msgid "Start Setup" +msgstr "START SETUP" -#: plinth/modules/first_boot/templates/firstboot_state0.html:54 +#: plinth/modules/first_boot/templates/firstboot_state0.html:49 +#, python-format msgid "" -"Please provide the following basic information to complete the setup process." +"To complete the setup of your %(box_name)s, please provide some basic " +"information." msgstr "" -"PLEASE PROVIDE THE FOLLOWING BASIC INFORMATION TO COMPLETE THE SETUP PROCESS." +"TO COMPLETE THE SETUP OF YOUR %(box_name)s, PLEASE PROVIDE SOME BASIC " +"INFORMATION." -#: plinth/modules/first_boot/templates/firstboot_state0.html:62 -msgid "Next" -msgstr "NEXT" - -#: plinth/modules/first_boot/templates/firstboot_state1.html:39 +#: plinth/modules/first_boot/templates/firstboot_state1.html:41 msgid "Administrator Account" msgstr "ADMINISTRATOR ACCOUNT" -#: plinth/modules/first_boot/templates/firstboot_state1.html:42 +#: plinth/modules/first_boot/templates/firstboot_state1.html:44 msgid "" "Choose a username and password to access this web interface. The password " "can be changed later. This user will be granted administrative privileges. " @@ -803,7 +821,7 @@ msgstr "" "CAN BE CHANGED LATER. THIS USER WILL BE GRANTED ADMINISTRATIVE PRIVILEGES. " "OTHER USERS CAN BE ADDED LATER." -#: plinth/modules/first_boot/templates/firstboot_state1.html:55 +#: plinth/modules/first_boot/templates/firstboot_state1.html:57 msgid "Box it up!" msgstr "BOX IT UP!" @@ -812,35 +830,37 @@ msgid "Setup Complete!" msgstr "SETUP COMPLETE!" #: plinth/modules/first_boot/templates/firstboot_state10.html:32 +#, python-format msgid "" -"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." +"%(box_name)s setup is now complete. To make your %(box_name)s functional, " +"you need some applications. They will be installed the first time you " +"access them." msgstr "" -"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." +"%(box_name)s SETUP IS NOW COMPLETE. TO MAKE YOUR %(box_name)s FUNCTIONAL, \n" +"YOU NEED SOME APPLICATIONS. THEY WILL BE INSTALLED THE FIRST TIME \n" +"YOU ACCESS THEM." -#: plinth/modules/first_boot/templates/firstboot_state10.html:40 -msgid "" -"To make your FreedomBox functional, you need some applications. " -"Applications will be installed the first time you access them." -msgstr "" -"TO MAKE YOUR FREEDOMBOX FUNCTIONAL, YOU NEED SOME APPLICATIONS. APPLICATIONS " -"WILL BE INSTALLED THE FIRST TIME YOU ACCESS THEM." +#: plinth/modules/first_boot/templates/firstboot_state10.html:41 +msgid "Go to Apps" +msgstr "GO TO APPS" + +#: plinth/modules/first_boot/templates/firstboot_state10.html:44 +msgid "Current Network Configuration" +msgstr "CURRENT NETWORK CONFIGURATION" #: plinth/modules/first_boot/templates/firstboot_state10.html:47 -msgid "Network Configuration" -msgstr "NETWORK CONFIGURATION" +msgid "" +"You should check the network setup and modify it if necessary. Do not forget " +"to change the default Wi-Fi passwords!" +msgstr "" +"YOU SHOULD CHECK THE NETWORK SETUP AND MODIFY IT IF NECESSARY. DO NOT " +"FORGET \n" +"TO CHANGE THE DEFAULT WI-FI PASSWORDS!" -#: plinth/modules/first_boot/templates/firstboot_state10.html:54 +#: plinth/modules/first_boot/templates/firstboot_state10.html:57 msgid "Go to Networks" msgstr "GO TO NETWORKS" -#: plinth/modules/first_boot/templates/firstboot_state10.html:59 -msgid "Go to Apps" -msgstr "GO TO APPS" - #: plinth/modules/first_boot/views.py:60 msgid "Setup Complete" msgstr "SETUP COMPLETE" @@ -853,9 +873,9 @@ msgstr "DOCUMENTATION" msgid "Where to Get Help" msgstr "WHERE TO GET HELP" -#: plinth/modules/help/help.py:38 plinth/modules/help/help.py:72 -msgid "FreedomBox Manual" -msgstr "FREEDOMBOX MANUAL" +#: plinth/modules/help/help.py:38 +msgid "Manual" +msgstr "MANUAL" #: plinth/modules/help/help.py:48 msgid "Documentation and FAQ" @@ -866,23 +886,29 @@ msgstr "DOCUMENTATION AND FAQ" msgid "About {box_name}" msgstr "ABOUT {box_name}" +#: plinth/modules/help/help.py:73 +#, python-brace-format +msgid "{box_name} Manual" +msgstr "{box_name} MANUAL" + #: plinth/modules/help/templates/help_about.html:30 +#, python-format msgid "" -"FreedomBox is a community project to develop, design and promote personal " +"%(box_name)s 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." +"and a Tor relay, on a device that can replace your Wi-Fi router, so that " +"your data stays with you." msgstr "" -"FREEDOMBOX IS A COMMUNITY PROJECT TO DEVELOP, DESIGN AND PROMOTE PERSONAL " +"%(box_name)s 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." +"AND A TOR RELAY, ON A DEVICE THAT CAN REPLACE YOUR WI-FI ROUTER, SO THAT " +"YOUR DATA STAYS WITH YOU." #: plinth/modules/help/templates/help_about.html:43 msgid "" @@ -901,82 +927,93 @@ msgstr "" "RETURNING THE INTERNET TO ITS INTENDED PEER-TO-PEER ARCHITECTURE." #: plinth/modules/help/templates/help_about.html:56 +#, python-format msgid "" "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." +"services; %(box_name)s aims to bring them all together in a convenient " +"package." msgstr "" "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." +"SERVICES; %(box_name)s AIMS TO BRING THEM ALL TOGETHER IN A CONVENIENT " +"PACKAGE." #: plinth/modules/help/templates/help_about.html:64 +#, python-format msgid "" -"For more information about the FreedomBox project, see the FreedomBox Wiki." +"For more information about the %(box_name)s project, see the %(box_name)s Wiki." msgstr "" -"FOR MORE INFORMATION ABOUT THE FREEDOMBOX PROJECT, SEE THE FREEDOMBOX WIKI." +"FOR MORE INFORMATION ABOUT THE %(box_name)s PROJECT, SEE THE %(box_name)s WIKI." -#: plinth/modules/help/templates/help_about.html:72 +#: plinth/modules/help/templates/help_about.html:73 msgid "Learn more »" msgstr "LEARN MORE »" -#: plinth/modules/help/templates/help_about.html:75 +#: plinth/modules/help/templates/help_about.html:76 #, python-format msgid "You are running Plinth version %(version)s." msgstr "YOU ARE RUNNING PLINTH VERSION %(version)s." -#: plinth/modules/help/templates/help_index.html:25 -#: plinth/templates/base.html:98 -msgid "Help" -msgstr "HELP" +#: plinth/modules/help/templates/help_base.html:36 +#, python-format +msgid "%(box_name)s Setup" +msgstr "%(box_name)s SETUP" #: plinth/modules/help/templates/help_index.html:29 #, python-format msgid "" -"The FreedomBox Manual is the best place to " +"The %(box_name)s Manual is the best place to " "start for information regarding %(box_name)s." msgstr "" -"THE FREEDOMBOX MANUAL IS THE BEST PLACE TO " +"THE %(box_name)s MANUAL IS THE BEST PLACE TO " "START FOR INFORMATION REGARDING %(box_name)s." #: plinth/modules/help/templates/help_index.html:36 +#, python-format msgid "" -" FreedomBox " -"project wiki contains further information." +" " +"%(box_name)s project wiki contains further information." msgstr "" -" FREEDOMBOX " -"PROJECT WIKI CONTAINS FURTHER INFORMATION." +" " +"%(box_name)s PROJECT WIKI CONTAINS FURTHER INFORMATION." #: plinth/modules/help/templates/help_index.html:43 +#, python-format msgid "" -"To seek help from FreedomBox community, queries may be posted on the " -"mailing list. The list archives also contain information about problems " -"faced by other users and possible solutions." +"To seek help from %(box_name)s community, queries may be posted on the mailing list. The list archives also contain information about " +"problems faced by other users and possible solutions." msgstr "" -"TO SEEK HELP FROM FREEDOMBOX COMMUNITY, QUERIES MAY BE POSTED ON THE " -"MAILING LIST. THE LIST ARCHIVES ALSO CONTAIN INFORMATION ABOUT PROBLEMS " -"FACED BY OTHER USERS AND POSSIBLE SOLUTIONS." +"TO SEEK HELP FROM %(box_name)s COMMUNITY, QUERIES MAY BE POSTED ON THE MAILING LIST. THE LIST ARCHIVES ALSO CONTAIN INFORMATION ABOUT " +"PROBLEMS FACED BY OTHER USERS AND POSSIBLE SOLUTIONS." #: plinth/modules/help/templates/help_index.html:53 +#, python-format msgid "" -"Many FreedomBox contributors and users are also available on the #freedombox " -"channel of the irc.oftc.net IRC network." +"Many %(box_name)s contributors and users are also available on the irc.oftc." +"net IRC network. Join and request help on the #freedombox " +"channel using the IRC web interface." msgstr "" -"MANY FREEDOMBOX CONTRIBUTORS AND USERS ARE ALSO AVAILABLE ON THE #FREEDOMBOX " -"CHANNEL OF THE IRC.OFTC.NET IRC NETWORK." +"MANY %(box_name)s CONTRIBUTORS AND USERS ARE ALSO AVAILABLE ON THE IRC.OFTC." +"NET IRC NETWORK. JOIN AND REQUEST HELP ON THE #FREEDOMBOX " +"CHANNEL USING THE IRC WEB INTERFACE." #: plinth/modules/ikiwiki/__init__.py:38 -msgid "Wiki & Blog (Ikiwiki)" -msgstr "WIKI & BLOG (IKIWIKI)" +msgid "Wiki and Blog (ikiwiki)" +msgstr "WIKI AND BLOG (IKIWIKI)" #: plinth/modules/ikiwiki/__init__.py:43 -msgid "Ikiwiki wikis and blogs" +msgid "ikiwiki wikis and blogs" msgstr "IKIWIKI WIKIS AND BLOGS" #: plinth/modules/ikiwiki/forms.py:29 -msgid "Enable Ikiwiki" +msgid "Enable ikiwiki" msgstr "ENABLE IKIWIKI" #: plinth/modules/ikiwiki/forms.py:36 @@ -1007,23 +1044,24 @@ msgstr "" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:27 #, python-format -msgid "Delete Wiki/Blog %(name)s" -msgstr "DELETE WIKI/BLOG %(name)s" +msgid "Delete Wiki or Blog %(name)s" +msgstr "DELETE WIKI OR BLOG %(name)s" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:33 msgid "" "This action will remove all the posts, pages and comments including revision " -"history. Delete this wiki/blog permanently?" +"history. Delete this wiki or blog permanently?" msgstr "" "THIS ACTION WILL REMOVE ALL THE POSTS, PAGES AND COMMENTS INCLUDING REVISION " -"HISTORY. DELETE THIS WIKI/BLOG PERMANENTLY?" +"HISTORY. DELETE THIS WIKI OR BLOG PERMANENTLY?" -#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:43 +#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:44 #, python-format msgid "Delete %(name)s" msgstr "DELETE %(name)s" -#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:46 +#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:47 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:60 #: plinth/modules/networks/templates/connections_delete.html:41 #: plinth/modules/users/templates/users_delete.html:41 msgid "Cancel" @@ -1056,16 +1094,16 @@ msgid "Create" msgstr "CREATE" #: plinth/modules/ikiwiki/views.py:73 -msgid "Wiki & Blog" -msgstr "WIKI & BLOG" +msgid "Wiki and Blog" +msgstr "WIKI AND BLOG" #: plinth/modules/ikiwiki/views.py:106 msgid "Manage Wikis and Blogs" msgstr "MANAGE WIKIS AND BLOGS" #: plinth/modules/ikiwiki/views.py:132 -msgid "Create Wiki/Blog" -msgstr "CREATE WIKI/BLOG" +msgid "Create Wiki or Blog" +msgstr "CREATE WIKI OR BLOG" #: plinth/modules/ikiwiki/views.py:145 #, python-brace-format @@ -1098,8 +1136,162 @@ msgid "Could not delete {name}: {error}" msgstr "COULD NOT DELETE {name}: {error}" #: plinth/modules/ikiwiki/views.py:182 -msgid "Delete Wiki/Blog" -msgstr "DELETE WIKI/BLOG" +msgid "Delete Wiki or Blog" +msgstr "DELETE WIKI OR BLOG" + +#: plinth/modules/letsencrypt/__init__.py:43 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:38 +#: plinth/modules/letsencrypt/views.py:45 +msgid "Certificates (Let's Encrypt)" +msgstr "CERTIFICATES (LET'S ENCRYPT)" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:41 +#, python-format +msgid "" +"A digital certficate allows users of a web service to verify the identity of " +"the service and to securely communicate with it. %(box_name)s can " +"automatically obtain and setup digital certificates for each available " +"domain. It does so by proving itself to be the owner of a domain to Let's " +"Encrypt, a certficate authority (CA)." +msgstr "" +"A DIGITAL CERTFICATE ALLOWS USERS OF A WEB SERVICE TO VERIFY THE IDENTITY OF " +"THE SERVICE AND TO SECURELY COMMUNICATE WITH IT. %(box_name)s CAN " +"AUTOMATICALLY OBTAIN AND SETUP DIGITAL CERTIFICATES FOR EACH AVAILABLE " +"DOMAIN. IT DOES SO BY PROVING ITSELF TO BE THE OWNER OF A DOMAIN TO LET'S " +"ENCRYPT, A CERTFICATE AUTHORITY (CA)." + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:52 +msgid "" +"Let's Encrypt is a free, automated, and open certificate authority, run for " +"the public’s benefit by the Internet Security Research Group (ISRG). Please " +"read and agree with the Let's Encrypt Subscriber Agreement before using this service." +msgstr "" +"LET'S ENCRYPT IS A FREE, AUTOMATED, AND OPEN CERTIFICATE AUTHORITY, RUN FOR " +"THE PUBLIC’S BENEFIT BY THE INTERNET SECURITY RESEARCH GROUP (ISRG). PLEASE " +"READ AND AGREE WITH THE LET'S ENCRYPT SUBSCRIBER AGREEMENT BEFORE USING THIS SERVICE." + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:66 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:70 +msgid "Domain" +msgstr "DOMAIN" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:67 +msgid "Certificate Status" +msgstr "CERTIFICATE STATUS" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:68 +msgid "Website Security" +msgstr "WEBSITE SECURITY" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:69 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:72 +msgid "Actions" +msgstr "ACTIONS" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:79 +#, python-format +msgid "Expires on %(expiry_date)s" +msgstr "EXPIRES ON %(expiry_date)s" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:85 +msgid "No certficate" +msgstr "NO CERTFICATE" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:102 +msgid "Revoke" +msgstr "REVOKE" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:108 +msgid "Re-obtain" +msgstr "RE-OBTAIN" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:115 +msgid "Obtain" +msgstr "OBTAIN" + +#: plinth/modules/letsencrypt/views.py:55 +#, python-brace-format +msgid "Certificate successfully revoked for domain {domain}" +msgstr "CERTIFICATE SUCCESSFULLY REVOKED FOR DOMAIN {domain}" + +#: plinth/modules/letsencrypt/views.py:60 +#, python-brace-format +msgid "Failed to revoke certificate for domain {domain}: {error}" +msgstr "FAILED TO REVOKE CERTIFICATE FOR DOMAIN {domain}: {error}" + +#: plinth/modules/letsencrypt/views.py:72 +#, python-brace-format +msgid "Certificate successfully obtained for domain {domain}" +msgstr "CERTIFICATE SUCCESSFULLY OBTAINED FOR DOMAIN {domain}" + +#: plinth/modules/letsencrypt/views.py:77 +#, python-brace-format +msgid "Failed to obtain certificate for domain {domain}: {error}" +msgstr "FAILED TO OBTAIN CERTIFICATE FOR DOMAIN {domain}: {error}" + +#: plinth/modules/monkeysphere/__init__.py:32 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:35 +#: plinth/modules/monkeysphere/views.py:44 +msgid "Monkeysphere" +msgstr "MONKEYSPHERE" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:38 +msgid "" +"With Monkeysphere, a PGP key can be generated for each configured domain " +"serving SSH. The PGP public key can then be uploaded to the PGP keyservers. " +"Users connecting to this machine through SSH can verify that they are " +"connecting to the correct host. For users to trust the key, at least one " +"person (usually the machine owner) must sign the key using the regular PGP " +"key signing process. See the Monkeysphere SSH documentation for more details." +msgstr "" +"WITH MONKEYSPHERE, A PGP KEY CAN BE GENERATED FOR EACH CONFIGURED DOMAIN " +"SERVING SSH. THE PGP PUBLIC KEY CAN THEN BE UPLOADED TO THE PGP KEYSERVERS. " +"USERS CONNECTING TO THIS MACHINE THROUGH SSH CAN VERIFY THAT THEY ARE " +"CONNECTING TO THE CORRECT HOST. FOR USERS TO TRUST THE KEY, AT LEAST ONE " +"PERSON (USUALLY THE MACHINE OWNER) MUST SIGN THE KEY USING THE REGULAR PGP " +"KEY SIGNING PROCESS. SEE THE MONKEYSPHERE SSH DOCUMENTATION FOR MORE " +"DETAILS." + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:53 +msgid "Publishing key to keyserver..." +msgstr "PUBLISHING KEY TO KEYSERVER..." + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:71 +msgid "GPG Fingerprint" +msgstr "GPG FINGERPRINT" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:83 +#: plinth/modules/names/views.py:45 +msgid "Not Available" +msgstr "NOT AVAILABLE" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:93 +msgid "Generate PGP Key" +msgstr "GENERATE PGP KEY" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:101 +msgid "Publish Key" +msgstr "PUBLISH KEY" + +#: plinth/modules/monkeysphere/views.py:58 +msgid "Generated PGP key." +msgstr "GENERATED PGP KEY." + +#: plinth/modules/monkeysphere/views.py:83 +msgid "Cancelled key publishing." +msgstr "CANCELLED KEY PUBLISHING." + +#: plinth/modules/monkeysphere/views.py:120 +msgid "Published key to keyserver." +msgstr "PUBLISHED KEY TO KEYSERVER." + +#: plinth/modules/monkeysphere/views.py:122 +msgid "Error occurred while publishing key." +msgstr "ERROR OCCURRED WHILE PUBLISHING KEY." #: plinth/modules/mumble/__init__.py:38 #: plinth/modules/mumble/templates/mumble.html:26 @@ -1141,61 +1333,48 @@ msgstr "MUMBLE SERVER IS RUNNING" msgid "Mumble server is not running" msgstr "MUMBLE SERVER IS NOT RUNNING" -#: plinth/modules/names/__init__.py:30 +#: plinth/modules/names/__init__.py:29 msgid "HTTP" msgstr "HTTP" -#: plinth/modules/names/__init__.py:31 +#: plinth/modules/names/__init__.py:30 msgid "HTTPS" msgstr "HTTPS" -#: plinth/modules/names/__init__.py:32 +#: plinth/modules/names/__init__.py:31 msgid "SSH" msgstr "SSH" -#: plinth/modules/names/__init__.py:46 plinth/modules/names/views.py:34 +#: plinth/modules/names/__init__.py:45 plinth/modules/names/views.py:34 msgid "Name Services" msgstr "NAME SERVICES" -#: plinth/modules/names/__init__.py:107 -msgid "Not Available" -msgstr "NOT AVAILABLE" - #: plinth/modules/networks/__init__.py:108 #, python-brace-format msgid "Using DNSSEC on IPv{kind}" msgstr "USING DNSSEC ON IPV{kind}" #: plinth/modules/networks/forms.py:30 -msgid "-- select --" -msgstr "-- SELECT --" - -#: plinth/modules/networks/forms.py:42 msgid "Connection Type" msgstr "CONNECTION TYPE" -#: plinth/modules/networks/forms.py:49 plinth/modules/networks/forms.py:106 -#: plinth/modules/networks/forms.py:133 +#: plinth/modules/networks/forms.py:37 msgid "Connection Name" msgstr "CONNECTION NAME" -#: plinth/modules/networks/forms.py:51 plinth/modules/networks/forms.py:108 -#: plinth/modules/networks/forms.py:135 +#: plinth/modules/networks/forms.py:39 msgid "Physical Interface" msgstr "PHYSICAL INTERFACE" -#: plinth/modules/networks/forms.py:53 plinth/modules/networks/forms.py:110 -#: plinth/modules/networks/forms.py:137 +#: plinth/modules/networks/forms.py:41 msgid "The network device that this connection should be bound to." msgstr "THE NETWORK DEVICE THAT THIS CONNECTION SHOULD BE BOUND TO." -#: plinth/modules/networks/forms.py:56 plinth/modules/networks/forms.py:113 -#: plinth/modules/networks/forms.py:140 +#: plinth/modules/networks/forms.py:44 msgid "Firewall Zone" msgstr "FIREWALL ZONE" -#: plinth/modules/networks/forms.py:57 plinth/modules/networks/forms.py:114 -#: plinth/modules/networks/forms.py:141 +#: plinth/modules/networks/forms.py:45 msgid "" "The firewall zone will control which services are available over this " "interfaces. Select Internal only for trusted networks." @@ -1203,11 +1382,11 @@ msgstr "" "THE FIREWALL ZONE WILL CONTROL WHICH SERVICES ARE AVAILABLE OVER THIS " "INTERFACES. SELECT INTERNAL ONLY FOR TRUSTED NETWORKS." -#: plinth/modules/networks/forms.py:61 plinth/modules/networks/forms.py:162 +#: plinth/modules/networks/forms.py:49 msgid "IPv4 Addressing Method" msgstr "IPV4 ADDRESSING METHOD" -#: plinth/modules/networks/forms.py:62 +#: plinth/modules/networks/forms.py:50 msgid "" "\"Shared\" method will start a DHCP server and \"Automatic\" method will " "acquire configuration from a DHCP server." @@ -1215,15 +1394,15 @@ msgstr "" "\"SHARED\" METHOD WILL START A DHCP SERVER AND \"AUTOMATIC\" METHOD WILL " "ACQUIRE CONFIGURATION FROM A DHCP SERVER." -#: plinth/modules/networks/forms.py:68 plinth/modules/networks/forms.py:170 +#: plinth/modules/networks/forms.py:56 msgid "Address" msgstr "ADDRESS" -#: plinth/modules/networks/forms.py:72 plinth/modules/networks/forms.py:174 +#: plinth/modules/networks/forms.py:60 msgid "Netmask" msgstr "NETMASK" -#: plinth/modules/networks/forms.py:73 plinth/modules/networks/forms.py:175 +#: plinth/modules/networks/forms.py:61 msgid "" "Optional value. If left blank, a default netmask based on the address will " "be used." @@ -1231,21 +1410,21 @@ msgstr "" "OPTIONAL VALUE. IF LEFT BLANK, A DEFAULT NETMASK BASED ON THE ADDRESS WILL " "BE USED." -#: plinth/modules/networks/forms.py:78 plinth/modules/networks/forms.py:180 +#: plinth/modules/networks/forms.py:66 #: plinth/modules/networks/templates/connection_show.html:202 #: plinth/modules/networks/templates/connection_show.html:241 msgid "Gateway" msgstr "GATEWAY" -#: plinth/modules/networks/forms.py:79 plinth/modules/networks/forms.py:181 +#: plinth/modules/networks/forms.py:67 msgid "Optional value." msgstr "OPTIONAL VALUE." -#: plinth/modules/networks/forms.py:83 plinth/modules/networks/forms.py:185 +#: plinth/modules/networks/forms.py:71 msgid "DNS Server" msgstr "DNS SERVER" -#: plinth/modules/networks/forms.py:84 plinth/modules/networks/forms.py:186 +#: plinth/modules/networks/forms.py:72 msgid "" "Optional value. If this value is given and IPv4 addressing method is " "\"Automatic\", the DNS Servers provided by a DHCP server will be ignored." @@ -1253,11 +1432,11 @@ msgstr "" "OPTIONAL VALUE. IF THIS VALUE IS GIVEN AND IPV4 ADDRESSING METHOD IS " "\"AUTOMATIC\", THE DNS SERVERS PROVIDED BY A DHCP SERVER WILL BE IGNORED." -#: plinth/modules/networks/forms.py:90 plinth/modules/networks/forms.py:192 +#: plinth/modules/networks/forms.py:78 msgid "Second DNS Server" msgstr "SECOND DNS SERVER" -#: plinth/modules/networks/forms.py:91 plinth/modules/networks/forms.py:193 +#: plinth/modules/networks/forms.py:79 msgid "" "Optional value. If this value is given and IPv4 Addressing Method is " "\"Automatic\", the DNS Servers provided by a DHCP server will be ignored." @@ -1265,29 +1444,29 @@ msgstr "" "OPTIONAL VALUE. IF THIS VALUE IS GIVEN AND IPV4 ADDRESSING METHOD IS " "\"AUTOMATIC\", THE DNS SERVERS PROVIDED BY A DHCP SERVER WILL BE IGNORED." -#: plinth/modules/networks/forms.py:121 -msgid "Show password" -msgstr "SHOW PASSWORD" +#: plinth/modules/networks/forms.py:89 +msgid "-- select --" +msgstr "-- SELECT --" -#: plinth/modules/networks/forms.py:145 +#: plinth/modules/networks/forms.py:175 #: plinth/modules/networks/templates/connection_show.html:144 msgid "SSID" msgstr "SSID" -#: plinth/modules/networks/forms.py:146 +#: plinth/modules/networks/forms.py:176 msgid "The visible name of the network." msgstr "THE VISIBLE NAME OF THE NETWORK." -#: plinth/modules/networks/forms.py:148 +#: plinth/modules/networks/forms.py:178 #: plinth/modules/networks/templates/connection_show.html:157 msgid "Mode" msgstr "MODE" -#: plinth/modules/networks/forms.py:153 +#: plinth/modules/networks/forms.py:183 msgid "Authentication Mode" msgstr "AUTHENTICATION MODE" -#: plinth/modules/networks/forms.py:154 +#: plinth/modules/networks/forms.py:184 msgid "" "Select WPA if the wireless network is secured and requires clients to have " "the password to connect." @@ -1295,30 +1474,22 @@ msgstr "" "SELECT WPA IF THE WIRELESS NETWORK IS SECURED AND REQUIRES CLIENTS TO HAVE " "THE PASSWORD TO CONNECT." -#: plinth/modules/networks/forms.py:158 +#: plinth/modules/networks/forms.py:188 msgid "Passphrase" msgstr "PASSPHRASE" -#: plinth/modules/networks/forms.py:166 -msgid "" -"Select Automatic (DHCP) if you are connecting to an existing wireless " -"network. Shared mode is useful when running an Access Point." -msgstr "" -"SELECT AUTOMATIC (DHCP) IF YOU ARE CONNECTING TO AN EXISTING WIRELESS " -"NETWORK. SHARED MODE IS USEFUL WHEN RUNNING AN ACCESS POINT." - #: plinth/modules/networks/networks.py:36 #: plinth/modules/networks/networks.py:56 msgid "Network Connections" msgstr "NETWORK CONNECTIONS" #: plinth/modules/networks/networks.py:38 -#: plinth/modules/networks/networks.py:273 +#: plinth/modules/networks/networks.py:242 msgid "Nearby Wi-Fi Networks" msgstr "NEARBY WI-FI NETWORKS" #: plinth/modules/networks/networks.py:40 -#: plinth/modules/networks/networks.py:295 +#: plinth/modules/networks/networks.py:264 msgid "Add Connection" msgstr "ADD CONNECTION" @@ -1342,58 +1513,58 @@ msgstr "CANNOT EDIT CONNECTION: CONNECTION NOT FOUND." msgid "This type of connection is not yet understood." msgstr "THIS TYPE OF CONNECTION IS NOT YET UNDERSTOOD." -#: plinth/modules/networks/networks.py:170 -#: plinth/modules/networks/networks.py:229 +#: plinth/modules/networks/networks.py:139 +#: plinth/modules/networks/networks.py:198 #: plinth/modules/networks/templates/connections_edit.html:34 msgid "Edit Connection" msgstr "EDIT CONNECTION" -#: plinth/modules/networks/networks.py:240 +#: plinth/modules/networks/networks.py:209 #, python-brace-format msgid "Activated connection {name}." msgstr "ACTIVATED CONNECTION {name}." -#: plinth/modules/networks/networks.py:243 +#: plinth/modules/networks/networks.py:212 msgid "Failed to activate connection: Connection not found." msgstr "FAILED TO ACTIVATE CONNECTION: CONNECTION NOT FOUND." -#: plinth/modules/networks/networks.py:247 +#: plinth/modules/networks/networks.py:216 #, python-brace-format msgid "Failed to activate connection {name}: No suitable device is available." msgstr "FAILED TO ACTIVATE CONNECTION {name}: NO SUITABLE DEVICE IS AVAILABLE." -#: plinth/modules/networks/networks.py:260 +#: plinth/modules/networks/networks.py:229 #, python-brace-format msgid "Deactivated connection {name}." msgstr "DEACTIVATED CONNECTION {name}." -#: plinth/modules/networks/networks.py:263 +#: plinth/modules/networks/networks.py:232 msgid "Failed to de-activate connection: Connection not found." msgstr "FAILED TO DE-ACTIVATE CONNECTION: CONNECTION NOT FOUND." -#: plinth/modules/networks/networks.py:325 +#: plinth/modules/networks/networks.py:282 msgid "Adding New Ethernet Connection" msgstr "ADDING NEW ETHERNET CONNECTION" -#: plinth/modules/networks/networks.py:350 +#: plinth/modules/networks/networks.py:300 msgid "Adding New PPPoE Connection" msgstr "ADDING NEW PPPOE CONNECTION" -#: plinth/modules/networks/networks.py:399 +#: plinth/modules/networks/networks.py:332 msgid "Adding New Wi-Fi Connection" msgstr "ADDING NEW WI-FI CONNECTION" -#: plinth/modules/networks/networks.py:413 +#: plinth/modules/networks/networks.py:346 #, python-brace-format msgid "Connection {name} deleted." msgstr "CONNECTION {name} DELETED." -#: plinth/modules/networks/networks.py:416 -#: plinth/modules/networks/networks.py:425 +#: plinth/modules/networks/networks.py:349 +#: plinth/modules/networks/networks.py:358 msgid "Failed to delete connection: Connection not found." msgstr "FAILED TO DELETE CONNECTION: CONNECTION NOT FOUND." -#: plinth/modules/networks/networks.py:430 +#: plinth/modules/networks/networks.py:363 #: plinth/modules/networks/templates/connections_delete.html:26 msgid "Delete Connection" msgstr "DELETE CONNECTION" @@ -1403,7 +1574,7 @@ msgid "Edit connection" msgstr "EDIT CONNECTION" #: plinth/modules/networks/templates/connection_show.html:43 -#: plinth/templates/base.html:119 +#: plinth/templates/base.html:123 msgid "Edit" msgstr "EDIT" @@ -1550,34 +1721,35 @@ msgstr "FIREWALL ZONE" #: plinth/modules/networks/templates/connection_show.html:280 msgid "" -"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." +"This interface should be connected to a 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." msgstr "" -"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." +"THIS INTERFACE SHOULD BE CONNECTED TO A 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." #: plinth/modules/networks/templates/connection_show.html:300 msgid "" -"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." +"This interface should receive your Internet connection. If you connect it to " +"a local network/machine, many services meant to available only internally " +"will not be available." msgstr "" "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." #: plinth/modules/networks/templates/connection_show.html:319 +#, python-format msgid "" -"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 " +"This interface is not maintained by %(box_name)s. Its security status is " +"unknown to %(box_name)s. Many %(box_name)s services may not be available on " +"this interface. It is recommended that you deactivate or delete this " "connection and re-configure it." msgstr "" -"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 " +"THIS INTERFACE IS NOT MAINTAINED BY %(box_name)s. ITS SECURITY STATUS IS " +"UNKNOWN TO %(box_name)s. MANY %(box_name)s SERVICES MAY NOT BE AVAILABLE ON " +"THIS INTERFACE. IT IS RECOMMENDED THAT YOU DEACTIVATE OR DELETE THIS " "CONNECTION AND RE-CONFIGURE IT." #: plinth/modules/networks/templates/connections_add.html:34 @@ -1668,14 +1840,14 @@ msgstr "ENABLE OPENVPN SERVER" #, python-format msgid "" "Virtual Private Network (VPN) is a technique for securely connecting two " -"machines in order to access resources of a private network. While you are " +"devices in order to access resources of a private network. While you are " "away from home, you can connect to your %(box_name)s in order to join your " "home network and access private/internal services provided by %(box_name)s. " "You can also access the rest of the Internet via %(box_name)s for added " "security and anonymity." msgstr "" "VIRTUAL PRIVATE NETWORK (VPN) IS A TECHNIQUE FOR SECURELY CONNECTING TWO " -"MACHINES IN ORDER TO ACCESS RESOURCES OF A PRIVATE NETWORK. WHILE YOU ARE " +"DEVICES IN ORDER TO ACCESS RESOURCES OF A PRIVATE NETWORK. WHILE YOU ARE " "AWAY FROM HOME, YOU CAN CONNECT TO YOUR %(box_name)s IN ORDER TO JOIN YOUR " "HOME NETWORK AND ACCESS PRIVATE/INTERNAL SERVICES PROVIDED BY %(box_name)s. " "YOU CAN ALSO ACCESS THE REST OF THE INTERNET VIA %(box_name)s FOR ADDED " @@ -1691,14 +1863,14 @@ msgid "" "To connect to %(box_name)s'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 documentation on recommended clients and instructions on how to " "configure them." msgstr "" "TO CONNECT TO %(box_name)s'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 DOCUMENTATION ON RECOMMENDED CLIENTS AND INSTRUCTIONS ON HOW TO " "CONFIGURE THEM." @@ -2257,14 +2429,14 @@ msgid "" "reStore is a server for unhosted web " "applications. The idea is to uncouple web applications from data. No " "matter where a web application is served from, the data can be stored on an " -"unhosted storage server of user's choice. With reStore, your " -"%(cfg.box_name)s becomes your unhosted storage server." +"unhosted storage server of user's choice. With reStore, your %(box_name)s " +"becomes your unhosted storage server." msgstr "" "RESTORE IS A SERVER FOR UNHOSTED WEB " "APPLICATIONS. THE IDEA IS TO UNCOUPLE WEB APPLICATIONS FROM DATA. NO " "MATTER WHERE A WEB APPLICATION IS SERVED FROM, THE DATA CAN BE STORED ON AN " -"UNHOSTED STORAGE SERVER OF USER'S CHOICE. WITH RESTORE, YOUR " -"%(cfg.box_name)s BECOMES YOUR UNHOSTED STORAGE SERVER." +"UNHOSTED STORAGE SERVER OF USER'S CHOICE. WITH RESTORE, YOUR %(box_name)s " +"BECOMES YOUR UNHOSTED STORAGE SERVER." #: plinth/modules/restore/templates/restore_index.html:40 msgid "" @@ -2360,7 +2532,7 @@ msgstr "SYSTEM" #: plinth/modules/system/system.py:33 #: plinth/modules/system/templates/system.html:25 -#: plinth/templates/base.html:105 +#: plinth/templates/base.html:109 msgid "System Configuration" msgstr "SYSTEM CONFIGURATION" @@ -2398,7 +2570,7 @@ msgstr "ACCESS URL {url} ON TCP{kind} VIA TOR" msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "CONFIRM TOR USAGE AT {url} ON TCP{kind}" -#: plinth/modules/tor/templates/tor.html:26 plinth/modules/tor/tor.py:66 +#: plinth/modules/tor/templates/tor.html:26 plinth/modules/tor/tor.py:68 msgid "Anonymity Network (Tor)" msgstr "ANONYMITY NETWORK (TOR)" @@ -2463,27 +2635,28 @@ msgstr "SOCKS" msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "A TOR SOCKS PORT IS AVAILABLE ON YOUR %(box_name)s ON TCP PORT 9050." -#: plinth/modules/tor/tor.py:46 +#: plinth/modules/tor/tor.py:47 msgid "Enable Tor" msgstr "ENABLE TOR" -#: plinth/modules/tor/tor.py:49 +#: plinth/modules/tor/tor.py:50 msgid "Enable Tor Hidden Service" msgstr "ENABLE TOR HIDDEN SERVICE" -#: plinth/modules/tor/tor.py:51 +#: plinth/modules/tor/tor.py:53 +#, python-brace-format msgid "" -"A hidden service will allow FreedomBox to provide selected services (such as " -"ownCloud or Chat) without revealing its location." +"A hidden service will allow {box_name} to provide selected services (such as " +"ownCloud or chat) without revealing its location." msgstr "" -"A HIDDEN SERVICE WILL ALLOW FREEDOMBOX TO PROVIDE SELECTED SERVICES (SUCH AS " +"A HIDDEN SERVICE WILL ALLOW {box_name} TO PROVIDE SELECTED SERVICES (SUCH AS " "OWNCLOUD OR CHAT) WITHOUT REVEALING ITS LOCATION." -#: plinth/modules/tor/tor.py:55 +#: plinth/modules/tor/tor.py:57 msgid "Download software packages over Tor" msgstr "DOWNLOAD SOFTWARE PACKAGES OVER TOR" -#: plinth/modules/tor/tor.py:57 +#: plinth/modules/tor/tor.py:59 msgid "" "When enabled, software will be downloaded over the Tor network for " "installations and upgrades. This adds a degree of privacy and security " @@ -2493,46 +2666,46 @@ msgstr "" "INSTALLATIONS AND UPGRADES. THIS ADDS A DEGREE OF PRIVACY AND SECURITY " "DURING SOFTWARE DOWNLOADS." -#: plinth/modules/tor/tor.py:85 plinth/modules/tor/tor.py:285 +#: plinth/modules/tor/tor.py:87 plinth/modules/tor/tor.py:287 msgid "Tor Hidden Service" msgstr "TOR HIDDEN SERVICE" -#: plinth/modules/tor/tor.py:115 +#: plinth/modules/tor/tor.py:117 msgid "Tor Control Panel" msgstr "TOR CONTROL PANEL" -#: plinth/modules/tor/tor.py:240 +#: plinth/modules/tor/tor.py:242 #, python-brace-format msgid "Action error: {0} [{1}] [{2}]" msgstr "ACTION ERROR: {0} [{1}] [{2}]" -#: plinth/modules/tor/tor.py:256 +#: plinth/modules/tor/tor.py:258 msgid "Tor enabled" msgstr "TOR ENABLED" -#: plinth/modules/tor/tor.py:259 +#: plinth/modules/tor/tor.py:261 msgid "Tor disabled" msgstr "TOR DISABLED" -#: plinth/modules/tor/tor.py:264 +#: plinth/modules/tor/tor.py:266 msgid "Tor hidden service enabled" msgstr "TOR HIDDEN SERVICE ENABLED" -#: plinth/modules/tor/tor.py:267 +#: plinth/modules/tor/tor.py:269 msgid "Tor hidden service disabled" msgstr "TOR HIDDEN SERVICE DISABLED" -#: plinth/modules/tor/tor.py:292 +#: plinth/modules/tor/tor.py:294 msgid "Enabled package download over Tor" msgstr "ENABLED PACKAGE DOWNLOAD OVER TOR" -#: plinth/modules/tor/tor.py:295 +#: plinth/modules/tor/tor.py:297 msgid "Disabled package download over Tor" msgstr "DISABLED PACKAGE DOWNLOAD OVER TOR" #: plinth/modules/transmission/__init__.py:38 #: plinth/modules/transmission/templates/transmission.html:26 -#: plinth/modules/transmission/views.py:63 +#: plinth/modules/transmission/views.py:67 msgid "BitTorrent (Transmission)" msgstr "BITTORRENT (TRANSMISSION)" @@ -2608,72 +2781,73 @@ msgstr "" "WHEN ENABLED, THE UNATTENDED-UPGRADES PROGRAM WILL BE RUN ONCE PER DAY. IT " "WILL ATTEMPT TO PERFORM ANY PACKAGE UPGRADES THAT ARE AVAILABLE." -#: plinth/modules/upgrades/templates/upgrades.html:40 -msgid "There was an error while upgrading." -msgstr "THERE WAS AN ERROR WHILE UPGRADING." - -#: plinth/modules/upgrades/templates/upgrades.html:43 -#: plinth/modules/upgrades/templates/upgrades.html:59 -msgid "Output from unattended-upgrades:" -msgstr "OUTPUT FROM UNATTENDED-UPGRADES:" - -#: plinth/modules/upgrades/templates/upgrades.html:50 -msgid "The operating system is up to date now.  " -msgstr "THE OPERATING SYSTEM IS UP TO DATE NOW.  " - -#: plinth/modules/upgrades/templates/upgrades.html:53 -msgid "Show Details" -msgstr "SHOW DETAILS" +#: plinth/modules/upgrades/templates/upgrades.html:37 +msgid "" +"Upgrades install the latest software and security updates. When automatic " +"upgrades are enabled, upgrades are automatically run every night. You don't " +"normally need to start the upgrade process." +msgstr "" +"UPGRADES INSTALL THE LATEST SOFTWARE AND SECURITY UPDATES. WHEN AUTOMATIC " +"UPGRADES ARE ENABLED, UPGRADES ARE AUTOMATICALLY RUN EVERY NIGHT. YOU DON'T " +"NORMALLY NEED TO START THE UPGRADE PROCESS." -#: plinth/modules/upgrades/templates/upgrades.html:69 +#: plinth/modules/upgrades/templates/upgrades.html:45 msgid "" -"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." +"Depending on the number of packages to install, this may take a long time to " +"complete. While upgrades are in progress, you will not be able to install " +"other packages. During the upgrade, this web interface may be temporarily " +"unavailable and show an error. Refresh the page to continue." msgstr "" -"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." +"DEPENDING ON THE NUMBER OF PACKAGES TO INSTALL, THIS MAY TAKE A LONG TIME TO " +"COMPLETE. WHILE UPGRADES ARE IN PROGRESS, YOU WILL NOT BE ABLE TO INSTALL " +"OTHER PACKAGES. DURING THE UPGRADE, THIS WEB INTERFACE MAY BE TEMPORARILY " +"UNAVAILABLE AND SHOW AN ERROR. REFRESH THE PAGE TO CONTINUE." -#: plinth/modules/upgrades/templates/upgrades.html:80 +#: plinth/modules/upgrades/templates/upgrades.html:58 msgid "Upgrade now »" msgstr "UPGRADE NOW »" -#: plinth/modules/upgrades/templates/upgrades.html:87 -msgid "System is being upgraded." -msgstr "SYSTEM IS BEING UPGRADED." +#: plinth/modules/upgrades/templates/upgrades.html:65 +msgid "A package manager is running." +msgstr "A PACKAGE MANAGER IS RUNNING." + +#: plinth/modules/upgrades/templates/upgrades.html:70 +msgid "Recent log from upgrades:" +msgstr "RECENT LOG FROM UPGRADES:" -#: plinth/modules/upgrades/views.py:35 plinth/modules/upgrades/views.py:64 +#: plinth/modules/upgrades/views.py:36 plinth/modules/upgrades/views.py:66 msgid "Automatic Upgrades" msgstr "AUTOMATIC UPGRADES" -#: plinth/modules/upgrades/views.py:37 +#: plinth/modules/upgrades/views.py:38 msgid "Upgrade Packages" msgstr "UPGRADE PACKAGES" -#: plinth/modules/upgrades/views.py:75 +#: plinth/modules/upgrades/views.py:96 +msgid "Upgrade process started." +msgstr "UPGRADE PROCESS STARTED." + +#: plinth/modules/upgrades/views.py:99 +msgid "Starting upgrade failed." +msgstr "STARTING UPGRADE FAILED." + +#: plinth/modules/upgrades/views.py:102 msgid "Package Upgrades" msgstr "PACKAGE UPGRADES" -#: plinth/modules/upgrades/views.py:116 +#: plinth/modules/upgrades/views.py:131 #, python-brace-format msgid "Error when configuring unattended-upgrades: {error}" msgstr "ERROR WHEN CONFIGURING UNATTENDED-UPGRADES: {error}" -#: plinth/modules/upgrades/views.py:121 +#: plinth/modules/upgrades/views.py:136 msgid "Automatic upgrades enabled" msgstr "AUTOMATIC UPGRADES ENABLED" -#: plinth/modules/upgrades/views.py:123 +#: plinth/modules/upgrades/views.py:138 msgid "Automatic upgrades disabled" msgstr "AUTOMATIC UPGRADES DISABLED" -#: plinth/modules/upgrades/views.py:142 -msgid "Upgrade completed." -msgstr "UPGRADE COMPLETED." - -#: plinth/modules/upgrades/views.py:144 -msgid "Upgrade failed." -msgstr "UPGRADE FAILED." - #: plinth/modules/users/__init__.py:36 msgid "Users and Groups" msgstr "USERS AND GROUPS" @@ -2896,9 +3070,10 @@ msgstr "WEB SERVER OVER SECURE SOCKET LAYER" msgid "Secure Shell (SSH) Server" msgstr "SECURE SHELL (SSH) SERVER" -#: plinth/service.py:78 -msgid "FreedomBox Web Interface (Plinth)" -msgstr "FREEDOMBOX WEB INTERFACE (PLINTH)" +#: plinth/service.py:79 +#, python-brace-format +msgid "{box_name} Web Interface (Plinth)" +msgstr "{box_name} WEB INTERFACE (PLINTH)" #: plinth/templates/404.html:25 msgid "404" @@ -2934,27 +3109,24 @@ msgstr "" "\">BUG TRACKER SO WE CAN FIX IT." #: plinth/templates/base.html:49 -msgid "Plinth administrative interface for the FreedomBox" -msgstr "PLINTH ADMINISTRATIVE INTERFACE FOR THE FREEDOMBOX" - -#: plinth/templates/base.html:52 plinth/templates/base.html.py:88 -msgid "FreedomBox" -msgstr "FREEDOMBOX" +#, python-format +msgid "Plinth administrative interface for the %(box_name)s" +msgstr "PLINTH ADMINISTRATIVE INTERFACE FOR THE %(box_name)s" -#: plinth/templates/base.html:81 +#: plinth/templates/base.html:83 msgid "Toggle navigation" msgstr "TOGGLE NAVIGATION" -#: plinth/templates/base.html:121 plinth/templates/base.html.py:122 +#: plinth/templates/base.html:125 plinth/templates/base.html.py:126 msgid "Change password" msgstr "CHANGE PASSWORD" -#: plinth/templates/base.html:125 plinth/templates/base.html.py:126 -#: plinth/templates/base.html:139 plinth/templates/base.html.py:141 +#: plinth/templates/base.html:129 plinth/templates/base.html.py:130 +#: plinth/templates/base.html:143 plinth/templates/base.html.py:145 msgid "Log out" msgstr "LOG OUT" -#: plinth/templates/base.html:131 plinth/templates/base.html.py:133 +#: plinth/templates/base.html:135 plinth/templates/base.html.py:137 msgid "Log in" msgstr "LOG IN" @@ -2996,6 +3168,69 @@ msgstr "INSTALLING %(package_names)s: %(status)s" msgid "%(percentage)s%% complete" msgstr "%(percentage)s%% COMPLETE" +#~ msgid "The following is the current status:" +#~ msgstr "THE FOLLOWING IS THE CURRENT STATUS:" + +#~ msgid "Create Wiki/Blog" +#~ msgstr "CREATE WIKI/BLOG" + +#~ msgid "show password" +#~ msgstr "SHOW PASSWORD" + +#~ msgid "Congratulations! Your FreedomBox is up and running!" +#~ msgstr "CONGRATULATIONS! YOUR FREEDOMBOX IS UP AND RUNNING!" + +#~ msgid "" +#~ "Please provide the following basic information to complete the setup " +#~ "process." +#~ msgstr "" +#~ "PLEASE PROVIDE THE FOLLOWING BASIC INFORMATION TO COMPLETE THE SETUP " +#~ "PROCESS." + +#~ msgid "Next" +#~ msgstr "NEXT" + +#~ msgid "FreedomBox Manual" +#~ msgstr "FREEDOMBOX MANUAL" + +#~ msgid "" +#~ "Many FreedomBox contributors and users are also available on the " +#~ "#freedombox channel of the irc.oftc.net IRC network." +#~ msgstr "" +#~ "MANY FREEDOMBOX CONTRIBUTORS AND USERS ARE ALSO AVAILABLE ON THE " +#~ "#FREEDOMBOX CHANNEL OF THE IRC.OFTC.NET IRC NETWORK." + +#~ msgid "" +#~ "Select Automatic (DHCP) if you are connecting to an existing wireless " +#~ "network. Shared mode is useful when running an Access Point." +#~ msgstr "" +#~ "SELECT AUTOMATIC (DHCP) IF YOU ARE CONNECTING TO AN EXISTING WIRELESS " +#~ "NETWORK. SHARED MODE IS USEFUL WHEN RUNNING AN ACCESS POINT." + +#~ msgid "There was an error while upgrading." +#~ msgstr "THERE WAS AN ERROR WHILE UPGRADING." + +#~ msgid "Output from unattended-upgrades:" +#~ msgstr "OUTPUT FROM UNATTENDED-UPGRADES:" + +#~ msgid "The operating system is up to date now.  " +#~ msgstr "THE OPERATING SYSTEM IS UP TO DATE NOW.  " + +#~ msgid "Show Details" +#~ msgstr "SHOW DETAILS" + +#~ msgid "" +#~ "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." +#~ msgstr "" +#~ "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." + +#~ msgid "System is being upgraded." +#~ msgstr "SYSTEM IS BEING UPGRADED." + #~ msgid "" #~ "You can install and run various services and applications on your " #~ "%(box_name)s." From f7d3f7c88a22ae727408c35df4b7dcc8668618e2 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sun, 24 Jan 2016 01:08:51 +0530 Subject: [PATCH 024/189] Update POT file with message changes - So that translations on the changed messages can begin. --- plinth/locale/django.pot | 713 +++++++++++++++++++++++---------------- 1 file changed, 430 insertions(+), 283 deletions(-) diff --git a/plinth/locale/django.pot b/plinth/locale/django.pot index 537d9e5bb..0247cfbb4 100644 --- a/plinth/locale/django.pot +++ b/plinth/locale/django.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-12-20 13:58+0530\n" +"POT-Creation-Date: 2016-01-24 12:27+0530\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -47,11 +47,15 @@ msgstr "" msgid "Cannot connect to {host}:{port}" msgstr "" +#: plinth/context_processors.py:36 +msgid "FreedomBox" +msgstr "" + #: plinth/modules/apps/apps.py:26 msgid "Apps" msgstr "" -#: plinth/modules/apps/apps.py:32 plinth/templates/base.html.py:90 +#: plinth/modules/apps/apps.py:32 plinth/templates/base.html.py:93 msgid "Applications" msgstr "" @@ -86,10 +90,11 @@ msgid "Enable service discovery" msgstr "" #: plinth/modules/avahi/templates/avahi.html:29 +#, python-format msgid "" -"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 " +"Service discovery allows other devices on the network to discover your " +"%(box_name)s and services running on it. It also allows %(box_name)s to " +"discover other devices 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." @@ -98,7 +103,7 @@ msgstr "" #: plinth/modules/avahi/templates/avahi.html:40 #: plinth/modules/datetime/templates/datetime.html:35 #: plinth/modules/deluge/templates/deluge.html:39 -#: plinth/modules/dynamicdns/dynamicdns.py:38 +#: plinth/modules/dynamicdns/dynamicdns.py:39 #: plinth/modules/firewall/templates/firewall.html:57 #: plinth/modules/mumble/templates/mumble.html:44 #: plinth/modules/networks/templates/connection_show.html:261 @@ -158,12 +163,12 @@ msgstr "" #: plinth/modules/avahi/views.py:73 plinth/modules/datetime/views.py:85 #: plinth/modules/deluge/views.py:80 -#: plinth/modules/dynamicdns/dynamicdns.py:368 +#: plinth/modules/dynamicdns/dynamicdns.py:371 #: plinth/modules/ikiwiki/views.py:95 plinth/modules/mumble/views.py:80 #: plinth/modules/openvpn/views.py:142 plinth/modules/privoxy/views.py:83 #: plinth/modules/quassel/views.py:76 plinth/modules/restore/views.py:68 #: plinth/modules/roundcube/views.py:84 plinth/modules/shaarli/views.py:74 -#: plinth/modules/transmission/views.py:105 plinth/modules/xmpp/views.py:100 +#: plinth/modules/transmission/views.py:109 plinth/modules/xmpp/views.py:100 msgid "Configuration updated" msgstr "" @@ -173,58 +178,60 @@ msgstr "" #: plinth/modules/owncloud/owncloud.py:93 plinth/modules/privoxy/views.py:85 #: plinth/modules/quassel/views.py:78 plinth/modules/restore/views.py:70 #: plinth/modules/roundcube/views.py:86 plinth/modules/shaarli/views.py:76 -#: plinth/modules/tor/tor.py:250 plinth/modules/transmission/views.py:107 -#: plinth/modules/upgrades/views.py:103 plinth/modules/xmpp/views.py:102 +#: plinth/modules/tor/tor.py:252 plinth/modules/transmission/views.py:111 +#: plinth/modules/upgrades/views.py:118 plinth/modules/xmpp/views.py:102 msgid "Setting unchanged" msgstr "" -#: plinth/modules/config/config.py:83 plinth/modules/config/config.py:120 -#: plinth/modules/dynamicdns/dynamicdns.py:145 +#: plinth/modules/config/config.py:84 plinth/modules/config/config.py:121 +#: plinth/modules/dynamicdns/dynamicdns.py:148 msgid "Invalid domain name" msgstr "" -#: plinth/modules/config/config.py:94 +#: plinth/modules/config/config.py:95 msgid "Hostname" msgstr "" -#: plinth/modules/config/config.py:96 +#: plinth/modules/config/config.py:97 +#, python-brace-format msgid "" -"Hostname is the local name by which other machines on the local network " -"reach your machine. It must start and end with an alphabet or a digit and " -"have as interior characters only alphabets, digits and hyphens. Total " +"Hostname is the local name by which other devices on the local network can " +"reach your {box_name}. It must start and end with an alphabet or a digit " +"and have as interior characters only alphabets, digits and hyphens. Total " "length must be 63 characters or less." msgstr "" -#: plinth/modules/config/config.py:104 +#: plinth/modules/config/config.py:105 msgid "Invalid hostname" msgstr "" -#: plinth/modules/config/config.py:107 plinth/modules/config/config.py:153 +#: plinth/modules/config/config.py:108 plinth/modules/config/config.py:153 #: plinth/modules/config/config.py:265 -#: plinth/modules/dynamicdns/dynamicdns.py:140 +#: plinth/modules/dynamicdns/dynamicdns.py:143 msgid "Domain Name" msgstr "" -#: plinth/modules/config/config.py:109 +#: plinth/modules/config/config.py:110 +#, python-brace-format msgid "" -"Domain name is the global name by which other machines on the Internet can " -"reach you. It must consist of labels separated by dots. Each label must " -"start and end with an alphabet or a digit and have as interior characters " -"only alphabets, digits and hyphens. Length of each label must be 63 " -"characters or less. Total length of domain name must be 253 characters or " -"less." +"Domain name is the global name by which other devices on the Internet can " +"reach your {box_name}. It must consist of labels separated by dots. Each " +"label must start and end with an alphabet or a digit and have as interior " +"characters only alphabets, digits and hyphens. Length of each label must be " +"63 characters or less. Total length of domain name must be 253 characters " +"or less." msgstr "" -#: plinth/modules/config/config.py:124 +#: plinth/modules/config/config.py:125 msgid "Language" msgstr "" -#: plinth/modules/config/config.py:126 -msgid "Language for this FreedomBox web administration interface" +#: plinth/modules/config/config.py:127 +msgid "Language for this web administration interface" msgstr "" #: plinth/modules/config/config.py:135 -#: plinth/modules/dynamicdns/dynamicdns.py:36 +#: plinth/modules/dynamicdns/dynamicdns.py:37 #: plinth/modules/ikiwiki/views.py:36 msgid "Configure" msgstr "" @@ -411,147 +418,151 @@ msgstr "" msgid "Result" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:34 plinth/modules/help/help.py:40 +#: plinth/modules/dynamicdns/dynamicdns.py:35 plinth/modules/help/help.py:40 msgid "About" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:44 -#: plinth/modules/dynamicdns/dynamicdns.py:53 +#: plinth/modules/dynamicdns/dynamicdns.py:45 +#: plinth/modules/dynamicdns/dynamicdns.py:54 msgid "Dynamic DNS" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:70 +#: plinth/modules/dynamicdns/dynamicdns.py:71 msgid "" "The Variables <User>, <Pass>, <Ip>, <Domain> may be " "used within the URL. For details see the update URL templates of the example " "providers." msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:74 +#: plinth/modules/dynamicdns/dynamicdns.py:75 msgid "" "Please choose an update protocol according to your provider. If your " "provider does not support the GnudIP protocol or your provider is not listed " "you may use the update URL of your provider." msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:79 +#: plinth/modules/dynamicdns/dynamicdns.py:80 msgid "" "Please do not enter a URL here (like \"https://example.com/\") but only the " -"hostname of the GnuDIP server (like \"example.pcom\")." +"hostname of the GnuDIP server (like \"example.com\")." msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:83 -msgid "The public domain name you want use to reach your box." +#: plinth/modules/dynamicdns/dynamicdns.py:84 +#, python-brace-format +msgid "The public domain name you want use to reach your {box_name}." msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:85 +#: plinth/modules/dynamicdns/dynamicdns.py:87 msgid "Use this option if your provider uses self signed certificates." msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:88 +#: plinth/modules/dynamicdns/dynamicdns.py:90 msgid "" "If this option is selected, your username and password will be used for HTTP " "basic authentication." msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:91 +#: plinth/modules/dynamicdns/dynamicdns.py:93 msgid "" "Leave this field empty if you want to keep your previous configured password." msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:94 +#: plinth/modules/dynamicdns/dynamicdns.py:96 +#, python-brace-format msgid "" -"Optional Value. If your FreedomBox is not connected directly to the Internet " +"Optional Value. If your {box_name} is not connected directly to the Internet " "(i.e. connected to a NAT router) this URL is used to figure out the real " -"Internet IP. The URL should simply return the IP wherethe client comes from. " -"Example: http://myip.datasystems24.de" +"Internet IP. The URL should simply return the IP where the client comes from " +"(example: http://myip.datasystems24.de)." msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:101 +#: plinth/modules/dynamicdns/dynamicdns.py:104 msgid "" "You should have been requested to select a username when you created the " "account." msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:112 +#: plinth/modules/dynamicdns/dynamicdns.py:115 msgid "Enable Dynamic DNS" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:115 +#: plinth/modules/dynamicdns/dynamicdns.py:118 msgid "Service type" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:120 +#: plinth/modules/dynamicdns/dynamicdns.py:123 msgid "GnudIP Server Address" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:125 +#: plinth/modules/dynamicdns/dynamicdns.py:128 msgid "Invalid server name" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:128 +#: plinth/modules/dynamicdns/dynamicdns.py:131 msgid "Update URL" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:132 -msgid "accept all SSL certificates" +#: plinth/modules/dynamicdns/dynamicdns.py:135 +msgid "Accept all SSL certificates" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:136 -msgid "use HTTP basic authentication" +#: plinth/modules/dynamicdns/dynamicdns.py:139 +msgid "Use HTTP basic authentication" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:148 -#: plinth/modules/networks/forms.py:118 plinth/modules/transmission/forms.py:39 +#: plinth/modules/dynamicdns/dynamicdns.py:151 +#: plinth/modules/networks/forms.py:146 plinth/modules/transmission/forms.py:39 msgid "Username" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:151 -#: plinth/modules/networks/forms.py:119 plinth/modules/transmission/forms.py:43 +#: plinth/modules/dynamicdns/dynamicdns.py:154 +#: plinth/modules/networks/forms.py:147 plinth/modules/transmission/forms.py:43 msgid "Password" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:154 -msgid "show password" +#: plinth/modules/dynamicdns/dynamicdns.py:157 +#: plinth/modules/networks/forms.py:149 +msgid "Show password" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:158 +#: plinth/modules/dynamicdns/dynamicdns.py:161 msgid "IP check URL" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:184 +#: plinth/modules/dynamicdns/dynamicdns.py:187 msgid "Please provide update URL or a GnuDIP Server" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:187 +#: plinth/modules/dynamicdns/dynamicdns.py:190 msgid "Please provide GnuDIP username" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:190 +#: plinth/modules/dynamicdns/dynamicdns.py:193 msgid "Please provide GnuDIP domain" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:195 +#: plinth/modules/dynamicdns/dynamicdns.py:198 msgid "Please provide a password" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:214 +#: plinth/modules/dynamicdns/dynamicdns.py:217 msgid "Configure Dynamic DNS" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:236 +#: plinth/modules/dynamicdns/dynamicdns.py:239 msgid "Status of Dynamic DNS" msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns.html:25 -msgid "DynamicDNS client" +msgid "Dynamic DNS Client" msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns.html:28 +#, python-format msgid "" "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)." +"may find the services which are provided by %(box_name)s, such as ownCloud." msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns.html:37 @@ -561,7 +572,7 @@ msgid "" "allows you to push your current public IP address to an gnudip 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." +"Internet asks for your DNS name he will get your current IP answered." msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns.html:50 @@ -574,10 +585,10 @@ msgid "" msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns.html:61 +#, python-format msgid "" -"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." +"If your %(box_name)s is connected behind some NAT router, don't forget to " +"add port forwarding (i.e. forward some standard ports like 80 and 443)." msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns_configure.html:30 @@ -597,16 +608,16 @@ msgid "" msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:35 -msgid "Direct connection to the internet." +msgid "Direct connection to the Internet." msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:37 #, python-format msgid "" -"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)s minutes until we " -"update your DNS entry in case of WAN IP change." +"Behind NAT. This means that Dynamic DNS service will poll the \"IP check URL" +"\" for changes (the \"IP check URL\" entry is needed for this - otherwise IP " +"changes will not be detected). In case the WAN IP changes, it may take up " +"to %(timer)s minutes until your DNS entry is updated." msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:48 @@ -622,13 +633,13 @@ msgstr "" #: plinth/modules/firewall/templates/firewall.html:28 #, python-format msgid "" -"Firewall is a network security system that controls the incoming and " -"outgoing network traffic on your %(box_name)s. Keeping a firewall enabled " -"and properly configured reduces risk of security threat from the Internet." +"Firewall is a security system that controls the incoming and outgoing " +"network traffic on your %(box_name)s. Keeping a firewall enabled and " +"properly configured reduces risk of security threat from the Internet." msgstr "" #: plinth/modules/firewall/templates/firewall.html:36 -msgid "The following is the current status:" +msgid "Current status:" msgstr "" #: plinth/modules/firewall/templates/firewall.html:41 @@ -645,11 +656,13 @@ msgid "Service/Port" msgstr "" #: plinth/modules/firewall/templates/firewall.html:67 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:91 #: plinth/modules/names/templates/names.html:51 msgid "Enabled" msgstr "" #: plinth/modules/firewall/templates/firewall.html:70 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:93 #: plinth/modules/names/templates/names.html:53 msgid "Disabled" msgstr "" @@ -673,8 +686,8 @@ msgstr "" #: plinth/modules/firewall/templates/firewall.html:103 msgid "" "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." +"also permitted in the firewall and when you disable a service it is also " +"disabled in the firewall." msgstr "" #: plinth/modules/first_boot/forms.py:48 plinth/modules/users/forms.py:70 @@ -689,31 +702,35 @@ msgstr "" msgid "User account created, you are now logged in" msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state0.html:50 -msgid "Congratulations! Your FreedomBox is up and running!" +#: plinth/modules/first_boot/templates/firstboot_navbar.html:23 +#: plinth/modules/help/templates/help_index.html:25 +#: plinth/templates/base.html:102 +msgid "Help" msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state0.html:54 -msgid "" -"Please provide the following basic information to complete the setup process." +#: plinth/modules/first_boot/templates/firstboot_state0.html:45 +msgid "Start Setup" msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state0.html:62 -msgid "Next" +#: plinth/modules/first_boot/templates/firstboot_state0.html:49 +#, python-format +msgid "" +"To complete the setup of your %(box_name)s, please provide some basic " +"information." msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state1.html:39 +#: plinth/modules/first_boot/templates/firstboot_state1.html:41 msgid "Administrator Account" msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state1.html:42 +#: plinth/modules/first_boot/templates/firstboot_state1.html:44 msgid "" "Choose a username and password to access this web interface. The password " "can be changed later. This user will be granted administrative privileges. " "Other users can be added later." msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state1.html:55 +#: plinth/modules/first_boot/templates/firstboot_state1.html:57 msgid "Box it up!" msgstr "" @@ -722,28 +739,29 @@ msgid "Setup Complete!" msgstr "" #: plinth/modules/first_boot/templates/firstboot_state10.html:32 +#, python-format msgid "" -"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." +"%(box_name)s setup is now complete. To make your %(box_name)s functional, " +"you need some applications. They will be installed the first time you " +"access them." msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state10.html:40 -msgid "" -"To make your FreedomBox functional, you need some applications. " -"Applications will be installed the first time you access them." +#: plinth/modules/first_boot/templates/firstboot_state10.html:41 +msgid "Go to Apps" msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state10.html:47 -msgid "Network Configuration" +#: plinth/modules/first_boot/templates/firstboot_state10.html:44 +msgid "Current Network Configuration" msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state10.html:54 -msgid "Go to Networks" +#: plinth/modules/first_boot/templates/firstboot_state10.html:47 +msgid "" +"You should check the network setup and modify it if necessary. Do not forget " +"to change the default Wi-Fi passwords!" msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state10.html:59 -msgid "Go to Apps" +#: plinth/modules/first_boot/templates/firstboot_state10.html:57 +msgid "Go to Networks" msgstr "" #: plinth/modules/first_boot/views.py:60 @@ -758,8 +776,8 @@ msgstr "" msgid "Where to Get Help" msgstr "" -#: plinth/modules/help/help.py:38 plinth/modules/help/help.py:72 -msgid "FreedomBox Manual" +#: plinth/modules/help/help.py:38 +msgid "Manual" msgstr "" #: plinth/modules/help/help.py:48 @@ -771,15 +789,21 @@ msgstr "" msgid "About {box_name}" msgstr "" +#: plinth/modules/help/help.py:73 +#, python-brace-format +msgid "{box_name} Manual" +msgstr "" + #: plinth/modules/help/templates/help_about.html:30 +#, python-format msgid "" -"FreedomBox is a community project to develop, design and promote personal " +"%(box_name)s 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." +"and a Tor relay, on a device that can replace your Wi-Fi router, so that " +"your data stays with you." msgstr "" #: plinth/modules/help/templates/help_about.html:43 @@ -793,68 +817,76 @@ msgid "" msgstr "" #: plinth/modules/help/templates/help_about.html:56 +#, python-format msgid "" "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." +"services; %(box_name)s aims to bring them all together in a convenient " +"package." msgstr "" #: plinth/modules/help/templates/help_about.html:64 +#, python-format msgid "" -"For more information about the FreedomBox project, see the FreedomBox Wiki." +"For more information about the %(box_name)s project, see the %(box_name)s Wiki." msgstr "" -#: plinth/modules/help/templates/help_about.html:72 +#: plinth/modules/help/templates/help_about.html:73 msgid "Learn more »" msgstr "" -#: plinth/modules/help/templates/help_about.html:75 +#: plinth/modules/help/templates/help_about.html:76 #, python-format msgid "You are running Plinth version %(version)s." msgstr "" -#: plinth/modules/help/templates/help_index.html:25 -#: plinth/templates/base.html:98 -msgid "Help" +#: plinth/modules/help/templates/help_base.html:36 +#, python-format +msgid "%(box_name)s Setup" msgstr "" #: plinth/modules/help/templates/help_index.html:29 #, python-format msgid "" -"The FreedomBox Manual is the best place to " +"The %(box_name)s Manual is the best place to " "start for information regarding %(box_name)s." msgstr "" #: plinth/modules/help/templates/help_index.html:36 +#, python-format msgid "" -" FreedomBox " -"project wiki contains further information." +" " +"%(box_name)s project wiki contains further information." msgstr "" #: plinth/modules/help/templates/help_index.html:43 +#, python-format msgid "" -"To seek help from FreedomBox community, queries may be posted on the " -"mailing list. The list archives also contain information about problems " -"faced by other users and possible solutions." +"To seek help from %(box_name)s community, queries may be posted on the mailing list. The list archives also contain information about " +"problems faced by other users and possible solutions." msgstr "" #: plinth/modules/help/templates/help_index.html:53 +#, python-format msgid "" -"Many FreedomBox contributors and users are also available on the #freedombox " -"channel of the irc.oftc.net IRC network." +"Many %(box_name)s contributors and users are also available on the irc.oftc." +"net IRC network. Join and request help on the #freedombox " +"channel using the IRC web interface." msgstr "" #: plinth/modules/ikiwiki/__init__.py:38 -msgid "Wiki & Blog (Ikiwiki)" +msgid "Wiki and Blog (ikiwiki)" msgstr "" #: plinth/modules/ikiwiki/__init__.py:43 -msgid "Ikiwiki wikis and blogs" +msgid "ikiwiki wikis and blogs" msgstr "" #: plinth/modules/ikiwiki/forms.py:29 -msgid "Enable Ikiwiki" +msgid "Enable ikiwiki" msgstr "" #: plinth/modules/ikiwiki/forms.py:36 @@ -883,21 +915,22 @@ msgstr "" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:27 #, python-format -msgid "Delete Wiki/Blog %(name)s" +msgid "Delete Wiki or Blog %(name)s" msgstr "" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:33 msgid "" "This action will remove all the posts, pages and comments including revision " -"history. Delete this wiki/blog permanently?" +"history. Delete this wiki or blog permanently?" msgstr "" -#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:43 +#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:44 #, python-format msgid "Delete %(name)s" msgstr "" -#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:46 +#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:47 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:60 #: plinth/modules/networks/templates/connections_delete.html:41 #: plinth/modules/users/templates/users_delete.html:41 msgid "Cancel" @@ -930,7 +963,7 @@ msgid "Create" msgstr "" #: plinth/modules/ikiwiki/views.py:73 -msgid "Wiki & Blog" +msgid "Wiki and Blog" msgstr "" #: plinth/modules/ikiwiki/views.py:106 @@ -938,7 +971,7 @@ msgid "Manage Wikis and Blogs" msgstr "" #: plinth/modules/ikiwiki/views.py:132 -msgid "Create Wiki/Blog" +msgid "Create Wiki or Blog" msgstr "" #: plinth/modules/ikiwiki/views.py:145 @@ -972,7 +1005,144 @@ msgid "Could not delete {name}: {error}" msgstr "" #: plinth/modules/ikiwiki/views.py:182 -msgid "Delete Wiki/Blog" +msgid "Delete Wiki or Blog" +msgstr "" + +#: plinth/modules/letsencrypt/__init__.py:43 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:38 +#: plinth/modules/letsencrypt/views.py:45 +msgid "Certificates (Let's Encrypt)" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:41 +#, python-format +msgid "" +"A digital certficate allows users of a web service to verify the identity of " +"the service and to securely communicate with it. %(box_name)s can " +"automatically obtain and setup digital certificates for each available " +"domain. It does so by proving itself to be the owner of a domain to Let's " +"Encrypt, a certficate authority (CA)." +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:52 +msgid "" +"Let's Encrypt is a free, automated, and open certificate authority, run for " +"the public’s benefit by the Internet Security Research Group (ISRG). Please " +"read and agree with the Let's Encrypt Subscriber Agreement before using this service." +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:66 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:70 +msgid "Domain" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:67 +msgid "Certificate Status" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:68 +msgid "Website Security" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:69 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:72 +msgid "Actions" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:79 +#, python-format +msgid "Expires on %(expiry_date)s" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:85 +msgid "No certficate" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:102 +msgid "Revoke" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:108 +msgid "Re-obtain" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:115 +msgid "Obtain" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:55 +#, python-brace-format +msgid "Certificate successfully revoked for domain {domain}" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:60 +#, python-brace-format +msgid "Failed to revoke certificate for domain {domain}: {error}" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:72 +#, python-brace-format +msgid "Certificate successfully obtained for domain {domain}" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:77 +#, python-brace-format +msgid "Failed to obtain certificate for domain {domain}: {error}" +msgstr "" + +#: plinth/modules/monkeysphere/__init__.py:32 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:35 +#: plinth/modules/monkeysphere/views.py:44 +msgid "Monkeysphere" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:38 +msgid "" +"With Monkeysphere, a PGP key can be generated for each configured domain " +"serving SSH. The PGP public key can then be uploaded to the PGP keyservers. " +"Users connecting to this machine through SSH can verify that they are " +"connecting to the correct host. For users to trust the key, at least one " +"person (usually the machine owner) must sign the key using the regular PGP " +"key signing process. See the Monkeysphere SSH documentation for more details." +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:53 +msgid "Publishing key to keyserver..." +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:71 +msgid "GPG Fingerprint" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:83 +#: plinth/modules/names/views.py:45 +msgid "Not Available" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:93 +msgid "Generate PGP Key" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:101 +msgid "Publish Key" +msgstr "" + +#: plinth/modules/monkeysphere/views.py:58 +msgid "Generated PGP key." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:83 +msgid "Cancelled key publishing." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:120 +msgid "Published key to keyserver." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:122 +msgid "Error occurred while publishing key." msgstr "" #: plinth/modules/mumble/__init__.py:38 @@ -1010,170 +1180,151 @@ msgstr "" msgid "Mumble server is not running" msgstr "" -#: plinth/modules/names/__init__.py:30 +#: plinth/modules/names/__init__.py:29 msgid "HTTP" msgstr "" -#: plinth/modules/names/__init__.py:31 +#: plinth/modules/names/__init__.py:30 msgid "HTTPS" msgstr "" -#: plinth/modules/names/__init__.py:32 +#: plinth/modules/names/__init__.py:31 msgid "SSH" msgstr "" -#: plinth/modules/names/__init__.py:46 plinth/modules/names/views.py:34 +#: plinth/modules/names/__init__.py:45 plinth/modules/names/views.py:34 msgid "Name Services" msgstr "" -#: plinth/modules/names/__init__.py:107 -msgid "Not Available" -msgstr "" - #: plinth/modules/networks/__init__.py:108 #, python-brace-format msgid "Using DNSSEC on IPv{kind}" msgstr "" #: plinth/modules/networks/forms.py:30 -msgid "-- select --" -msgstr "" - -#: plinth/modules/networks/forms.py:42 msgid "Connection Type" msgstr "" -#: plinth/modules/networks/forms.py:49 plinth/modules/networks/forms.py:106 -#: plinth/modules/networks/forms.py:133 +#: plinth/modules/networks/forms.py:37 msgid "Connection Name" msgstr "" -#: plinth/modules/networks/forms.py:51 plinth/modules/networks/forms.py:108 -#: plinth/modules/networks/forms.py:135 +#: plinth/modules/networks/forms.py:39 msgid "Physical Interface" msgstr "" -#: plinth/modules/networks/forms.py:53 plinth/modules/networks/forms.py:110 -#: plinth/modules/networks/forms.py:137 +#: plinth/modules/networks/forms.py:41 msgid "The network device that this connection should be bound to." msgstr "" -#: plinth/modules/networks/forms.py:56 plinth/modules/networks/forms.py:113 -#: plinth/modules/networks/forms.py:140 +#: plinth/modules/networks/forms.py:44 msgid "Firewall Zone" msgstr "" -#: plinth/modules/networks/forms.py:57 plinth/modules/networks/forms.py:114 -#: plinth/modules/networks/forms.py:141 +#: plinth/modules/networks/forms.py:45 msgid "" "The firewall zone will control which services are available over this " "interfaces. Select Internal only for trusted networks." msgstr "" -#: plinth/modules/networks/forms.py:61 plinth/modules/networks/forms.py:162 +#: plinth/modules/networks/forms.py:49 msgid "IPv4 Addressing Method" msgstr "" -#: plinth/modules/networks/forms.py:62 +#: plinth/modules/networks/forms.py:50 msgid "" "\"Shared\" method will start a DHCP server and \"Automatic\" method will " "acquire configuration from a DHCP server." msgstr "" -#: plinth/modules/networks/forms.py:68 plinth/modules/networks/forms.py:170 +#: plinth/modules/networks/forms.py:56 msgid "Address" msgstr "" -#: plinth/modules/networks/forms.py:72 plinth/modules/networks/forms.py:174 +#: plinth/modules/networks/forms.py:60 msgid "Netmask" msgstr "" -#: plinth/modules/networks/forms.py:73 plinth/modules/networks/forms.py:175 +#: plinth/modules/networks/forms.py:61 msgid "" "Optional value. If left blank, a default netmask based on the address will " "be used." msgstr "" -#: plinth/modules/networks/forms.py:78 plinth/modules/networks/forms.py:180 +#: plinth/modules/networks/forms.py:66 #: plinth/modules/networks/templates/connection_show.html:202 #: plinth/modules/networks/templates/connection_show.html:241 msgid "Gateway" msgstr "" -#: plinth/modules/networks/forms.py:79 plinth/modules/networks/forms.py:181 +#: plinth/modules/networks/forms.py:67 msgid "Optional value." msgstr "" -#: plinth/modules/networks/forms.py:83 plinth/modules/networks/forms.py:185 +#: plinth/modules/networks/forms.py:71 msgid "DNS Server" msgstr "" -#: plinth/modules/networks/forms.py:84 plinth/modules/networks/forms.py:186 +#: plinth/modules/networks/forms.py:72 msgid "" "Optional value. If this value is given and IPv4 addressing method is " "\"Automatic\", the DNS Servers provided by a DHCP server will be ignored." msgstr "" -#: plinth/modules/networks/forms.py:90 plinth/modules/networks/forms.py:192 +#: plinth/modules/networks/forms.py:78 msgid "Second DNS Server" msgstr "" -#: plinth/modules/networks/forms.py:91 plinth/modules/networks/forms.py:193 +#: plinth/modules/networks/forms.py:79 msgid "" "Optional value. If this value is given and IPv4 Addressing Method is " "\"Automatic\", the DNS Servers provided by a DHCP server will be ignored." msgstr "" -#: plinth/modules/networks/forms.py:121 -msgid "Show password" +#: plinth/modules/networks/forms.py:89 +msgid "-- select --" msgstr "" -#: plinth/modules/networks/forms.py:145 +#: plinth/modules/networks/forms.py:175 #: plinth/modules/networks/templates/connection_show.html:144 msgid "SSID" msgstr "" -#: plinth/modules/networks/forms.py:146 +#: plinth/modules/networks/forms.py:176 msgid "The visible name of the network." msgstr "" -#: plinth/modules/networks/forms.py:148 +#: plinth/modules/networks/forms.py:178 #: plinth/modules/networks/templates/connection_show.html:157 msgid "Mode" msgstr "" -#: plinth/modules/networks/forms.py:153 +#: plinth/modules/networks/forms.py:183 msgid "Authentication Mode" msgstr "" -#: plinth/modules/networks/forms.py:154 +#: plinth/modules/networks/forms.py:184 msgid "" "Select WPA if the wireless network is secured and requires clients to have " "the password to connect." msgstr "" -#: plinth/modules/networks/forms.py:158 +#: plinth/modules/networks/forms.py:188 msgid "Passphrase" msgstr "" -#: plinth/modules/networks/forms.py:166 -msgid "" -"Select Automatic (DHCP) if you are connecting to an existing wireless " -"network. Shared mode is useful when running an Access Point." -msgstr "" - #: plinth/modules/networks/networks.py:36 #: plinth/modules/networks/networks.py:56 msgid "Network Connections" msgstr "" #: plinth/modules/networks/networks.py:38 -#: plinth/modules/networks/networks.py:273 +#: plinth/modules/networks/networks.py:242 msgid "Nearby Wi-Fi Networks" msgstr "" #: plinth/modules/networks/networks.py:40 -#: plinth/modules/networks/networks.py:295 +#: plinth/modules/networks/networks.py:264 msgid "Add Connection" msgstr "" @@ -1197,58 +1348,58 @@ msgstr "" msgid "This type of connection is not yet understood." msgstr "" -#: plinth/modules/networks/networks.py:170 -#: plinth/modules/networks/networks.py:229 +#: plinth/modules/networks/networks.py:139 +#: plinth/modules/networks/networks.py:198 #: plinth/modules/networks/templates/connections_edit.html:34 msgid "Edit Connection" msgstr "" -#: plinth/modules/networks/networks.py:240 +#: plinth/modules/networks/networks.py:209 #, python-brace-format msgid "Activated connection {name}." msgstr "" -#: plinth/modules/networks/networks.py:243 +#: plinth/modules/networks/networks.py:212 msgid "Failed to activate connection: Connection not found." msgstr "" -#: plinth/modules/networks/networks.py:247 +#: plinth/modules/networks/networks.py:216 #, python-brace-format msgid "Failed to activate connection {name}: No suitable device is available." msgstr "" -#: plinth/modules/networks/networks.py:260 +#: plinth/modules/networks/networks.py:229 #, python-brace-format msgid "Deactivated connection {name}." msgstr "" -#: plinth/modules/networks/networks.py:263 +#: plinth/modules/networks/networks.py:232 msgid "Failed to de-activate connection: Connection not found." msgstr "" -#: plinth/modules/networks/networks.py:325 +#: plinth/modules/networks/networks.py:282 msgid "Adding New Ethernet Connection" msgstr "" -#: plinth/modules/networks/networks.py:350 +#: plinth/modules/networks/networks.py:300 msgid "Adding New PPPoE Connection" msgstr "" -#: plinth/modules/networks/networks.py:399 +#: plinth/modules/networks/networks.py:332 msgid "Adding New Wi-Fi Connection" msgstr "" -#: plinth/modules/networks/networks.py:413 +#: plinth/modules/networks/networks.py:346 #, python-brace-format msgid "Connection {name} deleted." msgstr "" -#: plinth/modules/networks/networks.py:416 -#: plinth/modules/networks/networks.py:425 +#: plinth/modules/networks/networks.py:349 +#: plinth/modules/networks/networks.py:358 msgid "Failed to delete connection: Connection not found." msgstr "" -#: plinth/modules/networks/networks.py:430 +#: plinth/modules/networks/networks.py:363 #: plinth/modules/networks/templates/connections_delete.html:26 msgid "Delete Connection" msgstr "" @@ -1258,7 +1409,7 @@ msgid "Edit connection" msgstr "" #: plinth/modules/networks/templates/connection_show.html:43 -#: plinth/templates/base.html:119 +#: plinth/templates/base.html:123 msgid "Edit" msgstr "" @@ -1405,23 +1556,24 @@ msgstr "" #: plinth/modules/networks/templates/connection_show.html:280 msgid "" -"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." +"This interface should be connected to a 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." msgstr "" #: plinth/modules/networks/templates/connection_show.html:300 msgid "" -"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." +"This interface should receive your Internet connection. If you connect it to " +"a local network/machine, many services meant to available only internally " +"will not be available." msgstr "" #: plinth/modules/networks/templates/connection_show.html:319 +#, python-format msgid "" -"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 " +"This interface is not maintained by %(box_name)s. Its security status is " +"unknown to %(box_name)s. Many %(box_name)s services may not be available on " +"this interface. It is recommended that you deactivate or delete this " "connection and re-configure it." msgstr "" @@ -1513,7 +1665,7 @@ msgstr "" #, python-format msgid "" "Virtual Private Network (VPN) is a technique for securely connecting two " -"machines in order to access resources of a private network. While you are " +"devices in order to access resources of a private network. While you are " "away from home, you can connect to your %(box_name)s in order to join your " "home network and access private/internal services provided by %(box_name)s. " "You can also access the rest of the Internet via %(box_name)s for added " @@ -1530,7 +1682,7 @@ msgid "" "To connect to %(box_name)s'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 documentation on recommended clients and instructions on how to " "configure them." msgstr "" @@ -2028,8 +2180,8 @@ msgid "" "reStore is a server for unhosted web " "applications. The idea is to uncouple web applications from data. No " "matter where a web application is served from, the data can be stored on an " -"unhosted storage server of user's choice. With reStore, your " -"%(cfg.box_name)s becomes your unhosted storage server." +"unhosted storage server of user's choice. With reStore, your %(box_name)s " +"becomes your unhosted storage server." msgstr "" #: plinth/modules/restore/templates/restore_index.html:40 @@ -2106,7 +2258,7 @@ msgstr "" #: plinth/modules/system/system.py:33 #: plinth/modules/system/templates/system.html:25 -#: plinth/templates/base.html:105 +#: plinth/templates/base.html:109 msgid "System Configuration" msgstr "" @@ -2143,7 +2295,7 @@ msgstr "" msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "" -#: plinth/modules/tor/templates/tor.html:26 plinth/modules/tor/tor.py:66 +#: plinth/modules/tor/templates/tor.html:26 plinth/modules/tor/tor.py:68 msgid "Anonymity Network (Tor)" msgstr "" @@ -2199,71 +2351,72 @@ msgstr "" msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "" -#: plinth/modules/tor/tor.py:46 +#: plinth/modules/tor/tor.py:47 msgid "Enable Tor" msgstr "" -#: plinth/modules/tor/tor.py:49 +#: plinth/modules/tor/tor.py:50 msgid "Enable Tor Hidden Service" msgstr "" -#: plinth/modules/tor/tor.py:51 +#: plinth/modules/tor/tor.py:53 +#, python-brace-format msgid "" -"A hidden service will allow FreedomBox to provide selected services (such as " -"ownCloud or Chat) without revealing its location." +"A hidden service will allow {box_name} to provide selected services (such as " +"ownCloud or chat) without revealing its location." msgstr "" -#: plinth/modules/tor/tor.py:55 +#: plinth/modules/tor/tor.py:57 msgid "Download software packages over Tor" msgstr "" -#: plinth/modules/tor/tor.py:57 +#: plinth/modules/tor/tor.py:59 msgid "" "When enabled, software will be downloaded over the Tor network for " "installations and upgrades. This adds a degree of privacy and security " "during software downloads." msgstr "" -#: plinth/modules/tor/tor.py:85 plinth/modules/tor/tor.py:285 +#: plinth/modules/tor/tor.py:87 plinth/modules/tor/tor.py:287 msgid "Tor Hidden Service" msgstr "" -#: plinth/modules/tor/tor.py:115 +#: plinth/modules/tor/tor.py:117 msgid "Tor Control Panel" msgstr "" -#: plinth/modules/tor/tor.py:240 +#: plinth/modules/tor/tor.py:242 #, python-brace-format msgid "Action error: {0} [{1}] [{2}]" msgstr "" -#: plinth/modules/tor/tor.py:256 +#: plinth/modules/tor/tor.py:258 msgid "Tor enabled" msgstr "" -#: plinth/modules/tor/tor.py:259 +#: plinth/modules/tor/tor.py:261 msgid "Tor disabled" msgstr "" -#: plinth/modules/tor/tor.py:264 +#: plinth/modules/tor/tor.py:266 msgid "Tor hidden service enabled" msgstr "" -#: plinth/modules/tor/tor.py:267 +#: plinth/modules/tor/tor.py:269 msgid "Tor hidden service disabled" msgstr "" -#: plinth/modules/tor/tor.py:292 +#: plinth/modules/tor/tor.py:294 msgid "Enabled package download over Tor" msgstr "" -#: plinth/modules/tor/tor.py:295 +#: plinth/modules/tor/tor.py:297 msgid "Disabled package download over Tor" msgstr "" #: plinth/modules/transmission/__init__.py:38 #: plinth/modules/transmission/templates/transmission.html:26 -#: plinth/modules/transmission/views.py:63 +#: plinth/modules/transmission/views.py:67 msgid "BitTorrent (Transmission)" msgstr "" @@ -2329,70 +2482,66 @@ msgid "" "will attempt to perform any package upgrades that are available." msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:40 -msgid "There was an error while upgrading." +#: plinth/modules/upgrades/templates/upgrades.html:37 +msgid "" +"Upgrades install the latest software and security updates. When automatic " +"upgrades are enabled, upgrades are automatically run every night. You don't " +"normally need to start the upgrade process." msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:43 -#: plinth/modules/upgrades/templates/upgrades.html:59 -msgid "Output from unattended-upgrades:" +#: plinth/modules/upgrades/templates/upgrades.html:45 +msgid "" +"Depending on the number of packages to install, this may take a long time to " +"complete. While upgrades are in progress, you will not be able to install " +"other packages. During the upgrade, this web interface may be temporarily " +"unavailable and show an error. Refresh the page to continue." msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:50 -msgid "The operating system is up to date now.  " +#: plinth/modules/upgrades/templates/upgrades.html:58 +msgid "Upgrade now »" msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:53 -msgid "Show Details" +#: plinth/modules/upgrades/templates/upgrades.html:65 +msgid "A package manager is running." msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:69 -msgid "" -"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." +#: plinth/modules/upgrades/templates/upgrades.html:70 +msgid "Recent log from upgrades:" msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:80 -msgid "Upgrade now »" +#: plinth/modules/upgrades/views.py:36 plinth/modules/upgrades/views.py:66 +msgid "Automatic Upgrades" msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:87 -msgid "System is being upgraded." +#: plinth/modules/upgrades/views.py:38 +msgid "Upgrade Packages" msgstr "" -#: plinth/modules/upgrades/views.py:35 plinth/modules/upgrades/views.py:64 -msgid "Automatic Upgrades" +#: plinth/modules/upgrades/views.py:96 +msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:37 -msgid "Upgrade Packages" +#: plinth/modules/upgrades/views.py:99 +msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:75 +#: plinth/modules/upgrades/views.py:102 msgid "Package Upgrades" msgstr "" -#: plinth/modules/upgrades/views.py:116 +#: plinth/modules/upgrades/views.py:131 #, python-brace-format msgid "Error when configuring unattended-upgrades: {error}" msgstr "" -#: plinth/modules/upgrades/views.py:121 +#: plinth/modules/upgrades/views.py:136 msgid "Automatic upgrades enabled" msgstr "" -#: plinth/modules/upgrades/views.py:123 +#: plinth/modules/upgrades/views.py:138 msgid "Automatic upgrades disabled" msgstr "" -#: plinth/modules/upgrades/views.py:142 -msgid "Upgrade completed." -msgstr "" - -#: plinth/modules/upgrades/views.py:144 -msgid "Upgrade failed." -msgstr "" - #: plinth/modules/users/__init__.py:36 msgid "Users and Groups" msgstr "" @@ -2600,8 +2749,9 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "" -#: plinth/service.py:78 -msgid "FreedomBox Web Interface (Plinth)" +#: plinth/service.py:79 +#, python-brace-format +msgid "{box_name} Web Interface (Plinth)" msgstr "" #: plinth/templates/404.html:25 @@ -2632,27 +2782,24 @@ msgid "" msgstr "" #: plinth/templates/base.html:49 -msgid "Plinth administrative interface for the FreedomBox" -msgstr "" - -#: plinth/templates/base.html:52 plinth/templates/base.html.py:88 -msgid "FreedomBox" +#, python-format +msgid "Plinth administrative interface for the %(box_name)s" msgstr "" -#: plinth/templates/base.html:81 +#: plinth/templates/base.html:83 msgid "Toggle navigation" msgstr "" -#: plinth/templates/base.html:121 plinth/templates/base.html.py:122 +#: plinth/templates/base.html:125 plinth/templates/base.html.py:126 msgid "Change password" msgstr "" -#: plinth/templates/base.html:125 plinth/templates/base.html.py:126 -#: plinth/templates/base.html:139 plinth/templates/base.html.py:141 +#: plinth/templates/base.html:129 plinth/templates/base.html.py:130 +#: plinth/templates/base.html:143 plinth/templates/base.html.py:145 msgid "Log out" msgstr "" -#: plinth/templates/base.html:131 plinth/templates/base.html.py:133 +#: plinth/templates/base.html:135 plinth/templates/base.html.py:137 msgid "Log in" msgstr "" From 1260fbbbf850d892025a2f2b106f72b45b0ff0dd Mon Sep 17 00:00:00 2001 From: Caly Date: Thu, 21 Jan 2016 15:15:49 +0100 Subject: [PATCH 025/189] Translated using Weblate (Swedish) Currently translated at 40.2% (226 of 562 strings) --- plinth/locale/sv/LC_MESSAGES/django.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plinth/locale/sv/LC_MESSAGES/django.po b/plinth/locale/sv/LC_MESSAGES/django.po index 48f17f29e..9f3e7bb6d 100644 --- a/plinth/locale/sv/LC_MESSAGES/django.po +++ b/plinth/locale/sv/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-01-15 19:42+0530\n" -"PO-Revision-Date: 2016-01-20 01:22+0000\n" +"PO-Revision-Date: 2016-01-21 15:15+0000\n" "Last-Translator: Caly \n" "Language-Team: Swedish " "\n" @@ -1337,7 +1337,7 @@ msgstr "Anslutningstyp" #: plinth/modules/networks/forms.py:37 msgid "Connection Name" -msgstr "" +msgstr "Anslutningens namn" #: plinth/modules/networks/forms.py:39 msgid "Physical Interface" From f83f0aa79999d29b4a67d95cc298ad4eab4f095a Mon Sep 17 00:00:00 2001 From: cat-git Date: Mon, 25 Jan 2016 22:03:21 +0000 Subject: [PATCH 026/189] action utils is not what we need to list backups --- plinth/action_utils.py | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/plinth/action_utils.py b/plinth/action_utils.py index eb0cea6c8..c102311a5 100644 --- a/plinth/action_utils.py +++ b/plinth/action_utils.py @@ -351,19 +351,6 @@ def get_ip_addresses(): return addresses -def get_snapper_ls(): - """Return a list of snapshots made by snapper.""" - snapshots = [] - - output = subprocess.check_output(['snapper', '-q', '--iso', 'ls', '-t', 'single']) - for line in output.decode().splitlines(): - parts = line.split('|') - if not parts[0].startswith('-') and not parts[0].startswith('#'): - snapshots.append({'number': parts[0], 'date': parts[1]}) - - return snapshots - - def get_hostname(): """Return the current hostname.""" From b7d6c0fd735e98a7dc791e6ffdae7b9c4a20b66d Mon Sep 17 00:00:00 2001 From: cat-git Date: Mon, 25 Jan 2016 22:04:27 +0000 Subject: [PATCH 027/189] better table layout, more accurate description texts and placeholders for pre-backup situation --- plinth/modules/snapper/templates/snapper.html | 36 ++++++++++++++++--- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/plinth/modules/snapper/templates/snapper.html b/plinth/modules/snapper/templates/snapper.html index cae7c46ee..5b2397ca0 100644 --- a/plinth/modules/snapper/templates/snapper.html +++ b/plinth/modules/snapper/templates/snapper.html @@ -27,7 +27,7 @@

{% trans "Snapper" %}

{% blocktrans trimmed %} - Something about snapper + Snapper creates 'snapshots' or backups of the FreedomBox filesystem on an hourly basis. It enables the option to revert to an earlier configuration. Snapper is not essential. {% endblocktrans %}

@@ -57,12 +57,38 @@

{% trans "Configuration" %}

{% trans "Backups" %}

-

- Something about backups + {% if not backups %} + Backups will be available here once created. + {% endif %} + {% if backups %} +

+
+ + + + + + + {% for backup in backups %} -

{{ backup.number }}:{{ backup.date }}

+ + + + + {% endfor %} + +
{% trans "Backup number" %}{% trans "Date" %}{% trans "Restore" %}
+
{{ backup.number }}
+
+
{{ backup.date }}
+
+
+
+
+
+ {% endif %}

{% endblock %} From 049fd4f515b2429790bab6785215d88daa7888aa Mon Sep 17 00:00:00 2001 From: cat-git Date: Mon, 25 Jan 2016 22:05:13 +0000 Subject: [PATCH 028/189] handle the condition where there are no backups --- plinth/modules/snapper/views.py | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/plinth/modules/snapper/views.py b/plinth/modules/snapper/views.py index 828213ffa..389b7c826 100644 --- a/plinth/modules/snapper/views.py +++ b/plinth/modules/snapper/views.py @@ -16,7 +16,7 @@ # """ -Plinth module for configuring date and time +Plinth module for configuring Snapper """ from django.contrib import messages @@ -72,13 +72,17 @@ def get_backups(): """Get the list of backups from snapper.""" snapshots = [] - output = subprocess.check_output(['snapper', '-q', '--iso', 'ls', '-t', 'single']) - for line in output.decode().splitlines(): - parts = line.split('|') - if not parts[0].startswith('-') and not parts[0].startswith('#'): - snapshots.append({'number': parts[0], 'date': parts[1]}) + try: + output = subprocess.check_output(['snapper', '-q', '--iso', 'ls', '-t', 'single']) + for line in output.decode().splitlines(): + parts = line.split('|') + if not parts[0].startswith('-') and not parts[0].startswith('#'): + snapshots.append({'number': parts[0], 'date': parts[1]}) - return snapshots + return snapshots + except subprocess.CalledProcessError: + return False + def get_current_time_zone(): """Get current time zone.""" @@ -97,16 +101,16 @@ def _apply_changes(request, old_status, new_status): snapper.service.notify_enabled(None, new_status['enabled']) messages.success(request, _('Configuration updated')) - if old_status['time_zone'] != new_status['time_zone'] and \ - new_status['time_zone'] != 'none': + if old_status['snapper'] != new_status['snapper'] and \ + new_status['snapper'] != 'none': modified = True try: - actions.superuser_run('timezone-change', [new_status['time_zone']]) + actions.superuser_run('snapper', [new_status['snapper']]) except Exception as exception: - messages.error(request, _('Error setting time zone: {exception}') + messages.error(request, _('Error setting Snapper status: {exception}') .format(exception=exception)) else: - messages.success(request, _('Time zone set')) + messages.success(request, _('Snapper status set')) if not modified: messages.info(request, _('Setting unchanged')) From b7e44eb42926ca59d8309265015b5da6a0901f09 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Fri, 8 Jan 2016 19:56:31 -0500 Subject: [PATCH 029/189] Add repro SIP proxy module. --- actions/repro | 84 +++++++++++++++++++ .../apache2/conf-available/repro-plinth.conf | 11 +++ data/etc/plinth/modules-enabled/repro | 1 + .../lib/firewalld/services/repro-plinth.xml | 8 ++ plinth/modules/repro/__init__.py | 66 +++++++++++++++ plinth/modules/repro/forms.py | 30 +++++++ plinth/modules/repro/templates/repro.html | 80 ++++++++++++++++++ plinth/modules/repro/tests/__init__.py | 0 plinth/modules/repro/urls.py | 29 +++++++ plinth/modules/repro/views.py | 79 +++++++++++++++++ 10 files changed, 388 insertions(+) create mode 100755 actions/repro create mode 100644 data/etc/apache2/conf-available/repro-plinth.conf create mode 100644 data/etc/plinth/modules-enabled/repro create mode 100644 data/usr/lib/firewalld/services/repro-plinth.xml create mode 100644 plinth/modules/repro/__init__.py create mode 100644 plinth/modules/repro/forms.py create mode 100644 plinth/modules/repro/templates/repro.html create mode 100644 plinth/modules/repro/tests/__init__.py create mode 100644 plinth/modules/repro/urls.py create mode 100644 plinth/modules/repro/views.py diff --git a/actions/repro b/actions/repro new file mode 100755 index 000000000..0cd2edbe2 --- /dev/null +++ b/actions/repro @@ -0,0 +1,84 @@ +#!/usr/bin/python3 +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Configuration helper for repro SIP proxy. +""" + +import argparse + +from plinth import action_utils + +CONFIG = '/etc/repro/repro.config' + + +def parse_arguments(): + """Return parsed command line arguments as dictionary.""" + parser = argparse.ArgumentParser() + subparsers = parser.add_subparsers(dest='subcommand', help='Sub command') + + subparsers.add_parser('setup', help='Configure repro') + subparsers.add_parser('enable', help='Enable repro service') + subparsers.add_parser('disable', help='Disable repro service') + + return parser.parse_args() + + +def subcommand_setup(_): + """Configure repro.""" + with open(CONFIG, 'r') as conf: + lines = conf.readlines() + + with open(CONFIG, 'w') as conf: + for line in lines: + if line.startswith('Database1Path'): + # workaround for Debian bug #803113 + conf.write('Database1Path = /var/lib/repro\n') + elif line.startswith('TLSPort'): + conf.write('TLSPort = 5061\n') + elif line.startswith('DisableHttpAuth'): + # let apache handle authentication + conf.write('DisableHttpAuth = true\n') + else: + conf.write(line) + + action_utils.service_restart('repro') + action_utils.webserver_enable('repro-plinth') + + +def subcommand_enable(_): + """Start service.""" + action_utils.service_enable('repro') + + +def subcommand_disable(_): + """Stop service.""" + action_utils.service_disable('repro') + + +def main(): + """Parse arguments and perform all duties.""" + arguments = parse_arguments() + + subcommand = arguments.subcommand.replace('-', '_') + subcommand_method = globals()['subcommand_' + subcommand] + subcommand_method(arguments) + + +if __name__ == '__main__': + main() diff --git a/data/etc/apache2/conf-available/repro-plinth.conf b/data/etc/apache2/conf-available/repro-plinth.conf new file mode 100644 index 000000000..e7b0c38d9 --- /dev/null +++ b/data/etc/apache2/conf-available/repro-plinth.conf @@ -0,0 +1,11 @@ + + ProxyPass http://localhost:5080 + + AuthType basic + AuthName "FreedomBox Login" + AuthBasicProvider ldap + AuthLDAPUrl "ldap:///ou=users,dc=thisbox?uid" + AuthLDAPGroupAttribute memberUid + AuthLDAPGroupAttributeIsDN off + Require ldap-group cn=admin,ou=groups,dc=thisbox + diff --git a/data/etc/plinth/modules-enabled/repro b/data/etc/plinth/modules-enabled/repro new file mode 100644 index 000000000..38592b66d --- /dev/null +++ b/data/etc/plinth/modules-enabled/repro @@ -0,0 +1 @@ +plinth.modules.repro diff --git a/data/usr/lib/firewalld/services/repro-plinth.xml b/data/usr/lib/firewalld/services/repro-plinth.xml new file mode 100644 index 000000000..2abc90c41 --- /dev/null +++ b/data/usr/lib/firewalld/services/repro-plinth.xml @@ -0,0 +1,8 @@ + + + repro SIP proxy + repro is a SIP proxy server. It provides authentication, authorization, and call routing features. + + + + diff --git a/plinth/modules/repro/__init__.py b/plinth/modules/repro/__init__.py new file mode 100644 index 000000000..d7dc17bd7 --- /dev/null +++ b/plinth/modules/repro/__init__.py @@ -0,0 +1,66 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Plinth module for repro. +""" + +from django.utils.translation import ugettext_lazy as _ + +from plinth import action_utils +from plinth import cfg +from plinth import service as service_module + +depends = ['plinth.modules.apps'] + +service = None + + +def init(): + """Initialize the repro module.""" + menu = cfg.main_menu.get('apps:index') + menu.add_urlname(_('SIP Proxy (Repro)'), 'glyphicon-phone-alt', + 'repro:index', 800) + + global service + service = service_module.Service( + 'repro', _('Repro SIP Proxy'), + is_external=True, enabled=is_enabled()) + + +def is_enabled(): + """Return whether the service is enabled.""" + return action_utils.service_is_enabled('repro') + + +def is_running(): + """Return whether the service is running.""" + return action_utils.service_is_running('repro') + + +def diagnose(): + """Run diagnostics and return the results.""" + results = [] + + results.append(action_utils.diagnose_port_listening(5060, 'udp4')) + results.append(action_utils.diagnose_port_listening(5060, 'udp6')) + results.append(action_utils.diagnose_port_listening(5060, 'tcp4')) + results.append(action_utils.diagnose_port_listening(5060, 'tcp6')) + results.append(action_utils.diagnose_port_listening(5061, 'tcp4')) + results.append(action_utils.diagnose_port_listening(5061, 'tcp6')) + + return results diff --git a/plinth/modules/repro/forms.py b/plinth/modules/repro/forms.py new file mode 100644 index 000000000..1fd313222 --- /dev/null +++ b/plinth/modules/repro/forms.py @@ -0,0 +1,30 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Forms for repro module. +""" + +from django import forms +from django.utils.translation import ugettext_lazy as _ + + +class ReproForm(forms.Form): + """Configuration form.""" + enabled = forms.BooleanField( + label=_('Enable Repro service'), + required=False) diff --git a/plinth/modules/repro/templates/repro.html b/plinth/modules/repro/templates/repro.html new file mode 100644 index 000000000..c6df8731c --- /dev/null +++ b/plinth/modules/repro/templates/repro.html @@ -0,0 +1,80 @@ +{% extends "base.html" %} +{% comment %} +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +{% endcomment %} + +{% load bootstrap %} +{% load i18n %} + +{% block content %} + +

{% trans "SIP Proxy (Repro)" %}

+ +

+ {% blocktrans trimmed %} + Repro is a SIP proxy service that a SIP softphone can connect to. Before + using Repro, the domain and users will need to be configured using the + web-based configuration panel, available at + /repro/domains.html. Users in the + admin group will be able to log in to the Repro configuration panel. + {% endblocktrans %} +

+ +

+ {% blocktrans trimmed %} + Note: After setting the domain, it is required to restart the Repro + service. Disable the service using the checkbox and Update setup button + below. Then, re-enable the service. + {% endblocktrans %} +

+ +

+ {% blocktrans trimmed %} + To make SIP calls, a client application is needed. Available clients include + Jitsi (for computers) and + + CSipSimple (for Android phones). + {% endblocktrans %} +

+ +

{% trans "Status" %}

+ +

+ {% if status.is_running %} + + {% trans "Repro service is running" %} + {% else %} + + {% trans "Repro service is not running" %} + {% endif %} +

+ +{% include "diagnostics_button.html" with module="repro" %} + +

{% trans "Configuration" %}

+ +
+ {% csrf_token %} + + {{ form|bootstrap }} + + +
+ +{% endblock %} diff --git a/plinth/modules/repro/tests/__init__.py b/plinth/modules/repro/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/plinth/modules/repro/urls.py b/plinth/modules/repro/urls.py new file mode 100644 index 000000000..d87f8136b --- /dev/null +++ b/plinth/modules/repro/urls.py @@ -0,0 +1,29 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +URLs for the repro module. +""" + +from django.conf.urls import url + +from . import views + + +urlpatterns = [ + url(r'^apps/repro/$', views.index, name='index'), +] diff --git a/plinth/modules/repro/views.py b/plinth/modules/repro/views.py new file mode 100644 index 000000000..3b3bbe506 --- /dev/null +++ b/plinth/modules/repro/views.py @@ -0,0 +1,79 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Views for repro module. +""" + +from django.contrib import messages +from django.template.response import TemplateResponse +from django.utils.translation import ugettext as _ + +from .forms import ReproForm +from plinth import actions +from plinth import package +from plinth.modules import repro + + +def on_install(): + """Notify that the service is now enabled.""" + actions.superuser_run('repro', ['setup']) + repro.service.notify_enabled(None, True) + + +@package.required(['repro'], on_install=on_install) +def index(request): + """Serve configuration page.""" + status = get_status() + + form = None + + if request.method == 'POST': + form = ReproForm(request.POST, prefix='repro') + if form.is_valid(): + _apply_changes(request, status, form.cleaned_data) + status = get_status() + form = ReproForm(initial=status, prefix='repro') + else: + form = ReproForm(initial=status, prefix='repro') + + return TemplateResponse(request, 'repro.html', + {'title': _('SIP Proxy (Repro)'), + 'status': status, + 'form': form}) + + +def get_status(): + """Get the current service status.""" + return {'enabled': repro.is_enabled(), + 'is_running': repro.is_running()} + + +def _apply_changes(request, old_status, new_status): + """Apply the changes.""" + modified = False + + if old_status['enabled'] != new_status['enabled']: + sub_command = 'enable' if new_status['enabled'] else 'disable' + actions.superuser_run('repro', [sub_command]) + repro.service.notify_enabled(None, new_status['enabled']) + modified = True + + if modified: + messages.success(request, _('Configuration updated')) + else: + messages.info(request, _('Setting unchanged')) From 5805351f50b6ac2bd47d6359565f206675300a9d Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Wed, 27 Jan 2016 16:28:22 +0530 Subject: [PATCH 030/189] repro: Split firewall service as sip and sips - Since SIP is a generic protocol implemented by various servers, the firewall service must describe the protocol instead of the application. This is similar to the way firewalld handles http/https. This also make the service descriptions more acceptable by upstream. - Split unencrypted and encrypted services so that one can enabled without the other (a possibility with SIP). - Add 5061/UDP for SIP over DTLS and DCCP. --- data/usr/lib/firewalld/services/repro-plinth.xml | 8 -------- data/usr/lib/firewalld/services/sip-plinth.xml | 7 +++++++ data/usr/lib/firewalld/services/sip-tls-plinth.xml | 7 +++++++ plinth/modules/repro/__init__.py | 2 +- 4 files changed, 15 insertions(+), 9 deletions(-) delete mode 100644 data/usr/lib/firewalld/services/repro-plinth.xml create mode 100644 data/usr/lib/firewalld/services/sip-plinth.xml create mode 100644 data/usr/lib/firewalld/services/sip-tls-plinth.xml diff --git a/data/usr/lib/firewalld/services/repro-plinth.xml b/data/usr/lib/firewalld/services/repro-plinth.xml deleted file mode 100644 index 2abc90c41..000000000 --- a/data/usr/lib/firewalld/services/repro-plinth.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - repro SIP proxy - repro is a SIP proxy server. It provides authentication, authorization, and call routing features. - - - - diff --git a/data/usr/lib/firewalld/services/sip-plinth.xml b/data/usr/lib/firewalld/services/sip-plinth.xml new file mode 100644 index 000000000..47d6c12db --- /dev/null +++ b/data/usr/lib/firewalld/services/sip-plinth.xml @@ -0,0 +1,7 @@ + + + SIP + The Session Initiaion Protocol (SIP) is commonly used in Internet telephony for audio/video calls and instant messaging. Enable this if you are running a SIP proxy, registrar, redirector or gateway server over an unencrypted channel. + + + diff --git a/data/usr/lib/firewalld/services/sip-tls-plinth.xml b/data/usr/lib/firewalld/services/sip-tls-plinth.xml new file mode 100644 index 000000000..50b97a100 --- /dev/null +++ b/data/usr/lib/firewalld/services/sip-tls-plinth.xml @@ -0,0 +1,7 @@ + + + SIP over TLS/DTLS + The Session Initiaion Protocol (SIP) is commonly used in Internet telephony for audio/video calls and instant messaging. Enable this if you are running a SIP proxy, registrar, redirector or gateway server over a channel encrypted using TLS or DTLS. + + + diff --git a/plinth/modules/repro/__init__.py b/plinth/modules/repro/__init__.py index d7dc17bd7..75961bc21 100644 --- a/plinth/modules/repro/__init__.py +++ b/plinth/modules/repro/__init__.py @@ -38,7 +38,7 @@ def init(): global service service = service_module.Service( - 'repro', _('Repro SIP Proxy'), + 'repro', _('repro SIP Proxy'), ['sip-plinth', 'sip-tls-plinth'], is_external=True, enabled=is_enabled()) From 57fd2a2ea2dc48aae2c6690739613033d227009a Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Wed, 27 Jan 2016 16:32:26 +0530 Subject: [PATCH 031/189] repro: Minor styling and message changes - Indentation for HTML template consistent with other templates. - Style 'repro' like the upstream project does in all small case. - Better describe the functions of a SIP server and organize the actions to be done by the user. - Set the menu weight so that it does not clash with an existing module. - Name the application 'SIP Server' instead of 'SIP Proxy' as that better describes the capabilities of the repro and is simpler for users to understand. --- .../apache2/conf-available/repro-plinth.conf | 4 + plinth/modules/repro/__init__.py | 6 +- plinth/modules/repro/forms.py | 2 +- plinth/modules/repro/templates/repro.html | 89 ++++++++++--------- plinth/modules/repro/views.py | 2 +- 5 files changed, 55 insertions(+), 48 deletions(-) diff --git a/data/etc/apache2/conf-available/repro-plinth.conf b/data/etc/apache2/conf-available/repro-plinth.conf index e7b0c38d9..6b8bc2e82 100644 --- a/data/etc/apache2/conf-available/repro-plinth.conf +++ b/data/etc/apache2/conf-available/repro-plinth.conf @@ -1,3 +1,7 @@ +## +## On all sites, provide repro admin interface on a path: /repro +## Only allow users of admin LDAP group. +## ProxyPass http://localhost:5080 diff --git a/plinth/modules/repro/__init__.py b/plinth/modules/repro/__init__.py index 75961bc21..7517052f8 100644 --- a/plinth/modules/repro/__init__.py +++ b/plinth/modules/repro/__init__.py @@ -33,12 +33,12 @@ def init(): """Initialize the repro module.""" menu = cfg.main_menu.get('apps:index') - menu.add_urlname(_('SIP Proxy (Repro)'), 'glyphicon-phone-alt', - 'repro:index', 800) + menu.add_urlname(_('SIP Server (repro)'), 'glyphicon-phone-alt', + 'repro:index', 825) global service service = service_module.Service( - 'repro', _('repro SIP Proxy'), ['sip-plinth', 'sip-tls-plinth'], + 'repro', _('repro SIP Server'), ['sip-plinth', 'sip-tls-plinth'], is_external=True, enabled=is_enabled()) diff --git a/plinth/modules/repro/forms.py b/plinth/modules/repro/forms.py index 1fd313222..b584701cd 100644 --- a/plinth/modules/repro/forms.py +++ b/plinth/modules/repro/forms.py @@ -26,5 +26,5 @@ class ReproForm(forms.Form): """Configuration form.""" enabled = forms.BooleanField( - label=_('Enable Repro service'), + label=_('Enable repro service'), required=False) diff --git a/plinth/modules/repro/templates/repro.html b/plinth/modules/repro/templates/repro.html index c6df8731c..1d4b2fe7d 100644 --- a/plinth/modules/repro/templates/repro.html +++ b/plinth/modules/repro/templates/repro.html @@ -23,58 +23,61 @@ {% block content %} -

{% trans "SIP Proxy (Repro)" %}

+

{% trans "SIP Server (repro)" %}

-

- {% blocktrans trimmed %} - Repro is a SIP proxy service that a SIP softphone can connect to. Before - using Repro, the domain and users will need to be configured using the - web-based configuration panel, available at - /repro/domains.html. Users in the - admin group will be able to log in to the Repro configuration panel. - {% endblocktrans %} -

+

+ {% blocktrans trimmed %} + repro provides various SIP services that a SIP softphone can utilize to + provide audio and video calls as well as presence and instant messaging. + repro provides a server and SIP user accounts that clients can use to let + their presence known. It also acts as a proxy to federate SIP + communications to other servers on the Internet similar to email. + {% endblocktrans %} +

-

- {% blocktrans trimmed %} - Note: After setting the domain, it is required to restart the Repro - service. Disable the service using the checkbox and Update setup button - below. Then, re-enable the service. - {% endblocktrans %} -

+

+ {% blocktrans trimmed %} + To make SIP calls, a client application is needed. Available clients + include Jitsi (for computers) and + + CSipSimple (for Android phones). + {% endblocktrans %} +

-

- {% blocktrans trimmed %} - To make SIP calls, a client application is needed. Available clients include - Jitsi (for computers) and - - CSipSimple (for Android phones). - {% endblocktrans %} -

+

+ {% blocktrans trimmed %} + Note: Before using repro, domains and users will need + to be configured using the web-based + configuration panel. Users in the admin group will be able + to log in to the repro configuration panel. After setting the domain, it + is required to restart the repro service. Disable the service and + re-enable it. + {% endblocktrans %} +

-

{% trans "Status" %}

+

{% trans "Status" %}

-

- {% if status.is_running %} - - {% trans "Repro service is running" %} - {% else %} - - {% trans "Repro service is not running" %} - {% endif %} -

+

+ {% if status.is_running %} + + {% trans "repro service is running" %} + {% else %} + + {% trans "repro service is not running" %} + {% endif %} +

-{% include "diagnostics_button.html" with module="repro" %} + {% include "diagnostics_button.html" with module="repro" %} -

{% trans "Configuration" %}

+

{% trans "Configuration" %}

-
- {% csrf_token %} + + {% csrf_token %} - {{ form|bootstrap }} + {{ form|bootstrap }} - -
+ + {% endblock %} diff --git a/plinth/modules/repro/views.py b/plinth/modules/repro/views.py index 3b3bbe506..40392f48a 100644 --- a/plinth/modules/repro/views.py +++ b/plinth/modules/repro/views.py @@ -52,7 +52,7 @@ def index(request): form = ReproForm(initial=status, prefix='repro') return TemplateResponse(request, 'repro.html', - {'title': _('SIP Proxy (Repro)'), + {'title': _('SIP Server (repro)'), 'status': status, 'form': form}) From 81b3f959fe676cb9a747ed73eb29fd28d2363030 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Thu, 28 Jan 2016 08:14:27 +0530 Subject: [PATCH 032/189] Create locale zh_CN --- plinth/locale/zh_CN/LC_MESSAGES/django.po | 2893 +++++++++++++++++++++ 1 file changed, 2893 insertions(+) create mode 100644 plinth/locale/zh_CN/LC_MESSAGES/django.po diff --git a/plinth/locale/zh_CN/LC_MESSAGES/django.po b/plinth/locale/zh_CN/LC_MESSAGES/django.po new file mode 100644 index 000000000..099853fec --- /dev/null +++ b/plinth/locale/zh_CN/LC_MESSAGES/django.po @@ -0,0 +1,2893 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-01-28 08:07+0530\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: plinth/action_utils.py:203 +#, python-brace-format +msgid "Listening on {kind} port {listen_address}:{port}" +msgstr "" + +#: plinth/action_utils.py:206 +#, python-brace-format +msgid "Listening on {kind} port {port}" +msgstr "" + +#: plinth/action_utils.py:287 +#, python-brace-format +msgid "Access URL {url} on tcp{kind}" +msgstr "" + +#: plinth/action_utils.py:290 +#, python-brace-format +msgid "Access URL {url}" +msgstr "" + +#: plinth/action_utils.py:321 +#, python-brace-format +msgid "Connect to {host}:{port}" +msgstr "" + +#: plinth/action_utils.py:324 +#, python-brace-format +msgid "Cannot connect to {host}:{port}" +msgstr "" + +#: plinth/context_processors.py:36 +msgid "FreedomBox" +msgstr "" + +#: plinth/modules/apps/apps.py:26 +msgid "Apps" +msgstr "" + +#: plinth/modules/apps/apps.py:32 plinth/templates/base.html.py:93 +msgid "Applications" +msgstr "" + +#: plinth/modules/apps/templates/apps.html:25 +msgid "Services and Applications" +msgstr "" + +#: plinth/modules/apps/templates/apps.html:28 +#, python-format +msgid "" +"You can install and run various services and applications on your " +"%(box_name)s. Click on any app page link on the left to read a description " +"of the application and choose to install it." +msgstr "" + +#: plinth/modules/apps/templates/apps.html:36 +msgid "" +"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!" +msgstr "" + +#: plinth/modules/avahi/__init__.py:40 plinth/modules/avahi/__init__.py:45 +#: plinth/modules/avahi/templates/avahi.html:26 +#: plinth/modules/avahi/views.py:53 +msgid "Service Discovery" +msgstr "" + +#: plinth/modules/avahi/forms.py:29 +msgid "Enable service discovery" +msgstr "" + +#: plinth/modules/avahi/templates/avahi.html:29 +#, python-format +msgid "" +"Service discovery allows other devices on the network to discover your " +"%(box_name)s and services running on it. It also allows %(box_name)s to " +"discover other devices 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." +msgstr "" + +#: plinth/modules/avahi/templates/avahi.html:40 +#: plinth/modules/datetime/templates/datetime.html:35 +#: plinth/modules/deluge/templates/deluge.html:39 +#: plinth/modules/dynamicdns/dynamicdns.py:39 +#: plinth/modules/firewall/templates/firewall.html:57 +#: plinth/modules/mumble/templates/mumble.html:44 +#: plinth/modules/networks/templates/connection_show.html:261 +#: plinth/modules/openvpn/templates/openvpn.html:81 +#: plinth/modules/privoxy/templates/privoxy.html:48 +#: plinth/modules/quassel/templates/quassel.html:50 +#: plinth/modules/repro/templates/repro.html:58 +#: plinth/modules/tor/templates/tor.html:39 +#: plinth/modules/transmission/templates/transmission.html:42 +#: plinth/modules/xmpp/templates/xmpp.html:58 +msgid "Status" +msgstr "" + +#: plinth/modules/avahi/templates/avahi.html:45 +msgid "Service discovery server is running" +msgstr "" + +#: plinth/modules/avahi/templates/avahi.html:48 +msgid "Service discovery server is not running" +msgstr "" + +#: plinth/modules/avahi/templates/avahi.html:52 +#: plinth/modules/datetime/templates/datetime.html:48 +#: plinth/modules/deluge/templates/deluge.html:53 +#: plinth/modules/ikiwiki/templates/ikiwiki.html:35 +#: plinth/modules/mumble/templates/mumble.html:59 +#: plinth/modules/openvpn/templates/openvpn.html:130 +#: plinth/modules/owncloud/templates/owncloud.html:51 +#: plinth/modules/privoxy/templates/privoxy.html:62 +#: plinth/modules/quassel/templates/quassel.html:65 +#: plinth/modules/repro/templates/repro.html:72 +#: plinth/modules/roundcube/templates/roundcube.html:62 +#: plinth/modules/shaarli/templates/shaarli.html:40 +#: plinth/modules/tor/templates/tor.html:74 +#: plinth/modules/transmission/templates/transmission.html:56 +#: plinth/modules/xmpp/templates/xmpp.html:72 +msgid "Configuration" +msgstr "" + +#: plinth/modules/avahi/templates/avahi.html:60 +#: plinth/modules/datetime/templates/datetime.html:56 +#: plinth/modules/deluge/templates/deluge.html:61 +#: plinth/modules/dynamicdns/templates/dynamicdns_configure.html:40 +#: plinth/modules/ikiwiki/templates/ikiwiki.html:43 +#: plinth/modules/ikiwiki/templates/ikiwiki_create.html:32 +#: plinth/modules/mumble/templates/mumble.html:67 +#: plinth/modules/openvpn/templates/openvpn.html:138 +#: plinth/modules/privoxy/templates/privoxy.html:70 +#: plinth/modules/quassel/templates/quassel.html:73 +#: plinth/modules/repro/templates/repro.html:80 +#: plinth/modules/restore/templates/restore_index.html:54 +#: plinth/modules/roundcube/templates/roundcube.html:70 +#: plinth/modules/shaarli/templates/shaarli.html:48 +#: plinth/modules/tor/templates/tor.html:82 +#: plinth/modules/transmission/templates/transmission.html:64 +#: plinth/modules/upgrades/templates/upgrades_configure.html:34 +#: plinth/modules/xmpp/templates/xmpp.html:80 +msgid "Update setup" +msgstr "" + +#: plinth/modules/avahi/views.py:73 plinth/modules/datetime/views.py:85 +#: plinth/modules/deluge/views.py:80 +#: plinth/modules/dynamicdns/dynamicdns.py:371 +#: plinth/modules/ikiwiki/views.py:95 plinth/modules/mumble/views.py:80 +#: plinth/modules/openvpn/views.py:142 plinth/modules/privoxy/views.py:83 +#: plinth/modules/quassel/views.py:76 plinth/modules/repro/views.py:77 +#: plinth/modules/restore/views.py:68 plinth/modules/roundcube/views.py:84 +#: plinth/modules/shaarli/views.py:74 plinth/modules/transmission/views.py:109 +#: plinth/modules/xmpp/views.py:100 +msgid "Configuration updated" +msgstr "" + +#: plinth/modules/avahi/views.py:76 plinth/modules/datetime/views.py:99 +#: plinth/modules/deluge/views.py:82 plinth/modules/ikiwiki/views.py:97 +#: plinth/modules/mumble/views.py:82 plinth/modules/openvpn/views.py:144 +#: plinth/modules/owncloud/owncloud.py:93 plinth/modules/privoxy/views.py:85 +#: plinth/modules/quassel/views.py:78 plinth/modules/repro/views.py:79 +#: plinth/modules/restore/views.py:70 plinth/modules/roundcube/views.py:86 +#: plinth/modules/shaarli/views.py:76 plinth/modules/tor/tor.py:252 +#: plinth/modules/transmission/views.py:111 +#: plinth/modules/upgrades/views.py:118 plinth/modules/xmpp/views.py:102 +msgid "Setting unchanged" +msgstr "" + +#: plinth/modules/config/config.py:84 plinth/modules/config/config.py:121 +#: plinth/modules/dynamicdns/dynamicdns.py:148 +msgid "Invalid domain name" +msgstr "" + +#: plinth/modules/config/config.py:95 +msgid "Hostname" +msgstr "" + +#: plinth/modules/config/config.py:97 +#, python-brace-format +msgid "" +"Hostname is the local name by which other devices on the local network can " +"reach your {box_name}. It must start and end with an alphabet or a digit " +"and have as interior characters only alphabets, digits and hyphens. Total " +"length must be 63 characters or less." +msgstr "" + +#: plinth/modules/config/config.py:105 +msgid "Invalid hostname" +msgstr "" + +#: plinth/modules/config/config.py:108 plinth/modules/config/config.py:153 +#: plinth/modules/config/config.py:265 +#: plinth/modules/dynamicdns/dynamicdns.py:143 +msgid "Domain Name" +msgstr "" + +#: plinth/modules/config/config.py:110 +#, python-brace-format +msgid "" +"Domain name is the global name by which other devices on the Internet can " +"reach your {box_name}. It must consist of labels separated by dots. Each " +"label must start and end with an alphabet or a digit and have as interior " +"characters only alphabets, digits and hyphens. Length of each label must be " +"63 characters or less. Total length of domain name must be 253 characters " +"or less." +msgstr "" + +#: plinth/modules/config/config.py:125 +msgid "Language" +msgstr "" + +#: plinth/modules/config/config.py:127 +msgid "Language for this web administration interface" +msgstr "" + +#: plinth/modules/config/config.py:135 +#: plinth/modules/dynamicdns/dynamicdns.py:37 +#: plinth/modules/ikiwiki/views.py:36 +msgid "Configure" +msgstr "" + +#: plinth/modules/config/config.py:176 +msgid "General Configuration" +msgstr "" + +#: plinth/modules/config/config.py:193 +#, python-brace-format +msgid "Error setting hostname: {exception}" +msgstr "" + +#: plinth/modules/config/config.py:196 +msgid "Hostname set" +msgstr "" + +#: plinth/modules/config/config.py:202 +#, python-brace-format +msgid "Error setting domain name: {exception}" +msgstr "" + +#: plinth/modules/config/config.py:205 +msgid "Domain name set" +msgstr "" + +#: plinth/modules/config/config.py:213 +#, python-brace-format +msgid "Error setting language: {exception}" +msgstr "" + +#: plinth/modules/config/config.py:216 +msgid "Language changed" +msgstr "" + +#: plinth/modules/config/templates/config.html:32 +msgid "Submit" +msgstr "" + +#: plinth/modules/datetime/__init__.py:39 +#: plinth/modules/datetime/templates/datetime.html:26 +#: plinth/modules/datetime/views.py:58 +msgid "Date & Time" +msgstr "" + +#: plinth/modules/datetime/__init__.py:44 +msgid "Network Time Server" +msgstr "" + +#: plinth/modules/datetime/__init__.py:76 +msgid "NTP client in contact with servers" +msgstr "" + +#: plinth/modules/datetime/forms.py:31 +msgid "Enable network time" +msgstr "" + +#: plinth/modules/datetime/forms.py:35 +msgid "Time Zone" +msgstr "" + +#: plinth/modules/datetime/forms.py:36 +msgid "" +"Set your time zone to get accurate timestamps. This will set the systemwide " +"time zone." +msgstr "" + +#: plinth/modules/datetime/forms.py:47 +msgid "-- no time zone set --" +msgstr "" + +#: plinth/modules/datetime/templates/datetime.html:29 +msgid "" +"Network time server is a program that maintians the system time in " +"synchronization with servers on the Internet." +msgstr "" + +#: plinth/modules/datetime/templates/datetime.html:40 +msgid "Network time server is running" +msgstr "" + +#: plinth/modules/datetime/templates/datetime.html:43 +msgid "Network time server is not running" +msgstr "" + +#: plinth/modules/datetime/views.py:93 +#, python-brace-format +msgid "Error setting time zone: {exception}" +msgstr "" + +#: plinth/modules/datetime/views.py:96 +msgid "Time zone set" +msgstr "" + +#: plinth/modules/deluge/__init__.py:38 plinth/modules/deluge/views.py:56 +msgid "BitTorrent (Deluge)" +msgstr "" + +#: plinth/modules/deluge/__init__.py:43 +msgid "Deluge BitTorrent" +msgstr "" + +#: plinth/modules/deluge/forms.py:29 +msgid "Enable Deluge" +msgstr "" + +#: plinth/modules/deluge/templates/deluge.html:26 +msgid "BitTorrent Web Client (Deluge)" +msgstr "" + +#: plinth/modules/deluge/templates/deluge.html:28 +msgid "Deluge is a BitTorrent client that features a Web UI." +msgstr "" + +#: plinth/modules/deluge/templates/deluge.html:31 +msgid "" +"When enabled, the Deluge web client will be available from /deluge path on the web server. The default password is 'deluge', but " +"you should log in and change it immediately after enabling this service." +msgstr "" + +#: plinth/modules/deluge/templates/deluge.html:44 +msgid "deluge-web is running" +msgstr "" + +#: plinth/modules/deluge/templates/deluge.html:47 +msgid "deluge-web is not running" +msgstr "" + +#: plinth/modules/diagnostics/diagnostics.py:45 +msgid "Diagnostics" +msgstr "" + +#: plinth/modules/diagnostics/diagnostics.py:55 +msgid "System Diagnostics" +msgstr "" + +#: plinth/modules/diagnostics/diagnostics.py:78 +msgid "Diagnostic Test" +msgstr "" + +#: plinth/modules/diagnostics/templates/diagnostics.html:37 +msgid "" +"The system diagnostic test will run a number of checks on your system to " +"confirm that applications and services are working as expected." +msgstr "" + +#: plinth/modules/diagnostics/templates/diagnostics.html:50 +#: plinth/modules/diagnostics/templates/diagnostics_button.html:27 +msgid "Run Diagnostics" +msgstr "" + +#: plinth/modules/diagnostics/templates/diagnostics.html:53 +msgid "Diagnotics test is currently running" +msgstr "" + +#: plinth/modules/diagnostics/templates/diagnostics.html:66 +msgid "Results" +msgstr "" + +#: plinth/modules/diagnostics/templates/diagnostics.html:74 +#, python-format +msgid "Module: %(module)s" +msgstr "" + +#: plinth/modules/diagnostics/templates/diagnostics_module.html:25 +msgid "Diagnostic Results" +msgstr "" + +#: plinth/modules/diagnostics/templates/diagnostics_module.html:27 +#, python-format +msgid "Module: %(module_name)s" +msgstr "" + +#: plinth/modules/diagnostics/templates/diagnostics_module.html:32 +msgid "This module does not support diagnostics" +msgstr "" + +#: plinth/modules/diagnostics/templates/diagnostics_results.html:27 +msgid "Test" +msgstr "" + +#: plinth/modules/diagnostics/templates/diagnostics_results.html:28 +msgid "Result" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:35 plinth/modules/help/help.py:40 +msgid "About" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:45 +#: plinth/modules/dynamicdns/dynamicdns.py:54 +msgid "Dynamic DNS" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:71 +msgid "" +"The Variables <User>, <Pass>, <Ip>, <Domain> may be " +"used within the URL. For details see the update URL templates of the example " +"providers." +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:75 +msgid "" +"Please choose an update protocol according to your provider. If your " +"provider does not support the GnudIP protocol or your provider is not listed " +"you may use the update URL of your provider." +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:80 +msgid "" +"Please do not enter a URL here (like \"https://example.com/\") but only the " +"hostname of the GnuDIP server (like \"example.com\")." +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:84 +#, python-brace-format +msgid "The public domain name you want use to reach your {box_name}." +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:87 +msgid "Use this option if your provider uses self signed certificates." +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:90 +msgid "" +"If this option is selected, your username and password will be used for HTTP " +"basic authentication." +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:93 +msgid "" +"Leave this field empty if you want to keep your previous configured password." +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:96 +#, python-brace-format +msgid "" +"Optional Value. If your {box_name} is not connected directly to the Internet " +"(i.e. connected to a NAT router) this URL is used to figure out the real " +"Internet IP. The URL should simply return the IP where the client comes from " +"(example: http://myip.datasystems24.de)." +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:104 +msgid "" +"You should have been requested to select a username when you created the " +"account." +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:115 +msgid "Enable Dynamic DNS" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:118 +msgid "Service type" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:123 +msgid "GnudIP Server Address" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:128 +msgid "Invalid server name" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:131 +msgid "Update URL" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:135 +msgid "Accept all SSL certificates" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:139 +msgid "Use HTTP basic authentication" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:151 +#: plinth/modules/networks/forms.py:146 plinth/modules/transmission/forms.py:39 +msgid "Username" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:154 +#: plinth/modules/networks/forms.py:147 plinth/modules/transmission/forms.py:43 +msgid "Password" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:157 +#: plinth/modules/networks/forms.py:149 +msgid "Show password" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:161 +msgid "IP check URL" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:187 +msgid "Please provide update URL or a GnuDIP Server" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:190 +msgid "Please provide GnuDIP username" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:193 +msgid "Please provide GnuDIP domain" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:198 +msgid "Please provide a password" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:217 +msgid "Configure Dynamic DNS" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:239 +msgid "Status of Dynamic DNS" +msgstr "" + +#: plinth/modules/dynamicdns/templates/dynamicdns.html:25 +msgid "Dynamic DNS Client" +msgstr "" + +#: plinth/modules/dynamicdns/templates/dynamicdns.html:28 +#, python-format +msgid "" +"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 %(box_name)s, such as ownCloud." +msgstr "" + +#: plinth/modules/dynamicdns/templates/dynamicdns.html:37 +msgid "" +"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 gnudip 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." +msgstr "" + +#: plinth/modules/dynamicdns/templates/dynamicdns.html:50 +msgid "" +"If you are looking for a free dynamic DNS account, you may find a free " +"GnuDIP service at gnudip.datasystems24.net or you may find free update URL " +"based services on " +"freedns.afraid.org." +msgstr "" + +#: plinth/modules/dynamicdns/templates/dynamicdns.html:61 +#, python-format +msgid "" +"If your %(box_name)s is connected behind some NAT router, don't forget to " +"add port forwarding (i.e. forward some standard ports like 80 and 443)." +msgstr "" + +#: plinth/modules/dynamicdns/templates/dynamicdns_configure.html:30 +msgid "" +"You have disabled Javascript. Dynamic form mode is disabled and some helper " +"functions may not work (but the main functionality should work)." +msgstr "" + +#: plinth/modules/dynamicdns/templates/dynamicdns_status.html:25 +msgid "NAT type" +msgstr "" + +#: plinth/modules/dynamicdns/templates/dynamicdns_status.html:29 +msgid "" +"NAT type not detected yet, if you do not provide a \"IP check URL\" we will " +"not detect a NAT type." +msgstr "" + +#: plinth/modules/dynamicdns/templates/dynamicdns_status.html:35 +msgid "Direct connection to the Internet." +msgstr "" + +#: plinth/modules/dynamicdns/templates/dynamicdns_status.html:37 +#, python-format +msgid "" +"Behind NAT. This means that Dynamic DNS service will poll the \"IP check URL" +"\" for changes (the \"IP check URL\" entry is needed for this - otherwise IP " +"changes will not be detected). In case the WAN IP changes, it may take up " +"to %(timer)s minutes until your DNS entry is updated." +msgstr "" + +#: plinth/modules/dynamicdns/templates/dynamicdns_status.html:48 +msgid "Last update" +msgstr "" + +#: plinth/modules/firewall/firewall.py:39 +#: plinth/modules/firewall/firewall.py:49 +#: plinth/modules/firewall/firewall.py:57 +msgid "Firewall" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:28 +#, python-format +msgid "" +"Firewall is a security system that controls the incoming and outgoing " +"network traffic on your %(box_name)s. Keeping a firewall enabled and " +"properly configured reduces risk of security threat from the Internet." +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:36 +msgid "Current status:" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:41 +#, python-format +msgid "" +"Firewall daemon is not running. Please run it. Firewall comes enabled by " +"default on %(box_name)s. On any Debian based system (such as %(box_name)s) " +"you may run it using the command 'service firewalld start' or in case of a " +"system with systemd 'systemctl start firewalld'." +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:56 +msgid "Service/Port" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:67 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:91 +#: plinth/modules/names/templates/names.html:51 +msgid "Enabled" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:70 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:93 +#: plinth/modules/names/templates/names.html:53 +msgid "Disabled" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:81 +msgid "Permitted" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:84 +msgid "Permitted (internal only)" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:87 +msgid "Permitted (external only)" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:90 +msgid "Blocked" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:103 +msgid "" +"The operation of the firewall is automatic. When you enable a service it is " +"also permitted in the firewall and when you disable a service it is also " +"disabled in the firewall." +msgstr "" + +#: plinth/modules/first_boot/forms.py:48 plinth/modules/users/forms.py:70 +msgid "Creating LDAP user failed." +msgstr "" + +#: plinth/modules/first_boot/forms.py:56 +msgid "Failed to add new user to admin group." +msgstr "" + +#: plinth/modules/first_boot/forms.py:78 +msgid "User account created, you are now logged in" +msgstr "" + +#: plinth/modules/first_boot/templates/firstboot_navbar.html:23 +#: plinth/modules/help/templates/help_index.html:25 +#: plinth/templates/base.html:102 +msgid "Help" +msgstr "" + +#: plinth/modules/first_boot/templates/firstboot_state0.html:45 +msgid "Start Setup" +msgstr "" + +#: plinth/modules/first_boot/templates/firstboot_state0.html:49 +#, python-format +msgid "" +"To complete the setup of your %(box_name)s, please provide some basic " +"information." +msgstr "" + +#: plinth/modules/first_boot/templates/firstboot_state1.html:41 +msgid "Administrator Account" +msgstr "" + +#: plinth/modules/first_boot/templates/firstboot_state1.html:44 +msgid "" +"Choose a username and password to access this web interface. The password " +"can be changed later. This user will be granted administrative privileges. " +"Other users can be added later." +msgstr "" + +#: plinth/modules/first_boot/templates/firstboot_state1.html:57 +msgid "Box it up!" +msgstr "" + +#: plinth/modules/first_boot/templates/firstboot_state10.html:29 +msgid "Setup Complete!" +msgstr "" + +#: plinth/modules/first_boot/templates/firstboot_state10.html:32 +#, python-format +msgid "" +"%(box_name)s setup is now complete. To make your %(box_name)s functional, " +"you need some applications. They will be installed the first time you " +"access them." +msgstr "" + +#: plinth/modules/first_boot/templates/firstboot_state10.html:41 +msgid "Go to Apps" +msgstr "" + +#: plinth/modules/first_boot/templates/firstboot_state10.html:44 +msgid "Current Network Configuration" +msgstr "" + +#: plinth/modules/first_boot/templates/firstboot_state10.html:47 +msgid "" +"You should check the network setup and modify it if necessary. Do not forget " +"to change the default Wi-Fi passwords!" +msgstr "" + +#: plinth/modules/first_boot/templates/firstboot_state10.html:57 +msgid "Go to Networks" +msgstr "" + +#: plinth/modules/first_boot/views.py:60 +msgid "Setup Complete" +msgstr "" + +#: plinth/modules/help/help.py:34 +msgid "Documentation" +msgstr "" + +#: plinth/modules/help/help.py:36 +msgid "Where to Get Help" +msgstr "" + +#: plinth/modules/help/help.py:38 +msgid "Manual" +msgstr "" + +#: plinth/modules/help/help.py:48 +msgid "Documentation and FAQ" +msgstr "" + +#: plinth/modules/help/help.py:55 +#, python-brace-format +msgid "About {box_name}" +msgstr "" + +#: plinth/modules/help/help.py:73 +#, python-brace-format +msgid "{box_name} Manual" +msgstr "" + +#: plinth/modules/help/templates/help_about.html:30 +#, python-format +msgid "" +"%(box_name)s 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." +msgstr "" + +#: plinth/modules/help/templates/help_about.html:43 +msgid "" +"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." +msgstr "" + +#: plinth/modules/help/templates/help_about.html:56 +#, python-format +msgid "" +"There are a number of projects working to realize a future of distributed " +"services; %(box_name)s aims to bring them all together in a convenient " +"package." +msgstr "" + +#: plinth/modules/help/templates/help_about.html:64 +#, python-format +msgid "" +"For more information about the %(box_name)s project, see the %(box_name)s Wiki." +msgstr "" + +#: plinth/modules/help/templates/help_about.html:73 +msgid "Learn more »" +msgstr "" + +#: plinth/modules/help/templates/help_about.html:76 +#, python-format +msgid "You are running Plinth version %(version)s." +msgstr "" + +#: plinth/modules/help/templates/help_base.html:36 +#, python-format +msgid "%(box_name)s Setup" +msgstr "" + +#: plinth/modules/help/templates/help_index.html:29 +#, python-format +msgid "" +"The %(box_name)s Manual is the best place to " +"start for information regarding %(box_name)s." +msgstr "" + +#: plinth/modules/help/templates/help_index.html:36 +#, python-format +msgid "" +" " +"%(box_name)s project wiki contains further information." +msgstr "" + +#: plinth/modules/help/templates/help_index.html:43 +#, python-format +msgid "" +"To seek help from %(box_name)s community, queries may be posted on the mailing list. The list archives also contain information about " +"problems faced by other users and possible solutions." +msgstr "" + +#: plinth/modules/help/templates/help_index.html:53 +#, python-format +msgid "" +"Many %(box_name)s contributors and users are also available on the irc.oftc." +"net IRC network. Join and request help on the #freedombox " +"channel using the IRC web interface." +msgstr "" + +#: plinth/modules/ikiwiki/__init__.py:38 +msgid "Wiki and Blog (ikiwiki)" +msgstr "" + +#: plinth/modules/ikiwiki/__init__.py:43 +msgid "ikiwiki wikis and blogs" +msgstr "" + +#: plinth/modules/ikiwiki/forms.py:29 +msgid "Enable ikiwiki" +msgstr "" + +#: plinth/modules/ikiwiki/forms.py:36 +#: plinth/modules/networks/templates/connection_show.html:98 +msgid "Type" +msgstr "" + +#: plinth/modules/ikiwiki/forms.py:39 +#: plinth/modules/networks/templates/connection_show.html:78 +msgid "Name" +msgstr "" + +#: plinth/modules/ikiwiki/forms.py:41 +msgid "Admin Account Name" +msgstr "" + +#: plinth/modules/ikiwiki/forms.py:44 +msgid "Admin Account Password" +msgstr "" + +#: plinth/modules/ikiwiki/templates/ikiwiki.html:27 +msgid "" +"When enabled, the blogs and wikis will be available from /ikiwiki." +msgstr "" + +#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:27 +#, python-format +msgid "Delete Wiki or Blog %(name)s" +msgstr "" + +#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:33 +msgid "" +"This action will remove all the posts, pages and comments including revision " +"history. Delete this wiki or blog permanently?" +msgstr "" + +#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:44 +#, python-format +msgid "Delete %(name)s" +msgstr "" + +#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:47 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:60 +#: plinth/modules/networks/templates/connections_delete.html:41 +#: plinth/modules/users/templates/users_delete.html:41 +msgid "Cancel" +msgstr "" + +#: plinth/modules/ikiwiki/templates/ikiwiki_manage.html:41 +msgid "No wikis or blogs available." +msgstr "" + +#: plinth/modules/ikiwiki/templates/ikiwiki_manage.html:45 +msgid "Create a Wiki or Blog" +msgstr "" + +#: plinth/modules/ikiwiki/templates/ikiwiki_manage.html:55 +#, python-format +msgid "Delete site %(site)s" +msgstr "" + +#: plinth/modules/ikiwiki/templates/ikiwiki_manage.html:61 +#, python-format +msgid "Go to site %(site)s" +msgstr "" + +#: plinth/modules/ikiwiki/views.py:38 +msgid "Manage" +msgstr "" + +#: plinth/modules/ikiwiki/views.py:40 +msgid "Create" +msgstr "" + +#: plinth/modules/ikiwiki/views.py:73 +msgid "Wiki and Blog" +msgstr "" + +#: plinth/modules/ikiwiki/views.py:106 +msgid "Manage Wikis and Blogs" +msgstr "" + +#: plinth/modules/ikiwiki/views.py:132 +msgid "Create Wiki or Blog" +msgstr "" + +#: plinth/modules/ikiwiki/views.py:145 +#, python-brace-format +msgid "Created wiki {name}." +msgstr "" + +#: plinth/modules/ikiwiki/views.py:147 +#, python-brace-format +msgid "Could not create wiki: {error}" +msgstr "" + +#: plinth/modules/ikiwiki/views.py:159 +#, python-brace-format +msgid "Created blog {name}." +msgstr "" + +#: plinth/modules/ikiwiki/views.py:161 +#, python-brace-format +msgid "Could not create blog: {error}" +msgstr "" + +#: plinth/modules/ikiwiki/views.py:174 +#, python-brace-format +msgid "{name} deleted." +msgstr "" + +#: plinth/modules/ikiwiki/views.py:176 +#, python-brace-format +msgid "Could not delete {name}: {error}" +msgstr "" + +#: plinth/modules/ikiwiki/views.py:182 +msgid "Delete Wiki or Blog" +msgstr "" + +#: plinth/modules/letsencrypt/__init__.py:43 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:38 +#: plinth/modules/letsencrypt/views.py:45 +msgid "Certificates (Let's Encrypt)" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:41 +#, python-format +msgid "" +"A digital certficate allows users of a web service to verify the identity of " +"the service and to securely communicate with it. %(box_name)s can " +"automatically obtain and setup digital certificates for each available " +"domain. It does so by proving itself to be the owner of a domain to Let's " +"Encrypt, a certficate authority (CA)." +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:52 +msgid "" +"Let's Encrypt is a free, automated, and open certificate authority, run for " +"the public’s benefit by the Internet Security Research Group (ISRG). Please " +"read and agree with the Let's Encrypt Subscriber Agreement before using this service." +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:66 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:70 +msgid "Domain" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:67 +msgid "Certificate Status" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:68 +msgid "Website Security" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:69 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:72 +msgid "Actions" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:79 +#, python-format +msgid "Expires on %(expiry_date)s" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:85 +msgid "No certficate" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:102 +msgid "Revoke" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:108 +msgid "Re-obtain" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:115 +msgid "Obtain" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:55 +#, python-brace-format +msgid "Certificate successfully revoked for domain {domain}" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:60 +#, python-brace-format +msgid "Failed to revoke certificate for domain {domain}: {error}" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:72 +#, python-brace-format +msgid "Certificate successfully obtained for domain {domain}" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:77 +#, python-brace-format +msgid "Failed to obtain certificate for domain {domain}: {error}" +msgstr "" + +#: plinth/modules/monkeysphere/__init__.py:32 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:35 +#: plinth/modules/monkeysphere/views.py:44 +msgid "Monkeysphere" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:38 +msgid "" +"With Monkeysphere, a PGP key can be generated for each configured domain " +"serving SSH. The PGP public key can then be uploaded to the PGP keyservers. " +"Users connecting to this machine through SSH can verify that they are " +"connecting to the correct host. For users to trust the key, at least one " +"person (usually the machine owner) must sign the key using the regular PGP " +"key signing process. See the Monkeysphere SSH documentation for more details." +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:53 +msgid "Publishing key to keyserver..." +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:71 +msgid "GPG Fingerprint" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:83 +#: plinth/modules/names/views.py:45 +msgid "Not Available" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:93 +msgid "Generate PGP Key" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:101 +msgid "Publish Key" +msgstr "" + +#: plinth/modules/monkeysphere/views.py:58 +msgid "Generated PGP key." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:83 +msgid "Cancelled key publishing." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:120 +msgid "Published key to keyserver." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:122 +msgid "Error occurred while publishing key." +msgstr "" + +#: plinth/modules/mumble/__init__.py:38 +#: plinth/modules/mumble/templates/mumble.html:26 +#: plinth/modules/mumble/views.py:58 +msgid "Voice Chat (Mumble)" +msgstr "" + +#: plinth/modules/mumble/__init__.py:43 +msgid "Mumble Voice Chat Server" +msgstr "" + +#: plinth/modules/mumble/forms.py:29 +msgid "Enable Mumble daemon" +msgstr "" + +#: plinth/modules/mumble/templates/mumble.html:29 +msgid "" +"Mumble is an open source, low-latency, encrypted, high quality voice chat " +"software." +msgstr "" + +#: plinth/modules/mumble/templates/mumble.html:36 +msgid "" +"You can connect to your Mumble server on the regular Mumble port 64738. Clients to connect to Mumble from your " +"desktop and Android devices are available." +msgstr "" + +#: plinth/modules/mumble/templates/mumble.html:49 +msgid "Mumble server is running" +msgstr "" + +#: plinth/modules/mumble/templates/mumble.html:52 +msgid "Mumble server is not running" +msgstr "" + +#: plinth/modules/names/__init__.py:29 +msgid "HTTP" +msgstr "" + +#: plinth/modules/names/__init__.py:30 +msgid "HTTPS" +msgstr "" + +#: plinth/modules/names/__init__.py:31 +msgid "SSH" +msgstr "" + +#: plinth/modules/names/__init__.py:45 plinth/modules/names/views.py:34 +msgid "Name Services" +msgstr "" + +#: plinth/modules/networks/__init__.py:108 +#, python-brace-format +msgid "Using DNSSEC on IPv{kind}" +msgstr "" + +#: plinth/modules/networks/forms.py:30 +msgid "Connection Type" +msgstr "" + +#: plinth/modules/networks/forms.py:37 +msgid "Connection Name" +msgstr "" + +#: plinth/modules/networks/forms.py:39 +msgid "Physical Interface" +msgstr "" + +#: plinth/modules/networks/forms.py:41 +msgid "The network device that this connection should be bound to." +msgstr "" + +#: plinth/modules/networks/forms.py:44 +msgid "Firewall Zone" +msgstr "" + +#: plinth/modules/networks/forms.py:45 +msgid "" +"The firewall zone will control which services are available over this " +"interfaces. Select Internal only for trusted networks." +msgstr "" + +#: plinth/modules/networks/forms.py:49 +msgid "IPv4 Addressing Method" +msgstr "" + +#: plinth/modules/networks/forms.py:50 +msgid "" +"\"Shared\" method will start a DHCP server and \"Automatic\" method will " +"acquire configuration from a DHCP server." +msgstr "" + +#: plinth/modules/networks/forms.py:56 +msgid "Address" +msgstr "" + +#: plinth/modules/networks/forms.py:60 +msgid "Netmask" +msgstr "" + +#: plinth/modules/networks/forms.py:61 +msgid "" +"Optional value. If left blank, a default netmask based on the address will " +"be used." +msgstr "" + +#: plinth/modules/networks/forms.py:66 +#: plinth/modules/networks/templates/connection_show.html:202 +#: plinth/modules/networks/templates/connection_show.html:241 +msgid "Gateway" +msgstr "" + +#: plinth/modules/networks/forms.py:67 +msgid "Optional value." +msgstr "" + +#: plinth/modules/networks/forms.py:71 +msgid "DNS Server" +msgstr "" + +#: plinth/modules/networks/forms.py:72 +msgid "" +"Optional value. If this value is given and IPv4 addressing method is " +"\"Automatic\", the DNS Servers provided by a DHCP server will be ignored." +msgstr "" + +#: plinth/modules/networks/forms.py:78 +msgid "Second DNS Server" +msgstr "" + +#: plinth/modules/networks/forms.py:79 +msgid "" +"Optional value. If this value is given and IPv4 Addressing Method is " +"\"Automatic\", the DNS Servers provided by a DHCP server will be ignored." +msgstr "" + +#: plinth/modules/networks/forms.py:89 +msgid "-- select --" +msgstr "" + +#: plinth/modules/networks/forms.py:175 +#: plinth/modules/networks/templates/connection_show.html:144 +msgid "SSID" +msgstr "" + +#: plinth/modules/networks/forms.py:176 +msgid "The visible name of the network." +msgstr "" + +#: plinth/modules/networks/forms.py:178 +#: plinth/modules/networks/templates/connection_show.html:157 +msgid "Mode" +msgstr "" + +#: plinth/modules/networks/forms.py:183 +msgid "Authentication Mode" +msgstr "" + +#: plinth/modules/networks/forms.py:184 +msgid "" +"Select WPA if the wireless network is secured and requires clients to have " +"the password to connect." +msgstr "" + +#: plinth/modules/networks/forms.py:188 +msgid "Passphrase" +msgstr "" + +#: plinth/modules/networks/networks.py:36 +#: plinth/modules/networks/networks.py:56 +msgid "Network Connections" +msgstr "" + +#: plinth/modules/networks/networks.py:38 +#: plinth/modules/networks/networks.py:242 +msgid "Nearby Wi-Fi Networks" +msgstr "" + +#: plinth/modules/networks/networks.py:40 +#: plinth/modules/networks/networks.py:264 +msgid "Add Connection" +msgstr "" + +#: plinth/modules/networks/networks.py:46 +msgid "Networks" +msgstr "" + +#: plinth/modules/networks/networks.py:66 +msgid "Cannot show connection: Connection not found." +msgstr "" + +#: plinth/modules/networks/networks.py:100 +msgid "Show Connection information" +msgstr "" + +#: plinth/modules/networks/networks.py:113 +msgid "Cannot edit connection: Connection not found." +msgstr "" + +#: plinth/modules/networks/networks.py:119 +msgid "This type of connection is not yet understood." +msgstr "" + +#: plinth/modules/networks/networks.py:139 +#: plinth/modules/networks/networks.py:198 +#: plinth/modules/networks/templates/connections_edit.html:34 +msgid "Edit Connection" +msgstr "" + +#: plinth/modules/networks/networks.py:209 +#, python-brace-format +msgid "Activated connection {name}." +msgstr "" + +#: plinth/modules/networks/networks.py:212 +msgid "Failed to activate connection: Connection not found." +msgstr "" + +#: plinth/modules/networks/networks.py:216 +#, python-brace-format +msgid "Failed to activate connection {name}: No suitable device is available." +msgstr "" + +#: plinth/modules/networks/networks.py:229 +#, python-brace-format +msgid "Deactivated connection {name}." +msgstr "" + +#: plinth/modules/networks/networks.py:232 +msgid "Failed to de-activate connection: Connection not found." +msgstr "" + +#: plinth/modules/networks/networks.py:282 +msgid "Adding New Ethernet Connection" +msgstr "" + +#: plinth/modules/networks/networks.py:300 +msgid "Adding New PPPoE Connection" +msgstr "" + +#: plinth/modules/networks/networks.py:332 +msgid "Adding New Wi-Fi Connection" +msgstr "" + +#: plinth/modules/networks/networks.py:346 +#, python-brace-format +msgid "Connection {name} deleted." +msgstr "" + +#: plinth/modules/networks/networks.py:349 +#: plinth/modules/networks/networks.py:358 +msgid "Failed to delete connection: Connection not found." +msgstr "" + +#: plinth/modules/networks/networks.py:363 +#: plinth/modules/networks/templates/connections_delete.html:26 +msgid "Delete Connection" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:43 +msgid "Edit connection" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:43 +#: plinth/templates/base.html:123 +msgid "Edit" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:50 +#: plinth/modules/networks/templates/connections_list.html:78 +msgid "Deactivate" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:57 +#: plinth/modules/networks/templates/connections_list.html:86 +msgid "Activate" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:63 +msgid "Delete connection" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:63 +msgid "Delete" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:66 +#: plinth/modules/networks/templates/connections_diagram.html:73 +#: plinth/modules/networks/templates/connections_diagram.html:76 +#: plinth/modules/networks/templates/connections_diagram.html:105 +#: plinth/modules/networks/templates/connections_diagram.html:127 +msgid "Connection" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:71 +msgid "Primary connection" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:73 +#: plinth/modules/networks/templates/connection_show.html:217 +#: plinth/modules/networks/templates/connection_show.html:256 +msgid "yes" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:84 +msgid "Device" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:88 +msgid "State" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:93 +msgid "State reason" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:102 +msgid "MAC address" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:106 +msgid "Interface" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:110 +msgid "Description" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:116 +msgid "Physical Link" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:121 +msgid "Link state" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:125 +msgid "cable is connected" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:128 +msgid "please check cable" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:133 +#: plinth/modules/networks/templates/connection_show.html:149 +msgid "Speed" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:135 +#, python-format +msgid "%(ethernet_speed)s Mbit/s" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:151 +#, python-format +msgid "%(wireless_bitrate)s Mbit/s" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:163 +msgid "Signal strength" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:173 +msgid "Channel" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:181 +msgid "IPv4" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:186 +#: plinth/modules/networks/templates/connection_show.html:227 +msgid "Method" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:193 +#: plinth/modules/networks/templates/connection_show.html:234 +msgid "IP address" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:209 +#: plinth/modules/networks/templates/connection_show.html:248 +msgid "DNS server" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:216 +#: plinth/modules/networks/templates/connection_show.html:255 +msgid "Default" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:222 +msgid "IPv6" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:263 +msgid "This connection is not active." +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:266 +msgid "Security" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:271 +#: plinth/modules/networks/templates/connection_show.html:291 +#: plinth/modules/networks/templates/connection_show.html:310 +msgid "Firewall zone" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:280 +msgid "" +"This interface should be connected to a 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." +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:300 +msgid "" +"This interface should receive your Internet connection. If you connect it to " +"a local network/machine, many services meant to available only internally " +"will not be available." +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:319 +#, python-format +msgid "" +"This interface is not maintained by %(box_name)s. Its security status is " +"unknown to %(box_name)s. Many %(box_name)s services may not be available on " +"this interface. It is recommended that you deactivate or delete this " +"connection and re-configure it." +msgstr "" + +#: plinth/modules/networks/templates/connections_add.html:34 +#: plinth/modules/networks/templates/connections_type_select.html:34 +msgid "Create..." +msgstr "" + +#: plinth/modules/networks/templates/connections_create.html:34 +msgid "Create Connection" +msgstr "" + +#: plinth/modules/networks/templates/connections_delete.html:29 +#, python-format +msgid "Delete connection %(name)s permanently?" +msgstr "" + +#: plinth/modules/networks/templates/connections_diagram.html:65 +msgid "Internet" +msgstr "" + +#: plinth/modules/networks/templates/connections_diagram.html:70 +#: plinth/modules/networks/templates/connections_diagram.html:102 +msgid "Spacing" +msgstr "" + +#: plinth/modules/networks/templates/connections_diagram.html:78 +msgid "External" +msgstr "" + +#: plinth/modules/networks/templates/connections_diagram.html:83 +#: plinth/modules/networks/templates/connections_diagram.html:113 +#: plinth/network.py:37 +msgid "Ethernet" +msgstr "" + +#: plinth/modules/networks/templates/connections_diagram.html:86 +#: plinth/modules/networks/templates/connections_diagram.html:116 +#: plinth/network.py:38 +msgid "Wi-Fi" +msgstr "" + +#: plinth/modules/networks/templates/connections_diagram.html:89 +#, python-format +msgid "Show connection %(connection.name)s" +msgstr "" + +#: plinth/modules/networks/templates/connections_diagram.html:107 +msgid "Internal" +msgstr "" + +#: plinth/modules/networks/templates/connections_diagram.html:119 +#, python-format +msgid "Show connection %(name)s" +msgstr "" + +#: plinth/modules/networks/templates/connections_diagram.html:131 +msgid "Computer" +msgstr "" + +#: plinth/modules/networks/templates/connections_list.html:67 +#, python-format +msgid "Delete connection %(name)s" +msgstr "" + +#: plinth/modules/networks/templates/connections_list.html:92 +msgid "Active" +msgstr "" + +#: plinth/modules/networks/templates/connections_list.html:95 +msgid "Inactive" +msgstr "" + +#: plinth/modules/openvpn/__init__.py:38 +#: plinth/modules/openvpn/templates/openvpn.html:35 +#: plinth/modules/openvpn/views.py:62 +msgid "Virtual Private Network (OpenVPN)" +msgstr "" + +#: plinth/modules/openvpn/__init__.py:43 +msgid "OpenVPN" +msgstr "" + +#: plinth/modules/openvpn/forms.py:29 +msgid "Enable OpenVPN server" +msgstr "" + +#: plinth/modules/openvpn/templates/openvpn.html:38 +#, python-format +msgid "" +"Virtual Private Network (VPN) is a technique for securely connecting two " +"devices in order to access resources of a private network. While you are " +"away from home, you can connect to your %(box_name)s in order to join your " +"home network and access private/internal services provided by %(box_name)s. " +"You can also access the rest of the Internet via %(box_name)s for added " +"security and anonymity." +msgstr "" + +#: plinth/modules/openvpn/templates/openvpn.html:51 +msgid "Profile" +msgstr "" + +#: plinth/modules/openvpn/templates/openvpn.html:54 +#, python-format +msgid "" +"To connect to %(box_name)s'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 documentation on recommended clients and instructions on how to " +"configure them." +msgstr "" + +#: plinth/modules/openvpn/templates/openvpn.html:66 +#, python-format +msgid "Profile is specific to each user of %(box_name)s. Keep it a secret." +msgstr "" + +#: plinth/modules/openvpn/templates/openvpn.html:76 +msgid "Download my profile" +msgstr "" + +#: plinth/modules/openvpn/templates/openvpn.html:85 +#, python-format +msgid "" +"OpenVPN has not yet been setup. Performing a secure setup takes a very long " +"time. Depending on how fast your %(box_name)s is, it may even take hours. " +"If the setup is interrupted, you may start it again." +msgstr "" + +#: plinth/modules/openvpn/templates/openvpn.html:97 +msgid "Start setup" +msgstr "" + +#: plinth/modules/openvpn/templates/openvpn.html:104 +msgid "OpenVPN setup is running" +msgstr "" + +#: plinth/modules/openvpn/templates/openvpn.html:108 +#, python-format +msgid "" +"To perform a secure setup, this process takes a very long time. Depending " +"on how fast your %(box_name)s is, it may even take hours. If the setup is " +"interrupted, you may start it again." +msgstr "" + +#: plinth/modules/openvpn/templates/openvpn.html:121 +msgid "OpenVPN server is running" +msgstr "" + +#: plinth/modules/openvpn/templates/openvpn.html:124 +msgid "OpenVPN server is not running" +msgstr "" + +#: plinth/modules/openvpn/views.py:124 +msgid "Setup completed." +msgstr "" + +#: plinth/modules/openvpn/views.py:126 +msgid "Setup failed." +msgstr "" + +#: plinth/modules/owncloud/owncloud.py:38 +msgid "Enable ownCloud" +msgstr "" + +#: plinth/modules/owncloud/owncloud.py:44 +#: plinth/modules/owncloud/templates/owncloud.html:26 +msgid "File Hosting (ownCloud)" +msgstr "" + +#: plinth/modules/owncloud/owncloud.py:51 +#: plinth/modules/owncloud/owncloud.py:80 +msgid "ownCloud" +msgstr "" + +#: plinth/modules/owncloud/owncloud.py:97 +msgid "ownCloud enabled" +msgstr "" + +#: plinth/modules/owncloud/owncloud.py:100 +msgid "ownCloud disabled" +msgstr "" + +#: plinth/modules/owncloud/templates/owncloud.html:29 +msgid "" +"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." +msgstr "" + +#: plinth/modules/owncloud/templates/owncloud.html:41 +msgid "" +"When enabled, the ownCloud installation will be available from /owncloud path on the web server. Visit this URL to set up " +"the initial administration account for ownCloud." +msgstr "" + +#: plinth/modules/owncloud/templates/owncloud.html:59 +msgid "Apply changes" +msgstr "" + +#: plinth/modules/pagekite/__init__.py:35 plinth/modules/pagekite/views.py:46 +msgid "Public Visibility (PageKite)" +msgstr "" + +#: plinth/modules/pagekite/forms.py:46 +msgid "Enable PageKite" +msgstr "" + +#: plinth/modules/pagekite/forms.py:49 +msgid "Server domain" +msgstr "" + +#: plinth/modules/pagekite/forms.py:51 +msgid "" +"Select your pagekite server. Set \"pagekite.net\" to use the default " +"pagekite.net server." +msgstr "" + +#: plinth/modules/pagekite/forms.py:55 +msgid "Server port" +msgstr "" + +#: plinth/modules/pagekite/forms.py:56 +msgid "Port of your pagekite server (default: 80)" +msgstr "" + +#: plinth/modules/pagekite/forms.py:58 +msgid "Kite name" +msgstr "" + +#: plinth/modules/pagekite/forms.py:59 +msgid "Example: mybox.pagekite.me" +msgstr "" + +#: plinth/modules/pagekite/forms.py:62 +msgid "Invalid kite name" +msgstr "" + +#: plinth/modules/pagekite/forms.py:65 +msgid "Kite secret" +msgstr "" + +#: plinth/modules/pagekite/forms.py:67 +msgid "" +"A secret associated with the kite or the default secret for your account if " +"no secret is set on the kite." +msgstr "" + +#: plinth/modules/pagekite/forms.py:83 +msgid "Kite details set" +msgstr "" + +#: plinth/modules/pagekite/forms.py:90 +msgid "Pagekite server set" +msgstr "" + +#: plinth/modules/pagekite/forms.py:96 +msgid "PageKite enabled" +msgstr "" + +#: plinth/modules/pagekite/forms.py:99 +msgid "PageKite disabled" +msgstr "" + +#: plinth/modules/pagekite/forms.py:135 +#, python-brace-format +msgid "Service enabled: {name}" +msgstr "" + +#: plinth/modules/pagekite/forms.py:139 +#, python-brace-format +msgid "Service disabled: {name}" +msgstr "" + +#: plinth/modules/pagekite/forms.py:150 +msgid "protocol" +msgstr "" + +#: plinth/modules/pagekite/forms.py:153 +msgid "external (frontend) port" +msgstr "" + +#: plinth/modules/pagekite/forms.py:156 +msgid "internal (freedombox) port" +msgstr "" + +#: plinth/modules/pagekite/forms.py:158 +msgid "Enable Subdomains" +msgstr "" + +#: plinth/modules/pagekite/forms.py:191 +msgid "Deleted custom service" +msgstr "" + +#: plinth/modules/pagekite/forms.py:225 +msgid "" +"This service is available as a standard service. Please use the \"Standard " +"Services\" page to enable it." +msgstr "" + +#: plinth/modules/pagekite/forms.py:234 +msgid "Added custom service" +msgstr "" + +#: plinth/modules/pagekite/forms.py:237 +msgid "This service already exists" +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_configure.html:33 +msgid "PageKite Account" +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_configure.html:41 +msgid "Save settings" +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_custom_services.html:44 +msgid "" +"Warning:
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." +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_custom_services.html:56 +msgid "Create a custom service" +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_custom_services.html:64 +msgid "Add Service" +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_custom_services.html:71 +msgid "Existing custom services" +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_custom_services.html:74 +msgid "You don't have any Custom Services enabled" +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_custom_services.html:89 +#, python-format +msgid "connected to %(backend_host)s:%(backend_port)s" +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_custom_services.html:101 +msgid "Delete this service" +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_introduction.html:26 +#, python-format +msgid "" +"PageKite is a system for exposing %(box_name)s services when you don't have " +"a direct connection to the Internet. You only need this if your %(box_name)s " +"services are unreachable from the rest of the Internet. This includes the " +"following situations:" +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_introduction.html:37 +#, python-format +msgid "%(box_name)s is behind a restricted firewall." +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_introduction.html:43 +#, python-format +msgid "" +"%(box_name)s is connected to a (wireless) router which you don't control." +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_introduction.html:50 +msgid "" +"Your ISP does not provide you an external IP address and instead provides " +"Internet connection through NAT." +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_introduction.html:57 +msgid "" +"Your ISP does not provide you a static IP address and your IP address " +"changes evertime you connect to Internet." +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_introduction.html:63 +msgid "Your ISP limits incoming connections." +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_introduction.html:67 +#, python-format +msgid "" +"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 pagekite.net. In " +"future it might be possible to use your buddy's %(box_name)s for this." +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_introduction.html:78 +#: plinth/modules/pagekite/views.py:36 +msgid "Configure PageKite" +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_standard_services.html:40 +msgid "Warning:
" +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_standard_services.html:43 +msgid "" +"Published services are accessible and attackable from the evil internet." +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_standard_services.html:50 +msgid "Exposing SSH with the default password for 'fbx' is a VERY BAD idea." +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_standard_services.html:65 +msgid "Save Services" +msgstr "" + +#: plinth/modules/pagekite/utils.py:53 +msgid "Web Server (HTTP)" +msgstr "" + +#: plinth/modules/pagekite/utils.py:54 +#, python-brace-format +msgid "Site will be available at http://{0}" +msgstr "" + +#: plinth/modules/pagekite/utils.py:63 +msgid "Web Server (HTTPS)" +msgstr "" + +#: plinth/modules/pagekite/utils.py:64 +#, python-brace-format +msgid "Site will be available at https://{0}" +msgstr "" + +#: plinth/modules/pagekite/utils.py:73 +msgid "Secure Shell (SSH)" +msgstr "" + +#: plinth/modules/pagekite/utils.py:74 +msgid "" +"See SSH client setup instructions" +msgstr "" + +#: plinth/modules/pagekite/utils.py:276 +msgid "Pagekite" +msgstr "" + +#: plinth/modules/pagekite/views.py:34 +msgid "About PageKite" +msgstr "" + +#: plinth/modules/pagekite/views.py:38 +msgid "Standard Services" +msgstr "" + +#: plinth/modules/pagekite/views.py:40 +msgid "Custom Services" +msgstr "" + +#: plinth/modules/power/__init__.py:32 plinth/modules/power/views.py:33 +#: plinth/modules/power/views.py:47 plinth/modules/power/views.py:62 +msgid "Power" +msgstr "" + +#: plinth/modules/power/templates/power.html:29 +msgid "Restart or shut down the system." +msgstr "" + +#: plinth/modules/power/templates/power.html:34 +msgid "Restart »" +msgstr "" + +#: plinth/modules/power/templates/power.html:37 +msgid "Shut Down »" +msgstr "" + +#: plinth/modules/power/templates/power_restart.html:29 +msgid "" +"Are you sure you want to restart? You will not be able to access this web " +"interface for a few minutes until the system is restarted." +msgstr "" + +#: plinth/modules/power/templates/power_restart.html:42 +msgid "Restart Now" +msgstr "" + +#: plinth/modules/power/templates/power_shutdown.html:29 +msgid "" +"Are you sure you want to shut down? You will not be able to access this web " +"interface after shut down." +msgstr "" + +#: plinth/modules/power/templates/power_shutdown.html:41 +msgid "Shut Down Now" +msgstr "" + +#: plinth/modules/privoxy/__init__.py:39 +#: plinth/modules/privoxy/templates/privoxy.html:26 +#: plinth/modules/privoxy/views.py:59 +msgid "Web Proxy (Privoxy)" +msgstr "" + +#: plinth/modules/privoxy/__init__.py:44 +msgid "Privoxy Web Proxy" +msgstr "" + +#: plinth/modules/privoxy/__init__.py:86 +#, python-brace-format +msgid "Access {url} with proxy {proxy} on tcp{kind}" +msgstr "" + +#: plinth/modules/privoxy/forms.py:29 +msgid "Enable Privoxy" +msgstr "" + +#: plinth/modules/privoxy/templates/privoxy.html:29 +msgid "" +"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." +msgstr "" + +#: plinth/modules/privoxy/templates/privoxy.html:38 +#, python-format +msgid "" +"You can use Privoxy by modifying your browser proxy settings to your " +"%(box_name)s hostname (or IP address) with port 8118. While using Privoxy, " +"you can see its configuration details and documentation at http://config.privoxy.org/ or http://p.p." +msgstr "" + +#: plinth/modules/privoxy/templates/privoxy.html:53 +msgid "Privoxy is running" +msgstr "" + +#: plinth/modules/privoxy/templates/privoxy.html:56 +msgid "Privoxy is not running" +msgstr "" + +#: plinth/modules/quassel/__init__.py:36 +#: plinth/modules/quassel/templates/quassel.html:26 +#: plinth/modules/quassel/views.py:54 +msgid "IRC Client (Quassel)" +msgstr "" + +#: plinth/modules/quassel/__init__.py:41 +msgid "Quassel IRC Client" +msgstr "" + +#: plinth/modules/quassel/forms.py:29 +msgid "Enable Quassel core service" +msgstr "" + +#: plinth/modules/quassel/templates/quassel.html:29 +#, python-format +msgid "" +"Quassel is an IRC application that is split into two parts, a \"core\" and a " +"\"client\". This allows the core to remain connected to IRC servers, and to " +"continue receiving messages, even when the client is disconnected. " +"%(box_name)s can run the Quassel core service keeping you always online and " +"one or more Quassel clients from a desktop or a mobile can be used to " +"connect and disconnect from it." +msgstr "" + +#: plinth/modules/quassel/templates/quassel.html:41 +msgid "" +"You can connect to your Quassel core on the default Quassel port 4242. " +"Clients to connect to Quassel from your desktop and mobile devices are available." +msgstr "" + +#: plinth/modules/quassel/templates/quassel.html:55 +msgid "Quassel core service is running" +msgstr "" + +#: plinth/modules/quassel/templates/quassel.html:58 +msgid "Quassel core service is not running" +msgstr "" + +#: plinth/modules/repro/__init__.py:36 +#: plinth/modules/repro/templates/repro.html:26 +#: plinth/modules/repro/views.py:55 +msgid "SIP Server (repro)" +msgstr "" + +#: plinth/modules/repro/__init__.py:41 +msgid "repro SIP Server" +msgstr "" + +#: plinth/modules/repro/forms.py:29 +msgid "Enable repro service" +msgstr "" + +#: plinth/modules/repro/templates/repro.html:29 +msgid "" +"repro provides various SIP services that a SIP softphone can utilize to " +"provide audio and video calls as well as presence and instant messaging. " +"repro provides a server and SIP user accounts that clients can use to let " +"their presence known. It also acts as a proxy to federate SIP " +"communications to other servers on the Internet similar to email." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:39 +msgid "" +"To make SIP calls, a client application is needed. Available clients include " +"Jitsi (for computers) and CSipSimple (for Android phones)." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:48 +msgid "" +"Note: Before using repro, domains and users will need to " +"be configured using the web-based " +"configuration panel. Users in the admin group will be able to " +"log in to the repro configuration panel. After setting the domain, it is " +"required to restart the repro service. Disable the service and re-enable it." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:63 +msgid "repro service is running" +msgstr "" + +#: plinth/modules/repro/templates/repro.html:66 +msgid "repro service is not running" +msgstr "" + +#: plinth/modules/restore/__init__.py:36 +#: plinth/modules/restore/templates/restore_index.html:26 +#: plinth/modules/restore/views.py:46 +msgid "Unhosted Storage (reStore)" +msgstr "" + +#: plinth/modules/restore/__init__.py:41 +msgid "reStore" +msgstr "" + +#: plinth/modules/restore/forms.py:29 +msgid "Enable reStore" +msgstr "" + +#: plinth/modules/restore/templates/restore_index.html:29 +#, python-format +msgid "" +"reStore is a server for unhosted web " +"applications. The idea is to uncouple web applications from data. No " +"matter where a web application is served from, the data can be stored on an " +"unhosted storage server of user's choice. With reStore, your %(box_name)s " +"becomes your unhosted storage server." +msgstr "" + +#: plinth/modules/restore/templates/restore_index.html:40 +msgid "" +"You can create and edit accounts in the reStore web-" +"interface." +msgstr "" + +#: plinth/modules/roundcube/__init__.py:36 +#: plinth/modules/roundcube/templates/roundcube.html:26 +#: plinth/modules/roundcube/views.py:64 +msgid "Email Client (Roundcube)" +msgstr "" + +#: plinth/modules/roundcube/forms.py:29 +msgid "Enable Roundcube" +msgstr "" + +#: plinth/modules/roundcube/templates/roundcube.html:29 +msgid "" +"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." +msgstr "" + +#: plinth/modules/roundcube/templates/roundcube.html:39 +msgid "" +"You can access Roundcube from /roundcube. 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 " +"imap.example.com. For IMAP over SSL (recommended), fill the " +"server field like imaps://imap.example.com." +msgstr "" + +#: plinth/modules/roundcube/templates/roundcube.html:50 +msgid "" +"For Gmail, username will be your Gmail address, password will be your Google " +"account password and server will be imaps://imap.gmail.com. " +"Note that you will also need to enable \"Less secure apps\" in your Google " +"account settings (https://www.google.com/settings/security/lesssecureapps)." +msgstr "" + +#: plinth/modules/shaarli/__init__.py:37 +#: plinth/modules/shaarli/templates/shaarli.html:26 +#: plinth/modules/shaarli/views.py:52 +msgid "Bookmarks (Shaarli)" +msgstr "" + +#: plinth/modules/shaarli/__init__.py:42 +msgid "Shaarli" +msgstr "" + +#: plinth/modules/shaarli/forms.py:29 +msgid "Enable Shaarli" +msgstr "" + +#: plinth/modules/shaarli/templates/shaarli.html:28 +msgid "Shaarli allows you to save and share bookmarks." +msgstr "" + +#: plinth/modules/shaarli/templates/shaarli.html:31 +msgid "" +"When enabled, Shaarli will be available from /shaarli path on the web server. Note that Shaarli only supports a single user " +"account, which you will need to setup on the initial visit." +msgstr "" + +#: plinth/modules/system/system.py:26 +msgid "System" +msgstr "" + +#: plinth/modules/system/system.py:33 +#: plinth/modules/system/templates/system.html:25 +#: plinth/templates/base.html:109 +msgid "System Configuration" +msgstr "" + +#: plinth/modules/system/templates/system.html:28 +#, python-format +msgid "Here you can administrate the underlying system of your %(box_name)s." +msgstr "" + +#: plinth/modules/system/templates/system.html:35 +#, python-format +msgid "" +"The options affect the %(box_name)s at its most general level, so be careful!" +msgstr "" + +#: plinth/modules/tor/__init__.py:50 +msgid "Tor relay port available" +msgstr "" + +#: plinth/modules/tor/__init__.py:58 +msgid "Obfs3 transport registered" +msgstr "" + +#: plinth/modules/tor/__init__.py:64 +msgid "Obfs4 transport registered" +msgstr "" + +#: plinth/modules/tor/__init__.py:101 +#, python-brace-format +msgid "Access URL {url} on tcp{kind} via Tor" +msgstr "" + +#: plinth/modules/tor/__init__.py:112 +#, python-brace-format +msgid "Confirm Tor usage at {url} on tcp{kind}" +msgstr "" + +#: plinth/modules/tor/templates/tor.html:26 plinth/modules/tor/tor.py:68 +msgid "Anonymity Network (Tor)" +msgstr "" + +#: plinth/modules/tor/templates/tor.html:29 +msgid "" +"Tor is an anonymous communication system. You can learn more about it from " +"the Tor Project website. For " +"best protection when web surfing, the Tor Project recommends that you use " +"the " +"Tor Browser." +msgstr "" + +#: plinth/modules/tor/templates/tor.html:44 +msgid "Tor is running" +msgstr "" + +#: plinth/modules/tor/templates/tor.html:47 +msgid "Tor is not running" +msgstr "" + +#: plinth/modules/tor/templates/tor.html:59 +msgid "Hidden Service" +msgstr "" + +#: plinth/modules/tor/templates/tor.html:60 +#: plinth/modules/tor/templates/tor.html:102 +msgid "Port" +msgstr "" + +#: plinth/modules/tor/templates/tor.html:85 +msgid "Bridge" +msgstr "" + +#: plinth/modules/tor/templates/tor.html:88 +#, python-format +msgid "" +"Your %(box_name)s is configured as a Tor bridge with obfsproxy, so it can " +"help circumvent censorship. If your %(box_name)s is behind a router or " +"firewall, you should make sure the following ports are open, and port-" +"forwarded, if necessary:" +msgstr "" + +#: plinth/modules/tor/templates/tor.html:101 +msgid "Service" +msgstr "" + +#: plinth/modules/tor/templates/tor.html:117 +msgid "SOCKS" +msgstr "" + +#: plinth/modules/tor/templates/tor.html:120 +#, python-format +msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." +msgstr "" + +#: plinth/modules/tor/tor.py:47 +msgid "Enable Tor" +msgstr "" + +#: plinth/modules/tor/tor.py:50 +msgid "Enable Tor Hidden Service" +msgstr "" + +#: plinth/modules/tor/tor.py:53 +#, python-brace-format +msgid "" +"A hidden service will allow {box_name} to provide selected services (such as " +"ownCloud or chat) without revealing its location." +msgstr "" + +#: plinth/modules/tor/tor.py:57 +msgid "Download software packages over Tor" +msgstr "" + +#: plinth/modules/tor/tor.py:59 +msgid "" +"When enabled, software will be downloaded over the Tor network for " +"installations and upgrades. This adds a degree of privacy and security " +"during software downloads." +msgstr "" + +#: plinth/modules/tor/tor.py:87 plinth/modules/tor/tor.py:287 +msgid "Tor Hidden Service" +msgstr "" + +#: plinth/modules/tor/tor.py:117 +msgid "Tor Control Panel" +msgstr "" + +#: plinth/modules/tor/tor.py:242 +#, python-brace-format +msgid "Action error: {0} [{1}] [{2}]" +msgstr "" + +#: plinth/modules/tor/tor.py:258 +msgid "Tor enabled" +msgstr "" + +#: plinth/modules/tor/tor.py:261 +msgid "Tor disabled" +msgstr "" + +#: plinth/modules/tor/tor.py:266 +msgid "Tor hidden service enabled" +msgstr "" + +#: plinth/modules/tor/tor.py:269 +msgid "Tor hidden service disabled" +msgstr "" + +#: plinth/modules/tor/tor.py:294 +msgid "Enabled package download over Tor" +msgstr "" + +#: plinth/modules/tor/tor.py:297 +msgid "Disabled package download over Tor" +msgstr "" + +#: plinth/modules/transmission/__init__.py:38 +#: plinth/modules/transmission/templates/transmission.html:26 +#: plinth/modules/transmission/views.py:67 +msgid "BitTorrent (Transmission)" +msgstr "" + +#: plinth/modules/transmission/__init__.py:43 +msgid "Transmission BitTorrent" +msgstr "" + +#: plinth/modules/transmission/forms.py:29 +msgid "Enable Transmission daemon" +msgstr "" + +#: plinth/modules/transmission/forms.py:33 +msgid "Download directory" +msgstr "" + +#: plinth/modules/transmission/forms.py:34 +msgid "" +"Directory where downloads are saved. If you change the default directory, " +"ensure that the new directory exists and is writable by \"debian-transmission" +"\" user." +msgstr "" + +#: plinth/modules/transmission/forms.py:40 +msgid "Username to login to the web interface." +msgstr "" + +#: plinth/modules/transmission/forms.py:44 +msgid "" +"Password to login to the web interface. Current password is shown in a " +"hashed format. To set a new password, enter the password in plain text." +msgstr "" + +#: plinth/modules/transmission/templates/transmission.html:29 +msgid "" +"BitTorrent is a peer-to-peer file sharing protocol. Transmission daemon " +"handles Bitorrent file sharing. Note that BitTorrent is not anonymous." +msgstr "" + +#: plinth/modules/transmission/templates/transmission.html:37 +msgid "" +"Access the web interface at /transmission." +msgstr "" + +#: plinth/modules/transmission/templates/transmission.html:47 +msgid "Transmission daemon is running" +msgstr "" + +#: plinth/modules/transmission/templates/transmission.html:50 +msgid "Transmission daemon is not running." +msgstr "" + +#: plinth/modules/upgrades/__init__.py:33 +msgid "Software Upgrades" +msgstr "" + +#: plinth/modules/upgrades/forms.py:29 +msgid "Enable automatic upgrades" +msgstr "" + +#: plinth/modules/upgrades/forms.py:30 +msgid "" +"When enabled, the unattended-upgrades program will be run once per day. It " +"will attempt to perform any package upgrades that are available." +msgstr "" + +#: plinth/modules/upgrades/templates/upgrades.html:37 +msgid "" +"Upgrades install the latest software and security updates. When automatic " +"upgrades are enabled, upgrades are automatically run every night. You don't " +"normally need to start the upgrade process." +msgstr "" + +#: plinth/modules/upgrades/templates/upgrades.html:45 +msgid "" +"Depending on the number of packages to install, this may take a long time to " +"complete. While upgrades are in progress, you will not be able to install " +"other packages. During the upgrade, this web interface may be temporarily " +"unavailable and show an error. Refresh the page to continue." +msgstr "" + +#: plinth/modules/upgrades/templates/upgrades.html:58 +msgid "Upgrade now »" +msgstr "" + +#: plinth/modules/upgrades/templates/upgrades.html:65 +msgid "A package manager is running." +msgstr "" + +#: plinth/modules/upgrades/templates/upgrades.html:70 +msgid "Recent log from upgrades:" +msgstr "" + +#: plinth/modules/upgrades/views.py:36 plinth/modules/upgrades/views.py:66 +msgid "Automatic Upgrades" +msgstr "" + +#: plinth/modules/upgrades/views.py:38 +msgid "Upgrade Packages" +msgstr "" + +#: plinth/modules/upgrades/views.py:96 +msgid "Upgrade process started." +msgstr "" + +#: plinth/modules/upgrades/views.py:99 +msgid "Starting upgrade failed." +msgstr "" + +#: plinth/modules/upgrades/views.py:102 +msgid "Package Upgrades" +msgstr "" + +#: plinth/modules/upgrades/views.py:131 +#, python-brace-format +msgid "Error when configuring unattended-upgrades: {error}" +msgstr "" + +#: plinth/modules/upgrades/views.py:136 +msgid "Automatic upgrades enabled" +msgstr "" + +#: plinth/modules/upgrades/views.py:138 +msgid "Automatic upgrades disabled" +msgstr "" + +#: plinth/modules/users/__init__.py:36 +msgid "Users and Groups" +msgstr "" + +#: plinth/modules/users/__init__.py:65 +#, python-brace-format +msgid "Check LDAP entry \"{search_item}\"" +msgstr "" + +#: plinth/modules/users/forms.py:28 +msgid "admin" +msgstr "" + +#: plinth/modules/users/forms.py:29 +msgid "wiki" +msgstr "" + +#: plinth/modules/users/forms.py:41 +msgid "Groups" +msgstr "" + +#: plinth/modules/users/forms.py:45 +msgid "" +"Select which services should be available to the new user. The user will be " +"able to log in to services that support single sign-on through LDAP, if they " +"are in the appropriate group.

Users in the admin group will be " +"able to log in to all services. They can also log in to the system through " +"SSH and have administrative privileges (sudo)." +msgstr "" + +#: plinth/modules/users/forms.py:80 +#, python-brace-format +msgid "Failed to add new user to {group} group." +msgstr "" + +#: plinth/modules/users/forms.py:126 +msgid "Renaming LDAP user failed." +msgstr "" + +#: plinth/modules/users/forms.py:138 +msgid "Failed to remove user from group." +msgstr "" + +#: plinth/modules/users/forms.py:149 +msgid "Failed to add user to group." +msgstr "" + +#: plinth/modules/users/forms.py:174 +msgid "Changing LDAP user password failed." +msgstr "" + +#: plinth/modules/users/templates/users_change_password.html:27 +#, python-format +msgid "Change Password for %(username)s" +msgstr "" + +#: plinth/modules/users/templates/users_change_password.html:40 +msgid "Save Password" +msgstr "" + +#: plinth/modules/users/templates/users_create.html:42 +#: plinth/modules/users/views.py:36 plinth/modules/users/views.py:56 +msgid "Create User" +msgstr "" + +#: plinth/modules/users/templates/users_delete.html:26 +#: plinth/modules/users/views.py:103 +msgid "Delete User" +msgstr "" + +#: plinth/modules/users/templates/users_delete.html:29 +#, python-format +msgid "Delete user %(username)s permanently?" +msgstr "" + +#: plinth/modules/users/templates/users_delete.html:38 +#, python-format +msgid "Delete %(username)s" +msgstr "" + +#: plinth/modules/users/templates/users_list.html:46 +#, python-format +msgid "Delete user %(username)s" +msgstr "" + +#: plinth/modules/users/templates/users_list.html:53 +#, python-format +msgid "Edit user %(username)s" +msgstr "" + +#: plinth/modules/users/templates/users_update.html:39 +#, python-format +msgid "" +"Use the change password form to " +"change the password." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:53 +msgid "Save Changes" +msgstr "" + +#: plinth/modules/users/views.py:34 plinth/modules/users/views.py:69 +msgid "Users" +msgstr "" + +#: plinth/modules/users/views.py:54 +#, python-format +msgid "User %(username)s created." +msgstr "" + +#: plinth/modules/users/views.py:78 +#, python-format +msgid "User %(username)s updated." +msgstr "" + +#: plinth/modules/users/views.py:79 +msgid "Edit User" +msgstr "" + +#: plinth/modules/users/views.py:113 +#, python-brace-format +msgid "User {user} deleted." +msgstr "" + +#: plinth/modules/users/views.py:120 +msgid "Deleting LDAP user failed." +msgstr "" + +#: plinth/modules/users/views.py:129 +msgid "Change Password" +msgstr "" + +#: plinth/modules/users/views.py:130 +msgid "Password changed successfully." +msgstr "" + +#: plinth/modules/xmpp/__init__.py:41 plinth/modules/xmpp/__init__.py:46 +#: plinth/modules/xmpp/templates/xmpp.html:26 plinth/modules/xmpp/views.py:75 +msgid "Chat Server (XMPP)" +msgstr "" + +#: plinth/modules/xmpp/forms.py:29 +msgid "Enable XMPP" +msgstr "" + +#: plinth/modules/xmpp/templates/xmpp.html:29 +msgid "" +"XMPP is an open and standardized communication protocol. Here you can run " +"and configure your XMPP server, called ejabberd." +msgstr "" + +#: plinth/modules/xmpp/templates/xmpp.html:36 +msgid "" +"To actually communicate, you can use the web client or " +"any other XMPP client." +msgstr "" + +#: plinth/modules/xmpp/templates/xmpp.html:45 +#, python-format +msgid "" +"Your XMPP server domain is set to %(domainname)s. User IDs will look " +"like username@%(domainname)s. You can setup your domain on the system " +"Configure page." +msgstr "" + +#: plinth/modules/xmpp/templates/xmpp.html:55 +msgid "Launch web client" +msgstr "" + +#: plinth/modules/xmpp/templates/xmpp.html:63 +msgid "ejabberd is running" +msgstr "" + +#: plinth/modules/xmpp/templates/xmpp.html:66 +msgid "ejabberd is not running" +msgstr "" + +#: plinth/network.py:39 +msgid "PPPoE" +msgstr "" + +#: plinth/package.py:156 +msgid "packages not found" +msgstr "" + +#: plinth/package.py:263 +msgid "Installed and configured packages successfully." +msgstr "" + +#: plinth/package.py:268 +#, python-brace-format +msgid "Error installing packages: {string} {details}" +msgstr "" + +#: plinth/service.py:73 +msgid "Web Server" +msgstr "" + +#: plinth/service.py:74 +msgid "Web Server over Secure Socket Layer" +msgstr "" + +#: plinth/service.py:76 +msgid "Secure Shell (SSH) Server" +msgstr "" + +#: plinth/service.py:79 +#, python-brace-format +msgid "{box_name} Web Interface (Plinth)" +msgstr "" + +#: plinth/templates/404.html:25 +msgid "404" +msgstr "" + +#: plinth/templates/404.html:28 +#, python-format +msgid "Requested page %(request_path)s was not found." +msgstr "" + +#: plinth/templates/404.html:34 +msgid "" +"If you believe this missing page should exist, please file a bug at the " +"Plinth project issue " +"tracker." +msgstr "" + +#: plinth/templates/500.html:25 +msgid "500" +msgstr "" + +#: plinth/templates/500.html:28 +msgid "" +"This is an internal error and not something you caused or can fix. Please " +"report the error on the bug tracker so we can fix it." +msgstr "" + +#: plinth/templates/base.html:49 +#, python-format +msgid "Plinth administrative interface for the %(box_name)s" +msgstr "" + +#: plinth/templates/base.html:83 +msgid "Toggle navigation" +msgstr "" + +#: plinth/templates/base.html:125 plinth/templates/base.html.py:126 +msgid "Change password" +msgstr "" + +#: plinth/templates/base.html:129 plinth/templates/base.html.py:130 +#: plinth/templates/base.html:143 plinth/templates/base.html.py:145 +msgid "Log out" +msgstr "" + +#: plinth/templates/base.html:135 plinth/templates/base.html.py:137 +msgid "Log in" +msgstr "" + +#: plinth/templates/login.html:35 +msgid "Login" +msgstr "" + +#: plinth/templates/package_install.html:35 +msgid "Installation" +msgstr "" + +#: plinth/templates/package_install.html:40 +msgid "" +"This feature requires addtional packages to be installed. Do you wish to " +"install them?" +msgstr "" + +#: plinth/templates/package_install.html:49 +msgid "Package" +msgstr "" + +#: plinth/templates/package_install.html:50 +msgid "Summary" +msgstr "" + +#: plinth/templates/package_install.html:67 +msgid "Install" +msgstr "" + +#: plinth/templates/package_install.html:74 +#, python-format +msgid "Installing %(package_names)s: %(status)s" +msgstr "" + +#: plinth/templates/package_install.html:84 +#, python-format +msgid "%(percentage)s%% complete" +msgstr "" From ad7d6db968cbefd19e992d3bfa9f87b19e20f0ed Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Wed, 25 Nov 2015 20:34:00 -0500 Subject: [PATCH 033/189] users: Add field to set user's SSH key. --- actions/ssh | 106 ++++++++++++++++++++++++++++++++++ plinth/modules/users/forms.py | 15 ++++- plinth/modules/users/views.py | 6 ++ 3 files changed, 126 insertions(+), 1 deletion(-) create mode 100755 actions/ssh diff --git a/actions/ssh b/actions/ssh new file mode 100755 index 000000000..e24b8abc6 --- /dev/null +++ b/actions/ssh @@ -0,0 +1,106 @@ +#!/usr/bin/python3 +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Configuration helper for SSH server. +""" + +import argparse +import os +import re +import shutil +import stat +import sys + + +def parse_arguments(): + """Return parsed command line arguments as dictionary.""" + parser = argparse.ArgumentParser() + subparsers = parser.add_subparsers(dest='subcommand', help='Sub command') + + get_key = subparsers.add_parser('get-key', help='Get SSH authorized key') + get_key.add_argument('--username') + + set_key = subparsers.add_parser('set-key', help='Set SSH authorized key') + set_key.add_argument('--username') + set_key.add_argument('--key') + + return parser.parse_args() + + +def subcommand_get_key(arguments): + """Get SSH authorized key.""" + user = arguments.username + if not re.match(r'^[a-z][-a-z0-9_]*$', user): + print('Bad username') + sys.exit(-1) + + home = '/home/' + user + ssh_folder = home + '/.ssh' + keyfile_path = ssh_folder + '/authorized_keys' + + if not os.path.exists(keyfile_path): + return + + with open(keyfile_path, 'r') as keyfile: + key = keyfile.read() + + print(key) + + +def subcommand_set_key(arguments): + """Set SSH authorized key.""" + user = arguments.username + if not re.match(r'^[a-z][-a-z0-9_]*$', user): + print('Bad username') + sys.exit(-1) + + home = '/home/' + user + ssh_folder = home + '/.ssh' + keyfile_path = ssh_folder + '/authorized_keys' + + if not os.path.exists(home): + shutil.copytree('/etc/skel', home) + shutil.chown(home, user, 'users') + for root, dirs, files in os.walk(home): + for directory in dirs: + shutil.chown(os.path.join(root, directory), user, 'users') + for filename in files: + shutil.chown(os.path.join(root, filename), user, 'users') + + if not os.path.exists(ssh_folder): + os.makedirs(ssh_folder) + shutil.chown(ssh_folder, user, 'users') + + with open(keyfile_path, 'w') as keyfile: + keyfile.write(arguments.key) + shutil.chown(keyfile_path, user, 'users') + os.chmod(keyfile_path, stat.S_IRUSR | stat.S_IWUSR) + + +def main(): + """Parse arguments and perform all duties.""" + arguments = parse_arguments() + + subcommand = arguments.subcommand.replace('-', '_') + subcommand_method = globals()['subcommand_' + subcommand] + subcommand_method(arguments) + + +if __name__ == '__main__': + main() diff --git a/plinth/modules/users/forms.py b/plinth/modules/users/forms.py index 543a4b489..4652cb5ba 100644 --- a/plinth/modules/users/forms.py +++ b/plinth/modules/users/forms.py @@ -88,10 +88,18 @@ def save(self, commit=True): class UserUpdateForm(forms.ModelForm): """When user info is changed, also updates LDAP user.""" + ssh_key = forms.CharField( + label=ugettext_lazy('SSH Key'), + required=False, + widget=forms.Textarea, + help_text=\ + ugettext_lazy('Setting an SSH public key will allow this user to log ' + 'in to the system without having to send a password ' + 'over the network.')) class Meta: """Metadata to control automatic form building.""" - fields = ('username', 'groups', 'is_active') + fields = ('username', 'groups', 'ssh_key', 'is_active') model = User widgets = { 'groups': forms.widgets.CheckboxSelectMultiple(), @@ -148,6 +156,11 @@ def save(self, commit=True): messages.error(self.request, _('Failed to add user to group.')) + actions.superuser_run( + 'ssh', ['set-key', + '--username', user.get_username(), + '--key', self.cleaned_data['ssh_key'].strip()]) + return user diff --git a/plinth/modules/users/views.py b/plinth/modules/users/views.py index c98e8b09f..ab658dfc9 100644 --- a/plinth/modules/users/views.py +++ b/plinth/modules/users/views.py @@ -85,6 +85,12 @@ def get_form_kwargs(self): kwargs['username'] = self.object.username return kwargs + def get_initial(self): + initial = super(UserUpdate, self).get_initial() + initial['ssh_key'] = actions.superuser_run( + 'ssh', ['get-key', '--username', self.object.username]).strip() + return initial + def get_success_url(self): """Return the URL to redirect to in case of successful updation.""" return reverse('users:edit', kwargs={'slug': self.object.username}) From 506bff5c7b4285a521567a2f56b50fa99fc4e397 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sat, 30 Jan 2016 15:27:16 +0530 Subject: [PATCH 034/189] users: Multiple SSH keys and better home creation - Allow setting multiple SSH keys one per line (which is already allowed, but advertise it better). - Use mkhomedir_helper to create the user's home directory. Avoid security and accuracy complexities of creating a home directory. - Allow homes that don't exist in /home. --- actions/ssh | 71 ++++++++++++++++------------------- plinth/modules/users/forms.py | 19 +++++----- plinth/modules/users/views.py | 5 ++- 3 files changed, 45 insertions(+), 50 deletions(-) diff --git a/actions/ssh b/actions/ssh index e24b8abc6..a662e9414 100755 --- a/actions/ssh +++ b/actions/ssh @@ -25,6 +25,7 @@ import os import re import shutil import stat +import subprocess import sys @@ -33,64 +34,56 @@ def parse_arguments(): parser = argparse.ArgumentParser() subparsers = parser.add_subparsers(dest='subcommand', help='Sub command') - get_key = subparsers.add_parser('get-key', help='Get SSH authorized key') - get_key.add_argument('--username') + get_keys = subparsers.add_parser('get-keys', help='Get SSH authorized keys') + get_keys.add_argument('--username') - set_key = subparsers.add_parser('set-key', help='Set SSH authorized key') - set_key.add_argument('--username') - set_key.add_argument('--key') + set_keys = subparsers.add_parser('set-keys', help='Set SSH authorized keys') + set_keys.add_argument('--username') + set_keys.add_argument('--keys') return parser.parse_args() -def subcommand_get_key(arguments): - """Get SSH authorized key.""" - user = arguments.username - if not re.match(r'^[a-z][-a-z0-9_]*$', user): +def _assert_valid_username(username): + """Verify that username is a valid one.""" + if not re.match(r'^[a-z][-a-z0-9_]*$', username): print('Bad username') - sys.exit(-1) - - home = '/home/' + user - ssh_folder = home + '/.ssh' - keyfile_path = ssh_folder + '/authorized_keys' + sys.exit(1) - if not os.path.exists(keyfile_path): - return - with open(keyfile_path, 'r') as keyfile: - key = keyfile.read() +def subcommand_get_keys(arguments): + """Get SSH authorized keys.""" + user = arguments.username + _assert_valid_username(user) - print(key) + path = os.path.join(os.path.expanduser('~' + user), + '.ssh', 'authorized_keys') + try: + with open(path, 'r') as file_handle: + print(file_handle.read()) + except FileNotFoundError: + pass -def subcommand_set_key(arguments): - """Set SSH authorized key.""" +def subcommand_set_keys(arguments): + """Set SSH authorized keys.""" user = arguments.username - if not re.match(r'^[a-z][-a-z0-9_]*$', user): - print('Bad username') - sys.exit(-1) + _assert_valid_username(user) - home = '/home/' + user - ssh_folder = home + '/.ssh' - keyfile_path = ssh_folder + '/authorized_keys' + subprocess.check_call(['mkhomedir_helper', user]) - if not os.path.exists(home): - shutil.copytree('/etc/skel', home) - shutil.chown(home, user, 'users') - for root, dirs, files in os.walk(home): - for directory in dirs: - shutil.chown(os.path.join(root, directory), user, 'users') - for filename in files: - shutil.chown(os.path.join(root, filename), user, 'users') + ssh_folder = os.path.join(os.path.expanduser('~' + user), '.ssh') + key_file_path = os.path.join(ssh_folder, 'authorized_keys') if not os.path.exists(ssh_folder): os.makedirs(ssh_folder) shutil.chown(ssh_folder, user, 'users') - with open(keyfile_path, 'w') as keyfile: - keyfile.write(arguments.key) - shutil.chown(keyfile_path, user, 'users') - os.chmod(keyfile_path, stat.S_IRUSR | stat.S_IWUSR) + with open(key_file_path, 'w') as file_handle: + file_handle.write(arguments.keys) + + shutil.chown(key_file_path, user, 'users') + os.chmod(key_file_path, stat.S_IRUSR | stat.S_IWUSR) def main(): diff --git a/plinth/modules/users/forms.py b/plinth/modules/users/forms.py index 4652cb5ba..0ebf27ebd 100644 --- a/plinth/modules/users/forms.py +++ b/plinth/modules/users/forms.py @@ -88,18 +88,20 @@ def save(self, commit=True): class UserUpdateForm(forms.ModelForm): """When user info is changed, also updates LDAP user.""" - ssh_key = forms.CharField( - label=ugettext_lazy('SSH Key'), + ssh_keys = forms.CharField( + label=ugettext_lazy('SSH Keys'), required=False, widget=forms.Textarea, help_text=\ - ugettext_lazy('Setting an SSH public key will allow this user to log ' - 'in to the system without having to send a password ' - 'over the network.')) + ugettext_lazy('Setting an SSH public key will allow this user to ' + 'securely log in to the system without using a ' + 'password. You may enter multiple keys, one on each ' + 'line. Blank lines and lines starting with # will be ' + 'ignored.')) class Meta: """Metadata to control automatic form building.""" - fields = ('username', 'groups', 'ssh_key', 'is_active') + fields = ('username', 'groups', 'ssh_keys', 'is_active') model = User widgets = { 'groups': forms.widgets.CheckboxSelectMultiple(), @@ -157,9 +159,8 @@ def save(self, commit=True): _('Failed to add user to group.')) actions.superuser_run( - 'ssh', ['set-key', - '--username', user.get_username(), - '--key', self.cleaned_data['ssh_key'].strip()]) + 'ssh', ['set-keys', '--username', user.get_username(), + '--keys', self.cleaned_data['ssh_keys'].strip()]) return user diff --git a/plinth/modules/users/views.py b/plinth/modules/users/views.py index ab658dfc9..7e261ea1e 100644 --- a/plinth/modules/users/views.py +++ b/plinth/modules/users/views.py @@ -86,9 +86,10 @@ def get_form_kwargs(self): return kwargs def get_initial(self): + """Return the data for initial form load.""" initial = super(UserUpdate, self).get_initial() - initial['ssh_key'] = actions.superuser_run( - 'ssh', ['get-key', '--username', self.object.username]).strip() + initial['ssh_keys'] = actions.superuser_run( + 'ssh', ['get-keys', '--username', self.object.username]).strip() return initial def get_success_url(self): From 376b5c6febfb1384a145ddfd66b4103f09b5efe1 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Mon, 14 Dec 2015 15:52:05 -0500 Subject: [PATCH 035/189] tor: Refactor into separate files for forms/views --- plinth/modules/tor/__init__.py | 165 ++++++++++++++- plinth/modules/tor/forms.py | 47 +++++ plinth/modules/tor/tests/test_tor.py | 2 +- plinth/modules/tor/tor.py | 297 --------------------------- plinth/modules/tor/urls.py | 4 +- plinth/modules/tor/views.py | 127 ++++++++++++ 6 files changed, 338 insertions(+), 304 deletions(-) create mode 100644 plinth/modules/tor/forms.py delete mode 100644 plinth/modules/tor/tor.py create mode 100644 plinth/modules/tor/views.py diff --git a/plinth/modules/tor/__init__.py b/plinth/modules/tor/__init__.py index bfef63613..611b0be25 100644 --- a/plinth/modules/tor/__init__.py +++ b/plinth/modules/tor/__init__.py @@ -16,20 +16,177 @@ # """ -Plinth module to configure Tor +Plinth module to configure Tor. """ +import augeas from django.utils.translation import ugettext as _ +import glob +import itertools -from . import tor -from .tor import init from plinth import actions from plinth import action_utils +from plinth import cfg +from plinth.modules.names import SERVICES +from plinth.signals import domain_added -__all__ = ['tor', 'init'] depends = ['plinth.modules.apps', 'plinth.modules.names'] +APT_SOURCES_URI_PATHS = ('/files/etc/apt/sources.list/*/uri', + '/files/etc/apt/sources.list.d/*/*/uri') +APT_TOR_PREFIX = 'tor+' + + +def init(): + """Initialize the module.""" + menu = cfg.main_menu.get('apps:index') + menu.add_urlname(_('Anonymity Network (Tor)'), 'glyphicon-eye-close', + 'tor:index', 100) + + # Register hidden service name with Name Services module. + (hs_enabled, hs_hostname, hs_ports) = get_hs() + + if is_enabled() and is_running() and hs_enabled and hs_hostname: + hs_services = [] + for service in SERVICES: + if str(service[2]) in hs_ports: + hs_services.append(service[0]) + else: + hs_hostname = None + hs_services = None + + domain_added.send_robust( + sender='tor', domain_type='hiddenservice', + name=hs_hostname, description=_('Tor Hidden Service'), + services=hs_services) + + +def is_enabled(): + """Return whether the module is enabled.""" + return action_utils.service_is_enabled('tor') + + +def is_running(): + """Return whether the service is running.""" + return action_utils.service_is_running('tor') + + +def get_status(): + """Return current Tor status.""" + output = actions.superuser_run('tor', ['get-ports']) + port_info = output.split('\n') + ports = {} + for line in port_info: + try: + (key, val) = line.split() + ports[key] = val + except ValueError: + continue + + (hs_enabled, hs_hostname, hs_ports) = get_hs() + + return {'enabled': is_enabled(), + 'is_running': is_running(), + 'ports': ports, + 'hs_enabled': hs_enabled, + 'hs_hostname': hs_hostname, + 'hs_ports': hs_ports, + 'apt_transport_tor_enabled': is_apt_transport_tor_enabled()} + + +def get_hs(): + """Return hidden service status.""" + output = actions.superuser_run('tor', ['get-hs']) + output = output.strip() + if output == '': + hs_enabled = False + hs_hostname = 'Not Configured' + hs_ports = '' + elif output == 'error': + hs_enabled = False + hs_hostname = 'Not available (Run Tor at least once)' + hs_ports = '' + else: + hs_enabled = True + hs_info = output.split() + hs_hostname = hs_info[0] + hs_ports = hs_info[1] + + return (hs_enabled, hs_hostname, hs_ports) + + +def get_augeas(): + """Return an instance of Augeaus for processing APT configuration.""" + aug = augeas.Augeas(flags=augeas.Augeas.NO_LOAD + + augeas.Augeas.NO_MODL_AUTOLOAD) + aug.set('/augeas/load/Aptsources/lens', 'Aptsources.lns') + aug.set('/augeas/load/Aptsources/incl[last() + 1]', '/etc/apt/sources.list') + aug.set('/augeas/load/Aptsources/incl[last() + 1]', + '/etc/apt/sources.list.d/*.list') + aug.load() + + # Currently, augeas does not handle Deb822 format, it error out. + if aug.match('/augeas/files/etc/apt/sources.list/error') or \ + aug.match('/augeas/files/etc/apt/sources.list.d//error'): + raise Exception('Error parsing sources list') + + # Starting with Apt 1.1, /etc/apt/sources.list.d/*.sources will + # contain files with Deb822 format. If they are found, error out + # for now. XXX: Provide proper support Deb822 format with a new + # Augeas lens. + if glob.glob('/etc/apt/sources.list.d/*.sources'): + raise Exception('Can not handle Deb822 source files') + + return aug + + +def iter_apt_uris(aug): + """Iterate over all the APT source URIs.""" + return itertools.chain.from_iterable([aug.match(path) + for path in APT_SOURCES_URI_PATHS]) + + +def get_real_apt_uri_path(aug, path): + """Return the actual path which contains APT URL. + + XXX: This is a workaround for Augeas bug parsing Apt source files + with '[options]'. Remove this workaround after Augeas lens is + fixed. + """ + uri = aug.get(path) + if uri[0] == '[': + parent_path = path.rsplit('/', maxsplit=1)[0] + skipped = False + for child_path in aug.match(parent_path + '/*')[1:]: + if skipped: + return child_path + + value = aug.get(child_path) + if value[-1] == ']': + skipped = True + + return path + + +def is_apt_transport_tor_enabled(): + """Return whether APT is set to download packages over Tor.""" + try: + aug = get_augeas() + except Exception: + # If there was an error with parsing or there are Deb822 + # files. + return False + + for uri_path in iter_apt_uris(aug): + uri_path = get_real_apt_uri_path(aug, uri_path) + uri = aug.get(uri_path) + if not uri.startswith(APT_TOR_PREFIX) and \ + (uri.startswith('http://') or uri.startswith('https://')): + return False + + return True + def diagnose(): """Run diagnostics and return the results.""" diff --git a/plinth/modules/tor/forms.py b/plinth/modules/tor/forms.py new file mode 100644 index 000000000..e4b9abbe8 --- /dev/null +++ b/plinth/modules/tor/forms.py @@ -0,0 +1,47 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Forms for configuring Tor. +""" + +from django import forms +from django.utils.translation import ugettext_lazy as _ + +from plinth import cfg +from plinth.utils import format_lazy + + +class TorForm(forms.Form): # pylint: disable=W0232 + """Tor configuration form.""" + enabled = forms.BooleanField( + label=_('Enable Tor'), + required=False) + hs_enabled = forms.BooleanField( + label=_('Enable Tor Hidden Service'), + required=False, + help_text=format_lazy(_( + 'A hidden service will allow {box_name} to provide selected ' + 'services (such as ownCloud or chat) without revealing its ' + 'location.'), box_name=_(cfg.box_name))) + apt_transport_tor_enabled = forms.BooleanField( + label=_('Download software packages over Tor'), + required=False, + help_text=_('When enabled, software will be downloaded over the Tor ' + 'network for installations and upgrades. This adds a ' + 'degree of privacy and security during software ' + 'downloads.')) diff --git a/plinth/modules/tor/tests/test_tor.py b/plinth/modules/tor/tests/test_tor.py index 223a6b47c..441cde551 100644 --- a/plinth/modules/tor/tests/test_tor.py +++ b/plinth/modules/tor/tests/test_tor.py @@ -22,7 +22,7 @@ import os import unittest -from ..tor import is_apt_transport_tor_enabled, get_hs, get_status +from plinth.modules.tor import is_apt_transport_tor_enabled, get_hs, get_status euid = os.geteuid() diff --git a/plinth/modules/tor/tor.py b/plinth/modules/tor/tor.py deleted file mode 100644 index cb93235b4..000000000 --- a/plinth/modules/tor/tor.py +++ /dev/null @@ -1,297 +0,0 @@ -# -# This file is part of Plinth. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# - -""" -Plinth module for configuring Tor -""" - -import augeas -from django import forms -from django.contrib import messages -from django.template.response import TemplateResponse -from django.utils.translation import ugettext_lazy as _ -import glob -import itertools - -from plinth import actions -from plinth import action_utils -from plinth import cfg -from plinth import package -from plinth.errors import ActionError -from plinth.modules.names import SERVICES -from plinth.signals import domain_added, domain_removed -from plinth.utils import format_lazy - -APT_SOURCES_URI_PATHS = ('/files/etc/apt/sources.list/*/uri', - '/files/etc/apt/sources.list.d/*/*/uri') -APT_TOR_PREFIX = 'tor+' - - -class TorForm(forms.Form): # pylint: disable=W0232 - """Tor configuration form""" - enabled = forms.BooleanField( - label=_('Enable Tor'), - required=False) - hs_enabled = forms.BooleanField( - label=_('Enable Tor Hidden Service'), - required=False, - help_text=format_lazy(_( - 'A hidden service will allow {box_name} to provide selected ' - 'services (such as ownCloud or chat) without revealing its ' - 'location.'), box_name=_(cfg.box_name))) - apt_transport_tor_enabled = forms.BooleanField( - label=_('Download software packages over Tor'), - required=False, - help_text=_('When enabled, software will be downloaded over the Tor ' - 'network for installations and upgrades. This adds a ' - 'degree of privacy and security during software ' - 'downloads.')) - - -def init(): - """Initialize the Tor module.""" - menu = cfg.main_menu.get('apps:index') - menu.add_urlname(_('Anonymity Network (Tor)'), 'glyphicon-eye-close', - 'tor:index', 100) - - # Register hidden service name with Name Services module. - enabled = action_utils.service_is_enabled('tor') - is_running = action_utils.service_is_running('tor') - (hs_enabled, hs_hostname, hs_ports) = get_hs() - - if enabled and is_running and hs_enabled and hs_hostname: - hs_services = [] - for service in SERVICES: - if str(service[2]) in hs_ports: - hs_services.append(service[0]) - else: - hs_hostname = None - hs_services = None - - domain_added.send_robust( - sender='tor', domain_type='hiddenservice', - name=hs_hostname, description=_('Tor Hidden Service'), - services=hs_services) - - -def on_install(): - """Setup Tor configuration as soon as it is installed.""" - actions.superuser_run('tor', ['setup']) - actions.superuser_run('tor', ['enable-apt-transport-tor']) - - -@package.required(['tor', 'tor-geoipdb', 'torsocks', 'obfs4proxy', - 'apt-transport-tor'], - on_install=on_install) -def index(request): - """Service the index page""" - status = get_status() - - form = None - - if request.method == 'POST': - form = TorForm(request.POST, prefix='tor') - # pylint: disable=E1101 - if form.is_valid(): - _apply_changes(request, status, form.cleaned_data) - status = get_status() - form = TorForm(initial=status, prefix='tor') - else: - form = TorForm(initial=status, prefix='tor') - - return TemplateResponse(request, 'tor.html', - {'title': _('Tor Control Panel'), - 'status': status, - 'form': form}) - - -def get_augeas(): - """Return an instance of Augeaus for processing APT configuration.""" - aug = augeas.Augeas(flags=augeas.Augeas.NO_LOAD + - augeas.Augeas.NO_MODL_AUTOLOAD) - aug.set('/augeas/load/Aptsources/lens', 'Aptsources.lns') - aug.set('/augeas/load/Aptsources/incl[last() + 1]', '/etc/apt/sources.list') - aug.set('/augeas/load/Aptsources/incl[last() + 1]', - '/etc/apt/sources.list.d/*.list') - aug.load() - - # Currently, augeas does not handle Deb822 format, it error out. - if aug.match('/augeas/files/etc/apt/sources.list/error') or \ - aug.match('/augeas/files/etc/apt/sources.list.d//error'): - raise Exception('Error parsing sources list') - - # Starting with Apt 1.1, /etc/apt/sources.list.d/*.sources will - # contain files with Deb822 format. If they are found, error out - # for now. XXX: Provide proper support Deb822 format with a new - # Augeas lens. - if glob.glob('/etc/apt/sources.list.d/*.sources'): - raise Exception('Can not handle Deb822 source files') - - return aug - - -def iter_apt_uris(aug): - """Iterate over all the APT source URIs.""" - return itertools.chain.from_iterable([aug.match(path) - for path in APT_SOURCES_URI_PATHS]) - - -def get_real_apt_uri_path(aug, path): - """Return the actual path which contains APT URL. - - XXX: This is a workaround for Augeas bug parsing Apt source files - with '[options]'. Remove this workaround after Augeas lens is - fixed. - """ - uri = aug.get(path) - if uri[0] == '[': - parent_path = path.rsplit('/', maxsplit=1)[0] - skipped = False - for child_path in aug.match(parent_path + '/*')[1:]: - if skipped: - return child_path - - value = aug.get(child_path) - if value[-1] == ']': - skipped = True - - return path - - -def is_apt_transport_tor_enabled(): - """Return whether APT is set to download packages over Tor.""" - try: - aug = get_augeas() - except Exception: - # If there was an error with parsing or there are Deb822 - # files. - return False - - for uri_path in iter_apt_uris(aug): - uri_path = get_real_apt_uri_path(aug, uri_path) - uri = aug.get(uri_path) - if not uri.startswith(APT_TOR_PREFIX) and \ - (uri.startswith('http://') or uri.startswith('https://')): - return False - - return True - - -def get_hs(): - output = actions.superuser_run('tor', ['get-hs']) - output = output.strip() - if output == '': - hs_enabled = False - hs_hostname = 'Not Configured' - hs_ports = '' - elif output == 'error': - hs_enabled = False - hs_hostname = 'Not available (Run Tor at least once)' - hs_ports = '' - else: - hs_enabled = True - hs_info = output.split() - hs_hostname = hs_info[0] - hs_ports = hs_info[1] - - return (hs_enabled, hs_hostname, hs_ports) - - -def get_status(): - """Return the current status""" - output = actions.superuser_run('tor', ['get-ports']) - port_info = output.split('\n') - ports = {} - for line in port_info: - try: - (key, val) = line.split() - ports[key] = val - except ValueError: - continue - - (hs_enabled, hs_hostname, hs_ports) = get_hs() - - return {'enabled': action_utils.service_is_enabled('tor'), - 'is_running': action_utils.service_is_running('tor'), - 'ports': ports, - 'hs_enabled': hs_enabled, - 'hs_hostname': hs_hostname, - 'hs_ports': hs_ports, - 'apt_transport_tor_enabled': is_apt_transport_tor_enabled()} - - -def _apply_changes(request, old_status, new_status): - """Try to apply changes and handle errors.""" - try: - __apply_changes(request, old_status, new_status) - except ActionError as exception: - messages.error(request, _('Action error: {0} [{1}] [{2}]').format( - exception.args[0], exception.args[1], exception.args[2])) - - -def __apply_changes(request, old_status, new_status): - """Apply the changes.""" - if old_status['enabled'] == new_status['enabled'] and \ - old_status['hs_enabled'] == new_status['hs_enabled'] and \ - old_status['apt_transport_tor_enabled'] == \ - new_status['apt_transport_tor_enabled']: - messages.info(request, _('Setting unchanged')) - return - - if old_status['enabled'] != new_status['enabled']: - if new_status['enabled']: - actions.superuser_run('tor', ['enable']) - messages.success(request, _('Tor enabled')) - else: - actions.superuser_run('tor', ['disable']) - messages.success(request, _('Tor disabled')) - - if old_status['hs_enabled'] != new_status['hs_enabled']: - if new_status['hs_enabled']: - actions.superuser_run('tor', ['enable-hs']) - messages.success(request, _('Tor hidden service enabled')) - else: - actions.superuser_run('tor', ['disable-hs']) - messages.success(request, _('Tor hidden service disabled')) - - # Update hidden service name registered with Name Services module. - domain_removed.send_robust( - sender='tor', domain_type='hiddenservice') - - enabled = action_utils.service_is_enabled('tor') - is_running = action_utils.service_is_running('tor') - (hs_enabled, hs_hostname, hs_ports) = get_hs() - - if enabled and is_running and hs_enabled and hs_hostname: - hs_services = [] - for service in SERVICES: - if str(service[2]) in hs_ports: - hs_services.append(service[0]) - - domain_added.send_robust( - sender='tor', domain_type='hiddenservice', - name=hs_hostname, description=_('Tor Hidden Service'), - services=hs_services) - - if old_status['apt_transport_tor_enabled'] != \ - new_status['apt_transport_tor_enabled']: - if new_status['apt_transport_tor_enabled']: - actions.superuser_run('tor', ['enable-apt-transport-tor']) - messages.success(request, _('Enabled package download over Tor')) - else: - actions.superuser_run('tor', ['disable-apt-transport-tor']) - messages.success(request, _('Disabled package download over Tor')) diff --git a/plinth/modules/tor/urls.py b/plinth/modules/tor/urls.py index 2bca8ef3c..eda7a084a 100644 --- a/plinth/modules/tor/urls.py +++ b/plinth/modules/tor/urls.py @@ -16,12 +16,12 @@ # """ -URLs for the Tor module +URLs for the Tor module. """ from django.conf.urls import url -from . import tor as views +from . import views urlpatterns = [ diff --git a/plinth/modules/tor/views.py b/plinth/modules/tor/views.py new file mode 100644 index 000000000..15f51a1d2 --- /dev/null +++ b/plinth/modules/tor/views.py @@ -0,0 +1,127 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Plinth module for configuring Tor. +""" + +from django.contrib import messages +from django.template.response import TemplateResponse +from django.utils.translation import ugettext_lazy as _ + +from .forms import TorForm +from plinth import actions +from plinth import action_utils +from plinth import package +from plinth.errors import ActionError +from plinth.modules import tor +from plinth.modules.names import SERVICES +from plinth.signals import domain_added, domain_removed + + +def on_install(): + """Setup Tor configuration as soon as it is installed.""" + actions.superuser_run('tor', ['setup']) + actions.superuser_run('tor', ['enable-apt-transport-tor']) + + +@package.required(['tor', 'tor-geoipdb', 'torsocks', 'obfs4proxy', + 'apt-transport-tor'], + on_install=on_install) +def index(request): + """Serve configuration page.""" + status = tor.get_status() + + form = None + + if request.method == 'POST': + form = TorForm(request.POST, prefix='tor') + # pylint: disable=E1101 + if form.is_valid(): + _apply_changes(request, status, form.cleaned_data) + status = tor.get_status() + form = TorForm(initial=status, prefix='tor') + else: + form = TorForm(initial=status, prefix='tor') + + return TemplateResponse(request, 'tor.html', + {'title': _('Tor Control Panel'), + 'status': status, + 'form': form}) + + +def _apply_changes(request, old_status, new_status): + """Try to apply changes and handle errors.""" + try: + __apply_changes(request, old_status, new_status) + except ActionError as exception: + messages.error(request, _('Action error: {0} [{1}] [{2}]').format( + exception.args[0], exception.args[1], exception.args[2])) + + +def __apply_changes(request, old_status, new_status): + """Apply the changes.""" + if old_status['enabled'] == new_status['enabled'] and \ + old_status['hs_enabled'] == new_status['hs_enabled'] and \ + old_status['apt_transport_tor_enabled'] == \ + new_status['apt_transport_tor_enabled']: + messages.info(request, _('Setting unchanged')) + return + + if old_status['enabled'] != new_status['enabled']: + if new_status['enabled']: + actions.superuser_run('tor', ['enable']) + messages.success(request, _('Tor enabled')) + else: + actions.superuser_run('tor', ['disable']) + messages.success(request, _('Tor disabled')) + + if old_status['hs_enabled'] != new_status['hs_enabled']: + if new_status['hs_enabled']: + actions.superuser_run('tor', ['enable-hs']) + messages.success(request, _('Tor hidden service enabled')) + else: + actions.superuser_run('tor', ['disable-hs']) + messages.success(request, _('Tor hidden service disabled')) + + # Update hidden service name registered with Name Services module. + domain_removed.send_robust( + sender='tor', domain_type='hiddenservice') + + enabled = action_utils.service_is_enabled('tor') + is_running = action_utils.service_is_running('tor') + (hs_enabled, hs_hostname, hs_ports) = tor.get_hs() + + if enabled and is_running and hs_enabled and hs_hostname: + hs_services = [] + for service in SERVICES: + if str(service[2]) in hs_ports: + hs_services.append(service[0]) + + domain_added.send_robust( + sender='tor', domain_type='hiddenservice', + name=hs_hostname, description=_('Tor Hidden Service'), + services=hs_services) + + if old_status['apt_transport_tor_enabled'] != \ + new_status['apt_transport_tor_enabled']: + if new_status['apt_transport_tor_enabled']: + actions.superuser_run('tor', ['enable-apt-transport-tor']) + messages.success(request, _('Enabled package download over Tor')) + else: + actions.superuser_run('tor', ['disable-apt-transport-tor']) + messages.success(request, _('Disabled package download over Tor')) From 315c7f1e934d49b1a424468e908d0b272710348d Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Mon, 14 Dec 2015 18:15:05 -0500 Subject: [PATCH 036/189] tor: Notify firewall about socks service status --- plinth/modules/tor/__init__.py | 14 +++++++-- plinth/modules/tor/views.py | 55 ++++++++++++++-------------------- 2 files changed, 34 insertions(+), 35 deletions(-) diff --git a/plinth/modules/tor/__init__.py b/plinth/modules/tor/__init__.py index 611b0be25..42d47a6ac 100644 --- a/plinth/modules/tor/__init__.py +++ b/plinth/modules/tor/__init__.py @@ -27,12 +27,15 @@ from plinth import actions from plinth import action_utils from plinth import cfg +from plinth import service as service_module from plinth.modules.names import SERVICES from plinth.signals import domain_added depends = ['plinth.modules.apps', 'plinth.modules.names'] +service = None + APT_SOURCES_URI_PATHS = ('/files/etc/apt/sources.list/*/uri', '/files/etc/apt/sources.list.d/*/*/uri') APT_TOR_PREFIX = 'tor+' @@ -44,14 +47,19 @@ def init(): menu.add_urlname(_('Anonymity Network (Tor)'), 'glyphicon-eye-close', 'tor:index', 100) + global service + service = service_module.Service( + 'tor-socks', _('Tor Anonymity Network'), + is_external=False, enabled=is_enabled()) + # Register hidden service name with Name Services module. (hs_enabled, hs_hostname, hs_ports) = get_hs() if is_enabled() and is_running() and hs_enabled and hs_hostname: hs_services = [] - for service in SERVICES: - if str(service[2]) in hs_ports: - hs_services.append(service[0]) + for service_type in SERVICES: + if str(service_type[2]) in hs_ports: + hs_services.append(service_type[0]) else: hs_hostname = None hs_services = None diff --git a/plinth/modules/tor/views.py b/plinth/modules/tor/views.py index 15f51a1d2..394c82314 100644 --- a/plinth/modules/tor/views.py +++ b/plinth/modules/tor/views.py @@ -25,7 +25,6 @@ from .forms import TorForm from plinth import actions -from plinth import action_utils from plinth import package from plinth.errors import ActionError from plinth.modules import tor @@ -37,6 +36,7 @@ def on_install(): """Setup Tor configuration as soon as it is installed.""" actions.superuser_run('tor', ['setup']) actions.superuser_run('tor', ['enable-apt-transport-tor']) + tor.service.notify_enabled(None, True) @package.required(['tor', 'tor-geoipdb', 'torsocks', 'obfs4proxy', @@ -75,38 +75,38 @@ def _apply_changes(request, old_status, new_status): def __apply_changes(request, old_status, new_status): """Apply the changes.""" - if old_status['enabled'] == new_status['enabled'] and \ - old_status['hs_enabled'] == new_status['hs_enabled'] and \ - old_status['apt_transport_tor_enabled'] == \ - new_status['apt_transport_tor_enabled']: - messages.info(request, _('Setting unchanged')) - return + modified = False if old_status['enabled'] != new_status['enabled']: - if new_status['enabled']: - actions.superuser_run('tor', ['enable']) - messages.success(request, _('Tor enabled')) - else: - actions.superuser_run('tor', ['disable']) - messages.success(request, _('Tor disabled')) + sub_command = 'enable' if new_status['enabled'] else 'disable' + actions.superuser_run('tor', [sub_command]) + tor.service.notify_enabled(None, new_status['enabled']) + modified = True if old_status['hs_enabled'] != new_status['hs_enabled']: - if new_status['hs_enabled']: - actions.superuser_run('tor', ['enable-hs']) - messages.success(request, _('Tor hidden service enabled')) - else: - actions.superuser_run('tor', ['disable-hs']) - messages.success(request, _('Tor hidden service disabled')) + sub_command = 'enable-hs' if new_status['hs_enabled'] else 'disable-hs' + actions.superuser_run('tor', [sub_command]) + modified = True + + if old_status['apt_transport_tor_enabled'] != \ + new_status['apt_transport_tor_enabled']: + sub_command = 'enable-apt-transport-tor' \ + if new_status['apt_transport_tor_enabled'] \ + else 'disable-apt-transport-tor' + actions.superuser_run('tor', [sub_command]) + modified = True + + if modified: + messages.success(request, _('Configuration updated')) + else: + messages.info(request, _('Setting unchanged')) # Update hidden service name registered with Name Services module. domain_removed.send_robust( sender='tor', domain_type='hiddenservice') - enabled = action_utils.service_is_enabled('tor') - is_running = action_utils.service_is_running('tor') (hs_enabled, hs_hostname, hs_ports) = tor.get_hs() - - if enabled and is_running and hs_enabled and hs_hostname: + if tor.is_enabled() and tor.is_running() and hs_enabled and hs_hostname: hs_services = [] for service in SERVICES: if str(service[2]) in hs_ports: @@ -116,12 +116,3 @@ def __apply_changes(request, old_status, new_status): sender='tor', domain_type='hiddenservice', name=hs_hostname, description=_('Tor Hidden Service'), services=hs_services) - - if old_status['apt_transport_tor_enabled'] != \ - new_status['apt_transport_tor_enabled']: - if new_status['apt_transport_tor_enabled']: - actions.superuser_run('tor', ['enable-apt-transport-tor']) - messages.success(request, _('Enabled package download over Tor')) - else: - actions.superuser_run('tor', ['disable-apt-transport-tor']) - messages.success(request, _('Disabled package download over Tor')) From a3845e2b284c7c4962437af3d21b7fbeb5e6c439 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Tue, 15 Dec 2015 21:12:02 -0500 Subject: [PATCH 037/189] tor: Add service for bridge relay ports --- actions/tor | 75 +++++++++++++++++++++++++++------- plinth/modules/tor/__init__.py | 13 ++++-- plinth/modules/tor/views.py | 6 ++- 3 files changed, 74 insertions(+), 20 deletions(-) diff --git a/actions/tor b/actions/tor index 0dcd0c423..450eb7ec3 100755 --- a/actions/tor +++ b/actions/tor @@ -26,11 +26,13 @@ import codecs import os import re import socket +import time from plinth import action_utils from plinth.modules.tor.tor import get_augeas, get_real_apt_uri_path, \ iter_apt_uris, APT_TOR_PREFIX +SERVICE_FILE = '/etc/firewalld/services/tor-{0}.xml' TOR_CONFIG = '/etc/tor/torrc' TOR_STATE_FILE = '/var/lib/tor/state' TOR_AUTH_COOKIE = '/var/run/tor/control.authcookie' @@ -89,11 +91,13 @@ DNSPort [::1]:9053 conffile.writelines(lines) action_utils.service_restart('tor') + _update_ports() def subcommand_enable(_): """Enable and start the service.""" action_utils.service_enable('tor') + _update_ports() def subcommand_disable(_): @@ -190,21 +194,10 @@ def get_hidden_service(): def subcommand_get_ports(_): - """Return a list of running Tor ports.""" - try: - print('orport', _get_orport()) - except Exception: - pass - - try: - with open(TOR_STATE_FILE, 'r') as state_file: - for line in state_file: - matches = re.match( - r'^\s*TransportProxy\s+(\S*)\s+\S+:(\d+)\s*$', line) - if matches: - print('{0} {1}'.format(matches.group(1), matches.group(2))) - except FileNotFoundError: - pass + """Get list of Tor ports.""" + ports = get_ports() + for name, number in ports.items(): + print(name, number) def subcommand_enable_apt_transport_tor(_): @@ -242,6 +235,27 @@ def subcommand_disable_apt_transport_tor(_): aug.save() +def get_ports(): + """Return dict mapping port names to numbers.""" + ports = {} + try: + ports['orport'] = _get_orport() + except Exception: + pass + + try: + with open(TOR_STATE_FILE, 'r') as state_file: + for line in state_file: + matches = re.match( + r'^\s*TransportProxy\s+(\S*)\s+\S+:(\d+)\s*$', line) + if matches: + ports[matches.group(1)] = matches.group(2) + except FileNotFoundError: + pass + + return ports + + def _get_orport(): """Return the ORPort by querying running instance.""" cookie = open(TOR_AUTH_COOKIE, 'rb').read() @@ -263,6 +277,37 @@ QUIT return matches.group(1) +def _update_ports(): + """Update firewall service information.""" + ready = False + tries = 0 + + # port information may not be available immediately after Tor started + while not ready: + time.sleep(5) + + ports = get_ports() + ready = 'orport' in ports and 'obfs3' in ports and 'obfs4' in ports + if ready: + break + + tries += 1 + if tries >= 12: + return + + lines = """ + + Tor - {0} + + +""" + for name, number in ports.items(): + with open(SERVICE_FILE.format(name), 'w') as service_file: + service_file.writelines(lines.format(name, number)) + + action_utils.service_restart('firewalld') + + def main(): """Parse arguments and perform all duties""" arguments = parse_arguments() diff --git a/plinth/modules/tor/__init__.py b/plinth/modules/tor/__init__.py index 42d47a6ac..bd7ef694e 100644 --- a/plinth/modules/tor/__init__.py +++ b/plinth/modules/tor/__init__.py @@ -34,7 +34,8 @@ depends = ['plinth.modules.apps', 'plinth.modules.names'] -service = None +socks_service = None +bridge_service = None APT_SOURCES_URI_PATHS = ('/files/etc/apt/sources.list/*/uri', '/files/etc/apt/sources.list.d/*/*/uri') @@ -47,11 +48,17 @@ def init(): menu.add_urlname(_('Anonymity Network (Tor)'), 'glyphicon-eye-close', 'tor:index', 100) - global service - service = service_module.Service( + global socks_service + socks_service = service_module.Service( 'tor-socks', _('Tor Anonymity Network'), is_external=False, enabled=is_enabled()) + global bridge_service + bridge_service = service_module.Service( + 'tor-bridge', _('Tor Bridge Relay'), + ports=['tor-orport', 'tor-obfs3', 'tor-obfs4'], + is_external=True, enabled=is_enabled()) + # Register hidden service name with Name Services module. (hs_enabled, hs_hostname, hs_ports) = get_hs() diff --git a/plinth/modules/tor/views.py b/plinth/modules/tor/views.py index 394c82314..2bd055eb0 100644 --- a/plinth/modules/tor/views.py +++ b/plinth/modules/tor/views.py @@ -36,7 +36,8 @@ def on_install(): """Setup Tor configuration as soon as it is installed.""" actions.superuser_run('tor', ['setup']) actions.superuser_run('tor', ['enable-apt-transport-tor']) - tor.service.notify_enabled(None, True) + tor.socks_service.notify_enabled(None, True) + tor.bridge_service.notify_enabled(None, True) @package.required(['tor', 'tor-geoipdb', 'torsocks', 'obfs4proxy', @@ -80,7 +81,8 @@ def __apply_changes(request, old_status, new_status): if old_status['enabled'] != new_status['enabled']: sub_command = 'enable' if new_status['enabled'] else 'disable' actions.superuser_run('tor', [sub_command]) - tor.service.notify_enabled(None, new_status['enabled']) + tor.socks_service.notify_enabled(None, new_status['enabled']) + tor.bridge_service.notify_enabled(None, new_status['enabled']) modified = True if old_status['hs_enabled'] != new_status['hs_enabled']: From 08441512448a04db67ea6ab271e26204505e2566 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Wed, 16 Dec 2015 19:44:56 -0500 Subject: [PATCH 038/189] tor: Combine all configuration actions --- actions/tor | 213 ++++++++++++++++++++---------------- plinth/modules/tor/views.py | 31 +++--- 2 files changed, 131 insertions(+), 113 deletions(-) diff --git a/actions/tor b/actions/tor index 450eb7ec3..d21703ee5 100755 --- a/actions/tor +++ b/actions/tor @@ -44,16 +44,17 @@ def parse_arguments(): subparsers = parser.add_subparsers(dest='subcommand', help='Sub command') subparsers.add_parser('setup', help='Setup Tor configuration') - subparsers.add_parser('enable', help='Enable and start Tor service') - subparsers.add_parser('disable', help='Disable and stop Tor service') - subparsers.add_parser('get-hs', help='Get hidden service') - subparsers.add_parser('enable-hs', help='Enable hidden service') - subparsers.add_parser('disable-hs', help='Disable hidden service') subparsers.add_parser('get-ports', help='Get list of Tor ports') - subparsers.add_parser('enable-apt-transport-tor', - help='Enable package download over Tor') - subparsers.add_parser('disable-apt-transport-tor', - help='Disable package download over Tor') + subparsers.add_parser('get-hs', help='Get hidden service') + + configure = subparsers.add_parser('configure', help='Configure Tor') + configure.add_argument('--service', choices=['enable', 'disable'], + help='Configure Tor service') + configure.add_argument('--hidden-service', choices=['enable', 'disable'], + help='Configure hidden service') + configure.add_argument('--apt-transport-tor', + choices=['enable', 'disable'], + help='Configure package download over Tor') return parser.parse_args() @@ -94,24 +95,118 @@ DNSPort [::1]:9053 _update_ports() -def subcommand_enable(_): +def subcommand_get_ports(_): + """Get list of Tor ports.""" + ports = get_ports() + for name, number in ports.items(): + print(name, number) + + +def subcommand_get_hs(_): + """Print currently configured Tor hidden service information""" + print(get_hidden_service()) + + +def subcommand_configure(arguments): + """Configure Tor.""" + if arguments.service == 'enable': + _enable() + elif arguments.service == 'disable': + _disable() + + if arguments.hidden_service == 'enable': + _enable_hs() + elif arguments.hidden_service == 'disable': + _disable_hs() + + if arguments.apt_transport_tor == 'enable': + _enable_apt_transport_tor() + elif arguments.apt_transport_tor == 'disable': + _disable_apt_transport_tor() + + +def get_ports(): + """Return dict mapping port names to numbers.""" + ports = {} + try: + ports['orport'] = _get_orport() + except Exception: + pass + + try: + with open(TOR_STATE_FILE, 'r') as state_file: + for line in state_file: + matches = re.match( + r'^\s*TransportProxy\s+(\S*)\s+\S+:(\d+)\s*$', line) + if matches: + ports[matches.group(1)] = matches.group(2) + except FileNotFoundError: + pass + + return ports + + +def _get_orport(): + """Return the ORPort by querying running instance.""" + cookie = open(TOR_AUTH_COOKIE, 'rb').read() + cookie = codecs.encode(cookie, 'hex').decode() + + commands = '''AUTHENTICATE {cookie} +GETINFO net/listeners/or +QUIT +'''.format(cookie=cookie) + + tor_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + tor_socket.connect(('localhost', 9051)) + tor_socket.send(commands.encode()) + response = tor_socket.recv(1024) + tor_socket.close() + + line = response.split(b'\r\n')[1].decode() + matches = re.match(r'.*="[^:]+:(\d+)"', line) + return matches.group(1) + + +def get_hidden_service(): + """Return a string with configured Tor hidden service information""" + hs_dir = None + hs_ports = [] + + try: + with open(TOR_CONFIG, 'r') as conf_file: + for line in conf_file: + if line.startswith('HiddenServiceDir'): + hs_dir = line.split()[1] + elif line.startswith('HiddenServicePort'): + hs_ports.append(line.split()[1]) + except FileNotFoundError: + return 'error' + + if not hs_dir: + return '' + + try: + with open(os.path.join(hs_dir, 'hostname'), 'r') as conf_file: + hs_hostname = conf_file.read().strip() + except Exception: + return 'error' + + return hs_hostname + ' ' + ','.join(hs_ports) + + +def _enable(): """Enable and start the service.""" action_utils.service_enable('tor') _update_ports() -def subcommand_disable(_): +def _disable(): """Disable and stop the service.""" - subcommand_disable_apt_transport_tor(_) + _disable_apt_transport_tor() action_utils.service_disable('tor') -def subcommand_get_hs(_): - """Print currently configured Tor hidden service information""" - print(get_hidden_service()) - - -def subcommand_enable_hs(_): +def _enable_hs(): """Enable Tor hidden service""" if get_hidden_service(): return @@ -131,7 +226,7 @@ def subcommand_enable_hs(_): action_utils.service_restart('tor') -def subcommand_disable_hs(_): +def _disable_hs(): """Disable Tor hidden service""" if not get_hidden_service(): return @@ -166,41 +261,7 @@ def subcommand_disable_hs(_): action_utils.service_restart('tor') -def get_hidden_service(): - """Return a string with configured Tor hidden service information""" - hs_dir = None - hs_ports = [] - - try: - with open(TOR_CONFIG, 'r') as conf_file: - for line in conf_file: - if line.startswith('HiddenServiceDir'): - hs_dir = line.split()[1] - elif line.startswith('HiddenServicePort'): - hs_ports.append(line.split()[1]) - except FileNotFoundError: - return 'error' - - if not hs_dir: - return '' - - try: - with open(os.path.join(hs_dir, 'hostname'), 'r') as conf_file: - hs_hostname = conf_file.read().strip() - except Exception: - return 'error' - - return hs_hostname + ' ' + ','.join(hs_ports) - - -def subcommand_get_ports(_): - """Get list of Tor ports.""" - ports = get_ports() - for name, number in ports.items(): - print(name, number) - - -def subcommand_enable_apt_transport_tor(_): +def _enable_apt_transport_tor(): """Enable package download over Tor.""" try: aug = get_augeas() @@ -218,7 +279,7 @@ def subcommand_enable_apt_transport_tor(_): aug.save() -def subcommand_disable_apt_transport_tor(_): +def _disable_apt_transport_tor(): """Disable package download over Tor.""" try: aug = get_augeas() @@ -235,48 +296,6 @@ def subcommand_disable_apt_transport_tor(_): aug.save() -def get_ports(): - """Return dict mapping port names to numbers.""" - ports = {} - try: - ports['orport'] = _get_orport() - except Exception: - pass - - try: - with open(TOR_STATE_FILE, 'r') as state_file: - for line in state_file: - matches = re.match( - r'^\s*TransportProxy\s+(\S*)\s+\S+:(\d+)\s*$', line) - if matches: - ports[matches.group(1)] = matches.group(2) - except FileNotFoundError: - pass - - return ports - - -def _get_orport(): - """Return the ORPort by querying running instance.""" - cookie = open(TOR_AUTH_COOKIE, 'rb').read() - cookie = codecs.encode(cookie, 'hex').decode() - - commands = '''AUTHENTICATE {cookie} -GETINFO net/listeners/or -QUIT -'''.format(cookie=cookie) - - tor_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - tor_socket.connect(('localhost', 9051)) - tor_socket.send(commands.encode()) - response = tor_socket.recv(1024) - tor_socket.close() - - line = response.split(b'\r\n')[1].decode() - matches = re.match(r'.*="[^:]+:(\d+)"', line) - return matches.group(1) - - def _update_ports(): """Update firewall service information.""" ready = False diff --git a/plinth/modules/tor/views.py b/plinth/modules/tor/views.py index 2bd055eb0..864634b4d 100644 --- a/plinth/modules/tor/views.py +++ b/plinth/modules/tor/views.py @@ -35,7 +35,8 @@ def on_install(): """Setup Tor configuration as soon as it is installed.""" actions.superuser_run('tor', ['setup']) - actions.superuser_run('tor', ['enable-apt-transport-tor']) + actions.superuser_run('tor', + ['configure', '--apt-transport-tor', 'enable']) tor.socks_service.notify_enabled(None, True) tor.bridge_service.notify_enabled(None, True) @@ -76,29 +77,27 @@ def _apply_changes(request, old_status, new_status): def __apply_changes(request, old_status, new_status): """Apply the changes.""" - modified = False + arguments = [] if old_status['enabled'] != new_status['enabled']: - sub_command = 'enable' if new_status['enabled'] else 'disable' - actions.superuser_run('tor', [sub_command]) - tor.socks_service.notify_enabled(None, new_status['enabled']) - tor.bridge_service.notify_enabled(None, new_status['enabled']) - modified = True + arg_value = 'enable' if new_status['enabled'] else 'disable' + arguments.extend(['--service', arg_value]) if old_status['hs_enabled'] != new_status['hs_enabled']: - sub_command = 'enable-hs' if new_status['hs_enabled'] else 'disable-hs' - actions.superuser_run('tor', [sub_command]) - modified = True + arg_value = 'enable' if new_status['hs_enabled'] else 'disable' + arguments.extend(['--hidden-service', arg_value]) if old_status['apt_transport_tor_enabled'] != \ new_status['apt_transport_tor_enabled']: - sub_command = 'enable-apt-transport-tor' \ - if new_status['apt_transport_tor_enabled'] \ - else 'disable-apt-transport-tor' - actions.superuser_run('tor', [sub_command]) - modified = True + arg_value = 'disable' + if new_status['enabled'] and new_status['apt_transport_tor_enabled']: + arg_value = 'enable' + arguments.extend(['--apt-transport-tor', arg_value]) - if modified: + if arguments: + actions.superuser_run('tor', ['configure'] + arguments) + tor.socks_service.notify_enabled(None, new_status['enabled']) + tor.bridge_service.notify_enabled(None, new_status['enabled']) messages.success(request, _('Configuration updated')) else: messages.info(request, _('Setting unchanged')) From a22595af77f320e147306cde3f83f4dbc396567a Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Wed, 16 Dec 2015 21:18:01 -0500 Subject: [PATCH 039/189] tor: Avoid unneeded service restarts - Fix an import error. --- actions/tor | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/actions/tor b/actions/tor index d21703ee5..10ce49986 100755 --- a/actions/tor +++ b/actions/tor @@ -29,8 +29,8 @@ import socket import time from plinth import action_utils -from plinth.modules.tor.tor import get_augeas, get_real_apt_uri_path, \ - iter_apt_uris, APT_TOR_PREFIX +from plinth.modules.tor import is_enabled, is_running, get_augeas, \ + get_real_apt_uri_path, iter_apt_uris, APT_TOR_PREFIX SERVICE_FILE = '/etc/firewalld/services/tor-{0}.xml' TOR_CONFIG = '/etc/tor/torrc' @@ -109,15 +109,17 @@ def subcommand_get_hs(_): def subcommand_configure(arguments): """Configure Tor.""" - if arguments.service == 'enable': - _enable() - elif arguments.service == 'disable': + if arguments.service == 'disable': _disable() + restart = arguments.service == None if arguments.hidden_service == 'enable': - _enable_hs() + _enable_hs(restart=restart) elif arguments.hidden_service == 'disable': - _disable_hs() + _disable_hs(restart=restart) + + if arguments.service == 'enable': + _enable() if arguments.apt_transport_tor == 'enable': _enable_apt_transport_tor() @@ -206,7 +208,7 @@ def _disable(): action_utils.service_disable('tor') -def _enable_hs(): +def _enable_hs(restart=True): """Enable Tor hidden service""" if get_hidden_service(): return @@ -223,10 +225,12 @@ def _enable_hs(): with open(TOR_CONFIG, 'w') as conffile: conffile.writelines(lines) - action_utils.service_restart('tor') + if restart: + if is_enabled() and is_running(): + action_utils.service_restart('tor') -def _disable_hs(): +def _disable_hs(restart=True): """Disable Tor hidden service""" if not get_hidden_service(): return @@ -258,7 +262,9 @@ def _disable_hs(): with open(TOR_CONFIG, 'w') as conffile: conffile.writelines(filtered_lines) - action_utils.service_restart('tor') + if restart: + if is_enabled() and is_running(): + action_utils.service_restart('tor') def _enable_apt_transport_tor(): From 07130b6007de5740283270d6b3389a7307522d32 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Wed, 16 Dec 2015 21:47:18 -0500 Subject: [PATCH 040/189] tor: Run configuration update as background task - Closes: #294. --- actions/tor | 3 +- plinth/modules/tor/templates/tor.html | 148 +++++++++++++++----------- plinth/modules/tor/views.py | 45 ++++++-- 3 files changed, 122 insertions(+), 74 deletions(-) diff --git a/actions/tor b/actions/tor index 10ce49986..c17b84fd2 100755 --- a/actions/tor +++ b/actions/tor @@ -309,8 +309,6 @@ def _update_ports(): # port information may not be available immediately after Tor started while not ready: - time.sleep(5) - ports = get_ports() ready = 'orport' in ports and 'obfs3' in ports and 'obfs4' in ports if ready: @@ -319,6 +317,7 @@ def _update_ports(): tries += 1 if tries >= 12: return + time.sleep(10) lines = """ diff --git a/plinth/modules/tor/templates/tor.html b/plinth/modules/tor/templates/tor.html index 4d4ebbd31..2b1b0f07e 100644 --- a/plinth/modules/tor/templates/tor.html +++ b/plinth/modules/tor/templates/tor.html @@ -21,6 +21,15 @@ {% load bootstrap %} {% load i18n %} +{% block page_head %} + + {% if config_running %} + + {% endif %} + +{% endblock %} + + {% block content %}

{% trans "Anonymity Network (Tor)" %}

@@ -38,89 +47,100 @@

{% trans "Anonymity Network (Tor)" %}

{% trans "Status" %}

-

- {% if status.is_running %} + {% if config_running %} + +

- {% trans "Tor is running" %} - {% else %} - - {% trans "Tor is not running" %} + {% trans "Tor configuration is being updated" %} +

+ + {% else %} + +

+ {% if status.is_running %} + + {% trans "Tor is running" %} + {% else %} + + {% trans "Tor is not running" %} + {% endif %} +

+ + {% include "diagnostics_button.html" with module="tor" %} + + {% if status.hs_enabled %} +
+
+ + + + + + + + + + + + + +
{% trans "Hidden Service" %}{% trans "Port" %}
{{ status.hs_hostname }}{{ status.hs_ports }}
+
+
{% endif %} -

- {% include "diagnostics_button.html" with module="tor" %} +

{% trans "Configuration" %}

+ +
+ {% csrf_token %} + + {{ form|bootstrap }} + + +
+ +

{% trans "Bridge" %}

+ +

+ {% blocktrans trimmed %} + Your {{ box_name }} is configured as a Tor bridge with obfsproxy, + so it can help circumvent censorship. If your {{ box_name }} is + behind a router or firewall, you should make sure the following + ports are open, and port-forwarded, if necessary: + {% endblocktrans %} +

- {% if status.hs_enabled %}
- + - - - - + {% for name, port in status.ports.items %} + + + + + {% endfor %}
{% trans "Hidden Service" %}{% trans "Service" %} {% trans "Port" %}
{{ status.hs_hostname }}{{ status.hs_ports }}
{{ name }}{{ port }}
- {% endif %} - -

{% trans "Configuration" %}

-
- {% csrf_token %} +

{% trans "SOCKS" %}

- {{ form|bootstrap }} +

+ {% blocktrans trimmed %} + A Tor SOCKS port is available on your {{ box_name }} on TCP port + 9050. + {% endblocktrans %} +

- -
- -

{% trans "Bridge" %}

- -

- {% blocktrans trimmed %} - Your {{ box_name }} is configured as a Tor bridge with obfsproxy, - so it can help circumvent censorship. If your {{ box_name }} is - behind a router or firewall, you should make sure the following - ports are open, and port-forwarded, if necessary: - {% endblocktrans %} -

- -
-
- - - - - - - - - {% for name, port in status.ports.items %} - - - - - {% endfor %} - -
{% trans "Service" %}{% trans "Port" %}
{{ name }}{{ port }}
-
-
- -

{% trans "SOCKS" %}

- -

- {% blocktrans trimmed %} - A Tor SOCKS port is available on your {{ box_name }} on TCP port - 9050. - {% endblocktrans %} -

+ {% endif %} {% endblock %} diff --git a/plinth/modules/tor/views.py b/plinth/modules/tor/views.py index 864634b4d..8977970a4 100644 --- a/plinth/modules/tor/views.py +++ b/plinth/modules/tor/views.py @@ -31,6 +31,8 @@ from plinth.modules.names import SERVICES from plinth.signals import domain_added, domain_removed +config_process = None + def on_install(): """Setup Tor configuration as soon as it is installed.""" @@ -48,6 +50,9 @@ def index(request): """Serve configuration page.""" status = tor.get_status() + if config_process: + _collect_config_result(request, status) + form = None if request.method == 'POST': @@ -63,6 +68,7 @@ def index(request): return TemplateResponse(request, 'tor.html', {'title': _('Tor Control Panel'), 'status': status, + 'config_running': bool(config_process), 'form': form}) @@ -95,25 +101,48 @@ def __apply_changes(request, old_status, new_status): arguments.extend(['--apt-transport-tor', arg_value]) if arguments: - actions.superuser_run('tor', ['configure'] + arguments) - tor.socks_service.notify_enabled(None, new_status['enabled']) - tor.bridge_service.notify_enabled(None, new_status['enabled']) - messages.success(request, _('Configuration updated')) + global config_process + if not config_process: + config_process = actions.superuser_run( + 'tor', ['configure'] + arguments, async=True) else: messages.info(request, _('Setting unchanged')) + +def _collect_config_result(request, status): + """Handle config process completion.""" + global config_process + if not config_process: + return + + return_code = config_process.poll() + + # Config process is not complete yet + if return_code == None: + return + + tor.socks_service.notify_enabled(None, status['enabled']) + tor.bridge_service.notify_enabled(None, status['enabled']) + # Update hidden service name registered with Name Services module. domain_removed.send_robust( sender='tor', domain_type='hiddenservice') - (hs_enabled, hs_hostname, hs_ports) = tor.get_hs() - if tor.is_enabled() and tor.is_running() and hs_enabled and hs_hostname: + if status['enabled'] and status['is_running'] and \ + status['hs_enabled'] and status['hs_hostname']: hs_services = [] for service in SERVICES: - if str(service[2]) in hs_ports: + if str(service[2]) in status['hs_ports']: hs_services.append(service[0]) domain_added.send_robust( sender='tor', domain_type='hiddenservice', - name=hs_hostname, description=_('Tor Hidden Service'), + name=status['hs_hostname'], description=_('Tor Hidden Service'), services=hs_services) + + if not return_code: + messages.success(request, _('Configuration updated.')) + else: + messages.info(request, _('Error occurred during configuration.')) + + config_process = None From 1e67fcb61af1ea0278aa7a992edbe906af78439f Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Wed, 16 Dec 2015 22:51:49 -0500 Subject: [PATCH 041/189] tor: After enabling hidden service, wait for info --- actions/tor | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/actions/tor b/actions/tor index c17b84fd2..c0d7155a2 100755 --- a/actions/tor +++ b/actions/tor @@ -229,6 +229,14 @@ def _enable_hs(restart=True): if is_enabled() and is_running(): action_utils.service_restart('tor') + # wait until hidden service information is available + tries = 0 + while get_hidden_service() in ('', 'error'): + tries += 1 + if tries >= 12: + return + time.sleep(10) + def _disable_hs(restart=True): """Disable Tor hidden service""" @@ -326,8 +334,11 @@ def _update_ports():
""" for name, number in ports.items(): - with open(SERVICE_FILE.format(name), 'w') as service_file: - service_file.writelines(lines.format(name, number)) + try: + with open(SERVICE_FILE.format(name), 'w') as service_file: + service_file.writelines(lines.format(name, number)) + except FileNotFoundError: + return action_utils.service_restart('firewalld') From e401a5a028080c458a9cce83048a4cc8ca29e26a Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Thu, 17 Dec 2015 06:50:44 -0500 Subject: [PATCH 042/189] tor: Get fresh status after config completes --- plinth/modules/tor/views.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/plinth/modules/tor/views.py b/plinth/modules/tor/views.py index 8977970a4..2ecb5693c 100644 --- a/plinth/modules/tor/views.py +++ b/plinth/modules/tor/views.py @@ -48,11 +48,10 @@ def on_install(): on_install=on_install) def index(request): """Serve configuration page.""" - status = tor.get_status() - if config_process: - _collect_config_result(request, status) + _collect_config_result(request) + status = tor.get_status() form = None if request.method == 'POST': @@ -109,7 +108,7 @@ def __apply_changes(request, old_status, new_status): messages.info(request, _('Setting unchanged')) -def _collect_config_result(request, status): +def _collect_config_result(request): """Handle config process completion.""" global config_process if not config_process: @@ -121,6 +120,8 @@ def _collect_config_result(request, status): if return_code == None: return + status = tor.get_status() + tor.socks_service.notify_enabled(None, status['enabled']) tor.bridge_service.notify_enabled(None, status['enabled']) From 65a1985cc05330a60b8bb437485e15648cb6fab3 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sat, 30 Jan 2016 19:41:13 +0530 Subject: [PATCH 043/189] tor: Minor fixes and styling - Add note about resetarting firewalld. - Refactor checking for running configuration process. - Fix error message being show as info message. - Minor indentation fixes. --- actions/tor | 4 ++++ plinth/modules/tor/views.py | 13 ++++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/actions/tor b/actions/tor index c0d7155a2..3fbc68f24 100755 --- a/actions/tor +++ b/actions/tor @@ -235,6 +235,7 @@ def _enable_hs(restart=True): tries += 1 if tries >= 12: return + time.sleep(10) @@ -325,6 +326,7 @@ def _update_ports(): tries += 1 if tries >= 12: return + time.sleep(10) lines = """ @@ -340,6 +342,8 @@ def _update_ports(): except FileNotFoundError: return + # XXX: We should ideally do firewalld reload instead. However, + # firewalld seems to fail to successfully reload sometimes. action_utils.service_restart('firewalld') diff --git a/plinth/modules/tor/views.py b/plinth/modules/tor/views.py index 2ecb5693c..120e42133 100644 --- a/plinth/modules/tor/views.py +++ b/plinth/modules/tor/views.py @@ -82,6 +82,11 @@ def _apply_changes(request, old_status, new_status): def __apply_changes(request, old_status, new_status): """Apply the changes.""" + global config_process + if config_process: + # Already running a configuration task + return + arguments = [] if old_status['enabled'] != new_status['enabled']: @@ -100,10 +105,8 @@ def __apply_changes(request, old_status, new_status): arguments.extend(['--apt-transport-tor', arg_value]) if arguments: - global config_process - if not config_process: - config_process = actions.superuser_run( - 'tor', ['configure'] + arguments, async=True) + config_process = actions.superuser_run( + 'tor', ['configure'] + arguments, async=True) else: messages.info(request, _('Setting unchanged')) @@ -144,6 +147,6 @@ def _collect_config_result(request): if not return_code: messages.success(request, _('Configuration updated.')) else: - messages.info(request, _('Error occurred during configuration.')) + messages.error(request, _('An error occurred during configuration.')) config_process = None From bb7d912ed8b713c1215c7b2cfae405818b461a06 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sun, 31 Jan 2016 22:25:18 +0530 Subject: [PATCH 044/189] Update all translations with latest messages --- plinth/locale/da/LC_MESSAGES/django.po | 1304 +++++++++++++------- plinth/locale/de/LC_MESSAGES/django.po | 1285 +++++++++++++------- plinth/locale/django.pot | 238 ++-- plinth/locale/es/LC_MESSAGES/django.po | 909 ++++++++------ plinth/locale/fake/LC_MESSAGES/django.po | 274 +++-- plinth/locale/fr/LC_MESSAGES/django.po | 1310 ++++++++++++++------- plinth/locale/it/LC_MESSAGES/django.po | 909 ++++++++------ plinth/locale/nb/LC_MESSAGES/django.po | 1271 +++++++++++++------- plinth/locale/nl/LC_MESSAGES/django.po | 1284 +++++++++++++------- plinth/locale/pt/LC_MESSAGES/django.po | 964 +++++++++------ plinth/locale/sv/LC_MESSAGES/django.po | 817 ++++++++----- plinth/locale/te/LC_MESSAGES/django.po | 1007 ++++++++++------ plinth/locale/tr/LC_MESSAGES/django.po | 1201 +++++++++++-------- plinth/locale/zh_CN/LC_MESSAGES/django.po | 175 +-- 14 files changed, 8439 insertions(+), 4509 deletions(-) diff --git a/plinth/locale/da/LC_MESSAGES/django.po b/plinth/locale/da/LC_MESSAGES/django.po index a86ab517e..90acc4b3b 100644 --- a/plinth/locale/da/LC_MESSAGES/django.po +++ b/plinth/locale/da/LC_MESSAGES/django.po @@ -9,11 +9,11 @@ msgid "" msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-12-20 13:58+0530\n" +"POT-Creation-Date: 2016-01-31 22:19+0530\n" "PO-Revision-Date: 2015-12-20 14:43+0000\n" "Last-Translator: Mikkel Kirkgaard Nielsen \n" -"Language-Team: Danish " -"\n" +"Language-Team: Danish \n" "Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -51,11 +51,15 @@ msgstr "Forbind til {host}:{port}" msgid "Cannot connect to {host}:{port}" msgstr "Kan ikke forbinde til {host}:{port}" +#: plinth/context_processors.py:36 +msgid "FreedomBox" +msgstr "FreedomBox" + #: plinth/modules/apps/apps.py:26 msgid "Apps" msgstr "Apps" -#: plinth/modules/apps/apps.py:32 plinth/templates/base.html.py:90 +#: plinth/modules/apps/apps.py:32 plinth/templates/base.html.py:93 msgid "Applications" msgstr "Applikationer" @@ -97,10 +101,18 @@ msgid "Enable service discovery" msgstr "Aktiver tjenestesøgning" #: plinth/modules/avahi/templates/avahi.html:29 -msgid "" -"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 " +#, fuzzy, python-format +#| msgid "" +#| "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." +msgid "" +"Service discovery allows other devices on the network to discover your " +"%(box_name)s and services running on it. It also allows %(box_name)s to " +"discover other devices 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." @@ -115,14 +127,15 @@ msgstr "" #: plinth/modules/avahi/templates/avahi.html:40 #: plinth/modules/datetime/templates/datetime.html:35 #: plinth/modules/deluge/templates/deluge.html:39 -#: plinth/modules/dynamicdns/dynamicdns.py:38 +#: plinth/modules/dynamicdns/dynamicdns.py:39 #: plinth/modules/firewall/templates/firewall.html:57 #: plinth/modules/mumble/templates/mumble.html:44 #: plinth/modules/networks/templates/connection_show.html:261 #: plinth/modules/openvpn/templates/openvpn.html:81 #: plinth/modules/privoxy/templates/privoxy.html:48 #: plinth/modules/quassel/templates/quassel.html:50 -#: plinth/modules/tor/templates/tor.html:39 +#: plinth/modules/repro/templates/repro.html:58 +#: plinth/modules/tor/templates/tor.html:48 #: plinth/modules/transmission/templates/transmission.html:42 #: plinth/modules/xmpp/templates/xmpp.html:58 msgid "Status" @@ -145,9 +158,10 @@ msgstr "Tjenestesøgningstjenesten er ikke aktiv" #: plinth/modules/owncloud/templates/owncloud.html:51 #: plinth/modules/privoxy/templates/privoxy.html:62 #: plinth/modules/quassel/templates/quassel.html:65 +#: plinth/modules/repro/templates/repro.html:72 #: plinth/modules/roundcube/templates/roundcube.html:62 #: plinth/modules/shaarli/templates/shaarli.html:40 -#: plinth/modules/tor/templates/tor.html:74 +#: plinth/modules/tor/templates/tor.html:92 #: plinth/modules/transmission/templates/transmission.html:56 #: plinth/modules/xmpp/templates/xmpp.html:72 msgid "Configuration" @@ -163,10 +177,11 @@ msgstr "Konfiguration" #: plinth/modules/openvpn/templates/openvpn.html:138 #: plinth/modules/privoxy/templates/privoxy.html:70 #: plinth/modules/quassel/templates/quassel.html:73 +#: plinth/modules/repro/templates/repro.html:80 #: plinth/modules/restore/templates/restore_index.html:54 #: plinth/modules/roundcube/templates/roundcube.html:70 #: plinth/modules/shaarli/templates/shaarli.html:48 -#: plinth/modules/tor/templates/tor.html:82 +#: plinth/modules/tor/templates/tor.html:100 #: plinth/modules/transmission/templates/transmission.html:64 #: plinth/modules/upgrades/templates/upgrades_configure.html:34 #: plinth/modules/xmpp/templates/xmpp.html:80 @@ -175,12 +190,13 @@ msgstr "Opdater indstillinger" #: plinth/modules/avahi/views.py:73 plinth/modules/datetime/views.py:85 #: plinth/modules/deluge/views.py:80 -#: plinth/modules/dynamicdns/dynamicdns.py:368 +#: plinth/modules/dynamicdns/dynamicdns.py:371 #: plinth/modules/ikiwiki/views.py:95 plinth/modules/mumble/views.py:80 #: plinth/modules/openvpn/views.py:142 plinth/modules/privoxy/views.py:83 -#: plinth/modules/quassel/views.py:76 plinth/modules/restore/views.py:68 -#: plinth/modules/roundcube/views.py:84 plinth/modules/shaarli/views.py:74 -#: plinth/modules/transmission/views.py:105 plinth/modules/xmpp/views.py:100 +#: plinth/modules/quassel/views.py:76 plinth/modules/repro/views.py:77 +#: plinth/modules/restore/views.py:68 plinth/modules/roundcube/views.py:84 +#: plinth/modules/shaarli/views.py:74 plinth/modules/transmission/views.py:109 +#: plinth/modules/xmpp/views.py:100 msgid "Configuration updated" msgstr "Konfiguration opdateret" @@ -188,27 +204,34 @@ msgstr "Konfiguration opdateret" #: plinth/modules/deluge/views.py:82 plinth/modules/ikiwiki/views.py:97 #: plinth/modules/mumble/views.py:82 plinth/modules/openvpn/views.py:144 #: plinth/modules/owncloud/owncloud.py:93 plinth/modules/privoxy/views.py:85 -#: plinth/modules/quassel/views.py:78 plinth/modules/restore/views.py:70 -#: plinth/modules/roundcube/views.py:86 plinth/modules/shaarli/views.py:76 -#: plinth/modules/tor/tor.py:250 plinth/modules/transmission/views.py:107 -#: plinth/modules/upgrades/views.py:103 plinth/modules/xmpp/views.py:102 +#: plinth/modules/quassel/views.py:78 plinth/modules/repro/views.py:79 +#: plinth/modules/restore/views.py:70 plinth/modules/roundcube/views.py:86 +#: plinth/modules/shaarli/views.py:76 plinth/modules/tor/views.py:111 +#: plinth/modules/transmission/views.py:111 +#: plinth/modules/upgrades/views.py:118 plinth/modules/xmpp/views.py:102 msgid "Setting unchanged" msgstr "Indstilling uændret" -#: plinth/modules/config/config.py:83 plinth/modules/config/config.py:120 -#: plinth/modules/dynamicdns/dynamicdns.py:145 +#: plinth/modules/config/config.py:84 plinth/modules/config/config.py:121 +#: plinth/modules/dynamicdns/dynamicdns.py:148 msgid "Invalid domain name" msgstr "Ugyldigt domænenavn" -#: plinth/modules/config/config.py:94 +#: plinth/modules/config/config.py:95 msgid "Hostname" msgstr "Værtsnavn" -#: plinth/modules/config/config.py:96 -msgid "" -"Hostname is the local name by which other machines on the local network " -"reach your machine. It must start and end with an alphabet or a digit and " -"have as interior characters only alphabets, digits and hyphens. Total " +#: plinth/modules/config/config.py:97 +#, fuzzy, python-brace-format +#| msgid "" +#| "Hostname is the local name by which other machines on the local network " +#| "reach your machine. It must start and end with an alphabet or a digit " +#| "and have as interior characters only alphabets, digits and hyphens. " +#| "Total length must be 63 characters or less." +msgid "" +"Hostname is the local name by which other devices on the local network can " +"reach your {box_name}. It must start and end with an alphabet or a digit " +"and have as interior characters only alphabets, digits and hyphens. Total " "length must be 63 characters or less." msgstr "" "Værtsnavn er det lokale navn under hvilket maskiner på dit lokalnetværk kan " @@ -216,24 +239,32 @@ msgstr "" "må kun være bogstaver, tal og bindestreger. Den samlede længde skal være 63 " "tegn eller derunder." -#: plinth/modules/config/config.py:104 +#: plinth/modules/config/config.py:105 msgid "Invalid hostname" msgstr "Ugyldigt værtsnavn" -#: plinth/modules/config/config.py:107 plinth/modules/config/config.py:153 +#: plinth/modules/config/config.py:108 plinth/modules/config/config.py:153 #: plinth/modules/config/config.py:265 -#: plinth/modules/dynamicdns/dynamicdns.py:140 +#: plinth/modules/dynamicdns/dynamicdns.py:143 msgid "Domain Name" msgstr "Domænenavn" -#: plinth/modules/config/config.py:109 -msgid "" -"Domain name is the global name by which other machines on the Internet can " -"reach you. It must consist of labels separated by dots. Each label must " -"start and end with an alphabet or a digit and have as interior characters " -"only alphabets, digits and hyphens. Length of each label must be 63 " -"characters or less. Total length of domain name must be 253 characters or " -"less." +#: plinth/modules/config/config.py:110 +#, fuzzy, python-brace-format +#| msgid "" +#| "Domain name is the global name by which other machines on the Internet " +#| "can reach you. It must consist of labels separated by dots. Each label " +#| "must start and end with an alphabet or a digit and have as interior " +#| "characters only alphabets, digits and hyphens. Length of each label must " +#| "be 63 characters or less. Total length of domain name must be 253 " +#| "characters or less." +msgid "" +"Domain name is the global name by which other devices on the Internet can " +"reach your {box_name}. It must consist of labels separated by dots. Each " +"label must start and end with an alphabet or a digit and have as interior " +"characters only alphabets, digits and hyphens. Length of each label must be " +"63 characters or less. Total length of domain name must be 253 characters " +"or less." msgstr "" "Domænenavn er det globale navn under hvilket maskiner på internettet kan nå " "dig. Det skal bestå af ord adskilt af punktummer. Hver ord skal starte og " @@ -241,16 +272,18 @@ msgstr "" "og bindestreger. Hvert ord skal være på 63 tegn eller derunder. Den samlede " "længde skal være 253 tegn eller derunder." -#: plinth/modules/config/config.py:124 +#: plinth/modules/config/config.py:125 msgid "Language" msgstr "Sprog" -#: plinth/modules/config/config.py:126 -msgid "Language for this FreedomBox web administration interface" +#: plinth/modules/config/config.py:127 +#, fuzzy +#| msgid "Language for this FreedomBox web administration interface" +msgid "Language for this web administration interface" msgstr "Sprog i FreedomBox administrationsværktøjet" #: plinth/modules/config/config.py:135 -#: plinth/modules/dynamicdns/dynamicdns.py:36 +#: plinth/modules/dynamicdns/dynamicdns.py:37 #: plinth/modules/ikiwiki/views.py:36 msgid "Configure" msgstr "Konfigurer" @@ -446,16 +479,16 @@ msgstr "Test" msgid "Result" msgstr "Resultat" -#: plinth/modules/dynamicdns/dynamicdns.py:34 plinth/modules/help/help.py:40 +#: plinth/modules/dynamicdns/dynamicdns.py:35 plinth/modules/help/help.py:40 msgid "About" msgstr "Om" -#: plinth/modules/dynamicdns/dynamicdns.py:44 -#: plinth/modules/dynamicdns/dynamicdns.py:53 +#: plinth/modules/dynamicdns/dynamicdns.py:45 +#: plinth/modules/dynamicdns/dynamicdns.py:54 msgid "Dynamic DNS" msgstr "Dynamisk DNS" -#: plinth/modules/dynamicdns/dynamicdns.py:70 +#: plinth/modules/dynamicdns/dynamicdns.py:71 msgid "" "The Variables <User>, <Pass>, <Ip>, <Domain> may be " "used within the URL. For details see the update URL templates of the example " @@ -465,7 +498,7 @@ msgstr "" "bruges i URL'en. For flere detaljer se skabelonerne for opdaterings-URL'er i " "eksemplernes tjenester." -#: plinth/modules/dynamicdns/dynamicdns.py:74 +#: plinth/modules/dynamicdns/dynamicdns.py:75 msgid "" "Please choose an update protocol according to your provider. If your " "provider does not support the GnudIP protocol or your provider is not listed " @@ -475,23 +508,29 @@ msgstr "" "udbyderen ikke understøtter GnuDIP-protokollen eller ikke er prædefineret, " "kan en opdaterings-URL fra din udbyder angives direkte." -#: plinth/modules/dynamicdns/dynamicdns.py:79 +#: plinth/modules/dynamicdns/dynamicdns.py:80 +#, fuzzy +#| msgid "" +#| "Please do not enter a URL here (like \"https://example.com/\") but only " +#| "the hostname of the GnuDIP server (like \"example.pcom\")." msgid "" "Please do not enter a URL here (like \"https://example.com/\") but only the " -"hostname of the GnuDIP server (like \"example.pcom\")." +"hostname of the GnuDIP server (like \"example.com\")." msgstr "" "Her skal ikke angives en URL (såsom \"https://example.com/\"), men blot " "værtsnavnet for GnuDIP-serveren (såsom \"example.com\")." -#: plinth/modules/dynamicdns/dynamicdns.py:83 -msgid "The public domain name you want use to reach your box." +#: plinth/modules/dynamicdns/dynamicdns.py:84 +#, fuzzy, python-brace-format +#| msgid "The public domain name you want use to reach your box." +msgid "The public domain name you want use to reach your {box_name}." msgstr "Det offentlige domænenavn du vil bruge til at nå din boks." -#: plinth/modules/dynamicdns/dynamicdns.py:85 +#: plinth/modules/dynamicdns/dynamicdns.py:87 msgid "Use this option if your provider uses self signed certificates." msgstr "Aktiver dette hvis din udbyder bruger selvunderskrevne certifikater." -#: plinth/modules/dynamicdns/dynamicdns.py:88 +#: plinth/modules/dynamicdns/dynamicdns.py:90 msgid "" "If this option is selected, your username and password will be used for HTTP " "basic authentication." @@ -499,123 +538,151 @@ msgstr "" "Hvis denne option er aktiveret vil dit brugernavn og kodeord blive anvendt " "til basal (\"basic\") HTTP-autentifikation." -#: plinth/modules/dynamicdns/dynamicdns.py:91 +#: plinth/modules/dynamicdns/dynamicdns.py:93 msgid "" "Leave this field empty if you want to keep your previous configured password." msgstr "" "Lad dette felt stå tomt hvis du vil beholde det tidligere konfigurerede " "kodeord." -#: plinth/modules/dynamicdns/dynamicdns.py:94 +#: plinth/modules/dynamicdns/dynamicdns.py:96 +#, fuzzy, python-brace-format +#| msgid "" +#| "Optional Value. If your FreedomBox is not connected directly to the " +#| "Internet (i.e. connected to a NAT router) this URL is used to figure out " +#| "the real Internet IP. The URL should simply return the IP wherethe client " +#| "comes from. Example: http://myip.datasystems24.de" msgid "" -"Optional Value. If your FreedomBox is not connected directly to the Internet " +"Optional Value. If your {box_name} is not connected directly to the Internet " "(i.e. connected to a NAT router) this URL is used to figure out the real " -"Internet IP. The URL should simply return the IP wherethe client comes from. " -"Example: http://myip.datasystems24.de" +"Internet IP. The URL should simply return the IP where the client comes from " +"(example: http://myip.datasystems24.de)." msgstr "" "Ikke obligatorisk. Hvis din FreedomBox ikke er tilsluttet direkte til " "internettet (hvis den f.eks.er bag en NAT-router) bruges denne URL til at " "afgøre dens offentlige IP. Denne URL skal simpelthen returnere IP-adressen " "hvorfra klientens forespørgsel kommer. Eksempel: http://myip.datasystems24.de" -#: plinth/modules/dynamicdns/dynamicdns.py:101 +#: plinth/modules/dynamicdns/dynamicdns.py:104 msgid "" "You should have been requested to select a username when you created the " "account." msgstr "Brugernavn du har valgt ved oprettelse af konto hos tjenesteudbyderen." -#: plinth/modules/dynamicdns/dynamicdns.py:112 +#: plinth/modules/dynamicdns/dynamicdns.py:115 msgid "Enable Dynamic DNS" msgstr "Aktiver Dynamisk DNS" -#: plinth/modules/dynamicdns/dynamicdns.py:115 +#: plinth/modules/dynamicdns/dynamicdns.py:118 msgid "Service type" msgstr "Servicetype" -#: plinth/modules/dynamicdns/dynamicdns.py:120 +#: plinth/modules/dynamicdns/dynamicdns.py:123 msgid "GnudIP Server Address" msgstr "GnuDIP Serveradresse" -#: plinth/modules/dynamicdns/dynamicdns.py:125 +#: plinth/modules/dynamicdns/dynamicdns.py:128 msgid "Invalid server name" msgstr "Ugyldigt servernavn" -#: plinth/modules/dynamicdns/dynamicdns.py:128 +#: plinth/modules/dynamicdns/dynamicdns.py:131 msgid "Update URL" msgstr "Opdaterings-URL" -#: plinth/modules/dynamicdns/dynamicdns.py:132 -msgid "accept all SSL certificates" +#: plinth/modules/dynamicdns/dynamicdns.py:135 +#, fuzzy +#| msgid "accept all SSL certificates" +msgid "Accept all SSL certificates" msgstr "accepter alle SSL-certifikater" -#: plinth/modules/dynamicdns/dynamicdns.py:136 -msgid "use HTTP basic authentication" +#: plinth/modules/dynamicdns/dynamicdns.py:139 +#, fuzzy +#| msgid "use HTTP basic authentication" +msgid "Use HTTP basic authentication" msgstr "brug basal (\"basic\") HTTP-autentifikation" -#: plinth/modules/dynamicdns/dynamicdns.py:148 -#: plinth/modules/networks/forms.py:118 plinth/modules/transmission/forms.py:39 +#: plinth/modules/dynamicdns/dynamicdns.py:151 +#: plinth/modules/networks/forms.py:146 plinth/modules/transmission/forms.py:39 msgid "Username" msgstr "Brugernavn" -#: plinth/modules/dynamicdns/dynamicdns.py:151 -#: plinth/modules/networks/forms.py:119 plinth/modules/transmission/forms.py:43 +#: plinth/modules/dynamicdns/dynamicdns.py:154 +#: plinth/modules/networks/forms.py:147 plinth/modules/transmission/forms.py:43 msgid "Password" msgstr "Kodeord" -#: plinth/modules/dynamicdns/dynamicdns.py:154 -msgid "show password" -msgstr "vis kodeord" +#: plinth/modules/dynamicdns/dynamicdns.py:157 +#: plinth/modules/networks/forms.py:149 +msgid "Show password" +msgstr "Vis kodeord" -#: plinth/modules/dynamicdns/dynamicdns.py:158 +#: plinth/modules/dynamicdns/dynamicdns.py:161 msgid "IP check URL" msgstr "URL for IP-kontrol" -#: plinth/modules/dynamicdns/dynamicdns.py:184 +#: plinth/modules/dynamicdns/dynamicdns.py:187 msgid "Please provide update URL or a GnuDIP Server" msgstr "Angiv venligst opdaterings-URL eller GnuDIP-server" -#: plinth/modules/dynamicdns/dynamicdns.py:187 +#: plinth/modules/dynamicdns/dynamicdns.py:190 msgid "Please provide GnuDIP username" msgstr "Angiv venligst brugernavn til GnuDIP" -#: plinth/modules/dynamicdns/dynamicdns.py:190 +#: plinth/modules/dynamicdns/dynamicdns.py:193 msgid "Please provide GnuDIP domain" msgstr "Angiv venligst domæne til GnuDIP-server" -#: plinth/modules/dynamicdns/dynamicdns.py:195 +#: plinth/modules/dynamicdns/dynamicdns.py:198 msgid "Please provide a password" msgstr "Angiv venligst et kodeord" -#: plinth/modules/dynamicdns/dynamicdns.py:214 +#: plinth/modules/dynamicdns/dynamicdns.py:217 msgid "Configure Dynamic DNS" msgstr "Konfigurer Dynamisk DNS" -#: plinth/modules/dynamicdns/dynamicdns.py:236 +#: plinth/modules/dynamicdns/dynamicdns.py:239 msgid "Status of Dynamic DNS" msgstr "Status for Dynamisk DNS" #: plinth/modules/dynamicdns/templates/dynamicdns.html:25 -msgid "DynamicDNS client" +#, fuzzy +#| msgid "DynamicDNS client" +msgid "Dynamic DNS Client" msgstr "Dynamisk DNS" #: plinth/modules/dynamicdns/templates/dynamicdns.html:28 +#, fuzzy, python-format +#| msgid "" +#| "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)." msgid "" "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)." +"may find the services which are provided by %(box_name)s, such as ownCloud." msgstr "" "Hvis din internetudbyder periodisk ændrer din IP-adresse (f.eks. en gang i " "døgnet), kan det være svært for andre at finde dig og de tjenester (såsom " "din ownCloud) din FreedomBox udbyder på nettet." #: plinth/modules/dynamicdns/templates/dynamicdns.html:37 +#, fuzzy +#| msgid "" +#| "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 gnudip " +#| "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." msgid "" "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 gnudip 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." +"Internet asks for your DNS name he will get your current IP answered." msgstr "" "Løsningen er at tilknytte et DNS-navn til din IP-adresse og opdatere dette " "navn hver gang IP-adressen ændres af din udbyder. Dynamisk DNS gør det " @@ -638,10 +705,14 @@ msgstr "" "href='http://freedns.afraid.org/' target='_blank'> freedns.afraid.org." #: plinth/modules/dynamicdns/templates/dynamicdns.html:61 +#, fuzzy, python-format +#| msgid "" +#| "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." msgid "" -"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." +"If your %(box_name)s is connected behind some NAT router, don't forget to " +"add port forwarding (i.e. forward some standard ports like 80 and 443)." msgstr "" "Hvis din FreedomBox er tilsluttet bag en NAT-router, så glem ikke at " "viderestille de relevante porte (som f.eks. standard portene for HTTP 80 og " @@ -669,16 +740,23 @@ msgstr "" "IP-kontrol\" kan den ikke detekteres." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:35 -msgid "Direct connection to the internet." +#, fuzzy +#| msgid "Direct connection to the internet." +msgid "Direct connection to the Internet." msgstr "Direkte forbindelse til internettet." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:37 -#, python-format +#, fuzzy, python-format +#| msgid "" +#| "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)s " +#| "minutes until we update your DNS entry in case of WAN IP change." msgid "" -"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)s minutes until we " -"update your DNS entry in case of WAN IP change." +"Behind NAT. This means that Dynamic DNS service will poll the \"IP check URL" +"\" for changes (the \"IP check URL\" entry is needed for this - otherwise IP " +"changes will not be detected). In case the WAN IP changes, it may take up " +"to %(timer)s minutes until your DNS entry is updated." msgstr "" "Bagved NAT betyder at Dynamisk DNS-tjenesten med \"URL for IP-kontrol\" vil " "tjekke din IP-adresse for ændringer (vi behøver denne URL af samme grund - " @@ -696,19 +774,23 @@ msgid "Firewall" msgstr "Firewall" #: plinth/modules/firewall/templates/firewall.html:28 -#, python-format +#, fuzzy, python-format +#| msgid "" +#| "Firewall is a network security system that controls the incoming and " +#| "outgoing network traffic on your %(box_name)s. Keeping a firewall enabled " +#| "and properly configured reduces risk of security threat from the Internet." msgid "" -"Firewall is a network security system that controls the incoming and " -"outgoing network traffic on your %(box_name)s. Keeping a firewall enabled " -"and properly configured reduces risk of security threat from the Internet." +"Firewall is a security system that controls the incoming and outgoing " +"network traffic on your %(box_name)s. Keeping a firewall enabled and " +"properly configured reduces risk of security threat from the Internet." msgstr "" "En firewall er et netværksbeskyttelsessystem som styrer indgående og " "udgående trafik på din %(box_name)s. At holde en firewall aktiveret og " "velkonfigureret reducerer risikoen for sikkerhedstrusler fra internettet." #: plinth/modules/firewall/templates/firewall.html:36 -msgid "The following is the current status:" -msgstr "Den nuværende status er som følger:" +msgid "Current status:" +msgstr "" #: plinth/modules/firewall/templates/firewall.html:41 #, python-format @@ -728,11 +810,13 @@ msgid "Service/Port" msgstr "Tjeneste/Port" #: plinth/modules/firewall/templates/firewall.html:67 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:91 #: plinth/modules/names/templates/names.html:51 msgid "Enabled" msgstr "Aktiveret" #: plinth/modules/firewall/templates/firewall.html:70 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:93 #: plinth/modules/names/templates/names.html:53 msgid "Disabled" msgstr "Deaktiveret" @@ -754,10 +838,15 @@ msgid "Blocked" msgstr "Blokeret" #: plinth/modules/firewall/templates/firewall.html:103 +#, fuzzy +#| msgid "" +#| "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." msgid "" "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." +"also permitted in the firewall and when you disable a service it is also " +"disabled in the firewall." msgstr "" "Denne firewall er autokonfigurerende. Når du aktiverer en tjeneste vil den " "automatiskt blive åbnet i firewallen, og når du deaktiverer en tjeneste " @@ -775,29 +864,30 @@ msgstr "Kunne ikke tilføje ny bruger til admin-gruppen." msgid "User account created, you are now logged in" msgstr "Brugerkonto oprettet, du er nu logget ind" -#: plinth/modules/first_boot/templates/firstboot_state0.html:50 -msgid "Congratulations! Your FreedomBox is up and running!" -msgstr "Tillykke! Din FreedomBox er nu kørende!" +#: plinth/modules/first_boot/templates/firstboot_navbar.html:23 +#: plinth/modules/help/templates/help_index.html:25 +#: plinth/templates/base.html:102 +msgid "Help" +msgstr "Hjælp" + +#: plinth/modules/first_boot/templates/firstboot_state0.html:45 +#, fuzzy +#| msgid "Start setup" +msgid "Start Setup" +msgstr "Start opsætning" -#: plinth/modules/first_boot/templates/firstboot_state0.html:54 +#: plinth/modules/first_boot/templates/firstboot_state0.html:49 +#, python-format msgid "" -"Please provide the following basic information to complete the setup process." +"To complete the setup of your %(box_name)s, please provide some basic " +"information." msgstr "" -"Indtast venligst følgende grundoplysninger for at færdiggøre konfigurationen." -#: plinth/modules/first_boot/templates/firstboot_state0.html:62 -msgid "Next" -msgstr "Næste" - -#: plinth/modules/first_boot/templates/firstboot_state1.html:39 +#: plinth/modules/first_boot/templates/firstboot_state1.html:41 msgid "Administrator Account" msgstr "Administratorkonto" -#: plinth/modules/first_boot/templates/firstboot_state1.html:42 -#| msgid "" -#| "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." +#: plinth/modules/first_boot/templates/firstboot_state1.html:44 msgid "" "Choose a username and password to access this web interface. The password " "can be changed later. This user will be granted administrative privileges. " @@ -807,7 +897,7 @@ msgstr "" "Kodeordet kan ændres senere. Brugeren vil få tildelt " "administratorrettigheder. Andre brugere kan tilføjes senere." -#: plinth/modules/first_boot/templates/firstboot_state1.html:55 +#: plinth/modules/first_boot/templates/firstboot_state1.html:57 msgid "Box it up!" msgstr "Box den!" @@ -816,35 +906,46 @@ msgid "Setup Complete!" msgstr "Konfiguration er færdig!" #: plinth/modules/first_boot/templates/firstboot_state10.html:32 +#, fuzzy, python-format +#| msgid "" +#| "To make your FreedomBox functional, you need some applications. " +#| "Applications will be installed the first time you access them." msgid "" -"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." -msgstr "" -"Konfigurationen af FreedomBox er nu færdig. Du bør dog kontrollere " -"netværksopsætningen og tilpasse den hvis nødvendigt. Glem ikke at ændre " -"standardkodeordene for Wi-Fi." - -#: plinth/modules/first_boot/templates/firstboot_state10.html:40 -msgid "" -"To make your FreedomBox functional, you need some applications. " -"Applications will be installed the first time you access them." +"%(box_name)s setup is now complete. To make your %(box_name)s functional, " +"you need some applications. They will be installed the first time you " +"access them." msgstr "" "For at kunne noget nyttigt skal din FreedomBox bruge nogle applikationer. " "Disse installeres første gang du tilgår dem." -#: plinth/modules/first_boot/templates/firstboot_state10.html:47 -msgid "Network Configuration" +#: plinth/modules/first_boot/templates/firstboot_state10.html:41 +msgid "Go to Apps" +msgstr "Gå til Apps" + +#: plinth/modules/first_boot/templates/firstboot_state10.html:44 +#, fuzzy +#| msgid "Network Configuration" +msgid "Current Network Configuration" msgstr "Netværkskonfiguration" -#: plinth/modules/first_boot/templates/firstboot_state10.html:54 +#: plinth/modules/first_boot/templates/firstboot_state10.html:47 +#, fuzzy +#| msgid "" +#| "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." +msgid "" +"You should check the network setup and modify it if necessary. Do not forget " +"to change the default Wi-Fi passwords!" +msgstr "" +"Konfigurationen af FreedomBox er nu færdig. Du bør dog kontrollere " +"netværksopsætningen og tilpasse den hvis nødvendigt. Glem ikke at ændre " +"standardkodeordene for Wi-Fi." + +#: plinth/modules/first_boot/templates/firstboot_state10.html:57 msgid "Go to Networks" msgstr "Gå til Netværk" -#: plinth/modules/first_boot/templates/firstboot_state10.html:59 -msgid "Go to Apps" -msgstr "Gå til Apps" - #: plinth/modules/first_boot/views.py:60 msgid "Setup Complete" msgstr "Konfiguration Færdig" @@ -857,9 +958,9 @@ msgstr "Dokumentation" msgid "Where to Get Help" msgstr "Få Hjælp" -#: plinth/modules/help/help.py:38 plinth/modules/help/help.py:72 -msgid "FreedomBox Manual" -msgstr "FreedomBox Brugervejledning" +#: plinth/modules/help/help.py:38 +msgid "Manual" +msgstr "" #: plinth/modules/help/help.py:48 msgid "Documentation and FAQ" @@ -870,15 +971,30 @@ msgstr "Dokumentation og OSS" msgid "About {box_name}" msgstr "Om {box_name}" +#: plinth/modules/help/help.py:73 +#, fuzzy, python-brace-format +#| msgid "About {box_name}" +msgid "{box_name} Manual" +msgstr "Om {box_name}" + #: plinth/modules/help/templates/help_about.html:30 -msgid "" -"FreedomBox is a community project to develop, design and promote personal " +#, fuzzy, python-format +#| msgid "" +#| "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." +msgid "" +"%(box_name)s 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." +"and a Tor relay, on a device that can replace your Wi-Fi router, so that " +"your data stays with you." msgstr "" "FreedomBox er et fællesskabsdrevet projekt med det mål at udvikle, designe " "og promovere personlige servere der drives af fri software til privat og " @@ -906,59 +1022,82 @@ msgstr "" "tilbage til dets påtænkte peer-to-peer arkitektur." #: plinth/modules/help/templates/help_about.html:56 +#, fuzzy, python-format +#| msgid "" +#| "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." msgid "" "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." +"services; %(box_name)s aims to bring them all together in a convenient " +"package." msgstr "" "Der findes et antal projekter som arbejder på at realisere en fremtid hvor " "distribuerede tjenester er mere udbredte end i dag; FreedomBox har som mål " "at kombinere alle disse i én letanvendelig pakke." #: plinth/modules/help/templates/help_about.html:64 +#, fuzzy, python-format +#| msgid "" +#| "For more information about the FreedomBox project, see the FreedomBox Wiki." msgid "" -"For more information about the FreedomBox project, see the FreedomBox Wiki." +"For more information about the %(box_name)s project, see the %(box_name)s Wiki." msgstr "" "For mere information om FreedomBox-projektet, se FreedomBox Wiki-siden." -#: plinth/modules/help/templates/help_about.html:72 +#: plinth/modules/help/templates/help_about.html:73 msgid "Learn more »" msgstr "Lær mere »" -#: plinth/modules/help/templates/help_about.html:75 +#: plinth/modules/help/templates/help_about.html:76 #, python-format msgid "You are running Plinth version %(version)s." msgstr "Du kører Plinth version %(version)s." -#: plinth/modules/help/templates/help_index.html:25 -#: plinth/templates/base.html:98 -msgid "Help" -msgstr "Hjælp" +#: plinth/modules/help/templates/help_base.html:36 +#, python-format +msgid "%(box_name)s Setup" +msgstr "" #: plinth/modules/help/templates/help_index.html:29 -#, python-format +#, fuzzy, python-format +#| msgid "" +#| "The FreedomBox Manual is the best place to " +#| "start for information regarding %(box_name)s." msgid "" -"The FreedomBox Manual is the best place to " +"The %(box_name)s Manual is the best place to " "start for information regarding %(box_name)s." msgstr "" "FreedomBox Brugervejledningen er det bedste " "sted at starte når du har brug for information om %(box_name)s." #: plinth/modules/help/templates/help_index.html:36 +#, fuzzy, python-format +#| msgid "" +#| " " +#| "FreedomBox project wiki contains further information." msgid "" -" FreedomBox " -"project wiki contains further information." +" " +"%(box_name)s project wiki contains further information." msgstr "" "FreedomBox " "wiki-siden indeholder yderligere information." #: plinth/modules/help/templates/help_index.html:43 +#, fuzzy, python-format +#| msgid "" +#| "To seek help from FreedomBox community, queries may be posted on the mailing list. The list archives also contain information about " +#| "problems faced by other users and possible solutions." msgid "" -"To seek help from FreedomBox community, queries may be posted on the " -"mailing list. The list archives also contain information about problems " -"faced by other users and possible solutions." +"To seek help from %(box_name)s community, queries may be posted on the mailing list. The list archives also contain information about " +"problems faced by other users and possible solutions." msgstr "" "Ønsker du hjælp af FreedomBox-fællesskabet, kan du skrive til #freedombox " +"channel using the IRC web interface." msgstr "" -"Mange bidragsydere og brugere af FreedomBox er også at finde i kanalen " -"#freedombox på irc.oftc.net IRC-netværket." #: plinth/modules/ikiwiki/__init__.py:38 -msgid "Wiki & Blog (Ikiwiki)" +#, fuzzy +#| msgid "Wiki & Blog (Ikiwiki)" +msgid "Wiki and Blog (ikiwiki)" msgstr "Wiki & Blog (Ikiwiki)" #: plinth/modules/ikiwiki/__init__.py:43 -msgid "Ikiwiki wikis and blogs" +#, fuzzy +#| msgid "Ikiwiki wikis and blogs" +msgid "ikiwiki wikis and blogs" msgstr "Ikiwiki wikier og blogs" #: plinth/modules/ikiwiki/forms.py:29 -msgid "Enable Ikiwiki" +#, fuzzy +#| msgid "Enable Ikiwiki" +msgid "Enable ikiwiki" msgstr "Aktiver Ikiwiki" #: plinth/modules/ikiwiki/forms.py:36 @@ -1012,24 +1158,30 @@ msgstr "" "\">/ikiwiki." #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:27 -#, python-format -msgid "Delete Wiki/Blog %(name)s" +#, fuzzy, python-format +#| msgid "Delete Wiki/Blog %(name)s" +msgid "Delete Wiki or Blog %(name)s" msgstr "Slet Wiki/Blog %(name)s" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:33 +#, fuzzy +#| msgid "" +#| "This action will remove all the posts, pages and comments including " +#| "revision history. Delete this wiki/blog permanently?" msgid "" "This action will remove all the posts, pages and comments including revision " -"history. Delete this wiki/blog permanently?" +"history. Delete this wiki or blog permanently?" msgstr "" "Denne handling fjerner alle artikler, sider og kommentater inklusiv al " "historik. Slet denne wiki/blog permanent?" -#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:43 +#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:44 #, python-format msgid "Delete %(name)s" msgstr "Slet %(name)s" -#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:46 +#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:47 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:60 #: plinth/modules/networks/templates/connections_delete.html:41 #: plinth/modules/users/templates/users_delete.html:41 msgid "Cancel" @@ -1062,7 +1214,9 @@ msgid "Create" msgstr "Opret" #: plinth/modules/ikiwiki/views.py:73 -msgid "Wiki & Blog" +#, fuzzy +#| msgid "Wiki & Blog" +msgid "Wiki and Blog" msgstr "Wiki & Blog" #: plinth/modules/ikiwiki/views.py:106 @@ -1070,8 +1224,10 @@ msgid "Manage Wikis and Blogs" msgstr "Administrer Wikier og Blogs" #: plinth/modules/ikiwiki/views.py:132 -msgid "Create Wiki/Blog" -msgstr "Opret Wiki/Blog" +#, fuzzy +#| msgid "Create a Wiki or Blog" +msgid "Create Wiki or Blog" +msgstr "Opret en Wiki eller Blog" #: plinth/modules/ikiwiki/views.py:145 #, python-brace-format @@ -1104,9 +1260,154 @@ msgid "Could not delete {name}: {error}" msgstr "Kunne ikke slette {name}: {error}" #: plinth/modules/ikiwiki/views.py:182 -msgid "Delete Wiki/Blog" +#, fuzzy +#| msgid "Delete Wiki/Blog" +msgid "Delete Wiki or Blog" msgstr "Slet Wiki/Blog" +#: plinth/modules/letsencrypt/__init__.py:43 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:38 +#: plinth/modules/letsencrypt/views.py:45 +msgid "Certificates (Let's Encrypt)" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:41 +#, python-format +msgid "" +"A digital certficate allows users of a web service to verify the identity of " +"the service and to securely communicate with it. %(box_name)s can " +"automatically obtain and setup digital certificates for each available " +"domain. It does so by proving itself to be the owner of a domain to Let's " +"Encrypt, a certficate authority (CA)." +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:52 +msgid "" +"Let's Encrypt is a free, automated, and open certificate authority, run for " +"the public’s benefit by the Internet Security Research Group (ISRG). Please " +"read and agree with the Let's Encrypt Subscriber Agreement before using this service." +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:66 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:70 +#, fuzzy +#| msgid "Domain Name" +msgid "Domain" +msgstr "Domænenavn" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:67 +msgid "Certificate Status" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:68 +#, fuzzy +#| msgid "Security" +msgid "Website Security" +msgstr "Sikkerhed" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:69 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:72 +#, fuzzy +#| msgid "Applications" +msgid "Actions" +msgstr "Applikationer" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:79 +#, python-format +msgid "Expires on %(expiry_date)s" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:85 +msgid "No certficate" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:102 +msgid "Revoke" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:108 +msgid "Re-obtain" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:115 +msgid "Obtain" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:55 +#, python-brace-format +msgid "Certificate successfully revoked for domain {domain}" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:60 +#, python-brace-format +msgid "Failed to revoke certificate for domain {domain}: {error}" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:72 +#, python-brace-format +msgid "Certificate successfully obtained for domain {domain}" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:77 +#, python-brace-format +msgid "Failed to obtain certificate for domain {domain}: {error}" +msgstr "" + +#: plinth/modules/monkeysphere/__init__.py:32 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:35 +#: plinth/modules/monkeysphere/views.py:44 +msgid "Monkeysphere" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:38 +msgid "" +"With Monkeysphere, a PGP key can be generated for each configured domain " +"serving SSH. The PGP public key can then be uploaded to the PGP keyservers. " +"Users connecting to this machine through SSH can verify that they are " +"connecting to the correct host. For users to trust the key, at least one " +"person (usually the machine owner) must sign the key using the regular PGP " +"key signing process. See the Monkeysphere SSH documentation for more details." +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:53 +msgid "Publishing key to keyserver..." +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:71 +msgid "GPG Fingerprint" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:83 +#: plinth/modules/names/views.py:45 +msgid "Not Available" +msgstr "Ikke tilgængelig" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:93 +msgid "Generate PGP Key" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:101 +msgid "Publish Key" +msgstr "" + +#: plinth/modules/monkeysphere/views.py:58 +msgid "Generated PGP key." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:83 +msgid "Cancelled key publishing." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:120 +msgid "Published key to keyserver." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:122 +msgid "Error occurred while publishing key." +msgstr "" + #: plinth/modules/mumble/__init__.py:38 #: plinth/modules/mumble/templates/mumble.html:26 #: plinth/modules/mumble/views.py:58 @@ -1147,61 +1448,48 @@ msgstr "Mumble-server er aktiv" msgid "Mumble server is not running" msgstr "Mumble-server er ikke aktiv" -#: plinth/modules/names/__init__.py:30 +#: plinth/modules/names/__init__.py:29 msgid "HTTP" msgstr "HTTP" -#: plinth/modules/names/__init__.py:31 +#: plinth/modules/names/__init__.py:30 msgid "HTTPS" msgstr "HTTPS" -#: plinth/modules/names/__init__.py:32 +#: plinth/modules/names/__init__.py:31 msgid "SSH" msgstr "SSH" -#: plinth/modules/names/__init__.py:46 plinth/modules/names/views.py:34 +#: plinth/modules/names/__init__.py:45 plinth/modules/names/views.py:34 msgid "Name Services" msgstr "Navnetjenester" -#: plinth/modules/names/__init__.py:107 -msgid "Not Available" -msgstr "Ikke tilgængelig" - #: plinth/modules/networks/__init__.py:108 #, python-brace-format msgid "Using DNSSEC on IPv{kind}" msgstr "Bruger DNSSEC på IPv{kind}" #: plinth/modules/networks/forms.py:30 -msgid "-- select --" -msgstr "-- vælg --" - -#: plinth/modules/networks/forms.py:42 msgid "Connection Type" msgstr "Forbindelsestype" -#: plinth/modules/networks/forms.py:49 plinth/modules/networks/forms.py:106 -#: plinth/modules/networks/forms.py:133 +#: plinth/modules/networks/forms.py:37 msgid "Connection Name" msgstr "Forbindelsesnavn" -#: plinth/modules/networks/forms.py:51 plinth/modules/networks/forms.py:108 -#: plinth/modules/networks/forms.py:135 +#: plinth/modules/networks/forms.py:39 msgid "Physical Interface" msgstr "Fysisk Interface" -#: plinth/modules/networks/forms.py:53 plinth/modules/networks/forms.py:110 -#: plinth/modules/networks/forms.py:137 +#: plinth/modules/networks/forms.py:41 msgid "The network device that this connection should be bound to." msgstr "Netværksenheden som denne forbindelse skal bindes til." -#: plinth/modules/networks/forms.py:56 plinth/modules/networks/forms.py:113 -#: plinth/modules/networks/forms.py:140 +#: plinth/modules/networks/forms.py:44 msgid "Firewall Zone" msgstr "Firewall-zone" -#: plinth/modules/networks/forms.py:57 plinth/modules/networks/forms.py:114 -#: plinth/modules/networks/forms.py:141 +#: plinth/modules/networks/forms.py:45 msgid "" "The firewall zone will control which services are available over this " "interfaces. Select Internal only for trusted networks." @@ -1209,11 +1497,11 @@ msgstr "" "Firewall-zonen bestemmer hvilke tjenester der er tilgængelige fra dette " "interface. Vælg Kun internt for netværk du har tillid til." -#: plinth/modules/networks/forms.py:61 plinth/modules/networks/forms.py:162 +#: plinth/modules/networks/forms.py:49 msgid "IPv4 Addressing Method" msgstr "IPv4 Adresseringsmetode" -#: plinth/modules/networks/forms.py:62 +#: plinth/modules/networks/forms.py:50 msgid "" "\"Shared\" method will start a DHCP server and \"Automatic\" method will " "acquire configuration from a DHCP server." @@ -1221,15 +1509,15 @@ msgstr "" "Metoden \"Delt\" vil starte en DHCP-server mens metoden \"Automatisk\" vil " "hente en konfiguration fra en DHCP-server." -#: plinth/modules/networks/forms.py:68 plinth/modules/networks/forms.py:170 +#: plinth/modules/networks/forms.py:56 msgid "Address" msgstr "Adresse" -#: plinth/modules/networks/forms.py:72 plinth/modules/networks/forms.py:174 +#: plinth/modules/networks/forms.py:60 msgid "Netmask" msgstr "Netmaske" -#: plinth/modules/networks/forms.py:73 plinth/modules/networks/forms.py:175 +#: plinth/modules/networks/forms.py:61 msgid "" "Optional value. If left blank, a default netmask based on the address will " "be used." @@ -1237,21 +1525,21 @@ msgstr "" "Ikke obligatorisk. Hvis ikke angivet, vil en standardværdi for netmasken " "baseret på adressen anvendes." -#: plinth/modules/networks/forms.py:78 plinth/modules/networks/forms.py:180 +#: plinth/modules/networks/forms.py:66 #: plinth/modules/networks/templates/connection_show.html:202 #: plinth/modules/networks/templates/connection_show.html:241 msgid "Gateway" msgstr "Gateway" -#: plinth/modules/networks/forms.py:79 plinth/modules/networks/forms.py:181 +#: plinth/modules/networks/forms.py:67 msgid "Optional value." msgstr "Ikke obligatorisk." -#: plinth/modules/networks/forms.py:83 plinth/modules/networks/forms.py:185 +#: plinth/modules/networks/forms.py:71 msgid "DNS Server" msgstr "DNS-server" -#: plinth/modules/networks/forms.py:84 plinth/modules/networks/forms.py:186 +#: plinth/modules/networks/forms.py:72 msgid "" "Optional value. If this value is given and IPv4 addressing method is " "\"Automatic\", the DNS Servers provided by a DHCP server will be ignored." @@ -1260,12 +1548,11 @@ msgstr "" "\"Automatisk\", vil DNS-serverne der konfigureres af en DHCP-server blive " "ignoreret." -#: plinth/modules/networks/forms.py:90 plinth/modules/networks/forms.py:192 -#| msgid "DNS server" +#: plinth/modules/networks/forms.py:78 msgid "Second DNS Server" msgstr "Sekundær DNS-server" -#: plinth/modules/networks/forms.py:91 plinth/modules/networks/forms.py:193 +#: plinth/modules/networks/forms.py:79 msgid "" "Optional value. If this value is given and IPv4 Addressing Method is " "\"Automatic\", the DNS Servers provided by a DHCP server will be ignored." @@ -1274,29 +1561,29 @@ msgstr "" "\"Automatisk\", vil DNS-serverne der konfigureres af en DHCP-server blive " "ignoreret." -#: plinth/modules/networks/forms.py:121 -msgid "Show password" -msgstr "Vis kodeord" +#: plinth/modules/networks/forms.py:89 +msgid "-- select --" +msgstr "-- vælg --" -#: plinth/modules/networks/forms.py:145 +#: plinth/modules/networks/forms.py:175 #: plinth/modules/networks/templates/connection_show.html:144 msgid "SSID" msgstr "SSID" -#: plinth/modules/networks/forms.py:146 +#: plinth/modules/networks/forms.py:176 msgid "The visible name of the network." msgstr "Netværkets synlige navn." -#: plinth/modules/networks/forms.py:148 +#: plinth/modules/networks/forms.py:178 #: plinth/modules/networks/templates/connection_show.html:157 msgid "Mode" msgstr "Tilstand" -#: plinth/modules/networks/forms.py:153 +#: plinth/modules/networks/forms.py:183 msgid "Authentication Mode" msgstr "Autentificeringstilstand" -#: plinth/modules/networks/forms.py:154 +#: plinth/modules/networks/forms.py:184 msgid "" "Select WPA if the wireless network is secured and requires clients to have " "the password to connect." @@ -1304,31 +1591,22 @@ msgstr "" "Vælg WPA hvis det trådløse netværk er sikret og kræver at klienter kender " "kodeordet for at oprette forbindelse." -#: plinth/modules/networks/forms.py:158 +#: plinth/modules/networks/forms.py:188 msgid "Passphrase" msgstr "Kodesætning" -#: plinth/modules/networks/forms.py:166 -msgid "" -"Select Automatic (DHCP) if you are connecting to an existing wireless " -"network. Shared mode is useful when running an Access Point." -msgstr "" -"Vælg \"Automatisk\" (DHCP) hvis du forbinder til et eksisterende trådløst " -"netværk. \"Delt\"-metoden er nyttig hvis enheden skal fungere som " -"accesspunkt." - #: plinth/modules/networks/networks.py:36 #: plinth/modules/networks/networks.py:56 msgid "Network Connections" msgstr "Netværksforbindelser" #: plinth/modules/networks/networks.py:38 -#: plinth/modules/networks/networks.py:273 +#: plinth/modules/networks/networks.py:242 msgid "Nearby Wi-Fi Networks" msgstr "Wi-Fi-netværk i Nærheden" #: plinth/modules/networks/networks.py:40 -#: plinth/modules/networks/networks.py:295 +#: plinth/modules/networks/networks.py:264 msgid "Add Connection" msgstr "Tilføj forbindelse" @@ -1352,59 +1630,59 @@ msgstr "Kan ikke redigere forbindelse: Forbindelse ikke fundet." msgid "This type of connection is not yet understood." msgstr "Denne type forbindelse kan ikke konfigureres herfra endnu." -#: plinth/modules/networks/networks.py:170 -#: plinth/modules/networks/networks.py:229 +#: plinth/modules/networks/networks.py:139 +#: plinth/modules/networks/networks.py:198 #: plinth/modules/networks/templates/connections_edit.html:34 msgid "Edit Connection" msgstr "Rediger Forbindelse" -#: plinth/modules/networks/networks.py:240 +#: plinth/modules/networks/networks.py:209 #, python-brace-format msgid "Activated connection {name}." msgstr "Aktiverede forbindelse {name}." -#: plinth/modules/networks/networks.py:243 +#: plinth/modules/networks/networks.py:212 msgid "Failed to activate connection: Connection not found." msgstr "Kunne ikke aktivere forbindelse: Forbindelse ikke fundet." -#: plinth/modules/networks/networks.py:247 +#: plinth/modules/networks/networks.py:216 #, python-brace-format msgid "Failed to activate connection {name}: No suitable device is available." msgstr "" "Kunne ikke aktivere forbindelse {name}: Ingen passende enhed er tilgængelig." -#: plinth/modules/networks/networks.py:260 +#: plinth/modules/networks/networks.py:229 #, python-brace-format msgid "Deactivated connection {name}." msgstr "Deaktiverede forbindelse {name}." -#: plinth/modules/networks/networks.py:263 +#: plinth/modules/networks/networks.py:232 msgid "Failed to de-activate connection: Connection not found." msgstr "Kan ikke deaktivere forbindelse: Forbindelse ikke fundet." -#: plinth/modules/networks/networks.py:325 +#: plinth/modules/networks/networks.py:282 msgid "Adding New Ethernet Connection" msgstr "Tilføjer Ny Ethernet Forbindelse" -#: plinth/modules/networks/networks.py:350 +#: plinth/modules/networks/networks.py:300 msgid "Adding New PPPoE Connection" msgstr "Tilføjer Ny PPPoE Forbindelse" -#: plinth/modules/networks/networks.py:399 +#: plinth/modules/networks/networks.py:332 msgid "Adding New Wi-Fi Connection" msgstr "Tilføjer Ny Wi-Fi Forbindelse" -#: plinth/modules/networks/networks.py:413 +#: plinth/modules/networks/networks.py:346 #, python-brace-format msgid "Connection {name} deleted." msgstr "Slettede forbindelse {name}." -#: plinth/modules/networks/networks.py:416 -#: plinth/modules/networks/networks.py:425 +#: plinth/modules/networks/networks.py:349 +#: plinth/modules/networks/networks.py:358 msgid "Failed to delete connection: Connection not found." msgstr "Kunne ikke slette forbindelse: Forbindelse ikke fundet." -#: plinth/modules/networks/networks.py:430 +#: plinth/modules/networks/networks.py:363 #: plinth/modules/networks/templates/connections_delete.html:26 msgid "Delete Connection" msgstr "Slet Forbindelse" @@ -1414,7 +1692,7 @@ msgid "Edit connection" msgstr "Rediger Forbindelse" #: plinth/modules/networks/templates/connection_show.html:43 -#: plinth/templates/base.html:119 +#: plinth/templates/base.html:123 msgid "Edit" msgstr "Rediger" @@ -1560,10 +1838,16 @@ msgid "Firewall zone" msgstr "Firewall-zone" #: plinth/modules/networks/templates/connection_show.html:280 +#, fuzzy +#| msgid "" +#| "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." msgid "" -"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." +"This interface should be connected to a 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." msgstr "" "Dette netværksinterface er beregnet til at forbinde til et lokalt netværk " "eller maskine. Forbinder du det til et offentligt netværk, vil tjenester som " @@ -1571,20 +1855,31 @@ msgstr "" "Dette er en sikkerhedsrisiko." #: plinth/modules/networks/templates/connection_show.html:300 +#, fuzzy +#| msgid "" +#| "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." msgid "" -"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." +"This interface should receive your Internet connection. If you connect it to " +"a local network/machine, many services meant to available only internally " +"will not be available." msgstr "" "Dette netværksinterface er beregnet til at modtage din internetforbindelse. " "Forbinder du det til et lokalt netværk eller maskine, vil tjenester som er " "beregnet til at være eksternt tilgængelige ikke være det." #: plinth/modules/networks/templates/connection_show.html:319 -msgid "" -"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 " +#, fuzzy, python-format +#| msgid "" +#| "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." +msgid "" +"This interface is not maintained by %(box_name)s. Its security status is " +"unknown to %(box_name)s. Many %(box_name)s services may not be available on " +"this interface. It is recommended that you deactivate or delete this " "connection and re-configure it." msgstr "" "Dette netværksinterface vedligeholdes ikke af FreedomBox. Dets " @@ -1677,10 +1972,17 @@ msgid "Enable OpenVPN server" msgstr "Aktiver OpenVPN-server" #: plinth/modules/openvpn/templates/openvpn.html:38 -#, python-format +#, fuzzy, python-format +#| msgid "" +#| "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 %(box_name)s in order to join " +#| "your home network and access private/internal services provided by " +#| "%(box_name)s. You can also access the rest of the Internet via " +#| "%(box_name)s for added security and anonymity." msgid "" "Virtual Private Network (VPN) is a technique for securely connecting two " -"machines in order to access resources of a private network. While you are " +"devices in order to access resources of a private network. While you are " "away from home, you can connect to your %(box_name)s in order to join your " "home network and access private/internal services provided by %(box_name)s. " "You can also access the rest of the Internet via %(box_name)s for added " @@ -1698,12 +2000,19 @@ msgid "Profile" msgstr "Profil" #: plinth/modules/openvpn/templates/openvpn.html:54 -#, python-format +#, fuzzy, python-format +#| msgid "" +#| "To connect to %(box_name)s'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 documentation on recommended clients and instructions on how to " +#| "configure them." msgid "" "To connect to %(box_name)s'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 documentation on recommended clients and instructions on how to " "configure them." msgstr "" @@ -2219,7 +2528,6 @@ msgid "Quassel IRC Client" msgstr "Quassel IRC-klient" #: plinth/modules/quassel/forms.py:29 -#| msgid "Enable Tor Hidden Service" msgid "Enable Quassel core service" msgstr "Aktiver Quassel grund-tjeneste" @@ -2233,9 +2541,9 @@ msgid "" "one or more Quassel clients from a desktop or a mobile can be used to " "connect and disconnect from it." msgstr "" -"Quassel er en IRC-applikation som er opdelt i to; en \"kerne\" og en \"" -"klient\". Dette gør det muligt for kerne-delen at forblive tilsluttet til " -"IRC-servere og fortsætte med at modtage beskeder, selv når klienten afbryder " +"Quassel er en IRC-applikation som er opdelt i to; en \"kerne\" og en \"klient" +"\". Dette gør det muligt for kerne-delen at forblive tilsluttet til IRC-" +"servere og fortsætte med at modtage beskeder, selv når klienten afbryder " "forbindelsen. %(box_name)s kan køre Quassel kerne-tjenesten og holde dig " "kontinuerligt online, og du vil kunne bruge en eller flere Quassel-klienter " "fra en computer eller en mobil til at forbinde til den." @@ -2248,20 +2556,76 @@ msgid "" "\">mobile devices are available." msgstr "" "Du kan forbinde til din Quassel kerne-tjeneste på standardporten 4242. " -"Klienter til at forbinde fra din computer og mobile " -"enhed er tilgængelige." +"Klienter til at forbinde fra din computer og mobile enhed er tilgængelige." #: plinth/modules/quassel/templates/quassel.html:55 -#| msgid "Mumble server is running" msgid "Quassel core service is running" msgstr "Quassel kerne-tjeneste er aktiv" #: plinth/modules/quassel/templates/quassel.html:58 -#| msgid "Mumble server is not running" msgid "Quassel core service is not running" msgstr "Quassel kerne-tjeneste er ikke aktiv" +#: plinth/modules/repro/__init__.py:36 +#: plinth/modules/repro/templates/repro.html:26 +#: plinth/modules/repro/views.py:55 +#, fuzzy +#| msgid "Server port" +msgid "SIP Server (repro)" +msgstr "Serverport" + +#: plinth/modules/repro/__init__.py:41 +#, fuzzy +#| msgid "Second DNS Server" +msgid "repro SIP Server" +msgstr "Sekundær DNS-server" + +#: plinth/modules/repro/forms.py:29 +#, fuzzy +#| msgid "Enable Quassel core service" +msgid "Enable repro service" +msgstr "Aktiver Quassel grund-tjeneste" + +#: plinth/modules/repro/templates/repro.html:29 +msgid "" +"repro provides various SIP services that a SIP softphone can utilize to " +"provide audio and video calls as well as presence and instant messaging. " +"repro provides a server and SIP user accounts that clients can use to let " +"their presence known. It also acts as a proxy to federate SIP " +"communications to other servers on the Internet similar to email." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:39 +msgid "" +"To make SIP calls, a client application is needed. Available clients include " +"Jitsi (for computers) and CSipSimple (for Android phones)." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:48 +msgid "" +"Note: Before using repro, domains and users will need to " +"be configured using the web-based " +"configuration panel. Users in the admin group will be able to " +"log in to the repro configuration panel. After setting the domain, it is " +"required to restart the repro service. Disable the service and re-enable it." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:63 +#, fuzzy +#| msgid "Quassel core service is running" +msgid "repro service is running" +msgstr "Quassel kerne-tjeneste er aktiv" + +#: plinth/modules/repro/templates/repro.html:66 +#, fuzzy +#| msgid "Quassel core service is not running" +msgid "repro service is not running" +msgstr "Quassel kerne-tjeneste er ikke aktiv" + #: plinth/modules/restore/__init__.py:36 #: plinth/modules/restore/templates/restore_index.html:26 #: plinth/modules/restore/views.py:46 @@ -2277,13 +2641,19 @@ msgid "Enable reStore" msgstr "Aktiver reStore" #: plinth/modules/restore/templates/restore_index.html:29 -#, python-format +#, fuzzy, python-format +#| msgid "" +#| "reStore is a server for unhosted web " +#| "applications. The idea is to uncouple web applications from data. No " +#| "matter where a web application is served from, the data can be stored on " +#| "an unhosted storage server of user's choice. With reStore, your " +#| "%(cfg.box_name)s becomes your unhosted storage server." msgid "" "reStore is a server for unhosted web " "applications. The idea is to uncouple web applications from data. No " "matter where a web application is served from, the data can be stored on an " -"unhosted storage server of user's choice. With reStore, your " -"%(cfg.box_name)s becomes your unhosted storage server." +"unhosted storage server of user's choice. With reStore, your %(box_name)s " +"becomes your unhosted storage server." msgstr "" "reStore er en server til brug for ikke-hostede web-applilkationer som " "anvender standarden kaldet unhosted.org. " @@ -2387,7 +2757,7 @@ msgstr "System" #: plinth/modules/system/system.py:33 #: plinth/modules/system/templates/system.html:25 -#: plinth/templates/base.html:105 +#: plinth/templates/base.html:109 msgid "System Configuration" msgstr "Systemkonfiguration" @@ -2404,33 +2774,81 @@ msgstr "" "Disse muligheder påvirker %(box_name)s på det meste grundlæggende niveau, så " "vær forsigtig!" -#: plinth/modules/tor/__init__.py:50 +#: plinth/modules/tor/__init__.py:48 plinth/modules/tor/templates/tor.html:35 +msgid "Anonymity Network (Tor)" +msgstr "Anonymiseringstjeneste (Tor)" + +#: plinth/modules/tor/__init__.py:53 +#, fuzzy +#| msgid "Anonymity Network (Tor)" +msgid "Tor Anonymity Network" +msgstr "Anonymiseringstjeneste (Tor)" + +#: plinth/modules/tor/__init__.py:58 +msgid "Tor Bridge Relay" +msgstr "" + +#: plinth/modules/tor/__init__.py:76 plinth/modules/tor/views.py:144 +msgid "Tor Hidden Service" +msgstr "Tor Skjult Tjeneste" + +#: plinth/modules/tor/__init__.py:222 msgid "Tor relay port available" msgstr "Tor videresendelsesport tilgængelig" -#: plinth/modules/tor/__init__.py:58 +#: plinth/modules/tor/__init__.py:230 msgid "Obfs3 transport registered" msgstr "Obfs3 transport registreret" -#: plinth/modules/tor/__init__.py:64 +#: plinth/modules/tor/__init__.py:236 msgid "Obfs4 transport registered" msgstr "Obfs4 transport registreret" -#: plinth/modules/tor/__init__.py:101 +#: plinth/modules/tor/__init__.py:273 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "Tilgå URL {url} ved brug af tcp{kind} via Tor" -#: plinth/modules/tor/__init__.py:112 +#: plinth/modules/tor/__init__.py:284 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "Bekræft brug af Tor på {url} ved brug af tcp{kind}" -#: plinth/modules/tor/templates/tor.html:26 plinth/modules/tor/tor.py:66 -msgid "Anonymity Network (Tor)" -msgstr "Anonymiseringstjeneste (Tor)" +#: plinth/modules/tor/forms.py:32 +msgid "Enable Tor" +msgstr "Aktiver Tor" + +#: plinth/modules/tor/forms.py:35 +msgid "Enable Tor Hidden Service" +msgstr "Aktiver Tor Skjult Tjeneste" -#: plinth/modules/tor/templates/tor.html:29 +#: plinth/modules/tor/forms.py:38 +#, fuzzy, python-brace-format +#| msgid "" +#| "A hidden service will allow FreedomBox to provide selected services (such " +#| "as ownCloud or Chat) without revealing its location." +msgid "" +"A hidden service will allow {box_name} to provide selected services (such as " +"ownCloud or chat) without revealing its location." +msgstr "" +"En skjult tjeneste tillader FreedomBox at levere udvalgte tjenester (såsom " +"ownCloud og Chat) uden at afsløre sin lokation." + +#: plinth/modules/tor/forms.py:42 +msgid "Download software packages over Tor" +msgstr "Hent softwarepakker over Tor" + +#: plinth/modules/tor/forms.py:44 +msgid "" +"When enabled, software will be downloaded over the Tor network for " +"installations and upgrades. This adds a degree of privacy and security " +"during software downloads." +msgstr "" +"Når aktiveret, vil softwareinstallationer og opdateringer blive hentet over " +"Tor-netværket. Dette giver en vis grad af privatlivsbeskyttelse og sikkerhed " +"under hentningen." + +#: plinth/modules/tor/templates/tor.html:38 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -2444,28 +2862,34 @@ msgstr "" "du bruger Tor-browseren." -#: plinth/modules/tor/templates/tor.html:44 +#: plinth/modules/tor/templates/tor.html:54 +#, fuzzy +#| msgid "Configuration updated" +msgid "Tor configuration is being updated" +msgstr "Konfiguration opdateret" + +#: plinth/modules/tor/templates/tor.html:62 msgid "Tor is running" msgstr "Tor er aktiv" -#: plinth/modules/tor/templates/tor.html:47 +#: plinth/modules/tor/templates/tor.html:65 msgid "Tor is not running" msgstr "Tor er ikke aktiv" -#: plinth/modules/tor/templates/tor.html:59 +#: plinth/modules/tor/templates/tor.html:77 msgid "Hidden Service" msgstr "Skjult Tjeneste" -#: plinth/modules/tor/templates/tor.html:60 -#: plinth/modules/tor/templates/tor.html:102 +#: plinth/modules/tor/templates/tor.html:78 +#: plinth/modules/tor/templates/tor.html:120 msgid "Port" msgstr "Port" -#: plinth/modules/tor/templates/tor.html:85 +#: plinth/modules/tor/templates/tor.html:103 msgid "Bridge" msgstr "Bro" -#: plinth/modules/tor/templates/tor.html:88 +#: plinth/modules/tor/templates/tor.html:106 #, python-format msgid "" "Your %(box_name)s is configured as a Tor bridge with obfsproxy, so it can " @@ -2478,89 +2902,41 @@ msgstr "" "router eller firewall, bør du sikre at de følgende porte er åbne, eller " "viderestillede, hvis nødvendigt:" -#: plinth/modules/tor/templates/tor.html:101 +#: plinth/modules/tor/templates/tor.html:119 msgid "Service" msgstr "Tjeneste" -#: plinth/modules/tor/templates/tor.html:117 +#: plinth/modules/tor/templates/tor.html:135 msgid "SOCKS" msgstr "SOCKS" -#: plinth/modules/tor/templates/tor.html:120 +#: plinth/modules/tor/templates/tor.html:138 #, python-format msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "En Tor SOCKS-port er tilgængelig på din %(box_name)s TCP-port 9050." -#: plinth/modules/tor/tor.py:46 -msgid "Enable Tor" -msgstr "Aktiver Tor" - -#: plinth/modules/tor/tor.py:49 -msgid "Enable Tor Hidden Service" -msgstr "Aktiver Tor Skjult Tjeneste" - -#: plinth/modules/tor/tor.py:51 -msgid "" -"A hidden service will allow FreedomBox to provide selected services (such as " -"ownCloud or Chat) without revealing its location." -msgstr "" -"En skjult tjeneste tillader FreedomBox at levere udvalgte tjenester (såsom " -"ownCloud og Chat) uden at afsløre sin lokation." - -#: plinth/modules/tor/tor.py:55 -msgid "Download software packages over Tor" -msgstr "Hent softwarepakker over Tor" - -#: plinth/modules/tor/tor.py:57 -msgid "" -"When enabled, software will be downloaded over the Tor network for " -"installations and upgrades. This adds a degree of privacy and security " -"during software downloads." -msgstr "" -"Når aktiveret, vil softwareinstallationer og opdateringer blive hentet over " -"Tor-netværket. Dette giver en vis grad af privatlivsbeskyttelse og sikkerhed " -"under hentningen." - -#: plinth/modules/tor/tor.py:85 plinth/modules/tor/tor.py:285 -msgid "Tor Hidden Service" -msgstr "Tor Skjult Tjeneste" - -#: plinth/modules/tor/tor.py:115 +#: plinth/modules/tor/views.py:68 msgid "Tor Control Panel" msgstr "Tor Kontrolpanel" -#: plinth/modules/tor/tor.py:240 +#: plinth/modules/tor/views.py:79 #, python-brace-format msgid "Action error: {0} [{1}] [{2}]" msgstr "Fejl under handling: {0} [{1}] [{2}]" -#: plinth/modules/tor/tor.py:256 -msgid "Tor enabled" -msgstr "Tor aktiveret" - -#: plinth/modules/tor/tor.py:259 -msgid "Tor disabled" -msgstr "Tor deaktiveret" - -#: plinth/modules/tor/tor.py:264 -msgid "Tor hidden service enabled" -msgstr "Anonymiseringstjenesten Tor aktiveret" - -#: plinth/modules/tor/tor.py:267 -msgid "Tor hidden service disabled" -msgstr "Anonymiseringstjenesten Tor deaktiveret" - -#: plinth/modules/tor/tor.py:292 -msgid "Enabled package download over Tor" -msgstr "Pakke-hentning over Tor aktiveret" +#: plinth/modules/tor/views.py:148 +#, fuzzy +#| msgid "Configuration updated" +msgid "Configuration updated." +msgstr "Konfiguration opdateret" -#: plinth/modules/tor/tor.py:295 -msgid "Disabled package download over Tor" -msgstr "Pakke-hentning over Tor deaktiveret" +#: plinth/modules/tor/views.py:150 +msgid "An error occurred during configuration." +msgstr "" #: plinth/modules/transmission/__init__.py:38 #: plinth/modules/transmission/templates/transmission.html:26 -#: plinth/modules/transmission/views.py:63 +#: plinth/modules/transmission/views.py:67 msgid "BitTorrent (Transmission)" msgstr "BitTorrent (Transmission)" @@ -2577,18 +2953,14 @@ msgid "Download directory" msgstr "Download-mappe" #: plinth/modules/transmission/forms.py:34 -#| msgid "" -#| "Directory where downloads are saved. If you change the default " -#| "directory, ensure that the new directory exists and is writable by " -#| "\"debian-tramission\" user." msgid "" "Directory where downloads are saved. If you change the default directory, " "ensure that the new directory exists and is writable by \"debian-transmission" "\" user." msgstr "" "Mappe hvori downloadede filer gemmes. Hvis du ændrer standardindstillingen, " -"skal du sikre dig at den nye mappe eksisterer og er skrivbar af brugeren \"" -"debian-transmission\"." +"skal du sikre dig at den nye mappe eksisterer og er skrivbar af brugeren " +"\"debian-transmission\"." #: plinth/modules/transmission/forms.py:40 msgid "Username to login to the web interface." @@ -2641,74 +3013,73 @@ msgstr "" "Når aktiveret, vil programmet unattended-upgrades blive kørt en gang " "dagligt. Dette vil forsøge at opdatere alle tilgængelige pakker." -#: plinth/modules/upgrades/templates/upgrades.html:40 -msgid "There was an error while upgrading." -msgstr "Fejl under opdatering." - -#: plinth/modules/upgrades/templates/upgrades.html:43 -#: plinth/modules/upgrades/templates/upgrades.html:59 -msgid "Output from unattended-upgrades:" -msgstr "Uddata fra unattended-upgrades:" - -#: plinth/modules/upgrades/templates/upgrades.html:50 -msgid "The operating system is up to date now.  " -msgstr "Operativsystemet er nu opdateret.  " - -#: plinth/modules/upgrades/templates/upgrades.html:53 -msgid "Show Details" -msgstr "Vis Detaljer" +#: plinth/modules/upgrades/templates/upgrades.html:37 +msgid "" +"Upgrades install the latest software and security updates. When automatic " +"upgrades are enabled, upgrades are automatically run every night. You don't " +"normally need to start the upgrade process." +msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:69 +#: plinth/modules/upgrades/templates/upgrades.html:45 msgid "" -"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." +"Depending on the number of packages to install, this may take a long time to " +"complete. While upgrades are in progress, you will not be able to install " +"other packages. During the upgrade, this web interface may be temporarily " +"unavailable and show an error. Refresh the page to continue." msgstr "" -"Dette vil køre programmet unattended-upgrades som forsøger at opdatere dit " -"system med de nyeste Debian-pakker. Dette kan tage nogle minutter at " -"gennemføre." -#: plinth/modules/upgrades/templates/upgrades.html:80 +#: plinth/modules/upgrades/templates/upgrades.html:58 msgid "Upgrade now »" msgstr "Opdater nu »" -#: plinth/modules/upgrades/templates/upgrades.html:87 -msgid "System is being upgraded." -msgstr "Systemet opdateres." +#: plinth/modules/upgrades/templates/upgrades.html:65 +#, fuzzy +#| msgid "ejabberd is running" +msgid "A package manager is running." +msgstr "ejabberd er aktiv" + +#: plinth/modules/upgrades/templates/upgrades.html:70 +msgid "Recent log from upgrades:" +msgstr "" -#: plinth/modules/upgrades/views.py:35 plinth/modules/upgrades/views.py:64 +#: plinth/modules/upgrades/views.py:36 plinth/modules/upgrades/views.py:66 msgid "Automatic Upgrades" msgstr "Automatisk Opdatering" -#: plinth/modules/upgrades/views.py:37 +#: plinth/modules/upgrades/views.py:38 msgid "Upgrade Packages" msgstr "Opdater Pakker" -#: plinth/modules/upgrades/views.py:75 +#: plinth/modules/upgrades/views.py:96 +#, fuzzy +#| msgid "Upgrade completed." +msgid "Upgrade process started." +msgstr "Opdatering færdig." + +#: plinth/modules/upgrades/views.py:99 +#, fuzzy +#| msgid "Upgrade failed." +msgid "Starting upgrade failed." +msgstr "Opdatering fejlede." + +#: plinth/modules/upgrades/views.py:102 msgid "Package Upgrades" msgstr "Pakkeopdateringer" -#: plinth/modules/upgrades/views.py:116 +#: plinth/modules/upgrades/views.py:131 #, python-brace-format msgid "Error when configuring unattended-upgrades: {error}" msgstr "" "Kunne ikke konfigurere automatisk opdatering (unattended-upgrades): {error}" -#: plinth/modules/upgrades/views.py:121 +#: plinth/modules/upgrades/views.py:136 msgid "Automatic upgrades enabled" msgstr "Automatisk opdatering aktiveret" -#: plinth/modules/upgrades/views.py:123 +#: plinth/modules/upgrades/views.py:138 msgid "Automatic upgrades disabled" msgstr "Automatisk opdatering deaktiveret" -#: plinth/modules/upgrades/views.py:142 -msgid "Upgrade completed." -msgstr "Opdatering færdig." - -#: plinth/modules/upgrades/views.py:144 -msgid "Upgrade failed." -msgstr "Opdatering fejlede." - #: plinth/modules/users/__init__.py:36 msgid "Users and Groups" msgstr "Brugere og Grupper" @@ -2750,19 +3121,30 @@ msgstr "" msgid "Failed to add new user to {group} group." msgstr "Kunne ikke tilføje ny bruger til gruppen {group}." -#: plinth/modules/users/forms.py:126 +#: plinth/modules/users/forms.py:92 +msgid "SSH Keys" +msgstr "" + +#: plinth/modules/users/forms.py:96 +msgid "" +"Setting an SSH public key will allow this user to securely log in to the " +"system without using a password. You may enter multiple keys, one on each " +"line. Blank lines and lines starting with # will be ignored." +msgstr "" + +#: plinth/modules/users/forms.py:136 msgid "Renaming LDAP user failed." msgstr "Kunne ikke omdøbe LDAP-bruger." -#: plinth/modules/users/forms.py:138 +#: plinth/modules/users/forms.py:148 msgid "Failed to remove user from group." msgstr "Kunne ikke fjerne bruger fra gruppe." -#: plinth/modules/users/forms.py:149 +#: plinth/modules/users/forms.py:159 msgid "Failed to add user to group." msgstr "Kunne ikke tilføje bruger til gruppe." -#: plinth/modules/users/forms.py:174 +#: plinth/modules/users/forms.py:188 msgid "Changing LDAP user password failed." msgstr "Kunne ikke ændre LDAP-kodeord." @@ -2781,7 +3163,7 @@ msgid "Create User" msgstr "Opret Bruger" #: plinth/modules/users/templates/users_delete.html:26 -#: plinth/modules/users/views.py:103 +#: plinth/modules/users/views.py:110 msgid "Delete User" msgstr "Slet Bruger" @@ -2836,20 +3218,20 @@ msgstr "Bruger %(username)s opdateret." msgid "Edit User" msgstr "Rediger Bruger" -#: plinth/modules/users/views.py:113 +#: plinth/modules/users/views.py:120 #, python-brace-format msgid "User {user} deleted." msgstr "Brugeren {user} slettet." -#: plinth/modules/users/views.py:120 +#: plinth/modules/users/views.py:127 msgid "Deleting LDAP user failed." msgstr "Kunne ikke slette LDAP-bruger." -#: plinth/modules/users/views.py:129 +#: plinth/modules/users/views.py:136 msgid "Change Password" msgstr "Ændr kodeord" -#: plinth/modules/users/views.py:130 +#: plinth/modules/users/views.py:137 msgid "Password changed successfully." msgstr "Kodeord blev ændret." @@ -2932,8 +3314,10 @@ msgstr "Sikker Webserver (via SSL)" msgid "Secure Shell (SSH) Server" msgstr "Secure Shell (SSH) Server" -#: plinth/service.py:78 -msgid "FreedomBox Web Interface (Plinth)" +#: plinth/service.py:79 +#, fuzzy, python-brace-format +#| msgid "FreedomBox Web Interface (Plinth)" +msgid "{box_name} Web Interface (Plinth)" msgstr "FreedomBox Web-brugerflade (Plinth)" #: plinth/templates/404.html:25 @@ -2970,27 +3354,25 @@ msgstr "" "issues\">fejlhåndteringsvørktøjet så vi kan rette den." #: plinth/templates/base.html:49 -msgid "Plinth administrative interface for the FreedomBox" +#, fuzzy, python-format +#| msgid "Plinth administrative interface for the FreedomBox" +msgid "Plinth administrative interface for the %(box_name)s" msgstr "Plinth administrationsværktøj til FreedomBox" -#: plinth/templates/base.html:52 plinth/templates/base.html.py:88 -msgid "FreedomBox" -msgstr "FreedomBox" - -#: plinth/templates/base.html:81 +#: plinth/templates/base.html:83 msgid "Toggle navigation" msgstr "Åbn/luk navigation" -#: plinth/templates/base.html:121 plinth/templates/base.html.py:122 +#: plinth/templates/base.html:125 plinth/templates/base.html.py:126 msgid "Change password" msgstr "Ændr kodeord" -#: plinth/templates/base.html:125 plinth/templates/base.html.py:126 -#: plinth/templates/base.html:139 plinth/templates/base.html.py:141 +#: plinth/templates/base.html:129 plinth/templates/base.html.py:130 +#: plinth/templates/base.html:143 plinth/templates/base.html.py:145 msgid "Log out" msgstr "Log ud" -#: plinth/templates/base.html:131 plinth/templates/base.html.py:133 +#: plinth/templates/base.html:135 plinth/templates/base.html.py:137 msgid "Log in" msgstr "Log ind" @@ -3032,6 +3414,88 @@ msgstr "Installerer %(package_names)s: %(status)s" msgid "%(percentage)s%% complete" msgstr "%(percentage)s%% færdig" +#~ msgid "show password" +#~ msgstr "vis kodeord" + +#~ msgid "The following is the current status:" +#~ msgstr "Den nuværende status er som følger:" + +#~ msgid "Congratulations! Your FreedomBox is up and running!" +#~ msgstr "Tillykke! Din FreedomBox er nu kørende!" + +#~ msgid "" +#~ "Please provide the following basic information to complete the setup " +#~ "process." +#~ msgstr "" +#~ "Indtast venligst følgende grundoplysninger for at færdiggøre " +#~ "konfigurationen." + +#~ msgid "Next" +#~ msgstr "Næste" + +#~ msgid "FreedomBox Manual" +#~ msgstr "FreedomBox Brugervejledning" + +#~ msgid "" +#~ "Many FreedomBox contributors and users are also available on the " +#~ "#freedombox channel of the irc.oftc.net IRC network." +#~ msgstr "" +#~ "Mange bidragsydere og brugere af FreedomBox er også at finde i kanalen " +#~ "#freedombox på irc.oftc.net IRC-netværket." + +#~ msgid "Create Wiki/Blog" +#~ msgstr "Opret Wiki/Blog" + +#~ msgid "" +#~ "Select Automatic (DHCP) if you are connecting to an existing wireless " +#~ "network. Shared mode is useful when running an Access Point." +#~ msgstr "" +#~ "Vælg \"Automatisk\" (DHCP) hvis du forbinder til et eksisterende trådløst " +#~ "netværk. \"Delt\"-metoden er nyttig hvis enheden skal fungere som " +#~ "accesspunkt." + +#~ msgid "Tor enabled" +#~ msgstr "Tor aktiveret" + +#~ msgid "Tor disabled" +#~ msgstr "Tor deaktiveret" + +#~ msgid "Tor hidden service enabled" +#~ msgstr "Anonymiseringstjenesten Tor aktiveret" + +#~ msgid "Tor hidden service disabled" +#~ msgstr "Anonymiseringstjenesten Tor deaktiveret" + +#~ msgid "Enabled package download over Tor" +#~ msgstr "Pakke-hentning over Tor aktiveret" + +#~ msgid "Disabled package download over Tor" +#~ msgstr "Pakke-hentning over Tor deaktiveret" + +#~ msgid "There was an error while upgrading." +#~ msgstr "Fejl under opdatering." + +#~ msgid "Output from unattended-upgrades:" +#~ msgstr "Uddata fra unattended-upgrades:" + +#~ msgid "The operating system is up to date now.  " +#~ msgstr "Operativsystemet er nu opdateret.  " + +#~ msgid "Show Details" +#~ msgstr "Vis Detaljer" + +#~ msgid "" +#~ "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." +#~ msgstr "" +#~ "Dette vil køre programmet unattended-upgrades som forsøger at opdatere " +#~ "dit system med de nyeste Debian-pakker. Dette kan tage nogle minutter at " +#~ "gennemføre." + +#~ msgid "System is being upgraded." +#~ msgstr "Systemet opdateres." + #~ msgid "" #~ "You can install and run various services and applications on your " #~ "%(box_name)s." diff --git a/plinth/locale/de/LC_MESSAGES/django.po b/plinth/locale/de/LC_MESSAGES/django.po index 09975e4e9..da9c30971 100644 --- a/plinth/locale/de/LC_MESSAGES/django.po +++ b/plinth/locale/de/LC_MESSAGES/django.po @@ -9,11 +9,11 @@ msgid "" msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-12-20 13:58+0530\n" +"POT-Creation-Date: 2016-01-31 22:19+0530\n" "PO-Revision-Date: 2015-12-20 17:46+0000\n" "Last-Translator: Dietmar \n" -"Language-Team: German " -"\n" +"Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -51,11 +51,15 @@ msgstr "Verbinden zu {host}:{port}" msgid "Cannot connect to {host}:{port}" msgstr "Verbindung zu {host}:{port} fehlgeschlagen" +#: plinth/context_processors.py:36 +msgid "FreedomBox" +msgstr "FreedomBox" + #: plinth/modules/apps/apps.py:26 msgid "Apps" msgstr "Apps" -#: plinth/modules/apps/apps.py:32 plinth/templates/base.html.py:90 +#: plinth/modules/apps/apps.py:32 plinth/templates/base.html.py:93 msgid "Applications" msgstr "Anwendungen" @@ -98,10 +102,18 @@ msgid "Enable service discovery" msgstr "Dienste-Erkennung einschalten" #: plinth/modules/avahi/templates/avahi.html:29 -msgid "" -"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 " +#, fuzzy, python-format +#| msgid "" +#| "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." +msgid "" +"Service discovery allows other devices on the network to discover your " +"%(box_name)s and services running on it. It also allows %(box_name)s to " +"discover other devices 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." @@ -115,14 +127,15 @@ msgstr "" #: plinth/modules/avahi/templates/avahi.html:40 #: plinth/modules/datetime/templates/datetime.html:35 #: plinth/modules/deluge/templates/deluge.html:39 -#: plinth/modules/dynamicdns/dynamicdns.py:38 +#: plinth/modules/dynamicdns/dynamicdns.py:39 #: plinth/modules/firewall/templates/firewall.html:57 #: plinth/modules/mumble/templates/mumble.html:44 #: plinth/modules/networks/templates/connection_show.html:261 #: plinth/modules/openvpn/templates/openvpn.html:81 #: plinth/modules/privoxy/templates/privoxy.html:48 #: plinth/modules/quassel/templates/quassel.html:50 -#: plinth/modules/tor/templates/tor.html:39 +#: plinth/modules/repro/templates/repro.html:58 +#: plinth/modules/tor/templates/tor.html:48 #: plinth/modules/transmission/templates/transmission.html:42 #: plinth/modules/xmpp/templates/xmpp.html:58 msgid "Status" @@ -145,9 +158,10 @@ msgstr "Dienste-Erkennung läuft nicht" #: plinth/modules/owncloud/templates/owncloud.html:51 #: plinth/modules/privoxy/templates/privoxy.html:62 #: plinth/modules/quassel/templates/quassel.html:65 +#: plinth/modules/repro/templates/repro.html:72 #: plinth/modules/roundcube/templates/roundcube.html:62 #: plinth/modules/shaarli/templates/shaarli.html:40 -#: plinth/modules/tor/templates/tor.html:74 +#: plinth/modules/tor/templates/tor.html:92 #: plinth/modules/transmission/templates/transmission.html:56 #: plinth/modules/xmpp/templates/xmpp.html:72 msgid "Configuration" @@ -163,10 +177,11 @@ msgstr "Konfiguration" #: plinth/modules/openvpn/templates/openvpn.html:138 #: plinth/modules/privoxy/templates/privoxy.html:70 #: plinth/modules/quassel/templates/quassel.html:73 +#: plinth/modules/repro/templates/repro.html:80 #: plinth/modules/restore/templates/restore_index.html:54 #: plinth/modules/roundcube/templates/roundcube.html:70 #: plinth/modules/shaarli/templates/shaarli.html:48 -#: plinth/modules/tor/templates/tor.html:82 +#: plinth/modules/tor/templates/tor.html:100 #: plinth/modules/transmission/templates/transmission.html:64 #: plinth/modules/upgrades/templates/upgrades_configure.html:34 #: plinth/modules/xmpp/templates/xmpp.html:80 @@ -175,12 +190,13 @@ msgstr "Installation aktualisieren" #: plinth/modules/avahi/views.py:73 plinth/modules/datetime/views.py:85 #: plinth/modules/deluge/views.py:80 -#: plinth/modules/dynamicdns/dynamicdns.py:368 +#: plinth/modules/dynamicdns/dynamicdns.py:371 #: plinth/modules/ikiwiki/views.py:95 plinth/modules/mumble/views.py:80 #: plinth/modules/openvpn/views.py:142 plinth/modules/privoxy/views.py:83 -#: plinth/modules/quassel/views.py:76 plinth/modules/restore/views.py:68 -#: plinth/modules/roundcube/views.py:84 plinth/modules/shaarli/views.py:74 -#: plinth/modules/transmission/views.py:105 plinth/modules/xmpp/views.py:100 +#: plinth/modules/quassel/views.py:76 plinth/modules/repro/views.py:77 +#: plinth/modules/restore/views.py:68 plinth/modules/roundcube/views.py:84 +#: plinth/modules/shaarli/views.py:74 plinth/modules/transmission/views.py:109 +#: plinth/modules/xmpp/views.py:100 msgid "Configuration updated" msgstr "Konfiguration aktualisiert" @@ -188,51 +204,66 @@ msgstr "Konfiguration aktualisiert" #: plinth/modules/deluge/views.py:82 plinth/modules/ikiwiki/views.py:97 #: plinth/modules/mumble/views.py:82 plinth/modules/openvpn/views.py:144 #: plinth/modules/owncloud/owncloud.py:93 plinth/modules/privoxy/views.py:85 -#: plinth/modules/quassel/views.py:78 plinth/modules/restore/views.py:70 -#: plinth/modules/roundcube/views.py:86 plinth/modules/shaarli/views.py:76 -#: plinth/modules/tor/tor.py:250 plinth/modules/transmission/views.py:107 -#: plinth/modules/upgrades/views.py:103 plinth/modules/xmpp/views.py:102 +#: plinth/modules/quassel/views.py:78 plinth/modules/repro/views.py:79 +#: plinth/modules/restore/views.py:70 plinth/modules/roundcube/views.py:86 +#: plinth/modules/shaarli/views.py:76 plinth/modules/tor/views.py:111 +#: plinth/modules/transmission/views.py:111 +#: plinth/modules/upgrades/views.py:118 plinth/modules/xmpp/views.py:102 msgid "Setting unchanged" msgstr "Einstellung unverändert" -#: plinth/modules/config/config.py:83 plinth/modules/config/config.py:120 -#: plinth/modules/dynamicdns/dynamicdns.py:145 +#: plinth/modules/config/config.py:84 plinth/modules/config/config.py:121 +#: plinth/modules/dynamicdns/dynamicdns.py:148 msgid "Invalid domain name" msgstr "Ungültiger Domain Name" -#: plinth/modules/config/config.py:94 +#: plinth/modules/config/config.py:95 msgid "Hostname" msgstr "Hostname" -#: plinth/modules/config/config.py:96 -msgid "" -"Hostname is the local name by which other machines on the local network " -"reach your machine. It must start and end with an alphabet or a digit and " -"have as interior characters only alphabets, digits and hyphens. Total " +#: plinth/modules/config/config.py:97 +#, fuzzy, python-brace-format +#| msgid "" +#| "Hostname is the local name by which other machines on the local network " +#| "reach your machine. It must start and end with an alphabet or a digit " +#| "and have as interior characters only alphabets, digits and hyphens. " +#| "Total length must be 63 characters or less." +msgid "" +"Hostname is the local name by which other devices on the local network can " +"reach your {box_name}. It must start and end with an alphabet or a digit " +"and have as interior characters only alphabets, digits and hyphens. Total " "length must be 63 characters or less." msgstr "" "Ein Hostname ist der lokale Name unter dem andere Geräte im lokalen Netzwerk " "Ihr Gerät erreichen können. Er muss alphanumerisch sein, mit einem " "Buchstaben beginnen und enden und darf nicht länger als 63 Zeichen sein." -#: plinth/modules/config/config.py:104 +#: plinth/modules/config/config.py:105 msgid "Invalid hostname" msgstr "Ungültiger Hostname" -#: plinth/modules/config/config.py:107 plinth/modules/config/config.py:153 +#: plinth/modules/config/config.py:108 plinth/modules/config/config.py:153 #: plinth/modules/config/config.py:265 -#: plinth/modules/dynamicdns/dynamicdns.py:140 +#: plinth/modules/dynamicdns/dynamicdns.py:143 msgid "Domain Name" msgstr "Domain-Name" -#: plinth/modules/config/config.py:109 -msgid "" -"Domain name is the global name by which other machines on the Internet can " -"reach you. It must consist of labels separated by dots. Each label must " -"start and end with an alphabet or a digit and have as interior characters " -"only alphabets, digits and hyphens. Length of each label must be 63 " -"characters or less. Total length of domain name must be 253 characters or " -"less." +#: plinth/modules/config/config.py:110 +#, fuzzy, python-brace-format +#| msgid "" +#| "Domain name is the global name by which other machines on the Internet " +#| "can reach you. It must consist of labels separated by dots. Each label " +#| "must start and end with an alphabet or a digit and have as interior " +#| "characters only alphabets, digits and hyphens. Length of each label must " +#| "be 63 characters or less. Total length of domain name must be 253 " +#| "characters or less." +msgid "" +"Domain name is the global name by which other devices on the Internet can " +"reach your {box_name}. It must consist of labels separated by dots. Each " +"label must start and end with an alphabet or a digit and have as interior " +"characters only alphabets, digits and hyphens. Length of each label must be " +"63 characters or less. Total length of domain name must be 253 characters " +"or less." msgstr "" "Ein Domainname ist der globale Name unter dem andere Geräte im Internet Ihr " "Gerät erreichen können. Er muss aus durch Punkte getrennte Kennungen " @@ -240,16 +271,18 @@ msgstr "" "alphanumerischen Zeichen und Bindestrichen bestehen. Jede Kennung darf " "maximal 63 Zeichen lang sein, die Gesamtlänge des Domainnames 253 Zeichen." -#: plinth/modules/config/config.py:124 +#: plinth/modules/config/config.py:125 msgid "Language" msgstr "Sprache" -#: plinth/modules/config/config.py:126 -msgid "Language for this FreedomBox web administration interface" +#: plinth/modules/config/config.py:127 +#, fuzzy +#| msgid "Language for this FreedomBox web administration interface" +msgid "Language for this web administration interface" msgstr "Sprache für dieses FreedomBox Web-Interface" #: plinth/modules/config/config.py:135 -#: plinth/modules/dynamicdns/dynamicdns.py:36 +#: plinth/modules/dynamicdns/dynamicdns.py:37 #: plinth/modules/ikiwiki/views.py:36 msgid "Configure" msgstr "Konfigurieren" @@ -445,16 +478,16 @@ msgstr "Test" msgid "Result" msgstr "Ergebnis" -#: plinth/modules/dynamicdns/dynamicdns.py:34 plinth/modules/help/help.py:40 +#: plinth/modules/dynamicdns/dynamicdns.py:35 plinth/modules/help/help.py:40 msgid "About" msgstr "Über" -#: plinth/modules/dynamicdns/dynamicdns.py:44 -#: plinth/modules/dynamicdns/dynamicdns.py:53 +#: plinth/modules/dynamicdns/dynamicdns.py:45 +#: plinth/modules/dynamicdns/dynamicdns.py:54 msgid "Dynamic DNS" msgstr "Dynamisches DNS" -#: plinth/modules/dynamicdns/dynamicdns.py:70 +#: plinth/modules/dynamicdns/dynamicdns.py:71 msgid "" "The Variables <User>, <Pass>, <Ip>, <Domain> may be " "used within the URL. For details see the update URL templates of the example " @@ -464,7 +497,7 @@ msgstr "" "in der URL verwendet werden. Beispiele sind in den update URLs der " "vorkonfigurierten Anbieter zu finden." -#: plinth/modules/dynamicdns/dynamicdns.py:74 +#: plinth/modules/dynamicdns/dynamicdns.py:75 msgid "" "Please choose an update protocol according to your provider. If your " "provider does not support the GnudIP protocol or your provider is not listed " @@ -474,27 +507,33 @@ msgstr "" "Anbieter GnuDIP nicht unterstützt oder der Anbieter nicht aufgeführt ist, " "kann die Aktualisierungs-URL Ihres Anbieters angegeben werden." -#: plinth/modules/dynamicdns/dynamicdns.py:79 +#: plinth/modules/dynamicdns/dynamicdns.py:80 +#, fuzzy +#| msgid "" +#| "Please do not enter a URL here (like \"https://example.com/\") but only " +#| "the hostname of the GnuDIP server (like \"example.pcom\")." msgid "" "Please do not enter a URL here (like \"https://example.com/\") but only the " -"hostname of the GnuDIP server (like \"example.pcom\")." +"hostname of the GnuDIP server (like \"example.com\")." msgstr "" "Bitte hier keine URL (wie \"https://example.com/\") eingeben, sondern nur " "den Hostnamen des GnuDIP Servers (wie \"example.com\")." -#: plinth/modules/dynamicdns/dynamicdns.py:83 -msgid "The public domain name you want use to reach your box." +#: plinth/modules/dynamicdns/dynamicdns.py:84 +#, fuzzy, python-brace-format +#| msgid "The public domain name you want use to reach your box." +msgid "The public domain name you want use to reach your {box_name}." msgstr "" "Der öffentliche Domain Name unter welchem die FreedomBox erreichbar sein " "soll." -#: plinth/modules/dynamicdns/dynamicdns.py:85 +#: plinth/modules/dynamicdns/dynamicdns.py:87 msgid "Use this option if your provider uses self signed certificates." msgstr "" "Verwenden Sie diese Option wenn Ihr Anbieter selbst-signierte Zertifikate " "verwendet." -#: plinth/modules/dynamicdns/dynamicdns.py:88 +#: plinth/modules/dynamicdns/dynamicdns.py:90 msgid "" "If this option is selected, your username and password will be used for HTTP " "basic authentication." @@ -503,17 +542,23 @@ msgstr "" "DNS Kontos auch zur HTTP Authentifizierung für die update URL verwendet " "werden." -#: plinth/modules/dynamicdns/dynamicdns.py:91 +#: plinth/modules/dynamicdns/dynamicdns.py:93 msgid "" "Leave this field empty if you want to keep your previous configured password." msgstr "Wird dieses Feld leer gelassen, dann bleibt das Passwort unverändert." -#: plinth/modules/dynamicdns/dynamicdns.py:94 +#: plinth/modules/dynamicdns/dynamicdns.py:96 +#, fuzzy, python-brace-format +#| msgid "" +#| "Optional Value. If your FreedomBox is not connected directly to the " +#| "Internet (i.e. connected to a NAT router) this URL is used to figure out " +#| "the real Internet IP. The URL should simply return the IP wherethe client " +#| "comes from. Example: http://myip.datasystems24.de" msgid "" -"Optional Value. If your FreedomBox is not connected directly to the Internet " +"Optional Value. If your {box_name} is not connected directly to the Internet " "(i.e. connected to a NAT router) this URL is used to figure out the real " -"Internet IP. The URL should simply return the IP wherethe client comes from. " -"Example: http://myip.datasystems24.de" +"Internet IP. The URL should simply return the IP where the client comes from " +"(example: http://myip.datasystems24.de)." msgstr "" "Optionaler Wert. Wenn die FreedomBox nicht direkt mit dem Internet verbunden " "ist (zum Beispiel weil die Box an einen Router angeschlossen ist welcher die " @@ -521,7 +566,7 @@ msgstr "" "in Erfahrung zu bringen. Die URL sollte nichts weiter als die IP Adresse " "liefern. Beispiel: http://myip.datasystems24.de" -#: plinth/modules/dynamicdns/dynamicdns.py:101 +#: plinth/modules/dynamicdns/dynamicdns.py:104 msgid "" "You should have been requested to select a username when you created the " "account." @@ -529,85 +574,98 @@ msgstr "" "Beim Erstellen des Nutzer Kontos sollte der Anbieter zur Vergabe eines " "Passwortes aufgefordert haben." -#: plinth/modules/dynamicdns/dynamicdns.py:112 +#: plinth/modules/dynamicdns/dynamicdns.py:115 msgid "Enable Dynamic DNS" msgstr "Dynamisches DNS einschalten" -#: plinth/modules/dynamicdns/dynamicdns.py:115 +#: plinth/modules/dynamicdns/dynamicdns.py:118 msgid "Service type" msgstr "Dienst Typ" -#: plinth/modules/dynamicdns/dynamicdns.py:120 +#: plinth/modules/dynamicdns/dynamicdns.py:123 msgid "GnudIP Server Address" msgstr "GnuDIP Server Adresse" -#: plinth/modules/dynamicdns/dynamicdns.py:125 +#: plinth/modules/dynamicdns/dynamicdns.py:128 msgid "Invalid server name" msgstr "Ungültiger Server Name" -#: plinth/modules/dynamicdns/dynamicdns.py:128 +#: plinth/modules/dynamicdns/dynamicdns.py:131 msgid "Update URL" msgstr "Update URL" -#: plinth/modules/dynamicdns/dynamicdns.py:132 -msgid "accept all SSL certificates" +#: plinth/modules/dynamicdns/dynamicdns.py:135 +#, fuzzy +#| msgid "accept all SSL certificates" +msgid "Accept all SSL certificates" msgstr "alle Zertifikate akzeptieren" -#: plinth/modules/dynamicdns/dynamicdns.py:136 -msgid "use HTTP basic authentication" +#: plinth/modules/dynamicdns/dynamicdns.py:139 +#, fuzzy +#| msgid "use HTTP basic authentication" +msgid "Use HTTP basic authentication" msgstr "HTTP basic authentication verwenden" -#: plinth/modules/dynamicdns/dynamicdns.py:148 -#: plinth/modules/networks/forms.py:118 plinth/modules/transmission/forms.py:39 +#: plinth/modules/dynamicdns/dynamicdns.py:151 +#: plinth/modules/networks/forms.py:146 plinth/modules/transmission/forms.py:39 msgid "Username" msgstr "Benutzername" -#: plinth/modules/dynamicdns/dynamicdns.py:151 -#: plinth/modules/networks/forms.py:119 plinth/modules/transmission/forms.py:43 +#: plinth/modules/dynamicdns/dynamicdns.py:154 +#: plinth/modules/networks/forms.py:147 plinth/modules/transmission/forms.py:43 msgid "Password" msgstr "Passwort" -#: plinth/modules/dynamicdns/dynamicdns.py:154 -msgid "show password" -msgstr "Passwort anzeigen" +#: plinth/modules/dynamicdns/dynamicdns.py:157 +#: plinth/modules/networks/forms.py:149 +msgid "Show password" +msgstr "Zeige Passwort" -#: plinth/modules/dynamicdns/dynamicdns.py:158 +#: plinth/modules/dynamicdns/dynamicdns.py:161 msgid "IP check URL" msgstr "URL zur Erkennung der IP-Adresse" -#: plinth/modules/dynamicdns/dynamicdns.py:184 +#: plinth/modules/dynamicdns/dynamicdns.py:187 msgid "Please provide update URL or a GnuDIP Server" msgstr "Bitte eine update URL oder einen GnuDIP Server angeben" -#: plinth/modules/dynamicdns/dynamicdns.py:187 +#: plinth/modules/dynamicdns/dynamicdns.py:190 msgid "Please provide GnuDIP username" msgstr "Bitte GnuDIP Nutzernamen angeben" -#: plinth/modules/dynamicdns/dynamicdns.py:190 +#: plinth/modules/dynamicdns/dynamicdns.py:193 msgid "Please provide GnuDIP domain" msgstr "Bitte GnuDIP Domain angeben" -#: plinth/modules/dynamicdns/dynamicdns.py:195 +#: plinth/modules/dynamicdns/dynamicdns.py:198 msgid "Please provide a password" msgstr "Bitte ein Passwort angeben" -#: plinth/modules/dynamicdns/dynamicdns.py:214 +#: plinth/modules/dynamicdns/dynamicdns.py:217 msgid "Configure Dynamic DNS" msgstr "Dynamisches DNS konfigurieren" -#: plinth/modules/dynamicdns/dynamicdns.py:236 +#: plinth/modules/dynamicdns/dynamicdns.py:239 msgid "Status of Dynamic DNS" msgstr "Status des Dynamischen DNS" #: plinth/modules/dynamicdns/templates/dynamicdns.html:25 -msgid "DynamicDNS client" +#, fuzzy +#| msgid "DynamicDNS client" +msgid "Dynamic DNS Client" msgstr "Dynamischer DNS Client" #: plinth/modules/dynamicdns/templates/dynamicdns.html:28 +#, fuzzy, python-format +#| msgid "" +#| "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)." msgid "" "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)." +"may find the services which are provided by %(box_name)s, such as ownCloud." msgstr "" "Wenn Ihr Internetanbieter die öffentliche IP Adresse zyklisch erneuert (zum " "Beispiel alle 24 Stunden) dann ist es für andere Internetnutzer nicht " @@ -616,13 +674,22 @@ msgstr "" "werden." #: plinth/modules/dynamicdns/templates/dynamicdns.html:37 +#, fuzzy +#| msgid "" +#| "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 gnudip " +#| "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." msgid "" "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 gnudip 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." +"Internet asks for your DNS name he will get your current IP answered." msgstr "" "Die Lösung ist, einen Dynamischen Domain Namen (DNS) mit der IP Adresse zu " "verknüpfen und diesen DNS Eintrag jedes mal zu aktualisieren wenn sich die " @@ -646,10 +713,14 @@ msgstr "" "target='_blank'>freedns.afraid.org können per update URL genutzt werden." #: plinth/modules/dynamicdns/templates/dynamicdns.html:61 +#, fuzzy, python-format +#| msgid "" +#| "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." msgid "" -"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." +"If your %(box_name)s is connected behind some NAT router, don't forget to " +"add port forwarding (i.e. forward some standard ports like 80 and 443)." msgstr "" "Wenn die FreedomBox an einen NAT Router angeschlossen ist, muss zusätzlich " "ein Portforwarding im Router eingerichtet werden. Zum Beispiel können die " @@ -678,16 +749,23 @@ msgstr "" "angegeben wurde, dann kann der NAT Typ nicht erkannt werden." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:35 -msgid "Direct connection to the internet." +#, fuzzy +#| msgid "Direct connection to the internet." +msgid "Direct connection to the Internet." msgstr "Direkte Verbindung zum Internet." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:37 -#, python-format +#, fuzzy, python-format +#| msgid "" +#| "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)s " +#| "minutes until we update your DNS entry in case of WAN IP change." msgid "" -"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)s minutes until we " -"update your DNS entry in case of WAN IP change." +"Behind NAT. This means that Dynamic DNS service will poll the \"IP check URL" +"\" for changes (the \"IP check URL\" entry is needed for this - otherwise IP " +"changes will not be detected). In case the WAN IP changes, it may take up " +"to %(timer)s minutes until your DNS entry is updated." msgstr "" "Hinter einem NAT; das bedeutet dass der Dynamische DNS Dienst zyklisch die " "\"IP check URL\" abfragen wird (aus diesem Grund wird eine \"IP check URL\" " @@ -706,19 +784,23 @@ msgid "Firewall" msgstr "Firewall" #: plinth/modules/firewall/templates/firewall.html:28 -#, python-format +#, fuzzy, python-format +#| msgid "" +#| "Firewall is a network security system that controls the incoming and " +#| "outgoing network traffic on your %(box_name)s. Keeping a firewall enabled " +#| "and properly configured reduces risk of security threat from the Internet." msgid "" -"Firewall is a network security system that controls the incoming and " -"outgoing network traffic on your %(box_name)s. Keeping a firewall enabled " -"and properly configured reduces risk of security threat from the Internet." +"Firewall is a security system that controls the incoming and outgoing " +"network traffic on your %(box_name)s. Keeping a firewall enabled and " +"properly configured reduces risk of security threat from the Internet." msgstr "" "Firewall ist ein Netzwerk-Sicherheitssystem das den ein- und ausgehenden " "Verkehr der %(box_name)s kontrolliert. Die Firewall aktiv und korrekt " "konfiguriert zu halten reduziert Sicherheitsrisiken aus dem Internet." #: plinth/modules/firewall/templates/firewall.html:36 -msgid "The following is the current status:" -msgstr "Der aktuelle Status ist wie folgt:" +msgid "Current status:" +msgstr "" #: plinth/modules/firewall/templates/firewall.html:41 #, python-format @@ -738,11 +820,13 @@ msgid "Service/Port" msgstr "Dienst/Port" #: plinth/modules/firewall/templates/firewall.html:67 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:91 #: plinth/modules/names/templates/names.html:51 msgid "Enabled" msgstr "Aktiviert" #: plinth/modules/firewall/templates/firewall.html:70 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:93 #: plinth/modules/names/templates/names.html:53 msgid "Disabled" msgstr "Deaktiviert" @@ -764,10 +848,15 @@ msgid "Blocked" msgstr "Geblockt" #: plinth/modules/firewall/templates/firewall.html:103 +#, fuzzy +#| msgid "" +#| "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." msgid "" "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." +"also permitted in the firewall and when you disable a service it is also " +"disabled in the firewall." msgstr "" "Der Betrieb der Firewall erfolgt automatisch. Wenn ein Dienst eingeschaltet " "wird, wird er automatisch in der Firewall zugelassen und wenn ein Dienst " @@ -785,30 +874,30 @@ msgstr "Hinzufügen eines neuen Benutzers zur admin Gruppe ist fehlgeschlagen." msgid "User account created, you are now logged in" msgstr "Benutzerkonto wurde erstellt, Sie sind jetzt angemeldet" -#: plinth/modules/first_boot/templates/firstboot_state0.html:50 -msgid "Congratulations! Your FreedomBox is up and running!" -msgstr "Glückwunsch! Ihre FreedomBox läuft!" +#: plinth/modules/first_boot/templates/firstboot_navbar.html:23 +#: plinth/modules/help/templates/help_index.html:25 +#: plinth/templates/base.html:102 +msgid "Help" +msgstr "Hilfe" + +#: plinth/modules/first_boot/templates/firstboot_state0.html:45 +#, fuzzy +#| msgid "Start setup" +msgid "Start Setup" +msgstr "Einrichten beginnen" -#: plinth/modules/first_boot/templates/firstboot_state0.html:54 +#: plinth/modules/first_boot/templates/firstboot_state0.html:49 +#, python-format msgid "" -"Please provide the following basic information to complete the setup process." +"To complete the setup of your %(box_name)s, please provide some basic " +"information." msgstr "" -"Bitte geben Sie die folgenden grundlegenden Informationen an um die " -"Installation abzuschließen." -#: plinth/modules/first_boot/templates/firstboot_state0.html:62 -msgid "Next" -msgstr "Weiter" - -#: plinth/modules/first_boot/templates/firstboot_state1.html:39 +#: plinth/modules/first_boot/templates/firstboot_state1.html:41 msgid "Administrator Account" msgstr "Administrator Konto" -#: plinth/modules/first_boot/templates/firstboot_state1.html:42 -#| msgid "" -#| "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." +#: plinth/modules/first_boot/templates/firstboot_state1.html:44 msgid "" "Choose a username and password to access this web interface. The password " "can be changed later. This user will be granted administrative privileges. " @@ -819,7 +908,7 @@ msgstr "" "erhält Administrator-Rechte. Weitere Benutzer können später hinzugefügt " "werden." -#: plinth/modules/first_boot/templates/firstboot_state1.html:55 +#: plinth/modules/first_boot/templates/firstboot_state1.html:57 msgid "Box it up!" msgstr "Die Box starten!" @@ -828,36 +917,47 @@ msgid "Setup Complete!" msgstr "Installation komplett!" #: plinth/modules/first_boot/templates/firstboot_state10.html:32 +#, fuzzy, python-format +#| msgid "" +#| "To make your FreedomBox functional, you need some applications. " +#| "Applications will be installed the first time you access them." msgid "" -"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." -msgstr "" -"Die FreedomBox Installation ist jetzt abgeschlossen. Allerdings sollten Sie " -"die Netzwerkkonfiguration überprüfen und gegebenenfalls ändern. Vergessen " -"Sie nicht, die standardmäßigen WLAN-Passwörter zu ändern." - -#: plinth/modules/first_boot/templates/firstboot_state10.html:40 -msgid "" -"To make your FreedomBox functional, you need some applications. " -"Applications will be installed the first time you access them." +"%(box_name)s setup is now complete. To make your %(box_name)s functional, " +"you need some applications. They will be installed the first time you " +"access them." msgstr "" "Um Ihre FreedomBox funktionsfähig zu machen benötigen Sie einige Anwendungen " "(Apps). Die Anwendungen werden installiert wenn Sie das erste Mal auf sie " "zugreifen." -#: plinth/modules/first_boot/templates/firstboot_state10.html:47 -msgid "Network Configuration" +#: plinth/modules/first_boot/templates/firstboot_state10.html:41 +msgid "Go to Apps" +msgstr "Zu den Anwendungen" + +#: plinth/modules/first_boot/templates/firstboot_state10.html:44 +#, fuzzy +#| msgid "Network Configuration" +msgid "Current Network Configuration" msgstr "Netzwerk-Konfiguration" -#: plinth/modules/first_boot/templates/firstboot_state10.html:54 +#: plinth/modules/first_boot/templates/firstboot_state10.html:47 +#, fuzzy +#| msgid "" +#| "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." +msgid "" +"You should check the network setup and modify it if necessary. Do not forget " +"to change the default Wi-Fi passwords!" +msgstr "" +"Die FreedomBox Installation ist jetzt abgeschlossen. Allerdings sollten Sie " +"die Netzwerkkonfiguration überprüfen und gegebenenfalls ändern. Vergessen " +"Sie nicht, die standardmäßigen WLAN-Passwörter zu ändern." + +#: plinth/modules/first_boot/templates/firstboot_state10.html:57 msgid "Go to Networks" msgstr "Zu den Netzwerken" -#: plinth/modules/first_boot/templates/firstboot_state10.html:59 -msgid "Go to Apps" -msgstr "Zu den Anwendungen" - #: plinth/modules/first_boot/views.py:60 msgid "Setup Complete" msgstr "Installation abgeschlossen" @@ -870,9 +970,9 @@ msgstr "Dokumentation" msgid "Where to Get Help" msgstr "Wo man Hilfe bekommt" -#: plinth/modules/help/help.py:38 plinth/modules/help/help.py:72 -msgid "FreedomBox Manual" -msgstr "FreedomBox Handbuch" +#: plinth/modules/help/help.py:38 +msgid "Manual" +msgstr "" #: plinth/modules/help/help.py:48 msgid "Documentation and FAQ" @@ -883,15 +983,30 @@ msgstr "Dokumentation und FAQ" msgid "About {box_name}" msgstr "Über {box_name}" +#: plinth/modules/help/help.py:73 +#, fuzzy, python-brace-format +#| msgid "About {box_name}" +msgid "{box_name} Manual" +msgstr "Über {box_name}" + #: plinth/modules/help/templates/help_about.html:30 -msgid "" -"FreedomBox is a community project to develop, design and promote personal " +#, fuzzy, python-format +#| msgid "" +#| "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." +msgid "" +"%(box_name)s 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." +"and a Tor relay, on a device that can replace your Wi-Fi router, so that " +"your data stays with you." msgstr "" "FreedomBox ist ein Gemeinschaftsprojekt zur Entwicklung, Gestaltung und " "Förderung persönlicher Server mit freier Software für die private, " @@ -921,59 +1036,82 @@ msgstr "" "vorgesehenen Peer-to-Peer-Architektur (Gleiche mit Gleichen) zurück." #: plinth/modules/help/templates/help_about.html:56 +#, fuzzy, python-format +#| msgid "" +#| "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." msgid "" "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." +"services; %(box_name)s aims to bring them all together in a convenient " +"package." msgstr "" "Es gibt eine Vielzahl von Projekten die an eine Zukunft von verteilten " "Diensten arbeiten; FreedomBox zielt darauf ab diese alle in einem " "praktischen Paket zusammenzubringen ." #: plinth/modules/help/templates/help_about.html:64 +#, fuzzy, python-format +#| msgid "" +#| "For more information about the FreedomBox project, see the FreedomBox Wiki." msgid "" -"For more information about the FreedomBox project, see the FreedomBox Wiki." +"For more information about the %(box_name)s project, see the %(box_name)s Wiki." msgstr "" "Mehr Informationen über das FreedomBox Projekt finden Sie auf dem FreedomBox Wiki." -#: plinth/modules/help/templates/help_about.html:72 +#: plinth/modules/help/templates/help_about.html:73 msgid "Learn more »" msgstr "Mehr lernen" -#: plinth/modules/help/templates/help_about.html:75 +#: plinth/modules/help/templates/help_about.html:76 #, python-format msgid "You are running Plinth version %(version)s." msgstr "Es läuft Plinth Version %(version)s." -#: plinth/modules/help/templates/help_index.html:25 -#: plinth/templates/base.html:98 -msgid "Help" -msgstr "Hilfe" +#: plinth/modules/help/templates/help_base.html:36 +#, python-format +msgid "%(box_name)s Setup" +msgstr "" #: plinth/modules/help/templates/help_index.html:29 -#, python-format +#, fuzzy, python-format +#| msgid "" +#| "The FreedomBox Manual is the best place to " +#| "start for information regarding %(box_name)s." msgid "" -"The FreedomBox Manual is the best place to " +"The %(box_name)s Manual is the best place to " "start for information regarding %(box_name)s." msgstr "" "Das FreedomBox Handbuch ist der beste Ort für " "erste Informationen über %(box_name)s." #: plinth/modules/help/templates/help_index.html:36 +#, fuzzy, python-format +#| msgid "" +#| " " +#| "FreedomBox project wiki contains further information." msgid "" -" FreedomBox " -"project wiki contains further information." +" " +"%(box_name)s project wiki contains further information." msgstr "" "Das FreedomBox Wiki Projekt enthält weitere Informationen." #: plinth/modules/help/templates/help_index.html:43 +#, fuzzy, python-format +#| msgid "" +#| "To seek help from FreedomBox community, queries may be posted on the mailing list. The list archives also contain information about " +#| "problems faced by other users and possible solutions." msgid "" -"To seek help from FreedomBox community, queries may be posted on the " -"mailing list. The list archives also contain information about problems " -"faced by other users and possible solutions." +"To seek help from %(box_name)s community, queries may be posted on the mailing list. The list archives also contain information about " +"problems faced by other users and possible solutions." msgstr "" "Um Hilfe von der FreedomBox Gemeinschaft zu bekommen können Anfragen an die " " #freedombox " +"channel using the IRC web interface." msgstr "" -"Viele Mitwirkende bei FreedomBox und Benutzer sind auch über den #freedombox " -"Kanal des irc.oftc.net IRC Netzwerks erreichbar." #: plinth/modules/ikiwiki/__init__.py:38 -msgid "Wiki & Blog (Ikiwiki)" +#, fuzzy +#| msgid "Wiki & Blog (Ikiwiki)" +msgid "Wiki and Blog (ikiwiki)" msgstr "Wiki & Blog (Ikiwiki)" #: plinth/modules/ikiwiki/__init__.py:43 -msgid "Ikiwiki wikis and blogs" +#, fuzzy +#| msgid "Ikiwiki wikis and blogs" +msgid "ikiwiki wikis and blogs" msgstr "Ikiwiki Wikis und Blogs" #: plinth/modules/ikiwiki/forms.py:29 -msgid "Enable Ikiwiki" +#, fuzzy +#| msgid "Enable Ikiwiki" +msgid "Enable ikiwiki" msgstr "Ikiwiki einschalten" #: plinth/modules/ikiwiki/forms.py:36 @@ -1027,24 +1172,30 @@ msgstr "" "ikiwiki zur Verfügung." #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:27 -#, python-format -msgid "Delete Wiki/Blog %(name)s" +#, fuzzy, python-format +#| msgid "Delete Wiki/Blog %(name)s" +msgid "Delete Wiki or Blog %(name)s" msgstr "Lösche Wiki/Blog %(name)s" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:33 +#, fuzzy +#| msgid "" +#| "This action will remove all the posts, pages and comments including " +#| "revision history. Delete this wiki/blog permanently?" msgid "" "This action will remove all the posts, pages and comments including revision " -"history. Delete this wiki/blog permanently?" +"history. Delete this wiki or blog permanently?" msgstr "" "Diese Aktion wird alle Posts, Seiten und Kommentare einschließlich der " "Historie löschen. Dieses Wiki/Blog permanent löschen?" -#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:43 +#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:44 #, python-format msgid "Delete %(name)s" msgstr "Lösche %(name)s" -#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:46 +#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:47 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:60 #: plinth/modules/networks/templates/connections_delete.html:41 #: plinth/modules/users/templates/users_delete.html:41 msgid "Cancel" @@ -1077,7 +1228,9 @@ msgid "Create" msgstr "Anlegen" #: plinth/modules/ikiwiki/views.py:73 -msgid "Wiki & Blog" +#, fuzzy +#| msgid "Wiki & Blog" +msgid "Wiki and Blog" msgstr "Wiki & Blog" #: plinth/modules/ikiwiki/views.py:106 @@ -1085,8 +1238,10 @@ msgid "Manage Wikis and Blogs" msgstr "Wikis und Blogs verwalten" #: plinth/modules/ikiwiki/views.py:132 -msgid "Create Wiki/Blog" -msgstr "Wiki/Blog anlegen" +#, fuzzy +#| msgid "Create a Wiki or Blog" +msgid "Create Wiki or Blog" +msgstr "Ein Wiki oder Blog anlegen" #: plinth/modules/ikiwiki/views.py:145 #, python-brace-format @@ -1119,9 +1274,154 @@ msgid "Could not delete {name}: {error}" msgstr "Konnte {name} nicht löschen: {error}" #: plinth/modules/ikiwiki/views.py:182 -msgid "Delete Wiki/Blog" +#, fuzzy +#| msgid "Delete Wiki/Blog" +msgid "Delete Wiki or Blog" msgstr "Lösche Wiki/Blog" +#: plinth/modules/letsencrypt/__init__.py:43 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:38 +#: plinth/modules/letsencrypt/views.py:45 +msgid "Certificates (Let's Encrypt)" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:41 +#, python-format +msgid "" +"A digital certficate allows users of a web service to verify the identity of " +"the service and to securely communicate with it. %(box_name)s can " +"automatically obtain and setup digital certificates for each available " +"domain. It does so by proving itself to be the owner of a domain to Let's " +"Encrypt, a certficate authority (CA)." +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:52 +msgid "" +"Let's Encrypt is a free, automated, and open certificate authority, run for " +"the public’s benefit by the Internet Security Research Group (ISRG). Please " +"read and agree with the Let's Encrypt Subscriber Agreement before using this service." +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:66 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:70 +#, fuzzy +#| msgid "Domain Name" +msgid "Domain" +msgstr "Domain-Name" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:67 +msgid "Certificate Status" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:68 +#, fuzzy +#| msgid "Security" +msgid "Website Security" +msgstr "Sicherheit" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:69 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:72 +#, fuzzy +#| msgid "Applications" +msgid "Actions" +msgstr "Anwendungen" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:79 +#, python-format +msgid "Expires on %(expiry_date)s" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:85 +msgid "No certficate" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:102 +msgid "Revoke" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:108 +msgid "Re-obtain" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:115 +msgid "Obtain" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:55 +#, python-brace-format +msgid "Certificate successfully revoked for domain {domain}" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:60 +#, python-brace-format +msgid "Failed to revoke certificate for domain {domain}: {error}" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:72 +#, python-brace-format +msgid "Certificate successfully obtained for domain {domain}" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:77 +#, python-brace-format +msgid "Failed to obtain certificate for domain {domain}: {error}" +msgstr "" + +#: plinth/modules/monkeysphere/__init__.py:32 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:35 +#: plinth/modules/monkeysphere/views.py:44 +msgid "Monkeysphere" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:38 +msgid "" +"With Monkeysphere, a PGP key can be generated for each configured domain " +"serving SSH. The PGP public key can then be uploaded to the PGP keyservers. " +"Users connecting to this machine through SSH can verify that they are " +"connecting to the correct host. For users to trust the key, at least one " +"person (usually the machine owner) must sign the key using the regular PGP " +"key signing process. See the Monkeysphere SSH documentation for more details." +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:53 +msgid "Publishing key to keyserver..." +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:71 +msgid "GPG Fingerprint" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:83 +#: plinth/modules/names/views.py:45 +msgid "Not Available" +msgstr "Nicht verfügbar" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:93 +msgid "Generate PGP Key" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:101 +msgid "Publish Key" +msgstr "" + +#: plinth/modules/monkeysphere/views.py:58 +msgid "Generated PGP key." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:83 +msgid "Cancelled key publishing." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:120 +msgid "Published key to keyserver." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:122 +msgid "Error occurred while publishing key." +msgstr "" + #: plinth/modules/mumble/__init__.py:38 #: plinth/modules/mumble/templates/mumble.html:26 #: plinth/modules/mumble/views.py:58 @@ -1162,61 +1462,48 @@ msgstr "Mumble Server läuft" msgid "Mumble server is not running" msgstr "Mumble Server läuft nicht" -#: plinth/modules/names/__init__.py:30 +#: plinth/modules/names/__init__.py:29 msgid "HTTP" msgstr "HTTP" -#: plinth/modules/names/__init__.py:31 +#: plinth/modules/names/__init__.py:30 msgid "HTTPS" msgstr "HTTPS" -#: plinth/modules/names/__init__.py:32 +#: plinth/modules/names/__init__.py:31 msgid "SSH" msgstr "SSH" -#: plinth/modules/names/__init__.py:46 plinth/modules/names/views.py:34 +#: plinth/modules/names/__init__.py:45 plinth/modules/names/views.py:34 msgid "Name Services" msgstr "Namen-Dienste" -#: plinth/modules/names/__init__.py:107 -msgid "Not Available" -msgstr "Nicht verfügbar" - #: plinth/modules/networks/__init__.py:108 #, python-brace-format msgid "Using DNSSEC on IPv{kind}" msgstr "Verwende DNSSEC auf IPv{kind}" #: plinth/modules/networks/forms.py:30 -msgid "-- select --" -msgstr "-- auswählen --" - -#: plinth/modules/networks/forms.py:42 msgid "Connection Type" msgstr "Verbindungstyp" -#: plinth/modules/networks/forms.py:49 plinth/modules/networks/forms.py:106 -#: plinth/modules/networks/forms.py:133 +#: plinth/modules/networks/forms.py:37 msgid "Connection Name" msgstr "Verbindungsname" -#: plinth/modules/networks/forms.py:51 plinth/modules/networks/forms.py:108 -#: plinth/modules/networks/forms.py:135 +#: plinth/modules/networks/forms.py:39 msgid "Physical Interface" msgstr "Physikalisches Interface" -#: plinth/modules/networks/forms.py:53 plinth/modules/networks/forms.py:110 -#: plinth/modules/networks/forms.py:137 +#: plinth/modules/networks/forms.py:41 msgid "The network device that this connection should be bound to." msgstr "Das Netzwerkgerät an das diese Verbindung gebunden sein sollte." -#: plinth/modules/networks/forms.py:56 plinth/modules/networks/forms.py:113 -#: plinth/modules/networks/forms.py:140 +#: plinth/modules/networks/forms.py:44 msgid "Firewall Zone" msgstr "Firewall Zone" -#: plinth/modules/networks/forms.py:57 plinth/modules/networks/forms.py:114 -#: plinth/modules/networks/forms.py:141 +#: plinth/modules/networks/forms.py:45 msgid "" "The firewall zone will control which services are available over this " "interfaces. Select Internal only for trusted networks." @@ -1224,11 +1511,11 @@ msgstr "" "Die Firewall Zone steuert welche Dienste über diese Schnittstellen zur " "Verfügung stehen. Wählen Sie 'Intern' nur für vertrauenswürdige Netzwerke." -#: plinth/modules/networks/forms.py:61 plinth/modules/networks/forms.py:162 +#: plinth/modules/networks/forms.py:49 msgid "IPv4 Addressing Method" msgstr "IPv4 Adressierungs-Methode" -#: plinth/modules/networks/forms.py:62 +#: plinth/modules/networks/forms.py:50 msgid "" "\"Shared\" method will start a DHCP server and \"Automatic\" method will " "acquire configuration from a DHCP server." @@ -1236,15 +1523,15 @@ msgstr "" "Die \"Shared\" Methode wird einen DHCP Server starten während die \"Automatic" "\" Methode sich ihre Konfiguration vom DHCP Server holt." -#: plinth/modules/networks/forms.py:68 plinth/modules/networks/forms.py:170 +#: plinth/modules/networks/forms.py:56 msgid "Address" msgstr "Adresse" -#: plinth/modules/networks/forms.py:72 plinth/modules/networks/forms.py:174 +#: plinth/modules/networks/forms.py:60 msgid "Netmask" msgstr "Netzmaske" -#: plinth/modules/networks/forms.py:73 plinth/modules/networks/forms.py:175 +#: plinth/modules/networks/forms.py:61 msgid "" "Optional value. If left blank, a default netmask based on the address will " "be used." @@ -1252,21 +1539,21 @@ msgstr "" "Optionaler Wert. Wenn er leer gelassen wird, wird eine Maske basierend auf " "der Adresse verwendet." -#: plinth/modules/networks/forms.py:78 plinth/modules/networks/forms.py:180 +#: plinth/modules/networks/forms.py:66 #: plinth/modules/networks/templates/connection_show.html:202 #: plinth/modules/networks/templates/connection_show.html:241 msgid "Gateway" msgstr "Gateway" -#: plinth/modules/networks/forms.py:79 plinth/modules/networks/forms.py:181 +#: plinth/modules/networks/forms.py:67 msgid "Optional value." msgstr "Optionaler Wert." -#: plinth/modules/networks/forms.py:83 plinth/modules/networks/forms.py:185 +#: plinth/modules/networks/forms.py:71 msgid "DNS Server" msgstr "DNS Server" -#: plinth/modules/networks/forms.py:84 plinth/modules/networks/forms.py:186 +#: plinth/modules/networks/forms.py:72 msgid "" "Optional value. If this value is given and IPv4 addressing method is " "\"Automatic\", the DNS Servers provided by a DHCP server will be ignored." @@ -1275,11 +1562,11 @@ msgstr "" "\"Automatic\" ist, werden die DNS Server die von einem DHCP Server " "bereitgestellt wurden, ignoriert." -#: plinth/modules/networks/forms.py:90 plinth/modules/networks/forms.py:192 +#: plinth/modules/networks/forms.py:78 msgid "Second DNS Server" msgstr "Zweiter DNS Server" -#: plinth/modules/networks/forms.py:91 plinth/modules/networks/forms.py:193 +#: plinth/modules/networks/forms.py:79 msgid "" "Optional value. If this value is given and IPv4 Addressing Method is " "\"Automatic\", the DNS Servers provided by a DHCP server will be ignored." @@ -1288,29 +1575,29 @@ msgstr "" "\"Automatic\" ist, werden die DNS Server die von einem DHCP Server " "bereitgestellt wurden, ignoriert." -#: plinth/modules/networks/forms.py:121 -msgid "Show password" -msgstr "Zeige Passwort" +#: plinth/modules/networks/forms.py:89 +msgid "-- select --" +msgstr "-- auswählen --" -#: plinth/modules/networks/forms.py:145 +#: plinth/modules/networks/forms.py:175 #: plinth/modules/networks/templates/connection_show.html:144 msgid "SSID" msgstr "SSID" -#: plinth/modules/networks/forms.py:146 +#: plinth/modules/networks/forms.py:176 msgid "The visible name of the network." msgstr "Der sichtbare Name des Netzwerks." -#: plinth/modules/networks/forms.py:148 +#: plinth/modules/networks/forms.py:178 #: plinth/modules/networks/templates/connection_show.html:157 msgid "Mode" msgstr "Modus" -#: plinth/modules/networks/forms.py:153 +#: plinth/modules/networks/forms.py:183 msgid "Authentication Mode" msgstr "Authentifizierungs-Modus" -#: plinth/modules/networks/forms.py:154 +#: plinth/modules/networks/forms.py:184 msgid "" "Select WPA if the wireless network is secured and requires clients to have " "the password to connect." @@ -1318,31 +1605,22 @@ msgstr "" "Wählen Sie WPA, wenn das Wireless-Netzwerk gesichert ist und ein Passwort " "für die Benutzung erfordert." -#: plinth/modules/networks/forms.py:158 +#: plinth/modules/networks/forms.py:188 msgid "Passphrase" msgstr "Passphrase" -#: plinth/modules/networks/forms.py:166 -msgid "" -"Select Automatic (DHCP) if you are connecting to an existing wireless " -"network. Shared mode is useful when running an Access Point." -msgstr "" -"Wählen Sie Automatisch (DHCP), wenn Sie zu einem bestehenden drahtlosen " -"Netzwerk verbunden sind. Shared mode ist nützlich bei Verwendung eines " -"Access Points." - #: plinth/modules/networks/networks.py:36 #: plinth/modules/networks/networks.py:56 msgid "Network Connections" msgstr "Netzwerkverbindungen" #: plinth/modules/networks/networks.py:38 -#: plinth/modules/networks/networks.py:273 +#: plinth/modules/networks/networks.py:242 msgid "Nearby Wi-Fi Networks" msgstr "Nahe Wi-Fi Netzwerke" #: plinth/modules/networks/networks.py:40 -#: plinth/modules/networks/networks.py:295 +#: plinth/modules/networks/networks.py:264 msgid "Add Connection" msgstr "Verbindung hinzufügen" @@ -1366,60 +1644,60 @@ msgstr "Kann Verbindung nicht bearbeiten: Verbindung nicht gefunden." msgid "This type of connection is not yet understood." msgstr "Dieser Verbindungstyp ist noch nicht bekannt." -#: plinth/modules/networks/networks.py:170 -#: plinth/modules/networks/networks.py:229 +#: plinth/modules/networks/networks.py:139 +#: plinth/modules/networks/networks.py:198 #: plinth/modules/networks/templates/connections_edit.html:34 msgid "Edit Connection" msgstr "Verbindung bearbeiten" -#: plinth/modules/networks/networks.py:240 +#: plinth/modules/networks/networks.py:209 #, python-brace-format msgid "Activated connection {name}." msgstr "Verbindung {name} eingeschaltet." -#: plinth/modules/networks/networks.py:243 +#: plinth/modules/networks/networks.py:212 msgid "Failed to activate connection: Connection not found." msgstr "Fehler beim Einschalten der Verbindung: Verbindung nicht gefunden." -#: plinth/modules/networks/networks.py:247 +#: plinth/modules/networks/networks.py:216 #, python-brace-format msgid "Failed to activate connection {name}: No suitable device is available." msgstr "" "Fehler beim Einschalten der Verbindung {name}: Kein geeignetes Gerät " "verfügbar." -#: plinth/modules/networks/networks.py:260 +#: plinth/modules/networks/networks.py:229 #, python-brace-format msgid "Deactivated connection {name}." msgstr "Verbindung {name} ausgeschaltet." -#: plinth/modules/networks/networks.py:263 +#: plinth/modules/networks/networks.py:232 msgid "Failed to de-activate connection: Connection not found." msgstr "Konnte Verbindung nicht ausschalten: Verbindung nicht gefunden." -#: plinth/modules/networks/networks.py:325 +#: plinth/modules/networks/networks.py:282 msgid "Adding New Ethernet Connection" msgstr "Füge neue Ethernet Verbindung hinzu" -#: plinth/modules/networks/networks.py:350 +#: plinth/modules/networks/networks.py:300 msgid "Adding New PPPoE Connection" msgstr "Füge neue PPPoE Verbindung hinzu" -#: plinth/modules/networks/networks.py:399 +#: plinth/modules/networks/networks.py:332 msgid "Adding New Wi-Fi Connection" msgstr "Füge neue Wi-Fi Verbindung hinzu" -#: plinth/modules/networks/networks.py:413 +#: plinth/modules/networks/networks.py:346 #, python-brace-format msgid "Connection {name} deleted." msgstr "Verbindung {name} gelöscht." -#: plinth/modules/networks/networks.py:416 -#: plinth/modules/networks/networks.py:425 +#: plinth/modules/networks/networks.py:349 +#: plinth/modules/networks/networks.py:358 msgid "Failed to delete connection: Connection not found." msgstr "Konnte Verbindung nicht löschen: Verbindung nicht gefunden." -#: plinth/modules/networks/networks.py:430 +#: plinth/modules/networks/networks.py:363 #: plinth/modules/networks/templates/connections_delete.html:26 msgid "Delete Connection" msgstr "Lösche Verbindung" @@ -1429,7 +1707,7 @@ msgid "Edit connection" msgstr "Bearbeite Verbindung" #: plinth/modules/networks/templates/connection_show.html:43 -#: plinth/templates/base.html:119 +#: plinth/templates/base.html:123 msgid "Edit" msgstr "Bearbeiten" @@ -1575,10 +1853,16 @@ msgid "Firewall zone" msgstr "Firewall Zone" #: plinth/modules/networks/templates/connection_show.html:280 +#, fuzzy +#| msgid "" +#| "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." msgid "" -"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." +"This interface should be connected to a 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." msgstr "" "Diese Schnittstelle sollte auf lokales Netzwerk / Gerät angeschlossen sein. " "Wenn Sie diese Schnittstelle mit einem öffentlichen Netzwerk verbinden, " @@ -1586,20 +1870,31 @@ msgstr "" "erreichbar sein. Dies ist ein Sicherheitsrisiko." #: plinth/modules/networks/templates/connection_show.html:300 +#, fuzzy +#| msgid "" +#| "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." msgid "" -"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." +"This interface should receive your Internet connection. If you connect it to " +"a local network/machine, many services meant to available only internally " +"will not be available." msgstr "" "Diese Schnittstelle sollte Ihre Internetverbindung empfangen. Wenn Sie es an " "ein lokales Netzwerk / Gerät anschließen, werden viele Dienste die nur " "intern zur Verfügung stehen sollten nicht verfügbar sein." #: plinth/modules/networks/templates/connection_show.html:319 -msgid "" -"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 " +#, fuzzy, python-format +#| msgid "" +#| "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." +msgid "" +"This interface is not maintained by %(box_name)s. Its security status is " +"unknown to %(box_name)s. Many %(box_name)s services may not be available on " +"this interface. It is recommended that you deactivate or delete this " "connection and re-configure it." msgstr "" "Diese Schnittstelle wird von FreedomBox nicht gepflegt. Sein " @@ -1692,10 +1987,17 @@ msgid "Enable OpenVPN server" msgstr "OpenVPN Server einschalten" #: plinth/modules/openvpn/templates/openvpn.html:38 -#, python-format +#, fuzzy, python-format +#| msgid "" +#| "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 %(box_name)s in order to join " +#| "your home network and access private/internal services provided by " +#| "%(box_name)s. You can also access the rest of the Internet via " +#| "%(box_name)s for added security and anonymity." msgid "" "Virtual Private Network (VPN) is a technique for securely connecting two " -"machines in order to access resources of a private network. While you are " +"devices in order to access resources of a private network. While you are " "away from home, you can connect to your %(box_name)s in order to join your " "home network and access private/internal services provided by %(box_name)s. " "You can also access the rest of the Internet via %(box_name)s for added " @@ -1714,12 +2016,19 @@ msgid "Profile" msgstr "Profil" #: plinth/modules/openvpn/templates/openvpn.html:54 -#, python-format +#, fuzzy, python-format +#| msgid "" +#| "To connect to %(box_name)s'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 documentation on recommended clients and instructions on how to " +#| "configure them." msgid "" "To connect to %(box_name)s'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 documentation on recommended clients and instructions on how to " "configure them." msgstr "" @@ -2278,6 +2587,64 @@ msgstr "Quassel Kern läuft" msgid "Quassel core service is not running" msgstr "Quassel Kern läuft nicht" +#: plinth/modules/repro/__init__.py:36 +#: plinth/modules/repro/templates/repro.html:26 +#: plinth/modules/repro/views.py:55 +#, fuzzy +#| msgid "Server port" +msgid "SIP Server (repro)" +msgstr "Server Port" + +#: plinth/modules/repro/__init__.py:41 +#, fuzzy +#| msgid "Second DNS Server" +msgid "repro SIP Server" +msgstr "Zweiter DNS Server" + +#: plinth/modules/repro/forms.py:29 +#, fuzzy +#| msgid "Enable Quassel core service" +msgid "Enable repro service" +msgstr "Quassel-Kern einschalten" + +#: plinth/modules/repro/templates/repro.html:29 +msgid "" +"repro provides various SIP services that a SIP softphone can utilize to " +"provide audio and video calls as well as presence and instant messaging. " +"repro provides a server and SIP user accounts that clients can use to let " +"their presence known. It also acts as a proxy to federate SIP " +"communications to other servers on the Internet similar to email." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:39 +msgid "" +"To make SIP calls, a client application is needed. Available clients include " +"Jitsi (for computers) and CSipSimple (for Android phones)." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:48 +msgid "" +"Note: Before using repro, domains and users will need to " +"be configured using the web-based " +"configuration panel. Users in the admin group will be able to " +"log in to the repro configuration panel. After setting the domain, it is " +"required to restart the repro service. Disable the service and re-enable it." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:63 +#, fuzzy +#| msgid "Quassel core service is running" +msgid "repro service is running" +msgstr "Quassel Kern läuft" + +#: plinth/modules/repro/templates/repro.html:66 +#, fuzzy +#| msgid "Quassel core service is not running" +msgid "repro service is not running" +msgstr "Quassel Kern läuft nicht" + #: plinth/modules/restore/__init__.py:36 #: plinth/modules/restore/templates/restore_index.html:26 #: plinth/modules/restore/views.py:46 @@ -2293,13 +2660,19 @@ msgid "Enable reStore" msgstr "reStore einschalten" #: plinth/modules/restore/templates/restore_index.html:29 -#, python-format +#, fuzzy, python-format +#| msgid "" +#| "reStore is a server for unhosted web " +#| "applications. The idea is to uncouple web applications from data. No " +#| "matter where a web application is served from, the data can be stored on " +#| "an unhosted storage server of user's choice. With reStore, your " +#| "%(cfg.box_name)s becomes your unhosted storage server." msgid "" "reStore is a server for unhosted web " "applications. The idea is to uncouple web applications from data. No " "matter where a web application is served from, the data can be stored on an " -"unhosted storage server of user's choice. With reStore, your " -"%(cfg.box_name)s becomes your unhosted storage server." +"unhosted storage server of user's choice. With reStore, your %(box_name)s " +"becomes your unhosted storage server." msgstr "" "reStore ist ein Server für unhosted Web-" "Anwendungen. Die Idee ist, Web-Anwendungen von den Daten zu entkoppeln. " @@ -2403,7 +2776,7 @@ msgstr "System" #: plinth/modules/system/system.py:33 #: plinth/modules/system/templates/system.html:25 -#: plinth/templates/base.html:105 +#: plinth/templates/base.html:109 msgid "System Configuration" msgstr "System-Konfiguration" @@ -2420,33 +2793,81 @@ msgstr "" "Diese Optionen beeinflussen die Funktionen der %(box_name)s auf grundlegende " "Art und Weise, also vorsichtig benutzen!" -#: plinth/modules/tor/__init__.py:50 +#: plinth/modules/tor/__init__.py:48 plinth/modules/tor/templates/tor.html:35 +msgid "Anonymity Network (Tor)" +msgstr "Anonymisierungsnetzwerk (Tor)" + +#: plinth/modules/tor/__init__.py:53 +#, fuzzy +#| msgid "Anonymity Network (Tor)" +msgid "Tor Anonymity Network" +msgstr "Anonymisierungsnetzwerk (Tor)" + +#: plinth/modules/tor/__init__.py:58 +msgid "Tor Bridge Relay" +msgstr "" + +#: plinth/modules/tor/__init__.py:76 plinth/modules/tor/views.py:144 +msgid "Tor Hidden Service" +msgstr "Tor Hidden Service" + +#: plinth/modules/tor/__init__.py:222 msgid "Tor relay port available" msgstr "Tor relay Port ist verfügbar" -#: plinth/modules/tor/__init__.py:58 +#: plinth/modules/tor/__init__.py:230 msgid "Obfs3 transport registered" msgstr "Obfs3 Transport registriert" -#: plinth/modules/tor/__init__.py:64 +#: plinth/modules/tor/__init__.py:236 msgid "Obfs4 transport registered" msgstr "Obfs4 Transport registriert" -#: plinth/modules/tor/__init__.py:101 +#: plinth/modules/tor/__init__.py:273 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "Zugangs-URL {url} auf TCP{kind} über Tor" -#: plinth/modules/tor/__init__.py:112 +#: plinth/modules/tor/__init__.py:284 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "Bestätige Tor-Nutzung auf {url} über TCP{kind}" -#: plinth/modules/tor/templates/tor.html:26 plinth/modules/tor/tor.py:66 -msgid "Anonymity Network (Tor)" -msgstr "Anonymisierungsnetzwerk (Tor)" +#: plinth/modules/tor/forms.py:32 +msgid "Enable Tor" +msgstr "Tor einschalten" + +#: plinth/modules/tor/forms.py:35 +msgid "Enable Tor Hidden Service" +msgstr "Tor Verborgenen Dienst einschalten" -#: plinth/modules/tor/templates/tor.html:29 +#: plinth/modules/tor/forms.py:38 +#, fuzzy, python-brace-format +#| msgid "" +#| "A hidden service will allow FreedomBox to provide selected services (such " +#| "as ownCloud or Chat) without revealing its location." +msgid "" +"A hidden service will allow {box_name} to provide selected services (such as " +"ownCloud or chat) without revealing its location." +msgstr "" +"Ein verborgener Dienst ermöglicht FreedomBox ausgewählte Dienste (wie " +"ownCloud oder Chat) ohne Offenlegung seiner Position anzubieten." + +#: plinth/modules/tor/forms.py:42 +msgid "Download software packages over Tor" +msgstr "Software über Tor Netzwerk installieren" + +#: plinth/modules/tor/forms.py:44 +msgid "" +"When enabled, software will be downloaded over the Tor network for " +"installations and upgrades. This adds a degree of privacy and security " +"during software downloads." +msgstr "" +"Wenn aktiviert, wird Software für Installationen und Aktualisierungen über " +"das Tor-Netzwerk heruntergeladen. Dies fügt einen Schritt zur Privatsphäre " +"und Sicherheit während des Software-Downloads hinzu." + +#: plinth/modules/tor/templates/tor.html:38 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -2460,28 +2881,34 @@ msgstr "" "den Tor Browser verwenden." -#: plinth/modules/tor/templates/tor.html:44 +#: plinth/modules/tor/templates/tor.html:54 +#, fuzzy +#| msgid "Configuration updated" +msgid "Tor configuration is being updated" +msgstr "Konfiguration aktualisiert" + +#: plinth/modules/tor/templates/tor.html:62 msgid "Tor is running" msgstr "Tor läuft" -#: plinth/modules/tor/templates/tor.html:47 +#: plinth/modules/tor/templates/tor.html:65 msgid "Tor is not running" msgstr "Tor läuft nicht" -#: plinth/modules/tor/templates/tor.html:59 +#: plinth/modules/tor/templates/tor.html:77 msgid "Hidden Service" msgstr "Verborgene Dienste" -#: plinth/modules/tor/templates/tor.html:60 -#: plinth/modules/tor/templates/tor.html:102 +#: plinth/modules/tor/templates/tor.html:78 +#: plinth/modules/tor/templates/tor.html:120 msgid "Port" msgstr "Port" -#: plinth/modules/tor/templates/tor.html:85 +#: plinth/modules/tor/templates/tor.html:103 msgid "Bridge" msgstr "Brücke" -#: plinth/modules/tor/templates/tor.html:88 +#: plinth/modules/tor/templates/tor.html:106 #, python-format msgid "" "Your %(box_name)s is configured as a Tor bridge with obfsproxy, so it can " @@ -2494,90 +2921,42 @@ msgstr "" "einer Firewall ist, sollten Sie sicherstellen, dass die folgenden Ports " "geöffnet und weitergeleitet sind, falls erforderlich:" -#: plinth/modules/tor/templates/tor.html:101 +#: plinth/modules/tor/templates/tor.html:119 msgid "Service" msgstr "Dienst" -#: plinth/modules/tor/templates/tor.html:117 +#: plinth/modules/tor/templates/tor.html:135 msgid "SOCKS" msgstr "SOCKS" -#: plinth/modules/tor/templates/tor.html:120 +#: plinth/modules/tor/templates/tor.html:138 #, python-format msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "" "Ein Tor SOCKS Port steht auf Ihrer %(box_name)s auf TCP port 9050 bereit." -#: plinth/modules/tor/tor.py:46 -msgid "Enable Tor" -msgstr "Tor einschalten" - -#: plinth/modules/tor/tor.py:49 -msgid "Enable Tor Hidden Service" -msgstr "Tor Verborgenen Dienst einschalten" - -#: plinth/modules/tor/tor.py:51 -msgid "" -"A hidden service will allow FreedomBox to provide selected services (such as " -"ownCloud or Chat) without revealing its location." -msgstr "" -"Ein verborgener Dienst ermöglicht FreedomBox ausgewählte Dienste (wie " -"ownCloud oder Chat) ohne Offenlegung seiner Position anzubieten." - -#: plinth/modules/tor/tor.py:55 -msgid "Download software packages over Tor" -msgstr "Software über Tor Netzwerk installieren" - -#: plinth/modules/tor/tor.py:57 -msgid "" -"When enabled, software will be downloaded over the Tor network for " -"installations and upgrades. This adds a degree of privacy and security " -"during software downloads." -msgstr "" -"Wenn aktiviert, wird Software für Installationen und Aktualisierungen über " -"das Tor-Netzwerk heruntergeladen. Dies fügt einen Schritt zur Privatsphäre " -"und Sicherheit während des Software-Downloads hinzu." - -#: plinth/modules/tor/tor.py:85 plinth/modules/tor/tor.py:285 -msgid "Tor Hidden Service" -msgstr "Tor Hidden Service" - -#: plinth/modules/tor/tor.py:115 +#: plinth/modules/tor/views.py:68 msgid "Tor Control Panel" msgstr "Tor Kontrollpult" -#: plinth/modules/tor/tor.py:240 +#: plinth/modules/tor/views.py:79 #, python-brace-format msgid "Action error: {0} [{1}] [{2}]" msgstr "Action error: {0} [{1}] [{2}]" -#: plinth/modules/tor/tor.py:256 -msgid "Tor enabled" -msgstr "Tor eingeschaltet" - -#: plinth/modules/tor/tor.py:259 -msgid "Tor disabled" -msgstr "Tor ausgeschaltet" - -#: plinth/modules/tor/tor.py:264 -msgid "Tor hidden service enabled" -msgstr "Tor verborgener Dienst eingeschaltet" - -#: plinth/modules/tor/tor.py:267 -msgid "Tor hidden service disabled" -msgstr "Tor verborgener Dienst ausgeschaltet" - -#: plinth/modules/tor/tor.py:292 -msgid "Enabled package download over Tor" -msgstr "Package Download über Tor eingeschaltet" +#: plinth/modules/tor/views.py:148 +#, fuzzy +#| msgid "Configuration updated" +msgid "Configuration updated." +msgstr "Konfiguration aktualisiert" -#: plinth/modules/tor/tor.py:295 -msgid "Disabled package download over Tor" -msgstr "Package Download über Tor ausgeschaltet" +#: plinth/modules/tor/views.py:150 +msgid "An error occurred during configuration." +msgstr "" #: plinth/modules/transmission/__init__.py:38 #: plinth/modules/transmission/templates/transmission.html:26 -#: plinth/modules/transmission/views.py:63 +#: plinth/modules/transmission/views.py:67 msgid "BitTorrent (Transmission)" msgstr "BitTorrent (Transmission)" @@ -2594,10 +2973,6 @@ msgid "Download directory" msgstr "Download Ordner" #: plinth/modules/transmission/forms.py:34 -#| msgid "" -#| "Directory where downloads are saved. If you change the default " -#| "directory, ensure that the new directory exists and is writable by " -#| "\"debian-tramission\" user." msgid "" "Directory where downloads are saved. If you change the default directory, " "ensure that the new directory exists and is writable by \"debian-transmission" @@ -2661,73 +3036,72 @@ msgstr "" "System verfügbar sind. Es wird dann versucht alle Aktualisierungen " "durchzuführen." -#: plinth/modules/upgrades/templates/upgrades.html:40 -msgid "There was an error while upgrading." -msgstr "Es trat ein Fehler beim automatischen Update auf." - -#: plinth/modules/upgrades/templates/upgrades.html:43 -#: plinth/modules/upgrades/templates/upgrades.html:59 -msgid "Output from unattended-upgrades:" -msgstr "Meldungen der automatischen Aktualisierungen:" - -#: plinth/modules/upgrades/templates/upgrades.html:50 -msgid "The operating system is up to date now.  " -msgstr "Das Betriebssystem ist nun auf dem neuesten Stand.  " - -#: plinth/modules/upgrades/templates/upgrades.html:53 -msgid "Show Details" -msgstr "Zeige Details" +#: plinth/modules/upgrades/templates/upgrades.html:37 +msgid "" +"Upgrades install the latest software and security updates. When automatic " +"upgrades are enabled, upgrades are automatically run every night. You don't " +"normally need to start the upgrade process." +msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:69 +#: plinth/modules/upgrades/templates/upgrades.html:45 msgid "" -"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." +"Depending on the number of packages to install, this may take a long time to " +"complete. While upgrades are in progress, you will not be able to install " +"other packages. During the upgrade, this web interface may be temporarily " +"unavailable and show an error. Refresh the page to continue." msgstr "" -"Hier werden automatische Updates gestartet welche versuchen werden das " -"System mit den neusten Debian Paketen zu versorgen. Es kann einige Minuten " -"dauern bis dieser Vorgang abgeschlossen ist." -#: plinth/modules/upgrades/templates/upgrades.html:80 +#: plinth/modules/upgrades/templates/upgrades.html:58 msgid "Upgrade now »" msgstr "Updates jetzt durchführen »" -#: plinth/modules/upgrades/templates/upgrades.html:87 -msgid "System is being upgraded." -msgstr "System wir aktualisiert." +#: plinth/modules/upgrades/templates/upgrades.html:65 +#, fuzzy +#| msgid "ejabberd is running" +msgid "A package manager is running." +msgstr "ejabberd läuft" + +#: plinth/modules/upgrades/templates/upgrades.html:70 +msgid "Recent log from upgrades:" +msgstr "" -#: plinth/modules/upgrades/views.py:35 plinth/modules/upgrades/views.py:64 +#: plinth/modules/upgrades/views.py:36 plinth/modules/upgrades/views.py:66 msgid "Automatic Upgrades" msgstr "Automatische Aktualisierungen" -#: plinth/modules/upgrades/views.py:37 +#: plinth/modules/upgrades/views.py:38 msgid "Upgrade Packages" msgstr "Pakete aktualisieren" -#: plinth/modules/upgrades/views.py:75 +#: plinth/modules/upgrades/views.py:96 +#, fuzzy +#| msgid "Upgrade completed." +msgid "Upgrade process started." +msgstr "Aktualisierung beendet." + +#: plinth/modules/upgrades/views.py:99 +#, fuzzy +#| msgid "Upgrade failed." +msgid "Starting upgrade failed." +msgstr "Aktualisierung fehlgeschlagen." + +#: plinth/modules/upgrades/views.py:102 msgid "Package Upgrades" msgstr "Paketaktualisierungen" -#: plinth/modules/upgrades/views.py:116 +#: plinth/modules/upgrades/views.py:131 #, python-brace-format msgid "Error when configuring unattended-upgrades: {error}" msgstr "Fehler beim Konfigurieren von automatischen Aktualisierungen: {error}" -#: plinth/modules/upgrades/views.py:121 +#: plinth/modules/upgrades/views.py:136 msgid "Automatic upgrades enabled" msgstr "Automatische Aktualisierungen eingeschaltet" -#: plinth/modules/upgrades/views.py:123 +#: plinth/modules/upgrades/views.py:138 msgid "Automatic upgrades disabled" msgstr "Automatische Aktualisierungen ausgeschaltet" -#: plinth/modules/upgrades/views.py:142 -msgid "Upgrade completed." -msgstr "Aktualisierung beendet." - -#: plinth/modules/upgrades/views.py:144 -msgid "Upgrade failed." -msgstr "Aktualisierung fehlgeschlagen." - #: plinth/modules/users/__init__.py:36 msgid "Users and Groups" msgstr "Benutzer und Gruppen" @@ -2768,19 +3142,30 @@ msgstr "" msgid "Failed to add new user to {group} group." msgstr "Der Benutzer konnte nicht der Gruppe {group} hinzugefügt werden." -#: plinth/modules/users/forms.py:126 +#: plinth/modules/users/forms.py:92 +msgid "SSH Keys" +msgstr "" + +#: plinth/modules/users/forms.py:96 +msgid "" +"Setting an SSH public key will allow this user to securely log in to the " +"system without using a password. You may enter multiple keys, one on each " +"line. Blank lines and lines starting with # will be ignored." +msgstr "" + +#: plinth/modules/users/forms.py:136 msgid "Renaming LDAP user failed." msgstr "Umbenennen des LDAP Nutzers fehlgeschlagen." -#: plinth/modules/users/forms.py:138 +#: plinth/modules/users/forms.py:148 msgid "Failed to remove user from group." msgstr "Entfernen des Nutzers von der Gruppe fehlgeschlagen." -#: plinth/modules/users/forms.py:149 +#: plinth/modules/users/forms.py:159 msgid "Failed to add user to group." msgstr "Hinzufügen eines Benutzers zur Gruppe ist fehlgeschlagen." -#: plinth/modules/users/forms.py:174 +#: plinth/modules/users/forms.py:188 msgid "Changing LDAP user password failed." msgstr "Ändern des LDAP Benutzerpassworts ist fehlgeschlagen." @@ -2799,7 +3184,7 @@ msgid "Create User" msgstr "Benutzer anlegen" #: plinth/modules/users/templates/users_delete.html:26 -#: plinth/modules/users/views.py:103 +#: plinth/modules/users/views.py:110 msgid "Delete User" msgstr "Benutzer löschen" @@ -2855,20 +3240,20 @@ msgstr "Benutzer %(username)s geändert." msgid "Edit User" msgstr "Benutzer bearbeiten" -#: plinth/modules/users/views.py:113 +#: plinth/modules/users/views.py:120 #, python-brace-format msgid "User {user} deleted." msgstr "Benutzer {user} gelöscht." -#: plinth/modules/users/views.py:120 +#: plinth/modules/users/views.py:127 msgid "Deleting LDAP user failed." msgstr "LDAP Benutzer Löschen fehlgeschlagen." -#: plinth/modules/users/views.py:129 +#: plinth/modules/users/views.py:136 msgid "Change Password" msgstr "Passwort ändern" -#: plinth/modules/users/views.py:130 +#: plinth/modules/users/views.py:137 msgid "Password changed successfully." msgstr "Passwort erfolgreich geändert." @@ -2952,8 +3337,10 @@ msgstr "Web Server über Secure Socket Layer" msgid "Secure Shell (SSH) Server" msgstr "Secure Shell (SSH) Server" -#: plinth/service.py:78 -msgid "FreedomBox Web Interface (Plinth)" +#: plinth/service.py:79 +#, fuzzy, python-brace-format +#| msgid "FreedomBox Web Interface (Plinth)" +msgid "{box_name} Web Interface (Plinth)" msgstr "FreedomBox Web Benutzerschnittstelle (Plinth)" #: plinth/templates/404.html:25 @@ -2990,27 +3377,25 @@ msgstr "" "com/freedombox/Plinth/issues\">Bugtracker, so dass wir es beheben können." #: plinth/templates/base.html:49 -msgid "Plinth administrative interface for the FreedomBox" +#, fuzzy, python-format +#| msgid "Plinth administrative interface for the FreedomBox" +msgid "Plinth administrative interface for the %(box_name)s" msgstr "Plinth Verwaltungsschnittstelle für die FreedomBox" -#: plinth/templates/base.html:52 plinth/templates/base.html.py:88 -msgid "FreedomBox" -msgstr "FreedomBox" - -#: plinth/templates/base.html:81 +#: plinth/templates/base.html:83 msgid "Toggle navigation" msgstr "Navigation umschalten" -#: plinth/templates/base.html:121 plinth/templates/base.html.py:122 +#: plinth/templates/base.html:125 plinth/templates/base.html.py:126 msgid "Change password" msgstr "Passwort ändern" -#: plinth/templates/base.html:125 plinth/templates/base.html.py:126 -#: plinth/templates/base.html:139 plinth/templates/base.html.py:141 +#: plinth/templates/base.html:129 plinth/templates/base.html.py:130 +#: plinth/templates/base.html:143 plinth/templates/base.html.py:145 msgid "Log out" msgstr "Abmelden" -#: plinth/templates/base.html:131 plinth/templates/base.html.py:133 +#: plinth/templates/base.html:135 plinth/templates/base.html.py:137 msgid "Log in" msgstr "Anmelden" @@ -3052,6 +3437,88 @@ msgstr "Installiere %(package_names)s: %(status)s" msgid "%(percentage)s%% complete" msgstr "%(percentage)s%% abgearbeitet" +#~ msgid "show password" +#~ msgstr "Passwort anzeigen" + +#~ msgid "The following is the current status:" +#~ msgstr "Der aktuelle Status ist wie folgt:" + +#~ msgid "Congratulations! Your FreedomBox is up and running!" +#~ msgstr "Glückwunsch! Ihre FreedomBox läuft!" + +#~ msgid "" +#~ "Please provide the following basic information to complete the setup " +#~ "process." +#~ msgstr "" +#~ "Bitte geben Sie die folgenden grundlegenden Informationen an um die " +#~ "Installation abzuschließen." + +#~ msgid "Next" +#~ msgstr "Weiter" + +#~ msgid "FreedomBox Manual" +#~ msgstr "FreedomBox Handbuch" + +#~ msgid "" +#~ "Many FreedomBox contributors and users are also available on the " +#~ "#freedombox channel of the irc.oftc.net IRC network." +#~ msgstr "" +#~ "Viele Mitwirkende bei FreedomBox und Benutzer sind auch über den " +#~ "#freedombox Kanal des irc.oftc.net IRC Netzwerks erreichbar." + +#~ msgid "Create Wiki/Blog" +#~ msgstr "Wiki/Blog anlegen" + +#~ msgid "" +#~ "Select Automatic (DHCP) if you are connecting to an existing wireless " +#~ "network. Shared mode is useful when running an Access Point." +#~ msgstr "" +#~ "Wählen Sie Automatisch (DHCP), wenn Sie zu einem bestehenden drahtlosen " +#~ "Netzwerk verbunden sind. Shared mode ist nützlich bei Verwendung eines " +#~ "Access Points." + +#~ msgid "Tor enabled" +#~ msgstr "Tor eingeschaltet" + +#~ msgid "Tor disabled" +#~ msgstr "Tor ausgeschaltet" + +#~ msgid "Tor hidden service enabled" +#~ msgstr "Tor verborgener Dienst eingeschaltet" + +#~ msgid "Tor hidden service disabled" +#~ msgstr "Tor verborgener Dienst ausgeschaltet" + +#~ msgid "Enabled package download over Tor" +#~ msgstr "Package Download über Tor eingeschaltet" + +#~ msgid "Disabled package download over Tor" +#~ msgstr "Package Download über Tor ausgeschaltet" + +#~ msgid "There was an error while upgrading." +#~ msgstr "Es trat ein Fehler beim automatischen Update auf." + +#~ msgid "Output from unattended-upgrades:" +#~ msgstr "Meldungen der automatischen Aktualisierungen:" + +#~ msgid "The operating system is up to date now.  " +#~ msgstr "Das Betriebssystem ist nun auf dem neuesten Stand.  " + +#~ msgid "Show Details" +#~ msgstr "Zeige Details" + +#~ msgid "" +#~ "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." +#~ msgstr "" +#~ "Hier werden automatische Updates gestartet welche versuchen werden das " +#~ "System mit den neusten Debian Paketen zu versorgen. Es kann einige " +#~ "Minuten dauern bis dieser Vorgang abgeschlossen ist." + +#~ msgid "System is being upgraded." +#~ msgstr "System wir aktualisiert." + #~ msgid "" #~ "You can install and run various services and applications on your " #~ "%(box_name)s." diff --git a/plinth/locale/django.pot b/plinth/locale/django.pot index 0247cfbb4..21eb0148e 100644 --- a/plinth/locale/django.pot +++ b/plinth/locale/django.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-01-24 12:27+0530\n" +"POT-Creation-Date: 2016-01-31 22:19+0530\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -110,7 +110,8 @@ msgstr "" #: plinth/modules/openvpn/templates/openvpn.html:81 #: plinth/modules/privoxy/templates/privoxy.html:48 #: plinth/modules/quassel/templates/quassel.html:50 -#: plinth/modules/tor/templates/tor.html:39 +#: plinth/modules/repro/templates/repro.html:58 +#: plinth/modules/tor/templates/tor.html:48 #: plinth/modules/transmission/templates/transmission.html:42 #: plinth/modules/xmpp/templates/xmpp.html:58 msgid "Status" @@ -133,9 +134,10 @@ msgstr "" #: plinth/modules/owncloud/templates/owncloud.html:51 #: plinth/modules/privoxy/templates/privoxy.html:62 #: plinth/modules/quassel/templates/quassel.html:65 +#: plinth/modules/repro/templates/repro.html:72 #: plinth/modules/roundcube/templates/roundcube.html:62 #: plinth/modules/shaarli/templates/shaarli.html:40 -#: plinth/modules/tor/templates/tor.html:74 +#: plinth/modules/tor/templates/tor.html:92 #: plinth/modules/transmission/templates/transmission.html:56 #: plinth/modules/xmpp/templates/xmpp.html:72 msgid "Configuration" @@ -151,10 +153,11 @@ msgstr "" #: plinth/modules/openvpn/templates/openvpn.html:138 #: plinth/modules/privoxy/templates/privoxy.html:70 #: plinth/modules/quassel/templates/quassel.html:73 +#: plinth/modules/repro/templates/repro.html:80 #: plinth/modules/restore/templates/restore_index.html:54 #: plinth/modules/roundcube/templates/roundcube.html:70 #: plinth/modules/shaarli/templates/shaarli.html:48 -#: plinth/modules/tor/templates/tor.html:82 +#: plinth/modules/tor/templates/tor.html:100 #: plinth/modules/transmission/templates/transmission.html:64 #: plinth/modules/upgrades/templates/upgrades_configure.html:34 #: plinth/modules/xmpp/templates/xmpp.html:80 @@ -166,9 +169,10 @@ msgstr "" #: plinth/modules/dynamicdns/dynamicdns.py:371 #: plinth/modules/ikiwiki/views.py:95 plinth/modules/mumble/views.py:80 #: plinth/modules/openvpn/views.py:142 plinth/modules/privoxy/views.py:83 -#: plinth/modules/quassel/views.py:76 plinth/modules/restore/views.py:68 -#: plinth/modules/roundcube/views.py:84 plinth/modules/shaarli/views.py:74 -#: plinth/modules/transmission/views.py:109 plinth/modules/xmpp/views.py:100 +#: plinth/modules/quassel/views.py:76 plinth/modules/repro/views.py:77 +#: plinth/modules/restore/views.py:68 plinth/modules/roundcube/views.py:84 +#: plinth/modules/shaarli/views.py:74 plinth/modules/transmission/views.py:109 +#: plinth/modules/xmpp/views.py:100 msgid "Configuration updated" msgstr "" @@ -176,9 +180,10 @@ msgstr "" #: plinth/modules/deluge/views.py:82 plinth/modules/ikiwiki/views.py:97 #: plinth/modules/mumble/views.py:82 plinth/modules/openvpn/views.py:144 #: plinth/modules/owncloud/owncloud.py:93 plinth/modules/privoxy/views.py:85 -#: plinth/modules/quassel/views.py:78 plinth/modules/restore/views.py:70 -#: plinth/modules/roundcube/views.py:86 plinth/modules/shaarli/views.py:76 -#: plinth/modules/tor/tor.py:252 plinth/modules/transmission/views.py:111 +#: plinth/modules/quassel/views.py:78 plinth/modules/repro/views.py:79 +#: plinth/modules/restore/views.py:70 plinth/modules/roundcube/views.py:86 +#: plinth/modules/shaarli/views.py:76 plinth/modules/tor/views.py:111 +#: plinth/modules/transmission/views.py:111 #: plinth/modules/upgrades/views.py:118 plinth/modules/xmpp/views.py:102 msgid "Setting unchanged" msgstr "" @@ -2160,6 +2165,54 @@ msgstr "" msgid "Quassel core service is not running" msgstr "" +#: plinth/modules/repro/__init__.py:36 +#: plinth/modules/repro/templates/repro.html:26 +#: plinth/modules/repro/views.py:55 +msgid "SIP Server (repro)" +msgstr "" + +#: plinth/modules/repro/__init__.py:41 +msgid "repro SIP Server" +msgstr "" + +#: plinth/modules/repro/forms.py:29 +msgid "Enable repro service" +msgstr "" + +#: plinth/modules/repro/templates/repro.html:29 +msgid "" +"repro provides various SIP services that a SIP softphone can utilize to " +"provide audio and video calls as well as presence and instant messaging. " +"repro provides a server and SIP user accounts that clients can use to let " +"their presence known. It also acts as a proxy to federate SIP " +"communications to other servers on the Internet similar to email." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:39 +msgid "" +"To make SIP calls, a client application is needed. Available clients include " +"Jitsi (for computers) and CSipSimple (for Android phones)." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:48 +msgid "" +"Note: Before using repro, domains and users will need to " +"be configured using the web-based " +"configuration panel. Users in the admin group will be able to " +"log in to the repro configuration panel. After setting the domain, it is " +"required to restart the repro service. Disable the service and re-enable it." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:63 +msgid "repro service is running" +msgstr "" + +#: plinth/modules/repro/templates/repro.html:66 +msgid "repro service is not running" +msgstr "" + #: plinth/modules/restore/__init__.py:36 #: plinth/modules/restore/templates/restore_index.html:26 #: plinth/modules/restore/views.py:46 @@ -2273,33 +2326,71 @@ msgid "" "The options affect the %(box_name)s at its most general level, so be careful!" msgstr "" -#: plinth/modules/tor/__init__.py:50 -msgid "Tor relay port available" +#: plinth/modules/tor/__init__.py:48 plinth/modules/tor/templates/tor.html:35 +msgid "Anonymity Network (Tor)" +msgstr "" + +#: plinth/modules/tor/__init__.py:53 +msgid "Tor Anonymity Network" msgstr "" #: plinth/modules/tor/__init__.py:58 +msgid "Tor Bridge Relay" +msgstr "" + +#: plinth/modules/tor/__init__.py:76 plinth/modules/tor/views.py:144 +msgid "Tor Hidden Service" +msgstr "" + +#: plinth/modules/tor/__init__.py:222 +msgid "Tor relay port available" +msgstr "" + +#: plinth/modules/tor/__init__.py:230 msgid "Obfs3 transport registered" msgstr "" -#: plinth/modules/tor/__init__.py:64 +#: plinth/modules/tor/__init__.py:236 msgid "Obfs4 transport registered" msgstr "" -#: plinth/modules/tor/__init__.py:101 +#: plinth/modules/tor/__init__.py:273 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "" -#: plinth/modules/tor/__init__.py:112 +#: plinth/modules/tor/__init__.py:284 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "" -#: plinth/modules/tor/templates/tor.html:26 plinth/modules/tor/tor.py:68 -msgid "Anonymity Network (Tor)" +#: plinth/modules/tor/forms.py:32 +msgid "Enable Tor" +msgstr "" + +#: plinth/modules/tor/forms.py:35 +msgid "Enable Tor Hidden Service" +msgstr "" + +#: plinth/modules/tor/forms.py:38 +#, python-brace-format +msgid "" +"A hidden service will allow {box_name} to provide selected services (such as " +"ownCloud or chat) without revealing its location." +msgstr "" + +#: plinth/modules/tor/forms.py:42 +msgid "Download software packages over Tor" +msgstr "" + +#: plinth/modules/tor/forms.py:44 +msgid "" +"When enabled, software will be downloaded over the Tor network for " +"installations and upgrades. This adds a degree of privacy and security " +"during software downloads." msgstr "" -#: plinth/modules/tor/templates/tor.html:29 +#: plinth/modules/tor/templates/tor.html:38 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -2308,28 +2399,32 @@ msgid "" "Tor Browser." msgstr "" -#: plinth/modules/tor/templates/tor.html:44 +#: plinth/modules/tor/templates/tor.html:54 +msgid "Tor configuration is being updated" +msgstr "" + +#: plinth/modules/tor/templates/tor.html:62 msgid "Tor is running" msgstr "" -#: plinth/modules/tor/templates/tor.html:47 +#: plinth/modules/tor/templates/tor.html:65 msgid "Tor is not running" msgstr "" -#: plinth/modules/tor/templates/tor.html:59 +#: plinth/modules/tor/templates/tor.html:77 msgid "Hidden Service" msgstr "" -#: plinth/modules/tor/templates/tor.html:60 -#: plinth/modules/tor/templates/tor.html:102 +#: plinth/modules/tor/templates/tor.html:78 +#: plinth/modules/tor/templates/tor.html:120 msgid "Port" msgstr "" -#: plinth/modules/tor/templates/tor.html:85 +#: plinth/modules/tor/templates/tor.html:103 msgid "Bridge" msgstr "" -#: plinth/modules/tor/templates/tor.html:88 +#: plinth/modules/tor/templates/tor.html:106 #, python-format msgid "" "Your %(box_name)s is configured as a Tor bridge with obfsproxy, so it can " @@ -2338,80 +2433,34 @@ msgid "" "forwarded, if necessary:" msgstr "" -#: plinth/modules/tor/templates/tor.html:101 +#: plinth/modules/tor/templates/tor.html:119 msgid "Service" msgstr "" -#: plinth/modules/tor/templates/tor.html:117 +#: plinth/modules/tor/templates/tor.html:135 msgid "SOCKS" msgstr "" -#: plinth/modules/tor/templates/tor.html:120 +#: plinth/modules/tor/templates/tor.html:138 #, python-format msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "" -#: plinth/modules/tor/tor.py:47 -msgid "Enable Tor" -msgstr "" - -#: plinth/modules/tor/tor.py:50 -msgid "Enable Tor Hidden Service" -msgstr "" - -#: plinth/modules/tor/tor.py:53 -#, python-brace-format -msgid "" -"A hidden service will allow {box_name} to provide selected services (such as " -"ownCloud or chat) without revealing its location." -msgstr "" - -#: plinth/modules/tor/tor.py:57 -msgid "Download software packages over Tor" -msgstr "" - -#: plinth/modules/tor/tor.py:59 -msgid "" -"When enabled, software will be downloaded over the Tor network for " -"installations and upgrades. This adds a degree of privacy and security " -"during software downloads." -msgstr "" - -#: plinth/modules/tor/tor.py:87 plinth/modules/tor/tor.py:287 -msgid "Tor Hidden Service" -msgstr "" - -#: plinth/modules/tor/tor.py:117 +#: plinth/modules/tor/views.py:68 msgid "Tor Control Panel" msgstr "" -#: plinth/modules/tor/tor.py:242 +#: plinth/modules/tor/views.py:79 #, python-brace-format msgid "Action error: {0} [{1}] [{2}]" msgstr "" -#: plinth/modules/tor/tor.py:258 -msgid "Tor enabled" -msgstr "" - -#: plinth/modules/tor/tor.py:261 -msgid "Tor disabled" -msgstr "" - -#: plinth/modules/tor/tor.py:266 -msgid "Tor hidden service enabled" +#: plinth/modules/tor/views.py:148 +msgid "Configuration updated." msgstr "" -#: plinth/modules/tor/tor.py:269 -msgid "Tor hidden service disabled" -msgstr "" - -#: plinth/modules/tor/tor.py:294 -msgid "Enabled package download over Tor" -msgstr "" - -#: plinth/modules/tor/tor.py:297 -msgid "Disabled package download over Tor" +#: plinth/modules/tor/views.py:150 +msgid "An error occurred during configuration." msgstr "" #: plinth/modules/transmission/__init__.py:38 @@ -2577,19 +2626,30 @@ msgstr "" msgid "Failed to add new user to {group} group." msgstr "" -#: plinth/modules/users/forms.py:126 +#: plinth/modules/users/forms.py:92 +msgid "SSH Keys" +msgstr "" + +#: plinth/modules/users/forms.py:96 +msgid "" +"Setting an SSH public key will allow this user to securely log in to the " +"system without using a password. You may enter multiple keys, one on each " +"line. Blank lines and lines starting with # will be ignored." +msgstr "" + +#: plinth/modules/users/forms.py:136 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:138 +#: plinth/modules/users/forms.py:148 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:149 +#: plinth/modules/users/forms.py:159 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:174 +#: plinth/modules/users/forms.py:188 msgid "Changing LDAP user password failed." msgstr "" @@ -2608,7 +2668,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:26 -#: plinth/modules/users/views.py:103 +#: plinth/modules/users/views.py:110 msgid "Delete User" msgstr "" @@ -2661,20 +2721,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:113 +#: plinth/modules/users/views.py:120 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:120 +#: plinth/modules/users/views.py:127 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:129 +#: plinth/modules/users/views.py:136 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:130 +#: plinth/modules/users/views.py:137 msgid "Password changed successfully." msgstr "" diff --git a/plinth/locale/es/LC_MESSAGES/django.po b/plinth/locale/es/LC_MESSAGES/django.po index a63efe932..05cb7ca73 100644 --- a/plinth/locale/es/LC_MESSAGES/django.po +++ b/plinth/locale/es/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-12-20 13:58+0530\n" +"POT-Creation-Date: 2016-01-31 22:19+0530\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -48,11 +48,15 @@ msgstr "" msgid "Cannot connect to {host}:{port}" msgstr "" +#: plinth/context_processors.py:36 +msgid "FreedomBox" +msgstr "" + #: plinth/modules/apps/apps.py:26 msgid "Apps" msgstr "" -#: plinth/modules/apps/apps.py:32 plinth/templates/base.html.py:90 +#: plinth/modules/apps/apps.py:32 plinth/templates/base.html.py:93 msgid "Applications" msgstr "" @@ -87,10 +91,11 @@ msgid "Enable service discovery" msgstr "" #: plinth/modules/avahi/templates/avahi.html:29 +#, python-format msgid "" -"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 " +"Service discovery allows other devices on the network to discover your " +"%(box_name)s and services running on it. It also allows %(box_name)s to " +"discover other devices 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." @@ -99,14 +104,15 @@ msgstr "" #: plinth/modules/avahi/templates/avahi.html:40 #: plinth/modules/datetime/templates/datetime.html:35 #: plinth/modules/deluge/templates/deluge.html:39 -#: plinth/modules/dynamicdns/dynamicdns.py:38 +#: plinth/modules/dynamicdns/dynamicdns.py:39 #: plinth/modules/firewall/templates/firewall.html:57 #: plinth/modules/mumble/templates/mumble.html:44 #: plinth/modules/networks/templates/connection_show.html:261 #: plinth/modules/openvpn/templates/openvpn.html:81 #: plinth/modules/privoxy/templates/privoxy.html:48 #: plinth/modules/quassel/templates/quassel.html:50 -#: plinth/modules/tor/templates/tor.html:39 +#: plinth/modules/repro/templates/repro.html:58 +#: plinth/modules/tor/templates/tor.html:48 #: plinth/modules/transmission/templates/transmission.html:42 #: plinth/modules/xmpp/templates/xmpp.html:58 msgid "Status" @@ -129,9 +135,10 @@ msgstr "" #: plinth/modules/owncloud/templates/owncloud.html:51 #: plinth/modules/privoxy/templates/privoxy.html:62 #: plinth/modules/quassel/templates/quassel.html:65 +#: plinth/modules/repro/templates/repro.html:72 #: plinth/modules/roundcube/templates/roundcube.html:62 #: plinth/modules/shaarli/templates/shaarli.html:40 -#: plinth/modules/tor/templates/tor.html:74 +#: plinth/modules/tor/templates/tor.html:92 #: plinth/modules/transmission/templates/transmission.html:56 #: plinth/modules/xmpp/templates/xmpp.html:72 msgid "Configuration" @@ -147,10 +154,11 @@ msgstr "" #: plinth/modules/openvpn/templates/openvpn.html:138 #: plinth/modules/privoxy/templates/privoxy.html:70 #: plinth/modules/quassel/templates/quassel.html:73 +#: plinth/modules/repro/templates/repro.html:80 #: plinth/modules/restore/templates/restore_index.html:54 #: plinth/modules/roundcube/templates/roundcube.html:70 #: plinth/modules/shaarli/templates/shaarli.html:48 -#: plinth/modules/tor/templates/tor.html:82 +#: plinth/modules/tor/templates/tor.html:100 #: plinth/modules/transmission/templates/transmission.html:64 #: plinth/modules/upgrades/templates/upgrades_configure.html:34 #: plinth/modules/xmpp/templates/xmpp.html:80 @@ -159,12 +167,13 @@ msgstr "" #: plinth/modules/avahi/views.py:73 plinth/modules/datetime/views.py:85 #: plinth/modules/deluge/views.py:80 -#: plinth/modules/dynamicdns/dynamicdns.py:368 +#: plinth/modules/dynamicdns/dynamicdns.py:371 #: plinth/modules/ikiwiki/views.py:95 plinth/modules/mumble/views.py:80 #: plinth/modules/openvpn/views.py:142 plinth/modules/privoxy/views.py:83 -#: plinth/modules/quassel/views.py:76 plinth/modules/restore/views.py:68 -#: plinth/modules/roundcube/views.py:84 plinth/modules/shaarli/views.py:74 -#: plinth/modules/transmission/views.py:105 plinth/modules/xmpp/views.py:100 +#: plinth/modules/quassel/views.py:76 plinth/modules/repro/views.py:77 +#: plinth/modules/restore/views.py:68 plinth/modules/roundcube/views.py:84 +#: plinth/modules/shaarli/views.py:74 plinth/modules/transmission/views.py:109 +#: plinth/modules/xmpp/views.py:100 msgid "Configuration updated" msgstr "" @@ -172,60 +181,63 @@ msgstr "" #: plinth/modules/deluge/views.py:82 plinth/modules/ikiwiki/views.py:97 #: plinth/modules/mumble/views.py:82 plinth/modules/openvpn/views.py:144 #: plinth/modules/owncloud/owncloud.py:93 plinth/modules/privoxy/views.py:85 -#: plinth/modules/quassel/views.py:78 plinth/modules/restore/views.py:70 -#: plinth/modules/roundcube/views.py:86 plinth/modules/shaarli/views.py:76 -#: plinth/modules/tor/tor.py:250 plinth/modules/transmission/views.py:107 -#: plinth/modules/upgrades/views.py:103 plinth/modules/xmpp/views.py:102 +#: plinth/modules/quassel/views.py:78 plinth/modules/repro/views.py:79 +#: plinth/modules/restore/views.py:70 plinth/modules/roundcube/views.py:86 +#: plinth/modules/shaarli/views.py:76 plinth/modules/tor/views.py:111 +#: plinth/modules/transmission/views.py:111 +#: plinth/modules/upgrades/views.py:118 plinth/modules/xmpp/views.py:102 msgid "Setting unchanged" msgstr "" -#: plinth/modules/config/config.py:83 plinth/modules/config/config.py:120 -#: plinth/modules/dynamicdns/dynamicdns.py:145 +#: plinth/modules/config/config.py:84 plinth/modules/config/config.py:121 +#: plinth/modules/dynamicdns/dynamicdns.py:148 msgid "Invalid domain name" msgstr "" -#: plinth/modules/config/config.py:94 +#: plinth/modules/config/config.py:95 msgid "Hostname" msgstr "" -#: plinth/modules/config/config.py:96 +#: plinth/modules/config/config.py:97 +#, python-brace-format msgid "" -"Hostname is the local name by which other machines on the local network " -"reach your machine. It must start and end with an alphabet or a digit and " -"have as interior characters only alphabets, digits and hyphens. Total " +"Hostname is the local name by which other devices on the local network can " +"reach your {box_name}. It must start and end with an alphabet or a digit " +"and have as interior characters only alphabets, digits and hyphens. Total " "length must be 63 characters or less." msgstr "" -#: plinth/modules/config/config.py:104 +#: plinth/modules/config/config.py:105 msgid "Invalid hostname" msgstr "" -#: plinth/modules/config/config.py:107 plinth/modules/config/config.py:153 +#: plinth/modules/config/config.py:108 plinth/modules/config/config.py:153 #: plinth/modules/config/config.py:265 -#: plinth/modules/dynamicdns/dynamicdns.py:140 +#: plinth/modules/dynamicdns/dynamicdns.py:143 msgid "Domain Name" msgstr "" -#: plinth/modules/config/config.py:109 +#: plinth/modules/config/config.py:110 +#, python-brace-format msgid "" -"Domain name is the global name by which other machines on the Internet can " -"reach you. It must consist of labels separated by dots. Each label must " -"start and end with an alphabet or a digit and have as interior characters " -"only alphabets, digits and hyphens. Length of each label must be 63 " -"characters or less. Total length of domain name must be 253 characters or " -"less." +"Domain name is the global name by which other devices on the Internet can " +"reach your {box_name}. It must consist of labels separated by dots. Each " +"label must start and end with an alphabet or a digit and have as interior " +"characters only alphabets, digits and hyphens. Length of each label must be " +"63 characters or less. Total length of domain name must be 253 characters " +"or less." msgstr "" -#: plinth/modules/config/config.py:124 +#: plinth/modules/config/config.py:125 msgid "Language" msgstr "" -#: plinth/modules/config/config.py:126 -msgid "Language for this FreedomBox web administration interface" +#: plinth/modules/config/config.py:127 +msgid "Language for this web administration interface" msgstr "" #: plinth/modules/config/config.py:135 -#: plinth/modules/dynamicdns/dynamicdns.py:36 +#: plinth/modules/dynamicdns/dynamicdns.py:37 #: plinth/modules/ikiwiki/views.py:36 msgid "Configure" msgstr "" @@ -412,147 +424,151 @@ msgstr "" msgid "Result" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:34 plinth/modules/help/help.py:40 +#: plinth/modules/dynamicdns/dynamicdns.py:35 plinth/modules/help/help.py:40 msgid "About" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:44 -#: plinth/modules/dynamicdns/dynamicdns.py:53 +#: plinth/modules/dynamicdns/dynamicdns.py:45 +#: plinth/modules/dynamicdns/dynamicdns.py:54 msgid "Dynamic DNS" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:70 +#: plinth/modules/dynamicdns/dynamicdns.py:71 msgid "" "The Variables <User>, <Pass>, <Ip>, <Domain> may be " "used within the URL. For details see the update URL templates of the example " "providers." msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:74 +#: plinth/modules/dynamicdns/dynamicdns.py:75 msgid "" "Please choose an update protocol according to your provider. If your " "provider does not support the GnudIP protocol or your provider is not listed " "you may use the update URL of your provider." msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:79 +#: plinth/modules/dynamicdns/dynamicdns.py:80 msgid "" "Please do not enter a URL here (like \"https://example.com/\") but only the " -"hostname of the GnuDIP server (like \"example.pcom\")." +"hostname of the GnuDIP server (like \"example.com\")." msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:83 -msgid "The public domain name you want use to reach your box." +#: plinth/modules/dynamicdns/dynamicdns.py:84 +#, python-brace-format +msgid "The public domain name you want use to reach your {box_name}." msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:85 +#: plinth/modules/dynamicdns/dynamicdns.py:87 msgid "Use this option if your provider uses self signed certificates." msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:88 +#: plinth/modules/dynamicdns/dynamicdns.py:90 msgid "" "If this option is selected, your username and password will be used for HTTP " "basic authentication." msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:91 +#: plinth/modules/dynamicdns/dynamicdns.py:93 msgid "" "Leave this field empty if you want to keep your previous configured password." msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:94 +#: plinth/modules/dynamicdns/dynamicdns.py:96 +#, python-brace-format msgid "" -"Optional Value. If your FreedomBox is not connected directly to the Internet " +"Optional Value. If your {box_name} is not connected directly to the Internet " "(i.e. connected to a NAT router) this URL is used to figure out the real " -"Internet IP. The URL should simply return the IP wherethe client comes from. " -"Example: http://myip.datasystems24.de" +"Internet IP. The URL should simply return the IP where the client comes from " +"(example: http://myip.datasystems24.de)." msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:101 +#: plinth/modules/dynamicdns/dynamicdns.py:104 msgid "" "You should have been requested to select a username when you created the " "account." msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:112 +#: plinth/modules/dynamicdns/dynamicdns.py:115 msgid "Enable Dynamic DNS" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:115 +#: plinth/modules/dynamicdns/dynamicdns.py:118 msgid "Service type" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:120 +#: plinth/modules/dynamicdns/dynamicdns.py:123 msgid "GnudIP Server Address" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:125 +#: plinth/modules/dynamicdns/dynamicdns.py:128 msgid "Invalid server name" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:128 +#: plinth/modules/dynamicdns/dynamicdns.py:131 msgid "Update URL" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:132 -msgid "accept all SSL certificates" +#: plinth/modules/dynamicdns/dynamicdns.py:135 +msgid "Accept all SSL certificates" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:136 -msgid "use HTTP basic authentication" +#: plinth/modules/dynamicdns/dynamicdns.py:139 +msgid "Use HTTP basic authentication" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:148 -#: plinth/modules/networks/forms.py:118 plinth/modules/transmission/forms.py:39 +#: plinth/modules/dynamicdns/dynamicdns.py:151 +#: plinth/modules/networks/forms.py:146 plinth/modules/transmission/forms.py:39 msgid "Username" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:151 -#: plinth/modules/networks/forms.py:119 plinth/modules/transmission/forms.py:43 +#: plinth/modules/dynamicdns/dynamicdns.py:154 +#: plinth/modules/networks/forms.py:147 plinth/modules/transmission/forms.py:43 msgid "Password" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:154 -msgid "show password" +#: plinth/modules/dynamicdns/dynamicdns.py:157 +#: plinth/modules/networks/forms.py:149 +msgid "Show password" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:158 +#: plinth/modules/dynamicdns/dynamicdns.py:161 msgid "IP check URL" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:184 +#: plinth/modules/dynamicdns/dynamicdns.py:187 msgid "Please provide update URL or a GnuDIP Server" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:187 +#: plinth/modules/dynamicdns/dynamicdns.py:190 msgid "Please provide GnuDIP username" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:190 +#: plinth/modules/dynamicdns/dynamicdns.py:193 msgid "Please provide GnuDIP domain" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:195 +#: plinth/modules/dynamicdns/dynamicdns.py:198 msgid "Please provide a password" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:214 +#: plinth/modules/dynamicdns/dynamicdns.py:217 msgid "Configure Dynamic DNS" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:236 +#: plinth/modules/dynamicdns/dynamicdns.py:239 msgid "Status of Dynamic DNS" msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns.html:25 -msgid "DynamicDNS client" +msgid "Dynamic DNS Client" msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns.html:28 +#, python-format msgid "" "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)." +"may find the services which are provided by %(box_name)s, such as ownCloud." msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns.html:37 @@ -562,7 +578,7 @@ msgid "" "allows you to push your current public IP address to an gnudip 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." +"Internet asks for your DNS name he will get your current IP answered." msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns.html:50 @@ -575,10 +591,10 @@ msgid "" msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns.html:61 +#, python-format msgid "" -"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." +"If your %(box_name)s is connected behind some NAT router, don't forget to " +"add port forwarding (i.e. forward some standard ports like 80 and 443)." msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns_configure.html:30 @@ -598,16 +614,16 @@ msgid "" msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:35 -msgid "Direct connection to the internet." +msgid "Direct connection to the Internet." msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:37 #, python-format msgid "" -"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)s minutes until we " -"update your DNS entry in case of WAN IP change." +"Behind NAT. This means that Dynamic DNS service will poll the \"IP check URL" +"\" for changes (the \"IP check URL\" entry is needed for this - otherwise IP " +"changes will not be detected). In case the WAN IP changes, it may take up " +"to %(timer)s minutes until your DNS entry is updated." msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:48 @@ -623,13 +639,13 @@ msgstr "" #: plinth/modules/firewall/templates/firewall.html:28 #, python-format msgid "" -"Firewall is a network security system that controls the incoming and " -"outgoing network traffic on your %(box_name)s. Keeping a firewall enabled " -"and properly configured reduces risk of security threat from the Internet." +"Firewall is a security system that controls the incoming and outgoing " +"network traffic on your %(box_name)s. Keeping a firewall enabled and " +"properly configured reduces risk of security threat from the Internet." msgstr "" #: plinth/modules/firewall/templates/firewall.html:36 -msgid "The following is the current status:" +msgid "Current status:" msgstr "" #: plinth/modules/firewall/templates/firewall.html:41 @@ -646,11 +662,13 @@ msgid "Service/Port" msgstr "" #: plinth/modules/firewall/templates/firewall.html:67 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:91 #: plinth/modules/names/templates/names.html:51 msgid "Enabled" msgstr "" #: plinth/modules/firewall/templates/firewall.html:70 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:93 #: plinth/modules/names/templates/names.html:53 msgid "Disabled" msgstr "" @@ -674,8 +692,8 @@ msgstr "" #: plinth/modules/firewall/templates/firewall.html:103 msgid "" "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." +"also permitted in the firewall and when you disable a service it is also " +"disabled in the firewall." msgstr "" #: plinth/modules/first_boot/forms.py:48 plinth/modules/users/forms.py:70 @@ -690,31 +708,35 @@ msgstr "" msgid "User account created, you are now logged in" msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state0.html:50 -msgid "Congratulations! Your FreedomBox is up and running!" +#: plinth/modules/first_boot/templates/firstboot_navbar.html:23 +#: plinth/modules/help/templates/help_index.html:25 +#: plinth/templates/base.html:102 +msgid "Help" msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state0.html:54 -msgid "" -"Please provide the following basic information to complete the setup process." +#: plinth/modules/first_boot/templates/firstboot_state0.html:45 +msgid "Start Setup" msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state0.html:62 -msgid "Next" +#: plinth/modules/first_boot/templates/firstboot_state0.html:49 +#, python-format +msgid "" +"To complete the setup of your %(box_name)s, please provide some basic " +"information." msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state1.html:39 +#: plinth/modules/first_boot/templates/firstboot_state1.html:41 msgid "Administrator Account" msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state1.html:42 +#: plinth/modules/first_boot/templates/firstboot_state1.html:44 msgid "" "Choose a username and password to access this web interface. The password " "can be changed later. This user will be granted administrative privileges. " "Other users can be added later." msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state1.html:55 +#: plinth/modules/first_boot/templates/firstboot_state1.html:57 msgid "Box it up!" msgstr "" @@ -723,28 +745,29 @@ msgid "Setup Complete!" msgstr "" #: plinth/modules/first_boot/templates/firstboot_state10.html:32 +#, python-format msgid "" -"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." +"%(box_name)s setup is now complete. To make your %(box_name)s functional, " +"you need some applications. They will be installed the first time you " +"access them." msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state10.html:40 -msgid "" -"To make your FreedomBox functional, you need some applications. " -"Applications will be installed the first time you access them." +#: plinth/modules/first_boot/templates/firstboot_state10.html:41 +msgid "Go to Apps" msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state10.html:47 -msgid "Network Configuration" +#: plinth/modules/first_boot/templates/firstboot_state10.html:44 +msgid "Current Network Configuration" msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state10.html:54 -msgid "Go to Networks" +#: plinth/modules/first_boot/templates/firstboot_state10.html:47 +msgid "" +"You should check the network setup and modify it if necessary. Do not forget " +"to change the default Wi-Fi passwords!" msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state10.html:59 -msgid "Go to Apps" +#: plinth/modules/first_boot/templates/firstboot_state10.html:57 +msgid "Go to Networks" msgstr "" #: plinth/modules/first_boot/views.py:60 @@ -759,8 +782,8 @@ msgstr "" msgid "Where to Get Help" msgstr "" -#: plinth/modules/help/help.py:38 plinth/modules/help/help.py:72 -msgid "FreedomBox Manual" +#: plinth/modules/help/help.py:38 +msgid "Manual" msgstr "" #: plinth/modules/help/help.py:48 @@ -772,15 +795,21 @@ msgstr "" msgid "About {box_name}" msgstr "" +#: plinth/modules/help/help.py:73 +#, python-brace-format +msgid "{box_name} Manual" +msgstr "" + #: plinth/modules/help/templates/help_about.html:30 +#, python-format msgid "" -"FreedomBox is a community project to develop, design and promote personal " +"%(box_name)s 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." +"and a Tor relay, on a device that can replace your Wi-Fi router, so that " +"your data stays with you." msgstr "" #: plinth/modules/help/templates/help_about.html:43 @@ -794,68 +823,76 @@ msgid "" msgstr "" #: plinth/modules/help/templates/help_about.html:56 +#, python-format msgid "" "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." +"services; %(box_name)s aims to bring them all together in a convenient " +"package." msgstr "" #: plinth/modules/help/templates/help_about.html:64 +#, python-format msgid "" -"For more information about the FreedomBox project, see the FreedomBox Wiki." +"For more information about the %(box_name)s project, see the %(box_name)s Wiki." msgstr "" -#: plinth/modules/help/templates/help_about.html:72 +#: plinth/modules/help/templates/help_about.html:73 msgid "Learn more »" msgstr "" -#: plinth/modules/help/templates/help_about.html:75 +#: plinth/modules/help/templates/help_about.html:76 #, python-format msgid "You are running Plinth version %(version)s." msgstr "" -#: plinth/modules/help/templates/help_index.html:25 -#: plinth/templates/base.html:98 -msgid "Help" +#: plinth/modules/help/templates/help_base.html:36 +#, python-format +msgid "%(box_name)s Setup" msgstr "" #: plinth/modules/help/templates/help_index.html:29 #, python-format msgid "" -"The FreedomBox Manual is the best place to " +"The %(box_name)s Manual is the best place to " "start for information regarding %(box_name)s." msgstr "" #: plinth/modules/help/templates/help_index.html:36 +#, python-format msgid "" -" FreedomBox " -"project wiki contains further information." +" " +"%(box_name)s project wiki contains further information." msgstr "" #: plinth/modules/help/templates/help_index.html:43 +#, python-format msgid "" -"To seek help from FreedomBox community, queries may be posted on the " -"mailing list. The list archives also contain information about problems " -"faced by other users and possible solutions." +"To seek help from %(box_name)s community, queries may be posted on the mailing list. The list archives also contain information about " +"problems faced by other users and possible solutions." msgstr "" #: plinth/modules/help/templates/help_index.html:53 +#, python-format msgid "" -"Many FreedomBox contributors and users are also available on the #freedombox " -"channel of the irc.oftc.net IRC network." +"Many %(box_name)s contributors and users are also available on the irc.oftc." +"net IRC network. Join and request help on the #freedombox " +"channel using the IRC web interface." msgstr "" #: plinth/modules/ikiwiki/__init__.py:38 -msgid "Wiki & Blog (Ikiwiki)" +msgid "Wiki and Blog (ikiwiki)" msgstr "" #: plinth/modules/ikiwiki/__init__.py:43 -msgid "Ikiwiki wikis and blogs" +msgid "ikiwiki wikis and blogs" msgstr "" #: plinth/modules/ikiwiki/forms.py:29 -msgid "Enable Ikiwiki" +msgid "Enable ikiwiki" msgstr "" #: plinth/modules/ikiwiki/forms.py:36 @@ -884,21 +921,22 @@ msgstr "" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:27 #, python-format -msgid "Delete Wiki/Blog %(name)s" +msgid "Delete Wiki or Blog %(name)s" msgstr "" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:33 msgid "" "This action will remove all the posts, pages and comments including revision " -"history. Delete this wiki/blog permanently?" +"history. Delete this wiki or blog permanently?" msgstr "" -#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:43 +#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:44 #, python-format msgid "Delete %(name)s" msgstr "" -#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:46 +#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:47 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:60 #: plinth/modules/networks/templates/connections_delete.html:41 #: plinth/modules/users/templates/users_delete.html:41 msgid "Cancel" @@ -931,7 +969,7 @@ msgid "Create" msgstr "" #: plinth/modules/ikiwiki/views.py:73 -msgid "Wiki & Blog" +msgid "Wiki and Blog" msgstr "" #: plinth/modules/ikiwiki/views.py:106 @@ -939,7 +977,7 @@ msgid "Manage Wikis and Blogs" msgstr "" #: plinth/modules/ikiwiki/views.py:132 -msgid "Create Wiki/Blog" +msgid "Create Wiki or Blog" msgstr "" #: plinth/modules/ikiwiki/views.py:145 @@ -973,7 +1011,144 @@ msgid "Could not delete {name}: {error}" msgstr "" #: plinth/modules/ikiwiki/views.py:182 -msgid "Delete Wiki/Blog" +msgid "Delete Wiki or Blog" +msgstr "" + +#: plinth/modules/letsencrypt/__init__.py:43 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:38 +#: plinth/modules/letsencrypt/views.py:45 +msgid "Certificates (Let's Encrypt)" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:41 +#, python-format +msgid "" +"A digital certficate allows users of a web service to verify the identity of " +"the service and to securely communicate with it. %(box_name)s can " +"automatically obtain and setup digital certificates for each available " +"domain. It does so by proving itself to be the owner of a domain to Let's " +"Encrypt, a certficate authority (CA)." +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:52 +msgid "" +"Let's Encrypt is a free, automated, and open certificate authority, run for " +"the public’s benefit by the Internet Security Research Group (ISRG). Please " +"read and agree with the Let's Encrypt Subscriber Agreement before using this service." +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:66 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:70 +msgid "Domain" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:67 +msgid "Certificate Status" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:68 +msgid "Website Security" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:69 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:72 +msgid "Actions" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:79 +#, python-format +msgid "Expires on %(expiry_date)s" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:85 +msgid "No certficate" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:102 +msgid "Revoke" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:108 +msgid "Re-obtain" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:115 +msgid "Obtain" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:55 +#, python-brace-format +msgid "Certificate successfully revoked for domain {domain}" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:60 +#, python-brace-format +msgid "Failed to revoke certificate for domain {domain}: {error}" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:72 +#, python-brace-format +msgid "Certificate successfully obtained for domain {domain}" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:77 +#, python-brace-format +msgid "Failed to obtain certificate for domain {domain}: {error}" +msgstr "" + +#: plinth/modules/monkeysphere/__init__.py:32 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:35 +#: plinth/modules/monkeysphere/views.py:44 +msgid "Monkeysphere" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:38 +msgid "" +"With Monkeysphere, a PGP key can be generated for each configured domain " +"serving SSH. The PGP public key can then be uploaded to the PGP keyservers. " +"Users connecting to this machine through SSH can verify that they are " +"connecting to the correct host. For users to trust the key, at least one " +"person (usually the machine owner) must sign the key using the regular PGP " +"key signing process. See the Monkeysphere SSH documentation for more details." +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:53 +msgid "Publishing key to keyserver..." +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:71 +msgid "GPG Fingerprint" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:83 +#: plinth/modules/names/views.py:45 +msgid "Not Available" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:93 +msgid "Generate PGP Key" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:101 +msgid "Publish Key" +msgstr "" + +#: plinth/modules/monkeysphere/views.py:58 +msgid "Generated PGP key." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:83 +msgid "Cancelled key publishing." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:120 +msgid "Published key to keyserver." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:122 +msgid "Error occurred while publishing key." msgstr "" #: plinth/modules/mumble/__init__.py:38 @@ -1011,170 +1186,151 @@ msgstr "" msgid "Mumble server is not running" msgstr "" -#: plinth/modules/names/__init__.py:30 +#: plinth/modules/names/__init__.py:29 msgid "HTTP" msgstr "" -#: plinth/modules/names/__init__.py:31 +#: plinth/modules/names/__init__.py:30 msgid "HTTPS" msgstr "" -#: plinth/modules/names/__init__.py:32 +#: plinth/modules/names/__init__.py:31 msgid "SSH" msgstr "" -#: plinth/modules/names/__init__.py:46 plinth/modules/names/views.py:34 +#: plinth/modules/names/__init__.py:45 plinth/modules/names/views.py:34 msgid "Name Services" msgstr "" -#: plinth/modules/names/__init__.py:107 -msgid "Not Available" -msgstr "" - #: plinth/modules/networks/__init__.py:108 #, python-brace-format msgid "Using DNSSEC on IPv{kind}" msgstr "" #: plinth/modules/networks/forms.py:30 -msgid "-- select --" -msgstr "" - -#: plinth/modules/networks/forms.py:42 msgid "Connection Type" msgstr "" -#: plinth/modules/networks/forms.py:49 plinth/modules/networks/forms.py:106 -#: plinth/modules/networks/forms.py:133 +#: plinth/modules/networks/forms.py:37 msgid "Connection Name" msgstr "" -#: plinth/modules/networks/forms.py:51 plinth/modules/networks/forms.py:108 -#: plinth/modules/networks/forms.py:135 +#: plinth/modules/networks/forms.py:39 msgid "Physical Interface" msgstr "" -#: plinth/modules/networks/forms.py:53 plinth/modules/networks/forms.py:110 -#: plinth/modules/networks/forms.py:137 +#: plinth/modules/networks/forms.py:41 msgid "The network device that this connection should be bound to." msgstr "" -#: plinth/modules/networks/forms.py:56 plinth/modules/networks/forms.py:113 -#: plinth/modules/networks/forms.py:140 +#: plinth/modules/networks/forms.py:44 msgid "Firewall Zone" msgstr "" -#: plinth/modules/networks/forms.py:57 plinth/modules/networks/forms.py:114 -#: plinth/modules/networks/forms.py:141 +#: plinth/modules/networks/forms.py:45 msgid "" "The firewall zone will control which services are available over this " "interfaces. Select Internal only for trusted networks." msgstr "" -#: plinth/modules/networks/forms.py:61 plinth/modules/networks/forms.py:162 +#: plinth/modules/networks/forms.py:49 msgid "IPv4 Addressing Method" msgstr "" -#: plinth/modules/networks/forms.py:62 +#: plinth/modules/networks/forms.py:50 msgid "" "\"Shared\" method will start a DHCP server and \"Automatic\" method will " "acquire configuration from a DHCP server." msgstr "" -#: plinth/modules/networks/forms.py:68 plinth/modules/networks/forms.py:170 +#: plinth/modules/networks/forms.py:56 msgid "Address" msgstr "" -#: plinth/modules/networks/forms.py:72 plinth/modules/networks/forms.py:174 +#: plinth/modules/networks/forms.py:60 msgid "Netmask" msgstr "" -#: plinth/modules/networks/forms.py:73 plinth/modules/networks/forms.py:175 +#: plinth/modules/networks/forms.py:61 msgid "" "Optional value. If left blank, a default netmask based on the address will " "be used." msgstr "" -#: plinth/modules/networks/forms.py:78 plinth/modules/networks/forms.py:180 +#: plinth/modules/networks/forms.py:66 #: plinth/modules/networks/templates/connection_show.html:202 #: plinth/modules/networks/templates/connection_show.html:241 msgid "Gateway" msgstr "" -#: plinth/modules/networks/forms.py:79 plinth/modules/networks/forms.py:181 +#: plinth/modules/networks/forms.py:67 msgid "Optional value." msgstr "" -#: plinth/modules/networks/forms.py:83 plinth/modules/networks/forms.py:185 +#: plinth/modules/networks/forms.py:71 msgid "DNS Server" msgstr "" -#: plinth/modules/networks/forms.py:84 plinth/modules/networks/forms.py:186 +#: plinth/modules/networks/forms.py:72 msgid "" "Optional value. If this value is given and IPv4 addressing method is " "\"Automatic\", the DNS Servers provided by a DHCP server will be ignored." msgstr "" -#: plinth/modules/networks/forms.py:90 plinth/modules/networks/forms.py:192 +#: plinth/modules/networks/forms.py:78 msgid "Second DNS Server" msgstr "" -#: plinth/modules/networks/forms.py:91 plinth/modules/networks/forms.py:193 +#: plinth/modules/networks/forms.py:79 msgid "" "Optional value. If this value is given and IPv4 Addressing Method is " "\"Automatic\", the DNS Servers provided by a DHCP server will be ignored." msgstr "" -#: plinth/modules/networks/forms.py:121 -msgid "Show password" +#: plinth/modules/networks/forms.py:89 +msgid "-- select --" msgstr "" -#: plinth/modules/networks/forms.py:145 +#: plinth/modules/networks/forms.py:175 #: plinth/modules/networks/templates/connection_show.html:144 msgid "SSID" msgstr "" -#: plinth/modules/networks/forms.py:146 +#: plinth/modules/networks/forms.py:176 msgid "The visible name of the network." msgstr "" -#: plinth/modules/networks/forms.py:148 +#: plinth/modules/networks/forms.py:178 #: plinth/modules/networks/templates/connection_show.html:157 msgid "Mode" msgstr "" -#: plinth/modules/networks/forms.py:153 +#: plinth/modules/networks/forms.py:183 msgid "Authentication Mode" msgstr "" -#: plinth/modules/networks/forms.py:154 +#: plinth/modules/networks/forms.py:184 msgid "" "Select WPA if the wireless network is secured and requires clients to have " "the password to connect." msgstr "" -#: plinth/modules/networks/forms.py:158 +#: plinth/modules/networks/forms.py:188 msgid "Passphrase" msgstr "" -#: plinth/modules/networks/forms.py:166 -msgid "" -"Select Automatic (DHCP) if you are connecting to an existing wireless " -"network. Shared mode is useful when running an Access Point." -msgstr "" - #: plinth/modules/networks/networks.py:36 #: plinth/modules/networks/networks.py:56 msgid "Network Connections" msgstr "" #: plinth/modules/networks/networks.py:38 -#: plinth/modules/networks/networks.py:273 +#: plinth/modules/networks/networks.py:242 msgid "Nearby Wi-Fi Networks" msgstr "" #: plinth/modules/networks/networks.py:40 -#: plinth/modules/networks/networks.py:295 +#: plinth/modules/networks/networks.py:264 msgid "Add Connection" msgstr "" @@ -1198,58 +1354,58 @@ msgstr "" msgid "This type of connection is not yet understood." msgstr "" -#: plinth/modules/networks/networks.py:170 -#: plinth/modules/networks/networks.py:229 +#: plinth/modules/networks/networks.py:139 +#: plinth/modules/networks/networks.py:198 #: plinth/modules/networks/templates/connections_edit.html:34 msgid "Edit Connection" msgstr "" -#: plinth/modules/networks/networks.py:240 +#: plinth/modules/networks/networks.py:209 #, python-brace-format msgid "Activated connection {name}." msgstr "" -#: plinth/modules/networks/networks.py:243 +#: plinth/modules/networks/networks.py:212 msgid "Failed to activate connection: Connection not found." msgstr "" -#: plinth/modules/networks/networks.py:247 +#: plinth/modules/networks/networks.py:216 #, python-brace-format msgid "Failed to activate connection {name}: No suitable device is available." msgstr "" -#: plinth/modules/networks/networks.py:260 +#: plinth/modules/networks/networks.py:229 #, python-brace-format msgid "Deactivated connection {name}." msgstr "" -#: plinth/modules/networks/networks.py:263 +#: plinth/modules/networks/networks.py:232 msgid "Failed to de-activate connection: Connection not found." msgstr "" -#: plinth/modules/networks/networks.py:325 +#: plinth/modules/networks/networks.py:282 msgid "Adding New Ethernet Connection" msgstr "" -#: plinth/modules/networks/networks.py:350 +#: plinth/modules/networks/networks.py:300 msgid "Adding New PPPoE Connection" msgstr "" -#: plinth/modules/networks/networks.py:399 +#: plinth/modules/networks/networks.py:332 msgid "Adding New Wi-Fi Connection" msgstr "" -#: plinth/modules/networks/networks.py:413 +#: plinth/modules/networks/networks.py:346 #, python-brace-format msgid "Connection {name} deleted." msgstr "" -#: plinth/modules/networks/networks.py:416 -#: plinth/modules/networks/networks.py:425 +#: plinth/modules/networks/networks.py:349 +#: plinth/modules/networks/networks.py:358 msgid "Failed to delete connection: Connection not found." msgstr "" -#: plinth/modules/networks/networks.py:430 +#: plinth/modules/networks/networks.py:363 #: plinth/modules/networks/templates/connections_delete.html:26 msgid "Delete Connection" msgstr "" @@ -1259,7 +1415,7 @@ msgid "Edit connection" msgstr "" #: plinth/modules/networks/templates/connection_show.html:43 -#: plinth/templates/base.html:119 +#: plinth/templates/base.html:123 msgid "Edit" msgstr "" @@ -1406,23 +1562,24 @@ msgstr "" #: plinth/modules/networks/templates/connection_show.html:280 msgid "" -"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." +"This interface should be connected to a 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." msgstr "" #: plinth/modules/networks/templates/connection_show.html:300 msgid "" -"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." +"This interface should receive your Internet connection. If you connect it to " +"a local network/machine, many services meant to available only internally " +"will not be available." msgstr "" #: plinth/modules/networks/templates/connection_show.html:319 +#, python-format msgid "" -"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 " +"This interface is not maintained by %(box_name)s. Its security status is " +"unknown to %(box_name)s. Many %(box_name)s services may not be available on " +"this interface. It is recommended that you deactivate or delete this " "connection and re-configure it." msgstr "" @@ -1514,7 +1671,7 @@ msgstr "" #, python-format msgid "" "Virtual Private Network (VPN) is a technique for securely connecting two " -"machines in order to access resources of a private network. While you are " +"devices in order to access resources of a private network. While you are " "away from home, you can connect to your %(box_name)s in order to join your " "home network and access private/internal services provided by %(box_name)s. " "You can also access the rest of the Internet via %(box_name)s for added " @@ -1531,7 +1688,7 @@ msgid "" "To connect to %(box_name)s'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 documentation on recommended clients and instructions on how to " "configure them." msgstr "" @@ -2009,6 +2166,54 @@ msgstr "" msgid "Quassel core service is not running" msgstr "" +#: plinth/modules/repro/__init__.py:36 +#: plinth/modules/repro/templates/repro.html:26 +#: plinth/modules/repro/views.py:55 +msgid "SIP Server (repro)" +msgstr "" + +#: plinth/modules/repro/__init__.py:41 +msgid "repro SIP Server" +msgstr "" + +#: plinth/modules/repro/forms.py:29 +msgid "Enable repro service" +msgstr "" + +#: plinth/modules/repro/templates/repro.html:29 +msgid "" +"repro provides various SIP services that a SIP softphone can utilize to " +"provide audio and video calls as well as presence and instant messaging. " +"repro provides a server and SIP user accounts that clients can use to let " +"their presence known. It also acts as a proxy to federate SIP " +"communications to other servers on the Internet similar to email." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:39 +msgid "" +"To make SIP calls, a client application is needed. Available clients include " +"Jitsi (for computers) and CSipSimple (for Android phones)." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:48 +msgid "" +"Note: Before using repro, domains and users will need to " +"be configured using the web-based " +"configuration panel. Users in the admin group will be able to " +"log in to the repro configuration panel. After setting the domain, it is " +"required to restart the repro service. Disable the service and re-enable it." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:63 +msgid "repro service is running" +msgstr "" + +#: plinth/modules/repro/templates/repro.html:66 +msgid "repro service is not running" +msgstr "" + #: plinth/modules/restore/__init__.py:36 #: plinth/modules/restore/templates/restore_index.html:26 #: plinth/modules/restore/views.py:46 @@ -2029,8 +2234,8 @@ msgid "" "reStore is a server for unhosted web " "applications. The idea is to uncouple web applications from data. No " "matter where a web application is served from, the data can be stored on an " -"unhosted storage server of user's choice. With reStore, your " -"%(cfg.box_name)s becomes your unhosted storage server." +"unhosted storage server of user's choice. With reStore, your %(box_name)s " +"becomes your unhosted storage server." msgstr "" #: plinth/modules/restore/templates/restore_index.html:40 @@ -2107,7 +2312,7 @@ msgstr "" #: plinth/modules/system/system.py:33 #: plinth/modules/system/templates/system.html:25 -#: plinth/templates/base.html:105 +#: plinth/templates/base.html:109 msgid "System Configuration" msgstr "" @@ -2122,33 +2327,71 @@ msgid "" "The options affect the %(box_name)s at its most general level, so be careful!" msgstr "" -#: plinth/modules/tor/__init__.py:50 -msgid "Tor relay port available" +#: plinth/modules/tor/__init__.py:48 plinth/modules/tor/templates/tor.html:35 +msgid "Anonymity Network (Tor)" +msgstr "" + +#: plinth/modules/tor/__init__.py:53 +msgid "Tor Anonymity Network" msgstr "" #: plinth/modules/tor/__init__.py:58 +msgid "Tor Bridge Relay" +msgstr "" + +#: plinth/modules/tor/__init__.py:76 plinth/modules/tor/views.py:144 +msgid "Tor Hidden Service" +msgstr "" + +#: plinth/modules/tor/__init__.py:222 +msgid "Tor relay port available" +msgstr "" + +#: plinth/modules/tor/__init__.py:230 msgid "Obfs3 transport registered" msgstr "" -#: plinth/modules/tor/__init__.py:64 +#: plinth/modules/tor/__init__.py:236 msgid "Obfs4 transport registered" msgstr "" -#: plinth/modules/tor/__init__.py:101 +#: plinth/modules/tor/__init__.py:273 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "" -#: plinth/modules/tor/__init__.py:112 +#: plinth/modules/tor/__init__.py:284 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "" -#: plinth/modules/tor/templates/tor.html:26 plinth/modules/tor/tor.py:66 -msgid "Anonymity Network (Tor)" +#: plinth/modules/tor/forms.py:32 +msgid "Enable Tor" +msgstr "" + +#: plinth/modules/tor/forms.py:35 +msgid "Enable Tor Hidden Service" +msgstr "" + +#: plinth/modules/tor/forms.py:38 +#, python-brace-format +msgid "" +"A hidden service will allow {box_name} to provide selected services (such as " +"ownCloud or chat) without revealing its location." +msgstr "" + +#: plinth/modules/tor/forms.py:42 +msgid "Download software packages over Tor" +msgstr "" + +#: plinth/modules/tor/forms.py:44 +msgid "" +"When enabled, software will be downloaded over the Tor network for " +"installations and upgrades. This adds a degree of privacy and security " +"during software downloads." msgstr "" -#: plinth/modules/tor/templates/tor.html:29 +#: plinth/modules/tor/templates/tor.html:38 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -2157,28 +2400,32 @@ msgid "" "Tor Browser." msgstr "" -#: plinth/modules/tor/templates/tor.html:44 +#: plinth/modules/tor/templates/tor.html:54 +msgid "Tor configuration is being updated" +msgstr "" + +#: plinth/modules/tor/templates/tor.html:62 msgid "Tor is running" msgstr "" -#: plinth/modules/tor/templates/tor.html:47 +#: plinth/modules/tor/templates/tor.html:65 msgid "Tor is not running" msgstr "" -#: plinth/modules/tor/templates/tor.html:59 +#: plinth/modules/tor/templates/tor.html:77 msgid "Hidden Service" msgstr "" -#: plinth/modules/tor/templates/tor.html:60 -#: plinth/modules/tor/templates/tor.html:102 +#: plinth/modules/tor/templates/tor.html:78 +#: plinth/modules/tor/templates/tor.html:120 msgid "Port" msgstr "" -#: plinth/modules/tor/templates/tor.html:85 +#: plinth/modules/tor/templates/tor.html:103 msgid "Bridge" msgstr "" -#: plinth/modules/tor/templates/tor.html:88 +#: plinth/modules/tor/templates/tor.html:106 #, python-format msgid "" "Your %(box_name)s is configured as a Tor bridge with obfsproxy, so it can " @@ -2187,84 +2434,39 @@ msgid "" "forwarded, if necessary:" msgstr "" -#: plinth/modules/tor/templates/tor.html:101 +#: plinth/modules/tor/templates/tor.html:119 msgid "Service" msgstr "" -#: plinth/modules/tor/templates/tor.html:117 +#: plinth/modules/tor/templates/tor.html:135 msgid "SOCKS" msgstr "" -#: plinth/modules/tor/templates/tor.html:120 +#: plinth/modules/tor/templates/tor.html:138 #, python-format msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "" -#: plinth/modules/tor/tor.py:46 -msgid "Enable Tor" -msgstr "" - -#: plinth/modules/tor/tor.py:49 -msgid "Enable Tor Hidden Service" -msgstr "" - -#: plinth/modules/tor/tor.py:51 -msgid "" -"A hidden service will allow FreedomBox to provide selected services (such as " -"ownCloud or Chat) without revealing its location." -msgstr "" - -#: plinth/modules/tor/tor.py:55 -msgid "Download software packages over Tor" -msgstr "" - -#: plinth/modules/tor/tor.py:57 -msgid "" -"When enabled, software will be downloaded over the Tor network for " -"installations and upgrades. This adds a degree of privacy and security " -"during software downloads." -msgstr "" - -#: plinth/modules/tor/tor.py:85 plinth/modules/tor/tor.py:285 -msgid "Tor Hidden Service" -msgstr "" - -#: plinth/modules/tor/tor.py:115 +#: plinth/modules/tor/views.py:68 msgid "Tor Control Panel" msgstr "" -#: plinth/modules/tor/tor.py:240 +#: plinth/modules/tor/views.py:79 #, python-brace-format msgid "Action error: {0} [{1}] [{2}]" msgstr "" -#: plinth/modules/tor/tor.py:256 -msgid "Tor enabled" -msgstr "" - -#: plinth/modules/tor/tor.py:259 -msgid "Tor disabled" -msgstr "" - -#: plinth/modules/tor/tor.py:264 -msgid "Tor hidden service enabled" -msgstr "" - -#: plinth/modules/tor/tor.py:267 -msgid "Tor hidden service disabled" -msgstr "" - -#: plinth/modules/tor/tor.py:292 -msgid "Enabled package download over Tor" +#: plinth/modules/tor/views.py:148 +msgid "Configuration updated." msgstr "" -#: plinth/modules/tor/tor.py:295 -msgid "Disabled package download over Tor" +#: plinth/modules/tor/views.py:150 +msgid "An error occurred during configuration." msgstr "" #: plinth/modules/transmission/__init__.py:38 #: plinth/modules/transmission/templates/transmission.html:26 -#: plinth/modules/transmission/views.py:63 +#: plinth/modules/transmission/views.py:67 msgid "BitTorrent (Transmission)" msgstr "" @@ -2330,70 +2532,66 @@ msgid "" "will attempt to perform any package upgrades that are available." msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:40 -msgid "There was an error while upgrading." +#: plinth/modules/upgrades/templates/upgrades.html:37 +msgid "" +"Upgrades install the latest software and security updates. When automatic " +"upgrades are enabled, upgrades are automatically run every night. You don't " +"normally need to start the upgrade process." msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:43 -#: plinth/modules/upgrades/templates/upgrades.html:59 -msgid "Output from unattended-upgrades:" +#: plinth/modules/upgrades/templates/upgrades.html:45 +msgid "" +"Depending on the number of packages to install, this may take a long time to " +"complete. While upgrades are in progress, you will not be able to install " +"other packages. During the upgrade, this web interface may be temporarily " +"unavailable and show an error. Refresh the page to continue." msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:50 -msgid "The operating system is up to date now.  " +#: plinth/modules/upgrades/templates/upgrades.html:58 +msgid "Upgrade now »" msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:53 -msgid "Show Details" +#: plinth/modules/upgrades/templates/upgrades.html:65 +msgid "A package manager is running." msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:69 -msgid "" -"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." +#: plinth/modules/upgrades/templates/upgrades.html:70 +msgid "Recent log from upgrades:" msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:80 -msgid "Upgrade now »" +#: plinth/modules/upgrades/views.py:36 plinth/modules/upgrades/views.py:66 +msgid "Automatic Upgrades" msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:87 -msgid "System is being upgraded." +#: plinth/modules/upgrades/views.py:38 +msgid "Upgrade Packages" msgstr "" -#: plinth/modules/upgrades/views.py:35 plinth/modules/upgrades/views.py:64 -msgid "Automatic Upgrades" +#: plinth/modules/upgrades/views.py:96 +msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:37 -msgid "Upgrade Packages" +#: plinth/modules/upgrades/views.py:99 +msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:75 +#: plinth/modules/upgrades/views.py:102 msgid "Package Upgrades" msgstr "" -#: plinth/modules/upgrades/views.py:116 +#: plinth/modules/upgrades/views.py:131 #, python-brace-format msgid "Error when configuring unattended-upgrades: {error}" msgstr "" -#: plinth/modules/upgrades/views.py:121 +#: plinth/modules/upgrades/views.py:136 msgid "Automatic upgrades enabled" msgstr "" -#: plinth/modules/upgrades/views.py:123 +#: plinth/modules/upgrades/views.py:138 msgid "Automatic upgrades disabled" msgstr "" -#: plinth/modules/upgrades/views.py:142 -msgid "Upgrade completed." -msgstr "" - -#: plinth/modules/upgrades/views.py:144 -msgid "Upgrade failed." -msgstr "" - #: plinth/modules/users/__init__.py:36 msgid "Users and Groups" msgstr "" @@ -2429,19 +2627,30 @@ msgstr "" msgid "Failed to add new user to {group} group." msgstr "" -#: plinth/modules/users/forms.py:126 +#: plinth/modules/users/forms.py:92 +msgid "SSH Keys" +msgstr "" + +#: plinth/modules/users/forms.py:96 +msgid "" +"Setting an SSH public key will allow this user to securely log in to the " +"system without using a password. You may enter multiple keys, one on each " +"line. Blank lines and lines starting with # will be ignored." +msgstr "" + +#: plinth/modules/users/forms.py:136 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:138 +#: plinth/modules/users/forms.py:148 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:149 +#: plinth/modules/users/forms.py:159 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:174 +#: plinth/modules/users/forms.py:188 msgid "Changing LDAP user password failed." msgstr "" @@ -2460,7 +2669,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:26 -#: plinth/modules/users/views.py:103 +#: plinth/modules/users/views.py:110 msgid "Delete User" msgstr "" @@ -2513,20 +2722,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:113 +#: plinth/modules/users/views.py:120 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:120 +#: plinth/modules/users/views.py:127 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:129 +#: plinth/modules/users/views.py:136 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:130 +#: plinth/modules/users/views.py:137 msgid "Password changed successfully." msgstr "" @@ -2601,8 +2810,9 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "" -#: plinth/service.py:78 -msgid "FreedomBox Web Interface (Plinth)" +#: plinth/service.py:79 +#, python-brace-format +msgid "{box_name} Web Interface (Plinth)" msgstr "" #: plinth/templates/404.html:25 @@ -2633,27 +2843,24 @@ msgid "" msgstr "" #: plinth/templates/base.html:49 -msgid "Plinth administrative interface for the FreedomBox" -msgstr "" - -#: plinth/templates/base.html:52 plinth/templates/base.html.py:88 -msgid "FreedomBox" +#, python-format +msgid "Plinth administrative interface for the %(box_name)s" msgstr "" -#: plinth/templates/base.html:81 +#: plinth/templates/base.html:83 msgid "Toggle navigation" msgstr "" -#: plinth/templates/base.html:121 plinth/templates/base.html.py:122 +#: plinth/templates/base.html:125 plinth/templates/base.html.py:126 msgid "Change password" msgstr "" -#: plinth/templates/base.html:125 plinth/templates/base.html.py:126 -#: plinth/templates/base.html:139 plinth/templates/base.html.py:141 +#: plinth/templates/base.html:129 plinth/templates/base.html.py:130 +#: plinth/templates/base.html:143 plinth/templates/base.html.py:145 msgid "Log out" msgstr "" -#: plinth/templates/base.html:131 plinth/templates/base.html.py:133 +#: plinth/templates/base.html:135 plinth/templates/base.html.py:137 msgid "Log in" msgstr "" diff --git a/plinth/locale/fake/LC_MESSAGES/django.po b/plinth/locale/fake/LC_MESSAGES/django.po index 3e616b71d..c428f1ddf 100644 --- a/plinth/locale/fake/LC_MESSAGES/django.po +++ b/plinth/locale/fake/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: Plinth 0.6\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-01-24 12:26+0530\n" -"PO-Revision-Date: 2016-01-24 12:16+0530\n" +"POT-Creation-Date: 2016-01-31 22:19+0530\n" +"PO-Revision-Date: 2016-01-31 22:24+0530\n" "Last-Translator: Sunil Mohan Adapa \n" "Language-Team: Plinth Developers \n" @@ -125,7 +125,8 @@ msgstr "" #: plinth/modules/openvpn/templates/openvpn.html:81 #: plinth/modules/privoxy/templates/privoxy.html:48 #: plinth/modules/quassel/templates/quassel.html:50 -#: plinth/modules/tor/templates/tor.html:39 +#: plinth/modules/repro/templates/repro.html:58 +#: plinth/modules/tor/templates/tor.html:48 #: plinth/modules/transmission/templates/transmission.html:42 #: plinth/modules/xmpp/templates/xmpp.html:58 msgid "Status" @@ -148,9 +149,10 @@ msgstr "SERVICE DISCOVERY SERVER IS NOT RUNNING" #: plinth/modules/owncloud/templates/owncloud.html:51 #: plinth/modules/privoxy/templates/privoxy.html:62 #: plinth/modules/quassel/templates/quassel.html:65 +#: plinth/modules/repro/templates/repro.html:72 #: plinth/modules/roundcube/templates/roundcube.html:62 #: plinth/modules/shaarli/templates/shaarli.html:40 -#: plinth/modules/tor/templates/tor.html:74 +#: plinth/modules/tor/templates/tor.html:92 #: plinth/modules/transmission/templates/transmission.html:56 #: plinth/modules/xmpp/templates/xmpp.html:72 msgid "Configuration" @@ -166,10 +168,11 @@ msgstr "CONFIGURATION" #: plinth/modules/openvpn/templates/openvpn.html:138 #: plinth/modules/privoxy/templates/privoxy.html:70 #: plinth/modules/quassel/templates/quassel.html:73 +#: plinth/modules/repro/templates/repro.html:80 #: plinth/modules/restore/templates/restore_index.html:54 #: plinth/modules/roundcube/templates/roundcube.html:70 #: plinth/modules/shaarli/templates/shaarli.html:48 -#: plinth/modules/tor/templates/tor.html:82 +#: plinth/modules/tor/templates/tor.html:100 #: plinth/modules/transmission/templates/transmission.html:64 #: plinth/modules/upgrades/templates/upgrades_configure.html:34 #: plinth/modules/xmpp/templates/xmpp.html:80 @@ -181,9 +184,10 @@ msgstr "UPDATE SETUP" #: plinth/modules/dynamicdns/dynamicdns.py:371 #: plinth/modules/ikiwiki/views.py:95 plinth/modules/mumble/views.py:80 #: plinth/modules/openvpn/views.py:142 plinth/modules/privoxy/views.py:83 -#: plinth/modules/quassel/views.py:76 plinth/modules/restore/views.py:68 -#: plinth/modules/roundcube/views.py:84 plinth/modules/shaarli/views.py:74 -#: plinth/modules/transmission/views.py:109 plinth/modules/xmpp/views.py:100 +#: plinth/modules/quassel/views.py:76 plinth/modules/repro/views.py:77 +#: plinth/modules/restore/views.py:68 plinth/modules/roundcube/views.py:84 +#: plinth/modules/shaarli/views.py:74 plinth/modules/transmission/views.py:109 +#: plinth/modules/xmpp/views.py:100 msgid "Configuration updated" msgstr "CONFIGURATION UPDATED" @@ -191,9 +195,10 @@ msgstr "CONFIGURATION UPDATED" #: plinth/modules/deluge/views.py:82 plinth/modules/ikiwiki/views.py:97 #: plinth/modules/mumble/views.py:82 plinth/modules/openvpn/views.py:144 #: plinth/modules/owncloud/owncloud.py:93 plinth/modules/privoxy/views.py:85 -#: plinth/modules/quassel/views.py:78 plinth/modules/restore/views.py:70 -#: plinth/modules/roundcube/views.py:86 plinth/modules/shaarli/views.py:76 -#: plinth/modules/tor/tor.py:252 plinth/modules/transmission/views.py:111 +#: plinth/modules/quassel/views.py:78 plinth/modules/repro/views.py:79 +#: plinth/modules/restore/views.py:70 plinth/modules/roundcube/views.py:86 +#: plinth/modules/shaarli/views.py:76 plinth/modules/tor/views.py:111 +#: plinth/modules/transmission/views.py:111 #: plinth/modules/upgrades/views.py:118 plinth/modules/xmpp/views.py:102 msgid "Setting unchanged" msgstr "SETTING UNCHANGED" @@ -2409,6 +2414,54 @@ msgstr "QUASSEL CORE SERVICE IS RUNNING" msgid "Quassel core service is not running" msgstr "QUASSEL CORE SERVICE IS NOT RUNNING" +#: plinth/modules/repro/__init__.py:36 +#: plinth/modules/repro/templates/repro.html:26 +#: plinth/modules/repro/views.py:55 +msgid "SIP Server (repro)" +msgstr "SIP SERVER (REPRO)" + +#: plinth/modules/repro/__init__.py:41 +msgid "repro SIP Server" +msgstr "REPRO SIP SERVER" + +#: plinth/modules/repro/forms.py:29 +msgid "Enable repro service" +msgstr "ENABLE REPRO SERVICE" + +#: plinth/modules/repro/templates/repro.html:29 +msgid "" +"repro provides various SIP services that a SIP softphone can utilize to " +"provide audio and video calls as well as presence and instant messaging. " +"repro provides a server and SIP user accounts that clients can use to let " +"their presence known. It also acts as a proxy to federate SIP " +"communications to other servers on the Internet similar to email." +msgstr "REPRO PROVIDES VARIOUS SIP SERVICES THAT A SIP SOFTPHONE CAN UTILIZE TO PROVIDE AUDIO AND VIDEO CALLS AS WELL AS PRESENCE AND INSTANT MESSAGING. REPRO PROVIDES A SERVER AND SIP USER ACCOUNTS THAT CLIENTS CAN USE TO LET THEIR PRESENCE KNOWN. IT ALSO ACTS AS A PROXY TO FEDERATE SIP COMMUNICATIONS TO OTHER SERVERS ON THE INTERNET SIMILAR TO EMAIL." + +#: plinth/modules/repro/templates/repro.html:39 +msgid "" +"To make SIP calls, a client application is needed. Available clients include " +"Jitsi (for computers) and CSipSimple (for Android phones)." +msgstr "TO MAKE SIP CALLS, A CLIENT APPLICATION IS NEEDED. AVAILABLE CLIENTS INCLUDE JITSI (FOR COMPUTERS) AND CSIPSIMPLE (FOR ANDROID PHONES)." + +#: plinth/modules/repro/templates/repro.html:48 +msgid "" +"Note: Before using repro, domains and users will need to " +"be configured using the web-based " +"configuration panel. Users in the admin group will be able to " +"log in to the repro configuration panel. After setting the domain, it is " +"required to restart the repro service. Disable the service and re-enable it." +msgstr "NOTE: BEFORE USING REPRO, DOMAINS AND USERS WILL NEED TO BE CONFIGURED USING THE WEB-BASED CONFIGURATION PANEL. USERS IN THE ADMIN GROUP WILL BE ABLE TO LOG IN TO THE REPRO CONFIGURATION PANEL. AFTER SETTING THE DOMAIN, IT IS REQUIRED TO RESTART THE REPRO SERVICE. DISABLE THE SERVICE AND RE-ENABLE IT." + +#: plinth/modules/repro/templates/repro.html:63 +msgid "repro service is running" +msgstr "REPRO SERVICE IS RUNNING" + +#: plinth/modules/repro/templates/repro.html:66 +msgid "repro service is not running" +msgstr "REPRO SERVICE IS NOT RUNNING" + #: plinth/modules/restore/__init__.py:36 #: plinth/modules/restore/templates/restore_index.html:26 #: plinth/modules/restore/views.py:46 @@ -2548,33 +2601,76 @@ msgid "" msgstr "" "THE OPTIONS AFFECT THE %(box_name)s AT ITS MOST GENERAL LEVEL, SO BE CAREFUL!" -#: plinth/modules/tor/__init__.py:50 +#: plinth/modules/tor/__init__.py:48 plinth/modules/tor/templates/tor.html:35 +msgid "Anonymity Network (Tor)" +msgstr "ANONYMITY NETWORK (TOR)" + +#: plinth/modules/tor/__init__.py:53 +msgid "Tor Anonymity Network" +msgstr "TOR ANONYMITY NETWORK" + +#: plinth/modules/tor/__init__.py:58 +msgid "Tor Bridge Relay" +msgstr "TOR BRIDGE RELAY" + +#: plinth/modules/tor/__init__.py:76 plinth/modules/tor/views.py:144 +msgid "Tor Hidden Service" +msgstr "TOR HIDDEN SERVICE" + +#: plinth/modules/tor/__init__.py:222 msgid "Tor relay port available" msgstr "TOR RELAY PORT AVAILABLE" -#: plinth/modules/tor/__init__.py:58 +#: plinth/modules/tor/__init__.py:230 msgid "Obfs3 transport registered" msgstr "OBFS3 TRANSPORT REGISTERED" -#: plinth/modules/tor/__init__.py:64 +#: plinth/modules/tor/__init__.py:236 msgid "Obfs4 transport registered" msgstr "OBFS4 TRANSPORT REGISTERED" -#: plinth/modules/tor/__init__.py:101 +#: plinth/modules/tor/__init__.py:273 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "ACCESS URL {url} ON TCP{kind} VIA TOR" -#: plinth/modules/tor/__init__.py:112 +#: plinth/modules/tor/__init__.py:284 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "CONFIRM TOR USAGE AT {url} ON TCP{kind}" -#: plinth/modules/tor/templates/tor.html:26 plinth/modules/tor/tor.py:68 -msgid "Anonymity Network (Tor)" -msgstr "ANONYMITY NETWORK (TOR)" +#: plinth/modules/tor/forms.py:32 +msgid "Enable Tor" +msgstr "ENABLE TOR" + +#: plinth/modules/tor/forms.py:35 +msgid "Enable Tor Hidden Service" +msgstr "ENABLE TOR HIDDEN SERVICE" + +#: plinth/modules/tor/forms.py:38 +#, python-brace-format +msgid "" +"A hidden service will allow {box_name} to provide selected services (such as " +"ownCloud or chat) without revealing its location." +msgstr "" +"A HIDDEN SERVICE WILL ALLOW {box_name} TO PROVIDE SELECTED SERVICES (SUCH AS " +"OWNCLOUD OR CHAT) WITHOUT REVEALING ITS LOCATION." + +#: plinth/modules/tor/forms.py:42 +msgid "Download software packages over Tor" +msgstr "DOWNLOAD SOFTWARE PACKAGES OVER TOR" + +#: plinth/modules/tor/forms.py:44 +msgid "" +"When enabled, software will be downloaded over the Tor network for " +"installations and upgrades. This adds a degree of privacy and security " +"during software downloads." +msgstr "" +"WHEN ENABLED, SOFTWARE WILL BE DOWNLOADED OVER THE TOR NETWORK FOR " +"INSTALLATIONS AND UPGRADES. THIS ADDS A DEGREE OF PRIVACY AND SECURITY " +"DURING SOFTWARE DOWNLOADS." -#: plinth/modules/tor/templates/tor.html:29 +#: plinth/modules/tor/templates/tor.html:38 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -2588,28 +2684,32 @@ msgstr "" "THE " "TOR BROWSER." -#: plinth/modules/tor/templates/tor.html:44 +#: plinth/modules/tor/templates/tor.html:54 +msgid "Tor configuration is being updated" +msgstr "TOR CONFIGURATION IS BEING UPDATED" + +#: plinth/modules/tor/templates/tor.html:62 msgid "Tor is running" msgstr "TOR IS RUNNING" -#: plinth/modules/tor/templates/tor.html:47 +#: plinth/modules/tor/templates/tor.html:65 msgid "Tor is not running" msgstr "TOR IS NOT RUNNING" -#: plinth/modules/tor/templates/tor.html:59 +#: plinth/modules/tor/templates/tor.html:77 msgid "Hidden Service" msgstr "HIDDEN SERVICE" -#: plinth/modules/tor/templates/tor.html:60 -#: plinth/modules/tor/templates/tor.html:102 +#: plinth/modules/tor/templates/tor.html:78 +#: plinth/modules/tor/templates/tor.html:120 msgid "Port" msgstr "PORT" -#: plinth/modules/tor/templates/tor.html:85 +#: plinth/modules/tor/templates/tor.html:103 msgid "Bridge" msgstr "BRIDGE" -#: plinth/modules/tor/templates/tor.html:88 +#: plinth/modules/tor/templates/tor.html:106 #, python-format msgid "" "Your %(box_name)s is configured as a Tor bridge with obfsproxy, so it can " @@ -2622,86 +2722,35 @@ msgstr "" "FIREWALL, YOU SHOULD MAKE SURE THE FOLLOWING PORTS ARE OPEN, AND PORT-" "FORWARDED, IF NECESSARY:" -#: plinth/modules/tor/templates/tor.html:101 +#: plinth/modules/tor/templates/tor.html:119 msgid "Service" msgstr "SERVICE" -#: plinth/modules/tor/templates/tor.html:117 +#: plinth/modules/tor/templates/tor.html:135 msgid "SOCKS" msgstr "SOCKS" -#: plinth/modules/tor/templates/tor.html:120 +#: plinth/modules/tor/templates/tor.html:138 #, python-format msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "A TOR SOCKS PORT IS AVAILABLE ON YOUR %(box_name)s ON TCP PORT 9050." -#: plinth/modules/tor/tor.py:47 -msgid "Enable Tor" -msgstr "ENABLE TOR" - -#: plinth/modules/tor/tor.py:50 -msgid "Enable Tor Hidden Service" -msgstr "ENABLE TOR HIDDEN SERVICE" - -#: plinth/modules/tor/tor.py:53 -#, python-brace-format -msgid "" -"A hidden service will allow {box_name} to provide selected services (such as " -"ownCloud or chat) without revealing its location." -msgstr "" -"A HIDDEN SERVICE WILL ALLOW {box_name} TO PROVIDE SELECTED SERVICES (SUCH AS " -"OWNCLOUD OR CHAT) WITHOUT REVEALING ITS LOCATION." - -#: plinth/modules/tor/tor.py:57 -msgid "Download software packages over Tor" -msgstr "DOWNLOAD SOFTWARE PACKAGES OVER TOR" - -#: plinth/modules/tor/tor.py:59 -msgid "" -"When enabled, software will be downloaded over the Tor network for " -"installations and upgrades. This adds a degree of privacy and security " -"during software downloads." -msgstr "" -"WHEN ENABLED, SOFTWARE WILL BE DOWNLOADED OVER THE TOR NETWORK FOR " -"INSTALLATIONS AND UPGRADES. THIS ADDS A DEGREE OF PRIVACY AND SECURITY " -"DURING SOFTWARE DOWNLOADS." - -#: plinth/modules/tor/tor.py:87 plinth/modules/tor/tor.py:287 -msgid "Tor Hidden Service" -msgstr "TOR HIDDEN SERVICE" - -#: plinth/modules/tor/tor.py:117 +#: plinth/modules/tor/views.py:68 msgid "Tor Control Panel" msgstr "TOR CONTROL PANEL" -#: plinth/modules/tor/tor.py:242 +#: plinth/modules/tor/views.py:79 #, python-brace-format msgid "Action error: {0} [{1}] [{2}]" msgstr "ACTION ERROR: {0} [{1}] [{2}]" -#: plinth/modules/tor/tor.py:258 -msgid "Tor enabled" -msgstr "TOR ENABLED" - -#: plinth/modules/tor/tor.py:261 -msgid "Tor disabled" -msgstr "TOR DISABLED" - -#: plinth/modules/tor/tor.py:266 -msgid "Tor hidden service enabled" -msgstr "TOR HIDDEN SERVICE ENABLED" - -#: plinth/modules/tor/tor.py:269 -msgid "Tor hidden service disabled" -msgstr "TOR HIDDEN SERVICE DISABLED" - -#: plinth/modules/tor/tor.py:294 -msgid "Enabled package download over Tor" -msgstr "ENABLED PACKAGE DOWNLOAD OVER TOR" +#: plinth/modules/tor/views.py:148 +msgid "Configuration updated." +msgstr "CONFIGURATION UPDATED." -#: plinth/modules/tor/tor.py:297 -msgid "Disabled package download over Tor" -msgstr "DISABLED PACKAGE DOWNLOAD OVER TOR" +#: plinth/modules/tor/views.py:150 +msgid "An error occurred during configuration." +msgstr "AN ERROR OCCURRED DURING CONFIGURATION." #: plinth/modules/transmission/__init__.py:38 #: plinth/modules/transmission/templates/transmission.html:26 @@ -2888,19 +2937,30 @@ msgstr "" msgid "Failed to add new user to {group} group." msgstr "FAILED TO ADD NEW USER TO {group} GROUP." -#: plinth/modules/users/forms.py:126 +#: plinth/modules/users/forms.py:92 +msgid "SSH Keys" +msgstr "SSH KEYS" + +#: plinth/modules/users/forms.py:96 +msgid "" +"Setting an SSH public key will allow this user to securely log in to the " +"system without using a password. You may enter multiple keys, one on each " +"line. Blank lines and lines starting with # will be ignored." +msgstr "SETTING AN SSH PUBLIC KEY WILL ALLOW THIS USER TO SECURELY LOG IN TO THE SYSTEM WITHOUT USING A PASSWORD. YOU MAY ENTER MULTIPLE KEYS, ONE ON EACH LINE. BLANK LINES AND LINES STARTING WITH # WILL BE IGNORED." + +#: plinth/modules/users/forms.py:136 msgid "Renaming LDAP user failed." msgstr "RENAMING LDAP USER FAILED." -#: plinth/modules/users/forms.py:138 +#: plinth/modules/users/forms.py:148 msgid "Failed to remove user from group." msgstr "FAILED TO REMOVE USER FROM GROUP." -#: plinth/modules/users/forms.py:149 +#: plinth/modules/users/forms.py:159 msgid "Failed to add user to group." msgstr "FAILED TO ADD USER TO GROUP." -#: plinth/modules/users/forms.py:174 +#: plinth/modules/users/forms.py:188 msgid "Changing LDAP user password failed." msgstr "CHANGING LDAP USER PASSWORD FAILED." @@ -2919,7 +2979,7 @@ msgid "Create User" msgstr "CREATE USER" #: plinth/modules/users/templates/users_delete.html:26 -#: plinth/modules/users/views.py:103 +#: plinth/modules/users/views.py:110 msgid "Delete User" msgstr "DELETE USER" @@ -2974,20 +3034,20 @@ msgstr "USER %(username)s UPDATED." msgid "Edit User" msgstr "EDIT USER" -#: plinth/modules/users/views.py:113 +#: plinth/modules/users/views.py:120 #, python-brace-format msgid "User {user} deleted." msgstr "USER {user} DELETED." -#: plinth/modules/users/views.py:120 +#: plinth/modules/users/views.py:127 msgid "Deleting LDAP user failed." msgstr "DELETING LDAP USER FAILED." -#: plinth/modules/users/views.py:129 +#: plinth/modules/users/views.py:136 msgid "Change Password" msgstr "CHANGE PASSWORD" -#: plinth/modules/users/views.py:130 +#: plinth/modules/users/views.py:137 msgid "Password changed successfully." msgstr "PASSWORD CHANGED SUCCESSFULLY." @@ -3168,6 +3228,24 @@ msgstr "INSTALLING %(package_names)s: %(status)s" msgid "%(percentage)s%% complete" msgstr "%(percentage)s%% COMPLETE" +#~ msgid "Tor enabled" +#~ msgstr "TOR ENABLED" + +#~ msgid "Tor disabled" +#~ msgstr "TOR DISABLED" + +#~ msgid "Tor hidden service enabled" +#~ msgstr "TOR HIDDEN SERVICE ENABLED" + +#~ msgid "Tor hidden service disabled" +#~ msgstr "TOR HIDDEN SERVICE DISABLED" + +#~ msgid "Enabled package download over Tor" +#~ msgstr "ENABLED PACKAGE DOWNLOAD OVER TOR" + +#~ msgid "Disabled package download over Tor" +#~ msgstr "DISABLED PACKAGE DOWNLOAD OVER TOR" + #~ msgid "The following is the current status:" #~ msgstr "THE FOLLOWING IS THE CURRENT STATUS:" diff --git a/plinth/locale/fr/LC_MESSAGES/django.po b/plinth/locale/fr/LC_MESSAGES/django.po index d824b3855..b5a06c429 100644 --- a/plinth/locale/fr/LC_MESSAGES/django.po +++ b/plinth/locale/fr/LC_MESSAGES/django.po @@ -8,11 +8,11 @@ msgid "" msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-12-20 13:58+0530\n" +"POT-Creation-Date: 2016-01-31 22:19+0530\n" "PO-Revision-Date: 2016-01-15 21:18+0000\n" "Last-Translator: Caly \n" -"Language-Team: French " -"\n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -50,11 +50,15 @@ msgstr "Connexion à {host}:{port}" msgid "Cannot connect to {host}:{port}" msgstr "Impossible de se connecter à {host}:{port}" +#: plinth/context_processors.py:36 +msgid "FreedomBox" +msgstr "FreedomBox" + #: plinth/modules/apps/apps.py:26 msgid "Apps" msgstr "Applis" -#: plinth/modules/apps/apps.py:32 plinth/templates/base.html.py:90 +#: plinth/modules/apps/apps.py:32 plinth/templates/base.html.py:93 msgid "Applications" msgstr "Applications" @@ -95,10 +99,18 @@ msgid "Enable service discovery" msgstr "Activer la découverte de services" #: plinth/modules/avahi/templates/avahi.html:29 -msgid "" -"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 " +#, fuzzy, python-format +#| msgid "" +#| "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." +msgid "" +"Service discovery allows other devices on the network to discover your " +"%(box_name)s and services running on it. It also allows %(box_name)s to " +"discover other devices 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." @@ -113,14 +125,15 @@ msgstr "" #: plinth/modules/avahi/templates/avahi.html:40 #: plinth/modules/datetime/templates/datetime.html:35 #: plinth/modules/deluge/templates/deluge.html:39 -#: plinth/modules/dynamicdns/dynamicdns.py:38 +#: plinth/modules/dynamicdns/dynamicdns.py:39 #: plinth/modules/firewall/templates/firewall.html:57 #: plinth/modules/mumble/templates/mumble.html:44 #: plinth/modules/networks/templates/connection_show.html:261 #: plinth/modules/openvpn/templates/openvpn.html:81 #: plinth/modules/privoxy/templates/privoxy.html:48 #: plinth/modules/quassel/templates/quassel.html:50 -#: plinth/modules/tor/templates/tor.html:39 +#: plinth/modules/repro/templates/repro.html:58 +#: plinth/modules/tor/templates/tor.html:48 #: plinth/modules/transmission/templates/transmission.html:42 #: plinth/modules/xmpp/templates/xmpp.html:58 msgid "Status" @@ -143,9 +156,10 @@ msgstr "Le serveur de découverte de services n'est pas actif" #: plinth/modules/owncloud/templates/owncloud.html:51 #: plinth/modules/privoxy/templates/privoxy.html:62 #: plinth/modules/quassel/templates/quassel.html:65 +#: plinth/modules/repro/templates/repro.html:72 #: plinth/modules/roundcube/templates/roundcube.html:62 #: plinth/modules/shaarli/templates/shaarli.html:40 -#: plinth/modules/tor/templates/tor.html:74 +#: plinth/modules/tor/templates/tor.html:92 #: plinth/modules/transmission/templates/transmission.html:56 #: plinth/modules/xmpp/templates/xmpp.html:72 msgid "Configuration" @@ -161,10 +175,11 @@ msgstr "Configuration" #: plinth/modules/openvpn/templates/openvpn.html:138 #: plinth/modules/privoxy/templates/privoxy.html:70 #: plinth/modules/quassel/templates/quassel.html:73 +#: plinth/modules/repro/templates/repro.html:80 #: plinth/modules/restore/templates/restore_index.html:54 #: plinth/modules/roundcube/templates/roundcube.html:70 #: plinth/modules/shaarli/templates/shaarli.html:48 -#: plinth/modules/tor/templates/tor.html:82 +#: plinth/modules/tor/templates/tor.html:100 #: plinth/modules/transmission/templates/transmission.html:64 #: plinth/modules/upgrades/templates/upgrades_configure.html:34 #: plinth/modules/xmpp/templates/xmpp.html:80 @@ -173,12 +188,13 @@ msgstr "Actualiser la configuration" #: plinth/modules/avahi/views.py:73 plinth/modules/datetime/views.py:85 #: plinth/modules/deluge/views.py:80 -#: plinth/modules/dynamicdns/dynamicdns.py:368 +#: plinth/modules/dynamicdns/dynamicdns.py:371 #: plinth/modules/ikiwiki/views.py:95 plinth/modules/mumble/views.py:80 #: plinth/modules/openvpn/views.py:142 plinth/modules/privoxy/views.py:83 -#: plinth/modules/quassel/views.py:76 plinth/modules/restore/views.py:68 -#: plinth/modules/roundcube/views.py:84 plinth/modules/shaarli/views.py:74 -#: plinth/modules/transmission/views.py:105 plinth/modules/xmpp/views.py:100 +#: plinth/modules/quassel/views.py:76 plinth/modules/repro/views.py:77 +#: plinth/modules/restore/views.py:68 plinth/modules/roundcube/views.py:84 +#: plinth/modules/shaarli/views.py:74 plinth/modules/transmission/views.py:109 +#: plinth/modules/xmpp/views.py:100 msgid "Configuration updated" msgstr "Configuration actualisée" @@ -186,27 +202,34 @@ msgstr "Configuration actualisée" #: plinth/modules/deluge/views.py:82 plinth/modules/ikiwiki/views.py:97 #: plinth/modules/mumble/views.py:82 plinth/modules/openvpn/views.py:144 #: plinth/modules/owncloud/owncloud.py:93 plinth/modules/privoxy/views.py:85 -#: plinth/modules/quassel/views.py:78 plinth/modules/restore/views.py:70 -#: plinth/modules/roundcube/views.py:86 plinth/modules/shaarli/views.py:76 -#: plinth/modules/tor/tor.py:250 plinth/modules/transmission/views.py:107 -#: plinth/modules/upgrades/views.py:103 plinth/modules/xmpp/views.py:102 +#: plinth/modules/quassel/views.py:78 plinth/modules/repro/views.py:79 +#: plinth/modules/restore/views.py:70 plinth/modules/roundcube/views.py:86 +#: plinth/modules/shaarli/views.py:76 plinth/modules/tor/views.py:111 +#: plinth/modules/transmission/views.py:111 +#: plinth/modules/upgrades/views.py:118 plinth/modules/xmpp/views.py:102 msgid "Setting unchanged" msgstr "Paramètres inchangés" -#: plinth/modules/config/config.py:83 plinth/modules/config/config.py:120 -#: plinth/modules/dynamicdns/dynamicdns.py:145 +#: plinth/modules/config/config.py:84 plinth/modules/config/config.py:121 +#: plinth/modules/dynamicdns/dynamicdns.py:148 msgid "Invalid domain name" msgstr "Nom de domaine invalide" -#: plinth/modules/config/config.py:94 +#: plinth/modules/config/config.py:95 msgid "Hostname" msgstr "Nom de Machine" -#: plinth/modules/config/config.py:96 -msgid "" -"Hostname is the local name by which other machines on the local network " -"reach your machine. It must start and end with an alphabet or a digit and " -"have as interior characters only alphabets, digits and hyphens. Total " +#: plinth/modules/config/config.py:97 +#, fuzzy, python-brace-format +#| msgid "" +#| "Hostname is the local name by which other machines on the local network " +#| "reach your machine. It must start and end with an alphabet or a digit " +#| "and have as interior characters only alphabets, digits and hyphens. " +#| "Total length must be 63 characters or less." +msgid "" +"Hostname is the local name by which other devices on the local network can " +"reach your {box_name}. It must start and end with an alphabet or a digit " +"and have as interior characters only alphabets, digits and hyphens. Total " "length must be 63 characters or less." msgstr "" "Le Nom de Machine est le nom local par lequel les autres machines sur le " @@ -215,24 +238,32 @@ msgstr "" "fin seulement des lettres de l'alphabet, des chiffres ou des traits d’union " "« - ». Sa longueur maximum est de 63 signes." -#: plinth/modules/config/config.py:104 +#: plinth/modules/config/config.py:105 msgid "Invalid hostname" msgstr "Nom de machine invalide" -#: plinth/modules/config/config.py:107 plinth/modules/config/config.py:153 +#: plinth/modules/config/config.py:108 plinth/modules/config/config.py:153 #: plinth/modules/config/config.py:265 -#: plinth/modules/dynamicdns/dynamicdns.py:140 +#: plinth/modules/dynamicdns/dynamicdns.py:143 msgid "Domain Name" msgstr "Nom de Domaine" -#: plinth/modules/config/config.py:109 -msgid "" -"Domain name is the global name by which other machines on the Internet can " -"reach you. It must consist of labels separated by dots. Each label must " -"start and end with an alphabet or a digit and have as interior characters " -"only alphabets, digits and hyphens. Length of each label must be 63 " -"characters or less. Total length of domain name must be 253 characters or " -"less." +#: plinth/modules/config/config.py:110 +#, fuzzy, python-brace-format +#| msgid "" +#| "Domain name is the global name by which other machines on the Internet " +#| "can reach you. It must consist of labels separated by dots. Each label " +#| "must start and end with an alphabet or a digit and have as interior " +#| "characters only alphabets, digits and hyphens. Length of each label must " +#| "be 63 characters or less. Total length of domain name must be 253 " +#| "characters or less." +msgid "" +"Domain name is the global name by which other devices on the Internet can " +"reach your {box_name}. It must consist of labels separated by dots. Each " +"label must start and end with an alphabet or a digit and have as interior " +"characters only alphabets, digits and hyphens. Length of each label must be " +"63 characters or less. Total length of domain name must be 253 characters " +"or less." msgstr "" "Le Nom de Domaine est le nom global par lequel les autres machines sur " "Internet peuvent atteindre votre machine. Le nom ne doit contenir que des " @@ -243,16 +274,18 @@ msgstr "" "63 signes. La longueur totale du nom de domaine ne doit pas excéder 253 " "signes." -#: plinth/modules/config/config.py:124 +#: plinth/modules/config/config.py:125 msgid "Language" msgstr "Langue" -#: plinth/modules/config/config.py:126 -msgid "Language for this FreedomBox web administration interface" +#: plinth/modules/config/config.py:127 +#, fuzzy +#| msgid "Language for this FreedomBox web administration interface" +msgid "Language for this web administration interface" msgstr "Langue de l'interface Web de votre FreedomBox" #: plinth/modules/config/config.py:135 -#: plinth/modules/dynamicdns/dynamicdns.py:36 +#: plinth/modules/dynamicdns/dynamicdns.py:37 #: plinth/modules/ikiwiki/views.py:36 msgid "Configure" msgstr "Configurer" @@ -450,16 +483,16 @@ msgstr "Test" msgid "Result" msgstr "Résultat" -#: plinth/modules/dynamicdns/dynamicdns.py:34 plinth/modules/help/help.py:40 +#: plinth/modules/dynamicdns/dynamicdns.py:35 plinth/modules/help/help.py:40 msgid "About" msgstr "À propos" -#: plinth/modules/dynamicdns/dynamicdns.py:44 -#: plinth/modules/dynamicdns/dynamicdns.py:53 +#: plinth/modules/dynamicdns/dynamicdns.py:45 +#: plinth/modules/dynamicdns/dynamicdns.py:54 msgid "Dynamic DNS" msgstr "DNS Dynamique" -#: plinth/modules/dynamicdns/dynamicdns.py:70 +#: plinth/modules/dynamicdns/dynamicdns.py:71 msgid "" "The Variables <User>, <Pass>, <Ip>, <Domain> may be " "used within the URL. For details see the update URL templates of the example " @@ -469,7 +502,7 @@ msgstr "" "être utilisées dans l'URL. Pour plus de détails, voir les modèles d'URL mis " "à jour pour un exemple de fournisseurs." -#: plinth/modules/dynamicdns/dynamicdns.py:74 +#: plinth/modules/dynamicdns/dynamicdns.py:75 msgid "" "Please choose an update protocol according to your provider. If your " "provider does not support the GnudIP protocol or your provider is not listed " @@ -480,26 +513,32 @@ msgstr "" "votre fournisseur n'est pas listé, vous pouvez utiliser la mise à jour URL " "de votre fournisseur." -#: plinth/modules/dynamicdns/dynamicdns.py:79 +#: plinth/modules/dynamicdns/dynamicdns.py:80 +#, fuzzy +#| msgid "" +#| "Please do not enter a URL here (like \"https://example.com/\") but only " +#| "the hostname of the GnuDIP server (like \"example.pcom\")." msgid "" "Please do not enter a URL here (like \"https://example.com/\") but only the " -"hostname of the GnuDIP server (like \"example.pcom\")." +"hostname of the GnuDIP server (like \"example.com\")." msgstr "" "Ne saisissez pas une URL (comme \"https://example.com/\"), seulement le nom " "de machine du serveur GnuDIP (comme \"example.com\")." -#: plinth/modules/dynamicdns/dynamicdns.py:83 -msgid "The public domain name you want use to reach your box." +#: plinth/modules/dynamicdns/dynamicdns.py:84 +#, fuzzy, python-brace-format +#| msgid "The public domain name you want use to reach your box." +msgid "The public domain name you want use to reach your {box_name}." msgstr "" "Le nom de domaine public que vous désirez utiliser pour atteindre votre " "FreedomBox." -#: plinth/modules/dynamicdns/dynamicdns.py:85 +#: plinth/modules/dynamicdns/dynamicdns.py:87 msgid "Use this option if your provider uses self signed certificates." msgstr "" "Utilisez ce choix si votre fournisseur utilise des certificats auto-signés." -#: plinth/modules/dynamicdns/dynamicdns.py:88 +#: plinth/modules/dynamicdns/dynamicdns.py:90 msgid "" "If this option is selected, your username and password will be used for HTTP " "basic authentication." @@ -507,19 +546,25 @@ msgstr "" "Si ce choix est sélectionné, votre nom d'utilisateur et votre mot de passe " "seront utilisés pour une authentification HTTP de base." -#: plinth/modules/dynamicdns/dynamicdns.py:91 +#: plinth/modules/dynamicdns/dynamicdns.py:93 msgid "" "Leave this field empty if you want to keep your previous configured password." msgstr "" "Laissez ce champ vide si vous désirez garder la configuration précédente de " "votre mot de passe." -#: plinth/modules/dynamicdns/dynamicdns.py:94 +#: plinth/modules/dynamicdns/dynamicdns.py:96 +#, fuzzy, python-brace-format +#| msgid "" +#| "Optional Value. If your FreedomBox is not connected directly to the " +#| "Internet (i.e. connected to a NAT router) this URL is used to figure out " +#| "the real Internet IP. The URL should simply return the IP wherethe client " +#| "comes from. Example: http://myip.datasystems24.de" msgid "" -"Optional Value. If your FreedomBox is not connected directly to the Internet " +"Optional Value. If your {box_name} is not connected directly to the Internet " "(i.e. connected to a NAT router) this URL is used to figure out the real " -"Internet IP. The URL should simply return the IP wherethe client comes from. " -"Example: http://myip.datasystems24.de" +"Internet IP. The URL should simply return the IP where the client comes from " +"(example: http://myip.datasystems24.de)." msgstr "" "Valeur Optionnelle. Si votre FreedomBox n'est pas connectée directement à " "l'Internet (si par exemple votre routeur fait du \"NAT\" Network Address " @@ -527,7 +572,7 @@ msgstr "" "L'URL doit retourner l'IP correspondante à l'endroit où le client se trouve. " "Exemple : http://myip.datasystems24.de" -#: plinth/modules/dynamicdns/dynamicdns.py:101 +#: plinth/modules/dynamicdns/dynamicdns.py:104 msgid "" "You should have been requested to select a username when you created the " "account." @@ -535,85 +580,98 @@ msgstr "" "Vous devez avoir été sollicité pour sélectionner un nom d'utilisateur " "lorsque vous avez créé le compte." -#: plinth/modules/dynamicdns/dynamicdns.py:112 +#: plinth/modules/dynamicdns/dynamicdns.py:115 msgid "Enable Dynamic DNS" msgstr "Activer le DNS Dynamique" -#: plinth/modules/dynamicdns/dynamicdns.py:115 +#: plinth/modules/dynamicdns/dynamicdns.py:118 msgid "Service type" msgstr "Type de service" -#: plinth/modules/dynamicdns/dynamicdns.py:120 +#: plinth/modules/dynamicdns/dynamicdns.py:123 msgid "GnudIP Server Address" msgstr "Adresse Serveur GnudIP" -#: plinth/modules/dynamicdns/dynamicdns.py:125 +#: plinth/modules/dynamicdns/dynamicdns.py:128 msgid "Invalid server name" msgstr "Nom de serveur invalide" -#: plinth/modules/dynamicdns/dynamicdns.py:128 +#: plinth/modules/dynamicdns/dynamicdns.py:131 msgid "Update URL" msgstr "Actualiser l'URL" -#: plinth/modules/dynamicdns/dynamicdns.py:132 -msgid "accept all SSL certificates" +#: plinth/modules/dynamicdns/dynamicdns.py:135 +#, fuzzy +#| msgid "accept all SSL certificates" +msgid "Accept all SSL certificates" msgstr "accepte tous les certificats SSL" -#: plinth/modules/dynamicdns/dynamicdns.py:136 -msgid "use HTTP basic authentication" +#: plinth/modules/dynamicdns/dynamicdns.py:139 +#, fuzzy +#| msgid "use HTTP basic authentication" +msgid "Use HTTP basic authentication" msgstr "utilise une authentification HTTP basique" -#: plinth/modules/dynamicdns/dynamicdns.py:148 -#: plinth/modules/networks/forms.py:118 plinth/modules/transmission/forms.py:39 +#: plinth/modules/dynamicdns/dynamicdns.py:151 +#: plinth/modules/networks/forms.py:146 plinth/modules/transmission/forms.py:39 msgid "Username" msgstr "Nom Utilisateur" -#: plinth/modules/dynamicdns/dynamicdns.py:151 -#: plinth/modules/networks/forms.py:119 plinth/modules/transmission/forms.py:43 +#: plinth/modules/dynamicdns/dynamicdns.py:154 +#: plinth/modules/networks/forms.py:147 plinth/modules/transmission/forms.py:43 msgid "Password" msgstr "Mot de passe" -#: plinth/modules/dynamicdns/dynamicdns.py:154 -msgid "show password" -msgstr "montrer le mot de passe" +#: plinth/modules/dynamicdns/dynamicdns.py:157 +#: plinth/modules/networks/forms.py:149 +msgid "Show password" +msgstr "Montrer le mot de passe" -#: plinth/modules/dynamicdns/dynamicdns.py:158 +#: plinth/modules/dynamicdns/dynamicdns.py:161 msgid "IP check URL" msgstr "Résolution IP/URL" -#: plinth/modules/dynamicdns/dynamicdns.py:184 +#: plinth/modules/dynamicdns/dynamicdns.py:187 msgid "Please provide update URL or a GnuDIP Server" msgstr "Fournir une mise à jour URL ou un serveur GnuDIP" -#: plinth/modules/dynamicdns/dynamicdns.py:187 +#: plinth/modules/dynamicdns/dynamicdns.py:190 msgid "Please provide GnuDIP username" msgstr "Fournir un nom d'utilisateur GnuDIP" -#: plinth/modules/dynamicdns/dynamicdns.py:190 +#: plinth/modules/dynamicdns/dynamicdns.py:193 msgid "Please provide GnuDIP domain" msgstr "Fournir un nom de domaine GnuDIP" -#: plinth/modules/dynamicdns/dynamicdns.py:195 +#: plinth/modules/dynamicdns/dynamicdns.py:198 msgid "Please provide a password" msgstr "Fournir un mot de passe" -#: plinth/modules/dynamicdns/dynamicdns.py:214 +#: plinth/modules/dynamicdns/dynamicdns.py:217 msgid "Configure Dynamic DNS" msgstr "Configurer le DNS Dynamique" -#: plinth/modules/dynamicdns/dynamicdns.py:236 +#: plinth/modules/dynamicdns/dynamicdns.py:239 msgid "Status of Dynamic DNS" msgstr "État du DNS Dynamique" #: plinth/modules/dynamicdns/templates/dynamicdns.html:25 -msgid "DynamicDNS client" +#, fuzzy +#| msgid "DynamicDNS client" +msgid "Dynamic DNS Client" msgstr "Client DynamicDNS" #: plinth/modules/dynamicdns/templates/dynamicdns.html:28 +#, fuzzy, python-format +#| msgid "" +#| "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)." msgid "" "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)." +"may find the services which are provided by %(box_name)s, such as ownCloud." msgstr "" "Si votre fournisseur d'accès change régulièrement votre adresse IP (par ex. " "toutes les 24h), il peut être difficile pour les autres de vous trouver sur " @@ -621,13 +679,22 @@ msgstr "" "les services fournis par FreedomBox (comme ownCloud)." #: plinth/modules/dynamicdns/templates/dynamicdns.html:37 +#, fuzzy +#| msgid "" +#| "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 gnudip " +#| "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." msgid "" "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 gnudip 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." +"Internet asks for your DNS name he will get your current IP answered." msgstr "" "La solution est d'assigner un nom DNS à votre adresse IP et d'actualiser le " "nom DNS à chaque fois que votre IP est modifiée par votre fournisseur " @@ -651,10 +718,14 @@ msgstr "" "org." #: plinth/modules/dynamicdns/templates/dynamicdns.html:61 +#, fuzzy, python-format +#| msgid "" +#| "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." msgid "" -"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." +"If your %(box_name)s is connected behind some NAT router, don't forget to " +"add port forwarding (i.e. forward some standard ports like 80 and 443)." msgstr "" "Si votre FreedomBox est connectée derrière un routeur réalisant du NAT, " "n'oubliez pas d'ajouter la redirection de port (« portforwarding », par " @@ -684,19 +755,26 @@ msgstr "" "de NAT." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:35 -msgid "Direct connection to the internet." +#, fuzzy +#| msgid "Direct connection to the internet." +msgid "Direct connection to the Internet." msgstr "Connexion directe à l'Internet." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:37 -#, python-format -msgid "" -"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)s minutes until we " -"update your DNS entry in case of WAN IP change." -msgstr "" -"Derrière le NAT, un service DNS dynamique sondera la résolution IP/URL ou \"" -"IP check URL\" pour vérifier des modifications (nous avons besoin de la " +#, fuzzy, python-format +#| msgid "" +#| "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)s " +#| "minutes until we update your DNS entry in case of WAN IP change." +msgid "" +"Behind NAT. This means that Dynamic DNS service will poll the \"IP check URL" +"\" for changes (the \"IP check URL\" entry is needed for this - otherwise IP " +"changes will not be detected). In case the WAN IP changes, it may take up " +"to %(timer)s minutes until your DNS entry is updated." +msgstr "" +"Derrière le NAT, un service DNS dynamique sondera la résolution IP/URL ou " +"\"IP check URL\" pour vérifier des modifications (nous avons besoin de la " "résolution \"IP check URL\" pour cette raison - sinon, nous ne détecterons " "pas les modifications de l'IP). Cela pourrait prendre jusque %(timer)s " "minutes avant de mettre à jour votre entrée DNS en cas de modification de " @@ -713,11 +791,15 @@ msgid "Firewall" msgstr "Pare-feu" #: plinth/modules/firewall/templates/firewall.html:28 -#, python-format +#, fuzzy, python-format +#| msgid "" +#| "Firewall is a network security system that controls the incoming and " +#| "outgoing network traffic on your %(box_name)s. Keeping a firewall enabled " +#| "and properly configured reduces risk of security threat from the Internet." msgid "" -"Firewall is a network security system that controls the incoming and " -"outgoing network traffic on your %(box_name)s. Keeping a firewall enabled " -"and properly configured reduces risk of security threat from the Internet." +"Firewall is a security system that controls the incoming and outgoing " +"network traffic on your %(box_name)s. Keeping a firewall enabled and " +"properly configured reduces risk of security threat from the Internet." msgstr "" "Un Pare-feu ou « Firewall » est un système de sécurité réseau permettant de " "contrôler le trafic entrant et sortant sur %(box_name)s. Garder un pare-feu " @@ -725,8 +807,8 @@ msgstr "" "Internet." #: plinth/modules/firewall/templates/firewall.html:36 -msgid "The following is the current status:" -msgstr "Voici l'état actuel :" +msgid "Current status:" +msgstr "" #: plinth/modules/firewall/templates/firewall.html:41 #, python-format @@ -747,11 +829,13 @@ msgid "Service/Port" msgstr "Service/Port" #: plinth/modules/firewall/templates/firewall.html:67 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:91 #: plinth/modules/names/templates/names.html:51 msgid "Enabled" msgstr "Activé" #: plinth/modules/firewall/templates/firewall.html:70 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:93 #: plinth/modules/names/templates/names.html:53 msgid "Disabled" msgstr "Désactivé" @@ -773,10 +857,15 @@ msgid "Blocked" msgstr "Bloqué" #: plinth/modules/firewall/templates/firewall.html:103 +#, fuzzy +#| msgid "" +#| "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." msgid "" "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." +"also permitted in the firewall and when you disable a service it is also " +"disabled in the firewall." msgstr "" "Le fonctionnement du pare-feu est automatique. Lorsque vous activez un " "service, il est automatiquement permis par le pare-feu, si vous le " @@ -794,30 +883,30 @@ msgstr "L'ajout du nouvel utilisateur au groupe administrateur n'a pas abouti." msgid "User account created, you are now logged in" msgstr "Compte utilisateur créé, vous êtes maintenant connecté." -#: plinth/modules/first_boot/templates/firstboot_state0.html:50 -msgid "Congratulations! Your FreedomBox is up and running!" -msgstr "Félicitations ! Votre FreedomBox fonctionne !" +#: plinth/modules/first_boot/templates/firstboot_navbar.html:23 +#: plinth/modules/help/templates/help_index.html:25 +#: plinth/templates/base.html:102 +msgid "Help" +msgstr "Aide" -#: plinth/modules/first_boot/templates/firstboot_state0.html:54 +#: plinth/modules/first_boot/templates/firstboot_state0.html:45 +#, fuzzy +#| msgid "Start setup" +msgid "Start Setup" +msgstr "Démarrer l'Installation" + +#: plinth/modules/first_boot/templates/firstboot_state0.html:49 +#, python-format msgid "" -"Please provide the following basic information to complete the setup process." +"To complete the setup of your %(box_name)s, please provide some basic " +"information." msgstr "" -"Cliquer sur « Suivant » pour achever la configuration en enregistrant les " -"informations de base." - -#: plinth/modules/first_boot/templates/firstboot_state0.html:62 -msgid "Next" -msgstr "Suivant" -#: plinth/modules/first_boot/templates/firstboot_state1.html:39 +#: plinth/modules/first_boot/templates/firstboot_state1.html:41 msgid "Administrator Account" msgstr "Compte administrateur" -#: plinth/modules/first_boot/templates/firstboot_state1.html:42 -#| msgid "" -#| "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." +#: plinth/modules/first_boot/templates/firstboot_state1.html:44 msgid "" "Choose a username and password to access this web interface. The password " "can be changed later. This user will be granted administrative privileges. " @@ -828,7 +917,7 @@ msgstr "" "de privilèges administrateur. Les autres utilisateurs peuvent être créés " "plus tard." -#: plinth/modules/first_boot/templates/firstboot_state1.html:55 +#: plinth/modules/first_boot/templates/firstboot_state1.html:57 msgid "Box it up!" msgstr "Enregistrer et lancer FreedomBox !" @@ -837,36 +926,47 @@ msgid "Setup Complete!" msgstr "Configuration terminée !" #: plinth/modules/first_boot/templates/firstboot_state10.html:32 +#, fuzzy, python-format +#| msgid "" +#| "To make your FreedomBox functional, you need some applications. " +#| "Applications will be installed the first time you access them." msgid "" -"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." -msgstr "" -"La configuration de la FreedomBox est achevée. Toutefois, vous devriez " -"vérifier la configuration réseau et la modifier si nécessaire. N'oubliez pas " -"de modifier les mots de passe Wi-Fi par défaut." - -#: plinth/modules/first_boot/templates/firstboot_state10.html:40 -msgid "" -"To make your FreedomBox functional, you need some applications. " -"Applications will be installed the first time you access them." +"%(box_name)s setup is now complete. To make your %(box_name)s functional, " +"you need some applications. They will be installed the first time you " +"access them." msgstr "" "Pour faire fonctionner votre FreedomBox, vous avez besoin d'applications. " "Les applications seront installées lorsque vous y accéderez pour la première " "fois." -#: plinth/modules/first_boot/templates/firstboot_state10.html:47 -msgid "Network Configuration" +#: plinth/modules/first_boot/templates/firstboot_state10.html:41 +msgid "Go to Apps" +msgstr "Aller aux Applis" + +#: plinth/modules/first_boot/templates/firstboot_state10.html:44 +#, fuzzy +#| msgid "Network Configuration" +msgid "Current Network Configuration" msgstr "Configuration Réseau" -#: plinth/modules/first_boot/templates/firstboot_state10.html:54 +#: plinth/modules/first_boot/templates/firstboot_state10.html:47 +#, fuzzy +#| msgid "" +#| "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." +msgid "" +"You should check the network setup and modify it if necessary. Do not forget " +"to change the default Wi-Fi passwords!" +msgstr "" +"La configuration de la FreedomBox est achevée. Toutefois, vous devriez " +"vérifier la configuration réseau et la modifier si nécessaire. N'oubliez pas " +"de modifier les mots de passe Wi-Fi par défaut." + +#: plinth/modules/first_boot/templates/firstboot_state10.html:57 msgid "Go to Networks" msgstr "Aller aux Réseaux" -#: plinth/modules/first_boot/templates/firstboot_state10.html:59 -msgid "Go to Apps" -msgstr "Aller aux Applis" - #: plinth/modules/first_boot/views.py:60 msgid "Setup Complete" msgstr "Installation Achevée" @@ -879,9 +979,9 @@ msgstr "Documentation" msgid "Where to Get Help" msgstr "Où Obtenir de l'Aide" -#: plinth/modules/help/help.py:38 plinth/modules/help/help.py:72 -msgid "FreedomBox Manual" -msgstr "Manuel FreedomBox" +#: plinth/modules/help/help.py:38 +msgid "Manual" +msgstr "" #: plinth/modules/help/help.py:48 msgid "Documentation and FAQ" @@ -892,15 +992,30 @@ msgstr "Documentation et FAQ" msgid "About {box_name}" msgstr "À Propos de {box_name}" +#: plinth/modules/help/help.py:73 +#, fuzzy, python-brace-format +#| msgid "About {box_name}" +msgid "{box_name} Manual" +msgstr "À Propos de {box_name}" + #: plinth/modules/help/templates/help_about.html:30 -msgid "" -"FreedomBox is a community project to develop, design and promote personal " +#, fuzzy, python-format +#| msgid "" +#| "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." +msgid "" +"%(box_name)s 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." +"and a Tor relay, on a device that can replace your Wi-Fi router, so that " +"your data stays with you." msgstr "" "FreedomBox est un projet communautaire consacré au développement, au design " "et à la promotion de serveurs personnels utilisant des logiciels libres pour " @@ -929,86 +1044,116 @@ msgstr "" "à l'architecture pair-à-pair qui a présidé à sa conception." #: plinth/modules/help/templates/help_about.html:56 +#, fuzzy, python-format +#| msgid "" +#| "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." msgid "" "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." +"services; %(box_name)s aims to bring them all together in a convenient " +"package." msgstr "" "Il existe de nombreux projets dont le but est de développer une architecture " "distribuée de l'Internet. FreedomBox vise à les réunir sur des serveurs " "personnels." #: plinth/modules/help/templates/help_about.html:64 +#, fuzzy, python-format +#| msgid "" +#| "For more information about the FreedomBox project, see the FreedomBox Wiki." msgid "" -"For more information about the FreedomBox project, see the FreedomBox Wiki." +"For more information about the %(box_name)s project, see the %(box_name)s Wiki." msgstr "" "Pour plus d'informations sur le projet FreedomBox, visiter le site Wiki FreedomBox." -#: plinth/modules/help/templates/help_about.html:72 +#: plinth/modules/help/templates/help_about.html:73 msgid "Learn more »" msgstr "En savoir plus" -#: plinth/modules/help/templates/help_about.html:75 +#: plinth/modules/help/templates/help_about.html:76 #, python-format msgid "You are running Plinth version %(version)s." msgstr "Vous utilisez Plinth, version %(version)s." -#: plinth/modules/help/templates/help_index.html:25 -#: plinth/templates/base.html:98 -msgid "Help" -msgstr "Aide" +#: plinth/modules/help/templates/help_base.html:36 +#, python-format +msgid "%(box_name)s Setup" +msgstr "" #: plinth/modules/help/templates/help_index.html:29 -#, python-format +#, fuzzy, python-format +#| msgid "" +#| "The FreedomBox Manual is the best place to " +#| "start for information regarding %(box_name)s." msgid "" -"The FreedomBox Manual is the best place to " +"The %(box_name)s Manual is the best place to " "start for information regarding %(box_name)s." msgstr "" "Le Manuel FreedomBox propose des informations " "de base sur %(box_name)s." #: plinth/modules/help/templates/help_index.html:36 +#, fuzzy, python-format +#| msgid "" +#| " " +#| "FreedomBox project wiki contains further information." msgid "" -" FreedomBox " -"project wiki contains further information." +" " +"%(box_name)s project wiki contains further information." msgstr "" "Vous trouverez sur le site wiki FreedomBox des instructions supplémentaires en " "plusieurs langues." #: plinth/modules/help/templates/help_index.html:43 +#, fuzzy, python-format +#| msgid "" +#| "To seek help from FreedomBox community, queries may be posted on the mailing list. The list archives also contain information about " +#| "problems faced by other users and possible solutions." msgid "" -"To seek help from FreedomBox community, queries may be posted on the " -"mailing list. The list archives also contain information about problems " -"faced by other users and possible solutions." +"To seek help from %(box_name)s community, queries may be posted on the mailing list. The list archives also contain information about " +"problems faced by other users and possible solutions." msgstr "" "Si vous avez besoin d'une aide supplémentaire, vous pouvez poser vos " -"questions en anglais sur la liste " -"de discussion du projet. Les archives de la liste contiennent aussi des " -"informations sur les problèmes rencontrés par les utilisateurs ainsi que les " -"solutions probablement apportées." +"questions en anglais sur la liste de discussion du projet. " +"Les archives de la liste contiennent aussi des informations sur les " +"problèmes rencontrés par les utilisateurs ainsi que les solutions " +"probablement apportées." #: plinth/modules/help/templates/help_index.html:53 +#, python-format msgid "" -"Many FreedomBox contributors and users are also available on the #freedombox " -"channel of the irc.oftc.net IRC network." +"Many %(box_name)s contributors and users are also available on the irc.oftc." +"net IRC network. Join and request help on the #freedombox " +"channel using the IRC web interface." msgstr "" -"Un bon nombre de contributeurs et d'utilisateurs de la FreedomBox sont " -"également accessibles sur le canal IRC #freedombox du réseau irc.oftc.net." #: plinth/modules/ikiwiki/__init__.py:38 -msgid "Wiki & Blog (Ikiwiki)" +#, fuzzy +#| msgid "Wiki & Blog (Ikiwiki)" +msgid "Wiki and Blog (ikiwiki)" msgstr "Wiki et Blogue (Ikiwiki)" #: plinth/modules/ikiwiki/__init__.py:43 -msgid "Ikiwiki wikis and blogs" +#, fuzzy +#| msgid "Ikiwiki wikis and blogs" +msgid "ikiwiki wikis and blogs" msgstr "Wikis et blogues Ikiwiki" #: plinth/modules/ikiwiki/forms.py:29 -msgid "Enable Ikiwiki" +#, fuzzy +#| msgid "Enable Ikiwiki" +msgid "Enable ikiwiki" msgstr "Activer Ikiwiki" #: plinth/modules/ikiwiki/forms.py:36 @@ -1038,25 +1183,31 @@ msgstr "" "ikiwiki\">/ikiwiki." #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:27 -#, python-format -msgid "Delete Wiki/Blog %(name)s" +#, fuzzy, python-format +#| msgid "Delete Wiki/Blog %(name)s" +msgid "Delete Wiki or Blog %(name)s" msgstr "Supprimer le Wiki/Blogue %(name)s" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:33 +#, fuzzy +#| msgid "" +#| "This action will remove all the posts, pages and comments including " +#| "revision history. Delete this wiki/blog permanently?" msgid "" "This action will remove all the posts, pages and comments including revision " -"history. Delete this wiki/blog permanently?" +"history. Delete this wiki or blog permanently?" msgstr "" "Cette action aura pour effet de supprimer tous les posts, les pages et les " "commentaires, tout comme l'historique des révisions. Voulez-vous supprimer " "ce Wiki/Blogue de façon permanente ?" -#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:43 +#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:44 #, python-format msgid "Delete %(name)s" msgstr "Supprimer %(name)s" -#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:46 +#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:47 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:60 #: plinth/modules/networks/templates/connections_delete.html:41 #: plinth/modules/users/templates/users_delete.html:41 msgid "Cancel" @@ -1089,7 +1240,9 @@ msgid "Create" msgstr "Créer" #: plinth/modules/ikiwiki/views.py:73 -msgid "Wiki & Blog" +#, fuzzy +#| msgid "Wiki & Blog" +msgid "Wiki and Blog" msgstr "Wiki et Blogue" #: plinth/modules/ikiwiki/views.py:106 @@ -1097,8 +1250,10 @@ msgid "Manage Wikis and Blogs" msgstr "Gestion Wikis et Blogues" #: plinth/modules/ikiwiki/views.py:132 -msgid "Create Wiki/Blog" -msgstr "Créer Wiki/Blogue" +#, fuzzy +#| msgid "Create a Wiki or Blog" +msgid "Create Wiki or Blog" +msgstr "Créer un Wiki ou un Blogue" #: plinth/modules/ikiwiki/views.py:145 #, python-brace-format @@ -1131,9 +1286,154 @@ msgid "Could not delete {name}: {error}" msgstr "La suppression de {name} n'a pas abouti : {error}" #: plinth/modules/ikiwiki/views.py:182 -msgid "Delete Wiki/Blog" +#, fuzzy +#| msgid "Delete Wiki/Blog" +msgid "Delete Wiki or Blog" msgstr "Supprimer Wiki/Blogue" +#: plinth/modules/letsencrypt/__init__.py:43 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:38 +#: plinth/modules/letsencrypt/views.py:45 +msgid "Certificates (Let's Encrypt)" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:41 +#, python-format +msgid "" +"A digital certficate allows users of a web service to verify the identity of " +"the service and to securely communicate with it. %(box_name)s can " +"automatically obtain and setup digital certificates for each available " +"domain. It does so by proving itself to be the owner of a domain to Let's " +"Encrypt, a certficate authority (CA)." +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:52 +msgid "" +"Let's Encrypt is a free, automated, and open certificate authority, run for " +"the public’s benefit by the Internet Security Research Group (ISRG). Please " +"read and agree with the Let's Encrypt Subscriber Agreement before using this service." +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:66 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:70 +#, fuzzy +#| msgid "Domain Name" +msgid "Domain" +msgstr "Nom de Domaine" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:67 +msgid "Certificate Status" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:68 +#, fuzzy +#| msgid "Security" +msgid "Website Security" +msgstr "Sécurité" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:69 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:72 +#, fuzzy +#| msgid "Applications" +msgid "Actions" +msgstr "Applications" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:79 +#, python-format +msgid "Expires on %(expiry_date)s" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:85 +msgid "No certficate" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:102 +msgid "Revoke" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:108 +msgid "Re-obtain" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:115 +msgid "Obtain" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:55 +#, python-brace-format +msgid "Certificate successfully revoked for domain {domain}" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:60 +#, python-brace-format +msgid "Failed to revoke certificate for domain {domain}: {error}" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:72 +#, python-brace-format +msgid "Certificate successfully obtained for domain {domain}" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:77 +#, python-brace-format +msgid "Failed to obtain certificate for domain {domain}: {error}" +msgstr "" + +#: plinth/modules/monkeysphere/__init__.py:32 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:35 +#: plinth/modules/monkeysphere/views.py:44 +msgid "Monkeysphere" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:38 +msgid "" +"With Monkeysphere, a PGP key can be generated for each configured domain " +"serving SSH. The PGP public key can then be uploaded to the PGP keyservers. " +"Users connecting to this machine through SSH can verify that they are " +"connecting to the correct host. For users to trust the key, at least one " +"person (usually the machine owner) must sign the key using the regular PGP " +"key signing process. See the Monkeysphere SSH documentation for more details." +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:53 +msgid "Publishing key to keyserver..." +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:71 +msgid "GPG Fingerprint" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:83 +#: plinth/modules/names/views.py:45 +msgid "Not Available" +msgstr "Indisponible" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:93 +msgid "Generate PGP Key" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:101 +msgid "Publish Key" +msgstr "" + +#: plinth/modules/monkeysphere/views.py:58 +msgid "Generated PGP key." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:83 +msgid "Cancelled key publishing." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:120 +msgid "Published key to keyserver." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:122 +msgid "Error occurred while publishing key." +msgstr "" + #: plinth/modules/mumble/__init__.py:38 #: plinth/modules/mumble/templates/mumble.html:26 #: plinth/modules/mumble/views.py:58 @@ -1175,61 +1475,48 @@ msgstr "Le serveur Mumble est actif" msgid "Mumble server is not running" msgstr "Le serveur Mumble n'est pas actif" -#: plinth/modules/names/__init__.py:30 +#: plinth/modules/names/__init__.py:29 msgid "HTTP" msgstr "HTTP" -#: plinth/modules/names/__init__.py:31 +#: plinth/modules/names/__init__.py:30 msgid "HTTPS" msgstr "HTTPS" -#: plinth/modules/names/__init__.py:32 +#: plinth/modules/names/__init__.py:31 msgid "SSH" msgstr "SSH" -#: plinth/modules/names/__init__.py:46 plinth/modules/names/views.py:34 +#: plinth/modules/names/__init__.py:45 plinth/modules/names/views.py:34 msgid "Name Services" msgstr "Serveur de Noms" -#: plinth/modules/names/__init__.py:107 -msgid "Not Available" -msgstr "Indisponible" - #: plinth/modules/networks/__init__.py:108 #, python-brace-format msgid "Using DNSSEC on IPv{kind}" msgstr "Utilise DNSSEC sur IPv{kind}" #: plinth/modules/networks/forms.py:30 -msgid "-- select --" -msgstr "-- sélectionner --" - -#: plinth/modules/networks/forms.py:42 msgid "Connection Type" msgstr "Type de Connexion" -#: plinth/modules/networks/forms.py:49 plinth/modules/networks/forms.py:106 -#: plinth/modules/networks/forms.py:133 +#: plinth/modules/networks/forms.py:37 msgid "Connection Name" msgstr "Nom Connexion" -#: plinth/modules/networks/forms.py:51 plinth/modules/networks/forms.py:108 -#: plinth/modules/networks/forms.py:135 +#: plinth/modules/networks/forms.py:39 msgid "Physical Interface" msgstr "Interface Physique" -#: plinth/modules/networks/forms.py:53 plinth/modules/networks/forms.py:110 -#: plinth/modules/networks/forms.py:137 +#: plinth/modules/networks/forms.py:41 msgid "The network device that this connection should be bound to." msgstr "L'appareil réseau auquel cette connexion devrait être liée." -#: plinth/modules/networks/forms.py:56 plinth/modules/networks/forms.py:113 -#: plinth/modules/networks/forms.py:140 +#: plinth/modules/networks/forms.py:44 msgid "Firewall Zone" msgstr "Zone pare-feu" -#: plinth/modules/networks/forms.py:57 plinth/modules/networks/forms.py:114 -#: plinth/modules/networks/forms.py:141 +#: plinth/modules/networks/forms.py:45 msgid "" "The firewall zone will control which services are available over this " "interfaces. Select Internal only for trusted networks." @@ -1237,11 +1524,11 @@ msgstr "" "La zone pare-feu contrôlera quels services sont disponibles via ces " "interfaces. Sélectionnez « Interne » seulement pour des réseaux de confiance." -#: plinth/modules/networks/forms.py:61 plinth/modules/networks/forms.py:162 +#: plinth/modules/networks/forms.py:49 msgid "IPv4 Addressing Method" msgstr "Méthode d'adressage IPv4" -#: plinth/modules/networks/forms.py:62 +#: plinth/modules/networks/forms.py:50 msgid "" "\"Shared\" method will start a DHCP server and \"Automatic\" method will " "acquire configuration from a DHCP server." @@ -1249,15 +1536,15 @@ msgstr "" "La méthode « partagée » démarre un serveur DHCP. La méthode « Automatique » " "importe une configuration d'un serveur DHCP." -#: plinth/modules/networks/forms.py:68 plinth/modules/networks/forms.py:170 +#: plinth/modules/networks/forms.py:56 msgid "Address" msgstr "Adresse" -#: plinth/modules/networks/forms.py:72 plinth/modules/networks/forms.py:174 +#: plinth/modules/networks/forms.py:60 msgid "Netmask" msgstr "Masque sous-réseau" -#: plinth/modules/networks/forms.py:73 plinth/modules/networks/forms.py:175 +#: plinth/modules/networks/forms.py:61 msgid "" "Optional value. If left blank, a default netmask based on the address will " "be used." @@ -1265,21 +1552,21 @@ msgstr "" "Valeur optionnelle. Si laissée vide, un masque de sous-réseau basé sur " "l'adresse sera utilisé par défaut." -#: plinth/modules/networks/forms.py:78 plinth/modules/networks/forms.py:180 +#: plinth/modules/networks/forms.py:66 #: plinth/modules/networks/templates/connection_show.html:202 #: plinth/modules/networks/templates/connection_show.html:241 msgid "Gateway" msgstr "Passerelle" -#: plinth/modules/networks/forms.py:79 plinth/modules/networks/forms.py:181 +#: plinth/modules/networks/forms.py:67 msgid "Optional value." msgstr "Valeur optionnelle." -#: plinth/modules/networks/forms.py:83 plinth/modules/networks/forms.py:185 +#: plinth/modules/networks/forms.py:71 msgid "DNS Server" msgstr "Serveur DNS" -#: plinth/modules/networks/forms.py:84 plinth/modules/networks/forms.py:186 +#: plinth/modules/networks/forms.py:72 msgid "" "Optional value. If this value is given and IPv4 addressing method is " "\"Automatic\", the DNS Servers provided by a DHCP server will be ignored." @@ -1288,11 +1575,11 @@ msgstr "" "d'adressage IPv4 est « Automatique », les serveurs DNS fournis par le " "serveur DHCP seront ignorés." -#: plinth/modules/networks/forms.py:90 plinth/modules/networks/forms.py:192 +#: plinth/modules/networks/forms.py:78 msgid "Second DNS Server" msgstr "Second Serveur DNS" -#: plinth/modules/networks/forms.py:91 plinth/modules/networks/forms.py:193 +#: plinth/modules/networks/forms.py:79 msgid "" "Optional value. If this value is given and IPv4 Addressing Method is " "\"Automatic\", the DNS Servers provided by a DHCP server will be ignored." @@ -1301,29 +1588,29 @@ msgstr "" "d'adressage IPv4 est « Automatique », les serveurs DNS fournis par le " "serveur DHCP seront ignorés." -#: plinth/modules/networks/forms.py:121 -msgid "Show password" -msgstr "Montrer le mot de passe" +#: plinth/modules/networks/forms.py:89 +msgid "-- select --" +msgstr "-- sélectionner --" -#: plinth/modules/networks/forms.py:145 +#: plinth/modules/networks/forms.py:175 #: plinth/modules/networks/templates/connection_show.html:144 msgid "SSID" msgstr "SSID" -#: plinth/modules/networks/forms.py:146 +#: plinth/modules/networks/forms.py:176 msgid "The visible name of the network." msgstr "Le nom visible du réseau." -#: plinth/modules/networks/forms.py:148 +#: plinth/modules/networks/forms.py:178 #: plinth/modules/networks/templates/connection_show.html:157 msgid "Mode" msgstr "Mode" -#: plinth/modules/networks/forms.py:153 +#: plinth/modules/networks/forms.py:183 msgid "Authentication Mode" msgstr "Mode Authentification" -#: plinth/modules/networks/forms.py:154 +#: plinth/modules/networks/forms.py:184 msgid "" "Select WPA if the wireless network is secured and requires clients to have " "the password to connect." @@ -1331,30 +1618,22 @@ msgstr "" "Sélectionner WPA si votre réseau sans fil est sécurisé et s'il demande aux " "clients un mot de passe pour se connecter." -#: plinth/modules/networks/forms.py:158 +#: plinth/modules/networks/forms.py:188 msgid "Passphrase" msgstr "Phrase secrète" -#: plinth/modules/networks/forms.py:166 -msgid "" -"Select Automatic (DHCP) if you are connecting to an existing wireless " -"network. Shared mode is useful when running an Access Point." -msgstr "" -"Sélectionner automatique (DHCP) si vous vous connectez à un réseau sans fil " -"existant. Le mode partagé est utile en cas de Point d'accès." - #: plinth/modules/networks/networks.py:36 #: plinth/modules/networks/networks.py:56 msgid "Network Connections" msgstr "Connexions Réseau" #: plinth/modules/networks/networks.py:38 -#: plinth/modules/networks/networks.py:273 +#: plinth/modules/networks/networks.py:242 msgid "Nearby Wi-Fi Networks" msgstr "Réseaux Wi-Fi à Proximité" #: plinth/modules/networks/networks.py:40 -#: plinth/modules/networks/networks.py:295 +#: plinth/modules/networks/networks.py:264 msgid "Add Connection" msgstr "Ajouter connexion" @@ -1378,60 +1657,60 @@ msgstr "Impossible de modifier la connexion : connexion introuvable." msgid "This type of connection is not yet understood." msgstr "Ce type de connexion n'est pas encore intelligible." -#: plinth/modules/networks/networks.py:170 -#: plinth/modules/networks/networks.py:229 +#: plinth/modules/networks/networks.py:139 +#: plinth/modules/networks/networks.py:198 #: plinth/modules/networks/templates/connections_edit.html:34 msgid "Edit Connection" msgstr "Modifier connexion" -#: plinth/modules/networks/networks.py:240 +#: plinth/modules/networks/networks.py:209 #, python-brace-format msgid "Activated connection {name}." msgstr "Connexion {name} activée." -#: plinth/modules/networks/networks.py:243 +#: plinth/modules/networks/networks.py:212 msgid "Failed to activate connection: Connection not found." msgstr "Échec de l'activation de la connexion : connexion introuvable." -#: plinth/modules/networks/networks.py:247 +#: plinth/modules/networks/networks.py:216 #, python-brace-format msgid "Failed to activate connection {name}: No suitable device is available." msgstr "" "Échec de l'activation de la connexion {name} : pas d'appareil adéquat " "disponible." -#: plinth/modules/networks/networks.py:260 +#: plinth/modules/networks/networks.py:229 #, python-brace-format msgid "Deactivated connection {name}." msgstr "Connexion {name} désactivée." -#: plinth/modules/networks/networks.py:263 +#: plinth/modules/networks/networks.py:232 msgid "Failed to de-activate connection: Connection not found." msgstr "Échec de la désactivation de la connexion : connexion introuvable." -#: plinth/modules/networks/networks.py:325 +#: plinth/modules/networks/networks.py:282 msgid "Adding New Ethernet Connection" msgstr "Ajouter Nouvelle Connexion Ethernet" -#: plinth/modules/networks/networks.py:350 +#: plinth/modules/networks/networks.py:300 msgid "Adding New PPPoE Connection" msgstr "Ajouter Nouvelle Connexion PPPoE" -#: plinth/modules/networks/networks.py:399 +#: plinth/modules/networks/networks.py:332 msgid "Adding New Wi-Fi Connection" msgstr "Ajouter Nouvelle Connexion Wi-Fi" -#: plinth/modules/networks/networks.py:413 +#: plinth/modules/networks/networks.py:346 #, python-brace-format msgid "Connection {name} deleted." msgstr "Connexion {name} supprimée." -#: plinth/modules/networks/networks.py:416 -#: plinth/modules/networks/networks.py:425 +#: plinth/modules/networks/networks.py:349 +#: plinth/modules/networks/networks.py:358 msgid "Failed to delete connection: Connection not found." msgstr "Échec de la suppression de la connexion : connexion introuvable." -#: plinth/modules/networks/networks.py:430 +#: plinth/modules/networks/networks.py:363 #: plinth/modules/networks/templates/connections_delete.html:26 msgid "Delete Connection" msgstr "Supprimer Connexion" @@ -1441,7 +1720,7 @@ msgid "Edit connection" msgstr "Modifier Connexion" #: plinth/modules/networks/templates/connection_show.html:43 -#: plinth/templates/base.html:119 +#: plinth/templates/base.html:123 msgid "Edit" msgstr "Modifier" @@ -1587,10 +1866,16 @@ msgid "Firewall zone" msgstr "Zone pare-feu" #: plinth/modules/networks/templates/connection_show.html:280 +#, fuzzy +#| msgid "" +#| "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." msgid "" -"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." +"This interface should be connected to a 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." msgstr "" "L'interface doit être connectée à la machine ou au réseau local. Si vous " "connectez cette interface au réseau public, les services destinés à une " @@ -1598,20 +1883,31 @@ msgstr "" "une faille de sécurité." #: plinth/modules/networks/templates/connection_show.html:300 +#, fuzzy +#| msgid "" +#| "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." msgid "" -"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." +"This interface should receive your Internet connection. If you connect it to " +"a local network/machine, many services meant to available only internally " +"will not be available." msgstr "" "Cette interface doit recevoir votre connexion internet. Si vous la connectez " "à une machine ou un réseau local, beaucoup de services conçus pour un usage " "interne ne seront pas disponibles." #: plinth/modules/networks/templates/connection_show.html:319 -msgid "" -"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 " +#, fuzzy, python-format +#| msgid "" +#| "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." +msgid "" +"This interface is not maintained by %(box_name)s. Its security status is " +"unknown to %(box_name)s. Many %(box_name)s services may not be available on " +"this interface. It is recommended that you deactivate or delete this " "connection and re-configure it." msgstr "" "Cette interface n'est pas maintenue par FreedomBox. L'état de sa sécurité " @@ -1704,10 +2000,17 @@ msgid "Enable OpenVPN server" msgstr "Activer le serveur OpenVPN" #: plinth/modules/openvpn/templates/openvpn.html:38 -#, python-format +#, fuzzy, python-format +#| msgid "" +#| "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 %(box_name)s in order to join " +#| "your home network and access private/internal services provided by " +#| "%(box_name)s. You can also access the rest of the Internet via " +#| "%(box_name)s for added security and anonymity." msgid "" "Virtual Private Network (VPN) is a technique for securely connecting two " -"machines in order to access resources of a private network. While you are " +"devices in order to access resources of a private network. While you are " "away from home, you can connect to your %(box_name)s in order to join your " "home network and access private/internal services provided by %(box_name)s. " "You can also access the rest of the Internet via %(box_name)s for added " @@ -1725,12 +2028,19 @@ msgid "Profile" msgstr "Profil" #: plinth/modules/openvpn/templates/openvpn.html:54 -#, python-format +#, fuzzy, python-format +#| msgid "" +#| "To connect to %(box_name)s'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 documentation on recommended clients and instructions on how to " +#| "configure them." msgid "" "To connect to %(box_name)s'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 documentation on recommended clients and instructions on how to " "configure them." msgstr "" @@ -2288,6 +2598,64 @@ msgstr "Quassel core est actif" msgid "Quassel core service is not running" msgstr "Quassel core n'est pas actif" +#: plinth/modules/repro/__init__.py:36 +#: plinth/modules/repro/templates/repro.html:26 +#: plinth/modules/repro/views.py:55 +#, fuzzy +#| msgid "Server port" +msgid "SIP Server (repro)" +msgstr "Port serveur" + +#: plinth/modules/repro/__init__.py:41 +#, fuzzy +#| msgid "Second DNS Server" +msgid "repro SIP Server" +msgstr "Second Serveur DNS" + +#: plinth/modules/repro/forms.py:29 +#, fuzzy +#| msgid "Enable Quassel core service" +msgid "Enable repro service" +msgstr "Activer le cœur Quassel" + +#: plinth/modules/repro/templates/repro.html:29 +msgid "" +"repro provides various SIP services that a SIP softphone can utilize to " +"provide audio and video calls as well as presence and instant messaging. " +"repro provides a server and SIP user accounts that clients can use to let " +"their presence known. It also acts as a proxy to federate SIP " +"communications to other servers on the Internet similar to email." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:39 +msgid "" +"To make SIP calls, a client application is needed. Available clients include " +"Jitsi (for computers) and CSipSimple (for Android phones)." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:48 +msgid "" +"Note: Before using repro, domains and users will need to " +"be configured using the web-based " +"configuration panel. Users in the admin group will be able to " +"log in to the repro configuration panel. After setting the domain, it is " +"required to restart the repro service. Disable the service and re-enable it." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:63 +#, fuzzy +#| msgid "Quassel core service is running" +msgid "repro service is running" +msgstr "Quassel core est actif" + +#: plinth/modules/repro/templates/repro.html:66 +#, fuzzy +#| msgid "Quassel core service is not running" +msgid "repro service is not running" +msgstr "Quassel core n'est pas actif" + #: plinth/modules/restore/__init__.py:36 #: plinth/modules/restore/templates/restore_index.html:26 #: plinth/modules/restore/views.py:46 @@ -2303,13 +2671,19 @@ msgid "Enable reStore" msgstr "Activer reStore" #: plinth/modules/restore/templates/restore_index.html:29 -#, python-format +#, fuzzy, python-format +#| msgid "" +#| "reStore is a server for unhosted web " +#| "applications. The idea is to uncouple web applications from data. No " +#| "matter where a web application is served from, the data can be stored on " +#| "an unhosted storage server of user's choice. With reStore, your " +#| "%(cfg.box_name)s becomes your unhosted storage server." msgid "" "reStore is a server for unhosted web " "applications. The idea is to uncouple web applications from data. No " "matter where a web application is served from, the data can be stored on an " -"unhosted storage server of user's choice. With reStore, your " -"%(cfg.box_name)s becomes your unhosted storage server." +"unhosted storage server of user's choice. With reStore, your %(box_name)s " +"becomes your unhosted storage server." msgstr "" "reStore est un serveur pour applications Web non hébergées. L'idée est de découpler les applications Web des " @@ -2359,13 +2733,12 @@ msgid "" "imap.example.com. For IMAP over SSL (recommended), fill the " "server field like imaps://imap.example.com." msgstr "" -"Vous pouvez accéder à RoundCube depuis /roundcube" -". Renseigner le nom d'utilisateur et le mot de passe de votre compte de " +"Vous pouvez accéder à RoundCube depuis /roundcube. Renseigner le nom d'utilisateur et le mot de passe de votre compte de " "courrier électronique auquel vous souhaitez accéder, suivis du nom de " -"domaine du serveur IMAP de votre fournisseur d'email, comme " -"imap.example.com. Pour de l'IMAP sur du SSL (recommandé), " -"remplissez les champs du serveur avec par exemple " -"imaps://imap.example.com." +"domaine du serveur IMAP de votre fournisseur d'email, comme imap." +"example.com. Pour de l'IMAP sur du SSL (recommandé), remplissez les " +"champs du serveur avec par exemple imaps://imap.example.com." #: plinth/modules/roundcube/templates/roundcube.html:50 msgid "" @@ -2418,7 +2791,7 @@ msgstr "Système" #: plinth/modules/system/system.py:33 #: plinth/modules/system/templates/system.html:25 -#: plinth/templates/base.html:105 +#: plinth/templates/base.html:109 msgid "System Configuration" msgstr "Configuration Système" @@ -2437,33 +2810,81 @@ msgstr "" "Ces options affectent %(box_name)s à son niveau le plus général, faites " "attention." -#: plinth/modules/tor/__init__.py:50 +#: plinth/modules/tor/__init__.py:48 plinth/modules/tor/templates/tor.html:35 +msgid "Anonymity Network (Tor)" +msgstr "Réseau Anonyme (Tor)" + +#: plinth/modules/tor/__init__.py:53 +#, fuzzy +#| msgid "Anonymity Network (Tor)" +msgid "Tor Anonymity Network" +msgstr "Réseau Anonyme (Tor)" + +#: plinth/modules/tor/__init__.py:58 +msgid "Tor Bridge Relay" +msgstr "" + +#: plinth/modules/tor/__init__.py:76 plinth/modules/tor/views.py:144 +msgid "Tor Hidden Service" +msgstr "Service Caché Tor" + +#: plinth/modules/tor/__init__.py:222 msgid "Tor relay port available" msgstr "Port du relais Tor disponible" -#: plinth/modules/tor/__init__.py:58 +#: plinth/modules/tor/__init__.py:230 msgid "Obfs3 transport registered" msgstr "Transport Obfs3 enregistré" -#: plinth/modules/tor/__init__.py:64 +#: plinth/modules/tor/__init__.py:236 msgid "Obfs4 transport registered" msgstr "Transport Obfs4 enregistré" -#: plinth/modules/tor/__init__.py:101 +#: plinth/modules/tor/__init__.py:273 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "Accédez à l'URL {url} sur tcp{kind} via Tor" -#: plinth/modules/tor/__init__.py:112 +#: plinth/modules/tor/__init__.py:284 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "Confirmez l'utilisation de Tor pour {url} sur tcp{kind}" -#: plinth/modules/tor/templates/tor.html:26 plinth/modules/tor/tor.py:66 -msgid "Anonymity Network (Tor)" -msgstr "Réseau Anonyme (Tor)" +#: plinth/modules/tor/forms.py:32 +msgid "Enable Tor" +msgstr "Activer Tor" + +#: plinth/modules/tor/forms.py:35 +msgid "Enable Tor Hidden Service" +msgstr "Activer les Services Cachés Tor" -#: plinth/modules/tor/templates/tor.html:29 +#: plinth/modules/tor/forms.py:38 +#, fuzzy, python-brace-format +#| msgid "" +#| "A hidden service will allow FreedomBox to provide selected services (such " +#| "as ownCloud or Chat) without revealing its location." +msgid "" +"A hidden service will allow {box_name} to provide selected services (such as " +"ownCloud or chat) without revealing its location." +msgstr "" +"Un service caché permettra à FreedomBox de proposer les services " +"sélectionnés (comme ownCloud ou Chat) sans révéler votre emplacement." + +#: plinth/modules/tor/forms.py:42 +msgid "Download software packages over Tor" +msgstr "Téléchargez les logiciels via Tor" + +#: plinth/modules/tor/forms.py:44 +msgid "" +"When enabled, software will be downloaded over the Tor network for " +"installations and upgrades. This adds a degree of privacy and security " +"during software downloads." +msgstr "" +"Lorsqu'activé, le logiciel sera téléchargé via le réseau Tor pour " +"installation et mises à niveau. Ce processus ajoute un degré de sécurité et " +"de confidentialité durant le téléchargement des logiciels." + +#: plinth/modules/tor/templates/tor.html:38 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -2477,28 +2898,34 @@ msgstr "" "recommande l'utilisation du Navigateur Tor." -#: plinth/modules/tor/templates/tor.html:44 +#: plinth/modules/tor/templates/tor.html:54 +#, fuzzy +#| msgid "Configuration updated" +msgid "Tor configuration is being updated" +msgstr "Configuration actualisée" + +#: plinth/modules/tor/templates/tor.html:62 msgid "Tor is running" msgstr "Tor est actif" -#: plinth/modules/tor/templates/tor.html:47 +#: plinth/modules/tor/templates/tor.html:65 msgid "Tor is not running" msgstr "Tot n'est pas actif" -#: plinth/modules/tor/templates/tor.html:59 +#: plinth/modules/tor/templates/tor.html:77 msgid "Hidden Service" msgstr "Services Cachés" -#: plinth/modules/tor/templates/tor.html:60 -#: plinth/modules/tor/templates/tor.html:102 +#: plinth/modules/tor/templates/tor.html:78 +#: plinth/modules/tor/templates/tor.html:120 msgid "Port" msgstr "Port" -#: plinth/modules/tor/templates/tor.html:85 +#: plinth/modules/tor/templates/tor.html:103 msgid "Bridge" msgstr "Pont" -#: plinth/modules/tor/templates/tor.html:88 +#: plinth/modules/tor/templates/tor.html:106 #, python-format msgid "" "Your %(box_name)s is configured as a Tor bridge with obfsproxy, so it can " @@ -2511,90 +2938,42 @@ msgstr "" "routeur ou un pare-feu, vous devez vous assurer que les ports suivants " "soient ouverts et réacheminés si nécessaire :" -#: plinth/modules/tor/templates/tor.html:101 +#: plinth/modules/tor/templates/tor.html:119 msgid "Service" msgstr "Service" -#: plinth/modules/tor/templates/tor.html:117 +#: plinth/modules/tor/templates/tor.html:135 msgid "SOCKS" msgstr "SOCKS" -#: plinth/modules/tor/templates/tor.html:120 +#: plinth/modules/tor/templates/tor.html:138 #, python-format msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "" "Un port SOCKS pour Tor est accessible pour %(box_name)s sur le port TCP 9050." -#: plinth/modules/tor/tor.py:46 -msgid "Enable Tor" -msgstr "Activer Tor" - -#: plinth/modules/tor/tor.py:49 -msgid "Enable Tor Hidden Service" -msgstr "Activer les Services Cachés Tor" - -#: plinth/modules/tor/tor.py:51 -msgid "" -"A hidden service will allow FreedomBox to provide selected services (such as " -"ownCloud or Chat) without revealing its location." -msgstr "" -"Un service caché permettra à FreedomBox de proposer les services " -"sélectionnés (comme ownCloud ou Chat) sans révéler votre emplacement." - -#: plinth/modules/tor/tor.py:55 -msgid "Download software packages over Tor" -msgstr "Téléchargez les logiciels via Tor" - -#: plinth/modules/tor/tor.py:57 -msgid "" -"When enabled, software will be downloaded over the Tor network for " -"installations and upgrades. This adds a degree of privacy and security " -"during software downloads." -msgstr "" -"Lorsqu'activé, le logiciel sera téléchargé via le réseau Tor pour " -"installation et mises à niveau. Ce processus ajoute un degré de sécurité et " -"de confidentialité durant le téléchargement des logiciels." - -#: plinth/modules/tor/tor.py:85 plinth/modules/tor/tor.py:285 -msgid "Tor Hidden Service" -msgstr "Service Caché Tor" - -#: plinth/modules/tor/tor.py:115 +#: plinth/modules/tor/views.py:68 msgid "Tor Control Panel" msgstr "Panneau de configuration Tor" -#: plinth/modules/tor/tor.py:240 +#: plinth/modules/tor/views.py:79 #, python-brace-format msgid "Action error: {0} [{1}] [{2}]" msgstr "Erreur sur action : {0} [{1}] [{2}]" -#: plinth/modules/tor/tor.py:256 -msgid "Tor enabled" -msgstr "Tor activé" - -#: plinth/modules/tor/tor.py:259 -msgid "Tor disabled" -msgstr "Tor désactivé" - -#: plinth/modules/tor/tor.py:264 -msgid "Tor hidden service enabled" -msgstr "Services cachés Tor activés" - -#: plinth/modules/tor/tor.py:267 -msgid "Tor hidden service disabled" -msgstr "Services cachés Tor désactivés" - -#: plinth/modules/tor/tor.py:292 -msgid "Enabled package download over Tor" -msgstr "Téléchargement de paquets via Tor activé" +#: plinth/modules/tor/views.py:148 +#, fuzzy +#| msgid "Configuration updated" +msgid "Configuration updated." +msgstr "Configuration actualisée" -#: plinth/modules/tor/tor.py:295 -msgid "Disabled package download over Tor" -msgstr "Téléchargement de paquets via Tor désactivé" +#: plinth/modules/tor/views.py:150 +msgid "An error occurred during configuration." +msgstr "" #: plinth/modules/transmission/__init__.py:38 #: plinth/modules/transmission/templates/transmission.html:26 -#: plinth/modules/transmission/views.py:63 +#: plinth/modules/transmission/views.py:67 msgid "BitTorrent (Transmission)" msgstr "BitTorrent (Transmission)" @@ -2611,10 +2990,6 @@ msgid "Download directory" msgstr "Répertoire de téléchargement" #: plinth/modules/transmission/forms.py:34 -#| msgid "" -#| "Directory where downloads are saved. If you change the default " -#| "directory, ensure that the new directory exists and is writable by " -#| "\"debian-tramission\" user." msgid "" "Directory where downloads are saved. If you change the default directory, " "ensure that the new directory exists and is writable by \"debian-transmission" @@ -2676,72 +3051,72 @@ msgstr "" "Lorsqu'activé, le programme unattended-upgrades sera mis en œuvre une fois " "par jour. Il essayera de réaliser l'ensemble des mises à niveau disponibles." -#: plinth/modules/upgrades/templates/upgrades.html:40 -msgid "There was an error while upgrading." -msgstr "Une erreur est survenue durant la mise à niveau." - -#: plinth/modules/upgrades/templates/upgrades.html:43 -#: plinth/modules/upgrades/templates/upgrades.html:59 -msgid "Output from unattended-upgrades:" -msgstr "Résultat pour unattended-upgrades :" - -#: plinth/modules/upgrades/templates/upgrades.html:50 -msgid "The operating system is up to date now.  " -msgstr "Le système d'exploitation est à jour.  " - -#: plinth/modules/upgrades/templates/upgrades.html:53 -msgid "Show Details" -msgstr "Montrer les détails" +#: plinth/modules/upgrades/templates/upgrades.html:37 +msgid "" +"Upgrades install the latest software and security updates. When automatic " +"upgrades are enabled, upgrades are automatically run every night. You don't " +"normally need to start the upgrade process." +msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:69 +#: plinth/modules/upgrades/templates/upgrades.html:45 msgid "" -"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." +"Depending on the number of packages to install, this may take a long time to " +"complete. While upgrades are in progress, you will not be able to install " +"other packages. During the upgrade, this web interface may be temporarily " +"unavailable and show an error. Refresh the page to continue." msgstr "" -"Vous allez démarrer unattended-upgrades qui a pour but de mettre à niveau " -"votre système avec les derniers paquets Debian." -#: plinth/modules/upgrades/templates/upgrades.html:80 +#: plinth/modules/upgrades/templates/upgrades.html:58 msgid "Upgrade now »" msgstr "Mettre à niveau »" -#: plinth/modules/upgrades/templates/upgrades.html:87 -msgid "System is being upgraded." -msgstr "Le système est en cours de mise à niveau." +#: plinth/modules/upgrades/templates/upgrades.html:65 +#, fuzzy +#| msgid "ejabberd is running" +msgid "A package manager is running." +msgstr "ejabberd est actif" + +#: plinth/modules/upgrades/templates/upgrades.html:70 +msgid "Recent log from upgrades:" +msgstr "" -#: plinth/modules/upgrades/views.py:35 plinth/modules/upgrades/views.py:64 +#: plinth/modules/upgrades/views.py:36 plinth/modules/upgrades/views.py:66 msgid "Automatic Upgrades" msgstr "Mises à niveau automatiques" -#: plinth/modules/upgrades/views.py:37 +#: plinth/modules/upgrades/views.py:38 msgid "Upgrade Packages" msgstr "Mise à Niveau Paquets" -#: plinth/modules/upgrades/views.py:75 +#: plinth/modules/upgrades/views.py:96 +#, fuzzy +#| msgid "Upgrade completed." +msgid "Upgrade process started." +msgstr "Mise à niveau terminée." + +#: plinth/modules/upgrades/views.py:99 +#, fuzzy +#| msgid "Upgrade failed." +msgid "Starting upgrade failed." +msgstr "Échec de la mise à niveau." + +#: plinth/modules/upgrades/views.py:102 msgid "Package Upgrades" msgstr "Paquets Mis à Niveau" -#: plinth/modules/upgrades/views.py:116 +#: plinth/modules/upgrades/views.py:131 #, python-brace-format msgid "Error when configuring unattended-upgrades: {error}" msgstr "Erreur lors de la configuration de unattended-upgrades : {error}" -#: plinth/modules/upgrades/views.py:121 +#: plinth/modules/upgrades/views.py:136 msgid "Automatic upgrades enabled" msgstr "Mises à niveau automatiques activées" -#: plinth/modules/upgrades/views.py:123 +#: plinth/modules/upgrades/views.py:138 msgid "Automatic upgrades disabled" msgstr "Mises à niveau automatiques désactivées" -#: plinth/modules/upgrades/views.py:142 -msgid "Upgrade completed." -msgstr "Mise à niveau terminée." - -#: plinth/modules/upgrades/views.py:144 -msgid "Upgrade failed." -msgstr "Échec de la mise à niveau." - #: plinth/modules/users/__init__.py:36 msgid "Users and Groups" msgstr "Utilisateurs et Groupes" @@ -2783,19 +3158,30 @@ msgstr "" msgid "Failed to add new user to {group} group." msgstr "Échec de l'ajout d'un nouvel utilisateur au groupe {group}." -#: plinth/modules/users/forms.py:126 +#: plinth/modules/users/forms.py:92 +msgid "SSH Keys" +msgstr "" + +#: plinth/modules/users/forms.py:96 +msgid "" +"Setting an SSH public key will allow this user to securely log in to the " +"system without using a password. You may enter multiple keys, one on each " +"line. Blank lines and lines starting with # will be ignored." +msgstr "" + +#: plinth/modules/users/forms.py:136 msgid "Renaming LDAP user failed." msgstr "Le changement du nom LDAP de l'utilisateur a échoué." -#: plinth/modules/users/forms.py:138 +#: plinth/modules/users/forms.py:148 msgid "Failed to remove user from group." msgstr "Échec du retrait de l'utilisateur du groupe." -#: plinth/modules/users/forms.py:149 +#: plinth/modules/users/forms.py:159 msgid "Failed to add user to group." msgstr "Échec de l'ajout de l'utilisateur au groupe." -#: plinth/modules/users/forms.py:174 +#: plinth/modules/users/forms.py:188 msgid "Changing LDAP user password failed." msgstr "Le changement de mot de passe pour l'utilisateur LDAP a échoué." @@ -2814,7 +3200,7 @@ msgid "Create User" msgstr "Créer Utilisateur" #: plinth/modules/users/templates/users_delete.html:26 -#: plinth/modules/users/views.py:103 +#: plinth/modules/users/views.py:110 msgid "Delete User" msgstr "Supprimer Utilisateur" @@ -2869,20 +3255,20 @@ msgstr "Utilisateur %(username)s mis à jour." msgid "Edit User" msgstr "Modifier Utilisateur" -#: plinth/modules/users/views.py:113 +#: plinth/modules/users/views.py:120 #, python-brace-format msgid "User {user} deleted." msgstr "Utilisateur {user} supprimé." -#: plinth/modules/users/views.py:120 +#: plinth/modules/users/views.py:127 msgid "Deleting LDAP user failed." msgstr "La suppression de l'utilisateur LDAP a échoué." -#: plinth/modules/users/views.py:129 +#: plinth/modules/users/views.py:136 msgid "Change Password" msgstr "Changer Mot de Passe" -#: plinth/modules/users/views.py:130 +#: plinth/modules/users/views.py:137 msgid "Password changed successfully." msgstr "Mot de passe changé avec succès." @@ -2966,8 +3352,10 @@ msgstr "Serveur web via SSL (Secure Socket Layer)" msgid "Secure Shell (SSH) Server" msgstr "Serveur Secure Shell (SSH)" -#: plinth/service.py:78 -msgid "FreedomBox Web Interface (Plinth)" +#: plinth/service.py:79 +#, fuzzy, python-brace-format +#| msgid "FreedomBox Web Interface (Plinth)" +msgid "{box_name} Web Interface (Plinth)" msgstr "Interface web Freedombox (Plinth)" #: plinth/templates/404.html:25 @@ -3005,27 +3393,25 @@ msgstr "" "traitement et réparation." #: plinth/templates/base.html:49 -msgid "Plinth administrative interface for the FreedomBox" +#, fuzzy, python-format +#| msgid "Plinth administrative interface for the FreedomBox" +msgid "Plinth administrative interface for the %(box_name)s" msgstr "Interface d'administration Plinth pour FreedomBox" -#: plinth/templates/base.html:52 plinth/templates/base.html.py:88 -msgid "FreedomBox" -msgstr "FreedomBox" - -#: plinth/templates/base.html:81 +#: plinth/templates/base.html:83 msgid "Toggle navigation" msgstr "Basculer Navigation" -#: plinth/templates/base.html:121 plinth/templates/base.html.py:122 +#: plinth/templates/base.html:125 plinth/templates/base.html.py:126 msgid "Change password" msgstr "Changer le mot de passe" -#: plinth/templates/base.html:125 plinth/templates/base.html.py:126 -#: plinth/templates/base.html:139 plinth/templates/base.html.py:141 +#: plinth/templates/base.html:129 plinth/templates/base.html.py:130 +#: plinth/templates/base.html:143 plinth/templates/base.html.py:145 msgid "Log out" msgstr "Se déconnecter" -#: plinth/templates/base.html:131 plinth/templates/base.html.py:133 +#: plinth/templates/base.html:135 plinth/templates/base.html.py:137 msgid "Log in" msgstr "S'identifier" @@ -3066,6 +3452,86 @@ msgstr "Installation de %(package_names)s: %(status)s" msgid "%(percentage)s%% complete" msgstr "%(percentage)s%% effectué" +#~ msgid "show password" +#~ msgstr "montrer le mot de passe" + +#~ msgid "The following is the current status:" +#~ msgstr "Voici l'état actuel :" + +#~ msgid "Congratulations! Your FreedomBox is up and running!" +#~ msgstr "Félicitations ! Votre FreedomBox fonctionne !" + +#~ msgid "" +#~ "Please provide the following basic information to complete the setup " +#~ "process." +#~ msgstr "" +#~ "Cliquer sur « Suivant » pour achever la configuration en enregistrant les " +#~ "informations de base." + +#~ msgid "Next" +#~ msgstr "Suivant" + +#~ msgid "FreedomBox Manual" +#~ msgstr "Manuel FreedomBox" + +#~ msgid "" +#~ "Many FreedomBox contributors and users are also available on the " +#~ "#freedombox channel of the irc.oftc.net IRC network." +#~ msgstr "" +#~ "Un bon nombre de contributeurs et d'utilisateurs de la FreedomBox sont " +#~ "également accessibles sur le canal IRC #freedombox du réseau irc.oftc.net." + +#~ msgid "Create Wiki/Blog" +#~ msgstr "Créer Wiki/Blogue" + +#~ msgid "" +#~ "Select Automatic (DHCP) if you are connecting to an existing wireless " +#~ "network. Shared mode is useful when running an Access Point." +#~ msgstr "" +#~ "Sélectionner automatique (DHCP) si vous vous connectez à un réseau sans " +#~ "fil existant. Le mode partagé est utile en cas de Point d'accès." + +#~ msgid "Tor enabled" +#~ msgstr "Tor activé" + +#~ msgid "Tor disabled" +#~ msgstr "Tor désactivé" + +#~ msgid "Tor hidden service enabled" +#~ msgstr "Services cachés Tor activés" + +#~ msgid "Tor hidden service disabled" +#~ msgstr "Services cachés Tor désactivés" + +#~ msgid "Enabled package download over Tor" +#~ msgstr "Téléchargement de paquets via Tor activé" + +#~ msgid "Disabled package download over Tor" +#~ msgstr "Téléchargement de paquets via Tor désactivé" + +#~ msgid "There was an error while upgrading." +#~ msgstr "Une erreur est survenue durant la mise à niveau." + +#~ msgid "Output from unattended-upgrades:" +#~ msgstr "Résultat pour unattended-upgrades :" + +#~ msgid "The operating system is up to date now.  " +#~ msgstr "Le système d'exploitation est à jour.  " + +#~ msgid "Show Details" +#~ msgstr "Montrer les détails" + +#~ msgid "" +#~ "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." +#~ msgstr "" +#~ "Vous allez démarrer unattended-upgrades qui a pour but de mettre à niveau " +#~ "votre système avec les derniers paquets Debian." + +#~ msgid "System is being upgraded." +#~ msgstr "Le système est en cours de mise à niveau." + #~ msgid "" #~ "You can install and run various services and applications on your " #~ "%(box_name)s." diff --git a/plinth/locale/it/LC_MESSAGES/django.po b/plinth/locale/it/LC_MESSAGES/django.po index a63efe932..05cb7ca73 100644 --- a/plinth/locale/it/LC_MESSAGES/django.po +++ b/plinth/locale/it/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-12-20 13:58+0530\n" +"POT-Creation-Date: 2016-01-31 22:19+0530\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -48,11 +48,15 @@ msgstr "" msgid "Cannot connect to {host}:{port}" msgstr "" +#: plinth/context_processors.py:36 +msgid "FreedomBox" +msgstr "" + #: plinth/modules/apps/apps.py:26 msgid "Apps" msgstr "" -#: plinth/modules/apps/apps.py:32 plinth/templates/base.html.py:90 +#: plinth/modules/apps/apps.py:32 plinth/templates/base.html.py:93 msgid "Applications" msgstr "" @@ -87,10 +91,11 @@ msgid "Enable service discovery" msgstr "" #: plinth/modules/avahi/templates/avahi.html:29 +#, python-format msgid "" -"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 " +"Service discovery allows other devices on the network to discover your " +"%(box_name)s and services running on it. It also allows %(box_name)s to " +"discover other devices 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." @@ -99,14 +104,15 @@ msgstr "" #: plinth/modules/avahi/templates/avahi.html:40 #: plinth/modules/datetime/templates/datetime.html:35 #: plinth/modules/deluge/templates/deluge.html:39 -#: plinth/modules/dynamicdns/dynamicdns.py:38 +#: plinth/modules/dynamicdns/dynamicdns.py:39 #: plinth/modules/firewall/templates/firewall.html:57 #: plinth/modules/mumble/templates/mumble.html:44 #: plinth/modules/networks/templates/connection_show.html:261 #: plinth/modules/openvpn/templates/openvpn.html:81 #: plinth/modules/privoxy/templates/privoxy.html:48 #: plinth/modules/quassel/templates/quassel.html:50 -#: plinth/modules/tor/templates/tor.html:39 +#: plinth/modules/repro/templates/repro.html:58 +#: plinth/modules/tor/templates/tor.html:48 #: plinth/modules/transmission/templates/transmission.html:42 #: plinth/modules/xmpp/templates/xmpp.html:58 msgid "Status" @@ -129,9 +135,10 @@ msgstr "" #: plinth/modules/owncloud/templates/owncloud.html:51 #: plinth/modules/privoxy/templates/privoxy.html:62 #: plinth/modules/quassel/templates/quassel.html:65 +#: plinth/modules/repro/templates/repro.html:72 #: plinth/modules/roundcube/templates/roundcube.html:62 #: plinth/modules/shaarli/templates/shaarli.html:40 -#: plinth/modules/tor/templates/tor.html:74 +#: plinth/modules/tor/templates/tor.html:92 #: plinth/modules/transmission/templates/transmission.html:56 #: plinth/modules/xmpp/templates/xmpp.html:72 msgid "Configuration" @@ -147,10 +154,11 @@ msgstr "" #: plinth/modules/openvpn/templates/openvpn.html:138 #: plinth/modules/privoxy/templates/privoxy.html:70 #: plinth/modules/quassel/templates/quassel.html:73 +#: plinth/modules/repro/templates/repro.html:80 #: plinth/modules/restore/templates/restore_index.html:54 #: plinth/modules/roundcube/templates/roundcube.html:70 #: plinth/modules/shaarli/templates/shaarli.html:48 -#: plinth/modules/tor/templates/tor.html:82 +#: plinth/modules/tor/templates/tor.html:100 #: plinth/modules/transmission/templates/transmission.html:64 #: plinth/modules/upgrades/templates/upgrades_configure.html:34 #: plinth/modules/xmpp/templates/xmpp.html:80 @@ -159,12 +167,13 @@ msgstr "" #: plinth/modules/avahi/views.py:73 plinth/modules/datetime/views.py:85 #: plinth/modules/deluge/views.py:80 -#: plinth/modules/dynamicdns/dynamicdns.py:368 +#: plinth/modules/dynamicdns/dynamicdns.py:371 #: plinth/modules/ikiwiki/views.py:95 plinth/modules/mumble/views.py:80 #: plinth/modules/openvpn/views.py:142 plinth/modules/privoxy/views.py:83 -#: plinth/modules/quassel/views.py:76 plinth/modules/restore/views.py:68 -#: plinth/modules/roundcube/views.py:84 plinth/modules/shaarli/views.py:74 -#: plinth/modules/transmission/views.py:105 plinth/modules/xmpp/views.py:100 +#: plinth/modules/quassel/views.py:76 plinth/modules/repro/views.py:77 +#: plinth/modules/restore/views.py:68 plinth/modules/roundcube/views.py:84 +#: plinth/modules/shaarli/views.py:74 plinth/modules/transmission/views.py:109 +#: plinth/modules/xmpp/views.py:100 msgid "Configuration updated" msgstr "" @@ -172,60 +181,63 @@ msgstr "" #: plinth/modules/deluge/views.py:82 plinth/modules/ikiwiki/views.py:97 #: plinth/modules/mumble/views.py:82 plinth/modules/openvpn/views.py:144 #: plinth/modules/owncloud/owncloud.py:93 plinth/modules/privoxy/views.py:85 -#: plinth/modules/quassel/views.py:78 plinth/modules/restore/views.py:70 -#: plinth/modules/roundcube/views.py:86 plinth/modules/shaarli/views.py:76 -#: plinth/modules/tor/tor.py:250 plinth/modules/transmission/views.py:107 -#: plinth/modules/upgrades/views.py:103 plinth/modules/xmpp/views.py:102 +#: plinth/modules/quassel/views.py:78 plinth/modules/repro/views.py:79 +#: plinth/modules/restore/views.py:70 plinth/modules/roundcube/views.py:86 +#: plinth/modules/shaarli/views.py:76 plinth/modules/tor/views.py:111 +#: plinth/modules/transmission/views.py:111 +#: plinth/modules/upgrades/views.py:118 plinth/modules/xmpp/views.py:102 msgid "Setting unchanged" msgstr "" -#: plinth/modules/config/config.py:83 plinth/modules/config/config.py:120 -#: plinth/modules/dynamicdns/dynamicdns.py:145 +#: plinth/modules/config/config.py:84 plinth/modules/config/config.py:121 +#: plinth/modules/dynamicdns/dynamicdns.py:148 msgid "Invalid domain name" msgstr "" -#: plinth/modules/config/config.py:94 +#: plinth/modules/config/config.py:95 msgid "Hostname" msgstr "" -#: plinth/modules/config/config.py:96 +#: plinth/modules/config/config.py:97 +#, python-brace-format msgid "" -"Hostname is the local name by which other machines on the local network " -"reach your machine. It must start and end with an alphabet or a digit and " -"have as interior characters only alphabets, digits and hyphens. Total " +"Hostname is the local name by which other devices on the local network can " +"reach your {box_name}. It must start and end with an alphabet or a digit " +"and have as interior characters only alphabets, digits and hyphens. Total " "length must be 63 characters or less." msgstr "" -#: plinth/modules/config/config.py:104 +#: plinth/modules/config/config.py:105 msgid "Invalid hostname" msgstr "" -#: plinth/modules/config/config.py:107 plinth/modules/config/config.py:153 +#: plinth/modules/config/config.py:108 plinth/modules/config/config.py:153 #: plinth/modules/config/config.py:265 -#: plinth/modules/dynamicdns/dynamicdns.py:140 +#: plinth/modules/dynamicdns/dynamicdns.py:143 msgid "Domain Name" msgstr "" -#: plinth/modules/config/config.py:109 +#: plinth/modules/config/config.py:110 +#, python-brace-format msgid "" -"Domain name is the global name by which other machines on the Internet can " -"reach you. It must consist of labels separated by dots. Each label must " -"start and end with an alphabet or a digit and have as interior characters " -"only alphabets, digits and hyphens. Length of each label must be 63 " -"characters or less. Total length of domain name must be 253 characters or " -"less." +"Domain name is the global name by which other devices on the Internet can " +"reach your {box_name}. It must consist of labels separated by dots. Each " +"label must start and end with an alphabet or a digit and have as interior " +"characters only alphabets, digits and hyphens. Length of each label must be " +"63 characters or less. Total length of domain name must be 253 characters " +"or less." msgstr "" -#: plinth/modules/config/config.py:124 +#: plinth/modules/config/config.py:125 msgid "Language" msgstr "" -#: plinth/modules/config/config.py:126 -msgid "Language for this FreedomBox web administration interface" +#: plinth/modules/config/config.py:127 +msgid "Language for this web administration interface" msgstr "" #: plinth/modules/config/config.py:135 -#: plinth/modules/dynamicdns/dynamicdns.py:36 +#: plinth/modules/dynamicdns/dynamicdns.py:37 #: plinth/modules/ikiwiki/views.py:36 msgid "Configure" msgstr "" @@ -412,147 +424,151 @@ msgstr "" msgid "Result" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:34 plinth/modules/help/help.py:40 +#: plinth/modules/dynamicdns/dynamicdns.py:35 plinth/modules/help/help.py:40 msgid "About" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:44 -#: plinth/modules/dynamicdns/dynamicdns.py:53 +#: plinth/modules/dynamicdns/dynamicdns.py:45 +#: plinth/modules/dynamicdns/dynamicdns.py:54 msgid "Dynamic DNS" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:70 +#: plinth/modules/dynamicdns/dynamicdns.py:71 msgid "" "The Variables <User>, <Pass>, <Ip>, <Domain> may be " "used within the URL. For details see the update URL templates of the example " "providers." msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:74 +#: plinth/modules/dynamicdns/dynamicdns.py:75 msgid "" "Please choose an update protocol according to your provider. If your " "provider does not support the GnudIP protocol or your provider is not listed " "you may use the update URL of your provider." msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:79 +#: plinth/modules/dynamicdns/dynamicdns.py:80 msgid "" "Please do not enter a URL here (like \"https://example.com/\") but only the " -"hostname of the GnuDIP server (like \"example.pcom\")." +"hostname of the GnuDIP server (like \"example.com\")." msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:83 -msgid "The public domain name you want use to reach your box." +#: plinth/modules/dynamicdns/dynamicdns.py:84 +#, python-brace-format +msgid "The public domain name you want use to reach your {box_name}." msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:85 +#: plinth/modules/dynamicdns/dynamicdns.py:87 msgid "Use this option if your provider uses self signed certificates." msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:88 +#: plinth/modules/dynamicdns/dynamicdns.py:90 msgid "" "If this option is selected, your username and password will be used for HTTP " "basic authentication." msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:91 +#: plinth/modules/dynamicdns/dynamicdns.py:93 msgid "" "Leave this field empty if you want to keep your previous configured password." msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:94 +#: plinth/modules/dynamicdns/dynamicdns.py:96 +#, python-brace-format msgid "" -"Optional Value. If your FreedomBox is not connected directly to the Internet " +"Optional Value. If your {box_name} is not connected directly to the Internet " "(i.e. connected to a NAT router) this URL is used to figure out the real " -"Internet IP. The URL should simply return the IP wherethe client comes from. " -"Example: http://myip.datasystems24.de" +"Internet IP. The URL should simply return the IP where the client comes from " +"(example: http://myip.datasystems24.de)." msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:101 +#: plinth/modules/dynamicdns/dynamicdns.py:104 msgid "" "You should have been requested to select a username when you created the " "account." msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:112 +#: plinth/modules/dynamicdns/dynamicdns.py:115 msgid "Enable Dynamic DNS" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:115 +#: plinth/modules/dynamicdns/dynamicdns.py:118 msgid "Service type" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:120 +#: plinth/modules/dynamicdns/dynamicdns.py:123 msgid "GnudIP Server Address" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:125 +#: plinth/modules/dynamicdns/dynamicdns.py:128 msgid "Invalid server name" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:128 +#: plinth/modules/dynamicdns/dynamicdns.py:131 msgid "Update URL" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:132 -msgid "accept all SSL certificates" +#: plinth/modules/dynamicdns/dynamicdns.py:135 +msgid "Accept all SSL certificates" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:136 -msgid "use HTTP basic authentication" +#: plinth/modules/dynamicdns/dynamicdns.py:139 +msgid "Use HTTP basic authentication" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:148 -#: plinth/modules/networks/forms.py:118 plinth/modules/transmission/forms.py:39 +#: plinth/modules/dynamicdns/dynamicdns.py:151 +#: plinth/modules/networks/forms.py:146 plinth/modules/transmission/forms.py:39 msgid "Username" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:151 -#: plinth/modules/networks/forms.py:119 plinth/modules/transmission/forms.py:43 +#: plinth/modules/dynamicdns/dynamicdns.py:154 +#: plinth/modules/networks/forms.py:147 plinth/modules/transmission/forms.py:43 msgid "Password" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:154 -msgid "show password" +#: plinth/modules/dynamicdns/dynamicdns.py:157 +#: plinth/modules/networks/forms.py:149 +msgid "Show password" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:158 +#: plinth/modules/dynamicdns/dynamicdns.py:161 msgid "IP check URL" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:184 +#: plinth/modules/dynamicdns/dynamicdns.py:187 msgid "Please provide update URL or a GnuDIP Server" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:187 +#: plinth/modules/dynamicdns/dynamicdns.py:190 msgid "Please provide GnuDIP username" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:190 +#: plinth/modules/dynamicdns/dynamicdns.py:193 msgid "Please provide GnuDIP domain" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:195 +#: plinth/modules/dynamicdns/dynamicdns.py:198 msgid "Please provide a password" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:214 +#: plinth/modules/dynamicdns/dynamicdns.py:217 msgid "Configure Dynamic DNS" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:236 +#: plinth/modules/dynamicdns/dynamicdns.py:239 msgid "Status of Dynamic DNS" msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns.html:25 -msgid "DynamicDNS client" +msgid "Dynamic DNS Client" msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns.html:28 +#, python-format msgid "" "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)." +"may find the services which are provided by %(box_name)s, such as ownCloud." msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns.html:37 @@ -562,7 +578,7 @@ msgid "" "allows you to push your current public IP address to an gnudip 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." +"Internet asks for your DNS name he will get your current IP answered." msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns.html:50 @@ -575,10 +591,10 @@ msgid "" msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns.html:61 +#, python-format msgid "" -"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." +"If your %(box_name)s is connected behind some NAT router, don't forget to " +"add port forwarding (i.e. forward some standard ports like 80 and 443)." msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns_configure.html:30 @@ -598,16 +614,16 @@ msgid "" msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:35 -msgid "Direct connection to the internet." +msgid "Direct connection to the Internet." msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:37 #, python-format msgid "" -"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)s minutes until we " -"update your DNS entry in case of WAN IP change." +"Behind NAT. This means that Dynamic DNS service will poll the \"IP check URL" +"\" for changes (the \"IP check URL\" entry is needed for this - otherwise IP " +"changes will not be detected). In case the WAN IP changes, it may take up " +"to %(timer)s minutes until your DNS entry is updated." msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:48 @@ -623,13 +639,13 @@ msgstr "" #: plinth/modules/firewall/templates/firewall.html:28 #, python-format msgid "" -"Firewall is a network security system that controls the incoming and " -"outgoing network traffic on your %(box_name)s. Keeping a firewall enabled " -"and properly configured reduces risk of security threat from the Internet." +"Firewall is a security system that controls the incoming and outgoing " +"network traffic on your %(box_name)s. Keeping a firewall enabled and " +"properly configured reduces risk of security threat from the Internet." msgstr "" #: plinth/modules/firewall/templates/firewall.html:36 -msgid "The following is the current status:" +msgid "Current status:" msgstr "" #: plinth/modules/firewall/templates/firewall.html:41 @@ -646,11 +662,13 @@ msgid "Service/Port" msgstr "" #: plinth/modules/firewall/templates/firewall.html:67 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:91 #: plinth/modules/names/templates/names.html:51 msgid "Enabled" msgstr "" #: plinth/modules/firewall/templates/firewall.html:70 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:93 #: plinth/modules/names/templates/names.html:53 msgid "Disabled" msgstr "" @@ -674,8 +692,8 @@ msgstr "" #: plinth/modules/firewall/templates/firewall.html:103 msgid "" "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." +"also permitted in the firewall and when you disable a service it is also " +"disabled in the firewall." msgstr "" #: plinth/modules/first_boot/forms.py:48 plinth/modules/users/forms.py:70 @@ -690,31 +708,35 @@ msgstr "" msgid "User account created, you are now logged in" msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state0.html:50 -msgid "Congratulations! Your FreedomBox is up and running!" +#: plinth/modules/first_boot/templates/firstboot_navbar.html:23 +#: plinth/modules/help/templates/help_index.html:25 +#: plinth/templates/base.html:102 +msgid "Help" msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state0.html:54 -msgid "" -"Please provide the following basic information to complete the setup process." +#: plinth/modules/first_boot/templates/firstboot_state0.html:45 +msgid "Start Setup" msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state0.html:62 -msgid "Next" +#: plinth/modules/first_boot/templates/firstboot_state0.html:49 +#, python-format +msgid "" +"To complete the setup of your %(box_name)s, please provide some basic " +"information." msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state1.html:39 +#: plinth/modules/first_boot/templates/firstboot_state1.html:41 msgid "Administrator Account" msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state1.html:42 +#: plinth/modules/first_boot/templates/firstboot_state1.html:44 msgid "" "Choose a username and password to access this web interface. The password " "can be changed later. This user will be granted administrative privileges. " "Other users can be added later." msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state1.html:55 +#: plinth/modules/first_boot/templates/firstboot_state1.html:57 msgid "Box it up!" msgstr "" @@ -723,28 +745,29 @@ msgid "Setup Complete!" msgstr "" #: plinth/modules/first_boot/templates/firstboot_state10.html:32 +#, python-format msgid "" -"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." +"%(box_name)s setup is now complete. To make your %(box_name)s functional, " +"you need some applications. They will be installed the first time you " +"access them." msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state10.html:40 -msgid "" -"To make your FreedomBox functional, you need some applications. " -"Applications will be installed the first time you access them." +#: plinth/modules/first_boot/templates/firstboot_state10.html:41 +msgid "Go to Apps" msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state10.html:47 -msgid "Network Configuration" +#: plinth/modules/first_boot/templates/firstboot_state10.html:44 +msgid "Current Network Configuration" msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state10.html:54 -msgid "Go to Networks" +#: plinth/modules/first_boot/templates/firstboot_state10.html:47 +msgid "" +"You should check the network setup and modify it if necessary. Do not forget " +"to change the default Wi-Fi passwords!" msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state10.html:59 -msgid "Go to Apps" +#: plinth/modules/first_boot/templates/firstboot_state10.html:57 +msgid "Go to Networks" msgstr "" #: plinth/modules/first_boot/views.py:60 @@ -759,8 +782,8 @@ msgstr "" msgid "Where to Get Help" msgstr "" -#: plinth/modules/help/help.py:38 plinth/modules/help/help.py:72 -msgid "FreedomBox Manual" +#: plinth/modules/help/help.py:38 +msgid "Manual" msgstr "" #: plinth/modules/help/help.py:48 @@ -772,15 +795,21 @@ msgstr "" msgid "About {box_name}" msgstr "" +#: plinth/modules/help/help.py:73 +#, python-brace-format +msgid "{box_name} Manual" +msgstr "" + #: plinth/modules/help/templates/help_about.html:30 +#, python-format msgid "" -"FreedomBox is a community project to develop, design and promote personal " +"%(box_name)s 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." +"and a Tor relay, on a device that can replace your Wi-Fi router, so that " +"your data stays with you." msgstr "" #: plinth/modules/help/templates/help_about.html:43 @@ -794,68 +823,76 @@ msgid "" msgstr "" #: plinth/modules/help/templates/help_about.html:56 +#, python-format msgid "" "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." +"services; %(box_name)s aims to bring them all together in a convenient " +"package." msgstr "" #: plinth/modules/help/templates/help_about.html:64 +#, python-format msgid "" -"For more information about the FreedomBox project, see the FreedomBox Wiki." +"For more information about the %(box_name)s project, see the %(box_name)s Wiki." msgstr "" -#: plinth/modules/help/templates/help_about.html:72 +#: plinth/modules/help/templates/help_about.html:73 msgid "Learn more »" msgstr "" -#: plinth/modules/help/templates/help_about.html:75 +#: plinth/modules/help/templates/help_about.html:76 #, python-format msgid "You are running Plinth version %(version)s." msgstr "" -#: plinth/modules/help/templates/help_index.html:25 -#: plinth/templates/base.html:98 -msgid "Help" +#: plinth/modules/help/templates/help_base.html:36 +#, python-format +msgid "%(box_name)s Setup" msgstr "" #: plinth/modules/help/templates/help_index.html:29 #, python-format msgid "" -"The FreedomBox Manual is the best place to " +"The %(box_name)s Manual is the best place to " "start for information regarding %(box_name)s." msgstr "" #: plinth/modules/help/templates/help_index.html:36 +#, python-format msgid "" -" FreedomBox " -"project wiki contains further information." +" " +"%(box_name)s project wiki contains further information." msgstr "" #: plinth/modules/help/templates/help_index.html:43 +#, python-format msgid "" -"To seek help from FreedomBox community, queries may be posted on the " -"mailing list. The list archives also contain information about problems " -"faced by other users and possible solutions." +"To seek help from %(box_name)s community, queries may be posted on the mailing list. The list archives also contain information about " +"problems faced by other users and possible solutions." msgstr "" #: plinth/modules/help/templates/help_index.html:53 +#, python-format msgid "" -"Many FreedomBox contributors and users are also available on the #freedombox " -"channel of the irc.oftc.net IRC network." +"Many %(box_name)s contributors and users are also available on the irc.oftc." +"net IRC network. Join and request help on the #freedombox " +"channel using the IRC web interface." msgstr "" #: plinth/modules/ikiwiki/__init__.py:38 -msgid "Wiki & Blog (Ikiwiki)" +msgid "Wiki and Blog (ikiwiki)" msgstr "" #: plinth/modules/ikiwiki/__init__.py:43 -msgid "Ikiwiki wikis and blogs" +msgid "ikiwiki wikis and blogs" msgstr "" #: plinth/modules/ikiwiki/forms.py:29 -msgid "Enable Ikiwiki" +msgid "Enable ikiwiki" msgstr "" #: plinth/modules/ikiwiki/forms.py:36 @@ -884,21 +921,22 @@ msgstr "" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:27 #, python-format -msgid "Delete Wiki/Blog %(name)s" +msgid "Delete Wiki or Blog %(name)s" msgstr "" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:33 msgid "" "This action will remove all the posts, pages and comments including revision " -"history. Delete this wiki/blog permanently?" +"history. Delete this wiki or blog permanently?" msgstr "" -#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:43 +#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:44 #, python-format msgid "Delete %(name)s" msgstr "" -#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:46 +#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:47 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:60 #: plinth/modules/networks/templates/connections_delete.html:41 #: plinth/modules/users/templates/users_delete.html:41 msgid "Cancel" @@ -931,7 +969,7 @@ msgid "Create" msgstr "" #: plinth/modules/ikiwiki/views.py:73 -msgid "Wiki & Blog" +msgid "Wiki and Blog" msgstr "" #: plinth/modules/ikiwiki/views.py:106 @@ -939,7 +977,7 @@ msgid "Manage Wikis and Blogs" msgstr "" #: plinth/modules/ikiwiki/views.py:132 -msgid "Create Wiki/Blog" +msgid "Create Wiki or Blog" msgstr "" #: plinth/modules/ikiwiki/views.py:145 @@ -973,7 +1011,144 @@ msgid "Could not delete {name}: {error}" msgstr "" #: plinth/modules/ikiwiki/views.py:182 -msgid "Delete Wiki/Blog" +msgid "Delete Wiki or Blog" +msgstr "" + +#: plinth/modules/letsencrypt/__init__.py:43 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:38 +#: plinth/modules/letsencrypt/views.py:45 +msgid "Certificates (Let's Encrypt)" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:41 +#, python-format +msgid "" +"A digital certficate allows users of a web service to verify the identity of " +"the service and to securely communicate with it. %(box_name)s can " +"automatically obtain and setup digital certificates for each available " +"domain. It does so by proving itself to be the owner of a domain to Let's " +"Encrypt, a certficate authority (CA)." +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:52 +msgid "" +"Let's Encrypt is a free, automated, and open certificate authority, run for " +"the public’s benefit by the Internet Security Research Group (ISRG). Please " +"read and agree with the Let's Encrypt Subscriber Agreement before using this service." +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:66 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:70 +msgid "Domain" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:67 +msgid "Certificate Status" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:68 +msgid "Website Security" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:69 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:72 +msgid "Actions" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:79 +#, python-format +msgid "Expires on %(expiry_date)s" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:85 +msgid "No certficate" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:102 +msgid "Revoke" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:108 +msgid "Re-obtain" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:115 +msgid "Obtain" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:55 +#, python-brace-format +msgid "Certificate successfully revoked for domain {domain}" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:60 +#, python-brace-format +msgid "Failed to revoke certificate for domain {domain}: {error}" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:72 +#, python-brace-format +msgid "Certificate successfully obtained for domain {domain}" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:77 +#, python-brace-format +msgid "Failed to obtain certificate for domain {domain}: {error}" +msgstr "" + +#: plinth/modules/monkeysphere/__init__.py:32 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:35 +#: plinth/modules/monkeysphere/views.py:44 +msgid "Monkeysphere" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:38 +msgid "" +"With Monkeysphere, a PGP key can be generated for each configured domain " +"serving SSH. The PGP public key can then be uploaded to the PGP keyservers. " +"Users connecting to this machine through SSH can verify that they are " +"connecting to the correct host. For users to trust the key, at least one " +"person (usually the machine owner) must sign the key using the regular PGP " +"key signing process. See the Monkeysphere SSH documentation for more details." +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:53 +msgid "Publishing key to keyserver..." +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:71 +msgid "GPG Fingerprint" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:83 +#: plinth/modules/names/views.py:45 +msgid "Not Available" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:93 +msgid "Generate PGP Key" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:101 +msgid "Publish Key" +msgstr "" + +#: plinth/modules/monkeysphere/views.py:58 +msgid "Generated PGP key." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:83 +msgid "Cancelled key publishing." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:120 +msgid "Published key to keyserver." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:122 +msgid "Error occurred while publishing key." msgstr "" #: plinth/modules/mumble/__init__.py:38 @@ -1011,170 +1186,151 @@ msgstr "" msgid "Mumble server is not running" msgstr "" -#: plinth/modules/names/__init__.py:30 +#: plinth/modules/names/__init__.py:29 msgid "HTTP" msgstr "" -#: plinth/modules/names/__init__.py:31 +#: plinth/modules/names/__init__.py:30 msgid "HTTPS" msgstr "" -#: plinth/modules/names/__init__.py:32 +#: plinth/modules/names/__init__.py:31 msgid "SSH" msgstr "" -#: plinth/modules/names/__init__.py:46 plinth/modules/names/views.py:34 +#: plinth/modules/names/__init__.py:45 plinth/modules/names/views.py:34 msgid "Name Services" msgstr "" -#: plinth/modules/names/__init__.py:107 -msgid "Not Available" -msgstr "" - #: plinth/modules/networks/__init__.py:108 #, python-brace-format msgid "Using DNSSEC on IPv{kind}" msgstr "" #: plinth/modules/networks/forms.py:30 -msgid "-- select --" -msgstr "" - -#: plinth/modules/networks/forms.py:42 msgid "Connection Type" msgstr "" -#: plinth/modules/networks/forms.py:49 plinth/modules/networks/forms.py:106 -#: plinth/modules/networks/forms.py:133 +#: plinth/modules/networks/forms.py:37 msgid "Connection Name" msgstr "" -#: plinth/modules/networks/forms.py:51 plinth/modules/networks/forms.py:108 -#: plinth/modules/networks/forms.py:135 +#: plinth/modules/networks/forms.py:39 msgid "Physical Interface" msgstr "" -#: plinth/modules/networks/forms.py:53 plinth/modules/networks/forms.py:110 -#: plinth/modules/networks/forms.py:137 +#: plinth/modules/networks/forms.py:41 msgid "The network device that this connection should be bound to." msgstr "" -#: plinth/modules/networks/forms.py:56 plinth/modules/networks/forms.py:113 -#: plinth/modules/networks/forms.py:140 +#: plinth/modules/networks/forms.py:44 msgid "Firewall Zone" msgstr "" -#: plinth/modules/networks/forms.py:57 plinth/modules/networks/forms.py:114 -#: plinth/modules/networks/forms.py:141 +#: plinth/modules/networks/forms.py:45 msgid "" "The firewall zone will control which services are available over this " "interfaces. Select Internal only for trusted networks." msgstr "" -#: plinth/modules/networks/forms.py:61 plinth/modules/networks/forms.py:162 +#: plinth/modules/networks/forms.py:49 msgid "IPv4 Addressing Method" msgstr "" -#: plinth/modules/networks/forms.py:62 +#: plinth/modules/networks/forms.py:50 msgid "" "\"Shared\" method will start a DHCP server and \"Automatic\" method will " "acquire configuration from a DHCP server." msgstr "" -#: plinth/modules/networks/forms.py:68 plinth/modules/networks/forms.py:170 +#: plinth/modules/networks/forms.py:56 msgid "Address" msgstr "" -#: plinth/modules/networks/forms.py:72 plinth/modules/networks/forms.py:174 +#: plinth/modules/networks/forms.py:60 msgid "Netmask" msgstr "" -#: plinth/modules/networks/forms.py:73 plinth/modules/networks/forms.py:175 +#: plinth/modules/networks/forms.py:61 msgid "" "Optional value. If left blank, a default netmask based on the address will " "be used." msgstr "" -#: plinth/modules/networks/forms.py:78 plinth/modules/networks/forms.py:180 +#: plinth/modules/networks/forms.py:66 #: plinth/modules/networks/templates/connection_show.html:202 #: plinth/modules/networks/templates/connection_show.html:241 msgid "Gateway" msgstr "" -#: plinth/modules/networks/forms.py:79 plinth/modules/networks/forms.py:181 +#: plinth/modules/networks/forms.py:67 msgid "Optional value." msgstr "" -#: plinth/modules/networks/forms.py:83 plinth/modules/networks/forms.py:185 +#: plinth/modules/networks/forms.py:71 msgid "DNS Server" msgstr "" -#: plinth/modules/networks/forms.py:84 plinth/modules/networks/forms.py:186 +#: plinth/modules/networks/forms.py:72 msgid "" "Optional value. If this value is given and IPv4 addressing method is " "\"Automatic\", the DNS Servers provided by a DHCP server will be ignored." msgstr "" -#: plinth/modules/networks/forms.py:90 plinth/modules/networks/forms.py:192 +#: plinth/modules/networks/forms.py:78 msgid "Second DNS Server" msgstr "" -#: plinth/modules/networks/forms.py:91 plinth/modules/networks/forms.py:193 +#: plinth/modules/networks/forms.py:79 msgid "" "Optional value. If this value is given and IPv4 Addressing Method is " "\"Automatic\", the DNS Servers provided by a DHCP server will be ignored." msgstr "" -#: plinth/modules/networks/forms.py:121 -msgid "Show password" +#: plinth/modules/networks/forms.py:89 +msgid "-- select --" msgstr "" -#: plinth/modules/networks/forms.py:145 +#: plinth/modules/networks/forms.py:175 #: plinth/modules/networks/templates/connection_show.html:144 msgid "SSID" msgstr "" -#: plinth/modules/networks/forms.py:146 +#: plinth/modules/networks/forms.py:176 msgid "The visible name of the network." msgstr "" -#: plinth/modules/networks/forms.py:148 +#: plinth/modules/networks/forms.py:178 #: plinth/modules/networks/templates/connection_show.html:157 msgid "Mode" msgstr "" -#: plinth/modules/networks/forms.py:153 +#: plinth/modules/networks/forms.py:183 msgid "Authentication Mode" msgstr "" -#: plinth/modules/networks/forms.py:154 +#: plinth/modules/networks/forms.py:184 msgid "" "Select WPA if the wireless network is secured and requires clients to have " "the password to connect." msgstr "" -#: plinth/modules/networks/forms.py:158 +#: plinth/modules/networks/forms.py:188 msgid "Passphrase" msgstr "" -#: plinth/modules/networks/forms.py:166 -msgid "" -"Select Automatic (DHCP) if you are connecting to an existing wireless " -"network. Shared mode is useful when running an Access Point." -msgstr "" - #: plinth/modules/networks/networks.py:36 #: plinth/modules/networks/networks.py:56 msgid "Network Connections" msgstr "" #: plinth/modules/networks/networks.py:38 -#: plinth/modules/networks/networks.py:273 +#: plinth/modules/networks/networks.py:242 msgid "Nearby Wi-Fi Networks" msgstr "" #: plinth/modules/networks/networks.py:40 -#: plinth/modules/networks/networks.py:295 +#: plinth/modules/networks/networks.py:264 msgid "Add Connection" msgstr "" @@ -1198,58 +1354,58 @@ msgstr "" msgid "This type of connection is not yet understood." msgstr "" -#: plinth/modules/networks/networks.py:170 -#: plinth/modules/networks/networks.py:229 +#: plinth/modules/networks/networks.py:139 +#: plinth/modules/networks/networks.py:198 #: plinth/modules/networks/templates/connections_edit.html:34 msgid "Edit Connection" msgstr "" -#: plinth/modules/networks/networks.py:240 +#: plinth/modules/networks/networks.py:209 #, python-brace-format msgid "Activated connection {name}." msgstr "" -#: plinth/modules/networks/networks.py:243 +#: plinth/modules/networks/networks.py:212 msgid "Failed to activate connection: Connection not found." msgstr "" -#: plinth/modules/networks/networks.py:247 +#: plinth/modules/networks/networks.py:216 #, python-brace-format msgid "Failed to activate connection {name}: No suitable device is available." msgstr "" -#: plinth/modules/networks/networks.py:260 +#: plinth/modules/networks/networks.py:229 #, python-brace-format msgid "Deactivated connection {name}." msgstr "" -#: plinth/modules/networks/networks.py:263 +#: plinth/modules/networks/networks.py:232 msgid "Failed to de-activate connection: Connection not found." msgstr "" -#: plinth/modules/networks/networks.py:325 +#: plinth/modules/networks/networks.py:282 msgid "Adding New Ethernet Connection" msgstr "" -#: plinth/modules/networks/networks.py:350 +#: plinth/modules/networks/networks.py:300 msgid "Adding New PPPoE Connection" msgstr "" -#: plinth/modules/networks/networks.py:399 +#: plinth/modules/networks/networks.py:332 msgid "Adding New Wi-Fi Connection" msgstr "" -#: plinth/modules/networks/networks.py:413 +#: plinth/modules/networks/networks.py:346 #, python-brace-format msgid "Connection {name} deleted." msgstr "" -#: plinth/modules/networks/networks.py:416 -#: plinth/modules/networks/networks.py:425 +#: plinth/modules/networks/networks.py:349 +#: plinth/modules/networks/networks.py:358 msgid "Failed to delete connection: Connection not found." msgstr "" -#: plinth/modules/networks/networks.py:430 +#: plinth/modules/networks/networks.py:363 #: plinth/modules/networks/templates/connections_delete.html:26 msgid "Delete Connection" msgstr "" @@ -1259,7 +1415,7 @@ msgid "Edit connection" msgstr "" #: plinth/modules/networks/templates/connection_show.html:43 -#: plinth/templates/base.html:119 +#: plinth/templates/base.html:123 msgid "Edit" msgstr "" @@ -1406,23 +1562,24 @@ msgstr "" #: plinth/modules/networks/templates/connection_show.html:280 msgid "" -"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." +"This interface should be connected to a 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." msgstr "" #: plinth/modules/networks/templates/connection_show.html:300 msgid "" -"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." +"This interface should receive your Internet connection. If you connect it to " +"a local network/machine, many services meant to available only internally " +"will not be available." msgstr "" #: plinth/modules/networks/templates/connection_show.html:319 +#, python-format msgid "" -"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 " +"This interface is not maintained by %(box_name)s. Its security status is " +"unknown to %(box_name)s. Many %(box_name)s services may not be available on " +"this interface. It is recommended that you deactivate or delete this " "connection and re-configure it." msgstr "" @@ -1514,7 +1671,7 @@ msgstr "" #, python-format msgid "" "Virtual Private Network (VPN) is a technique for securely connecting two " -"machines in order to access resources of a private network. While you are " +"devices in order to access resources of a private network. While you are " "away from home, you can connect to your %(box_name)s in order to join your " "home network and access private/internal services provided by %(box_name)s. " "You can also access the rest of the Internet via %(box_name)s for added " @@ -1531,7 +1688,7 @@ msgid "" "To connect to %(box_name)s'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 documentation on recommended clients and instructions on how to " "configure them." msgstr "" @@ -2009,6 +2166,54 @@ msgstr "" msgid "Quassel core service is not running" msgstr "" +#: plinth/modules/repro/__init__.py:36 +#: plinth/modules/repro/templates/repro.html:26 +#: plinth/modules/repro/views.py:55 +msgid "SIP Server (repro)" +msgstr "" + +#: plinth/modules/repro/__init__.py:41 +msgid "repro SIP Server" +msgstr "" + +#: plinth/modules/repro/forms.py:29 +msgid "Enable repro service" +msgstr "" + +#: plinth/modules/repro/templates/repro.html:29 +msgid "" +"repro provides various SIP services that a SIP softphone can utilize to " +"provide audio and video calls as well as presence and instant messaging. " +"repro provides a server and SIP user accounts that clients can use to let " +"their presence known. It also acts as a proxy to federate SIP " +"communications to other servers on the Internet similar to email." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:39 +msgid "" +"To make SIP calls, a client application is needed. Available clients include " +"Jitsi (for computers) and CSipSimple (for Android phones)." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:48 +msgid "" +"Note: Before using repro, domains and users will need to " +"be configured using the web-based " +"configuration panel. Users in the admin group will be able to " +"log in to the repro configuration panel. After setting the domain, it is " +"required to restart the repro service. Disable the service and re-enable it." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:63 +msgid "repro service is running" +msgstr "" + +#: plinth/modules/repro/templates/repro.html:66 +msgid "repro service is not running" +msgstr "" + #: plinth/modules/restore/__init__.py:36 #: plinth/modules/restore/templates/restore_index.html:26 #: plinth/modules/restore/views.py:46 @@ -2029,8 +2234,8 @@ msgid "" "reStore is a server for unhosted web " "applications. The idea is to uncouple web applications from data. No " "matter where a web application is served from, the data can be stored on an " -"unhosted storage server of user's choice. With reStore, your " -"%(cfg.box_name)s becomes your unhosted storage server." +"unhosted storage server of user's choice. With reStore, your %(box_name)s " +"becomes your unhosted storage server." msgstr "" #: plinth/modules/restore/templates/restore_index.html:40 @@ -2107,7 +2312,7 @@ msgstr "" #: plinth/modules/system/system.py:33 #: plinth/modules/system/templates/system.html:25 -#: plinth/templates/base.html:105 +#: plinth/templates/base.html:109 msgid "System Configuration" msgstr "" @@ -2122,33 +2327,71 @@ msgid "" "The options affect the %(box_name)s at its most general level, so be careful!" msgstr "" -#: plinth/modules/tor/__init__.py:50 -msgid "Tor relay port available" +#: plinth/modules/tor/__init__.py:48 plinth/modules/tor/templates/tor.html:35 +msgid "Anonymity Network (Tor)" +msgstr "" + +#: plinth/modules/tor/__init__.py:53 +msgid "Tor Anonymity Network" msgstr "" #: plinth/modules/tor/__init__.py:58 +msgid "Tor Bridge Relay" +msgstr "" + +#: plinth/modules/tor/__init__.py:76 plinth/modules/tor/views.py:144 +msgid "Tor Hidden Service" +msgstr "" + +#: plinth/modules/tor/__init__.py:222 +msgid "Tor relay port available" +msgstr "" + +#: plinth/modules/tor/__init__.py:230 msgid "Obfs3 transport registered" msgstr "" -#: plinth/modules/tor/__init__.py:64 +#: plinth/modules/tor/__init__.py:236 msgid "Obfs4 transport registered" msgstr "" -#: plinth/modules/tor/__init__.py:101 +#: plinth/modules/tor/__init__.py:273 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "" -#: plinth/modules/tor/__init__.py:112 +#: plinth/modules/tor/__init__.py:284 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "" -#: plinth/modules/tor/templates/tor.html:26 plinth/modules/tor/tor.py:66 -msgid "Anonymity Network (Tor)" +#: plinth/modules/tor/forms.py:32 +msgid "Enable Tor" +msgstr "" + +#: plinth/modules/tor/forms.py:35 +msgid "Enable Tor Hidden Service" +msgstr "" + +#: plinth/modules/tor/forms.py:38 +#, python-brace-format +msgid "" +"A hidden service will allow {box_name} to provide selected services (such as " +"ownCloud or chat) without revealing its location." +msgstr "" + +#: plinth/modules/tor/forms.py:42 +msgid "Download software packages over Tor" +msgstr "" + +#: plinth/modules/tor/forms.py:44 +msgid "" +"When enabled, software will be downloaded over the Tor network for " +"installations and upgrades. This adds a degree of privacy and security " +"during software downloads." msgstr "" -#: plinth/modules/tor/templates/tor.html:29 +#: plinth/modules/tor/templates/tor.html:38 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -2157,28 +2400,32 @@ msgid "" "Tor Browser." msgstr "" -#: plinth/modules/tor/templates/tor.html:44 +#: plinth/modules/tor/templates/tor.html:54 +msgid "Tor configuration is being updated" +msgstr "" + +#: plinth/modules/tor/templates/tor.html:62 msgid "Tor is running" msgstr "" -#: plinth/modules/tor/templates/tor.html:47 +#: plinth/modules/tor/templates/tor.html:65 msgid "Tor is not running" msgstr "" -#: plinth/modules/tor/templates/tor.html:59 +#: plinth/modules/tor/templates/tor.html:77 msgid "Hidden Service" msgstr "" -#: plinth/modules/tor/templates/tor.html:60 -#: plinth/modules/tor/templates/tor.html:102 +#: plinth/modules/tor/templates/tor.html:78 +#: plinth/modules/tor/templates/tor.html:120 msgid "Port" msgstr "" -#: plinth/modules/tor/templates/tor.html:85 +#: plinth/modules/tor/templates/tor.html:103 msgid "Bridge" msgstr "" -#: plinth/modules/tor/templates/tor.html:88 +#: plinth/modules/tor/templates/tor.html:106 #, python-format msgid "" "Your %(box_name)s is configured as a Tor bridge with obfsproxy, so it can " @@ -2187,84 +2434,39 @@ msgid "" "forwarded, if necessary:" msgstr "" -#: plinth/modules/tor/templates/tor.html:101 +#: plinth/modules/tor/templates/tor.html:119 msgid "Service" msgstr "" -#: plinth/modules/tor/templates/tor.html:117 +#: plinth/modules/tor/templates/tor.html:135 msgid "SOCKS" msgstr "" -#: plinth/modules/tor/templates/tor.html:120 +#: plinth/modules/tor/templates/tor.html:138 #, python-format msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "" -#: plinth/modules/tor/tor.py:46 -msgid "Enable Tor" -msgstr "" - -#: plinth/modules/tor/tor.py:49 -msgid "Enable Tor Hidden Service" -msgstr "" - -#: plinth/modules/tor/tor.py:51 -msgid "" -"A hidden service will allow FreedomBox to provide selected services (such as " -"ownCloud or Chat) without revealing its location." -msgstr "" - -#: plinth/modules/tor/tor.py:55 -msgid "Download software packages over Tor" -msgstr "" - -#: plinth/modules/tor/tor.py:57 -msgid "" -"When enabled, software will be downloaded over the Tor network for " -"installations and upgrades. This adds a degree of privacy and security " -"during software downloads." -msgstr "" - -#: plinth/modules/tor/tor.py:85 plinth/modules/tor/tor.py:285 -msgid "Tor Hidden Service" -msgstr "" - -#: plinth/modules/tor/tor.py:115 +#: plinth/modules/tor/views.py:68 msgid "Tor Control Panel" msgstr "" -#: plinth/modules/tor/tor.py:240 +#: plinth/modules/tor/views.py:79 #, python-brace-format msgid "Action error: {0} [{1}] [{2}]" msgstr "" -#: plinth/modules/tor/tor.py:256 -msgid "Tor enabled" -msgstr "" - -#: plinth/modules/tor/tor.py:259 -msgid "Tor disabled" -msgstr "" - -#: plinth/modules/tor/tor.py:264 -msgid "Tor hidden service enabled" -msgstr "" - -#: plinth/modules/tor/tor.py:267 -msgid "Tor hidden service disabled" -msgstr "" - -#: plinth/modules/tor/tor.py:292 -msgid "Enabled package download over Tor" +#: plinth/modules/tor/views.py:148 +msgid "Configuration updated." msgstr "" -#: plinth/modules/tor/tor.py:295 -msgid "Disabled package download over Tor" +#: plinth/modules/tor/views.py:150 +msgid "An error occurred during configuration." msgstr "" #: plinth/modules/transmission/__init__.py:38 #: plinth/modules/transmission/templates/transmission.html:26 -#: plinth/modules/transmission/views.py:63 +#: plinth/modules/transmission/views.py:67 msgid "BitTorrent (Transmission)" msgstr "" @@ -2330,70 +2532,66 @@ msgid "" "will attempt to perform any package upgrades that are available." msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:40 -msgid "There was an error while upgrading." +#: plinth/modules/upgrades/templates/upgrades.html:37 +msgid "" +"Upgrades install the latest software and security updates. When automatic " +"upgrades are enabled, upgrades are automatically run every night. You don't " +"normally need to start the upgrade process." msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:43 -#: plinth/modules/upgrades/templates/upgrades.html:59 -msgid "Output from unattended-upgrades:" +#: plinth/modules/upgrades/templates/upgrades.html:45 +msgid "" +"Depending on the number of packages to install, this may take a long time to " +"complete. While upgrades are in progress, you will not be able to install " +"other packages. During the upgrade, this web interface may be temporarily " +"unavailable and show an error. Refresh the page to continue." msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:50 -msgid "The operating system is up to date now.  " +#: plinth/modules/upgrades/templates/upgrades.html:58 +msgid "Upgrade now »" msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:53 -msgid "Show Details" +#: plinth/modules/upgrades/templates/upgrades.html:65 +msgid "A package manager is running." msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:69 -msgid "" -"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." +#: plinth/modules/upgrades/templates/upgrades.html:70 +msgid "Recent log from upgrades:" msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:80 -msgid "Upgrade now »" +#: plinth/modules/upgrades/views.py:36 plinth/modules/upgrades/views.py:66 +msgid "Automatic Upgrades" msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:87 -msgid "System is being upgraded." +#: plinth/modules/upgrades/views.py:38 +msgid "Upgrade Packages" msgstr "" -#: plinth/modules/upgrades/views.py:35 plinth/modules/upgrades/views.py:64 -msgid "Automatic Upgrades" +#: plinth/modules/upgrades/views.py:96 +msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:37 -msgid "Upgrade Packages" +#: plinth/modules/upgrades/views.py:99 +msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:75 +#: plinth/modules/upgrades/views.py:102 msgid "Package Upgrades" msgstr "" -#: plinth/modules/upgrades/views.py:116 +#: plinth/modules/upgrades/views.py:131 #, python-brace-format msgid "Error when configuring unattended-upgrades: {error}" msgstr "" -#: plinth/modules/upgrades/views.py:121 +#: plinth/modules/upgrades/views.py:136 msgid "Automatic upgrades enabled" msgstr "" -#: plinth/modules/upgrades/views.py:123 +#: plinth/modules/upgrades/views.py:138 msgid "Automatic upgrades disabled" msgstr "" -#: plinth/modules/upgrades/views.py:142 -msgid "Upgrade completed." -msgstr "" - -#: plinth/modules/upgrades/views.py:144 -msgid "Upgrade failed." -msgstr "" - #: plinth/modules/users/__init__.py:36 msgid "Users and Groups" msgstr "" @@ -2429,19 +2627,30 @@ msgstr "" msgid "Failed to add new user to {group} group." msgstr "" -#: plinth/modules/users/forms.py:126 +#: plinth/modules/users/forms.py:92 +msgid "SSH Keys" +msgstr "" + +#: plinth/modules/users/forms.py:96 +msgid "" +"Setting an SSH public key will allow this user to securely log in to the " +"system without using a password. You may enter multiple keys, one on each " +"line. Blank lines and lines starting with # will be ignored." +msgstr "" + +#: plinth/modules/users/forms.py:136 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:138 +#: plinth/modules/users/forms.py:148 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:149 +#: plinth/modules/users/forms.py:159 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:174 +#: plinth/modules/users/forms.py:188 msgid "Changing LDAP user password failed." msgstr "" @@ -2460,7 +2669,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:26 -#: plinth/modules/users/views.py:103 +#: plinth/modules/users/views.py:110 msgid "Delete User" msgstr "" @@ -2513,20 +2722,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:113 +#: plinth/modules/users/views.py:120 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:120 +#: plinth/modules/users/views.py:127 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:129 +#: plinth/modules/users/views.py:136 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:130 +#: plinth/modules/users/views.py:137 msgid "Password changed successfully." msgstr "" @@ -2601,8 +2810,9 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "" -#: plinth/service.py:78 -msgid "FreedomBox Web Interface (Plinth)" +#: plinth/service.py:79 +#, python-brace-format +msgid "{box_name} Web Interface (Plinth)" msgstr "" #: plinth/templates/404.html:25 @@ -2633,27 +2843,24 @@ msgid "" msgstr "" #: plinth/templates/base.html:49 -msgid "Plinth administrative interface for the FreedomBox" -msgstr "" - -#: plinth/templates/base.html:52 plinth/templates/base.html.py:88 -msgid "FreedomBox" +#, python-format +msgid "Plinth administrative interface for the %(box_name)s" msgstr "" -#: plinth/templates/base.html:81 +#: plinth/templates/base.html:83 msgid "Toggle navigation" msgstr "" -#: plinth/templates/base.html:121 plinth/templates/base.html.py:122 +#: plinth/templates/base.html:125 plinth/templates/base.html.py:126 msgid "Change password" msgstr "" -#: plinth/templates/base.html:125 plinth/templates/base.html.py:126 -#: plinth/templates/base.html:139 plinth/templates/base.html.py:141 +#: plinth/templates/base.html:129 plinth/templates/base.html.py:130 +#: plinth/templates/base.html:143 plinth/templates/base.html.py:145 msgid "Log out" msgstr "" -#: plinth/templates/base.html:131 plinth/templates/base.html.py:133 +#: plinth/templates/base.html:135 plinth/templates/base.html.py:137 msgid "Log in" msgstr "" diff --git a/plinth/locale/nb/LC_MESSAGES/django.po b/plinth/locale/nb/LC_MESSAGES/django.po index 9119c5cc7..ab90a45f5 100644 --- a/plinth/locale/nb/LC_MESSAGES/django.po +++ b/plinth/locale/nb/LC_MESSAGES/django.po @@ -14,7 +14,7 @@ msgid "" msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-12-20 13:58+0530\n" +"POT-Creation-Date: 2016-01-31 22:19+0530\n" "PO-Revision-Date: 2016-01-16 08:50+0000\n" "Last-Translator: pere \n" "Language-Team: Norwegian Bokmål (http://www.transifex.com/freedombox/plinth/" @@ -55,11 +55,15 @@ msgstr "Koble til {host}:{port}" msgid "Cannot connect to {host}:{port}" msgstr "Kan ikke koble til {host}:{port}" +#: plinth/context_processors.py:36 +msgid "FreedomBox" +msgstr "FreedomBox" + #: plinth/modules/apps/apps.py:26 msgid "Apps" msgstr "Apper" -#: plinth/modules/apps/apps.py:32 plinth/templates/base.html.py:90 +#: plinth/modules/apps/apps.py:32 plinth/templates/base.html.py:93 msgid "Applications" msgstr "Anvendelser" @@ -101,10 +105,18 @@ msgid "Enable service discovery" msgstr "Aktivere finne tjenesten (Service Discovery)" #: plinth/modules/avahi/templates/avahi.html:29 -msgid "" -"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 " +#, fuzzy, python-format +#| msgid "" +#| "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." +msgid "" +"Service discovery allows other devices on the network to discover your " +"%(box_name)s and services running on it. It also allows %(box_name)s to " +"discover other devices 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." @@ -119,14 +131,15 @@ msgstr "" #: plinth/modules/avahi/templates/avahi.html:40 #: plinth/modules/datetime/templates/datetime.html:35 #: plinth/modules/deluge/templates/deluge.html:39 -#: plinth/modules/dynamicdns/dynamicdns.py:38 +#: plinth/modules/dynamicdns/dynamicdns.py:39 #: plinth/modules/firewall/templates/firewall.html:57 #: plinth/modules/mumble/templates/mumble.html:44 #: plinth/modules/networks/templates/connection_show.html:261 #: plinth/modules/openvpn/templates/openvpn.html:81 #: plinth/modules/privoxy/templates/privoxy.html:48 #: plinth/modules/quassel/templates/quassel.html:50 -#: plinth/modules/tor/templates/tor.html:39 +#: plinth/modules/repro/templates/repro.html:58 +#: plinth/modules/tor/templates/tor.html:48 #: plinth/modules/transmission/templates/transmission.html:42 #: plinth/modules/xmpp/templates/xmpp.html:58 msgid "Status" @@ -149,9 +162,10 @@ msgstr "Serveren til finne tjenesten (tjenesten Discovery) kjører ikke" #: plinth/modules/owncloud/templates/owncloud.html:51 #: plinth/modules/privoxy/templates/privoxy.html:62 #: plinth/modules/quassel/templates/quassel.html:65 +#: plinth/modules/repro/templates/repro.html:72 #: plinth/modules/roundcube/templates/roundcube.html:62 #: plinth/modules/shaarli/templates/shaarli.html:40 -#: plinth/modules/tor/templates/tor.html:74 +#: plinth/modules/tor/templates/tor.html:92 #: plinth/modules/transmission/templates/transmission.html:56 #: plinth/modules/xmpp/templates/xmpp.html:72 msgid "Configuration" @@ -167,10 +181,11 @@ msgstr "Oppsett" #: plinth/modules/openvpn/templates/openvpn.html:138 #: plinth/modules/privoxy/templates/privoxy.html:70 #: plinth/modules/quassel/templates/quassel.html:73 +#: plinth/modules/repro/templates/repro.html:80 #: plinth/modules/restore/templates/restore_index.html:54 #: plinth/modules/roundcube/templates/roundcube.html:70 #: plinth/modules/shaarli/templates/shaarli.html:48 -#: plinth/modules/tor/templates/tor.html:82 +#: plinth/modules/tor/templates/tor.html:100 #: plinth/modules/transmission/templates/transmission.html:64 #: plinth/modules/upgrades/templates/upgrades_configure.html:34 #: plinth/modules/xmpp/templates/xmpp.html:80 @@ -179,12 +194,13 @@ msgstr "Oppdater oppsett" #: plinth/modules/avahi/views.py:73 plinth/modules/datetime/views.py:85 #: plinth/modules/deluge/views.py:80 -#: plinth/modules/dynamicdns/dynamicdns.py:368 +#: plinth/modules/dynamicdns/dynamicdns.py:371 #: plinth/modules/ikiwiki/views.py:95 plinth/modules/mumble/views.py:80 #: plinth/modules/openvpn/views.py:142 plinth/modules/privoxy/views.py:83 -#: plinth/modules/quassel/views.py:76 plinth/modules/restore/views.py:68 -#: plinth/modules/roundcube/views.py:84 plinth/modules/shaarli/views.py:74 -#: plinth/modules/transmission/views.py:105 plinth/modules/xmpp/views.py:100 +#: plinth/modules/quassel/views.py:76 plinth/modules/repro/views.py:77 +#: plinth/modules/restore/views.py:68 plinth/modules/roundcube/views.py:84 +#: plinth/modules/shaarli/views.py:74 plinth/modules/transmission/views.py:109 +#: plinth/modules/xmpp/views.py:100 msgid "Configuration updated" msgstr "Oppsett oppdatert" @@ -192,27 +208,34 @@ msgstr "Oppsett oppdatert" #: plinth/modules/deluge/views.py:82 plinth/modules/ikiwiki/views.py:97 #: plinth/modules/mumble/views.py:82 plinth/modules/openvpn/views.py:144 #: plinth/modules/owncloud/owncloud.py:93 plinth/modules/privoxy/views.py:85 -#: plinth/modules/quassel/views.py:78 plinth/modules/restore/views.py:70 -#: plinth/modules/roundcube/views.py:86 plinth/modules/shaarli/views.py:76 -#: plinth/modules/tor/tor.py:250 plinth/modules/transmission/views.py:107 -#: plinth/modules/upgrades/views.py:103 plinth/modules/xmpp/views.py:102 +#: plinth/modules/quassel/views.py:78 plinth/modules/repro/views.py:79 +#: plinth/modules/restore/views.py:70 plinth/modules/roundcube/views.py:86 +#: plinth/modules/shaarli/views.py:76 plinth/modules/tor/views.py:111 +#: plinth/modules/transmission/views.py:111 +#: plinth/modules/upgrades/views.py:118 plinth/modules/xmpp/views.py:102 msgid "Setting unchanged" msgstr "Oppsett uendret" -#: plinth/modules/config/config.py:83 plinth/modules/config/config.py:120 -#: plinth/modules/dynamicdns/dynamicdns.py:145 +#: plinth/modules/config/config.py:84 plinth/modules/config/config.py:121 +#: plinth/modules/dynamicdns/dynamicdns.py:148 msgid "Invalid domain name" msgstr "Ugyldig domenenavn" -#: plinth/modules/config/config.py:94 +#: plinth/modules/config/config.py:95 msgid "Hostname" msgstr "Vertsnavn" -#: plinth/modules/config/config.py:96 -msgid "" -"Hostname is the local name by which other machines on the local network " -"reach your machine. It must start and end with an alphabet or a digit and " -"have as interior characters only alphabets, digits and hyphens. Total " +#: plinth/modules/config/config.py:97 +#, fuzzy, python-brace-format +#| msgid "" +#| "Hostname is the local name by which other machines on the local network " +#| "reach your machine. It must start and end with an alphabet or a digit " +#| "and have as interior characters only alphabets, digits and hyphens. " +#| "Total length must be 63 characters or less." +msgid "" +"Hostname is the local name by which other devices on the local network can " +"reach your {box_name}. It must start and end with an alphabet or a digit " +"and have as interior characters only alphabets, digits and hyphens. Total " "length must be 63 characters or less." msgstr "" "Vertsnavn er det lokale navnet som andre maskiner på ditt lokalnett bruker " @@ -220,24 +243,32 @@ msgstr "" "siffer, og som interne tegn kun ha bokstaver, siffer eller bindestrek. " "Total lengde må være 63 tegn eller mindre." -#: plinth/modules/config/config.py:104 +#: plinth/modules/config/config.py:105 msgid "Invalid hostname" msgstr "Ugyldig vertsnavn" -#: plinth/modules/config/config.py:107 plinth/modules/config/config.py:153 +#: plinth/modules/config/config.py:108 plinth/modules/config/config.py:153 #: plinth/modules/config/config.py:265 -#: plinth/modules/dynamicdns/dynamicdns.py:140 +#: plinth/modules/dynamicdns/dynamicdns.py:143 msgid "Domain Name" msgstr "Domenenavn" -#: plinth/modules/config/config.py:109 -msgid "" -"Domain name is the global name by which other machines on the Internet can " -"reach you. It must consist of labels separated by dots. Each label must " -"start and end with an alphabet or a digit and have as interior characters " -"only alphabets, digits and hyphens. Length of each label must be 63 " -"characters or less. Total length of domain name must be 253 characters or " -"less." +#: plinth/modules/config/config.py:110 +#, fuzzy, python-brace-format +#| msgid "" +#| "Domain name is the global name by which other machines on the Internet " +#| "can reach you. It must consist of labels separated by dots. Each label " +#| "must start and end with an alphabet or a digit and have as interior " +#| "characters only alphabets, digits and hyphens. Length of each label must " +#| "be 63 characters or less. Total length of domain name must be 253 " +#| "characters or less." +msgid "" +"Domain name is the global name by which other devices on the Internet can " +"reach your {box_name}. It must consist of labels separated by dots. Each " +"label must start and end with an alphabet or a digit and have as interior " +"characters only alphabets, digits and hyphens. Length of each label must be " +"63 characters or less. Total length of domain name must be 253 characters " +"or less." msgstr "" "Domenenavn er det globale navnet som andre maskiner på Internett bruker for " "å nå din maskin. Det må bestå av delnavn med punktum mellom seg. Hvert " @@ -246,16 +277,18 @@ msgstr "" "være 63 tegn eller færre. Total lengde for domenenavnet må være 253 tegn " "eller færre." -#: plinth/modules/config/config.py:124 +#: plinth/modules/config/config.py:125 msgid "Language" msgstr "Språk" -#: plinth/modules/config/config.py:126 -msgid "Language for this FreedomBox web administration interface" +#: plinth/modules/config/config.py:127 +#, fuzzy +#| msgid "Language for this FreedomBox web administration interface" +msgid "Language for this web administration interface" msgstr "Språk for webadministrasjonsgrensesnittet til denne FreedomBox-en" #: plinth/modules/config/config.py:135 -#: plinth/modules/dynamicdns/dynamicdns.py:36 +#: plinth/modules/dynamicdns/dynamicdns.py:37 #: plinth/modules/ikiwiki/views.py:36 msgid "Configure" msgstr "Sette opp" @@ -452,16 +485,16 @@ msgstr "Test" msgid "Result" msgstr "Resultat" -#: plinth/modules/dynamicdns/dynamicdns.py:34 plinth/modules/help/help.py:40 +#: plinth/modules/dynamicdns/dynamicdns.py:35 plinth/modules/help/help.py:40 msgid "About" msgstr "Om" -#: plinth/modules/dynamicdns/dynamicdns.py:44 -#: plinth/modules/dynamicdns/dynamicdns.py:53 +#: plinth/modules/dynamicdns/dynamicdns.py:45 +#: plinth/modules/dynamicdns/dynamicdns.py:54 msgid "Dynamic DNS" msgstr "Dynamisk DNS (Domain Name System)" -#: plinth/modules/dynamicdns/dynamicdns.py:70 +#: plinth/modules/dynamicdns/dynamicdns.py:71 msgid "" "The Variables <User>, <Pass>, <Ip>, <Domain> may be " "used within the URL. For details see the update URL templates of the example " @@ -471,7 +504,7 @@ msgstr "" "i nettadressen. For detaljer, se de oppdaterte nettadressemalene fra " "eksempel-leverandørene." -#: plinth/modules/dynamicdns/dynamicdns.py:74 +#: plinth/modules/dynamicdns/dynamicdns.py:75 msgid "" "Please choose an update protocol according to your provider. If your " "provider does not support the GnudIP protocol or your provider is not listed " @@ -481,24 +514,30 @@ msgstr "" "leverandøren ikke støtter GnudIP-protokollen, eller leverandøren din ikke er " "oppført, kan du bruke leverandørens nettadresse for oppdatering." -#: plinth/modules/dynamicdns/dynamicdns.py:79 +#: plinth/modules/dynamicdns/dynamicdns.py:80 +#, fuzzy +#| msgid "" +#| "Please do not enter a URL here (like \"https://example.com/\") but only " +#| "the hostname of the GnuDIP server (like \"example.pcom\")." msgid "" "Please do not enter a URL here (like \"https://example.com/\") but only the " -"hostname of the GnuDIP server (like \"example.pcom\")." +"hostname of the GnuDIP server (like \"example.com\")." msgstr "" "Vennligst ikke kjør en nettadresse her (som \"https://example.com/\") men " "bare vertsnavnet til GnuDIP-tjeneren (som \"example.com\")." -#: plinth/modules/dynamicdns/dynamicdns.py:83 -msgid "The public domain name you want use to reach your box." +#: plinth/modules/dynamicdns/dynamicdns.py:84 +#, fuzzy, python-brace-format +#| msgid "The public domain name you want use to reach your box." +msgid "The public domain name you want use to reach your {box_name}." msgstr "Det offentlige domenenavnet du vil bruke for å nå din boks." -#: plinth/modules/dynamicdns/dynamicdns.py:85 +#: plinth/modules/dynamicdns/dynamicdns.py:87 msgid "Use this option if your provider uses self signed certificates." msgstr "" "Bruk dette alternativet hvis leverandøren bruker selvsignerte sertifikater." -#: plinth/modules/dynamicdns/dynamicdns.py:88 +#: plinth/modules/dynamicdns/dynamicdns.py:90 msgid "" "If this option is selected, your username and password will be used for HTTP " "basic authentication." @@ -506,108 +545,127 @@ msgstr "" "Hvis dette alternativet velges, vil ditt brukernavn og passord brukes for " "enkel godkjenning i HTTP." -#: plinth/modules/dynamicdns/dynamicdns.py:91 +#: plinth/modules/dynamicdns/dynamicdns.py:93 msgid "" "Leave this field empty if you want to keep your previous configured password." msgstr "La dette feltet stå tomt hvis du vil beholde ditt forrige passord." -#: plinth/modules/dynamicdns/dynamicdns.py:94 +#: plinth/modules/dynamicdns/dynamicdns.py:96 +#, fuzzy, python-brace-format +#| msgid "" +#| "Optional Value. If your FreedomBox is not connected directly to the " +#| "Internet (i.e. connected to a NAT router) this URL is used to figure out " +#| "the real Internet IP. The URL should simply return the IP wherethe client " +#| "comes from. Example: http://myip.datasystems24.de" msgid "" -"Optional Value. If your FreedomBox is not connected directly to the Internet " +"Optional Value. If your {box_name} is not connected directly to the Internet " "(i.e. connected to a NAT router) this URL is used to figure out the real " -"Internet IP. The URL should simply return the IP wherethe client comes from. " -"Example: http://myip.datasystems24.de" +"Internet IP. The URL should simply return the IP where the client comes from " +"(example: http://myip.datasystems24.de)." msgstr "" "Valgfri verdi. Hvis din FreedomBox ikke er koblet direkte til Internett " "(dvs. koblet til en NAT-ruter) brukes denne nettadressen til å finne den " "virkelige Internett-IP. Nettadressen skal bare returnere IP-en som klienten " "kommer fra. Eksempel: http://myip.datasystems24.de" -#: plinth/modules/dynamicdns/dynamicdns.py:101 +#: plinth/modules/dynamicdns/dynamicdns.py:104 msgid "" "You should have been requested to select a username when you created the " "account." msgstr "Du skulle blitt bedt om å velge et brukernavn da du opprettet kontoen." -#: plinth/modules/dynamicdns/dynamicdns.py:112 +#: plinth/modules/dynamicdns/dynamicdns.py:115 msgid "Enable Dynamic DNS" msgstr "Aktiver dynamisk DNS (Dynamic DNS)" -#: plinth/modules/dynamicdns/dynamicdns.py:115 +#: plinth/modules/dynamicdns/dynamicdns.py:118 msgid "Service type" msgstr "Tjenestetype" -#: plinth/modules/dynamicdns/dynamicdns.py:120 +#: plinth/modules/dynamicdns/dynamicdns.py:123 msgid "GnudIP Server Address" msgstr "GnudIP-tjeneradresse" -#: plinth/modules/dynamicdns/dynamicdns.py:125 +#: plinth/modules/dynamicdns/dynamicdns.py:128 msgid "Invalid server name" msgstr "Ugyldig tjenernavn" -#: plinth/modules/dynamicdns/dynamicdns.py:128 +#: plinth/modules/dynamicdns/dynamicdns.py:131 msgid "Update URL" msgstr "Oppdater URL" -#: plinth/modules/dynamicdns/dynamicdns.py:132 -msgid "accept all SSL certificates" +#: plinth/modules/dynamicdns/dynamicdns.py:135 +#, fuzzy +#| msgid "accept all SSL certificates" +msgid "Accept all SSL certificates" msgstr "godta alle SSL-sertifikater" -#: plinth/modules/dynamicdns/dynamicdns.py:136 -msgid "use HTTP basic authentication" +#: plinth/modules/dynamicdns/dynamicdns.py:139 +#, fuzzy +#| msgid "use HTTP basic authentication" +msgid "Use HTTP basic authentication" msgstr "benytt HTTP grunnleggende autentisering" -#: plinth/modules/dynamicdns/dynamicdns.py:148 -#: plinth/modules/networks/forms.py:118 plinth/modules/transmission/forms.py:39 +#: plinth/modules/dynamicdns/dynamicdns.py:151 +#: plinth/modules/networks/forms.py:146 plinth/modules/transmission/forms.py:39 msgid "Username" msgstr "Brukernavn" -#: plinth/modules/dynamicdns/dynamicdns.py:151 -#: plinth/modules/networks/forms.py:119 plinth/modules/transmission/forms.py:43 +#: plinth/modules/dynamicdns/dynamicdns.py:154 +#: plinth/modules/networks/forms.py:147 plinth/modules/transmission/forms.py:43 msgid "Password" msgstr "Passord" -#: plinth/modules/dynamicdns/dynamicdns.py:154 -msgid "show password" -msgstr "vis passord" +#: plinth/modules/dynamicdns/dynamicdns.py:157 +#: plinth/modules/networks/forms.py:149 +msgid "Show password" +msgstr "Vis passord" -#: plinth/modules/dynamicdns/dynamicdns.py:158 +#: plinth/modules/dynamicdns/dynamicdns.py:161 msgid "IP check URL" msgstr "URL for IP-sjekk" -#: plinth/modules/dynamicdns/dynamicdns.py:184 +#: plinth/modules/dynamicdns/dynamicdns.py:187 msgid "Please provide update URL or a GnuDIP Server" msgstr "Vennligst oppgi oppdatert nettadresse eller en GnuDIP-tjener" -#: plinth/modules/dynamicdns/dynamicdns.py:187 +#: plinth/modules/dynamicdns/dynamicdns.py:190 msgid "Please provide GnuDIP username" msgstr "Vennligst oppgi GnuDIP-brukernavn" -#: plinth/modules/dynamicdns/dynamicdns.py:190 +#: plinth/modules/dynamicdns/dynamicdns.py:193 msgid "Please provide GnuDIP domain" msgstr "Vennligst oppgi GnuDIP-domene" -#: plinth/modules/dynamicdns/dynamicdns.py:195 +#: plinth/modules/dynamicdns/dynamicdns.py:198 msgid "Please provide a password" msgstr "Vennligst oppgi et passord" -#: plinth/modules/dynamicdns/dynamicdns.py:214 +#: plinth/modules/dynamicdns/dynamicdns.py:217 msgid "Configure Dynamic DNS" msgstr "Konfigurer dynamisk DNS" -#: plinth/modules/dynamicdns/dynamicdns.py:236 +#: plinth/modules/dynamicdns/dynamicdns.py:239 msgid "Status of Dynamic DNS" msgstr "Status for dynamisk DNS" #: plinth/modules/dynamicdns/templates/dynamicdns.html:25 -msgid "DynamicDNS client" +#, fuzzy +#| msgid "DynamicDNS client" +msgid "Dynamic DNS Client" msgstr "Dynamisk DNS-klient" #: plinth/modules/dynamicdns/templates/dynamicdns.html:28 +#, fuzzy, python-format +#| msgid "" +#| "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)." msgid "" "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)." +"may find the services which are provided by %(box_name)s, such as ownCloud." msgstr "" "Hvis Internett-leverandøren endrer din IP-adresse periodisk (dvs. hver 24h/ " "hver 24 time) kan det være vanskelig for andre å finne deg på Internett. Og " @@ -615,13 +673,22 @@ msgstr "" "din ownCloud)." #: plinth/modules/dynamicdns/templates/dynamicdns.html:37 +#, fuzzy +#| msgid "" +#| "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 gnudip " +#| "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." msgid "" "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 gnudip 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." +"Internet asks for your DNS name he will get your current IP answered." msgstr "" "Hvis IP endres av din internettleverandør, tillater dynamisk DNS å presse " "din nåværende offentlige IP-adressen til en freedns.afraid.org ." #: plinth/modules/dynamicdns/templates/dynamicdns.html:61 +#, fuzzy, python-format +#| msgid "" +#| "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." msgid "" -"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." +"If your %(box_name)s is connected behind some NAT router, don't forget to " +"add port forwarding (i.e. forward some standard ports like 80 and 443)." msgstr "" "Hvis FreedomBox er koblet bak en NAT-ruter, ikke glem å legge videresending " "av porten (dvs. videresende noen standard porter som 80 og 443) til din " @@ -674,16 +745,23 @@ msgstr "" "vi ikke oppdage NAT-typen." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:35 -msgid "Direct connection to the internet." +#, fuzzy +#| msgid "Direct connection to the internet." +msgid "Direct connection to the Internet." msgstr "Direkte kobling til Internett." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:37 -#, python-format -msgid "" -"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)s minutes until we " -"update your DNS entry in case of WAN IP change." +#, fuzzy, python-format +#| msgid "" +#| "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)s " +#| "minutes until we update your DNS entry in case of WAN IP change." +msgid "" +"Behind NAT. This means that Dynamic DNS service will poll the \"IP check URL" +"\" for changes (the \"IP check URL\" entry is needed for this - otherwise IP " +"changes will not be detected). In case the WAN IP changes, it may take up " +"to %(timer)s minutes until your DNS entry is updated." msgstr "" "Bak NAT, betyr dette at den dynamiske DNS-tjenesten vil spørre etter «IP " "sjekk URL» etter endringer (vi trenger «IP sjekk URL» på grunn av dette - " @@ -701,19 +779,23 @@ msgid "Firewall" msgstr "Brannmur" #: plinth/modules/firewall/templates/firewall.html:28 -#, python-format +#, fuzzy, python-format +#| msgid "" +#| "Firewall is a network security system that controls the incoming and " +#| "outgoing network traffic on your %(box_name)s. Keeping a firewall enabled " +#| "and properly configured reduces risk of security threat from the Internet." msgid "" -"Firewall is a network security system that controls the incoming and " -"outgoing network traffic on your %(box_name)s. Keeping a firewall enabled " -"and properly configured reduces risk of security threat from the Internet." +"Firewall is a security system that controls the incoming and outgoing " +"network traffic on your %(box_name)s. Keeping a firewall enabled and " +"properly configured reduces risk of security threat from the Internet." msgstr "" "Firewall er et sikkerhetssystem for nettverk som styrer innkommende og " "utgående nettverkstrafikk på %(box_name)s. Å holde en brannmur aktivert og " "riktig konfigurert, reduserer risikoen for sikkerhetstrusler fra Internett." #: plinth/modules/firewall/templates/firewall.html:36 -msgid "The following is the current status:" -msgstr "Følgende er nåværende status:" +msgid "Current status:" +msgstr "" #: plinth/modules/firewall/templates/firewall.html:41 #, python-format @@ -733,11 +815,13 @@ msgid "Service/Port" msgstr "Tjeneste/Port" #: plinth/modules/firewall/templates/firewall.html:67 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:91 #: plinth/modules/names/templates/names.html:51 msgid "Enabled" msgstr "Aktivert" #: plinth/modules/firewall/templates/firewall.html:70 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:93 #: plinth/modules/names/templates/names.html:53 msgid "Disabled" msgstr "Deaktivert" @@ -759,10 +843,15 @@ msgid "Blocked" msgstr "Blokkert" #: plinth/modules/firewall/templates/firewall.html:103 +#, fuzzy +#| msgid "" +#| "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." msgid "" "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." +"also permitted in the firewall and when you disable a service it is also " +"disabled in the firewall." msgstr "" "Driften av brannmuren er automatisk. Når du aktiverer en tjeneste, blir den " "automatisk tillatt i brannmuren, og hvis du deaktiverer en tjeneste, blir " @@ -780,26 +869,30 @@ msgstr "Klarte ikke å legge til en ny bruker i admingruppen." msgid "User account created, you are now logged in" msgstr "Brukerkonto er opprettet, du er nå logget inn" -#: plinth/modules/first_boot/templates/firstboot_state0.html:50 -msgid "Congratulations! Your FreedomBox is up and running!" -msgstr "Gratulerer! Din FreedomBox er oppe og går!" +#: plinth/modules/first_boot/templates/firstboot_navbar.html:23 +#: plinth/modules/help/templates/help_index.html:25 +#: plinth/templates/base.html:102 +msgid "Help" +msgstr "Hjelp" + +#: plinth/modules/first_boot/templates/firstboot_state0.html:45 +#, fuzzy +#| msgid "Start setup" +msgid "Start Setup" +msgstr "Start oppsett" -#: plinth/modules/first_boot/templates/firstboot_state0.html:54 +#: plinth/modules/first_boot/templates/firstboot_state0.html:49 +#, python-format msgid "" -"Please provide the following basic information to complete the setup process." +"To complete the setup of your %(box_name)s, please provide some basic " +"information." msgstr "" -"Vennligst oppgi følgende grunnleggende informasjon for å fullføre " -"installasjonsprosessen." - -#: plinth/modules/first_boot/templates/firstboot_state0.html:62 -msgid "Next" -msgstr "Neste" -#: plinth/modules/first_boot/templates/firstboot_state1.html:39 +#: plinth/modules/first_boot/templates/firstboot_state1.html:41 msgid "Administrator Account" msgstr "Administratorkonto" -#: plinth/modules/first_boot/templates/firstboot_state1.html:42 +#: plinth/modules/first_boot/templates/firstboot_state1.html:44 msgid "" "Choose a username and password to access this web interface. The password " "can be changed later. This user will be granted administrative privileges. " @@ -809,7 +902,7 @@ msgstr "" "nettgrensesnittet. Passordet kan endres senere. Denne brukeren vil bli " "innvilget administrative rettigheter. Andre brukere kan legges til senere." -#: plinth/modules/first_boot/templates/firstboot_state1.html:55 +#: plinth/modules/first_boot/templates/firstboot_state1.html:57 msgid "Box it up!" msgstr "Pakk det sammen!" @@ -818,34 +911,45 @@ msgid "Setup Complete!" msgstr "Oppsett komplett!" #: plinth/modules/first_boot/templates/firstboot_state10.html:32 +#, fuzzy, python-format +#| msgid "" +#| "To make your FreedomBox functional, you need some applications. " +#| "Applications will be installed the first time you access them." msgid "" -"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." -msgstr "" -"FreedomBox-oppsettet er nå fullført. Men du bør sjekke nettverksoppsettet og " -"endre det om nødvendig. Ikke glem å endre standard Wi-Fi-passordene." - -#: plinth/modules/first_boot/templates/firstboot_state10.html:40 -msgid "" -"To make your FreedomBox functional, you need some applications. " -"Applications will be installed the first time you access them." +"%(box_name)s setup is now complete. To make your %(box_name)s functional, " +"you need some applications. They will be installed the first time you " +"access them." msgstr "" "For å gjøre din FreedomBox funksjonell trenger du noen programmer. De vil " "bli installert første gang du bruker dem." -#: plinth/modules/first_boot/templates/firstboot_state10.html:47 -msgid "Network Configuration" +#: plinth/modules/first_boot/templates/firstboot_state10.html:41 +msgid "Go to Apps" +msgstr "Gå til applikasjoner" + +#: plinth/modules/first_boot/templates/firstboot_state10.html:44 +#, fuzzy +#| msgid "Network Configuration" +msgid "Current Network Configuration" msgstr "Nettverkskonfigurering" -#: plinth/modules/first_boot/templates/firstboot_state10.html:54 +#: plinth/modules/first_boot/templates/firstboot_state10.html:47 +#, fuzzy +#| msgid "" +#| "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." +msgid "" +"You should check the network setup and modify it if necessary. Do not forget " +"to change the default Wi-Fi passwords!" +msgstr "" +"FreedomBox-oppsettet er nå fullført. Men du bør sjekke nettverksoppsettet og " +"endre det om nødvendig. Ikke glem å endre standard Wi-Fi-passordene." + +#: plinth/modules/first_boot/templates/firstboot_state10.html:57 msgid "Go to Networks" msgstr "Gå til nettverk" -#: plinth/modules/first_boot/templates/firstboot_state10.html:59 -msgid "Go to Apps" -msgstr "Gå til applikasjoner" - #: plinth/modules/first_boot/views.py:60 msgid "Setup Complete" msgstr "Oppsett ferdig" @@ -858,9 +962,9 @@ msgstr "Dokumentasjon" msgid "Where to Get Help" msgstr "Hvor kan en få hjelp" -#: plinth/modules/help/help.py:38 plinth/modules/help/help.py:72 -msgid "FreedomBox Manual" -msgstr "Håndbok for FreedomBox" +#: plinth/modules/help/help.py:38 +msgid "Manual" +msgstr "" #: plinth/modules/help/help.py:48 msgid "Documentation and FAQ" @@ -871,15 +975,30 @@ msgstr "Dokumentasjon og ofte stilte spørsmål" msgid "About {box_name}" msgstr "Om {box_name}" +#: plinth/modules/help/help.py:73 +#, fuzzy, python-brace-format +#| msgid "About {box_name}" +msgid "{box_name} Manual" +msgstr "Om {box_name}" + #: plinth/modules/help/templates/help_about.html:30 -msgid "" -"FreedomBox is a community project to develop, design and promote personal " +#, fuzzy, python-format +#| msgid "" +#| "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." +msgid "" +"%(box_name)s 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." +"and a Tor relay, on a device that can replace your Wi-Fi router, so that " +"your data stays with you." msgstr "" "FreedomBox er et fellesskapsprosjekt for å utvikle, designe og fremme " "personlige tjenermaskiner som kjører gratis programvare for privat, " @@ -907,58 +1026,81 @@ msgstr "" "arkitektur." #: plinth/modules/help/templates/help_about.html:56 +#, fuzzy, python-format +#| msgid "" +#| "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." msgid "" "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." +"services; %(box_name)s aims to bring them all together in a convenient " +"package." msgstr "" "En rekke prosjekter arbeider for å realisere en fremtid med distribuerte " "tjenester; FreedomBoxs mål er å bringe alle sammen i en praktisk pakke." #: plinth/modules/help/templates/help_about.html:64 +#, fuzzy, python-format +#| msgid "" +#| "For more information about the FreedomBox project, see the FreedomBox Wiki." msgid "" -"For more information about the FreedomBox project, see the FreedomBox Wiki." +"For more information about the %(box_name)s project, see the %(box_name)s Wiki." msgstr "" "For mer informasjon om FreedomBox prosjektet, se FreedomBox Wiki." -#: plinth/modules/help/templates/help_about.html:72 +#: plinth/modules/help/templates/help_about.html:73 msgid "Learn more »" msgstr "Lær mer »" -#: plinth/modules/help/templates/help_about.html:75 +#: plinth/modules/help/templates/help_about.html:76 #, python-format msgid "You are running Plinth version %(version)s." msgstr "Du benytter Plinth versjon %(version)s." -#: plinth/modules/help/templates/help_index.html:25 -#: plinth/templates/base.html:98 -msgid "Help" -msgstr "Hjelp" +#: plinth/modules/help/templates/help_base.html:36 +#, python-format +msgid "%(box_name)s Setup" +msgstr "" #: plinth/modules/help/templates/help_index.html:29 -#, python-format +#, fuzzy, python-format +#| msgid "" +#| "The FreedomBox Manual is the best place to " +#| "start for information regarding %(box_name)s." msgid "" -"The FreedomBox Manual is the best place to " +"The %(box_name)s Manual is the best place to " "start for information regarding %(box_name)s." msgstr "" "FreedomBox Manual \n" "er det beste stedet å starte for informasjon om %(box_name)s." #: plinth/modules/help/templates/help_index.html:36 +#, fuzzy, python-format +#| msgid "" +#| " " +#| "FreedomBox project wiki contains further information." msgid "" -" FreedomBox " -"project wiki contains further information." +" " +"%(box_name)s project wiki contains further information." msgstr "" " FreedomBox " "prosjekt wiki har ytterligere informasjon." #: plinth/modules/help/templates/help_index.html:43 -msgid "" -"To seek help from FreedomBox community, queries may be posted on the " -"mailing list. The list archives also contain information about problems " -"faced by other users and possible solutions." +#, fuzzy, python-format +#| msgid "" +#| "To seek help from FreedomBox community, queries may be posted on the mailing list. The list archives also contain information about " +#| "problems faced by other users and possible solutions." +msgid "" +"To seek help from %(box_name)s community, queries may be posted on the mailing list. The list archives also contain information about " +"problems faced by other users and possible solutions." msgstr "" "Å søke hjelp fra fellesskapet til FreedomBox-fellesskapet, kan spørsmål " "legges ut på #freedombox " +"channel using the IRC web interface." msgstr "" -"Mange FreedomBox bidragsytere og brukere er også tilgjengelig på #freedombox " -"kanalen til irc.oftc.net IRC-nettverk." #: plinth/modules/ikiwiki/__init__.py:38 -msgid "Wiki & Blog (Ikiwiki)" +#, fuzzy +#| msgid "Wiki & Blog (Ikiwiki)" +msgid "Wiki and Blog (ikiwiki)" msgstr "Wiki og blogg (Ikiwiki)" #: plinth/modules/ikiwiki/__init__.py:43 -msgid "Ikiwiki wikis and blogs" +#, fuzzy +#| msgid "Ikiwiki wikis and blogs" +msgid "ikiwiki wikis and blogs" msgstr "Ikiwiki wikier og blogger" #: plinth/modules/ikiwiki/forms.py:29 -msgid "Enable Ikiwiki" +#, fuzzy +#| msgid "Enable Ikiwiki" +msgid "Enable ikiwiki" msgstr "Aktiver Ikiwiki" #: plinth/modules/ikiwiki/forms.py:36 @@ -1012,24 +1161,30 @@ msgstr "" "ikiwiki." #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:27 -#, python-format -msgid "Delete Wiki/Blog %(name)s" +#, fuzzy, python-format +#| msgid "Delete Wiki/Blog %(name)s" +msgid "Delete Wiki or Blog %(name)s" msgstr "Slett Wiki/Blogg %(name)s" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:33 +#, fuzzy +#| msgid "" +#| "This action will remove all the posts, pages and comments including " +#| "revision history. Delete this wiki/blog permanently?" msgid "" "This action will remove all the posts, pages and comments including revision " -"history. Delete this wiki/blog permanently?" +"history. Delete this wiki or blog permanently?" msgstr "" "Denne handlingen vil fjerne alle innlegg, sider og kommentarer, medregnet " "endringshistorikken. Slette wiki/blogg permanent?" -#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:43 +#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:44 #, python-format msgid "Delete %(name)s" msgstr "Slette %(name)s" -#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:46 +#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:47 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:60 #: plinth/modules/networks/templates/connections_delete.html:41 #: plinth/modules/users/templates/users_delete.html:41 msgid "Cancel" @@ -1062,7 +1217,9 @@ msgid "Create" msgstr "Opprett" #: plinth/modules/ikiwiki/views.py:73 -msgid "Wiki & Blog" +#, fuzzy +#| msgid "Wiki & Blog" +msgid "Wiki and Blog" msgstr "Wiki og blogg" #: plinth/modules/ikiwiki/views.py:106 @@ -1070,8 +1227,10 @@ msgid "Manage Wikis and Blogs" msgstr "Vedlikehold Wiki og blogg" #: plinth/modules/ikiwiki/views.py:132 -msgid "Create Wiki/Blog" -msgstr "Opprett Wiki/blogg" +#, fuzzy +#| msgid "Create a Wiki or Blog" +msgid "Create Wiki or Blog" +msgstr "Opprett en Wiki eller blogg" #: plinth/modules/ikiwiki/views.py:145 #, python-brace-format @@ -1104,9 +1263,154 @@ msgid "Could not delete {name}: {error}" msgstr "Kunne ikke slette {name}: {error}" #: plinth/modules/ikiwiki/views.py:182 -msgid "Delete Wiki/Blog" +#, fuzzy +#| msgid "Delete Wiki/Blog" +msgid "Delete Wiki or Blog" msgstr "Slette Wiki/blogg" +#: plinth/modules/letsencrypt/__init__.py:43 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:38 +#: plinth/modules/letsencrypt/views.py:45 +msgid "Certificates (Let's Encrypt)" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:41 +#, python-format +msgid "" +"A digital certficate allows users of a web service to verify the identity of " +"the service and to securely communicate with it. %(box_name)s can " +"automatically obtain and setup digital certificates for each available " +"domain. It does so by proving itself to be the owner of a domain to Let's " +"Encrypt, a certficate authority (CA)." +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:52 +msgid "" +"Let's Encrypt is a free, automated, and open certificate authority, run for " +"the public’s benefit by the Internet Security Research Group (ISRG). Please " +"read and agree with the Let's Encrypt Subscriber Agreement before using this service." +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:66 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:70 +#, fuzzy +#| msgid "Domain Name" +msgid "Domain" +msgstr "Domenenavn" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:67 +msgid "Certificate Status" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:68 +#, fuzzy +#| msgid "Security" +msgid "Website Security" +msgstr "Sikkerhet" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:69 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:72 +#, fuzzy +#| msgid "Applications" +msgid "Actions" +msgstr "Anvendelser" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:79 +#, python-format +msgid "Expires on %(expiry_date)s" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:85 +msgid "No certficate" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:102 +msgid "Revoke" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:108 +msgid "Re-obtain" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:115 +msgid "Obtain" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:55 +#, python-brace-format +msgid "Certificate successfully revoked for domain {domain}" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:60 +#, python-brace-format +msgid "Failed to revoke certificate for domain {domain}: {error}" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:72 +#, python-brace-format +msgid "Certificate successfully obtained for domain {domain}" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:77 +#, python-brace-format +msgid "Failed to obtain certificate for domain {domain}: {error}" +msgstr "" + +#: plinth/modules/monkeysphere/__init__.py:32 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:35 +#: plinth/modules/monkeysphere/views.py:44 +msgid "Monkeysphere" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:38 +msgid "" +"With Monkeysphere, a PGP key can be generated for each configured domain " +"serving SSH. The PGP public key can then be uploaded to the PGP keyservers. " +"Users connecting to this machine through SSH can verify that they are " +"connecting to the correct host. For users to trust the key, at least one " +"person (usually the machine owner) must sign the key using the regular PGP " +"key signing process. See the Monkeysphere SSH documentation for more details." +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:53 +msgid "Publishing key to keyserver..." +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:71 +msgid "GPG Fingerprint" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:83 +#: plinth/modules/names/views.py:45 +msgid "Not Available" +msgstr "Ikke tilgjengelig" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:93 +msgid "Generate PGP Key" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:101 +msgid "Publish Key" +msgstr "" + +#: plinth/modules/monkeysphere/views.py:58 +msgid "Generated PGP key." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:83 +msgid "Cancelled key publishing." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:120 +msgid "Published key to keyserver." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:122 +msgid "Error occurred while publishing key." +msgstr "" + #: plinth/modules/mumble/__init__.py:38 #: plinth/modules/mumble/templates/mumble.html:26 #: plinth/modules/mumble/views.py:58 @@ -1147,61 +1451,48 @@ msgstr "Mumble-tjener kjører" msgid "Mumble server is not running" msgstr "Mumble-tjener kjører ikke" -#: plinth/modules/names/__init__.py:30 +#: plinth/modules/names/__init__.py:29 msgid "HTTP" msgstr "HTTP" -#: plinth/modules/names/__init__.py:31 +#: plinth/modules/names/__init__.py:30 msgid "HTTPS" msgstr "HTTPS" -#: plinth/modules/names/__init__.py:32 +#: plinth/modules/names/__init__.py:31 msgid "SSH" msgstr "SSH" -#: plinth/modules/names/__init__.py:46 plinth/modules/names/views.py:34 +#: plinth/modules/names/__init__.py:45 plinth/modules/names/views.py:34 msgid "Name Services" msgstr "Navnetjenester" -#: plinth/modules/names/__init__.py:107 -msgid "Not Available" -msgstr "Ikke tilgjengelig" - #: plinth/modules/networks/__init__.py:108 #, python-brace-format msgid "Using DNSSEC on IPv{kind}" msgstr "Bruker DNSSEC på IPv{kind}" #: plinth/modules/networks/forms.py:30 -msgid "-- select --" -msgstr "-- velg --" - -#: plinth/modules/networks/forms.py:42 msgid "Connection Type" msgstr "Oppkoblingstype" -#: plinth/modules/networks/forms.py:49 plinth/modules/networks/forms.py:106 -#: plinth/modules/networks/forms.py:133 +#: plinth/modules/networks/forms.py:37 msgid "Connection Name" msgstr "Oppkoblingsnavn" -#: plinth/modules/networks/forms.py:51 plinth/modules/networks/forms.py:108 -#: plinth/modules/networks/forms.py:135 +#: plinth/modules/networks/forms.py:39 msgid "Physical Interface" msgstr "Fysisk grensesnitt" -#: plinth/modules/networks/forms.py:53 plinth/modules/networks/forms.py:110 -#: plinth/modules/networks/forms.py:137 +#: plinth/modules/networks/forms.py:41 msgid "The network device that this connection should be bound to." msgstr "Nettverksenheten som denne forbindelsen bør være bundet til." -#: plinth/modules/networks/forms.py:56 plinth/modules/networks/forms.py:113 -#: plinth/modules/networks/forms.py:140 +#: plinth/modules/networks/forms.py:44 msgid "Firewall Zone" msgstr "Brannmursone" -#: plinth/modules/networks/forms.py:57 plinth/modules/networks/forms.py:114 -#: plinth/modules/networks/forms.py:141 +#: plinth/modules/networks/forms.py:45 msgid "" "The firewall zone will control which services are available over this " "interfaces. Select Internal only for trusted networks." @@ -1209,11 +1500,11 @@ msgstr "" "Brannmuren vil kontrollere hvilke tjenester som er tilgjengelig over dette " "grensesnitt. Velg Internal bare for klarerte nettverk." -#: plinth/modules/networks/forms.py:61 plinth/modules/networks/forms.py:162 +#: plinth/modules/networks/forms.py:49 msgid "IPv4 Addressing Method" msgstr "IPv4 adresseringsmetode" -#: plinth/modules/networks/forms.py:62 +#: plinth/modules/networks/forms.py:50 msgid "" "\"Shared\" method will start a DHCP server and \"Automatic\" method will " "acquire configuration from a DHCP server." @@ -1221,15 +1512,15 @@ msgstr "" "«Shared»-metoden vil starte en DHCP-tjener, og «Automatic»-metoden vil hente " "konfigurasjon fra en DHCP-tjener." -#: plinth/modules/networks/forms.py:68 plinth/modules/networks/forms.py:170 +#: plinth/modules/networks/forms.py:56 msgid "Address" msgstr "Adresse" -#: plinth/modules/networks/forms.py:72 plinth/modules/networks/forms.py:174 +#: plinth/modules/networks/forms.py:60 msgid "Netmask" msgstr "Netmaske" -#: plinth/modules/networks/forms.py:73 plinth/modules/networks/forms.py:175 +#: plinth/modules/networks/forms.py:61 msgid "" "Optional value. If left blank, a default netmask based on the address will " "be used." @@ -1237,21 +1528,21 @@ msgstr "" "Valgfri verdi. Om det står tomt, vil en standard nettmaske, basert på " "adressen, bli brukt." -#: plinth/modules/networks/forms.py:78 plinth/modules/networks/forms.py:180 +#: plinth/modules/networks/forms.py:66 #: plinth/modules/networks/templates/connection_show.html:202 #: plinth/modules/networks/templates/connection_show.html:241 msgid "Gateway" msgstr "Inngangsport" -#: plinth/modules/networks/forms.py:79 plinth/modules/networks/forms.py:181 +#: plinth/modules/networks/forms.py:67 msgid "Optional value." msgstr "Valgfri verdi." -#: plinth/modules/networks/forms.py:83 plinth/modules/networks/forms.py:185 +#: plinth/modules/networks/forms.py:71 msgid "DNS Server" msgstr "DNS-tjener" -#: plinth/modules/networks/forms.py:84 plinth/modules/networks/forms.py:186 +#: plinth/modules/networks/forms.py:72 msgid "" "Optional value. If this value is given and IPv4 addressing method is " "\"Automatic\", the DNS Servers provided by a DHCP server will be ignored." @@ -1259,11 +1550,11 @@ msgstr "" "Valgfri verdi. Hvis denne verdien er gitt, og IPv4 adresseringsmetoden er " "«Automatic», vil DNS-tjenere levert av en DHCP-tjener, bli ignorert." -#: plinth/modules/networks/forms.py:90 plinth/modules/networks/forms.py:192 +#: plinth/modules/networks/forms.py:78 msgid "Second DNS Server" msgstr "Andre DNS-tjener" -#: plinth/modules/networks/forms.py:91 plinth/modules/networks/forms.py:193 +#: plinth/modules/networks/forms.py:79 msgid "" "Optional value. If this value is given and IPv4 Addressing Method is " "\"Automatic\", the DNS Servers provided by a DHCP server will be ignored." @@ -1271,29 +1562,29 @@ msgstr "" "Valgfri verdi. Hvis denne verdien er gitt, og IPv4 adresseringsmetoden er " "«Automatic», vil DNS-servere som tilbys av en DHCP-tjener, bli ignorert." -#: plinth/modules/networks/forms.py:121 -msgid "Show password" -msgstr "Vis passord" +#: plinth/modules/networks/forms.py:89 +msgid "-- select --" +msgstr "-- velg --" -#: plinth/modules/networks/forms.py:145 +#: plinth/modules/networks/forms.py:175 #: plinth/modules/networks/templates/connection_show.html:144 msgid "SSID" msgstr "SSID" -#: plinth/modules/networks/forms.py:146 +#: plinth/modules/networks/forms.py:176 msgid "The visible name of the network." msgstr "Det synlige navnet på nettverket." -#: plinth/modules/networks/forms.py:148 +#: plinth/modules/networks/forms.py:178 #: plinth/modules/networks/templates/connection_show.html:157 msgid "Mode" msgstr "Modus" -#: plinth/modules/networks/forms.py:153 +#: plinth/modules/networks/forms.py:183 msgid "Authentication Mode" msgstr "Autentiseringsmodus" -#: plinth/modules/networks/forms.py:154 +#: plinth/modules/networks/forms.py:184 msgid "" "Select WPA if the wireless network is secured and requires clients to have " "the password to connect." @@ -1301,30 +1592,22 @@ msgstr "" "Velg WPA (Works Progress Administration) hvis det trådløse nettverket er " "sikret og krever at brukerne har passordet for å koble til." -#: plinth/modules/networks/forms.py:158 +#: plinth/modules/networks/forms.py:188 msgid "Passphrase" msgstr "Passfrase" -#: plinth/modules/networks/forms.py:166 -msgid "" -"Select Automatic (DHCP) if you are connecting to an existing wireless " -"network. Shared mode is useful when running an Access Point." -msgstr "" -"Velg Automatisk (DHCP) hvis du kobler til et eksisterende trådløst nettverk. " -"Felles modus er nyttig når du kjører et Access Point." - #: plinth/modules/networks/networks.py:36 #: plinth/modules/networks/networks.py:56 msgid "Network Connections" msgstr "Nettverksoppkoblinger" #: plinth/modules/networks/networks.py:38 -#: plinth/modules/networks/networks.py:273 +#: plinth/modules/networks/networks.py:242 msgid "Nearby Wi-Fi Networks" msgstr "Wi-Fi-nettverk i nærheten" #: plinth/modules/networks/networks.py:40 -#: plinth/modules/networks/networks.py:295 +#: plinth/modules/networks/networks.py:264 msgid "Add Connection" msgstr "Legg til tilkobling" @@ -1348,59 +1631,59 @@ msgstr "Kan ikke redigere tilkobling: Tilkobling ikke funnet." msgid "This type of connection is not yet understood." msgstr "Denne typen tilkobling er ennå ikke forstått." -#: plinth/modules/networks/networks.py:170 -#: plinth/modules/networks/networks.py:229 +#: plinth/modules/networks/networks.py:139 +#: plinth/modules/networks/networks.py:198 #: plinth/modules/networks/templates/connections_edit.html:34 msgid "Edit Connection" msgstr "Endre oppkobling" -#: plinth/modules/networks/networks.py:240 +#: plinth/modules/networks/networks.py:209 #, python-brace-format msgid "Activated connection {name}." msgstr "Aktiverte tilkobling {name}." -#: plinth/modules/networks/networks.py:243 +#: plinth/modules/networks/networks.py:212 msgid "Failed to activate connection: Connection not found." msgstr "Kunne ikke aktivere tilkobling: Tilkobling ikke funnet." -#: plinth/modules/networks/networks.py:247 +#: plinth/modules/networks/networks.py:216 #, python-brace-format msgid "Failed to activate connection {name}: No suitable device is available." msgstr "" "Klarte ikke aktivere tilkobling {name}: Ingen passende enhet er tilgjengelig." -#: plinth/modules/networks/networks.py:260 +#: plinth/modules/networks/networks.py:229 #, python-brace-format msgid "Deactivated connection {name}." msgstr "Deaktivert forbindelse {name}." -#: plinth/modules/networks/networks.py:263 +#: plinth/modules/networks/networks.py:232 msgid "Failed to de-activate connection: Connection not found." msgstr "Kunne ikke deaktivere tilkobling: Tilkobling ikke funnet." -#: plinth/modules/networks/networks.py:325 +#: plinth/modules/networks/networks.py:282 msgid "Adding New Ethernet Connection" msgstr "Legge til nye Ethernet-tilkoblinger" -#: plinth/modules/networks/networks.py:350 +#: plinth/modules/networks/networks.py:300 msgid "Adding New PPPoE Connection" msgstr "Legge til ny PPPoE-forbindelse" -#: plinth/modules/networks/networks.py:399 +#: plinth/modules/networks/networks.py:332 msgid "Adding New Wi-Fi Connection" msgstr "Legge til ny Wi-Fi-forbindelse" -#: plinth/modules/networks/networks.py:413 +#: plinth/modules/networks/networks.py:346 #, python-brace-format msgid "Connection {name} deleted." msgstr "Forbindelse {name} slettet." -#: plinth/modules/networks/networks.py:416 -#: plinth/modules/networks/networks.py:425 +#: plinth/modules/networks/networks.py:349 +#: plinth/modules/networks/networks.py:358 msgid "Failed to delete connection: Connection not found." msgstr "Kunne ikke slette tilkobling: Tilkobling ikke funnet." -#: plinth/modules/networks/networks.py:430 +#: plinth/modules/networks/networks.py:363 #: plinth/modules/networks/templates/connections_delete.html:26 msgid "Delete Connection" msgstr "Slett tilkobling" @@ -1410,7 +1693,7 @@ msgid "Edit connection" msgstr "Rediger tilkobling" #: plinth/modules/networks/templates/connection_show.html:43 -#: plinth/templates/base.html:119 +#: plinth/templates/base.html:123 msgid "Edit" msgstr "Rediger" @@ -1556,10 +1839,16 @@ msgid "Firewall zone" msgstr "Brannmursone" #: plinth/modules/networks/templates/connection_show.html:280 +#, fuzzy +#| msgid "" +#| "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." msgid "" -"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." +"This interface should be connected to a 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." msgstr "" "Dette grensesnittet skal kobles til lokalt nettverk/maskin. Hvis du kobler " "det til et offentlig nettverk, vil tjenester som er ment å bare være " @@ -1567,20 +1856,31 @@ msgstr "" "sikkerhetsrisiko." #: plinth/modules/networks/templates/connection_show.html:300 +#, fuzzy +#| msgid "" +#| "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." msgid "" -"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." +"This interface should receive your Internet connection. If you connect it to " +"a local network/machine, many services meant to available only internally " +"will not be available." msgstr "" "Dette grensesnittet skal motta din Internett-forbindelse. Hvis du kobler den " "til et lokalt nettverk/maskin, vil mange tjenester som er ment å kun være " "tilgjengelig internt, ikke være tilgjengelige." #: plinth/modules/networks/templates/connection_show.html:319 -msgid "" -"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 " +#, fuzzy, python-format +#| msgid "" +#| "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." +msgid "" +"This interface is not maintained by %(box_name)s. Its security status is " +"unknown to %(box_name)s. Many %(box_name)s services may not be available on " +"this interface. It is recommended that you deactivate or delete this " "connection and re-configure it." msgstr "" "Dette grensesnittet er ikke vedlikeholdt av FreedomBox. FreedomBox kjenner " @@ -1673,10 +1973,17 @@ msgid "Enable OpenVPN server" msgstr "Aktiver OpenVPN-tjener" #: plinth/modules/openvpn/templates/openvpn.html:38 -#, python-format +#, fuzzy, python-format +#| msgid "" +#| "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 %(box_name)s in order to join " +#| "your home network and access private/internal services provided by " +#| "%(box_name)s. You can also access the rest of the Internet via " +#| "%(box_name)s for added security and anonymity." msgid "" "Virtual Private Network (VPN) is a technique for securely connecting two " -"machines in order to access resources of a private network. While you are " +"devices in order to access resources of a private network. While you are " "away from home, you can connect to your %(box_name)s in order to join your " "home network and access private/internal services provided by %(box_name)s. " "You can also access the rest of the Internet via %(box_name)s for added " @@ -1695,12 +2002,19 @@ msgid "Profile" msgstr "Profil" #: plinth/modules/openvpn/templates/openvpn.html:54 -#, python-format +#, fuzzy, python-format +#| msgid "" +#| "To connect to %(box_name)s'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 documentation on recommended clients and instructions on how to " +#| "configure them." msgid "" "To connect to %(box_name)s'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 documentation on recommended clients and instructions on how to " "configure them." msgstr "" @@ -2253,6 +2567,64 @@ msgstr "Quassel kjernetjeneste kjører" msgid "Quassel core service is not running" msgstr "Quassel kjernetjeneste kjører ikke" +#: plinth/modules/repro/__init__.py:36 +#: plinth/modules/repro/templates/repro.html:26 +#: plinth/modules/repro/views.py:55 +#, fuzzy +#| msgid "Server port" +msgid "SIP Server (repro)" +msgstr "Tjenerport" + +#: plinth/modules/repro/__init__.py:41 +#, fuzzy +#| msgid "Second DNS Server" +msgid "repro SIP Server" +msgstr "Andre DNS-tjener" + +#: plinth/modules/repro/forms.py:29 +#, fuzzy +#| msgid "Enable Quassel core service" +msgid "Enable repro service" +msgstr "Aktiver Quassel kjernetjeneste" + +#: plinth/modules/repro/templates/repro.html:29 +msgid "" +"repro provides various SIP services that a SIP softphone can utilize to " +"provide audio and video calls as well as presence and instant messaging. " +"repro provides a server and SIP user accounts that clients can use to let " +"their presence known. It also acts as a proxy to federate SIP " +"communications to other servers on the Internet similar to email." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:39 +msgid "" +"To make SIP calls, a client application is needed. Available clients include " +"Jitsi (for computers) and CSipSimple (for Android phones)." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:48 +msgid "" +"Note: Before using repro, domains and users will need to " +"be configured using the web-based " +"configuration panel. Users in the admin group will be able to " +"log in to the repro configuration panel. After setting the domain, it is " +"required to restart the repro service. Disable the service and re-enable it." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:63 +#, fuzzy +#| msgid "Quassel core service is running" +msgid "repro service is running" +msgstr "Quassel kjernetjeneste kjører" + +#: plinth/modules/repro/templates/repro.html:66 +#, fuzzy +#| msgid "Quassel core service is not running" +msgid "repro service is not running" +msgstr "Quassel kjernetjeneste kjører ikke" + #: plinth/modules/restore/__init__.py:36 #: plinth/modules/restore/templates/restore_index.html:26 #: plinth/modules/restore/views.py:46 @@ -2268,13 +2640,19 @@ msgid "Enable reStore" msgstr "Aktivere reStore" #: plinth/modules/restore/templates/restore_index.html:29 -#, python-format +#, fuzzy, python-format +#| msgid "" +#| "reStore is a server for unhosted web " +#| "applications. The idea is to uncouple web applications from data. No " +#| "matter where a web application is served from, the data can be stored on " +#| "an unhosted storage server of user's choice. With reStore, your " +#| "%(cfg.box_name)s becomes your unhosted storage server." msgid "" "reStore is a server for unhosted web " "applications. The idea is to uncouple web applications from data. No " "matter where a web application is served from, the data can be stored on an " -"unhosted storage server of user's choice. With reStore, your " -"%(cfg.box_name)s becomes your unhosted storage server." +"unhosted storage server of user's choice. With reStore, your %(box_name)s " +"becomes your unhosted storage server." msgstr "" "reStore er en tjener for vertsløse web-" "anvendelser. Ideen er å fjerne koblingen mellom web-anvendelser og data. " @@ -2377,7 +2755,7 @@ msgstr "System" #: plinth/modules/system/system.py:33 #: plinth/modules/system/templates/system.html:25 -#: plinth/templates/base.html:105 +#: plinth/templates/base.html:109 msgid "System Configuration" msgstr "Systemoppsett" @@ -2395,33 +2773,81 @@ msgstr "" "Mulighetene som berører %(box_name)s er oftet på generelt nivå, så vær " "forsiktig!" -#: plinth/modules/tor/__init__.py:50 +#: plinth/modules/tor/__init__.py:48 plinth/modules/tor/templates/tor.html:35 +msgid "Anonymity Network (Tor)" +msgstr "Anonymitetsnettverk (Tor)" + +#: plinth/modules/tor/__init__.py:53 +#, fuzzy +#| msgid "Anonymity Network (Tor)" +msgid "Tor Anonymity Network" +msgstr "Anonymitetsnettverk (Tor)" + +#: plinth/modules/tor/__init__.py:58 +msgid "Tor Bridge Relay" +msgstr "" + +#: plinth/modules/tor/__init__.py:76 plinth/modules/tor/views.py:144 +msgid "Tor Hidden Service" +msgstr "Skjult Tor-tjeneste" + +#: plinth/modules/tor/__init__.py:222 msgid "Tor relay port available" msgstr "Tor relay port tilgjengelig" -#: plinth/modules/tor/__init__.py:58 +#: plinth/modules/tor/__init__.py:230 msgid "Obfs3 transport registered" msgstr "Obfs3-transport registrert" -#: plinth/modules/tor/__init__.py:64 +#: plinth/modules/tor/__init__.py:236 msgid "Obfs4 transport registered" msgstr "Obfs4-transport registrert" -#: plinth/modules/tor/__init__.py:101 +#: plinth/modules/tor/__init__.py:273 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "Adgang til URL {url} på tcp{kind} via Tor" -#: plinth/modules/tor/__init__.py:112 +#: plinth/modules/tor/__init__.py:284 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "Bekreft Tor-bruk på {url} via tcp{kind}" -#: plinth/modules/tor/templates/tor.html:26 plinth/modules/tor/tor.py:66 -msgid "Anonymity Network (Tor)" -msgstr "Anonymitetsnettverk (Tor)" +#: plinth/modules/tor/forms.py:32 +msgid "Enable Tor" +msgstr "Aktiver Tor" + +#: plinth/modules/tor/forms.py:35 +msgid "Enable Tor Hidden Service" +msgstr "Aktiver skjulte Tor-tjenester" + +#: plinth/modules/tor/forms.py:38 +#, fuzzy, python-brace-format +#| msgid "" +#| "A hidden service will allow FreedomBox to provide selected services (such " +#| "as ownCloud or Chat) without revealing its location." +msgid "" +"A hidden service will allow {box_name} to provide selected services (such as " +"ownCloud or chat) without revealing its location." +msgstr "" +"En skjult tjeneste vil tillate FreedomBox å levere valgte tjenester (for " +"eksempel ownCloud eller Chat) uten å avsløre sin beliggenhet." + +#: plinth/modules/tor/forms.py:42 +msgid "Download software packages over Tor" +msgstr "Last ned programpakker via Tor" + +#: plinth/modules/tor/forms.py:44 +msgid "" +"When enabled, software will be downloaded over the Tor network for " +"installations and upgrades. This adds a degree of privacy and security " +"during software downloads." +msgstr "" +"Når den er aktivert, vil programvaren lastes ned over Tor-nettverket for " +"installasjoner og oppgraderinger. Dette legger til en viss grad privatliv og " +"sikkerhet under nedlasting av programvare." -#: plinth/modules/tor/templates/tor.html:29 +#: plinth/modules/tor/templates/tor.html:38 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -2435,28 +2861,34 @@ msgstr "" "href=\"https://www.torproject.org/download/download-easy.html.en\"> Tor " "Browser." -#: plinth/modules/tor/templates/tor.html:44 +#: plinth/modules/tor/templates/tor.html:54 +#, fuzzy +#| msgid "Configuration updated" +msgid "Tor configuration is being updated" +msgstr "Oppsett oppdatert" + +#: plinth/modules/tor/templates/tor.html:62 msgid "Tor is running" msgstr "Tor kjører" -#: plinth/modules/tor/templates/tor.html:47 +#: plinth/modules/tor/templates/tor.html:65 msgid "Tor is not running" msgstr "Tor kjører ikke" -#: plinth/modules/tor/templates/tor.html:59 +#: plinth/modules/tor/templates/tor.html:77 msgid "Hidden Service" msgstr "Skjult tjeneste" -#: plinth/modules/tor/templates/tor.html:60 -#: plinth/modules/tor/templates/tor.html:102 +#: plinth/modules/tor/templates/tor.html:78 +#: plinth/modules/tor/templates/tor.html:120 msgid "Port" msgstr "Port" -#: plinth/modules/tor/templates/tor.html:85 +#: plinth/modules/tor/templates/tor.html:103 msgid "Bridge" msgstr "Bro" -#: plinth/modules/tor/templates/tor.html:88 +#: plinth/modules/tor/templates/tor.html:106 #, python-format msgid "" "Your %(box_name)s is configured as a Tor bridge with obfsproxy, so it can " @@ -2469,90 +2901,42 @@ msgstr "" "brannvegg, må du forsikre deg om at de følgende portene er åpne, og at " "portene er videresendt, om nødvendig:" -#: plinth/modules/tor/templates/tor.html:101 +#: plinth/modules/tor/templates/tor.html:119 msgid "Service" msgstr "Tjeneste" -#: plinth/modules/tor/templates/tor.html:117 +#: plinth/modules/tor/templates/tor.html:135 msgid "SOCKS" msgstr "SOCKS" -#: plinth/modules/tor/templates/tor.html:120 +#: plinth/modules/tor/templates/tor.html:138 #, python-format msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "" "En Tor SOCKS port er tilgjengelig på din %(box_name)s på TCP port 9050." -#: plinth/modules/tor/tor.py:46 -msgid "Enable Tor" -msgstr "Aktiver Tor" - -#: plinth/modules/tor/tor.py:49 -msgid "Enable Tor Hidden Service" -msgstr "Aktiver skjulte Tor-tjenester" - -#: plinth/modules/tor/tor.py:51 -msgid "" -"A hidden service will allow FreedomBox to provide selected services (such as " -"ownCloud or Chat) without revealing its location." -msgstr "" -"En skjult tjeneste vil tillate FreedomBox å levere valgte tjenester (for " -"eksempel ownCloud eller Chat) uten å avsløre sin beliggenhet." - -#: plinth/modules/tor/tor.py:55 -msgid "Download software packages over Tor" -msgstr "Last ned programpakker via Tor" - -#: plinth/modules/tor/tor.py:57 -msgid "" -"When enabled, software will be downloaded over the Tor network for " -"installations and upgrades. This adds a degree of privacy and security " -"during software downloads." -msgstr "" -"Når den er aktivert, vil programvaren lastes ned over Tor-nettverket for " -"installasjoner og oppgraderinger. Dette legger til en viss grad privatliv og " -"sikkerhet under nedlasting av programvare." - -#: plinth/modules/tor/tor.py:85 plinth/modules/tor/tor.py:285 -msgid "Tor Hidden Service" -msgstr "Skjult Tor-tjeneste" - -#: plinth/modules/tor/tor.py:115 +#: plinth/modules/tor/views.py:68 msgid "Tor Control Panel" msgstr "Tor Control Panel (Kontrollpanel)" -#: plinth/modules/tor/tor.py:240 +#: plinth/modules/tor/views.py:79 #, python-brace-format msgid "Action error: {0} [{1}] [{2}]" msgstr "Handlingsfeil: {0} [{1}] [{2}]" -#: plinth/modules/tor/tor.py:256 -msgid "Tor enabled" -msgstr "Tor aktivert" - -#: plinth/modules/tor/tor.py:259 -msgid "Tor disabled" -msgstr "Tor deaktivert" - -#: plinth/modules/tor/tor.py:264 -msgid "Tor hidden service enabled" -msgstr "Skjult Tor-tjeneste aktivert" - -#: plinth/modules/tor/tor.py:267 -msgid "Tor hidden service disabled" -msgstr "Tor skjult tjeneste deaktivert" - -#: plinth/modules/tor/tor.py:292 -msgid "Enabled package download over Tor" -msgstr "Aktivert pakkenedlasting over Tor" +#: plinth/modules/tor/views.py:148 +#, fuzzy +#| msgid "Configuration updated" +msgid "Configuration updated." +msgstr "Oppsett oppdatert" -#: plinth/modules/tor/tor.py:295 -msgid "Disabled package download over Tor" -msgstr "Deaktivert pakke lastet ned over Tor" +#: plinth/modules/tor/views.py:150 +msgid "An error occurred during configuration." +msgstr "" #: plinth/modules/transmission/__init__.py:38 #: plinth/modules/transmission/templates/transmission.html:26 -#: plinth/modules/transmission/views.py:63 +#: plinth/modules/transmission/views.py:67 msgid "BitTorrent (Transmission)" msgstr "BitTorrent (Transmission)" @@ -2629,72 +3013,72 @@ msgstr "" "Når den er aktivert, vil oppgraderingsprogrammet kjøres én gang per dag uten " "tilsyn. Det vil forsøke å utføre de pakkeoppgraderinger som er tilgjengelige." -#: plinth/modules/upgrades/templates/upgrades.html:40 -msgid "There was an error while upgrading." -msgstr "Det var en feil under oppgradering." - -#: plinth/modules/upgrades/templates/upgrades.html:43 -#: plinth/modules/upgrades/templates/upgrades.html:59 -msgid "Output from unattended-upgrades:" -msgstr "Resultat fra unattended-upgrades:" - -#: plinth/modules/upgrades/templates/upgrades.html:50 -msgid "The operating system is up to date now.  " -msgstr "Operativsystemet er oppdatert nå.  " - -#: plinth/modules/upgrades/templates/upgrades.html:53 -msgid "Show Details" -msgstr "Vis detaljer" +#: plinth/modules/upgrades/templates/upgrades.html:37 +msgid "" +"Upgrades install the latest software and security updates. When automatic " +"upgrades are enabled, upgrades are automatically run every night. You don't " +"normally need to start the upgrade process." +msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:69 +#: plinth/modules/upgrades/templates/upgrades.html:45 msgid "" -"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." +"Depending on the number of packages to install, this may take a long time to " +"complete. While upgrades are in progress, you will not be able to install " +"other packages. During the upgrade, this web interface may be temporarily " +"unavailable and show an error. Refresh the page to continue." msgstr "" -"Dette vil kjøre oppgraderinger uten tilsyn, og søke å oppgradere systemet " -"ditt med de nyeste Debian-pakkene. Det kan ta noen minutter å fullføre." -#: plinth/modules/upgrades/templates/upgrades.html:80 +#: plinth/modules/upgrades/templates/upgrades.html:58 msgid "Upgrade now »" msgstr "Oppgradere nå »" -#: plinth/modules/upgrades/templates/upgrades.html:87 -msgid "System is being upgraded." -msgstr "Systemet blir oppgradert." +#: plinth/modules/upgrades/templates/upgrades.html:65 +#, fuzzy +#| msgid "ejabberd is running" +msgid "A package manager is running." +msgstr "ejabberd kjører" -#: plinth/modules/upgrades/views.py:35 plinth/modules/upgrades/views.py:64 +#: plinth/modules/upgrades/templates/upgrades.html:70 +msgid "Recent log from upgrades:" +msgstr "" + +#: plinth/modules/upgrades/views.py:36 plinth/modules/upgrades/views.py:66 msgid "Automatic Upgrades" msgstr "Automatiske oppgraderinger" -#: plinth/modules/upgrades/views.py:37 +#: plinth/modules/upgrades/views.py:38 msgid "Upgrade Packages" msgstr "Oppgrader pakker" -#: plinth/modules/upgrades/views.py:75 +#: plinth/modules/upgrades/views.py:96 +#, fuzzy +#| msgid "Upgrade completed." +msgid "Upgrade process started." +msgstr "Oppgradering fullført." + +#: plinth/modules/upgrades/views.py:99 +#, fuzzy +#| msgid "Upgrade failed." +msgid "Starting upgrade failed." +msgstr "Oppgradering feilet." + +#: plinth/modules/upgrades/views.py:102 msgid "Package Upgrades" msgstr "Pakkeoppgraderinger" -#: plinth/modules/upgrades/views.py:116 +#: plinth/modules/upgrades/views.py:131 #, python-brace-format msgid "Error when configuring unattended-upgrades: {error}" msgstr "Feil ved oppsett av unattended-upgrades: {error}" -#: plinth/modules/upgrades/views.py:121 +#: plinth/modules/upgrades/views.py:136 msgid "Automatic upgrades enabled" msgstr "Automatiske oppgraderinger aktiv" -#: plinth/modules/upgrades/views.py:123 +#: plinth/modules/upgrades/views.py:138 msgid "Automatic upgrades disabled" msgstr "Automatiske oppgraderinger avslått" -#: plinth/modules/upgrades/views.py:142 -msgid "Upgrade completed." -msgstr "Oppgradering fullført." - -#: plinth/modules/upgrades/views.py:144 -msgid "Upgrade failed." -msgstr "Oppgradering feilet." - #: plinth/modules/users/__init__.py:36 msgid "Users and Groups" msgstr "Brukere og grupper" @@ -2735,19 +3119,30 @@ msgstr "" msgid "Failed to add new user to {group} group." msgstr "Klarte ikke legge ny bruker til gruppe {group}." -#: plinth/modules/users/forms.py:126 +#: plinth/modules/users/forms.py:92 +msgid "SSH Keys" +msgstr "" + +#: plinth/modules/users/forms.py:96 +msgid "" +"Setting an SSH public key will allow this user to securely log in to the " +"system without using a password. You may enter multiple keys, one on each " +"line. Blank lines and lines starting with # will be ignored." +msgstr "" + +#: plinth/modules/users/forms.py:136 msgid "Renaming LDAP user failed." msgstr "Klarte ikke bytte navn på LDAP-bruker." -#: plinth/modules/users/forms.py:138 +#: plinth/modules/users/forms.py:148 msgid "Failed to remove user from group." msgstr "Klarte ikke slette bruker fra gruppe." -#: plinth/modules/users/forms.py:149 +#: plinth/modules/users/forms.py:159 msgid "Failed to add user to group." msgstr "Klarte ikke legge bruker til gruppe." -#: plinth/modules/users/forms.py:174 +#: plinth/modules/users/forms.py:188 msgid "Changing LDAP user password failed." msgstr "Klarte ikke å bytte passord for LDAP-bruker." @@ -2766,7 +3161,7 @@ msgid "Create User" msgstr "Opprett bruker" #: plinth/modules/users/templates/users_delete.html:26 -#: plinth/modules/users/views.py:103 +#: plinth/modules/users/views.py:110 msgid "Delete User" msgstr "Slett bruker" @@ -2821,20 +3216,20 @@ msgstr "Bruker %(username)s oppdatert." msgid "Edit User" msgstr "Rediger bruker" -#: plinth/modules/users/views.py:113 +#: plinth/modules/users/views.py:120 #, python-brace-format msgid "User {user} deleted." msgstr "Bruker {user} slettet." -#: plinth/modules/users/views.py:120 +#: plinth/modules/users/views.py:127 msgid "Deleting LDAP user failed." msgstr "Klarte ikke slette LDAP-bruker." -#: plinth/modules/users/views.py:129 +#: plinth/modules/users/views.py:136 msgid "Change Password" msgstr "Endre passord" -#: plinth/modules/users/views.py:130 +#: plinth/modules/users/views.py:137 msgid "Password changed successfully." msgstr "Vellykket passordbytte." @@ -2917,8 +3312,10 @@ msgstr "Webtjener over SSL" msgid "Secure Shell (SSH) Server" msgstr "Secure Shell (SSH) tjener" -#: plinth/service.py:78 -msgid "FreedomBox Web Interface (Plinth)" +#: plinth/service.py:79 +#, fuzzy, python-brace-format +#| msgid "FreedomBox Web Interface (Plinth)" +msgid "{box_name} Web Interface (Plinth)" msgstr "FreedomBox Web Interface (grensesnitt) (Plinth)" #: plinth/templates/404.html:25 @@ -2955,27 +3352,25 @@ msgstr "" "issues\"> bug tracker så det kan bli ordnet." #: plinth/templates/base.html:49 -msgid "Plinth administrative interface for the FreedomBox" +#, fuzzy, python-format +#| msgid "Plinth administrative interface for the FreedomBox" +msgid "Plinth administrative interface for the %(box_name)s" msgstr "Plinth administrative brukergrensesnitt for FreedomBox" -#: plinth/templates/base.html:52 plinth/templates/base.html.py:88 -msgid "FreedomBox" -msgstr "FreedomBox" - -#: plinth/templates/base.html:81 +#: plinth/templates/base.html:83 msgid "Toggle navigation" msgstr "Toggle navigasjon" -#: plinth/templates/base.html:121 plinth/templates/base.html.py:122 +#: plinth/templates/base.html:125 plinth/templates/base.html.py:126 msgid "Change password" msgstr "Endre passord" -#: plinth/templates/base.html:125 plinth/templates/base.html.py:126 -#: plinth/templates/base.html:139 plinth/templates/base.html.py:141 +#: plinth/templates/base.html:129 plinth/templates/base.html.py:130 +#: plinth/templates/base.html:143 plinth/templates/base.html.py:145 msgid "Log out" msgstr "Logg ut" -#: plinth/templates/base.html:131 plinth/templates/base.html.py:133 +#: plinth/templates/base.html:135 plinth/templates/base.html.py:137 msgid "Log in" msgstr "Logg inn" @@ -3015,3 +3410,83 @@ msgstr "Installere %(package_names)s: %(status)s" #, python-format msgid "%(percentage)s%% complete" msgstr "%(percentage)s%% fullført" + +#~ msgid "show password" +#~ msgstr "vis passord" + +#~ msgid "The following is the current status:" +#~ msgstr "Følgende er nåværende status:" + +#~ msgid "Congratulations! Your FreedomBox is up and running!" +#~ msgstr "Gratulerer! Din FreedomBox er oppe og går!" + +#~ msgid "" +#~ "Please provide the following basic information to complete the setup " +#~ "process." +#~ msgstr "" +#~ "Vennligst oppgi følgende grunnleggende informasjon for å fullføre " +#~ "installasjonsprosessen." + +#~ msgid "Next" +#~ msgstr "Neste" + +#~ msgid "FreedomBox Manual" +#~ msgstr "Håndbok for FreedomBox" + +#~ msgid "" +#~ "Many FreedomBox contributors and users are also available on the " +#~ "#freedombox channel of the irc.oftc.net IRC network." +#~ msgstr "" +#~ "Mange FreedomBox bidragsytere og brukere er også tilgjengelig på " +#~ "#freedombox kanalen til irc.oftc.net IRC-nettverk." + +#~ msgid "Create Wiki/Blog" +#~ msgstr "Opprett Wiki/blogg" + +#~ msgid "" +#~ "Select Automatic (DHCP) if you are connecting to an existing wireless " +#~ "network. Shared mode is useful when running an Access Point." +#~ msgstr "" +#~ "Velg Automatisk (DHCP) hvis du kobler til et eksisterende trådløst " +#~ "nettverk. Felles modus er nyttig når du kjører et Access Point." + +#~ msgid "Tor enabled" +#~ msgstr "Tor aktivert" + +#~ msgid "Tor disabled" +#~ msgstr "Tor deaktivert" + +#~ msgid "Tor hidden service enabled" +#~ msgstr "Skjult Tor-tjeneste aktivert" + +#~ msgid "Tor hidden service disabled" +#~ msgstr "Tor skjult tjeneste deaktivert" + +#~ msgid "Enabled package download over Tor" +#~ msgstr "Aktivert pakkenedlasting over Tor" + +#~ msgid "Disabled package download over Tor" +#~ msgstr "Deaktivert pakke lastet ned over Tor" + +#~ msgid "There was an error while upgrading." +#~ msgstr "Det var en feil under oppgradering." + +#~ msgid "Output from unattended-upgrades:" +#~ msgstr "Resultat fra unattended-upgrades:" + +#~ msgid "The operating system is up to date now.  " +#~ msgstr "Operativsystemet er oppdatert nå.  " + +#~ msgid "Show Details" +#~ msgstr "Vis detaljer" + +#~ msgid "" +#~ "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." +#~ msgstr "" +#~ "Dette vil kjøre oppgraderinger uten tilsyn, og søke å oppgradere systemet " +#~ "ditt med de nyeste Debian-pakkene. Det kan ta noen minutter å fullføre." + +#~ msgid "System is being upgraded." +#~ msgstr "Systemet blir oppgradert." diff --git a/plinth/locale/nl/LC_MESSAGES/django.po b/plinth/locale/nl/LC_MESSAGES/django.po index 469aef342..f0929ba77 100644 --- a/plinth/locale/nl/LC_MESSAGES/django.po +++ b/plinth/locale/nl/LC_MESSAGES/django.po @@ -7,11 +7,11 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-12-20 13:58+0530\n" +"POT-Creation-Date: 2016-01-31 22:19+0530\n" "PO-Revision-Date: 2015-12-20 09:35+0000\n" "Last-Translator: ikmaak \n" -"Language-Team: Dutch " -"\n" +"Language-Team: Dutch \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -51,11 +51,15 @@ msgstr "Verbind met {host}:{port}" msgid "Cannot connect to {host}:{port}" msgstr "Kan niet verbinden met {host}:{port}" +#: plinth/context_processors.py:36 +msgid "FreedomBox" +msgstr "FreedomBox" + #: plinth/modules/apps/apps.py:26 msgid "Apps" msgstr "Apps" -#: plinth/modules/apps/apps.py:32 plinth/templates/base.html.py:90 +#: plinth/modules/apps/apps.py:32 plinth/templates/base.html.py:93 msgid "Applications" msgstr "Programma's" @@ -97,10 +101,18 @@ msgid "Enable service discovery" msgstr "Service Discovery Inschakelen" #: plinth/modules/avahi/templates/avahi.html:29 -msgid "" -"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 " +#, fuzzy, python-format +#| msgid "" +#| "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." +msgid "" +"Service discovery allows other devices on the network to discover your " +"%(box_name)s and services running on it. It also allows %(box_name)s to " +"discover other devices 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." @@ -115,14 +127,15 @@ msgstr "" #: plinth/modules/avahi/templates/avahi.html:40 #: plinth/modules/datetime/templates/datetime.html:35 #: plinth/modules/deluge/templates/deluge.html:39 -#: plinth/modules/dynamicdns/dynamicdns.py:38 +#: plinth/modules/dynamicdns/dynamicdns.py:39 #: plinth/modules/firewall/templates/firewall.html:57 #: plinth/modules/mumble/templates/mumble.html:44 #: plinth/modules/networks/templates/connection_show.html:261 #: plinth/modules/openvpn/templates/openvpn.html:81 #: plinth/modules/privoxy/templates/privoxy.html:48 #: plinth/modules/quassel/templates/quassel.html:50 -#: plinth/modules/tor/templates/tor.html:39 +#: plinth/modules/repro/templates/repro.html:58 +#: plinth/modules/tor/templates/tor.html:48 #: plinth/modules/transmission/templates/transmission.html:42 #: plinth/modules/xmpp/templates/xmpp.html:58 msgid "Status" @@ -145,9 +158,10 @@ msgstr "Service Discovery draait niet" #: plinth/modules/owncloud/templates/owncloud.html:51 #: plinth/modules/privoxy/templates/privoxy.html:62 #: plinth/modules/quassel/templates/quassel.html:65 +#: plinth/modules/repro/templates/repro.html:72 #: plinth/modules/roundcube/templates/roundcube.html:62 #: plinth/modules/shaarli/templates/shaarli.html:40 -#: plinth/modules/tor/templates/tor.html:74 +#: plinth/modules/tor/templates/tor.html:92 #: plinth/modules/transmission/templates/transmission.html:56 #: plinth/modules/xmpp/templates/xmpp.html:72 msgid "Configuration" @@ -163,10 +177,11 @@ msgstr "Configuratie" #: plinth/modules/openvpn/templates/openvpn.html:138 #: plinth/modules/privoxy/templates/privoxy.html:70 #: plinth/modules/quassel/templates/quassel.html:73 +#: plinth/modules/repro/templates/repro.html:80 #: plinth/modules/restore/templates/restore_index.html:54 #: plinth/modules/roundcube/templates/roundcube.html:70 #: plinth/modules/shaarli/templates/shaarli.html:48 -#: plinth/modules/tor/templates/tor.html:82 +#: plinth/modules/tor/templates/tor.html:100 #: plinth/modules/transmission/templates/transmission.html:64 #: plinth/modules/upgrades/templates/upgrades_configure.html:34 #: plinth/modules/xmpp/templates/xmpp.html:80 @@ -175,12 +190,13 @@ msgstr "Instelling bijwerken" #: plinth/modules/avahi/views.py:73 plinth/modules/datetime/views.py:85 #: plinth/modules/deluge/views.py:80 -#: plinth/modules/dynamicdns/dynamicdns.py:368 +#: plinth/modules/dynamicdns/dynamicdns.py:371 #: plinth/modules/ikiwiki/views.py:95 plinth/modules/mumble/views.py:80 #: plinth/modules/openvpn/views.py:142 plinth/modules/privoxy/views.py:83 -#: plinth/modules/quassel/views.py:76 plinth/modules/restore/views.py:68 -#: plinth/modules/roundcube/views.py:84 plinth/modules/shaarli/views.py:74 -#: plinth/modules/transmission/views.py:105 plinth/modules/xmpp/views.py:100 +#: plinth/modules/quassel/views.py:76 plinth/modules/repro/views.py:77 +#: plinth/modules/restore/views.py:68 plinth/modules/roundcube/views.py:84 +#: plinth/modules/shaarli/views.py:74 plinth/modules/transmission/views.py:109 +#: plinth/modules/xmpp/views.py:100 msgid "Configuration updated" msgstr "Configuratie bijgewerkt" @@ -188,27 +204,34 @@ msgstr "Configuratie bijgewerkt" #: plinth/modules/deluge/views.py:82 plinth/modules/ikiwiki/views.py:97 #: plinth/modules/mumble/views.py:82 plinth/modules/openvpn/views.py:144 #: plinth/modules/owncloud/owncloud.py:93 plinth/modules/privoxy/views.py:85 -#: plinth/modules/quassel/views.py:78 plinth/modules/restore/views.py:70 -#: plinth/modules/roundcube/views.py:86 plinth/modules/shaarli/views.py:76 -#: plinth/modules/tor/tor.py:250 plinth/modules/transmission/views.py:107 -#: plinth/modules/upgrades/views.py:103 plinth/modules/xmpp/views.py:102 +#: plinth/modules/quassel/views.py:78 plinth/modules/repro/views.py:79 +#: plinth/modules/restore/views.py:70 plinth/modules/roundcube/views.py:86 +#: plinth/modules/shaarli/views.py:76 plinth/modules/tor/views.py:111 +#: plinth/modules/transmission/views.py:111 +#: plinth/modules/upgrades/views.py:118 plinth/modules/xmpp/views.py:102 msgid "Setting unchanged" msgstr "Instelling onveranderd" -#: plinth/modules/config/config.py:83 plinth/modules/config/config.py:120 -#: plinth/modules/dynamicdns/dynamicdns.py:145 +#: plinth/modules/config/config.py:84 plinth/modules/config/config.py:121 +#: plinth/modules/dynamicdns/dynamicdns.py:148 msgid "Invalid domain name" msgstr "Foutieve domeinnaam" -#: plinth/modules/config/config.py:94 +#: plinth/modules/config/config.py:95 msgid "Hostname" msgstr "Hostnaam" -#: plinth/modules/config/config.py:96 -msgid "" -"Hostname is the local name by which other machines on the local network " -"reach your machine. It must start and end with an alphabet or a digit and " -"have as interior characters only alphabets, digits and hyphens. Total " +#: plinth/modules/config/config.py:97 +#, fuzzy, python-brace-format +#| msgid "" +#| "Hostname is the local name by which other machines on the local network " +#| "reach your machine. It must start and end with an alphabet or a digit " +#| "and have as interior characters only alphabets, digits and hyphens. " +#| "Total length must be 63 characters or less." +msgid "" +"Hostname is the local name by which other devices on the local network can " +"reach your {box_name}. It must start and end with an alphabet or a digit " +"and have as interior characters only alphabets, digits and hyphens. Total " "length must be 63 characters or less." msgstr "" "De hostnaam is de lokale naam waarmee ander machines in het LAN deze machine " @@ -216,24 +239,32 @@ msgstr "" "cijfer, er tussenin mogen ook koppeltekens. De totale lengte mag niet langer " "zijn dan 63 tekens." -#: plinth/modules/config/config.py:104 +#: plinth/modules/config/config.py:105 msgid "Invalid hostname" msgstr "Foutieve hostnaam" -#: plinth/modules/config/config.py:107 plinth/modules/config/config.py:153 +#: plinth/modules/config/config.py:108 plinth/modules/config/config.py:153 #: plinth/modules/config/config.py:265 -#: plinth/modules/dynamicdns/dynamicdns.py:140 +#: plinth/modules/dynamicdns/dynamicdns.py:143 msgid "Domain Name" msgstr "Domeinnaam" -#: plinth/modules/config/config.py:109 -msgid "" -"Domain name is the global name by which other machines on the Internet can " -"reach you. It must consist of labels separated by dots. Each label must " -"start and end with an alphabet or a digit and have as interior characters " -"only alphabets, digits and hyphens. Length of each label must be 63 " -"characters or less. Total length of domain name must be 253 characters or " -"less." +#: plinth/modules/config/config.py:110 +#, fuzzy, python-brace-format +#| msgid "" +#| "Domain name is the global name by which other machines on the Internet " +#| "can reach you. It must consist of labels separated by dots. Each label " +#| "must start and end with an alphabet or a digit and have as interior " +#| "characters only alphabets, digits and hyphens. Length of each label must " +#| "be 63 characters or less. Total length of domain name must be 253 " +#| "characters or less." +msgid "" +"Domain name is the global name by which other devices on the Internet can " +"reach your {box_name}. It must consist of labels separated by dots. Each " +"label must start and end with an alphabet or a digit and have as interior " +"characters only alphabets, digits and hyphens. Length of each label must be " +"63 characters or less. Total length of domain name must be 253 characters " +"or less." msgstr "" "Een domeinnaam is de globaal bereikbare naam waarmee andere computers op het " "internet deze machine kan bereiken. Het moet bestaan uit namen, gescheiden " @@ -242,16 +273,18 @@ msgstr "" "niet langer zijn dan 63 tekens. De totale domeinnaamlengte mag niet langer " "zijn dan 253 tekens." -#: plinth/modules/config/config.py:124 +#: plinth/modules/config/config.py:125 msgid "Language" msgstr "Taal" -#: plinth/modules/config/config.py:126 -msgid "Language for this FreedomBox web administration interface" +#: plinth/modules/config/config.py:127 +#, fuzzy +#| msgid "Language for this FreedomBox web administration interface" +msgid "Language for this web administration interface" msgstr "Taalkeuze voor deze FreedomBox web administratie" #: plinth/modules/config/config.py:135 -#: plinth/modules/dynamicdns/dynamicdns.py:36 +#: plinth/modules/dynamicdns/dynamicdns.py:37 #: plinth/modules/ikiwiki/views.py:36 msgid "Configure" msgstr "Configureer" @@ -446,16 +479,16 @@ msgstr "Test" msgid "Result" msgstr "Resultaat" -#: plinth/modules/dynamicdns/dynamicdns.py:34 plinth/modules/help/help.py:40 +#: plinth/modules/dynamicdns/dynamicdns.py:35 plinth/modules/help/help.py:40 msgid "About" msgstr "Over" -#: plinth/modules/dynamicdns/dynamicdns.py:44 -#: plinth/modules/dynamicdns/dynamicdns.py:53 +#: plinth/modules/dynamicdns/dynamicdns.py:45 +#: plinth/modules/dynamicdns/dynamicdns.py:54 msgid "Dynamic DNS" msgstr "Dynamic DNS" -#: plinth/modules/dynamicdns/dynamicdns.py:70 +#: plinth/modules/dynamicdns/dynamicdns.py:71 msgid "" "The Variables <User>, <Pass>, <Ip>, <Domain> may be " "used within the URL. For details see the update URL templates of the example " @@ -465,7 +498,7 @@ msgstr "" "worden gebruikt in de URL. Zie voor details de update URL voorbeelden van de " "voorbeeld providers." -#: plinth/modules/dynamicdns/dynamicdns.py:74 +#: plinth/modules/dynamicdns/dynamicdns.py:75 msgid "" "Please choose an update protocol according to your provider. If your " "provider does not support the GnudIP protocol or your provider is not listed " @@ -475,25 +508,31 @@ msgstr "" "GnudIP protocol gebruikt of de provider staat niet in de lijst, gebruik dan " "de update URL van de provider." -#: plinth/modules/dynamicdns/dynamicdns.py:79 +#: plinth/modules/dynamicdns/dynamicdns.py:80 +#, fuzzy +#| msgid "" +#| "Please do not enter a URL here (like \"https://example.com/\") but only " +#| "the hostname of the GnuDIP server (like \"example.pcom\")." msgid "" "Please do not enter a URL here (like \"https://example.com/\") but only the " -"hostname of the GnuDIP server (like \"example.pcom\")." +"hostname of the GnuDIP server (like \"example.com\")." msgstr "" "Voer hier geen complete URL in (zoals \"https://example.com/\") maar alleen " "de hostnaam van de GnuDIP server (zoals \"example.com\")." -#: plinth/modules/dynamicdns/dynamicdns.py:83 -msgid "The public domain name you want use to reach your box." +#: plinth/modules/dynamicdns/dynamicdns.py:84 +#, fuzzy, python-brace-format +#| msgid "The public domain name you want use to reach your box." +msgid "The public domain name you want use to reach your {box_name}." msgstr "De publieke domeinnaam die gebruikt wordt om deze box aan te spreken." -#: plinth/modules/dynamicdns/dynamicdns.py:85 +#: plinth/modules/dynamicdns/dynamicdns.py:87 msgid "Use this option if your provider uses self signed certificates." msgstr "" "Gebruik deze functie indien de provider gebruik maakt van self-signed " "certificaten." -#: plinth/modules/dynamicdns/dynamicdns.py:88 +#: plinth/modules/dynamicdns/dynamicdns.py:90 msgid "" "If this option is selected, your username and password will be used for HTTP " "basic authentication." @@ -501,24 +540,30 @@ msgstr "" "Als deze optie is geselecteerd wordt de gebruikersnaam en wachtwoord " "gebruikt voor HTTP basic authentificatie." -#: plinth/modules/dynamicdns/dynamicdns.py:91 +#: plinth/modules/dynamicdns/dynamicdns.py:93 msgid "" "Leave this field empty if you want to keep your previous configured password." msgstr "Laat dit veld leeg om het vooraf ingestelde wachtwoord te behouden." -#: plinth/modules/dynamicdns/dynamicdns.py:94 +#: plinth/modules/dynamicdns/dynamicdns.py:96 +#, fuzzy, python-brace-format +#| msgid "" +#| "Optional Value. If your FreedomBox is not connected directly to the " +#| "Internet (i.e. connected to a NAT router) this URL is used to figure out " +#| "the real Internet IP. The URL should simply return the IP wherethe client " +#| "comes from. Example: http://myip.datasystems24.de" msgid "" -"Optional Value. If your FreedomBox is not connected directly to the Internet " +"Optional Value. If your {box_name} is not connected directly to the Internet " "(i.e. connected to a NAT router) this URL is used to figure out the real " -"Internet IP. The URL should simply return the IP wherethe client comes from. " -"Example: http://myip.datasystems24.de" +"Internet IP. The URL should simply return the IP where the client comes from " +"(example: http://myip.datasystems24.de)." msgstr "" "Optionele waarde. Als de FreedomBox niet direct is verbonden met het " "internet (maar verbonden met een NAT router), wordt deze URL gebruikt om het " "echte Internet IP adres te vinden. Het antwoord op het aanroepen van deze " "URL zou het IP adres moeten zijn. Voorbeeld: http://myip.datasystems24.de" -#: plinth/modules/dynamicdns/dynamicdns.py:101 +#: plinth/modules/dynamicdns/dynamicdns.py:104 msgid "" "You should have been requested to select a username when you created the " "account." @@ -526,85 +571,98 @@ msgstr "" "Er zou een keuze voor de gebruikersnaam moeten zijn geweest tijdens het " "aanmaken van de account." -#: plinth/modules/dynamicdns/dynamicdns.py:112 +#: plinth/modules/dynamicdns/dynamicdns.py:115 msgid "Enable Dynamic DNS" msgstr "Dynamic DNS Inschakelen" -#: plinth/modules/dynamicdns/dynamicdns.py:115 +#: plinth/modules/dynamicdns/dynamicdns.py:118 msgid "Service type" msgstr "Dienst type" -#: plinth/modules/dynamicdns/dynamicdns.py:120 +#: plinth/modules/dynamicdns/dynamicdns.py:123 msgid "GnudIP Server Address" msgstr "GnudIP Serveradres" -#: plinth/modules/dynamicdns/dynamicdns.py:125 +#: plinth/modules/dynamicdns/dynamicdns.py:128 msgid "Invalid server name" msgstr "Foute servernaam" -#: plinth/modules/dynamicdns/dynamicdns.py:128 +#: plinth/modules/dynamicdns/dynamicdns.py:131 msgid "Update URL" msgstr "URL bijwerken" -#: plinth/modules/dynamicdns/dynamicdns.py:132 -msgid "accept all SSL certificates" +#: plinth/modules/dynamicdns/dynamicdns.py:135 +#, fuzzy +#| msgid "accept all SSL certificates" +msgid "Accept all SSL certificates" msgstr "accepteer alle SSL certificaten" -#: plinth/modules/dynamicdns/dynamicdns.py:136 -msgid "use HTTP basic authentication" +#: plinth/modules/dynamicdns/dynamicdns.py:139 +#, fuzzy +#| msgid "use HTTP basic authentication" +msgid "Use HTTP basic authentication" msgstr "gebruik HTTP basic authentificatie" -#: plinth/modules/dynamicdns/dynamicdns.py:148 -#: plinth/modules/networks/forms.py:118 plinth/modules/transmission/forms.py:39 +#: plinth/modules/dynamicdns/dynamicdns.py:151 +#: plinth/modules/networks/forms.py:146 plinth/modules/transmission/forms.py:39 msgid "Username" msgstr "Gebruikersnaam" -#: plinth/modules/dynamicdns/dynamicdns.py:151 -#: plinth/modules/networks/forms.py:119 plinth/modules/transmission/forms.py:43 +#: plinth/modules/dynamicdns/dynamicdns.py:154 +#: plinth/modules/networks/forms.py:147 plinth/modules/transmission/forms.py:43 msgid "Password" msgstr "Wachtwoord" -#: plinth/modules/dynamicdns/dynamicdns.py:154 -msgid "show password" -msgstr "toon wachtwoord" +#: plinth/modules/dynamicdns/dynamicdns.py:157 +#: plinth/modules/networks/forms.py:149 +msgid "Show password" +msgstr "Toon wachtwoord" -#: plinth/modules/dynamicdns/dynamicdns.py:158 +#: plinth/modules/dynamicdns/dynamicdns.py:161 msgid "IP check URL" msgstr "IP test URL" -#: plinth/modules/dynamicdns/dynamicdns.py:184 +#: plinth/modules/dynamicdns/dynamicdns.py:187 msgid "Please provide update URL or a GnuDIP Server" msgstr "Voer een update URL of GnuDIP Server in" -#: plinth/modules/dynamicdns/dynamicdns.py:187 +#: plinth/modules/dynamicdns/dynamicdns.py:190 msgid "Please provide GnuDIP username" msgstr "Voer een GnuDIP gebruikersnaam in" -#: plinth/modules/dynamicdns/dynamicdns.py:190 +#: plinth/modules/dynamicdns/dynamicdns.py:193 msgid "Please provide GnuDIP domain" msgstr "Voer een GnuDIP domein in" -#: plinth/modules/dynamicdns/dynamicdns.py:195 +#: plinth/modules/dynamicdns/dynamicdns.py:198 msgid "Please provide a password" msgstr "Voer een wachtwoord in" -#: plinth/modules/dynamicdns/dynamicdns.py:214 +#: plinth/modules/dynamicdns/dynamicdns.py:217 msgid "Configure Dynamic DNS" msgstr "Instellen Dynamic DNS" -#: plinth/modules/dynamicdns/dynamicdns.py:236 +#: plinth/modules/dynamicdns/dynamicdns.py:239 msgid "Status of Dynamic DNS" msgstr "Status van Dynamic DNS" #: plinth/modules/dynamicdns/templates/dynamicdns.html:25 -msgid "DynamicDNS client" +#, fuzzy +#| msgid "DynamicDNS client" +msgid "Dynamic DNS Client" msgstr "DynamicDNS cliënt" #: plinth/modules/dynamicdns/templates/dynamicdns.html:28 +#, fuzzy, python-format +#| msgid "" +#| "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)." msgid "" "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)." +"may find the services which are provided by %(box_name)s, such as ownCloud." msgstr "" "Als de internetprovider het adres regelmatig wisselt, (bijvoorbeeld iedere " "24 uur) kan het voor anderen moeilijk zijn om deze machine te vinden vanaf " @@ -612,13 +670,22 @@ msgstr "" "ownCloud) vaak onmogelijk." #: plinth/modules/dynamicdns/templates/dynamicdns.html:37 +#, fuzzy +#| msgid "" +#| "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 gnudip " +#| "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." msgid "" "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 gnudip 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." +"Internet asks for your DNS name he will get your current IP answered." msgstr "" "De oplossing is om een DNS naam aan het publieke adres toe te wijzen en de " "DNS server iedere keer bij te werken als het IP adres is gewijzigd door de " @@ -643,10 +710,14 @@ msgstr "" "target='_blank'> freedns.afraid.org." #: plinth/modules/dynamicdns/templates/dynamicdns.html:61 +#, fuzzy, python-format +#| msgid "" +#| "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." msgid "" -"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." +"If your %(box_name)s is connected behind some NAT router, don't forget to " +"add port forwarding (i.e. forward some standard ports like 80 and 443)." msgstr "" "Als deze FreedomBox is verbonden door middel van een vorm van NAT-routing, " "vergeet dan niet om port-forwarding te gebruiken om standaardpoorten " @@ -673,16 +744,23 @@ msgstr "" "het niet mogelijk om het type te herkennen." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:35 -msgid "Direct connection to the internet." +#, fuzzy +#| msgid "Direct connection to the internet." +msgid "Direct connection to the Internet." msgstr "Directe verbinding met internet." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:37 -#, python-format +#, fuzzy, python-format +#| msgid "" +#| "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)s " +#| "minutes until we update your DNS entry in case of WAN IP change." msgid "" -"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)s minutes until we " -"update your DNS entry in case of WAN IP change." +"Behind NAT. This means that Dynamic DNS service will poll the \"IP check URL" +"\" for changes (the \"IP check URL\" entry is needed for this - otherwise IP " +"changes will not be detected). In case the WAN IP changes, it may take up " +"to %(timer)s minutes until your DNS entry is updated." msgstr "" "Achter NAT, dit betekent dat de dynamic DNS dienst regelmatig het IP adres " "controleert op wijzigingen (hiervoor is de \"IP check URL\" nodig, anders " @@ -701,19 +779,23 @@ msgid "Firewall" msgstr "Firewall" #: plinth/modules/firewall/templates/firewall.html:28 -#, python-format +#, fuzzy, python-format +#| msgid "" +#| "Firewall is a network security system that controls the incoming and " +#| "outgoing network traffic on your %(box_name)s. Keeping a firewall enabled " +#| "and properly configured reduces risk of security threat from the Internet." msgid "" -"Firewall is a network security system that controls the incoming and " -"outgoing network traffic on your %(box_name)s. Keeping a firewall enabled " -"and properly configured reduces risk of security threat from the Internet." +"Firewall is a security system that controls the incoming and outgoing " +"network traffic on your %(box_name)s. Keeping a firewall enabled and " +"properly configured reduces risk of security threat from the Internet." msgstr "" "Een Firewall is een netwerk-beveiligingssysteem dat de inkomende en " "uitgaande gegevens van %(box_name)s stuurt. Een goed geïnstalleerde en " "geactiveerde firewall vermindert het risico van internet besmetting." #: plinth/modules/firewall/templates/firewall.html:36 -msgid "The following is the current status:" -msgstr "De huidige status is als volgt:" +msgid "Current status:" +msgstr "" #: plinth/modules/firewall/templates/firewall.html:41 #, python-format @@ -733,11 +815,13 @@ msgid "Service/Port" msgstr "Dienst/Poort" #: plinth/modules/firewall/templates/firewall.html:67 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:91 #: plinth/modules/names/templates/names.html:51 msgid "Enabled" msgstr "Ingeschakeld" #: plinth/modules/firewall/templates/firewall.html:70 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:93 #: plinth/modules/names/templates/names.html:53 msgid "Disabled" msgstr "Uitgeschakeld" @@ -759,10 +843,15 @@ msgid "Blocked" msgstr "Geblokkeerd" #: plinth/modules/firewall/templates/firewall.html:103 +#, fuzzy +#| msgid "" +#| "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." msgid "" "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." +"also permitted in the firewall and when you disable a service it is also " +"disabled in the firewall." msgstr "" "De firewall wordt automatisch ingesteld. Als een dienst wordt ingeschakeld " "wordt deze automatisch toegevoegd aan de firewall, en als een dienst wordt " @@ -780,28 +869,30 @@ msgstr "Toevoegen van gebruiker aan admin groep mislukt." msgid "User account created, you are now logged in" msgstr "Gebruikersaccount aangemaakt, U bent nu ingelogd" -#: plinth/modules/first_boot/templates/firstboot_state0.html:50 -msgid "Congratulations! Your FreedomBox is up and running!" -msgstr "Gefeliciteerd, De FreedomBox is gereed!" +#: plinth/modules/first_boot/templates/firstboot_navbar.html:23 +#: plinth/modules/help/templates/help_index.html:25 +#: plinth/templates/base.html:102 +msgid "Help" +msgstr "Hulp" -#: plinth/modules/first_boot/templates/firstboot_state0.html:54 -msgid "" -"Please provide the following basic information to complete the setup process." -msgstr "Beantwoord de volgende vragen om het installatieproces te voltooien." +#: plinth/modules/first_boot/templates/firstboot_state0.html:45 +#, fuzzy +#| msgid "Start setup" +msgid "Start Setup" +msgstr "Setup starten" -#: plinth/modules/first_boot/templates/firstboot_state0.html:62 -msgid "Next" -msgstr "Volgende" +#: plinth/modules/first_boot/templates/firstboot_state0.html:49 +#, python-format +msgid "" +"To complete the setup of your %(box_name)s, please provide some basic " +"information." +msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state1.html:39 +#: plinth/modules/first_boot/templates/firstboot_state1.html:41 msgid "Administrator Account" msgstr "Beheerdersaccount" -#: plinth/modules/first_boot/templates/firstboot_state1.html:42 -#| msgid "" -#| "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." +#: plinth/modules/first_boot/templates/firstboot_state1.html:44 msgid "" "Choose a username and password to access this web interface. The password " "can be changed later. This user will be granted administrative privileges. " @@ -811,7 +902,7 @@ msgstr "" "wachtwoord kan later worden veranderd. Deze gebruiker krijgt administratieve " "rechten. Andere gebruikers kunnen later worden toegevoegd." -#: plinth/modules/first_boot/templates/firstboot_state1.html:55 +#: plinth/modules/first_boot/templates/firstboot_state1.html:57 msgid "Box it up!" msgstr "Zet 'm op!" @@ -820,35 +911,46 @@ msgid "Setup Complete!" msgstr "Instelling voltooid!" #: plinth/modules/first_boot/templates/firstboot_state10.html:32 +#, fuzzy, python-format +#| msgid "" +#| "To make your FreedomBox functional, you need some applications. " +#| "Applications will be installed the first time you access them." msgid "" -"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." -msgstr "" -"De FreedomBox installatie is nu voltooid. Het is aan te raden de " -"netwerkinstellingen te controleren, en zo nodig aan te passen. Vergeet niet " -"de standaard WiFi wachtwoorden te veranderen." - -#: plinth/modules/first_boot/templates/firstboot_state10.html:40 -msgid "" -"To make your FreedomBox functional, you need some applications. " -"Applications will be installed the first time you access them." +"%(box_name)s setup is now complete. To make your %(box_name)s functional, " +"you need some applications. They will be installed the first time you " +"access them." msgstr "" "Om deze FreedomBox functioneel te maken, zijn een aantal programma's " "vereist. Programma's worden bij activering eerst geïnstalleerd." -#: plinth/modules/first_boot/templates/firstboot_state10.html:47 -msgid "Network Configuration" +#: plinth/modules/first_boot/templates/firstboot_state10.html:41 +msgid "Go to Apps" +msgstr "Ga naar Apps" + +#: plinth/modules/first_boot/templates/firstboot_state10.html:44 +#, fuzzy +#| msgid "Network Configuration" +msgid "Current Network Configuration" msgstr "Netwerkconfiguratie" -#: plinth/modules/first_boot/templates/firstboot_state10.html:54 +#: plinth/modules/first_boot/templates/firstboot_state10.html:47 +#, fuzzy +#| msgid "" +#| "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." +msgid "" +"You should check the network setup and modify it if necessary. Do not forget " +"to change the default Wi-Fi passwords!" +msgstr "" +"De FreedomBox installatie is nu voltooid. Het is aan te raden de " +"netwerkinstellingen te controleren, en zo nodig aan te passen. Vergeet niet " +"de standaard WiFi wachtwoorden te veranderen." + +#: plinth/modules/first_boot/templates/firstboot_state10.html:57 msgid "Go to Networks" msgstr "Ga naar Netwerken" -#: plinth/modules/first_boot/templates/firstboot_state10.html:59 -msgid "Go to Apps" -msgstr "Ga naar Apps" - #: plinth/modules/first_boot/views.py:60 msgid "Setup Complete" msgstr "Instelling voltooid" @@ -861,9 +963,9 @@ msgstr "Documentatie" msgid "Where to Get Help" msgstr "Hulp Verkrijgen" -#: plinth/modules/help/help.py:38 plinth/modules/help/help.py:72 -msgid "FreedomBox Manual" -msgstr "FreedomBox Handleiding" +#: plinth/modules/help/help.py:38 +msgid "Manual" +msgstr "" #: plinth/modules/help/help.py:48 msgid "Documentation and FAQ" @@ -874,15 +976,30 @@ msgstr "Documentatie en veelgestelde vragen" msgid "About {box_name}" msgstr "Over {box_name}" +#: plinth/modules/help/help.py:73 +#, fuzzy, python-brace-format +#| msgid "About {box_name}" +msgid "{box_name} Manual" +msgstr "Over {box_name}" + #: plinth/modules/help/templates/help_about.html:30 -msgid "" -"FreedomBox is a community project to develop, design and promote personal " +#, fuzzy, python-format +#| msgid "" +#| "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." +msgid "" +"%(box_name)s 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." +"and a Tor relay, on a device that can replace your Wi-Fi router, so that " +"your data stays with you." msgstr "" "FreedomBox is een communityproject om persoonlijke servers met uitsluitend " "vrije software te ontwikkelen, ontwerpen en promoten. Het is een netwerk-" @@ -911,58 +1028,81 @@ msgstr "" "ontworpen en bedoeld." #: plinth/modules/help/templates/help_about.html:56 +#, fuzzy, python-format +#| msgid "" +#| "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." msgid "" "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." +"services; %(box_name)s aims to bring them all together in a convenient " +"package." msgstr "" "Er zijn een aantal projecten die een toekomst vol gedecentraliseerde " "diensten; FreedomBox probeert deze allemaal te verpakken in een enkel pakket." #: plinth/modules/help/templates/help_about.html:64 +#, fuzzy, python-format +#| msgid "" +#| "For more information about the FreedomBox project, see the FreedomBox Wiki." msgid "" -"For more information about the FreedomBox project, see the FreedomBox Wiki." +"For more information about the %(box_name)s project, see the %(box_name)s Wiki." msgstr "" "Zie voor meer informatie over het FreedomBox project de FreedomBox Wiki." -#: plinth/modules/help/templates/help_about.html:72 +#: plinth/modules/help/templates/help_about.html:73 msgid "Learn more »" msgstr "Leer meer »" -#: plinth/modules/help/templates/help_about.html:75 +#: plinth/modules/help/templates/help_about.html:76 #, python-format msgid "You are running Plinth version %(version)s." msgstr "Dit is Plinth versie %(version)s." -#: plinth/modules/help/templates/help_index.html:25 -#: plinth/templates/base.html:98 -msgid "Help" -msgstr "Hulp" +#: plinth/modules/help/templates/help_base.html:36 +#, python-format +msgid "%(box_name)s Setup" +msgstr "" #: plinth/modules/help/templates/help_index.html:29 -#, python-format +#, fuzzy, python-format +#| msgid "" +#| "The FreedomBox Manual is the best place to " +#| "start for information regarding %(box_name)s." msgid "" -"The FreedomBox Manual is the best place to " +"The %(box_name)s Manual is the best place to " "start for information regarding %(box_name)s." msgstr "" "Het FreedomBox Handboek (Engelstalig) is de " "beste manier om meer te weten te komen meer informatie over %(box_name)s." #: plinth/modules/help/templates/help_index.html:36 +#, fuzzy, python-format +#| msgid "" +#| " " +#| "FreedomBox project wiki contains further information." msgid "" -" FreedomBox " -"project wiki contains further information." +" " +"%(box_name)s project wiki contains further information." msgstr "" "Zie " "FreedomBox project wiki voor meer informatie." #: plinth/modules/help/templates/help_index.html:43 +#, fuzzy, python-format +#| msgid "" +#| "To seek help from FreedomBox community, queries may be posted on the mailing list. The list archives also contain information about " +#| "problems faced by other users and possible solutions." msgid "" -"To seek help from FreedomBox community, queries may be posted on the " -"mailing list. The list archives also contain information about problems " -"faced by other users and possible solutions." +"To seek help from %(box_name)s community, queries may be posted on the mailing list. The list archives also contain information about " +"problems faced by other users and possible solutions." msgstr "" "Om meer informatie te krijgen vanuit de FreedomBox community, kunnen vragen " "worden gesteld op de #freedombox " +"channel using the IRC web interface." msgstr "" -"Veel FreedomBox deelnemers en gebruikers zijn ook te vinden op het " -"#freedombox kanaal op het irc.oftc.net IRC netwerk." #: plinth/modules/ikiwiki/__init__.py:38 -msgid "Wiki & Blog (Ikiwiki)" +#, fuzzy +#| msgid "Wiki & Blog (Ikiwiki)" +msgid "Wiki and Blog (ikiwiki)" msgstr "Wiki & Blog (Ikiwiki)" #: plinth/modules/ikiwiki/__init__.py:43 -msgid "Ikiwiki wikis and blogs" +#, fuzzy +#| msgid "Ikiwiki wikis and blogs" +msgid "ikiwiki wikis and blogs" msgstr "Ikiwiki wiki's en blogs" #: plinth/modules/ikiwiki/forms.py:29 -msgid "Enable Ikiwiki" +#, fuzzy +#| msgid "Enable Ikiwiki" +msgid "Enable ikiwiki" msgstr "Ikiwiki Inschakelen" #: plinth/modules/ikiwiki/forms.py:36 @@ -1017,24 +1164,30 @@ msgstr "" "\">/ikiwiki." #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:27 -#, python-format -msgid "Delete Wiki/Blog %(name)s" +#, fuzzy, python-format +#| msgid "Delete Wiki/Blog %(name)s" +msgid "Delete Wiki or Blog %(name)s" msgstr "Verwijder Wiki/Blog %(name)s" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:33 +#, fuzzy +#| msgid "" +#| "This action will remove all the posts, pages and comments including " +#| "revision history. Delete this wiki/blog permanently?" msgid "" "This action will remove all the posts, pages and comments including revision " -"history. Delete this wiki/blog permanently?" +"history. Delete this wiki or blog permanently?" msgstr "" "Deze actie zal alle bijdragen, pagina's, en commentaar inclusief revisie-" "historie. Deze wiki/blog permanent verwijderen?" -#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:43 +#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:44 #, python-format msgid "Delete %(name)s" msgstr "%(name)s verwijderen" -#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:46 +#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:47 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:60 #: plinth/modules/networks/templates/connections_delete.html:41 #: plinth/modules/users/templates/users_delete.html:41 msgid "Cancel" @@ -1067,7 +1220,9 @@ msgid "Create" msgstr "Maak" #: plinth/modules/ikiwiki/views.py:73 -msgid "Wiki & Blog" +#, fuzzy +#| msgid "Wiki & Blog" +msgid "Wiki and Blog" msgstr "Wiki & Blog" #: plinth/modules/ikiwiki/views.py:106 @@ -1075,8 +1230,10 @@ msgid "Manage Wikis and Blogs" msgstr "Stel Wiki's en Blog's in" #: plinth/modules/ikiwiki/views.py:132 -msgid "Create Wiki/Blog" -msgstr "Nieuwe Wiki/Blog" +#, fuzzy +#| msgid "Create a Wiki or Blog" +msgid "Create Wiki or Blog" +msgstr "Maak een Wiki of Blog" #: plinth/modules/ikiwiki/views.py:145 #, python-brace-format @@ -1109,9 +1266,154 @@ msgid "Could not delete {name}: {error}" msgstr "Verwijderen van {name} mislukt: {error}" #: plinth/modules/ikiwiki/views.py:182 -msgid "Delete Wiki/Blog" +#, fuzzy +#| msgid "Delete Wiki/Blog" +msgid "Delete Wiki or Blog" msgstr "Verwijder Wiki/Blog" +#: plinth/modules/letsencrypt/__init__.py:43 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:38 +#: plinth/modules/letsencrypt/views.py:45 +msgid "Certificates (Let's Encrypt)" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:41 +#, python-format +msgid "" +"A digital certficate allows users of a web service to verify the identity of " +"the service and to securely communicate with it. %(box_name)s can " +"automatically obtain and setup digital certificates for each available " +"domain. It does so by proving itself to be the owner of a domain to Let's " +"Encrypt, a certficate authority (CA)." +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:52 +msgid "" +"Let's Encrypt is a free, automated, and open certificate authority, run for " +"the public’s benefit by the Internet Security Research Group (ISRG). Please " +"read and agree with the Let's Encrypt Subscriber Agreement before using this service." +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:66 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:70 +#, fuzzy +#| msgid "Domain Name" +msgid "Domain" +msgstr "Domeinnaam" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:67 +msgid "Certificate Status" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:68 +#, fuzzy +#| msgid "Security" +msgid "Website Security" +msgstr "Security" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:69 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:72 +#, fuzzy +#| msgid "Applications" +msgid "Actions" +msgstr "Programma's" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:79 +#, python-format +msgid "Expires on %(expiry_date)s" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:85 +msgid "No certficate" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:102 +msgid "Revoke" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:108 +msgid "Re-obtain" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:115 +msgid "Obtain" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:55 +#, python-brace-format +msgid "Certificate successfully revoked for domain {domain}" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:60 +#, python-brace-format +msgid "Failed to revoke certificate for domain {domain}: {error}" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:72 +#, python-brace-format +msgid "Certificate successfully obtained for domain {domain}" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:77 +#, python-brace-format +msgid "Failed to obtain certificate for domain {domain}: {error}" +msgstr "" + +#: plinth/modules/monkeysphere/__init__.py:32 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:35 +#: plinth/modules/monkeysphere/views.py:44 +msgid "Monkeysphere" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:38 +msgid "" +"With Monkeysphere, a PGP key can be generated for each configured domain " +"serving SSH. The PGP public key can then be uploaded to the PGP keyservers. " +"Users connecting to this machine through SSH can verify that they are " +"connecting to the correct host. For users to trust the key, at least one " +"person (usually the machine owner) must sign the key using the regular PGP " +"key signing process. See the Monkeysphere SSH documentation for more details." +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:53 +msgid "Publishing key to keyserver..." +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:71 +msgid "GPG Fingerprint" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:83 +#: plinth/modules/names/views.py:45 +msgid "Not Available" +msgstr "Niet Beschikbaar" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:93 +msgid "Generate PGP Key" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:101 +msgid "Publish Key" +msgstr "" + +#: plinth/modules/monkeysphere/views.py:58 +msgid "Generated PGP key." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:83 +msgid "Cancelled key publishing." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:120 +msgid "Published key to keyserver." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:122 +msgid "Error occurred while publishing key." +msgstr "" + #: plinth/modules/mumble/__init__.py:38 #: plinth/modules/mumble/templates/mumble.html:26 #: plinth/modules/mumble/views.py:58 @@ -1153,61 +1455,48 @@ msgstr "Mumble server draait" msgid "Mumble server is not running" msgstr "Mumble server draait niet" -#: plinth/modules/names/__init__.py:30 +#: plinth/modules/names/__init__.py:29 msgid "HTTP" msgstr "HTTP" -#: plinth/modules/names/__init__.py:31 +#: plinth/modules/names/__init__.py:30 msgid "HTTPS" msgstr "HTTPS" -#: plinth/modules/names/__init__.py:32 +#: plinth/modules/names/__init__.py:31 msgid "SSH" msgstr "SSH" -#: plinth/modules/names/__init__.py:46 plinth/modules/names/views.py:34 +#: plinth/modules/names/__init__.py:45 plinth/modules/names/views.py:34 msgid "Name Services" msgstr "Domeinnamen" -#: plinth/modules/names/__init__.py:107 -msgid "Not Available" -msgstr "Niet Beschikbaar" - #: plinth/modules/networks/__init__.py:108 #, python-brace-format msgid "Using DNSSEC on IPv{kind}" msgstr "Gebruikt DNSSEC op IPv{kind}" #: plinth/modules/networks/forms.py:30 -msgid "-- select --" -msgstr "-- selecteer --" - -#: plinth/modules/networks/forms.py:42 msgid "Connection Type" msgstr "Verbindingssoort" -#: plinth/modules/networks/forms.py:49 plinth/modules/networks/forms.py:106 -#: plinth/modules/networks/forms.py:133 +#: plinth/modules/networks/forms.py:37 msgid "Connection Name" msgstr "Verbindingsnaam" -#: plinth/modules/networks/forms.py:51 plinth/modules/networks/forms.py:108 -#: plinth/modules/networks/forms.py:135 +#: plinth/modules/networks/forms.py:39 msgid "Physical Interface" msgstr "Fysieke Interface" -#: plinth/modules/networks/forms.py:53 plinth/modules/networks/forms.py:110 -#: plinth/modules/networks/forms.py:137 +#: plinth/modules/networks/forms.py:41 msgid "The network device that this connection should be bound to." msgstr "De netwerkapparatuur waar deze verbinding mee moet worden verbonden." -#: plinth/modules/networks/forms.py:56 plinth/modules/networks/forms.py:113 -#: plinth/modules/networks/forms.py:140 +#: plinth/modules/networks/forms.py:44 msgid "Firewall Zone" msgstr "Firewall Zone" -#: plinth/modules/networks/forms.py:57 plinth/modules/networks/forms.py:114 -#: plinth/modules/networks/forms.py:141 +#: plinth/modules/networks/forms.py:45 msgid "" "The firewall zone will control which services are available over this " "interfaces. Select Internal only for trusted networks." @@ -1215,11 +1504,11 @@ msgstr "" "De firewall zone controleert welke machines beschikbaar zijn via deze " "verbinding. Selecteer \"Allen Intern\" voor vertrouwde netwerken." -#: plinth/modules/networks/forms.py:61 plinth/modules/networks/forms.py:162 +#: plinth/modules/networks/forms.py:49 msgid "IPv4 Addressing Method" msgstr "IPv4 Adresseringsmethode" -#: plinth/modules/networks/forms.py:62 +#: plinth/modules/networks/forms.py:50 msgid "" "\"Shared\" method will start a DHCP server and \"Automatic\" method will " "acquire configuration from a DHCP server." @@ -1227,15 +1516,15 @@ msgstr "" "De 'Shared' methode zal een DHCP-server inschakelen en bij de \"Automatic\" " "methode komt de configuratie van een DHCP-server." -#: plinth/modules/networks/forms.py:68 plinth/modules/networks/forms.py:170 +#: plinth/modules/networks/forms.py:56 msgid "Address" msgstr "Adres" -#: plinth/modules/networks/forms.py:72 plinth/modules/networks/forms.py:174 +#: plinth/modules/networks/forms.py:60 msgid "Netmask" msgstr "Netmask" -#: plinth/modules/networks/forms.py:73 plinth/modules/networks/forms.py:175 +#: plinth/modules/networks/forms.py:61 msgid "" "Optional value. If left blank, a default netmask based on the address will " "be used." @@ -1243,21 +1532,21 @@ msgstr "" "Optionele waarde. Indien leeg, zal een standaard netmask op basis van het " "adres worden gebruikt." -#: plinth/modules/networks/forms.py:78 plinth/modules/networks/forms.py:180 +#: plinth/modules/networks/forms.py:66 #: plinth/modules/networks/templates/connection_show.html:202 #: plinth/modules/networks/templates/connection_show.html:241 msgid "Gateway" msgstr "Gateway" -#: plinth/modules/networks/forms.py:79 plinth/modules/networks/forms.py:181 +#: plinth/modules/networks/forms.py:67 msgid "Optional value." msgstr "Optionele waarde." -#: plinth/modules/networks/forms.py:83 plinth/modules/networks/forms.py:185 +#: plinth/modules/networks/forms.py:71 msgid "DNS Server" msgstr "DNS Server" -#: plinth/modules/networks/forms.py:84 plinth/modules/networks/forms.py:186 +#: plinth/modules/networks/forms.py:72 msgid "" "Optional value. If this value is given and IPv4 addressing method is " "\"Automatic\", the DNS Servers provided by a DHCP server will be ignored." @@ -1266,11 +1555,11 @@ msgstr "" "adresseringsmethode is \"Automatisch\", zullen de DNS-Servers van de DHCP-" "server worden genegeerd." -#: plinth/modules/networks/forms.py:90 plinth/modules/networks/forms.py:192 +#: plinth/modules/networks/forms.py:78 msgid "Second DNS Server" msgstr "Tweede DNS Server" -#: plinth/modules/networks/forms.py:91 plinth/modules/networks/forms.py:193 +#: plinth/modules/networks/forms.py:79 msgid "" "Optional value. If this value is given and IPv4 Addressing Method is " "\"Automatic\", the DNS Servers provided by a DHCP server will be ignored." @@ -1279,29 +1568,29 @@ msgstr "" "methode is \"Automatisch\", zullen de DNS-Servers van de DHCP-server worden " "genegeerd." -#: plinth/modules/networks/forms.py:121 -msgid "Show password" -msgstr "Toon wachtwoord" +#: plinth/modules/networks/forms.py:89 +msgid "-- select --" +msgstr "-- selecteer --" -#: plinth/modules/networks/forms.py:145 +#: plinth/modules/networks/forms.py:175 #: plinth/modules/networks/templates/connection_show.html:144 msgid "SSID" msgstr "SSID" -#: plinth/modules/networks/forms.py:146 +#: plinth/modules/networks/forms.py:176 msgid "The visible name of the network." msgstr "De zichtbare netwerknaam." -#: plinth/modules/networks/forms.py:148 +#: plinth/modules/networks/forms.py:178 #: plinth/modules/networks/templates/connection_show.html:157 msgid "Mode" msgstr "Modus" -#: plinth/modules/networks/forms.py:153 +#: plinth/modules/networks/forms.py:183 msgid "Authentication Mode" msgstr "Authentificatiemodus" -#: plinth/modules/networks/forms.py:154 +#: plinth/modules/networks/forms.py:184 msgid "" "Select WPA if the wireless network is secured and requires clients to have " "the password to connect." @@ -1309,31 +1598,22 @@ msgstr "" "Selecteer WPA indien het netwerk beveiligd is en gebruikerswachtwoorden " "gebruikt om te verbinden." -#: plinth/modules/networks/forms.py:158 +#: plinth/modules/networks/forms.py:188 msgid "Passphrase" msgstr "Wachtwoordzin" -#: plinth/modules/networks/forms.py:166 -msgid "" -"Select Automatic (DHCP) if you are connecting to an existing wireless " -"network. Shared mode is useful when running an Access Point." -msgstr "" -"Selecteer Automatisch (DHCP) als een verbinding met een bestaand draadloos " -"netwerk wordt gemaakt. Shared Mode is handig als hiermee een Acces Point " -"wordt gemaakt." - #: plinth/modules/networks/networks.py:36 #: plinth/modules/networks/networks.py:56 msgid "Network Connections" msgstr "Netwerkverbindingen" #: plinth/modules/networks/networks.py:38 -#: plinth/modules/networks/networks.py:273 +#: plinth/modules/networks/networks.py:242 msgid "Nearby Wi-Fi Networks" msgstr "Wi-Fi Netwerken dichtbij" #: plinth/modules/networks/networks.py:40 -#: plinth/modules/networks/networks.py:295 +#: plinth/modules/networks/networks.py:264 msgid "Add Connection" msgstr "Verbinding toevoegen" @@ -1357,58 +1637,58 @@ msgstr "Kan verbinding niet wijzigen: Verbinding niet gevonden." msgid "This type of connection is not yet understood." msgstr "Deze verbindingsmethode is (nog) niet bekend." -#: plinth/modules/networks/networks.py:170 -#: plinth/modules/networks/networks.py:229 +#: plinth/modules/networks/networks.py:139 +#: plinth/modules/networks/networks.py:198 #: plinth/modules/networks/templates/connections_edit.html:34 msgid "Edit Connection" msgstr "Wijzig verbinding" -#: plinth/modules/networks/networks.py:240 +#: plinth/modules/networks/networks.py:209 #, python-brace-format msgid "Activated connection {name}." msgstr "Geactiveerde verbinding {name}." -#: plinth/modules/networks/networks.py:243 +#: plinth/modules/networks/networks.py:212 msgid "Failed to activate connection: Connection not found." msgstr "Kan verbinding niet inschakelen: Verbinding niet gevonden." -#: plinth/modules/networks/networks.py:247 +#: plinth/modules/networks/networks.py:216 #, python-brace-format msgid "Failed to activate connection {name}: No suitable device is available." msgstr "Kan verbinding {name} niet inschakelen: Verbinding niet gevonden." -#: plinth/modules/networks/networks.py:260 +#: plinth/modules/networks/networks.py:229 #, python-brace-format msgid "Deactivated connection {name}." msgstr "Verbinding {name} uitgeschakeld." -#: plinth/modules/networks/networks.py:263 +#: plinth/modules/networks/networks.py:232 msgid "Failed to de-activate connection: Connection not found." msgstr "Kan verbinding niet uitschakelen: Verbinding niet gevonden." -#: plinth/modules/networks/networks.py:325 +#: plinth/modules/networks/networks.py:282 msgid "Adding New Ethernet Connection" msgstr "Toevoegen nieuwe Ethernetverbinding" -#: plinth/modules/networks/networks.py:350 +#: plinth/modules/networks/networks.py:300 msgid "Adding New PPPoE Connection" msgstr "Toevoegen nieuwe PPPoE verbinding" -#: plinth/modules/networks/networks.py:399 +#: plinth/modules/networks/networks.py:332 msgid "Adding New Wi-Fi Connection" msgstr "Toevoegen nieuwe W-Fi verbinding" -#: plinth/modules/networks/networks.py:413 +#: plinth/modules/networks/networks.py:346 #, python-brace-format msgid "Connection {name} deleted." msgstr "Verbinding {name} verwijderd." -#: plinth/modules/networks/networks.py:416 -#: plinth/modules/networks/networks.py:425 +#: plinth/modules/networks/networks.py:349 +#: plinth/modules/networks/networks.py:358 msgid "Failed to delete connection: Connection not found." msgstr "Kan verbinding niet verwijderen: Verbinding niet gevonden." -#: plinth/modules/networks/networks.py:430 +#: plinth/modules/networks/networks.py:363 #: plinth/modules/networks/templates/connections_delete.html:26 msgid "Delete Connection" msgstr "Verwijder verbinding" @@ -1418,7 +1698,7 @@ msgid "Edit connection" msgstr "Wijzig verbinding" #: plinth/modules/networks/templates/connection_show.html:43 -#: plinth/templates/base.html:119 +#: plinth/templates/base.html:123 msgid "Edit" msgstr "Wijzig" @@ -1564,10 +1844,16 @@ msgid "Firewall zone" msgstr "Firewall zone" #: plinth/modules/networks/templates/connection_show.html:280 +#, fuzzy +#| msgid "" +#| "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." msgid "" -"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." +"This interface should be connected to a 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." msgstr "" "Deze verbinding zou met een lokaal netwerk/machine verbonden moeten zijn. " "Als deze verbonden wordt met een publiek netwerk, worden diensten die " @@ -1575,20 +1861,31 @@ msgstr "" "een veiligheidsrisico." #: plinth/modules/networks/templates/connection_show.html:300 +#, fuzzy +#| msgid "" +#| "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." msgid "" -"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." +"This interface should receive your Internet connection. If you connect it to " +"a local network/machine, many services meant to available only internally " +"will not be available." msgstr "" "Deze verbinding hoort de internetverbinding te ontvangen. Als het verbonden " "wordt met een lokaal netwerk/machine, zijn veel diensten die alleen lokaal " "beschikbaar zijn niet bereikbaar." #: plinth/modules/networks/templates/connection_show.html:319 -msgid "" -"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 " +#, fuzzy, python-format +#| msgid "" +#| "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." +msgid "" +"This interface is not maintained by %(box_name)s. Its security status is " +"unknown to %(box_name)s. Many %(box_name)s services may not be available on " +"this interface. It is recommended that you deactivate or delete this " "connection and re-configure it." msgstr "" "Deze verbinding wordt niet door FreedomBox beheerd. De veiligheid ervan is " @@ -1681,10 +1978,17 @@ msgid "Enable OpenVPN server" msgstr "OpenVPN server Inschakelen" #: plinth/modules/openvpn/templates/openvpn.html:38 -#, python-format +#, fuzzy, python-format +#| msgid "" +#| "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 %(box_name)s in order to join " +#| "your home network and access private/internal services provided by " +#| "%(box_name)s. You can also access the rest of the Internet via " +#| "%(box_name)s for added security and anonymity." msgid "" "Virtual Private Network (VPN) is a technique for securely connecting two " -"machines in order to access resources of a private network. While you are " +"devices in order to access resources of a private network. While you are " "away from home, you can connect to your %(box_name)s in order to join your " "home network and access private/internal services provided by %(box_name)s. " "You can also access the rest of the Internet via %(box_name)s for added " @@ -1703,12 +2007,19 @@ msgid "Profile" msgstr "Profiel" #: plinth/modules/openvpn/templates/openvpn.html:54 -#, python-format +#, fuzzy, python-format +#| msgid "" +#| "To connect to %(box_name)s'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 documentation on recommended clients and instructions on how to " +#| "configure them." msgid "" "To connect to %(box_name)s'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 documentation on recommended clients and instructions on how to " "configure them." msgstr "" @@ -2264,6 +2575,64 @@ msgstr "Quassel-core server draait" msgid "Quassel core service is not running" msgstr "Quassel-core server draait niet" +#: plinth/modules/repro/__init__.py:36 +#: plinth/modules/repro/templates/repro.html:26 +#: plinth/modules/repro/views.py:55 +#, fuzzy +#| msgid "Server port" +msgid "SIP Server (repro)" +msgstr "Serverpoort" + +#: plinth/modules/repro/__init__.py:41 +#, fuzzy +#| msgid "Second DNS Server" +msgid "repro SIP Server" +msgstr "Tweede DNS Server" + +#: plinth/modules/repro/forms.py:29 +#, fuzzy +#| msgid "Enable Quassel core service" +msgid "Enable repro service" +msgstr "Quassel-core service inschakelen" + +#: plinth/modules/repro/templates/repro.html:29 +msgid "" +"repro provides various SIP services that a SIP softphone can utilize to " +"provide audio and video calls as well as presence and instant messaging. " +"repro provides a server and SIP user accounts that clients can use to let " +"their presence known. It also acts as a proxy to federate SIP " +"communications to other servers on the Internet similar to email." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:39 +msgid "" +"To make SIP calls, a client application is needed. Available clients include " +"Jitsi (for computers) and CSipSimple (for Android phones)." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:48 +msgid "" +"Note: Before using repro, domains and users will need to " +"be configured using the web-based " +"configuration panel. Users in the admin group will be able to " +"log in to the repro configuration panel. After setting the domain, it is " +"required to restart the repro service. Disable the service and re-enable it." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:63 +#, fuzzy +#| msgid "Quassel core service is running" +msgid "repro service is running" +msgstr "Quassel-core server draait" + +#: plinth/modules/repro/templates/repro.html:66 +#, fuzzy +#| msgid "Quassel core service is not running" +msgid "repro service is not running" +msgstr "Quassel-core server draait niet" + #: plinth/modules/restore/__init__.py:36 #: plinth/modules/restore/templates/restore_index.html:26 #: plinth/modules/restore/views.py:46 @@ -2279,13 +2648,19 @@ msgid "Enable reStore" msgstr "reStore Inschakelen" #: plinth/modules/restore/templates/restore_index.html:29 -#, python-format +#, fuzzy, python-format +#| msgid "" +#| "reStore is a server for unhosted web " +#| "applications. The idea is to uncouple web applications from data. No " +#| "matter where a web application is served from, the data can be stored on " +#| "an unhosted storage server of user's choice. With reStore, your " +#| "%(cfg.box_name)s becomes your unhosted storage server." msgid "" "reStore is a server for unhosted web " "applications. The idea is to uncouple web applications from data. No " "matter where a web application is served from, the data can be stored on an " -"unhosted storage server of user's choice. With reStore, your " -"%(cfg.box_name)s becomes your unhosted storage server." +"unhosted storage server of user's choice. With reStore, your %(box_name)s " +"becomes your unhosted storage server." msgstr "" "reStore is een server voor unhosted web " "applicaties. Het idee is om webapplicaties en data te scheiden. Het maakt " @@ -2387,7 +2762,7 @@ msgstr "Systeem" #: plinth/modules/system/system.py:33 #: plinth/modules/system/templates/system.html:25 -#: plinth/templates/base.html:105 +#: plinth/templates/base.html:109 msgid "System Configuration" msgstr "Systeeminstelling" @@ -2404,33 +2779,81 @@ msgstr "" "Deze mogelijkheden veranderen de basis van %(box_name)s, dus wees " "gewaarschuwd!" -#: plinth/modules/tor/__init__.py:50 +#: plinth/modules/tor/__init__.py:48 plinth/modules/tor/templates/tor.html:35 +msgid "Anonymity Network (Tor)" +msgstr "Anonimiteitsnetwerk (Tor)" + +#: plinth/modules/tor/__init__.py:53 +#, fuzzy +#| msgid "Anonymity Network (Tor)" +msgid "Tor Anonymity Network" +msgstr "Anonimiteitsnetwerk (Tor)" + +#: plinth/modules/tor/__init__.py:58 +msgid "Tor Bridge Relay" +msgstr "" + +#: plinth/modules/tor/__init__.py:76 plinth/modules/tor/views.py:144 +msgid "Tor Hidden Service" +msgstr "Tor-Hidden Service" + +#: plinth/modules/tor/__init__.py:222 msgid "Tor relay port available" msgstr "Tor relay poort beschikbaar" -#: plinth/modules/tor/__init__.py:58 +#: plinth/modules/tor/__init__.py:230 msgid "Obfs3 transport registered" msgstr "Obfs3 transport geregistreerd" -#: plinth/modules/tor/__init__.py:64 +#: plinth/modules/tor/__init__.py:236 msgid "Obfs4 transport registered" msgstr "Obfs4 transport geregistreerd" -#: plinth/modules/tor/__init__.py:101 +#: plinth/modules/tor/__init__.py:273 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "Gebruik URL {url} op tcp{kind} via Tor" -#: plinth/modules/tor/__init__.py:112 +#: plinth/modules/tor/__init__.py:284 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "Bevestig Tor gebruik met {url} via tcp{kind}" -#: plinth/modules/tor/templates/tor.html:26 plinth/modules/tor/tor.py:66 -msgid "Anonymity Network (Tor)" -msgstr "Anonimiteitsnetwerk (Tor)" +#: plinth/modules/tor/forms.py:32 +msgid "Enable Tor" +msgstr "Tor Inschakelen" + +#: plinth/modules/tor/forms.py:35 +msgid "Enable Tor Hidden Service" +msgstr "Tor Hidden Service Inschakelen" + +#: plinth/modules/tor/forms.py:38 +#, fuzzy, python-brace-format +#| msgid "" +#| "A hidden service will allow FreedomBox to provide selected services (such " +#| "as ownCloud or Chat) without revealing its location." +msgid "" +"A hidden service will allow {box_name} to provide selected services (such as " +"ownCloud or chat) without revealing its location." +msgstr "" +"Een \"hidden service\" zorgt ervoor dat Freedombox geselecteerde diensten " +"(zoals ownCloud of Chat) kan aanbieden zonder de locatie te onthullen." + +#: plinth/modules/tor/forms.py:42 +msgid "Download software packages over Tor" +msgstr "Download Softwarepakketen via Tor" -#: plinth/modules/tor/templates/tor.html:29 +#: plinth/modules/tor/forms.py:44 +msgid "" +"When enabled, software will be downloaded over the Tor network for " +"installations and upgrades. This adds a degree of privacy and security " +"during software downloads." +msgstr "" +"Indien ingeschakeld, wordt software door middel van het Tor netwerk " +"binnengehaald. Dit voegt een mate van privacy en veiligheid tijdens software " +"downloads toe." + +#: plinth/modules/tor/templates/tor.html:38 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -2444,28 +2867,34 @@ msgstr "" "de " "Tor Browser aan." -#: plinth/modules/tor/templates/tor.html:44 +#: plinth/modules/tor/templates/tor.html:54 +#, fuzzy +#| msgid "Configuration updated" +msgid "Tor configuration is being updated" +msgstr "Configuratie bijgewerkt" + +#: plinth/modules/tor/templates/tor.html:62 msgid "Tor is running" msgstr "Tor draait" -#: plinth/modules/tor/templates/tor.html:47 +#: plinth/modules/tor/templates/tor.html:65 msgid "Tor is not running" msgstr "Tor draait niet" -#: plinth/modules/tor/templates/tor.html:59 +#: plinth/modules/tor/templates/tor.html:77 msgid "Hidden Service" msgstr "Hidden Service" -#: plinth/modules/tor/templates/tor.html:60 -#: plinth/modules/tor/templates/tor.html:102 +#: plinth/modules/tor/templates/tor.html:78 +#: plinth/modules/tor/templates/tor.html:120 msgid "Port" msgstr "Poort" -#: plinth/modules/tor/templates/tor.html:85 +#: plinth/modules/tor/templates/tor.html:103 msgid "Bridge" msgstr "Bridge" -#: plinth/modules/tor/templates/tor.html:88 +#: plinth/modules/tor/templates/tor.html:106 #, python-format msgid "" "Your %(box_name)s is configured as a Tor bridge with obfsproxy, so it can " @@ -2478,89 +2907,41 @@ msgstr "" "router of firewall bevindt, is het belangrijk te zorgen dat de volgende " "poorten open staan en indien nodig worden doorgeleid:" -#: plinth/modules/tor/templates/tor.html:101 +#: plinth/modules/tor/templates/tor.html:119 msgid "Service" msgstr "Dienst" -#: plinth/modules/tor/templates/tor.html:117 +#: plinth/modules/tor/templates/tor.html:135 msgid "SOCKS" msgstr "SOCKS" -#: plinth/modules/tor/templates/tor.html:120 +#: plinth/modules/tor/templates/tor.html:138 #, python-format msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "Een Tor SOCKS poort is beschikbaar op %(box_name)s, op TCP poort 9050." -#: plinth/modules/tor/tor.py:46 -msgid "Enable Tor" -msgstr "Tor Inschakelen" - -#: plinth/modules/tor/tor.py:49 -msgid "Enable Tor Hidden Service" -msgstr "Tor Hidden Service Inschakelen" - -#: plinth/modules/tor/tor.py:51 -msgid "" -"A hidden service will allow FreedomBox to provide selected services (such as " -"ownCloud or Chat) without revealing its location." -msgstr "" -"Een \"hidden service\" zorgt ervoor dat Freedombox geselecteerde diensten " -"(zoals ownCloud of Chat) kan aanbieden zonder de locatie te onthullen." - -#: plinth/modules/tor/tor.py:55 -msgid "Download software packages over Tor" -msgstr "Download Softwarepakketen via Tor" - -#: plinth/modules/tor/tor.py:57 -msgid "" -"When enabled, software will be downloaded over the Tor network for " -"installations and upgrades. This adds a degree of privacy and security " -"during software downloads." -msgstr "" -"Indien ingeschakeld, wordt software door middel van het Tor netwerk " -"binnengehaald. Dit voegt een mate van privacy en veiligheid tijdens software " -"downloads toe." - -#: plinth/modules/tor/tor.py:85 plinth/modules/tor/tor.py:285 -msgid "Tor Hidden Service" -msgstr "Tor-Hidden Service" - -#: plinth/modules/tor/tor.py:115 +#: plinth/modules/tor/views.py:68 msgid "Tor Control Panel" msgstr "Tor Controlepaneel" -#: plinth/modules/tor/tor.py:240 +#: plinth/modules/tor/views.py:79 #, python-brace-format msgid "Action error: {0} [{1}] [{2}]" msgstr "Actiefout: {0} [{1}] [{2}]" -#: plinth/modules/tor/tor.py:256 -msgid "Tor enabled" -msgstr "Tor ingeschakeld" - -#: plinth/modules/tor/tor.py:259 -msgid "Tor disabled" -msgstr "Tor uitgeschakeld" - -#: plinth/modules/tor/tor.py:264 -msgid "Tor hidden service enabled" -msgstr "Tor hidden service ingeschakeld" - -#: plinth/modules/tor/tor.py:267 -msgid "Tor hidden service disabled" -msgstr "Tor hidden service uitgeschakeld" - -#: plinth/modules/tor/tor.py:292 -msgid "Enabled package download over Tor" -msgstr "Pakket download via Tor Inschakelen" +#: plinth/modules/tor/views.py:148 +#, fuzzy +#| msgid "Configuration updated" +msgid "Configuration updated." +msgstr "Configuratie bijgewerkt" -#: plinth/modules/tor/tor.py:295 -msgid "Disabled package download over Tor" -msgstr "Pakket download via Tor Uitschakelen" +#: plinth/modules/tor/views.py:150 +msgid "An error occurred during configuration." +msgstr "" #: plinth/modules/transmission/__init__.py:38 #: plinth/modules/transmission/templates/transmission.html:26 -#: plinth/modules/transmission/views.py:63 +#: plinth/modules/transmission/views.py:67 msgid "BitTorrent (Transmission)" msgstr "BitTorrent (Transmission)" @@ -2577,10 +2958,6 @@ msgid "Download directory" msgstr "Opslagmap" #: plinth/modules/transmission/forms.py:34 -#| msgid "" -#| "Directory where downloads are saved. If you change the default " -#| "directory, ensure that the new directory exists and is writable by " -#| "\"debian-tramission\" user." msgid "" "Directory where downloads are saved. If you change the default directory, " "ensure that the new directory exists and is writable by \"debian-transmission" @@ -2642,73 +3019,72 @@ msgstr "" "Indien ingeschakeld, wordt het automatische updateprogramma eens per dag " "gedraaid. Het zal proberen alle beschikbare updates bij te werken." -#: plinth/modules/upgrades/templates/upgrades.html:40 -msgid "There was an error while upgrading." -msgstr "Er was een fout tijdens het bijwerken." - -#: plinth/modules/upgrades/templates/upgrades.html:43 -#: plinth/modules/upgrades/templates/upgrades.html:59 -msgid "Output from unattended-upgrades:" -msgstr "Uitvoer van automatische upgrades:" - -#: plinth/modules/upgrades/templates/upgrades.html:50 -msgid "The operating system is up to date now.  " -msgstr "Het besturingssysteem is nu bijgewerkt.  " - -#: plinth/modules/upgrades/templates/upgrades.html:53 -msgid "Show Details" -msgstr "Toon Details" +#: plinth/modules/upgrades/templates/upgrades.html:37 +msgid "" +"Upgrades install the latest software and security updates. When automatic " +"upgrades are enabled, upgrades are automatically run every night. You don't " +"normally need to start the upgrade process." +msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:69 +#: plinth/modules/upgrades/templates/upgrades.html:45 msgid "" -"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." +"Depending on the number of packages to install, this may take a long time to " +"complete. While upgrades are in progress, you will not be able to install " +"other packages. During the upgrade, this web interface may be temporarily " +"unavailable and show an error. Refresh the page to continue." msgstr "" -"Dit zal het automatische updateprogramma draaien. Het zal proberen het " -"systeem bij te werken met de nieuwste Debian pakketten. Dit kan enige " -"minuten duren." -#: plinth/modules/upgrades/templates/upgrades.html:80 +#: plinth/modules/upgrades/templates/upgrades.html:58 msgid "Upgrade now »" msgstr "Nu bijwerken »" -#: plinth/modules/upgrades/templates/upgrades.html:87 -msgid "System is being upgraded." -msgstr "Het systeem wordt bijgewerkt." +#: plinth/modules/upgrades/templates/upgrades.html:65 +#, fuzzy +#| msgid "ejabberd is running" +msgid "A package manager is running." +msgstr "ejabberd draait" -#: plinth/modules/upgrades/views.py:35 plinth/modules/upgrades/views.py:64 +#: plinth/modules/upgrades/templates/upgrades.html:70 +msgid "Recent log from upgrades:" +msgstr "" + +#: plinth/modules/upgrades/views.py:36 plinth/modules/upgrades/views.py:66 msgid "Automatic Upgrades" msgstr "Automatisch bijwerken" -#: plinth/modules/upgrades/views.py:37 +#: plinth/modules/upgrades/views.py:38 msgid "Upgrade Packages" msgstr "Pakketten Bijwerken" -#: plinth/modules/upgrades/views.py:75 +#: plinth/modules/upgrades/views.py:96 +#, fuzzy +#| msgid "Upgrade completed." +msgid "Upgrade process started." +msgstr "Bijwerken voltooid." + +#: plinth/modules/upgrades/views.py:99 +#, fuzzy +#| msgid "Upgrade failed." +msgid "Starting upgrade failed." +msgstr "Bijwerken mislukt." + +#: plinth/modules/upgrades/views.py:102 msgid "Package Upgrades" msgstr "Bijwerkbare Pakketten" -#: plinth/modules/upgrades/views.py:116 +#: plinth/modules/upgrades/views.py:131 #, python-brace-format msgid "Error when configuring unattended-upgrades: {error}" msgstr "Fout bij het instellen van automatische upgrades: {error}" -#: plinth/modules/upgrades/views.py:121 +#: plinth/modules/upgrades/views.py:136 msgid "Automatic upgrades enabled" msgstr "Automatisch bijwerken ingeschakeld" -#: plinth/modules/upgrades/views.py:123 +#: plinth/modules/upgrades/views.py:138 msgid "Automatic upgrades disabled" msgstr "Automatisch bijwerken uitgeschakeld" -#: plinth/modules/upgrades/views.py:142 -msgid "Upgrade completed." -msgstr "Bijwerken voltooid." - -#: plinth/modules/upgrades/views.py:144 -msgid "Upgrade failed." -msgstr "Bijwerken mislukt." - #: plinth/modules/users/__init__.py:36 msgid "Users and Groups" msgstr "Gebruikers en Groepen" @@ -2750,19 +3126,30 @@ msgstr "" msgid "Failed to add new user to {group} group." msgstr "Nieuwe gebruiker aan groep {group} toevoegen mislukt." -#: plinth/modules/users/forms.py:126 +#: plinth/modules/users/forms.py:92 +msgid "SSH Keys" +msgstr "" + +#: plinth/modules/users/forms.py:96 +msgid "" +"Setting an SSH public key will allow this user to securely log in to the " +"system without using a password. You may enter multiple keys, one on each " +"line. Blank lines and lines starting with # will be ignored." +msgstr "" + +#: plinth/modules/users/forms.py:136 msgid "Renaming LDAP user failed." msgstr "LDAP gebruiker hernoemen mislukt." -#: plinth/modules/users/forms.py:138 +#: plinth/modules/users/forms.py:148 msgid "Failed to remove user from group." msgstr "Gebruiker uit groep verwijderen mislukt." -#: plinth/modules/users/forms.py:149 +#: plinth/modules/users/forms.py:159 msgid "Failed to add user to group." msgstr "Gebruiker aan groep toevoegen mislukt." -#: plinth/modules/users/forms.py:174 +#: plinth/modules/users/forms.py:188 msgid "Changing LDAP user password failed." msgstr "Wijzigen LDAP gebruikerswachtwoord mislukt." @@ -2781,7 +3168,7 @@ msgid "Create User" msgstr "Maak gebruiker" #: plinth/modules/users/templates/users_delete.html:26 -#: plinth/modules/users/views.py:103 +#: plinth/modules/users/views.py:110 msgid "Delete User" msgstr "Gebruiker verwijderen" @@ -2836,20 +3223,20 @@ msgstr "Gebruiker %(username)s bijgewerkt." msgid "Edit User" msgstr "Gebruiker wijzigen" -#: plinth/modules/users/views.py:113 +#: plinth/modules/users/views.py:120 #, python-brace-format msgid "User {user} deleted." msgstr "Gebruiker {user} verwijderd." -#: plinth/modules/users/views.py:120 +#: plinth/modules/users/views.py:127 msgid "Deleting LDAP user failed." msgstr "Verwijderen van LDAP gebruiker mislukt." -#: plinth/modules/users/views.py:129 +#: plinth/modules/users/views.py:136 msgid "Change Password" msgstr "Wijzig wachtwoord" -#: plinth/modules/users/views.py:130 +#: plinth/modules/users/views.py:137 msgid "Password changed successfully." msgstr "Wachtwoord succesvol gewijzigd." @@ -2932,8 +3319,10 @@ msgstr "Web Server over Secure Socket Layer" msgid "Secure Shell (SSH) Server" msgstr "Secure Shell (SSH) Server" -#: plinth/service.py:78 -msgid "FreedomBox Web Interface (Plinth)" +#: plinth/service.py:79 +#, fuzzy, python-brace-format +#| msgid "FreedomBox Web Interface (Plinth)" +msgid "{box_name} Web Interface (Plinth)" msgstr "FreedomBox Web Interface (Plinth)" #: plinth/templates/404.html:25 @@ -2971,27 +3360,25 @@ msgstr "" "a> zodat we deze kunnen verhelpen." #: plinth/templates/base.html:49 -msgid "Plinth administrative interface for the FreedomBox" +#, fuzzy, python-format +#| msgid "Plinth administrative interface for the FreedomBox" +msgid "Plinth administrative interface for the %(box_name)s" msgstr "Plinth Instellingspagina voor deze FreedomBox" -#: plinth/templates/base.html:52 plinth/templates/base.html.py:88 -msgid "FreedomBox" -msgstr "FreedomBox" - -#: plinth/templates/base.html:81 +#: plinth/templates/base.html:83 msgid "Toggle navigation" msgstr "Navigatie in/uitschakelen" -#: plinth/templates/base.html:121 plinth/templates/base.html.py:122 +#: plinth/templates/base.html:125 plinth/templates/base.html.py:126 msgid "Change password" msgstr "Wijzig wachtwoord" -#: plinth/templates/base.html:125 plinth/templates/base.html.py:126 -#: plinth/templates/base.html:139 plinth/templates/base.html.py:141 +#: plinth/templates/base.html:129 plinth/templates/base.html.py:130 +#: plinth/templates/base.html:143 plinth/templates/base.html.py:145 msgid "Log out" msgstr "Afmelden" -#: plinth/templates/base.html:131 plinth/templates/base.html.py:133 +#: plinth/templates/base.html:135 plinth/templates/base.html.py:137 msgid "Log in" msgstr "Aanmelden" @@ -3033,6 +3420,87 @@ msgstr "Installeren van %(package_names)s: %(status)s" msgid "%(percentage)s%% complete" msgstr "%(percentage)s%% voltooid" +#~ msgid "show password" +#~ msgstr "toon wachtwoord" + +#~ msgid "The following is the current status:" +#~ msgstr "De huidige status is als volgt:" + +#~ msgid "Congratulations! Your FreedomBox is up and running!" +#~ msgstr "Gefeliciteerd, De FreedomBox is gereed!" + +#~ msgid "" +#~ "Please provide the following basic information to complete the setup " +#~ "process." +#~ msgstr "" +#~ "Beantwoord de volgende vragen om het installatieproces te voltooien." + +#~ msgid "Next" +#~ msgstr "Volgende" + +#~ msgid "FreedomBox Manual" +#~ msgstr "FreedomBox Handleiding" + +#~ msgid "" +#~ "Many FreedomBox contributors and users are also available on the " +#~ "#freedombox channel of the irc.oftc.net IRC network." +#~ msgstr "" +#~ "Veel FreedomBox deelnemers en gebruikers zijn ook te vinden op het " +#~ "#freedombox kanaal op het irc.oftc.net IRC netwerk." + +#~ msgid "Create Wiki/Blog" +#~ msgstr "Nieuwe Wiki/Blog" + +#~ msgid "" +#~ "Select Automatic (DHCP) if you are connecting to an existing wireless " +#~ "network. Shared mode is useful when running an Access Point." +#~ msgstr "" +#~ "Selecteer Automatisch (DHCP) als een verbinding met een bestaand " +#~ "draadloos netwerk wordt gemaakt. Shared Mode is handig als hiermee een " +#~ "Acces Point wordt gemaakt." + +#~ msgid "Tor enabled" +#~ msgstr "Tor ingeschakeld" + +#~ msgid "Tor disabled" +#~ msgstr "Tor uitgeschakeld" + +#~ msgid "Tor hidden service enabled" +#~ msgstr "Tor hidden service ingeschakeld" + +#~ msgid "Tor hidden service disabled" +#~ msgstr "Tor hidden service uitgeschakeld" + +#~ msgid "Enabled package download over Tor" +#~ msgstr "Pakket download via Tor Inschakelen" + +#~ msgid "Disabled package download over Tor" +#~ msgstr "Pakket download via Tor Uitschakelen" + +#~ msgid "There was an error while upgrading." +#~ msgstr "Er was een fout tijdens het bijwerken." + +#~ msgid "Output from unattended-upgrades:" +#~ msgstr "Uitvoer van automatische upgrades:" + +#~ msgid "The operating system is up to date now.  " +#~ msgstr "Het besturingssysteem is nu bijgewerkt.  " + +#~ msgid "Show Details" +#~ msgstr "Toon Details" + +#~ msgid "" +#~ "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." +#~ msgstr "" +#~ "Dit zal het automatische updateprogramma draaien. Het zal proberen het " +#~ "systeem bij te werken met de nieuwste Debian pakketten. Dit kan enige " +#~ "minuten duren." + +#~ msgid "System is being upgraded." +#~ msgstr "Het systeem wordt bijgewerkt." + #~ msgid "" #~ "You can install and run various services and applications on your " #~ "%(box_name)s." diff --git a/plinth/locale/pt/LC_MESSAGES/django.po b/plinth/locale/pt/LC_MESSAGES/django.po index 88d11d7b9..ee878fa82 100644 --- a/plinth/locale/pt/LC_MESSAGES/django.po +++ b/plinth/locale/pt/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-12-20 13:58+0530\n" +"POT-Creation-Date: 2016-01-31 22:19+0530\n" "PO-Revision-Date: 2015-12-15 01:08+0000\n" "Last-Translator: Daniel Sousa \n" "Language-Team: Portuguese gnudip 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." +"Internet asks for your DNS name he will get your current IP answered." msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns.html:50 @@ -592,10 +637,10 @@ msgid "" msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns.html:61 +#, python-format msgid "" -"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." +"If your %(box_name)s is connected behind some NAT router, don't forget to " +"add port forwarding (i.e. forward some standard ports like 80 and 443)." msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns_configure.html:30 @@ -615,16 +660,16 @@ msgid "" msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:35 -msgid "Direct connection to the internet." +msgid "Direct connection to the Internet." msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:37 #, python-format msgid "" -"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)s minutes until we " -"update your DNS entry in case of WAN IP change." +"Behind NAT. This means that Dynamic DNS service will poll the \"IP check URL" +"\" for changes (the \"IP check URL\" entry is needed for this - otherwise IP " +"changes will not be detected). In case the WAN IP changes, it may take up " +"to %(timer)s minutes until your DNS entry is updated." msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:48 @@ -640,13 +685,13 @@ msgstr "" #: plinth/modules/firewall/templates/firewall.html:28 #, python-format msgid "" -"Firewall is a network security system that controls the incoming and " -"outgoing network traffic on your %(box_name)s. Keeping a firewall enabled " -"and properly configured reduces risk of security threat from the Internet." +"Firewall is a security system that controls the incoming and outgoing " +"network traffic on your %(box_name)s. Keeping a firewall enabled and " +"properly configured reduces risk of security threat from the Internet." msgstr "" #: plinth/modules/firewall/templates/firewall.html:36 -msgid "The following is the current status:" +msgid "Current status:" msgstr "" #: plinth/modules/firewall/templates/firewall.html:41 @@ -663,11 +708,13 @@ msgid "Service/Port" msgstr "" #: plinth/modules/firewall/templates/firewall.html:67 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:91 #: plinth/modules/names/templates/names.html:51 msgid "Enabled" msgstr "" #: plinth/modules/firewall/templates/firewall.html:70 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:93 #: plinth/modules/names/templates/names.html:53 msgid "Disabled" msgstr "" @@ -691,8 +738,8 @@ msgstr "" #: plinth/modules/firewall/templates/firewall.html:103 msgid "" "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." +"also permitted in the firewall and when you disable a service it is also " +"disabled in the firewall." msgstr "" #: plinth/modules/first_boot/forms.py:48 plinth/modules/users/forms.py:70 @@ -707,31 +754,35 @@ msgstr "" msgid "User account created, you are now logged in" msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state0.html:50 -msgid "Congratulations! Your FreedomBox is up and running!" +#: plinth/modules/first_boot/templates/firstboot_navbar.html:23 +#: plinth/modules/help/templates/help_index.html:25 +#: plinth/templates/base.html:102 +msgid "Help" msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state0.html:54 -msgid "" -"Please provide the following basic information to complete the setup process." +#: plinth/modules/first_boot/templates/firstboot_state0.html:45 +msgid "Start Setup" msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state0.html:62 -msgid "Next" +#: plinth/modules/first_boot/templates/firstboot_state0.html:49 +#, python-format +msgid "" +"To complete the setup of your %(box_name)s, please provide some basic " +"information." msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state1.html:39 +#: plinth/modules/first_boot/templates/firstboot_state1.html:41 msgid "Administrator Account" msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state1.html:42 +#: plinth/modules/first_boot/templates/firstboot_state1.html:44 msgid "" "Choose a username and password to access this web interface. The password " "can be changed later. This user will be granted administrative privileges. " "Other users can be added later." msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state1.html:55 +#: plinth/modules/first_boot/templates/firstboot_state1.html:57 msgid "Box it up!" msgstr "" @@ -740,30 +791,33 @@ msgid "Setup Complete!" msgstr "" #: plinth/modules/first_boot/templates/firstboot_state10.html:32 +#, python-format msgid "" -"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." +"%(box_name)s setup is now complete. To make your %(box_name)s functional, " +"you need some applications. They will be installed the first time you " +"access them." msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state10.html:40 -msgid "" -"To make your FreedomBox functional, you need some applications. " -"Applications will be installed the first time you access them." +#: plinth/modules/first_boot/templates/firstboot_state10.html:41 +msgid "Go to Apps" msgstr "" +#: plinth/modules/first_boot/templates/firstboot_state10.html:44 +#, fuzzy +#| msgid "General Configuration" +msgid "Current Network Configuration" +msgstr "Configuração Geral" + #: plinth/modules/first_boot/templates/firstboot_state10.html:47 -msgid "Network Configuration" +msgid "" +"You should check the network setup and modify it if necessary. Do not forget " +"to change the default Wi-Fi passwords!" msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state10.html:54 +#: plinth/modules/first_boot/templates/firstboot_state10.html:57 msgid "Go to Networks" msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state10.html:59 -msgid "Go to Apps" -msgstr "" - #: plinth/modules/first_boot/views.py:60 msgid "Setup Complete" msgstr "" @@ -776,8 +830,8 @@ msgstr "" msgid "Where to Get Help" msgstr "" -#: plinth/modules/help/help.py:38 plinth/modules/help/help.py:72 -msgid "FreedomBox Manual" +#: plinth/modules/help/help.py:38 +msgid "Manual" msgstr "" #: plinth/modules/help/help.py:48 @@ -789,15 +843,21 @@ msgstr "" msgid "About {box_name}" msgstr "" +#: plinth/modules/help/help.py:73 +#, python-brace-format +msgid "{box_name} Manual" +msgstr "" + #: plinth/modules/help/templates/help_about.html:30 +#, python-format msgid "" -"FreedomBox is a community project to develop, design and promote personal " +"%(box_name)s 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." +"and a Tor relay, on a device that can replace your Wi-Fi router, so that " +"your data stays with you." msgstr "" #: plinth/modules/help/templates/help_about.html:43 @@ -811,69 +871,79 @@ msgid "" msgstr "" #: plinth/modules/help/templates/help_about.html:56 +#, python-format msgid "" "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." +"services; %(box_name)s aims to bring them all together in a convenient " +"package." msgstr "" #: plinth/modules/help/templates/help_about.html:64 +#, python-format msgid "" -"For more information about the FreedomBox project, see the FreedomBox Wiki." +"For more information about the %(box_name)s project, see the %(box_name)s Wiki." msgstr "" -#: plinth/modules/help/templates/help_about.html:72 +#: plinth/modules/help/templates/help_about.html:73 msgid "Learn more »" msgstr "" -#: plinth/modules/help/templates/help_about.html:75 +#: plinth/modules/help/templates/help_about.html:76 #, python-format msgid "You are running Plinth version %(version)s." msgstr "" -#: plinth/modules/help/templates/help_index.html:25 -#: plinth/templates/base.html:98 -msgid "Help" +#: plinth/modules/help/templates/help_base.html:36 +#, python-format +msgid "%(box_name)s Setup" msgstr "" #: plinth/modules/help/templates/help_index.html:29 #, python-format msgid "" -"The FreedomBox Manual is the best place to " +"The %(box_name)s Manual is the best place to " "start for information regarding %(box_name)s." msgstr "" #: plinth/modules/help/templates/help_index.html:36 +#, python-format msgid "" -" FreedomBox " -"project wiki contains further information." +" " +"%(box_name)s project wiki contains further information." msgstr "" #: plinth/modules/help/templates/help_index.html:43 +#, python-format msgid "" -"To seek help from FreedomBox community, queries may be posted on the " -"mailing list. The list archives also contain information about problems " -"faced by other users and possible solutions." +"To seek help from %(box_name)s community, queries may be posted on the mailing list. The list archives also contain information about " +"problems faced by other users and possible solutions." msgstr "" #: plinth/modules/help/templates/help_index.html:53 +#, python-format msgid "" -"Many FreedomBox contributors and users are also available on the #freedombox " -"channel of the irc.oftc.net IRC network." +"Many %(box_name)s contributors and users are also available on the irc.oftc." +"net IRC network. Join and request help on the #freedombox " +"channel using the IRC web interface." msgstr "" #: plinth/modules/ikiwiki/__init__.py:38 -msgid "Wiki & Blog (Ikiwiki)" +msgid "Wiki and Blog (ikiwiki)" msgstr "" #: plinth/modules/ikiwiki/__init__.py:43 -msgid "Ikiwiki wikis and blogs" +msgid "ikiwiki wikis and blogs" msgstr "" #: plinth/modules/ikiwiki/forms.py:29 -msgid "Enable Ikiwiki" -msgstr "" +#, fuzzy +#| msgid "Enable network time" +msgid "Enable ikiwiki" +msgstr "Ativar tempo da rede" #: plinth/modules/ikiwiki/forms.py:36 #: plinth/modules/networks/templates/connection_show.html:98 @@ -901,21 +971,22 @@ msgstr "" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:27 #, python-format -msgid "Delete Wiki/Blog %(name)s" +msgid "Delete Wiki or Blog %(name)s" msgstr "" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:33 msgid "" "This action will remove all the posts, pages and comments including revision " -"history. Delete this wiki/blog permanently?" +"history. Delete this wiki or blog permanently?" msgstr "" -#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:43 +#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:44 #, python-format msgid "Delete %(name)s" msgstr "" -#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:46 +#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:47 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:60 #: plinth/modules/networks/templates/connections_delete.html:41 #: plinth/modules/users/templates/users_delete.html:41 msgid "Cancel" @@ -948,7 +1019,7 @@ msgid "Create" msgstr "" #: plinth/modules/ikiwiki/views.py:73 -msgid "Wiki & Blog" +msgid "Wiki and Blog" msgstr "" #: plinth/modules/ikiwiki/views.py:106 @@ -956,7 +1027,7 @@ msgid "Manage Wikis and Blogs" msgstr "" #: plinth/modules/ikiwiki/views.py:132 -msgid "Create Wiki/Blog" +msgid "Create Wiki or Blog" msgstr "" #: plinth/modules/ikiwiki/views.py:145 @@ -990,7 +1061,148 @@ msgid "Could not delete {name}: {error}" msgstr "" #: plinth/modules/ikiwiki/views.py:182 -msgid "Delete Wiki/Blog" +msgid "Delete Wiki or Blog" +msgstr "" + +#: plinth/modules/letsencrypt/__init__.py:43 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:38 +#: plinth/modules/letsencrypt/views.py:45 +msgid "Certificates (Let's Encrypt)" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:41 +#, python-format +msgid "" +"A digital certficate allows users of a web service to verify the identity of " +"the service and to securely communicate with it. %(box_name)s can " +"automatically obtain and setup digital certificates for each available " +"domain. It does so by proving itself to be the owner of a domain to Let's " +"Encrypt, a certficate authority (CA)." +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:52 +msgid "" +"Let's Encrypt is a free, automated, and open certificate authority, run for " +"the public’s benefit by the Internet Security Research Group (ISRG). Please " +"read and agree with the Let's Encrypt Subscriber Agreement before using this service." +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:66 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:70 +#, fuzzy +#| msgid "Domain Name" +msgid "Domain" +msgstr "Nome de Domínio" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:67 +msgid "Certificate Status" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:68 +msgid "Website Security" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:69 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:72 +#, fuzzy +#| msgid "Applications" +msgid "Actions" +msgstr "Aplicações" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:79 +#, python-format +msgid "Expires on %(expiry_date)s" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:85 +msgid "No certficate" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:102 +msgid "Revoke" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:108 +msgid "Re-obtain" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:115 +msgid "Obtain" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:55 +#, python-brace-format +msgid "Certificate successfully revoked for domain {domain}" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:60 +#, python-brace-format +msgid "Failed to revoke certificate for domain {domain}: {error}" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:72 +#, python-brace-format +msgid "Certificate successfully obtained for domain {domain}" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:77 +#, python-brace-format +msgid "Failed to obtain certificate for domain {domain}: {error}" +msgstr "" + +#: plinth/modules/monkeysphere/__init__.py:32 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:35 +#: plinth/modules/monkeysphere/views.py:44 +msgid "Monkeysphere" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:38 +msgid "" +"With Monkeysphere, a PGP key can be generated for each configured domain " +"serving SSH. The PGP public key can then be uploaded to the PGP keyservers. " +"Users connecting to this machine through SSH can verify that they are " +"connecting to the correct host. For users to trust the key, at least one " +"person (usually the machine owner) must sign the key using the regular PGP " +"key signing process. See the Monkeysphere SSH documentation for more details." +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:53 +msgid "Publishing key to keyserver..." +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:71 +msgid "GPG Fingerprint" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:83 +#: plinth/modules/names/views.py:45 +msgid "Not Available" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:93 +msgid "Generate PGP Key" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:101 +msgid "Publish Key" +msgstr "" + +#: plinth/modules/monkeysphere/views.py:58 +msgid "Generated PGP key." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:83 +msgid "Cancelled key publishing." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:120 +msgid "Published key to keyserver." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:122 +msgid "Error occurred while publishing key." msgstr "" #: plinth/modules/mumble/__init__.py:38 @@ -1028,170 +1240,151 @@ msgstr "" msgid "Mumble server is not running" msgstr "" -#: plinth/modules/names/__init__.py:30 +#: plinth/modules/names/__init__.py:29 msgid "HTTP" msgstr "" -#: plinth/modules/names/__init__.py:31 +#: plinth/modules/names/__init__.py:30 msgid "HTTPS" msgstr "" -#: plinth/modules/names/__init__.py:32 +#: plinth/modules/names/__init__.py:31 msgid "SSH" msgstr "" -#: plinth/modules/names/__init__.py:46 plinth/modules/names/views.py:34 +#: plinth/modules/names/__init__.py:45 plinth/modules/names/views.py:34 msgid "Name Services" msgstr "" -#: plinth/modules/names/__init__.py:107 -msgid "Not Available" -msgstr "" - #: plinth/modules/networks/__init__.py:108 #, python-brace-format msgid "Using DNSSEC on IPv{kind}" msgstr "" #: plinth/modules/networks/forms.py:30 -msgid "-- select --" -msgstr "" - -#: plinth/modules/networks/forms.py:42 msgid "Connection Type" msgstr "" -#: plinth/modules/networks/forms.py:49 plinth/modules/networks/forms.py:106 -#: plinth/modules/networks/forms.py:133 +#: plinth/modules/networks/forms.py:37 msgid "Connection Name" msgstr "" -#: plinth/modules/networks/forms.py:51 plinth/modules/networks/forms.py:108 -#: plinth/modules/networks/forms.py:135 +#: plinth/modules/networks/forms.py:39 msgid "Physical Interface" msgstr "" -#: plinth/modules/networks/forms.py:53 plinth/modules/networks/forms.py:110 -#: plinth/modules/networks/forms.py:137 +#: plinth/modules/networks/forms.py:41 msgid "The network device that this connection should be bound to." msgstr "" -#: plinth/modules/networks/forms.py:56 plinth/modules/networks/forms.py:113 -#: plinth/modules/networks/forms.py:140 +#: plinth/modules/networks/forms.py:44 msgid "Firewall Zone" msgstr "" -#: plinth/modules/networks/forms.py:57 plinth/modules/networks/forms.py:114 -#: plinth/modules/networks/forms.py:141 +#: plinth/modules/networks/forms.py:45 msgid "" "The firewall zone will control which services are available over this " "interfaces. Select Internal only for trusted networks." msgstr "" -#: plinth/modules/networks/forms.py:61 plinth/modules/networks/forms.py:162 +#: plinth/modules/networks/forms.py:49 msgid "IPv4 Addressing Method" msgstr "" -#: plinth/modules/networks/forms.py:62 +#: plinth/modules/networks/forms.py:50 msgid "" "\"Shared\" method will start a DHCP server and \"Automatic\" method will " "acquire configuration from a DHCP server." msgstr "" -#: plinth/modules/networks/forms.py:68 plinth/modules/networks/forms.py:170 +#: plinth/modules/networks/forms.py:56 msgid "Address" msgstr "" -#: plinth/modules/networks/forms.py:72 plinth/modules/networks/forms.py:174 +#: plinth/modules/networks/forms.py:60 msgid "Netmask" msgstr "" -#: plinth/modules/networks/forms.py:73 plinth/modules/networks/forms.py:175 +#: plinth/modules/networks/forms.py:61 msgid "" "Optional value. If left blank, a default netmask based on the address will " "be used." msgstr "" -#: plinth/modules/networks/forms.py:78 plinth/modules/networks/forms.py:180 +#: plinth/modules/networks/forms.py:66 #: plinth/modules/networks/templates/connection_show.html:202 #: plinth/modules/networks/templates/connection_show.html:241 msgid "Gateway" msgstr "" -#: plinth/modules/networks/forms.py:79 plinth/modules/networks/forms.py:181 +#: plinth/modules/networks/forms.py:67 msgid "Optional value." msgstr "" -#: plinth/modules/networks/forms.py:83 plinth/modules/networks/forms.py:185 +#: plinth/modules/networks/forms.py:71 msgid "DNS Server" msgstr "" -#: plinth/modules/networks/forms.py:84 plinth/modules/networks/forms.py:186 +#: plinth/modules/networks/forms.py:72 msgid "" "Optional value. If this value is given and IPv4 addressing method is " "\"Automatic\", the DNS Servers provided by a DHCP server will be ignored." msgstr "" -#: plinth/modules/networks/forms.py:90 plinth/modules/networks/forms.py:192 +#: plinth/modules/networks/forms.py:78 msgid "Second DNS Server" msgstr "" -#: plinth/modules/networks/forms.py:91 plinth/modules/networks/forms.py:193 +#: plinth/modules/networks/forms.py:79 msgid "" "Optional value. If this value is given and IPv4 Addressing Method is " "\"Automatic\", the DNS Servers provided by a DHCP server will be ignored." msgstr "" -#: plinth/modules/networks/forms.py:121 -msgid "Show password" +#: plinth/modules/networks/forms.py:89 +msgid "-- select --" msgstr "" -#: plinth/modules/networks/forms.py:145 +#: plinth/modules/networks/forms.py:175 #: plinth/modules/networks/templates/connection_show.html:144 msgid "SSID" msgstr "" -#: plinth/modules/networks/forms.py:146 +#: plinth/modules/networks/forms.py:176 msgid "The visible name of the network." msgstr "" -#: plinth/modules/networks/forms.py:148 +#: plinth/modules/networks/forms.py:178 #: plinth/modules/networks/templates/connection_show.html:157 msgid "Mode" msgstr "" -#: plinth/modules/networks/forms.py:153 +#: plinth/modules/networks/forms.py:183 msgid "Authentication Mode" msgstr "" -#: plinth/modules/networks/forms.py:154 +#: plinth/modules/networks/forms.py:184 msgid "" "Select WPA if the wireless network is secured and requires clients to have " "the password to connect." msgstr "" -#: plinth/modules/networks/forms.py:158 +#: plinth/modules/networks/forms.py:188 msgid "Passphrase" msgstr "" -#: plinth/modules/networks/forms.py:166 -msgid "" -"Select Automatic (DHCP) if you are connecting to an existing wireless " -"network. Shared mode is useful when running an Access Point." -msgstr "" - #: plinth/modules/networks/networks.py:36 #: plinth/modules/networks/networks.py:56 msgid "Network Connections" msgstr "" #: plinth/modules/networks/networks.py:38 -#: plinth/modules/networks/networks.py:273 +#: plinth/modules/networks/networks.py:242 msgid "Nearby Wi-Fi Networks" msgstr "" #: plinth/modules/networks/networks.py:40 -#: plinth/modules/networks/networks.py:295 +#: plinth/modules/networks/networks.py:264 msgid "Add Connection" msgstr "" @@ -1215,58 +1408,58 @@ msgstr "" msgid "This type of connection is not yet understood." msgstr "" -#: plinth/modules/networks/networks.py:170 -#: plinth/modules/networks/networks.py:229 +#: plinth/modules/networks/networks.py:139 +#: plinth/modules/networks/networks.py:198 #: plinth/modules/networks/templates/connections_edit.html:34 msgid "Edit Connection" msgstr "" -#: plinth/modules/networks/networks.py:240 +#: plinth/modules/networks/networks.py:209 #, python-brace-format msgid "Activated connection {name}." msgstr "" -#: plinth/modules/networks/networks.py:243 +#: plinth/modules/networks/networks.py:212 msgid "Failed to activate connection: Connection not found." msgstr "" -#: plinth/modules/networks/networks.py:247 +#: plinth/modules/networks/networks.py:216 #, python-brace-format msgid "Failed to activate connection {name}: No suitable device is available." msgstr "" -#: plinth/modules/networks/networks.py:260 +#: plinth/modules/networks/networks.py:229 #, python-brace-format msgid "Deactivated connection {name}." msgstr "" -#: plinth/modules/networks/networks.py:263 +#: plinth/modules/networks/networks.py:232 msgid "Failed to de-activate connection: Connection not found." msgstr "" -#: plinth/modules/networks/networks.py:325 +#: plinth/modules/networks/networks.py:282 msgid "Adding New Ethernet Connection" msgstr "" -#: plinth/modules/networks/networks.py:350 +#: plinth/modules/networks/networks.py:300 msgid "Adding New PPPoE Connection" msgstr "" -#: plinth/modules/networks/networks.py:399 +#: plinth/modules/networks/networks.py:332 msgid "Adding New Wi-Fi Connection" msgstr "" -#: plinth/modules/networks/networks.py:413 +#: plinth/modules/networks/networks.py:346 #, python-brace-format msgid "Connection {name} deleted." msgstr "" -#: plinth/modules/networks/networks.py:416 -#: plinth/modules/networks/networks.py:425 +#: plinth/modules/networks/networks.py:349 +#: plinth/modules/networks/networks.py:358 msgid "Failed to delete connection: Connection not found." msgstr "" -#: plinth/modules/networks/networks.py:430 +#: plinth/modules/networks/networks.py:363 #: plinth/modules/networks/templates/connections_delete.html:26 msgid "Delete Connection" msgstr "" @@ -1276,7 +1469,7 @@ msgid "Edit connection" msgstr "" #: plinth/modules/networks/templates/connection_show.html:43 -#: plinth/templates/base.html:119 +#: plinth/templates/base.html:123 msgid "Edit" msgstr "" @@ -1423,23 +1616,24 @@ msgstr "" #: plinth/modules/networks/templates/connection_show.html:280 msgid "" -"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." +"This interface should be connected to a 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." msgstr "" #: plinth/modules/networks/templates/connection_show.html:300 msgid "" -"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." +"This interface should receive your Internet connection. If you connect it to " +"a local network/machine, many services meant to available only internally " +"will not be available." msgstr "" #: plinth/modules/networks/templates/connection_show.html:319 +#, python-format msgid "" -"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 " +"This interface is not maintained by %(box_name)s. Its security status is " +"unknown to %(box_name)s. Many %(box_name)s services may not be available on " +"this interface. It is recommended that you deactivate or delete this " "connection and re-configure it." msgstr "" @@ -1531,7 +1725,7 @@ msgstr "" #, python-format msgid "" "Virtual Private Network (VPN) is a technique for securely connecting two " -"machines in order to access resources of a private network. While you are " +"devices in order to access resources of a private network. While you are " "away from home, you can connect to your %(box_name)s in order to join your " "home network and access private/internal services provided by %(box_name)s. " "You can also access the rest of the Internet via %(box_name)s for added " @@ -1548,7 +1742,7 @@ msgid "" "To connect to %(box_name)s'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 documentation on recommended clients and instructions on how to " "configure them." msgstr "" @@ -2026,6 +2220,60 @@ msgstr "" msgid "Quassel core service is not running" msgstr "" +#: plinth/modules/repro/__init__.py:36 +#: plinth/modules/repro/templates/repro.html:26 +#: plinth/modules/repro/views.py:55 +msgid "SIP Server (repro)" +msgstr "" + +#: plinth/modules/repro/__init__.py:41 +msgid "repro SIP Server" +msgstr "" + +#: plinth/modules/repro/forms.py:29 +#, fuzzy +#| msgid "Enable service discovery" +msgid "Enable repro service" +msgstr "Permitir descoberta do serviço" + +#: plinth/modules/repro/templates/repro.html:29 +msgid "" +"repro provides various SIP services that a SIP softphone can utilize to " +"provide audio and video calls as well as presence and instant messaging. " +"repro provides a server and SIP user accounts that clients can use to let " +"their presence known. It also acts as a proxy to federate SIP " +"communications to other servers on the Internet similar to email." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:39 +msgid "" +"To make SIP calls, a client application is needed. Available clients include " +"Jitsi (for computers) and CSipSimple (for Android phones)." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:48 +msgid "" +"Note: Before using repro, domains and users will need to " +"be configured using the web-based " +"configuration panel. Users in the admin group will be able to " +"log in to the repro configuration panel. After setting the domain, it is " +"required to restart the repro service. Disable the service and re-enable it." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:63 +#, fuzzy +#| msgid "Service discovery server is running" +msgid "repro service is running" +msgstr "O Servidor da descoberta do serviço está a correr" + +#: plinth/modules/repro/templates/repro.html:66 +#, fuzzy +#| msgid "Service discovery server is not running" +msgid "repro service is not running" +msgstr "O Servidor da descoberta do serviço não está a correr" + #: plinth/modules/restore/__init__.py:36 #: plinth/modules/restore/templates/restore_index.html:26 #: plinth/modules/restore/views.py:46 @@ -2046,8 +2294,8 @@ msgid "" "reStore is a server for unhosted web " "applications. The idea is to uncouple web applications from data. No " "matter where a web application is served from, the data can be stored on an " -"unhosted storage server of user's choice. With reStore, your " -"%(cfg.box_name)s becomes your unhosted storage server." +"unhosted storage server of user's choice. With reStore, your %(box_name)s " +"becomes your unhosted storage server." msgstr "" #: plinth/modules/restore/templates/restore_index.html:40 @@ -2124,7 +2372,7 @@ msgstr "" #: plinth/modules/system/system.py:33 #: plinth/modules/system/templates/system.html:25 -#: plinth/templates/base.html:105 +#: plinth/templates/base.html:109 msgid "System Configuration" msgstr "" @@ -2139,33 +2387,71 @@ msgid "" "The options affect the %(box_name)s at its most general level, so be careful!" msgstr "" -#: plinth/modules/tor/__init__.py:50 -msgid "Tor relay port available" +#: plinth/modules/tor/__init__.py:48 plinth/modules/tor/templates/tor.html:35 +msgid "Anonymity Network (Tor)" +msgstr "" + +#: plinth/modules/tor/__init__.py:53 +msgid "Tor Anonymity Network" msgstr "" #: plinth/modules/tor/__init__.py:58 +msgid "Tor Bridge Relay" +msgstr "" + +#: plinth/modules/tor/__init__.py:76 plinth/modules/tor/views.py:144 +msgid "Tor Hidden Service" +msgstr "" + +#: plinth/modules/tor/__init__.py:222 +msgid "Tor relay port available" +msgstr "" + +#: plinth/modules/tor/__init__.py:230 msgid "Obfs3 transport registered" msgstr "" -#: plinth/modules/tor/__init__.py:64 +#: plinth/modules/tor/__init__.py:236 msgid "Obfs4 transport registered" msgstr "" -#: plinth/modules/tor/__init__.py:101 +#: plinth/modules/tor/__init__.py:273 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "" -#: plinth/modules/tor/__init__.py:112 +#: plinth/modules/tor/__init__.py:284 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "" -#: plinth/modules/tor/templates/tor.html:26 plinth/modules/tor/tor.py:66 -msgid "Anonymity Network (Tor)" +#: plinth/modules/tor/forms.py:32 +msgid "Enable Tor" +msgstr "" + +#: plinth/modules/tor/forms.py:35 +msgid "Enable Tor Hidden Service" +msgstr "" + +#: plinth/modules/tor/forms.py:38 +#, python-brace-format +msgid "" +"A hidden service will allow {box_name} to provide selected services (such as " +"ownCloud or chat) without revealing its location." +msgstr "" + +#: plinth/modules/tor/forms.py:42 +msgid "Download software packages over Tor" +msgstr "" + +#: plinth/modules/tor/forms.py:44 +msgid "" +"When enabled, software will be downloaded over the Tor network for " +"installations and upgrades. This adds a degree of privacy and security " +"during software downloads." msgstr "" -#: plinth/modules/tor/templates/tor.html:29 +#: plinth/modules/tor/templates/tor.html:38 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -2174,28 +2460,34 @@ msgid "" "Tor Browser." msgstr "" -#: plinth/modules/tor/templates/tor.html:44 +#: plinth/modules/tor/templates/tor.html:54 +#, fuzzy +#| msgid "Configuration updated" +msgid "Tor configuration is being updated" +msgstr "Configuração atualizada" + +#: plinth/modules/tor/templates/tor.html:62 msgid "Tor is running" msgstr "" -#: plinth/modules/tor/templates/tor.html:47 +#: plinth/modules/tor/templates/tor.html:65 msgid "Tor is not running" msgstr "" -#: plinth/modules/tor/templates/tor.html:59 +#: plinth/modules/tor/templates/tor.html:77 msgid "Hidden Service" msgstr "" -#: plinth/modules/tor/templates/tor.html:60 -#: plinth/modules/tor/templates/tor.html:102 +#: plinth/modules/tor/templates/tor.html:78 +#: plinth/modules/tor/templates/tor.html:120 msgid "Port" msgstr "" -#: plinth/modules/tor/templates/tor.html:85 +#: plinth/modules/tor/templates/tor.html:103 msgid "Bridge" msgstr "" -#: plinth/modules/tor/templates/tor.html:88 +#: plinth/modules/tor/templates/tor.html:106 #, python-format msgid "" "Your %(box_name)s is configured as a Tor bridge with obfsproxy, so it can " @@ -2204,84 +2496,41 @@ msgid "" "forwarded, if necessary:" msgstr "" -#: plinth/modules/tor/templates/tor.html:101 +#: plinth/modules/tor/templates/tor.html:119 msgid "Service" msgstr "" -#: plinth/modules/tor/templates/tor.html:117 +#: plinth/modules/tor/templates/tor.html:135 msgid "SOCKS" msgstr "" -#: plinth/modules/tor/templates/tor.html:120 +#: plinth/modules/tor/templates/tor.html:138 #, python-format msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "" -#: plinth/modules/tor/tor.py:46 -msgid "Enable Tor" -msgstr "" - -#: plinth/modules/tor/tor.py:49 -msgid "Enable Tor Hidden Service" -msgstr "" - -#: plinth/modules/tor/tor.py:51 -msgid "" -"A hidden service will allow FreedomBox to provide selected services (such as " -"ownCloud or Chat) without revealing its location." -msgstr "" - -#: plinth/modules/tor/tor.py:55 -msgid "Download software packages over Tor" -msgstr "" - -#: plinth/modules/tor/tor.py:57 -msgid "" -"When enabled, software will be downloaded over the Tor network for " -"installations and upgrades. This adds a degree of privacy and security " -"during software downloads." -msgstr "" - -#: plinth/modules/tor/tor.py:85 plinth/modules/tor/tor.py:285 -msgid "Tor Hidden Service" -msgstr "" - -#: plinth/modules/tor/tor.py:115 +#: plinth/modules/tor/views.py:68 msgid "Tor Control Panel" msgstr "" -#: plinth/modules/tor/tor.py:240 +#: plinth/modules/tor/views.py:79 #, python-brace-format msgid "Action error: {0} [{1}] [{2}]" msgstr "" -#: plinth/modules/tor/tor.py:256 -msgid "Tor enabled" -msgstr "" - -#: plinth/modules/tor/tor.py:259 -msgid "Tor disabled" -msgstr "" - -#: plinth/modules/tor/tor.py:264 -msgid "Tor hidden service enabled" -msgstr "" - -#: plinth/modules/tor/tor.py:267 -msgid "Tor hidden service disabled" -msgstr "" - -#: plinth/modules/tor/tor.py:292 -msgid "Enabled package download over Tor" -msgstr "" +#: plinth/modules/tor/views.py:148 +#, fuzzy +#| msgid "Configuration updated" +msgid "Configuration updated." +msgstr "Configuração atualizada" -#: plinth/modules/tor/tor.py:295 -msgid "Disabled package download over Tor" +#: plinth/modules/tor/views.py:150 +msgid "An error occurred during configuration." msgstr "" #: plinth/modules/transmission/__init__.py:38 #: plinth/modules/transmission/templates/transmission.html:26 -#: plinth/modules/transmission/views.py:63 +#: plinth/modules/transmission/views.py:67 msgid "BitTorrent (Transmission)" msgstr "" @@ -2347,70 +2596,66 @@ msgid "" "will attempt to perform any package upgrades that are available." msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:40 -msgid "There was an error while upgrading." +#: plinth/modules/upgrades/templates/upgrades.html:37 +msgid "" +"Upgrades install the latest software and security updates. When automatic " +"upgrades are enabled, upgrades are automatically run every night. You don't " +"normally need to start the upgrade process." msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:43 -#: plinth/modules/upgrades/templates/upgrades.html:59 -msgid "Output from unattended-upgrades:" +#: plinth/modules/upgrades/templates/upgrades.html:45 +msgid "" +"Depending on the number of packages to install, this may take a long time to " +"complete. While upgrades are in progress, you will not be able to install " +"other packages. During the upgrade, this web interface may be temporarily " +"unavailable and show an error. Refresh the page to continue." msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:50 -msgid "The operating system is up to date now.  " +#: plinth/modules/upgrades/templates/upgrades.html:58 +msgid "Upgrade now »" msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:53 -msgid "Show Details" +#: plinth/modules/upgrades/templates/upgrades.html:65 +msgid "A package manager is running." msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:69 -msgid "" -"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." +#: plinth/modules/upgrades/templates/upgrades.html:70 +msgid "Recent log from upgrades:" msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:80 -msgid "Upgrade now »" +#: plinth/modules/upgrades/views.py:36 plinth/modules/upgrades/views.py:66 +msgid "Automatic Upgrades" msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:87 -msgid "System is being upgraded." +#: plinth/modules/upgrades/views.py:38 +msgid "Upgrade Packages" msgstr "" -#: plinth/modules/upgrades/views.py:35 plinth/modules/upgrades/views.py:64 -msgid "Automatic Upgrades" +#: plinth/modules/upgrades/views.py:96 +msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:37 -msgid "Upgrade Packages" +#: plinth/modules/upgrades/views.py:99 +msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:75 +#: plinth/modules/upgrades/views.py:102 msgid "Package Upgrades" msgstr "" -#: plinth/modules/upgrades/views.py:116 +#: plinth/modules/upgrades/views.py:131 #, python-brace-format msgid "Error when configuring unattended-upgrades: {error}" msgstr "" -#: plinth/modules/upgrades/views.py:121 +#: plinth/modules/upgrades/views.py:136 msgid "Automatic upgrades enabled" msgstr "" -#: plinth/modules/upgrades/views.py:123 +#: plinth/modules/upgrades/views.py:138 msgid "Automatic upgrades disabled" msgstr "" -#: plinth/modules/upgrades/views.py:142 -msgid "Upgrade completed." -msgstr "" - -#: plinth/modules/upgrades/views.py:144 -msgid "Upgrade failed." -msgstr "" - #: plinth/modules/users/__init__.py:36 msgid "Users and Groups" msgstr "" @@ -2446,19 +2691,30 @@ msgstr "" msgid "Failed to add new user to {group} group." msgstr "" -#: plinth/modules/users/forms.py:126 +#: plinth/modules/users/forms.py:92 +msgid "SSH Keys" +msgstr "" + +#: plinth/modules/users/forms.py:96 +msgid "" +"Setting an SSH public key will allow this user to securely log in to the " +"system without using a password. You may enter multiple keys, one on each " +"line. Blank lines and lines starting with # will be ignored." +msgstr "" + +#: plinth/modules/users/forms.py:136 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:138 +#: plinth/modules/users/forms.py:148 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:149 +#: plinth/modules/users/forms.py:159 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:174 +#: plinth/modules/users/forms.py:188 msgid "Changing LDAP user password failed." msgstr "" @@ -2477,7 +2733,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:26 -#: plinth/modules/users/views.py:103 +#: plinth/modules/users/views.py:110 msgid "Delete User" msgstr "" @@ -2530,20 +2786,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:113 +#: plinth/modules/users/views.py:120 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:120 +#: plinth/modules/users/views.py:127 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:129 +#: plinth/modules/users/views.py:136 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:130 +#: plinth/modules/users/views.py:137 msgid "Password changed successfully." msgstr "" @@ -2618,8 +2874,9 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "" -#: plinth/service.py:78 -msgid "FreedomBox Web Interface (Plinth)" +#: plinth/service.py:79 +#, python-brace-format +msgid "{box_name} Web Interface (Plinth)" msgstr "" #: plinth/templates/404.html:25 @@ -2650,27 +2907,24 @@ msgid "" msgstr "" #: plinth/templates/base.html:49 -msgid "Plinth administrative interface for the FreedomBox" -msgstr "" - -#: plinth/templates/base.html:52 plinth/templates/base.html.py:88 -msgid "FreedomBox" +#, python-format +msgid "Plinth administrative interface for the %(box_name)s" msgstr "" -#: plinth/templates/base.html:81 +#: plinth/templates/base.html:83 msgid "Toggle navigation" msgstr "" -#: plinth/templates/base.html:121 plinth/templates/base.html.py:122 +#: plinth/templates/base.html:125 plinth/templates/base.html.py:126 msgid "Change password" msgstr "" -#: plinth/templates/base.html:125 plinth/templates/base.html.py:126 -#: plinth/templates/base.html:139 plinth/templates/base.html.py:141 +#: plinth/templates/base.html:129 plinth/templates/base.html.py:130 +#: plinth/templates/base.html:143 plinth/templates/base.html.py:145 msgid "Log out" msgstr "" -#: plinth/templates/base.html:131 plinth/templates/base.html.py:133 +#: plinth/templates/base.html:135 plinth/templates/base.html.py:137 msgid "Log in" msgstr "" diff --git a/plinth/locale/sv/LC_MESSAGES/django.po b/plinth/locale/sv/LC_MESSAGES/django.po index 9f3e7bb6d..c9d9d06c6 100644 --- a/plinth/locale/sv/LC_MESSAGES/django.po +++ b/plinth/locale/sv/LC_MESSAGES/django.po @@ -7,11 +7,11 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-01-15 19:42+0530\n" +"POT-Creation-Date: 2016-01-31 22:19+0530\n" "PO-Revision-Date: 2016-01-21 15:15+0000\n" "Last-Translator: Caly \n" -"Language-Team: Swedish " -"\n" +"Language-Team: Swedish \n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -49,11 +49,15 @@ msgstr "Anslut till {host}:{port}" msgid "Cannot connect to {host}:{port}" msgstr "Kan inte ansluta till {host}:{port}" +#: plinth/context_processors.py:36 +msgid "FreedomBox" +msgstr "" + #: plinth/modules/apps/apps.py:26 msgid "Apps" msgstr "Appar" -#: plinth/modules/apps/apps.py:32 plinth/templates/base.html.py:91 +#: plinth/modules/apps/apps.py:32 plinth/templates/base.html.py:93 msgid "Applications" msgstr "Applikationer" @@ -95,10 +99,18 @@ msgid "Enable service discovery" msgstr "Aktivera tjänstidentifiering" #: plinth/modules/avahi/templates/avahi.html:29 -msgid "" -"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 " +#, fuzzy, python-format +#| msgid "" +#| "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." +msgid "" +"Service discovery allows other devices on the network to discover your " +"%(box_name)s and services running on it. It also allows %(box_name)s to " +"discover other devices 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." @@ -113,14 +125,15 @@ msgstr "" #: plinth/modules/avahi/templates/avahi.html:40 #: plinth/modules/datetime/templates/datetime.html:35 #: plinth/modules/deluge/templates/deluge.html:39 -#: plinth/modules/dynamicdns/dynamicdns.py:38 +#: plinth/modules/dynamicdns/dynamicdns.py:39 #: plinth/modules/firewall/templates/firewall.html:57 #: plinth/modules/mumble/templates/mumble.html:44 #: plinth/modules/networks/templates/connection_show.html:261 #: plinth/modules/openvpn/templates/openvpn.html:81 #: plinth/modules/privoxy/templates/privoxy.html:48 #: plinth/modules/quassel/templates/quassel.html:50 -#: plinth/modules/tor/templates/tor.html:39 +#: plinth/modules/repro/templates/repro.html:58 +#: plinth/modules/tor/templates/tor.html:48 #: plinth/modules/transmission/templates/transmission.html:42 #: plinth/modules/xmpp/templates/xmpp.html:58 msgid "Status" @@ -143,9 +156,10 @@ msgstr "Server för tjänsteidentifiering är inaktiverad" #: plinth/modules/owncloud/templates/owncloud.html:51 #: plinth/modules/privoxy/templates/privoxy.html:62 #: plinth/modules/quassel/templates/quassel.html:65 +#: plinth/modules/repro/templates/repro.html:72 #: plinth/modules/roundcube/templates/roundcube.html:62 #: plinth/modules/shaarli/templates/shaarli.html:40 -#: plinth/modules/tor/templates/tor.html:74 +#: plinth/modules/tor/templates/tor.html:92 #: plinth/modules/transmission/templates/transmission.html:56 #: plinth/modules/xmpp/templates/xmpp.html:72 msgid "Configuration" @@ -161,10 +175,11 @@ msgstr "Konfiguration" #: plinth/modules/openvpn/templates/openvpn.html:138 #: plinth/modules/privoxy/templates/privoxy.html:70 #: plinth/modules/quassel/templates/quassel.html:73 +#: plinth/modules/repro/templates/repro.html:80 #: plinth/modules/restore/templates/restore_index.html:54 #: plinth/modules/roundcube/templates/roundcube.html:70 #: plinth/modules/shaarli/templates/shaarli.html:48 -#: plinth/modules/tor/templates/tor.html:82 +#: plinth/modules/tor/templates/tor.html:100 #: plinth/modules/transmission/templates/transmission.html:64 #: plinth/modules/upgrades/templates/upgrades_configure.html:34 #: plinth/modules/xmpp/templates/xmpp.html:80 @@ -173,12 +188,13 @@ msgstr "Uppdatera inställningar" #: plinth/modules/avahi/views.py:73 plinth/modules/datetime/views.py:85 #: plinth/modules/deluge/views.py:80 -#: plinth/modules/dynamicdns/dynamicdns.py:368 +#: plinth/modules/dynamicdns/dynamicdns.py:371 #: plinth/modules/ikiwiki/views.py:95 plinth/modules/mumble/views.py:80 #: plinth/modules/openvpn/views.py:142 plinth/modules/privoxy/views.py:83 -#: plinth/modules/quassel/views.py:76 plinth/modules/restore/views.py:68 -#: plinth/modules/roundcube/views.py:84 plinth/modules/shaarli/views.py:74 -#: plinth/modules/transmission/views.py:109 plinth/modules/xmpp/views.py:100 +#: plinth/modules/quassel/views.py:76 plinth/modules/repro/views.py:77 +#: plinth/modules/restore/views.py:68 plinth/modules/roundcube/views.py:84 +#: plinth/modules/shaarli/views.py:74 plinth/modules/transmission/views.py:109 +#: plinth/modules/xmpp/views.py:100 msgid "Configuration updated" msgstr "Konfiguration uppdaterad" @@ -186,51 +202,66 @@ msgstr "Konfiguration uppdaterad" #: plinth/modules/deluge/views.py:82 plinth/modules/ikiwiki/views.py:97 #: plinth/modules/mumble/views.py:82 plinth/modules/openvpn/views.py:144 #: plinth/modules/owncloud/owncloud.py:93 plinth/modules/privoxy/views.py:85 -#: plinth/modules/quassel/views.py:78 plinth/modules/restore/views.py:70 -#: plinth/modules/roundcube/views.py:86 plinth/modules/shaarli/views.py:76 -#: plinth/modules/tor/tor.py:250 plinth/modules/transmission/views.py:111 -#: plinth/modules/upgrades/views.py:103 plinth/modules/xmpp/views.py:102 +#: plinth/modules/quassel/views.py:78 plinth/modules/repro/views.py:79 +#: plinth/modules/restore/views.py:70 plinth/modules/roundcube/views.py:86 +#: plinth/modules/shaarli/views.py:76 plinth/modules/tor/views.py:111 +#: plinth/modules/transmission/views.py:111 +#: plinth/modules/upgrades/views.py:118 plinth/modules/xmpp/views.py:102 msgid "Setting unchanged" msgstr "Instänllningar oförändrade" -#: plinth/modules/config/config.py:83 plinth/modules/config/config.py:120 -#: plinth/modules/dynamicdns/dynamicdns.py:145 +#: plinth/modules/config/config.py:84 plinth/modules/config/config.py:121 +#: plinth/modules/dynamicdns/dynamicdns.py:148 msgid "Invalid domain name" msgstr "Ogiltigt domännamn" -#: plinth/modules/config/config.py:94 +#: plinth/modules/config/config.py:95 msgid "Hostname" msgstr "Värdnamn" -#: plinth/modules/config/config.py:96 -msgid "" -"Hostname is the local name by which other machines on the local network " -"reach your machine. It must start and end with an alphabet or a digit and " -"have as interior characters only alphabets, digits and hyphens. Total " +#: plinth/modules/config/config.py:97 +#, fuzzy, python-brace-format +#| msgid "" +#| "Hostname is the local name by which other machines on the local network " +#| "reach your machine. It must start and end with an alphabet or a digit " +#| "and have as interior characters only alphabets, digits and hyphens. " +#| "Total length must be 63 characters or less." +msgid "" +"Hostname is the local name by which other devices on the local network can " +"reach your {box_name}. It must start and end with an alphabet or a digit " +"and have as interior characters only alphabets, digits and hyphens. Total " "length must be 63 characters or less." msgstr "" "Värdnamn är namnet på din enhet som andra enheter i det lokala nätverket kan " "nå dig via. Det får endast bestå av bokstäver, siffror och bindestreck, men " "får inte börja eller sluta med bindestreck. Värdnamn får vara max 63 tecken." -#: plinth/modules/config/config.py:104 +#: plinth/modules/config/config.py:105 msgid "Invalid hostname" msgstr "Ogiltigt värdnamn" -#: plinth/modules/config/config.py:107 plinth/modules/config/config.py:153 +#: plinth/modules/config/config.py:108 plinth/modules/config/config.py:153 #: plinth/modules/config/config.py:265 -#: plinth/modules/dynamicdns/dynamicdns.py:140 +#: plinth/modules/dynamicdns/dynamicdns.py:143 msgid "Domain Name" msgstr "Domännamn" -#: plinth/modules/config/config.py:109 -msgid "" -"Domain name is the global name by which other machines on the Internet can " -"reach you. It must consist of labels separated by dots. Each label must " -"start and end with an alphabet or a digit and have as interior characters " -"only alphabets, digits and hyphens. Length of each label must be 63 " -"characters or less. Total length of domain name must be 253 characters or " -"less." +#: plinth/modules/config/config.py:110 +#, fuzzy, python-brace-format +#| msgid "" +#| "Domain name is the global name by which other machines on the Internet " +#| "can reach you. It must consist of labels separated by dots. Each label " +#| "must start and end with an alphabet or a digit and have as interior " +#| "characters only alphabets, digits and hyphens. Length of each label must " +#| "be 63 characters or less. Total length of domain name must be 253 " +#| "characters or less." +msgid "" +"Domain name is the global name by which other devices on the Internet can " +"reach your {box_name}. It must consist of labels separated by dots. Each " +"label must start and end with an alphabet or a digit and have as interior " +"characters only alphabets, digits and hyphens. Length of each label must be " +"63 characters or less. Total length of domain name must be 253 characters " +"or less." msgstr "" "Domännamn är det globala namn som andra maskiner på Internet kan nå dig " "via. Det skall bestå av ord åtskilda av punkter. Varje ord får endast bestå " @@ -238,16 +269,18 @@ msgstr "" "bindestreck. Varje ord får vara max 63 tecken. Total längd på domännamnet " "får max vara 253 tecken." -#: plinth/modules/config/config.py:124 +#: plinth/modules/config/config.py:125 msgid "Language" msgstr "Språkval" -#: plinth/modules/config/config.py:126 -msgid "Language for this FreedomBox web administration interface" +#: plinth/modules/config/config.py:127 +#, fuzzy +#| msgid "Language for this FreedomBox web administration interface" +msgid "Language for this web administration interface" msgstr "Språkval för webbgränssnittet att administrera denna FreedomBox med" #: plinth/modules/config/config.py:135 -#: plinth/modules/dynamicdns/dynamicdns.py:36 +#: plinth/modules/dynamicdns/dynamicdns.py:37 #: plinth/modules/ikiwiki/views.py:36 msgid "Configure" msgstr "Konfigurera" @@ -445,16 +478,16 @@ msgstr "Test" msgid "Result" msgstr "Resultat" -#: plinth/modules/dynamicdns/dynamicdns.py:34 plinth/modules/help/help.py:40 +#: plinth/modules/dynamicdns/dynamicdns.py:35 plinth/modules/help/help.py:40 msgid "About" msgstr "Om" -#: plinth/modules/dynamicdns/dynamicdns.py:44 -#: plinth/modules/dynamicdns/dynamicdns.py:53 +#: plinth/modules/dynamicdns/dynamicdns.py:45 +#: plinth/modules/dynamicdns/dynamicdns.py:54 msgid "Dynamic DNS" msgstr "Dynamisk DNS (DomänNamnsServer)" -#: plinth/modules/dynamicdns/dynamicdns.py:70 +#: plinth/modules/dynamicdns/dynamicdns.py:71 msgid "" "The Variables <User>, <Pass>, <Ip>, <Domain> may be " "used within the URL. For details see the update URL templates of the example " @@ -464,7 +497,7 @@ msgstr "" "användas i webbadressen. Se mallar från de olika tjänsteleverantörerna för " "information om uppdateringsadress." -#: plinth/modules/dynamicdns/dynamicdns.py:74 +#: plinth/modules/dynamicdns/dynamicdns.py:75 msgid "" "Please choose an update protocol according to your provider. If your " "provider does not support the GnudIP protocol or your provider is not listed " @@ -474,26 +507,32 @@ msgstr "" "stöder protokollet GnudIP, eller din leverantör saknas i listan, använd din " "leverantörs uppdateringsadress." -#: plinth/modules/dynamicdns/dynamicdns.py:79 +#: plinth/modules/dynamicdns/dynamicdns.py:80 +#, fuzzy +#| msgid "" +#| "Please do not enter a URL here (like \"https://example.com/\") but only " +#| "the hostname of the GnuDIP server (like \"example.pcom\")." msgid "" "Please do not enter a URL here (like \"https://example.com/\") but only the " -"hostname of the GnuDIP server (like \"example.pcom\")." +"hostname of the GnuDIP server (like \"example.com\")." msgstr "" "Skriv inte en full webadress här (tex: \"https://exempel.com/\"), utan " "endast värdnamnet för GnuDIP servern (tex: \"exempel.com\")." -#: plinth/modules/dynamicdns/dynamicdns.py:83 -msgid "The public domain name you want use to reach your box." +#: plinth/modules/dynamicdns/dynamicdns.py:84 +#, fuzzy, python-brace-format +#| msgid "The public domain name you want use to reach your box." +msgid "The public domain name you want use to reach your {box_name}." msgstr "" "Publikt domännamn du önskar använda för att ansluta till din FreedomBox." -#: plinth/modules/dynamicdns/dynamicdns.py:85 +#: plinth/modules/dynamicdns/dynamicdns.py:87 msgid "Use this option if your provider uses self signed certificates." msgstr "" "Använd denna funktion om din tjänsteleverantör använder självsignerade " "certifikat." -#: plinth/modules/dynamicdns/dynamicdns.py:88 +#: plinth/modules/dynamicdns/dynamicdns.py:90 msgid "" "If this option is selected, your username and password will be used for HTTP " "basic authentication." @@ -501,128 +540,156 @@ msgstr "" "Om detta alternativ är markerat, kommer ditt användarnamn och lösenord " "användas för grundläggande HTTP autentisering." -#: plinth/modules/dynamicdns/dynamicdns.py:91 +#: plinth/modules/dynamicdns/dynamicdns.py:93 msgid "" "Leave this field empty if you want to keep your previous configured password." msgstr "Lämna fältet tomt om du vill behålla tidigare konfigurerat lösenord." -#: plinth/modules/dynamicdns/dynamicdns.py:94 +#: plinth/modules/dynamicdns/dynamicdns.py:96 +#, fuzzy, python-brace-format +#| msgid "" +#| "Optional Value. If your FreedomBox is not connected directly to the " +#| "Internet (i.e. connected to a NAT router) this URL is used to figure out " +#| "the real Internet IP. The URL should simply return the IP wherethe client " +#| "comes from. Example: http://myip.datasystems24.de" msgid "" -"Optional Value. If your FreedomBox is not connected directly to the Internet " +"Optional Value. If your {box_name} is not connected directly to the Internet " "(i.e. connected to a NAT router) this URL is used to figure out the real " -"Internet IP. The URL should simply return the IP wherethe client comes from. " -"Example: http://myip.datasystems24.de" +"Internet IP. The URL should simply return the IP where the client comes from " +"(example: http://myip.datasystems24.de)." msgstr "" "Tillval. Om din FreedomBox inte är direkt ansluten till Internet (dvs " "anslutna via en NAT-router) används denna webbadress för att hitta korrekt " "IP. Webbadressen ska helt enkelt returnera det IP som klienten kommer från. " "(exempel: http://myip.datasystems24.de)" -#: plinth/modules/dynamicdns/dynamicdns.py:101 +#: plinth/modules/dynamicdns/dynamicdns.py:104 msgid "" "You should have been requested to select a username when you created the " "account." msgstr "Du bör har uppmanats att välja ett användarnamn när du skapade kontot." -#: plinth/modules/dynamicdns/dynamicdns.py:112 +#: plinth/modules/dynamicdns/dynamicdns.py:115 msgid "Enable Dynamic DNS" msgstr "Aktivera Dynamisk DNS" -#: plinth/modules/dynamicdns/dynamicdns.py:115 +#: plinth/modules/dynamicdns/dynamicdns.py:118 msgid "Service type" msgstr "Typ av tjänst" -#: plinth/modules/dynamicdns/dynamicdns.py:120 +#: plinth/modules/dynamicdns/dynamicdns.py:123 msgid "GnudIP Server Address" msgstr "GnudIP Serveradress" -#: plinth/modules/dynamicdns/dynamicdns.py:125 +#: plinth/modules/dynamicdns/dynamicdns.py:128 msgid "Invalid server name" msgstr "Du har angett ett ogiltigt servernamn" -#: plinth/modules/dynamicdns/dynamicdns.py:128 +#: plinth/modules/dynamicdns/dynamicdns.py:131 msgid "Update URL" msgstr "Adress för uppdateringar" -#: plinth/modules/dynamicdns/dynamicdns.py:132 -msgid "accept all SSL certificates" +#: plinth/modules/dynamicdns/dynamicdns.py:135 +#, fuzzy +#| msgid "accept all SSL certificates" +msgid "Accept all SSL certificates" msgstr "Acceptera alla SSL-certifikat" -#: plinth/modules/dynamicdns/dynamicdns.py:136 -msgid "use HTTP basic authentication" +#: plinth/modules/dynamicdns/dynamicdns.py:139 +#, fuzzy +#| msgid "use HTTP basic authentication" +msgid "Use HTTP basic authentication" msgstr "Avänd grundläggande HTTP-autentisering" -#: plinth/modules/dynamicdns/dynamicdns.py:148 +#: plinth/modules/dynamicdns/dynamicdns.py:151 #: plinth/modules/networks/forms.py:146 plinth/modules/transmission/forms.py:39 msgid "Username" msgstr "Användarnamn" -#: plinth/modules/dynamicdns/dynamicdns.py:151 +#: plinth/modules/dynamicdns/dynamicdns.py:154 #: plinth/modules/networks/forms.py:147 plinth/modules/transmission/forms.py:43 msgid "Password" msgstr "Lösenord" -#: plinth/modules/dynamicdns/dynamicdns.py:154 -msgid "show password" -msgstr "Visa lösenord" +#: plinth/modules/dynamicdns/dynamicdns.py:157 +#: plinth/modules/networks/forms.py:149 +msgid "Show password" +msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:158 +#: plinth/modules/dynamicdns/dynamicdns.py:161 msgid "IP check URL" msgstr "Webbadress för att kontrollera IP" -#: plinth/modules/dynamicdns/dynamicdns.py:184 +#: plinth/modules/dynamicdns/dynamicdns.py:187 msgid "Please provide update URL or a GnuDIP Server" msgstr "Ange uppdateringsadress eller GnuDIP-server" -#: plinth/modules/dynamicdns/dynamicdns.py:187 +#: plinth/modules/dynamicdns/dynamicdns.py:190 msgid "Please provide GnuDIP username" msgstr "Ange användarnamn för GnuDIP" -#: plinth/modules/dynamicdns/dynamicdns.py:190 +#: plinth/modules/dynamicdns/dynamicdns.py:193 msgid "Please provide GnuDIP domain" msgstr "Ange GnuDIP-domän" -#: plinth/modules/dynamicdns/dynamicdns.py:195 +#: plinth/modules/dynamicdns/dynamicdns.py:198 msgid "Please provide a password" msgstr "Ange ett lösenord" -#: plinth/modules/dynamicdns/dynamicdns.py:214 +#: plinth/modules/dynamicdns/dynamicdns.py:217 msgid "Configure Dynamic DNS" msgstr "Konfigurera Dynamisk DNS" -#: plinth/modules/dynamicdns/dynamicdns.py:236 +#: plinth/modules/dynamicdns/dynamicdns.py:239 msgid "Status of Dynamic DNS" msgstr "Status för Dynamisk DNS" #: plinth/modules/dynamicdns/templates/dynamicdns.html:25 -msgid "DynamicDNS client" +#, fuzzy +#| msgid "DynamicDNS client" +msgid "Dynamic DNS Client" msgstr "Klient för Dynamisk DNS" #: plinth/modules/dynamicdns/templates/dynamicdns.html:28 +#, fuzzy, python-format +#| msgid "" +#| "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)." msgid "" "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)." +"may find the services which are provided by %(box_name)s, such as ownCloud." msgstr "" "Om din Internetleverantör periodiskt ändrar din IP-adress (dvs varje 24h) " "kan det vara svårt för andra att hitta dig på nätet. Då kan ingen hitta de " "tjänster som tillhandahålls av FreedomBox (tex. din ownCloud)." #: plinth/modules/dynamicdns/templates/dynamicdns.html:37 +#, fuzzy +#| msgid "" +#| "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 gnudip " +#| "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." msgid "" "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 gnudip 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." +"Internet asks for your DNS name he will get your current IP answered." msgstr "" "Lösningen är att tilldela DNS-namn till din IP-adress och uppdatera DNS-namn " "varje gång din IP ändras av din Internetleverantör. Dynamisk DNS kopplar din " -"nuvarande offentliga IP-adressen till en gnudip server. " -"Därefter tilldelar servern ditt DNS-namn med din nya IP, och om någon från " -"Internet ber om din DNS-namn, kommer han bli skickad till din aktuella IP." +"nuvarande offentliga IP-adressen till en gnudip server. Därefter tilldelar servern ditt " +"DNS-namn med din nya IP, och om någon från Internet ber om din DNS-namn, " +"kommer han bli skickad till din aktuella IP." #: plinth/modules/dynamicdns/templates/dynamicdns.html:50 msgid "" @@ -639,10 +706,14 @@ msgstr "" "target='_blank'> freedns.afraid.org." #: plinth/modules/dynamicdns/templates/dynamicdns.html:61 +#, fuzzy, python-format +#| msgid "" +#| "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." msgid "" -"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." +"If your %(box_name)s is connected behind some NAT router, don't forget to " +"add port forwarding (i.e. forward some standard ports like 80 and 443)." msgstr "" "Om din FreedomBox är ansluten bakom en NAT-router, glöm inte att lägga till " "port forwarding (dvs vidarebefordra några standardportar, såsom 80 och 443)." @@ -669,16 +740,23 @@ msgstr "" "kommer vi inte att upptäcka en NAT-typ." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:35 -msgid "Direct connection to the internet." +#, fuzzy +#| msgid "Direct connection to the internet." +msgid "Direct connection to the Internet." msgstr "Direktanslutning till Internet." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:37 -#, python-format -msgid "" -"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)s minutes until we " -"update your DNS entry in case of WAN IP change." +#, fuzzy, python-format +#| msgid "" +#| "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)s " +#| "minutes until we update your DNS entry in case of WAN IP change." +msgid "" +"Behind NAT. This means that Dynamic DNS service will poll the \"IP check URL" +"\" for changes (the \"IP check URL\" entry is needed for this - otherwise IP " +"changes will not be detected). In case the WAN IP changes, it may take up " +"to %(timer)s minutes until your DNS entry is updated." msgstr "" "Bakom NAT. Detta innebär att tjänsten dynamisk DNS kommer att fråga \"IP-" "kontrolladress\" för ändringar (vi behöver därför \"IP-kontrolladress\" - " @@ -696,19 +774,23 @@ msgid "Firewall" msgstr "Brandvägg" #: plinth/modules/firewall/templates/firewall.html:28 -#, python-format +#, fuzzy, python-format +#| msgid "" +#| "Firewall is a network security system that controls the incoming and " +#| "outgoing network traffic on your %(box_name)s. Keeping a firewall enabled " +#| "and properly configured reduces risk of security threat from the Internet." msgid "" -"Firewall is a network security system that controls the incoming and " -"outgoing network traffic on your %(box_name)s. Keeping a firewall enabled " -"and properly configured reduces risk of security threat from the Internet." +"Firewall is a security system that controls the incoming and outgoing " +"network traffic on your %(box_name)s. Keeping a firewall enabled and " +"properly configured reduces risk of security threat from the Internet." msgstr "" "Brandväggen är ett säkerhetssystem som styr den inkommande och utgående " "nätverkstrafiken på din %(box_name)s. Att ha en brandvägg aktiverad och " "korrekt konfigurerad minskar risken för säkerhetshot från Internet." #: plinth/modules/firewall/templates/firewall.html:36 -msgid "The following is the current status:" -msgstr "Aktuell status:" +msgid "Current status:" +msgstr "" #: plinth/modules/firewall/templates/firewall.html:41 #, python-format @@ -756,10 +838,15 @@ msgid "Blocked" msgstr "Blockerade" #: plinth/modules/firewall/templates/firewall.html:103 +#, fuzzy +#| msgid "" +#| "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." msgid "" "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." +"also permitted in the firewall and when you disable a service it is also " +"disabled in the firewall." msgstr "" "Brandväggen är automatisk. När du aktiverar en tjänst tillåts den " "automatiskt i brandväggen och om du inaktiverar en tjänst, så inaktiveras " @@ -779,7 +866,7 @@ msgstr "Användarkonto skapat, du är nu inloggad" #: plinth/modules/first_boot/templates/firstboot_navbar.html:23 #: plinth/modules/help/templates/help_index.html:25 -#: plinth/templates/base.html:100 +#: plinth/templates/base.html:102 msgid "Help" msgstr "Hjälp" @@ -819,11 +906,15 @@ msgid "Setup Complete!" msgstr "Installation klar!" #: plinth/modules/first_boot/templates/firstboot_state10.html:32 -#, python-format +#, fuzzy, python-format +#| msgid "" +#| "%(box_name)s setup is now complete. To make your %(box_name)s " +#| "functional, you need some applications. Applications will be installed " +#| "the first time you access them." msgid "" "%(box_name)s setup is now complete. To make your %(box_name)s functional, " -"you need some applications. Applications will be installed the first time " -"you access them." +"you need some applications. They will be installed the first time you " +"access them." msgstr "" "%(box_name)s installationen är klar. För att göra din %(box_name)s " "funktionell, behöver du några applikationer. De kommer att installeras " @@ -861,9 +952,9 @@ msgstr "Dokumentation" msgid "Where to Get Help" msgstr "Vart Du Kan Få Hjälp" -#: plinth/modules/help/help.py:38 plinth/modules/help/help.py:72 -msgid "FreedomBox Manual" -msgstr "FreedomBox Manual" +#: plinth/modules/help/help.py:38 +msgid "Manual" +msgstr "" #: plinth/modules/help/help.py:48 msgid "Documentation and FAQ" @@ -874,15 +965,30 @@ msgstr "Dokumentation och Vanliga Frågor" msgid "About {box_name}" msgstr "Om {box_name}" +#: plinth/modules/help/help.py:73 +#, fuzzy, python-brace-format +#| msgid "About {box_name}" +msgid "{box_name} Manual" +msgstr "Om {box_name}" + #: plinth/modules/help/templates/help_about.html:30 -msgid "" -"FreedomBox is a community project to develop, design and promote personal " +#, fuzzy, python-format +#| msgid "" +#| "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." +msgid "" +"%(box_name)s 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." +"and a Tor relay, on a device that can replace your Wi-Fi router, so that " +"your data stays with you." msgstr "" "FreedomBox är ett kollaborativtprojekt för att utveckla, designa och främja " "personliga servrar med fri programvara för privat och personlig " @@ -910,27 +1016,37 @@ msgstr "" "peer-arkitektur." #: plinth/modules/help/templates/help_about.html:56 +#, fuzzy, python-format +#| msgid "" +#| "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." msgid "" "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." +"services; %(box_name)s aims to bring them all together in a convenient " +"package." msgstr "" "Det finns ett flertal projekt avsedda att förverkliga en framtid av " "distribuerade tjänster. FreedomBox avser att samla dem alla tillsammans i " "ett enda praktiskt paket." #: plinth/modules/help/templates/help_about.html:64 +#, fuzzy, python-format +#| msgid "" +#| "For more information about the FreedomBox project, see the FreedomBox Wiki." msgid "" -"For more information about the FreedomBox project, see the FreedomBox Wiki." +"For more information about the %(box_name)s project, see the %(box_name)s Wiki." msgstr "" -"Mer information om FreedomBox-projektet finns på FreedomBox wiki." +"Mer information om FreedomBox-projektet finns på FreedomBox wiki." -#: plinth/modules/help/templates/help_about.html:72 +#: plinth/modules/help/templates/help_about.html:73 msgid "Learn more »" msgstr "Läs mer »" -#: plinth/modules/help/templates/help_about.html:75 +#: plinth/modules/help/templates/help_about.html:76 #, python-format msgid "You are running Plinth version %(version)s." msgstr "Du använder Plinth version %(version)s." @@ -941,56 +1057,81 @@ msgid "%(box_name)s Setup" msgstr "%(box_name)s Installation" #: plinth/modules/help/templates/help_index.html:29 -#, python-format +#, fuzzy, python-format +#| msgid "" +#| "The FreedomBox Manual is the best place to " +#| "start for information regarding %(box_name)s." msgid "" -"The FreedomBox Manual is the best place to " +"The %(box_name)s Manual is the best place to " "start for information regarding %(box_name)s." msgstr "" "FreedomBox Manual är det bästa stället att " "börja för information om %(box_name)s." #: plinth/modules/help/templates/help_index.html:36 +#, fuzzy, python-format +#| msgid "" +#| " " +#| "FreedomBox project wiki contains further information." msgid "" -" FreedomBox " -"project wiki contains further information." +" " +"%(box_name)s project wiki contains further information." msgstr "" " FreedomBox " "project wiki innehåller ytterligare information." #: plinth/modules/help/templates/help_index.html:43 -msgid "" -"To seek help from FreedomBox community, queries may be posted on the " -"mailing list. The list archives also contain information about problems " -"faced by other users and possible solutions." +#, fuzzy, python-format +#| msgid "" +#| "To seek help from FreedomBox community, queries may be posted on the mailing list. The list archives also contain information about " +#| "problems faced by other users and possible solutions." +msgid "" +"To seek help from %(box_name)s community, queries may be posted on the mailing list. The list archives also contain information about " +"problems faced by other users and possible solutions." msgstr "" "För att få hjälp från FreedomBox användargrupp kan du ställa frågor på " -" mailing list. Arkiven innehåller även information om möjliga lösningar " -"på problem som andra användare haft." +"href=\"https://lists.alioth.debian.org/mailman/listinfo/freedombox-discuss" +"\"> mailing list. Arkiven innehåller även information om möjliga " +"lösningar på problem som andra användare haft." #: plinth/modules/help/templates/help_index.html:53 -msgid "" -"Many FreedomBox contributors and users are also available on the irc.oftc." -"net IRC network. Join and request help on the #freedombox channel " -"using the IRC web interface." +#, fuzzy, python-format +#| msgid "" +#| "Many FreedomBox contributors and users are also available on the irc.oftc." +#| "net IRC network. Join and request help on the #freedombox " +#| "channel using the IRC web interface." +msgid "" +"Many %(box_name)s contributors and users are also available on the irc.oftc." +"net IRC network. Join and request help on the #freedombox " +"channel using the IRC web interface." msgstr "" "Många utvecklare och användare av FreedomBox finns också tillgängliga på IRC-" -"nätverket irc.oftc.net. Gå med, ställ frågor och be om hjälp i " +"nätverket irc.oftc.net. Gå med, ställ frågor och be om hjälp i " "#freedombox kanal via webbchatten." #: plinth/modules/ikiwiki/__init__.py:38 -msgid "Wiki & Blog (Ikiwiki)" +#, fuzzy +#| msgid "Wiki & Blog (Ikiwiki)" +msgid "Wiki and Blog (ikiwiki)" msgstr "Wiki & Blogg (Ikiwiki)" #: plinth/modules/ikiwiki/__init__.py:43 -msgid "Ikiwiki wikis and blogs" +#, fuzzy +#| msgid "Ikiwiki wikis and blogs" +msgid "ikiwiki wikis and blogs" msgstr "Ikiwiki wikis och bloggar" #: plinth/modules/ikiwiki/forms.py:29 -msgid "Enable Ikiwiki" +#, fuzzy +#| msgid "Enable Ikiwiki" +msgid "Enable ikiwiki" msgstr "Aktivera Ikiwiki" #: plinth/modules/ikiwiki/forms.py:36 @@ -1020,24 +1161,29 @@ msgstr "" "ikiwiki\">/ikiwiki." #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:27 -#, python-format -msgid "Delete Wiki/Blog %(name)s" +#, fuzzy, python-format +#| msgid "Delete Wiki/Blog %(name)s" +msgid "Delete Wiki or Blog %(name)s" msgstr "Ta bort Wiki/Blogg %(name)s" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:33 +#, fuzzy +#| msgid "" +#| "This action will remove all the posts, pages and comments including " +#| "revision history. Delete this wiki/blog permanently?" msgid "" "This action will remove all the posts, pages and comments including revision " -"history. Delete this wiki/blog permanently?" +"history. Delete this wiki or blog permanently?" msgstr "" "Den här åtgärden tar bort alla inlägg, sidor och kommentarer, även " "versionshistorik. Ta bort denna wiki/blogg permanent?" -#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:43 +#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:44 #, python-format msgid "Delete %(name)s" msgstr "Ta bort %(name)s" -#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:46 +#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:47 #: plinth/modules/monkeysphere/templates/monkeysphere.html:60 #: plinth/modules/networks/templates/connections_delete.html:41 #: plinth/modules/users/templates/users_delete.html:41 @@ -1071,7 +1217,9 @@ msgid "Create" msgstr "Skapa" #: plinth/modules/ikiwiki/views.py:73 -msgid "Wiki & Blog" +#, fuzzy +#| msgid "Wiki & Blog" +msgid "Wiki and Blog" msgstr "Wiki och blogg" #: plinth/modules/ikiwiki/views.py:106 @@ -1079,8 +1227,10 @@ msgid "Manage Wikis and Blogs" msgstr "Hantera wikis och bloggar" #: plinth/modules/ikiwiki/views.py:132 -msgid "Create Wiki/Blog" -msgstr "Skapa wiki eller blogg" +#, fuzzy +#| msgid "Create a Wiki or Blog" +msgid "Create Wiki or Blog" +msgstr "Skapa en wiki eller blogg" #: plinth/modules/ikiwiki/views.py:145 #, python-brace-format @@ -1113,7 +1263,9 @@ msgid "Could not delete {name}: {error}" msgstr "Kunde inte ta bort {name}: {error}" #: plinth/modules/ikiwiki/views.py:182 -msgid "Delete Wiki/Blog" +#, fuzzy +#| msgid "Delete Wiki/Blog" +msgid "Delete Wiki or Blog" msgstr "Ta bort wiki eller blogg" #: plinth/modules/letsencrypt/__init__.py:43 @@ -1146,8 +1298,8 @@ msgid "" msgstr "" "Let's Encrypt en är gratis, automatiserad och öppen certifikatutfärdare, " "använd för allmänhetens nytta av Internet Security Research Group (ISRG). " -"Läs igenom och acceptera " -"Let's Encryp användaravtal innan du använder denna tjänst." +"Läs igenom och acceptera Let's Encryp användaravtal innan du använder denna tjänst." #: plinth/modules/letsencrypt/templates/letsencrypt.html:66 #: plinth/modules/monkeysphere/templates/monkeysphere.html:70 @@ -1415,10 +1567,6 @@ msgstr "" msgid "-- select --" msgstr "" -#: plinth/modules/networks/forms.py:149 -msgid "Show password" -msgstr "" - #: plinth/modules/networks/forms.py:175 #: plinth/modules/networks/templates/connection_show.html:144 msgid "SSID" @@ -1543,7 +1691,7 @@ msgid "Edit connection" msgstr "" #: plinth/modules/networks/templates/connection_show.html:43 -#: plinth/templates/base.html:121 +#: plinth/templates/base.html:123 msgid "Edit" msgstr "" @@ -1703,10 +1851,11 @@ msgid "" msgstr "" #: plinth/modules/networks/templates/connection_show.html:319 +#, python-format msgid "" -"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 " +"This interface is not maintained by %(box_name)s. Its security status is " +"unknown to %(box_name)s. Many %(box_name)s services may not be available on " +"this interface. It is recommended that you deactivate or delete this " "connection and re-configure it." msgstr "" @@ -1798,7 +1947,7 @@ msgstr "" #, python-format msgid "" "Virtual Private Network (VPN) is a technique for securely connecting two " -"machines in order to access resources of a private network. While you are " +"devices in order to access resources of a private network. While you are " "away from home, you can connect to your %(box_name)s in order to join your " "home network and access private/internal services provided by %(box_name)s. " "You can also access the rest of the Internet via %(box_name)s for added " @@ -1815,7 +1964,7 @@ msgid "" "To connect to %(box_name)s'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 documentation on recommended clients and instructions on how to " "configure them." msgstr "" @@ -2293,6 +2442,62 @@ msgstr "" msgid "Quassel core service is not running" msgstr "" +#: plinth/modules/repro/__init__.py:36 +#: plinth/modules/repro/templates/repro.html:26 +#: plinth/modules/repro/views.py:55 +#, fuzzy +#| msgid "GnudIP Server Address" +msgid "SIP Server (repro)" +msgstr "GnudIP Serveradress" + +#: plinth/modules/repro/__init__.py:41 +msgid "repro SIP Server" +msgstr "" + +#: plinth/modules/repro/forms.py:29 +#, fuzzy +#| msgid "Enable service discovery" +msgid "Enable repro service" +msgstr "Aktivera tjänstidentifiering" + +#: plinth/modules/repro/templates/repro.html:29 +msgid "" +"repro provides various SIP services that a SIP softphone can utilize to " +"provide audio and video calls as well as presence and instant messaging. " +"repro provides a server and SIP user accounts that clients can use to let " +"their presence known. It also acts as a proxy to federate SIP " +"communications to other servers on the Internet similar to email." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:39 +msgid "" +"To make SIP calls, a client application is needed. Available clients include " +"Jitsi (for computers) and CSipSimple (for Android phones)." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:48 +msgid "" +"Note: Before using repro, domains and users will need to " +"be configured using the web-based " +"configuration panel. Users in the admin group will be able to " +"log in to the repro configuration panel. After setting the domain, it is " +"required to restart the repro service. Disable the service and re-enable it." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:63 +#, fuzzy +#| msgid "Mumble server is running" +msgid "repro service is running" +msgstr "Mumble-servern är aktiverad" + +#: plinth/modules/repro/templates/repro.html:66 +#, fuzzy +#| msgid "Mumble server is not running" +msgid "repro service is not running" +msgstr "Mumble-servern är inaktiverad" + #: plinth/modules/restore/__init__.py:36 #: plinth/modules/restore/templates/restore_index.html:26 #: plinth/modules/restore/views.py:46 @@ -2313,8 +2518,8 @@ msgid "" "reStore is a server for unhosted web " "applications. The idea is to uncouple web applications from data. No " "matter where a web application is served from, the data can be stored on an " -"unhosted storage server of user's choice. With reStore, your " -"%(cfg.box_name)s becomes your unhosted storage server." +"unhosted storage server of user's choice. With reStore, your %(box_name)s " +"becomes your unhosted storage server." msgstr "" #: plinth/modules/restore/templates/restore_index.html:40 @@ -2391,7 +2596,7 @@ msgstr "" #: plinth/modules/system/system.py:33 #: plinth/modules/system/templates/system.html:25 -#: plinth/templates/base.html:107 +#: plinth/templates/base.html:109 msgid "System Configuration" msgstr "" @@ -2406,33 +2611,73 @@ msgid "" "The options affect the %(box_name)s at its most general level, so be careful!" msgstr "" -#: plinth/modules/tor/__init__.py:50 -msgid "Tor relay port available" +#: plinth/modules/tor/__init__.py:48 plinth/modules/tor/templates/tor.html:35 +msgid "Anonymity Network (Tor)" msgstr "" +#: plinth/modules/tor/__init__.py:53 +#, fuzzy +#| msgid "Go to Networks" +msgid "Tor Anonymity Network" +msgstr "Gå till Nätverk" + #: plinth/modules/tor/__init__.py:58 +msgid "Tor Bridge Relay" +msgstr "" + +#: plinth/modules/tor/__init__.py:76 plinth/modules/tor/views.py:144 +msgid "Tor Hidden Service" +msgstr "" + +#: plinth/modules/tor/__init__.py:222 +msgid "Tor relay port available" +msgstr "" + +#: plinth/modules/tor/__init__.py:230 msgid "Obfs3 transport registered" msgstr "" -#: plinth/modules/tor/__init__.py:64 +#: plinth/modules/tor/__init__.py:236 msgid "Obfs4 transport registered" msgstr "" -#: plinth/modules/tor/__init__.py:101 +#: plinth/modules/tor/__init__.py:273 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "" -#: plinth/modules/tor/__init__.py:112 +#: plinth/modules/tor/__init__.py:284 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "" -#: plinth/modules/tor/templates/tor.html:26 plinth/modules/tor/tor.py:66 -msgid "Anonymity Network (Tor)" +#: plinth/modules/tor/forms.py:32 +msgid "Enable Tor" +msgstr "" + +#: plinth/modules/tor/forms.py:35 +msgid "Enable Tor Hidden Service" msgstr "" -#: plinth/modules/tor/templates/tor.html:29 +#: plinth/modules/tor/forms.py:38 +#, python-brace-format +msgid "" +"A hidden service will allow {box_name} to provide selected services (such as " +"ownCloud or chat) without revealing its location." +msgstr "" + +#: plinth/modules/tor/forms.py:42 +msgid "Download software packages over Tor" +msgstr "" + +#: plinth/modules/tor/forms.py:44 +msgid "" +"When enabled, software will be downloaded over the Tor network for " +"installations and upgrades. This adds a degree of privacy and security " +"during software downloads." +msgstr "" + +#: plinth/modules/tor/templates/tor.html:38 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -2441,28 +2686,34 @@ msgid "" "Tor Browser." msgstr "" -#: plinth/modules/tor/templates/tor.html:44 +#: plinth/modules/tor/templates/tor.html:54 +#, fuzzy +#| msgid "Configuration updated" +msgid "Tor configuration is being updated" +msgstr "Konfiguration uppdaterad" + +#: plinth/modules/tor/templates/tor.html:62 msgid "Tor is running" msgstr "" -#: plinth/modules/tor/templates/tor.html:47 +#: plinth/modules/tor/templates/tor.html:65 msgid "Tor is not running" msgstr "" -#: plinth/modules/tor/templates/tor.html:59 +#: plinth/modules/tor/templates/tor.html:77 msgid "Hidden Service" msgstr "" -#: plinth/modules/tor/templates/tor.html:60 -#: plinth/modules/tor/templates/tor.html:102 +#: plinth/modules/tor/templates/tor.html:78 +#: plinth/modules/tor/templates/tor.html:120 msgid "Port" msgstr "" -#: plinth/modules/tor/templates/tor.html:85 +#: plinth/modules/tor/templates/tor.html:103 msgid "Bridge" msgstr "" -#: plinth/modules/tor/templates/tor.html:88 +#: plinth/modules/tor/templates/tor.html:106 #, python-format msgid "" "Your %(box_name)s is configured as a Tor bridge with obfsproxy, so it can " @@ -2471,79 +2722,36 @@ msgid "" "forwarded, if necessary:" msgstr "" -#: plinth/modules/tor/templates/tor.html:101 +#: plinth/modules/tor/templates/tor.html:119 msgid "Service" msgstr "" -#: plinth/modules/tor/templates/tor.html:117 +#: plinth/modules/tor/templates/tor.html:135 msgid "SOCKS" msgstr "" -#: plinth/modules/tor/templates/tor.html:120 +#: plinth/modules/tor/templates/tor.html:138 #, python-format msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "" -#: plinth/modules/tor/tor.py:46 -msgid "Enable Tor" -msgstr "" - -#: plinth/modules/tor/tor.py:49 -msgid "Enable Tor Hidden Service" -msgstr "" - -#: plinth/modules/tor/tor.py:51 -msgid "" -"A hidden service will allow FreedomBox to provide selected services (such as " -"ownCloud or Chat) without revealing its location." -msgstr "" - -#: plinth/modules/tor/tor.py:55 -msgid "Download software packages over Tor" -msgstr "" - -#: plinth/modules/tor/tor.py:57 -msgid "" -"When enabled, software will be downloaded over the Tor network for " -"installations and upgrades. This adds a degree of privacy and security " -"during software downloads." -msgstr "" - -#: plinth/modules/tor/tor.py:85 plinth/modules/tor/tor.py:285 -msgid "Tor Hidden Service" -msgstr "" - -#: plinth/modules/tor/tor.py:115 +#: plinth/modules/tor/views.py:68 msgid "Tor Control Panel" msgstr "" -#: plinth/modules/tor/tor.py:240 +#: plinth/modules/tor/views.py:79 #, python-brace-format msgid "Action error: {0} [{1}] [{2}]" msgstr "" -#: plinth/modules/tor/tor.py:256 -msgid "Tor enabled" -msgstr "" - -#: plinth/modules/tor/tor.py:259 -msgid "Tor disabled" -msgstr "" - -#: plinth/modules/tor/tor.py:264 -msgid "Tor hidden service enabled" -msgstr "" - -#: plinth/modules/tor/tor.py:267 -msgid "Tor hidden service disabled" -msgstr "" - -#: plinth/modules/tor/tor.py:292 -msgid "Enabled package download over Tor" -msgstr "" +#: plinth/modules/tor/views.py:148 +#, fuzzy +#| msgid "Configuration updated" +msgid "Configuration updated." +msgstr "Konfiguration uppdaterad" -#: plinth/modules/tor/tor.py:295 -msgid "Disabled package download over Tor" +#: plinth/modules/tor/views.py:150 +msgid "An error occurred during configuration." msgstr "" #: plinth/modules/transmission/__init__.py:38 @@ -2614,70 +2822,68 @@ msgid "" "will attempt to perform any package upgrades that are available." msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:40 -msgid "There was an error while upgrading." +#: plinth/modules/upgrades/templates/upgrades.html:37 +msgid "" +"Upgrades install the latest software and security updates. When automatic " +"upgrades are enabled, upgrades are automatically run every night. You don't " +"normally need to start the upgrade process." msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:43 -#: plinth/modules/upgrades/templates/upgrades.html:59 -msgid "Output from unattended-upgrades:" +#: plinth/modules/upgrades/templates/upgrades.html:45 +msgid "" +"Depending on the number of packages to install, this may take a long time to " +"complete. While upgrades are in progress, you will not be able to install " +"other packages. During the upgrade, this web interface may be temporarily " +"unavailable and show an error. Refresh the page to continue." msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:50 -msgid "The operating system is up to date now.  " +#: plinth/modules/upgrades/templates/upgrades.html:58 +msgid "Upgrade now »" msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:53 -msgid "Show Details" +#: plinth/modules/upgrades/templates/upgrades.html:65 +msgid "A package manager is running." msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:69 -msgid "" -"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." +#: plinth/modules/upgrades/templates/upgrades.html:70 +msgid "Recent log from upgrades:" msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:80 -msgid "Upgrade now »" +#: plinth/modules/upgrades/views.py:36 plinth/modules/upgrades/views.py:66 +msgid "Automatic Upgrades" msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:87 -msgid "System is being upgraded." +#: plinth/modules/upgrades/views.py:38 +msgid "Upgrade Packages" msgstr "" -#: plinth/modules/upgrades/views.py:35 plinth/modules/upgrades/views.py:64 -msgid "Automatic Upgrades" +#: plinth/modules/upgrades/views.py:96 +msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:37 -msgid "Upgrade Packages" -msgstr "" +#: plinth/modules/upgrades/views.py:99 +#, fuzzy +#| msgid "Creating LDAP user failed." +msgid "Starting upgrade failed." +msgstr "Det gick inte att skapa LDAP-användare." -#: plinth/modules/upgrades/views.py:75 +#: plinth/modules/upgrades/views.py:102 msgid "Package Upgrades" msgstr "" -#: plinth/modules/upgrades/views.py:116 +#: plinth/modules/upgrades/views.py:131 #, python-brace-format msgid "Error when configuring unattended-upgrades: {error}" msgstr "" -#: plinth/modules/upgrades/views.py:121 +#: plinth/modules/upgrades/views.py:136 msgid "Automatic upgrades enabled" msgstr "" -#: plinth/modules/upgrades/views.py:123 +#: plinth/modules/upgrades/views.py:138 msgid "Automatic upgrades disabled" msgstr "" -#: plinth/modules/upgrades/views.py:142 -msgid "Upgrade completed." -msgstr "" - -#: plinth/modules/upgrades/views.py:144 -msgid "Upgrade failed." -msgstr "" - #: plinth/modules/users/__init__.py:36 msgid "Users and Groups" msgstr "" @@ -2713,19 +2919,30 @@ msgstr "" msgid "Failed to add new user to {group} group." msgstr "" -#: plinth/modules/users/forms.py:126 +#: plinth/modules/users/forms.py:92 +msgid "SSH Keys" +msgstr "" + +#: plinth/modules/users/forms.py:96 +msgid "" +"Setting an SSH public key will allow this user to securely log in to the " +"system without using a password. You may enter multiple keys, one on each " +"line. Blank lines and lines starting with # will be ignored." +msgstr "" + +#: plinth/modules/users/forms.py:136 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:138 +#: plinth/modules/users/forms.py:148 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:149 +#: plinth/modules/users/forms.py:159 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:174 +#: plinth/modules/users/forms.py:188 msgid "Changing LDAP user password failed." msgstr "" @@ -2744,7 +2961,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:26 -#: plinth/modules/users/views.py:103 +#: plinth/modules/users/views.py:110 msgid "Delete User" msgstr "" @@ -2797,20 +3014,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:113 +#: plinth/modules/users/views.py:120 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:120 +#: plinth/modules/users/views.py:127 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:129 +#: plinth/modules/users/views.py:136 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:130 +#: plinth/modules/users/views.py:137 msgid "Password changed successfully." msgstr "" @@ -2885,8 +3102,9 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "" -#: plinth/service.py:78 -msgid "FreedomBox Web Interface (Plinth)" +#: plinth/service.py:79 +#, python-brace-format +msgid "{box_name} Web Interface (Plinth)" msgstr "" #: plinth/templates/404.html:25 @@ -2917,27 +3135,24 @@ msgid "" msgstr "" #: plinth/templates/base.html:49 -msgid "Plinth administrative interface for the FreedomBox" -msgstr "" - -#: plinth/templates/base.html:52 -msgid "FreedomBox" +#, python-format +msgid "Plinth administrative interface for the %(box_name)s" msgstr "" -#: plinth/templates/base.html:81 +#: plinth/templates/base.html:83 msgid "Toggle navigation" msgstr "" -#: plinth/templates/base.html:123 plinth/templates/base.html.py:124 +#: plinth/templates/base.html:125 plinth/templates/base.html.py:126 msgid "Change password" msgstr "" -#: plinth/templates/base.html:127 plinth/templates/base.html.py:128 -#: plinth/templates/base.html:141 plinth/templates/base.html.py:143 +#: plinth/templates/base.html:129 plinth/templates/base.html.py:130 +#: plinth/templates/base.html:143 plinth/templates/base.html.py:145 msgid "Log out" msgstr "" -#: plinth/templates/base.html:133 plinth/templates/base.html.py:135 +#: plinth/templates/base.html:135 plinth/templates/base.html.py:137 msgid "Log in" msgstr "" @@ -2976,3 +3191,15 @@ msgstr "" #, python-format msgid "%(percentage)s%% complete" msgstr "" + +#~ msgid "show password" +#~ msgstr "Visa lösenord" + +#~ msgid "The following is the current status:" +#~ msgstr "Aktuell status:" + +#~ msgid "FreedomBox Manual" +#~ msgstr "FreedomBox Manual" + +#~ msgid "Create Wiki/Blog" +#~ msgstr "Skapa wiki eller blogg" diff --git a/plinth/locale/te/LC_MESSAGES/django.po b/plinth/locale/te/LC_MESSAGES/django.po index 6ea3643b1..58e015164 100644 --- a/plinth/locale/te/LC_MESSAGES/django.po +++ b/plinth/locale/te/LC_MESSAGES/django.po @@ -9,11 +9,11 @@ msgid "" msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-12-20 13:58+0530\n" +"POT-Creation-Date: 2016-01-31 22:19+0530\n" "PO-Revision-Date: 2016-01-16 02:37+0000\n" "Last-Translator: Caly \n" -"Language-Team: Telugu " -"\n" +"Language-Team: Telugu \n" "Language: te\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -51,11 +51,15 @@ msgstr "అనుసంధానించండి {host}:{port}" msgid "Cannot connect to {host}:{port}" msgstr "అనుసంధానించండం సాధ్యంకాదు {host}:{port}" +#: plinth/context_processors.py:36 +msgid "FreedomBox" +msgstr "" + #: plinth/modules/apps/apps.py:26 msgid "Apps" msgstr "అనువర్తనాలు" -#: plinth/modules/apps/apps.py:32 plinth/templates/base.html.py:90 +#: plinth/modules/apps/apps.py:32 plinth/templates/base.html.py:93 msgid "Applications" msgstr "అనువర్తనాలు" @@ -90,10 +94,11 @@ msgid "Enable service discovery" msgstr "ఆవిష్కరణ సేవను అమలుచెయ్యి" #: plinth/modules/avahi/templates/avahi.html:29 +#, python-format msgid "" -"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 " +"Service discovery allows other devices on the network to discover your " +"%(box_name)s and services running on it. It also allows %(box_name)s to " +"discover other devices 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." @@ -102,14 +107,15 @@ msgstr "" #: plinth/modules/avahi/templates/avahi.html:40 #: plinth/modules/datetime/templates/datetime.html:35 #: plinth/modules/deluge/templates/deluge.html:39 -#: plinth/modules/dynamicdns/dynamicdns.py:38 +#: plinth/modules/dynamicdns/dynamicdns.py:39 #: plinth/modules/firewall/templates/firewall.html:57 #: plinth/modules/mumble/templates/mumble.html:44 #: plinth/modules/networks/templates/connection_show.html:261 #: plinth/modules/openvpn/templates/openvpn.html:81 #: plinth/modules/privoxy/templates/privoxy.html:48 #: plinth/modules/quassel/templates/quassel.html:50 -#: plinth/modules/tor/templates/tor.html:39 +#: plinth/modules/repro/templates/repro.html:58 +#: plinth/modules/tor/templates/tor.html:48 #: plinth/modules/transmission/templates/transmission.html:42 #: plinth/modules/xmpp/templates/xmpp.html:58 msgid "Status" @@ -132,9 +138,10 @@ msgstr "సేవ ఆవిష్కరణ సేవికను నడుపట #: plinth/modules/owncloud/templates/owncloud.html:51 #: plinth/modules/privoxy/templates/privoxy.html:62 #: plinth/modules/quassel/templates/quassel.html:65 +#: plinth/modules/repro/templates/repro.html:72 #: plinth/modules/roundcube/templates/roundcube.html:62 #: plinth/modules/shaarli/templates/shaarli.html:40 -#: plinth/modules/tor/templates/tor.html:74 +#: plinth/modules/tor/templates/tor.html:92 #: plinth/modules/transmission/templates/transmission.html:56 #: plinth/modules/xmpp/templates/xmpp.html:72 msgid "Configuration" @@ -150,10 +157,11 @@ msgstr "ఆకృతీకరణ" #: plinth/modules/openvpn/templates/openvpn.html:138 #: plinth/modules/privoxy/templates/privoxy.html:70 #: plinth/modules/quassel/templates/quassel.html:73 +#: plinth/modules/repro/templates/repro.html:80 #: plinth/modules/restore/templates/restore_index.html:54 #: plinth/modules/roundcube/templates/roundcube.html:70 #: plinth/modules/shaarli/templates/shaarli.html:48 -#: plinth/modules/tor/templates/tor.html:82 +#: plinth/modules/tor/templates/tor.html:100 #: plinth/modules/transmission/templates/transmission.html:64 #: plinth/modules/upgrades/templates/upgrades_configure.html:34 #: plinth/modules/xmpp/templates/xmpp.html:80 @@ -162,12 +170,13 @@ msgstr "అమర్చి తాజాపరుచు" #: plinth/modules/avahi/views.py:73 plinth/modules/datetime/views.py:85 #: plinth/modules/deluge/views.py:80 -#: plinth/modules/dynamicdns/dynamicdns.py:368 +#: plinth/modules/dynamicdns/dynamicdns.py:371 #: plinth/modules/ikiwiki/views.py:95 plinth/modules/mumble/views.py:80 #: plinth/modules/openvpn/views.py:142 plinth/modules/privoxy/views.py:83 -#: plinth/modules/quassel/views.py:76 plinth/modules/restore/views.py:68 -#: plinth/modules/roundcube/views.py:84 plinth/modules/shaarli/views.py:74 -#: plinth/modules/transmission/views.py:105 plinth/modules/xmpp/views.py:100 +#: plinth/modules/quassel/views.py:76 plinth/modules/repro/views.py:77 +#: plinth/modules/restore/views.py:68 plinth/modules/roundcube/views.py:84 +#: plinth/modules/shaarli/views.py:74 plinth/modules/transmission/views.py:109 +#: plinth/modules/xmpp/views.py:100 msgid "Configuration updated" msgstr "ఆకృతీకరణ తాజాపరుచింది" @@ -175,60 +184,63 @@ msgstr "ఆకృతీకరణ తాజాపరుచింది" #: plinth/modules/deluge/views.py:82 plinth/modules/ikiwiki/views.py:97 #: plinth/modules/mumble/views.py:82 plinth/modules/openvpn/views.py:144 #: plinth/modules/owncloud/owncloud.py:93 plinth/modules/privoxy/views.py:85 -#: plinth/modules/quassel/views.py:78 plinth/modules/restore/views.py:70 -#: plinth/modules/roundcube/views.py:86 plinth/modules/shaarli/views.py:76 -#: plinth/modules/tor/tor.py:250 plinth/modules/transmission/views.py:107 -#: plinth/modules/upgrades/views.py:103 plinth/modules/xmpp/views.py:102 +#: plinth/modules/quassel/views.py:78 plinth/modules/repro/views.py:79 +#: plinth/modules/restore/views.py:70 plinth/modules/roundcube/views.py:86 +#: plinth/modules/shaarli/views.py:76 plinth/modules/tor/views.py:111 +#: plinth/modules/transmission/views.py:111 +#: plinth/modules/upgrades/views.py:118 plinth/modules/xmpp/views.py:102 msgid "Setting unchanged" msgstr "మారకుండా అమర్చుతోంది" -#: plinth/modules/config/config.py:83 plinth/modules/config/config.py:120 -#: plinth/modules/dynamicdns/dynamicdns.py:145 +#: plinth/modules/config/config.py:84 plinth/modules/config/config.py:121 +#: plinth/modules/dynamicdns/dynamicdns.py:148 msgid "Invalid domain name" msgstr "అధికారక్షేత్రం పేరు చెల్లదు" -#: plinth/modules/config/config.py:94 +#: plinth/modules/config/config.py:95 msgid "Hostname" msgstr "ఆహ్వానించువ్యక్తి పేరు" -#: plinth/modules/config/config.py:96 +#: plinth/modules/config/config.py:97 +#, python-brace-format msgid "" -"Hostname is the local name by which other machines on the local network " -"reach your machine. It must start and end with an alphabet or a digit and " -"have as interior characters only alphabets, digits and hyphens. Total " +"Hostname is the local name by which other devices on the local network can " +"reach your {box_name}. It must start and end with an alphabet or a digit " +"and have as interior characters only alphabets, digits and hyphens. Total " "length must be 63 characters or less." msgstr "" -#: plinth/modules/config/config.py:104 +#: plinth/modules/config/config.py:105 msgid "Invalid hostname" msgstr "ఆహ్వానించువ్యక్తి పేరు చెల్లదు" -#: plinth/modules/config/config.py:107 plinth/modules/config/config.py:153 +#: plinth/modules/config/config.py:108 plinth/modules/config/config.py:153 #: plinth/modules/config/config.py:265 -#: plinth/modules/dynamicdns/dynamicdns.py:140 +#: plinth/modules/dynamicdns/dynamicdns.py:143 msgid "Domain Name" msgstr "అధికారక్షేత్రం పేరు" -#: plinth/modules/config/config.py:109 +#: plinth/modules/config/config.py:110 +#, python-brace-format msgid "" -"Domain name is the global name by which other machines on the Internet can " -"reach you. It must consist of labels separated by dots. Each label must " -"start and end with an alphabet or a digit and have as interior characters " -"only alphabets, digits and hyphens. Length of each label must be 63 " -"characters or less. Total length of domain name must be 253 characters or " -"less." +"Domain name is the global name by which other devices on the Internet can " +"reach your {box_name}. It must consist of labels separated by dots. Each " +"label must start and end with an alphabet or a digit and have as interior " +"characters only alphabets, digits and hyphens. Length of each label must be " +"63 characters or less. Total length of domain name must be 253 characters " +"or less." msgstr "" -#: plinth/modules/config/config.py:124 +#: plinth/modules/config/config.py:125 msgid "Language" msgstr "" -#: plinth/modules/config/config.py:126 -msgid "Language for this FreedomBox web administration interface" +#: plinth/modules/config/config.py:127 +msgid "Language for this web administration interface" msgstr "" #: plinth/modules/config/config.py:135 -#: plinth/modules/dynamicdns/dynamicdns.py:36 +#: plinth/modules/dynamicdns/dynamicdns.py:37 #: plinth/modules/ikiwiki/views.py:36 msgid "Configure" msgstr "ఆకృతీకరణ" @@ -415,147 +427,155 @@ msgstr "పరీక్ష" msgid "Result" msgstr "ఫలితం" -#: plinth/modules/dynamicdns/dynamicdns.py:34 plinth/modules/help/help.py:40 +#: plinth/modules/dynamicdns/dynamicdns.py:35 plinth/modules/help/help.py:40 msgid "About" msgstr "గురించి" -#: plinth/modules/dynamicdns/dynamicdns.py:44 -#: plinth/modules/dynamicdns/dynamicdns.py:53 +#: plinth/modules/dynamicdns/dynamicdns.py:45 +#: plinth/modules/dynamicdns/dynamicdns.py:54 msgid "Dynamic DNS" msgstr "చురుకైన DNS" -#: plinth/modules/dynamicdns/dynamicdns.py:70 +#: plinth/modules/dynamicdns/dynamicdns.py:71 msgid "" "The Variables <User>, <Pass>, <Ip>, <Domain> may be " "used within the URL. For details see the update URL templates of the example " "providers." msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:74 +#: plinth/modules/dynamicdns/dynamicdns.py:75 msgid "" "Please choose an update protocol according to your provider. If your " "provider does not support the GnudIP protocol or your provider is not listed " "you may use the update URL of your provider." msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:79 +#: plinth/modules/dynamicdns/dynamicdns.py:80 msgid "" "Please do not enter a URL here (like \"https://example.com/\") but only the " -"hostname of the GnuDIP server (like \"example.pcom\")." +"hostname of the GnuDIP server (like \"example.com\")." msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:83 -msgid "The public domain name you want use to reach your box." +#: plinth/modules/dynamicdns/dynamicdns.py:84 +#, python-brace-format +msgid "The public domain name you want use to reach your {box_name}." msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:85 +#: plinth/modules/dynamicdns/dynamicdns.py:87 msgid "Use this option if your provider uses self signed certificates." msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:88 +#: plinth/modules/dynamicdns/dynamicdns.py:90 msgid "" "If this option is selected, your username and password will be used for HTTP " "basic authentication." msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:91 +#: plinth/modules/dynamicdns/dynamicdns.py:93 msgid "" "Leave this field empty if you want to keep your previous configured password." msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:94 +#: plinth/modules/dynamicdns/dynamicdns.py:96 +#, python-brace-format msgid "" -"Optional Value. If your FreedomBox is not connected directly to the Internet " +"Optional Value. If your {box_name} is not connected directly to the Internet " "(i.e. connected to a NAT router) this URL is used to figure out the real " -"Internet IP. The URL should simply return the IP wherethe client comes from. " -"Example: http://myip.datasystems24.de" +"Internet IP. The URL should simply return the IP where the client comes from " +"(example: http://myip.datasystems24.de)." msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:101 +#: plinth/modules/dynamicdns/dynamicdns.py:104 msgid "" "You should have been requested to select a username when you created the " "account." msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:112 +#: plinth/modules/dynamicdns/dynamicdns.py:115 msgid "Enable Dynamic DNS" msgstr "చురుకైన DNS అమలుచెయ్యి" -#: plinth/modules/dynamicdns/dynamicdns.py:115 +#: plinth/modules/dynamicdns/dynamicdns.py:118 msgid "Service type" msgstr "సేవ రకం" -#: plinth/modules/dynamicdns/dynamicdns.py:120 +#: plinth/modules/dynamicdns/dynamicdns.py:123 msgid "GnudIP Server Address" msgstr "సేవిక చిరునామా GnudIP" -#: plinth/modules/dynamicdns/dynamicdns.py:125 +#: plinth/modules/dynamicdns/dynamicdns.py:128 msgid "Invalid server name" msgstr "సేవిక పేరు చెలదు" -#: plinth/modules/dynamicdns/dynamicdns.py:128 +#: plinth/modules/dynamicdns/dynamicdns.py:131 msgid "Update URL" msgstr "URL నవీకరణ" -#: plinth/modules/dynamicdns/dynamicdns.py:132 -msgid "accept all SSL certificates" +#: plinth/modules/dynamicdns/dynamicdns.py:135 +msgid "Accept all SSL certificates" msgstr "" -#: plinth/modules/dynamicdns/dynamicdns.py:136 -msgid "use HTTP basic authentication" +#: plinth/modules/dynamicdns/dynamicdns.py:139 +#, fuzzy +#| msgid "use HTTP basic authentication" +msgid "Use HTTP basic authentication" msgstr "HTTP ప్రాథమిక ప్రమాణీకరణ ఉపయోగించు" -#: plinth/modules/dynamicdns/dynamicdns.py:148 -#: plinth/modules/networks/forms.py:118 plinth/modules/transmission/forms.py:39 +#: plinth/modules/dynamicdns/dynamicdns.py:151 +#: plinth/modules/networks/forms.py:146 plinth/modules/transmission/forms.py:39 msgid "Username" msgstr "వినియోగి పేరు" -#: plinth/modules/dynamicdns/dynamicdns.py:151 -#: plinth/modules/networks/forms.py:119 plinth/modules/transmission/forms.py:43 +#: plinth/modules/dynamicdns/dynamicdns.py:154 +#: plinth/modules/networks/forms.py:147 plinth/modules/transmission/forms.py:43 msgid "Password" msgstr "రహస్యపదం" -#: plinth/modules/dynamicdns/dynamicdns.py:154 -msgid "show password" -msgstr "రహస్యపదం చూపించు" +#: plinth/modules/dynamicdns/dynamicdns.py:157 +#: plinth/modules/networks/forms.py:149 +msgid "Show password" +msgstr "రహస్యపదం కనబర్చు" -#: plinth/modules/dynamicdns/dynamicdns.py:158 +#: plinth/modules/dynamicdns/dynamicdns.py:161 msgid "IP check URL" msgstr "IP తనిఖీ URL" -#: plinth/modules/dynamicdns/dynamicdns.py:184 +#: plinth/modules/dynamicdns/dynamicdns.py:187 msgid "Please provide update URL or a GnuDIP Server" msgstr "URL నవీకరణ దయచేసి అందించండి లేక ఒక GnuDIP సేవిక" -#: plinth/modules/dynamicdns/dynamicdns.py:187 +#: plinth/modules/dynamicdns/dynamicdns.py:190 msgid "Please provide GnuDIP username" msgstr "GnuDIPవాడుకరిపేరుని దయచేసి అందించండి" -#: plinth/modules/dynamicdns/dynamicdns.py:190 +#: plinth/modules/dynamicdns/dynamicdns.py:193 msgid "Please provide GnuDIP domain" msgstr "GnuDIP అధికారక్షేత్రం దయచేసి అందించండి" -#: plinth/modules/dynamicdns/dynamicdns.py:195 +#: plinth/modules/dynamicdns/dynamicdns.py:198 msgid "Please provide a password" msgstr "ఒక రహస్యపదం అందించండి దయచేసి" -#: plinth/modules/dynamicdns/dynamicdns.py:214 +#: plinth/modules/dynamicdns/dynamicdns.py:217 msgid "Configure Dynamic DNS" msgstr "చురుకైనDNS ఆకృతీకరించు" -#: plinth/modules/dynamicdns/dynamicdns.py:236 +#: plinth/modules/dynamicdns/dynamicdns.py:239 msgid "Status of Dynamic DNS" msgstr "చురుకైనDNS స్థితి" #: plinth/modules/dynamicdns/templates/dynamicdns.html:25 -msgid "DynamicDNS client" +#, fuzzy +#| msgid "DynamicDNS client" +msgid "Dynamic DNS Client" msgstr "చురుకైనDNS వినియోగదారుడు" #: plinth/modules/dynamicdns/templates/dynamicdns.html:28 +#, python-format msgid "" "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)." +"may find the services which are provided by %(box_name)s, such as ownCloud." msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns.html:37 @@ -565,7 +585,7 @@ msgid "" "allows you to push your current public IP address to an gnudip 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." +"Internet asks for your DNS name he will get your current IP answered." msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns.html:50 @@ -578,10 +598,10 @@ msgid "" msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns.html:61 +#, python-format msgid "" -"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." +"If your %(box_name)s is connected behind some NAT router, don't forget to " +"add port forwarding (i.e. forward some standard ports like 80 and 443)." msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns_configure.html:30 @@ -601,16 +621,18 @@ msgid "" msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:35 -msgid "Direct connection to the internet." +#, fuzzy +#| msgid "Direct connection to the internet." +msgid "Direct connection to the Internet." msgstr "అంతర్జాలిక కు నేరుగా బంధం." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:37 #, python-format msgid "" -"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)s minutes until we " -"update your DNS entry in case of WAN IP change." +"Behind NAT. This means that Dynamic DNS service will poll the \"IP check URL" +"\" for changes (the \"IP check URL\" entry is needed for this - otherwise IP " +"changes will not be detected). In case the WAN IP changes, it may take up " +"to %(timer)s minutes until your DNS entry is updated." msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:48 @@ -626,14 +648,14 @@ msgstr "ఫైర్వాల్" #: plinth/modules/firewall/templates/firewall.html:28 #, python-format msgid "" -"Firewall is a network security system that controls the incoming and " -"outgoing network traffic on your %(box_name)s. Keeping a firewall enabled " -"and properly configured reduces risk of security threat from the Internet." +"Firewall is a security system that controls the incoming and outgoing " +"network traffic on your %(box_name)s. Keeping a firewall enabled and " +"properly configured reduces risk of security threat from the Internet." msgstr "" #: plinth/modules/firewall/templates/firewall.html:36 -msgid "The following is the current status:" -msgstr "ఇది ప్రస్తుత స్థితి:" +msgid "Current status:" +msgstr "" #: plinth/modules/firewall/templates/firewall.html:41 #, python-format @@ -649,11 +671,13 @@ msgid "Service/Port" msgstr "సేవ / పోర్ట్" #: plinth/modules/firewall/templates/firewall.html:67 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:91 #: plinth/modules/names/templates/names.html:51 msgid "Enabled" msgstr "క్రియాశీలీ" #: plinth/modules/firewall/templates/firewall.html:70 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:93 #: plinth/modules/names/templates/names.html:53 msgid "Disabled" msgstr "నిరుపయోగ" @@ -677,8 +701,8 @@ msgstr "నిరోధించు" #: plinth/modules/firewall/templates/firewall.html:103 msgid "" "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." +"also permitted in the firewall and when you disable a service it is also " +"disabled in the firewall." msgstr "" #: plinth/modules/first_boot/forms.py:48 plinth/modules/users/forms.py:70 @@ -693,31 +717,37 @@ msgstr "" msgid "User account created, you are now logged in" msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state0.html:50 -msgid "Congratulations! Your FreedomBox is up and running!" -msgstr "" +#: plinth/modules/first_boot/templates/firstboot_navbar.html:23 +#: plinth/modules/help/templates/help_index.html:25 +#: plinth/templates/base.html:102 +msgid "Help" +msgstr "సహాయం" + +#: plinth/modules/first_boot/templates/firstboot_state0.html:45 +#, fuzzy +#| msgid "Start setup" +msgid "Start Setup" +msgstr "అమర్చిపెట్టు ప్రారంభం" -#: plinth/modules/first_boot/templates/firstboot_state0.html:54 +#: plinth/modules/first_boot/templates/firstboot_state0.html:49 +#, python-format msgid "" -"Please provide the following basic information to complete the setup process." +"To complete the setup of your %(box_name)s, please provide some basic " +"information." msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state0.html:62 -msgid "Next" -msgstr "తర్వాత" - -#: plinth/modules/first_boot/templates/firstboot_state1.html:39 +#: plinth/modules/first_boot/templates/firstboot_state1.html:41 msgid "Administrator Account" msgstr "నిర్వాహక ఖాతా" -#: plinth/modules/first_boot/templates/firstboot_state1.html:42 +#: plinth/modules/first_boot/templates/firstboot_state1.html:44 msgid "" "Choose a username and password to access this web interface. The password " "can be changed later. This user will be granted administrative privileges. " "Other users can be added later." msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state1.html:55 +#: plinth/modules/first_boot/templates/firstboot_state1.html:57 msgid "Box it up!" msgstr "ఇది పెట్టెపైకి!" @@ -726,30 +756,33 @@ msgid "Setup Complete!" msgstr "అమరక పూర్తయ్యింది!" #: plinth/modules/first_boot/templates/firstboot_state10.html:32 +#, python-format msgid "" -"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." +"%(box_name)s setup is now complete. To make your %(box_name)s functional, " +"you need some applications. They will be installed the first time you " +"access them." msgstr "" -#: plinth/modules/first_boot/templates/firstboot_state10.html:40 -msgid "" -"To make your FreedomBox functional, you need some applications. " -"Applications will be installed the first time you access them." -msgstr "" +#: plinth/modules/first_boot/templates/firstboot_state10.html:41 +msgid "Go to Apps" +msgstr "అనువర్తనాల వైపు వెళ్ళండి" -#: plinth/modules/first_boot/templates/firstboot_state10.html:47 -msgid "Network Configuration" +#: plinth/modules/first_boot/templates/firstboot_state10.html:44 +#, fuzzy +#| msgid "Network Configuration" +msgid "Current Network Configuration" msgstr "అల్లిక రూపకరణ" -#: plinth/modules/first_boot/templates/firstboot_state10.html:54 +#: plinth/modules/first_boot/templates/firstboot_state10.html:47 +msgid "" +"You should check the network setup and modify it if necessary. Do not forget " +"to change the default Wi-Fi passwords!" +msgstr "" + +#: plinth/modules/first_boot/templates/firstboot_state10.html:57 msgid "Go to Networks" msgstr "అల్లిక వైపు వెళ్ళండి" -#: plinth/modules/first_boot/templates/firstboot_state10.html:59 -msgid "Go to Apps" -msgstr "అనువర్తనాల వైపు వెళ్ళండి" - #: plinth/modules/first_boot/views.py:60 msgid "Setup Complete" msgstr "అమరక పూర్తయ్యింది" @@ -762,9 +795,9 @@ msgstr "పత్రరచన" msgid "Where to Get Help" msgstr "సహాయాం ఎక్కడ పొందగలం" -#: plinth/modules/help/help.py:38 plinth/modules/help/help.py:72 -msgid "FreedomBox Manual" -msgstr "ఫ్రీడమ్ బాక్స్ నిర్దేశిక" +#: plinth/modules/help/help.py:38 +msgid "Manual" +msgstr "" #: plinth/modules/help/help.py:48 msgid "Documentation and FAQ" @@ -775,15 +808,22 @@ msgstr "పత్రరచన మరియు తరచుగా అడుగు msgid "About {box_name}" msgstr "{box_name} గురించి" +#: plinth/modules/help/help.py:73 +#, fuzzy, python-brace-format +#| msgid "About {box_name}" +msgid "{box_name} Manual" +msgstr "{box_name} గురించి" + #: plinth/modules/help/templates/help_about.html:30 +#, python-format msgid "" -"FreedomBox is a community project to develop, design and promote personal " +"%(box_name)s 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." +"and a Tor relay, on a device that can replace your Wi-Fi router, so that " +"your data stays with you." msgstr "" #: plinth/modules/help/templates/help_about.html:43 @@ -797,68 +837,82 @@ msgid "" msgstr "" #: plinth/modules/help/templates/help_about.html:56 +#, python-format msgid "" "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." +"services; %(box_name)s aims to bring them all together in a convenient " +"package." msgstr "" #: plinth/modules/help/templates/help_about.html:64 +#, python-format msgid "" -"For more information about the FreedomBox project, see the FreedomBox Wiki." +"For more information about the %(box_name)s project, see the %(box_name)s Wiki." msgstr "" -#: plinth/modules/help/templates/help_about.html:72 +#: plinth/modules/help/templates/help_about.html:73 msgid "Learn more »" msgstr "" -#: plinth/modules/help/templates/help_about.html:75 +#: plinth/modules/help/templates/help_about.html:76 #, python-format msgid "You are running Plinth version %(version)s." msgstr "" -#: plinth/modules/help/templates/help_index.html:25 -#: plinth/templates/base.html:98 -msgid "Help" -msgstr "సహాయం" +#: plinth/modules/help/templates/help_base.html:36 +#, python-format +msgid "%(box_name)s Setup" +msgstr "" #: plinth/modules/help/templates/help_index.html:29 #, python-format msgid "" -"The FreedomBox Manual is the best place to " +"The %(box_name)s Manual is the best place to " "start for information regarding %(box_name)s." msgstr "" #: plinth/modules/help/templates/help_index.html:36 +#, python-format msgid "" -" FreedomBox " -"project wiki contains further information." +" " +"%(box_name)s project wiki contains further information." msgstr "" #: plinth/modules/help/templates/help_index.html:43 +#, python-format msgid "" -"To seek help from FreedomBox community, queries may be posted on the " -"mailing list. The list archives also contain information about problems " -"faced by other users and possible solutions." +"To seek help from %(box_name)s community, queries may be posted on the mailing list. The list archives also contain information about " +"problems faced by other users and possible solutions." msgstr "" #: plinth/modules/help/templates/help_index.html:53 +#, python-format msgid "" -"Many FreedomBox contributors and users are also available on the #freedombox " -"channel of the irc.oftc.net IRC network." +"Many %(box_name)s contributors and users are also available on the irc.oftc." +"net IRC network. Join and request help on the #freedombox " +"channel using the IRC web interface." msgstr "" #: plinth/modules/ikiwiki/__init__.py:38 -msgid "Wiki & Blog (Ikiwiki)" +#, fuzzy +#| msgid "Wiki & Blog (Ikiwiki)" +msgid "Wiki and Blog (ikiwiki)" msgstr "వికీ&బ్లాగ్ (Ikiwiki)" #: plinth/modules/ikiwiki/__init__.py:43 -msgid "Ikiwiki wikis and blogs" +#, fuzzy +#| msgid "Ikiwiki wikis and blogs" +msgid "ikiwiki wikis and blogs" msgstr "వికీలు మరియు బ్లాగ్ లు Ikiwik" #: plinth/modules/ikiwiki/forms.py:29 -msgid "Enable Ikiwiki" +#, fuzzy +#| msgid "Enable Ikiwiki" +msgid "Enable ikiwiki" msgstr "Ikiwiki అమలుచెయ్యి" #: plinth/modules/ikiwiki/forms.py:36 @@ -886,22 +940,24 @@ msgid "" msgstr "" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:27 -#, python-format -msgid "Delete Wiki/Blog %(name)s" -msgstr "" +#, fuzzy, python-format +#| msgid "Delete Connection %(name)s" +msgid "Delete Wiki or Blog %(name)s" +msgstr "అనుసంధానం తొలగించు %(name)s" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:33 msgid "" "This action will remove all the posts, pages and comments including revision " -"history. Delete this wiki/blog permanently?" +"history. Delete this wiki or blog permanently?" msgstr "" -#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:43 +#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:44 #, python-format msgid "Delete %(name)s" msgstr "తొలగించు %(name)s" -#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:46 +#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:47 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:60 #: plinth/modules/networks/templates/connections_delete.html:41 #: plinth/modules/users/templates/users_delete.html:41 msgid "Cancel" @@ -934,7 +990,9 @@ msgid "Create" msgstr "సృష్టించు" #: plinth/modules/ikiwiki/views.py:73 -msgid "Wiki & Blog" +#, fuzzy +#| msgid "Wiki & Blog" +msgid "Wiki and Blog" msgstr "వికీ & బ్లాగ్" #: plinth/modules/ikiwiki/views.py:106 @@ -942,8 +1000,10 @@ msgid "Manage Wikis and Blogs" msgstr "వికీ మరియు బ్లాగ్ నిర్వహించండి" #: plinth/modules/ikiwiki/views.py:132 -msgid "Create Wiki/Blog" -msgstr "వికీ/బ్లాగ్ సృష్టించు" +#, fuzzy +#| msgid "Create a Wiki or Blog" +msgid "Create Wiki or Blog" +msgstr "ఒక వికీ లేదా బ్లాగ్ సృష్టించు" #: plinth/modules/ikiwiki/views.py:145 #, python-brace-format @@ -976,9 +1036,154 @@ msgid "Could not delete {name}: {error}" msgstr "తొలగిమంచలేము {name}: {error}" #: plinth/modules/ikiwiki/views.py:182 -msgid "Delete Wiki/Blog" +#, fuzzy +#| msgid "Delete Wiki/Blog" +msgid "Delete Wiki or Blog" msgstr "వికీ/బ్లాగ్ తొలగించు" +#: plinth/modules/letsencrypt/__init__.py:43 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:38 +#: plinth/modules/letsencrypt/views.py:45 +msgid "Certificates (Let's Encrypt)" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:41 +#, python-format +msgid "" +"A digital certficate allows users of a web service to verify the identity of " +"the service and to securely communicate with it. %(box_name)s can " +"automatically obtain and setup digital certificates for each available " +"domain. It does so by proving itself to be the owner of a domain to Let's " +"Encrypt, a certficate authority (CA)." +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:52 +msgid "" +"Let's Encrypt is a free, automated, and open certificate authority, run for " +"the public’s benefit by the Internet Security Research Group (ISRG). Please " +"read and agree with the Let's Encrypt Subscriber Agreement before using this service." +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:66 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:70 +#, fuzzy +#| msgid "Domain Name" +msgid "Domain" +msgstr "అధికారక్షేత్రం పేరు" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:67 +msgid "Certificate Status" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:68 +#, fuzzy +#| msgid "Security" +msgid "Website Security" +msgstr "భద్రత" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:69 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:72 +#, fuzzy +#| msgid "Applications" +msgid "Actions" +msgstr "అనువర్తనాలు" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:79 +#, python-format +msgid "Expires on %(expiry_date)s" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:85 +msgid "No certficate" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:102 +msgid "Revoke" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:108 +msgid "Re-obtain" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:115 +msgid "Obtain" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:55 +#, python-brace-format +msgid "Certificate successfully revoked for domain {domain}" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:60 +#, python-brace-format +msgid "Failed to revoke certificate for domain {domain}: {error}" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:72 +#, python-brace-format +msgid "Certificate successfully obtained for domain {domain}" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:77 +#, python-brace-format +msgid "Failed to obtain certificate for domain {domain}: {error}" +msgstr "" + +#: plinth/modules/monkeysphere/__init__.py:32 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:35 +#: plinth/modules/monkeysphere/views.py:44 +msgid "Monkeysphere" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:38 +msgid "" +"With Monkeysphere, a PGP key can be generated for each configured domain " +"serving SSH. The PGP public key can then be uploaded to the PGP keyservers. " +"Users connecting to this machine through SSH can verify that they are " +"connecting to the correct host. For users to trust the key, at least one " +"person (usually the machine owner) must sign the key using the regular PGP " +"key signing process. See the Monkeysphere SSH documentation for more details." +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:53 +msgid "Publishing key to keyserver..." +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:71 +msgid "GPG Fingerprint" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:83 +#: plinth/modules/names/views.py:45 +msgid "Not Available" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:93 +msgid "Generate PGP Key" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:101 +msgid "Publish Key" +msgstr "" + +#: plinth/modules/monkeysphere/views.py:58 +msgid "Generated PGP key." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:83 +msgid "Cancelled key publishing." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:120 +msgid "Published key to keyserver." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:122 +msgid "Error occurred while publishing key." +msgstr "" + #: plinth/modules/mumble/__init__.py:38 #: plinth/modules/mumble/templates/mumble.html:26 #: plinth/modules/mumble/views.py:58 @@ -1014,174 +1219,155 @@ msgstr "మంబ్లు సేవిక నడుస్తుంది" msgid "Mumble server is not running" msgstr "మంబ్లు సేవిక నడవంలేదు" -#: plinth/modules/names/__init__.py:30 +#: plinth/modules/names/__init__.py:29 msgid "HTTP" msgstr "" -#: plinth/modules/names/__init__.py:31 +#: plinth/modules/names/__init__.py:30 msgid "HTTPS" msgstr "" -#: plinth/modules/names/__init__.py:32 +#: plinth/modules/names/__init__.py:31 msgid "SSH" msgstr "" -#: plinth/modules/names/__init__.py:46 plinth/modules/names/views.py:34 +#: plinth/modules/names/__init__.py:45 plinth/modules/names/views.py:34 msgid "Name Services" msgstr "" -#: plinth/modules/names/__init__.py:107 -msgid "Not Available" -msgstr "" - #: plinth/modules/networks/__init__.py:108 #, python-brace-format msgid "Using DNSSEC on IPv{kind}" msgstr "IPv{kind} పై DNSSEC ఉపయోగించు" #: plinth/modules/networks/forms.py:30 -msgid "-- select --" -msgstr "--ఎంచుకొ--" - -#: plinth/modules/networks/forms.py:42 msgid "Connection Type" msgstr "సంధాన రకం" -#: plinth/modules/networks/forms.py:49 plinth/modules/networks/forms.py:106 -#: plinth/modules/networks/forms.py:133 +#: plinth/modules/networks/forms.py:37 msgid "Connection Name" msgstr "సంధాన పేరు" -#: plinth/modules/networks/forms.py:51 plinth/modules/networks/forms.py:108 -#: plinth/modules/networks/forms.py:135 +#: plinth/modules/networks/forms.py:39 msgid "Physical Interface" msgstr "శారీరక సంవిధానం" -#: plinth/modules/networks/forms.py:53 plinth/modules/networks/forms.py:110 -#: plinth/modules/networks/forms.py:137 +#: plinth/modules/networks/forms.py:41 msgid "The network device that this connection should be bound to." msgstr "" -#: plinth/modules/networks/forms.py:56 plinth/modules/networks/forms.py:113 -#: plinth/modules/networks/forms.py:140 +#: plinth/modules/networks/forms.py:44 msgid "Firewall Zone" msgstr "ఫైర్వాల్ క్షేత్రాం" -#: plinth/modules/networks/forms.py:57 plinth/modules/networks/forms.py:114 -#: plinth/modules/networks/forms.py:141 +#: plinth/modules/networks/forms.py:45 msgid "" "The firewall zone will control which services are available over this " "interfaces. Select Internal only for trusted networks." msgstr "" -#: plinth/modules/networks/forms.py:61 plinth/modules/networks/forms.py:162 +#: plinth/modules/networks/forms.py:49 msgid "IPv4 Addressing Method" msgstr "IPv4 చిరునామాయిచు పద్దతి" -#: plinth/modules/networks/forms.py:62 +#: plinth/modules/networks/forms.py:50 msgid "" "\"Shared\" method will start a DHCP server and \"Automatic\" method will " "acquire configuration from a DHCP server." msgstr "" -#: plinth/modules/networks/forms.py:68 plinth/modules/networks/forms.py:170 +#: plinth/modules/networks/forms.py:56 msgid "Address" msgstr "చిరునామా" -#: plinth/modules/networks/forms.py:72 plinth/modules/networks/forms.py:174 +#: plinth/modules/networks/forms.py:60 msgid "Netmask" msgstr "" -#: plinth/modules/networks/forms.py:73 plinth/modules/networks/forms.py:175 +#: plinth/modules/networks/forms.py:61 msgid "" "Optional value. If left blank, a default netmask based on the address will " "be used." msgstr "" -#: plinth/modules/networks/forms.py:78 plinth/modules/networks/forms.py:180 +#: plinth/modules/networks/forms.py:66 #: plinth/modules/networks/templates/connection_show.html:202 #: plinth/modules/networks/templates/connection_show.html:241 msgid "Gateway" msgstr "గేట్వే" -#: plinth/modules/networks/forms.py:79 plinth/modules/networks/forms.py:181 +#: plinth/modules/networks/forms.py:67 msgid "Optional value." msgstr "" -#: plinth/modules/networks/forms.py:83 plinth/modules/networks/forms.py:185 +#: plinth/modules/networks/forms.py:71 #, fuzzy #| msgid "DNS server" msgid "DNS Server" msgstr "సేవిక" -#: plinth/modules/networks/forms.py:84 plinth/modules/networks/forms.py:186 +#: plinth/modules/networks/forms.py:72 msgid "" "Optional value. If this value is given and IPv4 addressing method is " "\"Automatic\", the DNS Servers provided by a DHCP server will be ignored." msgstr "" -#: plinth/modules/networks/forms.py:90 plinth/modules/networks/forms.py:192 +#: plinth/modules/networks/forms.py:78 #, fuzzy #| msgid "DNS server" msgid "Second DNS Server" msgstr "సేవిక" -#: plinth/modules/networks/forms.py:91 plinth/modules/networks/forms.py:193 +#: plinth/modules/networks/forms.py:79 msgid "" "Optional value. If this value is given and IPv4 Addressing Method is " "\"Automatic\", the DNS Servers provided by a DHCP server will be ignored." msgstr "" -#: plinth/modules/networks/forms.py:121 -msgid "Show password" -msgstr "రహస్యపదం కనబర్చు" +#: plinth/modules/networks/forms.py:89 +msgid "-- select --" +msgstr "--ఎంచుకొ--" -#: plinth/modules/networks/forms.py:145 +#: plinth/modules/networks/forms.py:175 #: plinth/modules/networks/templates/connection_show.html:144 msgid "SSID" msgstr "SSID" -#: plinth/modules/networks/forms.py:146 +#: plinth/modules/networks/forms.py:176 msgid "The visible name of the network." msgstr "అల్లిక యొక్క కనిపించే పేరు." -#: plinth/modules/networks/forms.py:148 +#: plinth/modules/networks/forms.py:178 #: plinth/modules/networks/templates/connection_show.html:157 msgid "Mode" msgstr "విధం" -#: plinth/modules/networks/forms.py:153 +#: plinth/modules/networks/forms.py:183 msgid "Authentication Mode" msgstr "ప్రామాణీకరణ విధం" -#: plinth/modules/networks/forms.py:154 +#: plinth/modules/networks/forms.py:184 msgid "" "Select WPA if the wireless network is secured and requires clients to have " "the password to connect." msgstr "" -#: plinth/modules/networks/forms.py:158 +#: plinth/modules/networks/forms.py:188 msgid "Passphrase" msgstr "రహస్య పదం" -#: plinth/modules/networks/forms.py:166 -msgid "" -"Select Automatic (DHCP) if you are connecting to an existing wireless " -"network. Shared mode is useful when running an Access Point." -msgstr "" - #: plinth/modules/networks/networks.py:36 #: plinth/modules/networks/networks.py:56 msgid "Network Connections" msgstr "అల్లిక అనుసంధానములు" #: plinth/modules/networks/networks.py:38 -#: plinth/modules/networks/networks.py:273 +#: plinth/modules/networks/networks.py:242 msgid "Nearby Wi-Fi Networks" msgstr "సమీపంలో Wi-Fi అల్లిక" #: plinth/modules/networks/networks.py:40 -#: plinth/modules/networks/networks.py:295 +#: plinth/modules/networks/networks.py:264 msgid "Add Connection" msgstr "అనుసంధానం జతచేయుండి" @@ -1205,58 +1391,58 @@ msgstr "దొరకలేదు అనుసంధానం: అనుసంధ msgid "This type of connection is not yet understood." msgstr "అనుసంధాన రకం ఇంకా అర్థంకాలేదు." -#: plinth/modules/networks/networks.py:170 -#: plinth/modules/networks/networks.py:229 +#: plinth/modules/networks/networks.py:139 +#: plinth/modules/networks/networks.py:198 #: plinth/modules/networks/templates/connections_edit.html:34 msgid "Edit Connection" msgstr "అనుసంధానని సవరించడం" -#: plinth/modules/networks/networks.py:240 +#: plinth/modules/networks/networks.py:209 #, python-brace-format msgid "Activated connection {name}." msgstr "అనుసంధానం ఉత్తేజపరిచింది {name}." -#: plinth/modules/networks/networks.py:243 +#: plinth/modules/networks/networks.py:212 msgid "Failed to activate connection: Connection not found." msgstr "అనుసంధానాన్ని ఉత్తేజపరచటంలొ విఫలమైంది: అనుసంధానం దొరకలేదు." -#: plinth/modules/networks/networks.py:247 +#: plinth/modules/networks/networks.py:216 #, python-brace-format msgid "Failed to activate connection {name}: No suitable device is available." msgstr "అనుసంధానాన్ని ఉత్తేజపరచటంలొ విఫలమైంది {name}: సరైన పరికరం అందుబాటులో లేదు." -#: plinth/modules/networks/networks.py:260 +#: plinth/modules/networks/networks.py:229 #, python-brace-format msgid "Deactivated connection {name}." msgstr "క్రియారహిత అనుసంధానం {name}." -#: plinth/modules/networks/networks.py:263 +#: plinth/modules/networks/networks.py:232 msgid "Failed to de-activate connection: Connection not found." msgstr "అనుసంధానం క్రియారహితం విఫలమైంది: కనెక్షన్ దొరకలేదు." -#: plinth/modules/networks/networks.py:325 +#: plinth/modules/networks/networks.py:282 msgid "Adding New Ethernet Connection" msgstr "కొత్త ఈథర్నెట్ అనుసంధానన్ని కలుపుతోంది" -#: plinth/modules/networks/networks.py:350 +#: plinth/modules/networks/networks.py:300 msgid "Adding New PPPoE Connection" msgstr "కొత్త PPPoE అనుసంధానన్ని కలుపుతోంది" -#: plinth/modules/networks/networks.py:399 +#: plinth/modules/networks/networks.py:332 msgid "Adding New Wi-Fi Connection" msgstr "కొత్త Wi-Fi అనుసంధానన్ని కలుపుతోంది" -#: plinth/modules/networks/networks.py:413 +#: plinth/modules/networks/networks.py:346 #, python-brace-format msgid "Connection {name} deleted." msgstr "అనుసంధానం {name} తొలగించారు." -#: plinth/modules/networks/networks.py:416 -#: plinth/modules/networks/networks.py:425 +#: plinth/modules/networks/networks.py:349 +#: plinth/modules/networks/networks.py:358 msgid "Failed to delete connection: Connection not found." msgstr "అనుసంధానం తొలగించడం విఫలమైంది: అనుసంధానం దొరకలేదు." -#: plinth/modules/networks/networks.py:430 +#: plinth/modules/networks/networks.py:363 #: plinth/modules/networks/templates/connections_delete.html:26 msgid "Delete Connection" msgstr "అనుసంధానం తొలగించారు" @@ -1266,7 +1452,7 @@ msgid "Edit connection" msgstr "అనుసంధానన్ని సవరించు" #: plinth/modules/networks/templates/connection_show.html:43 -#: plinth/templates/base.html:119 +#: plinth/templates/base.html:123 msgid "Edit" msgstr "సవరించు" @@ -1413,23 +1599,24 @@ msgstr "ఫైర్వాల్ క్షేత్రాం" #: plinth/modules/networks/templates/connection_show.html:280 msgid "" -"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." +"This interface should be connected to a 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." msgstr "" #: plinth/modules/networks/templates/connection_show.html:300 msgid "" -"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." +"This interface should receive your Internet connection. If you connect it to " +"a local network/machine, many services meant to available only internally " +"will not be available." msgstr "" #: plinth/modules/networks/templates/connection_show.html:319 +#, python-format msgid "" -"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 " +"This interface is not maintained by %(box_name)s. Its security status is " +"unknown to %(box_name)s. Many %(box_name)s services may not be available on " +"this interface. It is recommended that you deactivate or delete this " "connection and re-configure it." msgstr "" @@ -1522,7 +1709,7 @@ msgstr "సేవిక తెరవండిVPN అమలుచెయ్యి" #, python-format msgid "" "Virtual Private Network (VPN) is a technique for securely connecting two " -"machines in order to access resources of a private network. While you are " +"devices in order to access resources of a private network. While you are " "away from home, you can connect to your %(box_name)s in order to join your " "home network and access private/internal services provided by %(box_name)s. " "You can also access the rest of the Internet via %(box_name)s for added " @@ -1539,7 +1726,7 @@ msgid "" "To connect to %(box_name)s'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 documentation on recommended clients and instructions on how to " "configure them." msgstr "" @@ -2021,6 +2208,64 @@ msgstr "మంబ్లు సేవిక నడుస్తుంది" msgid "Quassel core service is not running" msgstr "మంబ్లు సేవిక నడవంలేదు" +#: plinth/modules/repro/__init__.py:36 +#: plinth/modules/repro/templates/repro.html:26 +#: plinth/modules/repro/views.py:55 +#, fuzzy +#| msgid "GnudIP Server Address" +msgid "SIP Server (repro)" +msgstr "సేవిక చిరునామా GnudIP" + +#: plinth/modules/repro/__init__.py:41 +#, fuzzy +#| msgid "DNS server" +msgid "repro SIP Server" +msgstr "సేవిక" + +#: plinth/modules/repro/forms.py:29 +#, fuzzy +#| msgid "Enable OpenVPN server" +msgid "Enable repro service" +msgstr "సేవిక తెరవండిVPN అమలుచెయ్యి" + +#: plinth/modules/repro/templates/repro.html:29 +msgid "" +"repro provides various SIP services that a SIP softphone can utilize to " +"provide audio and video calls as well as presence and instant messaging. " +"repro provides a server and SIP user accounts that clients can use to let " +"their presence known. It also acts as a proxy to federate SIP " +"communications to other servers on the Internet similar to email." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:39 +msgid "" +"To make SIP calls, a client application is needed. Available clients include " +"Jitsi (for computers) and CSipSimple (for Android phones)." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:48 +msgid "" +"Note: Before using repro, domains and users will need to " +"be configured using the web-based " +"configuration panel. Users in the admin group will be able to " +"log in to the repro configuration panel. After setting the domain, it is " +"required to restart the repro service. Disable the service and re-enable it." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:63 +#, fuzzy +#| msgid "Mumble server is running" +msgid "repro service is running" +msgstr "మంబ్లు సేవిక నడుస్తుంది" + +#: plinth/modules/repro/templates/repro.html:66 +#, fuzzy +#| msgid "Mumble server is not running" +msgid "repro service is not running" +msgstr "మంబ్లు సేవిక నడవంలేదు" + #: plinth/modules/restore/__init__.py:36 #: plinth/modules/restore/templates/restore_index.html:26 #: plinth/modules/restore/views.py:46 @@ -2041,8 +2286,8 @@ msgid "" "reStore is a server for unhosted web " "applications. The idea is to uncouple web applications from data. No " "matter where a web application is served from, the data can be stored on an " -"unhosted storage server of user's choice. With reStore, your " -"%(cfg.box_name)s becomes your unhosted storage server." +"unhosted storage server of user's choice. With reStore, your %(box_name)s " +"becomes your unhosted storage server." msgstr "" #: plinth/modules/restore/templates/restore_index.html:40 @@ -2119,7 +2364,7 @@ msgstr "" #: plinth/modules/system/system.py:33 #: plinth/modules/system/templates/system.html:25 -#: plinth/templates/base.html:105 +#: plinth/templates/base.html:109 msgid "System Configuration" msgstr "" @@ -2134,33 +2379,73 @@ msgid "" "The options affect the %(box_name)s at its most general level, so be careful!" msgstr "" -#: plinth/modules/tor/__init__.py:50 -msgid "Tor relay port available" +#: plinth/modules/tor/__init__.py:48 plinth/modules/tor/templates/tor.html:35 +msgid "Anonymity Network (Tor)" msgstr "" +#: plinth/modules/tor/__init__.py:53 +#, fuzzy +#| msgid "Go to Networks" +msgid "Tor Anonymity Network" +msgstr "అల్లిక వైపు వెళ్ళండి" + #: plinth/modules/tor/__init__.py:58 +msgid "Tor Bridge Relay" +msgstr "" + +#: plinth/modules/tor/__init__.py:76 plinth/modules/tor/views.py:144 +msgid "Tor Hidden Service" +msgstr "" + +#: plinth/modules/tor/__init__.py:222 +msgid "Tor relay port available" +msgstr "" + +#: plinth/modules/tor/__init__.py:230 msgid "Obfs3 transport registered" msgstr "" -#: plinth/modules/tor/__init__.py:64 +#: plinth/modules/tor/__init__.py:236 msgid "Obfs4 transport registered" msgstr "" -#: plinth/modules/tor/__init__.py:101 +#: plinth/modules/tor/__init__.py:273 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "" -#: plinth/modules/tor/__init__.py:112 +#: plinth/modules/tor/__init__.py:284 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "" -#: plinth/modules/tor/templates/tor.html:26 plinth/modules/tor/tor.py:66 -msgid "Anonymity Network (Tor)" +#: plinth/modules/tor/forms.py:32 +msgid "Enable Tor" +msgstr "" + +#: plinth/modules/tor/forms.py:35 +msgid "Enable Tor Hidden Service" +msgstr "" + +#: plinth/modules/tor/forms.py:38 +#, python-brace-format +msgid "" +"A hidden service will allow {box_name} to provide selected services (such as " +"ownCloud or chat) without revealing its location." +msgstr "" + +#: plinth/modules/tor/forms.py:42 +msgid "Download software packages over Tor" +msgstr "" + +#: plinth/modules/tor/forms.py:44 +msgid "" +"When enabled, software will be downloaded over the Tor network for " +"installations and upgrades. This adds a degree of privacy and security " +"during software downloads." msgstr "" -#: plinth/modules/tor/templates/tor.html:29 +#: plinth/modules/tor/templates/tor.html:38 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -2169,28 +2454,34 @@ msgid "" "Tor Browser." msgstr "" -#: plinth/modules/tor/templates/tor.html:44 +#: plinth/modules/tor/templates/tor.html:54 +#, fuzzy +#| msgid "Configuration updated" +msgid "Tor configuration is being updated" +msgstr "ఆకృతీకరణ తాజాపరుచింది" + +#: plinth/modules/tor/templates/tor.html:62 msgid "Tor is running" msgstr "" -#: plinth/modules/tor/templates/tor.html:47 +#: plinth/modules/tor/templates/tor.html:65 msgid "Tor is not running" msgstr "" -#: plinth/modules/tor/templates/tor.html:59 +#: plinth/modules/tor/templates/tor.html:77 msgid "Hidden Service" msgstr "" -#: plinth/modules/tor/templates/tor.html:60 -#: plinth/modules/tor/templates/tor.html:102 +#: plinth/modules/tor/templates/tor.html:78 +#: plinth/modules/tor/templates/tor.html:120 msgid "Port" msgstr "" -#: plinth/modules/tor/templates/tor.html:85 +#: plinth/modules/tor/templates/tor.html:103 msgid "Bridge" msgstr "" -#: plinth/modules/tor/templates/tor.html:88 +#: plinth/modules/tor/templates/tor.html:106 #, python-format msgid "" "Your %(box_name)s is configured as a Tor bridge with obfsproxy, so it can " @@ -2199,84 +2490,41 @@ msgid "" "forwarded, if necessary:" msgstr "" -#: plinth/modules/tor/templates/tor.html:101 +#: plinth/modules/tor/templates/tor.html:119 msgid "Service" msgstr "" -#: plinth/modules/tor/templates/tor.html:117 +#: plinth/modules/tor/templates/tor.html:135 msgid "SOCKS" msgstr "" -#: plinth/modules/tor/templates/tor.html:120 +#: plinth/modules/tor/templates/tor.html:138 #, python-format msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "" -#: plinth/modules/tor/tor.py:46 -msgid "Enable Tor" -msgstr "" - -#: plinth/modules/tor/tor.py:49 -msgid "Enable Tor Hidden Service" -msgstr "" - -#: plinth/modules/tor/tor.py:51 -msgid "" -"A hidden service will allow FreedomBox to provide selected services (such as " -"ownCloud or Chat) without revealing its location." -msgstr "" - -#: plinth/modules/tor/tor.py:55 -msgid "Download software packages over Tor" -msgstr "" - -#: plinth/modules/tor/tor.py:57 -msgid "" -"When enabled, software will be downloaded over the Tor network for " -"installations and upgrades. This adds a degree of privacy and security " -"during software downloads." -msgstr "" - -#: plinth/modules/tor/tor.py:85 plinth/modules/tor/tor.py:285 -msgid "Tor Hidden Service" -msgstr "" - -#: plinth/modules/tor/tor.py:115 +#: plinth/modules/tor/views.py:68 msgid "Tor Control Panel" msgstr "" -#: plinth/modules/tor/tor.py:240 +#: plinth/modules/tor/views.py:79 #, python-brace-format msgid "Action error: {0} [{1}] [{2}]" msgstr "" -#: plinth/modules/tor/tor.py:256 -msgid "Tor enabled" -msgstr "" - -#: plinth/modules/tor/tor.py:259 -msgid "Tor disabled" -msgstr "" - -#: plinth/modules/tor/tor.py:264 -msgid "Tor hidden service enabled" -msgstr "" - -#: plinth/modules/tor/tor.py:267 -msgid "Tor hidden service disabled" -msgstr "" - -#: plinth/modules/tor/tor.py:292 -msgid "Enabled package download over Tor" -msgstr "" +#: plinth/modules/tor/views.py:148 +#, fuzzy +#| msgid "Configuration updated" +msgid "Configuration updated." +msgstr "ఆకృతీకరణ తాజాపరుచింది" -#: plinth/modules/tor/tor.py:295 -msgid "Disabled package download over Tor" +#: plinth/modules/tor/views.py:150 +msgid "An error occurred during configuration." msgstr "" #: plinth/modules/transmission/__init__.py:38 #: plinth/modules/transmission/templates/transmission.html:26 -#: plinth/modules/transmission/views.py:63 +#: plinth/modules/transmission/views.py:67 msgid "BitTorrent (Transmission)" msgstr "" @@ -2344,70 +2592,68 @@ msgid "" "will attempt to perform any package upgrades that are available." msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:40 -msgid "There was an error while upgrading." +#: plinth/modules/upgrades/templates/upgrades.html:37 +msgid "" +"Upgrades install the latest software and security updates. When automatic " +"upgrades are enabled, upgrades are automatically run every night. You don't " +"normally need to start the upgrade process." msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:43 -#: plinth/modules/upgrades/templates/upgrades.html:59 -msgid "Output from unattended-upgrades:" +#: plinth/modules/upgrades/templates/upgrades.html:45 +msgid "" +"Depending on the number of packages to install, this may take a long time to " +"complete. While upgrades are in progress, you will not be able to install " +"other packages. During the upgrade, this web interface may be temporarily " +"unavailable and show an error. Refresh the page to continue." msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:50 -msgid "The operating system is up to date now.  " +#: plinth/modules/upgrades/templates/upgrades.html:58 +msgid "Upgrade now »" msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:53 -msgid "Show Details" +#: plinth/modules/upgrades/templates/upgrades.html:65 +msgid "A package manager is running." msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:69 -msgid "" -"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." +#: plinth/modules/upgrades/templates/upgrades.html:70 +msgid "Recent log from upgrades:" msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:80 -msgid "Upgrade now »" +#: plinth/modules/upgrades/views.py:36 plinth/modules/upgrades/views.py:66 +msgid "Automatic Upgrades" msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:87 -msgid "System is being upgraded." +#: plinth/modules/upgrades/views.py:38 +msgid "Upgrade Packages" msgstr "" -#: plinth/modules/upgrades/views.py:35 plinth/modules/upgrades/views.py:64 -msgid "Automatic Upgrades" +#: plinth/modules/upgrades/views.py:96 +msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:37 -msgid "Upgrade Packages" -msgstr "" +#: plinth/modules/upgrades/views.py:99 +#, fuzzy +#| msgid "Setup failed." +msgid "Starting upgrade failed." +msgstr "అమరక విఫలమైంది." -#: plinth/modules/upgrades/views.py:75 +#: plinth/modules/upgrades/views.py:102 msgid "Package Upgrades" msgstr "" -#: plinth/modules/upgrades/views.py:116 +#: plinth/modules/upgrades/views.py:131 #, python-brace-format msgid "Error when configuring unattended-upgrades: {error}" msgstr "" -#: plinth/modules/upgrades/views.py:121 +#: plinth/modules/upgrades/views.py:136 msgid "Automatic upgrades enabled" msgstr "" -#: plinth/modules/upgrades/views.py:123 +#: plinth/modules/upgrades/views.py:138 msgid "Automatic upgrades disabled" msgstr "" -#: plinth/modules/upgrades/views.py:142 -msgid "Upgrade completed." -msgstr "" - -#: plinth/modules/upgrades/views.py:144 -msgid "Upgrade failed." -msgstr "" - #: plinth/modules/users/__init__.py:36 msgid "Users and Groups" msgstr "" @@ -2443,19 +2689,30 @@ msgstr "" msgid "Failed to add new user to {group} group." msgstr "" -#: plinth/modules/users/forms.py:126 +#: plinth/modules/users/forms.py:92 +msgid "SSH Keys" +msgstr "" + +#: plinth/modules/users/forms.py:96 +msgid "" +"Setting an SSH public key will allow this user to securely log in to the " +"system without using a password. You may enter multiple keys, one on each " +"line. Blank lines and lines starting with # will be ignored." +msgstr "" + +#: plinth/modules/users/forms.py:136 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:138 +#: plinth/modules/users/forms.py:148 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:149 +#: plinth/modules/users/forms.py:159 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:174 +#: plinth/modules/users/forms.py:188 msgid "Changing LDAP user password failed." msgstr "" @@ -2474,7 +2731,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:26 -#: plinth/modules/users/views.py:103 +#: plinth/modules/users/views.py:110 msgid "Delete User" msgstr "" @@ -2528,20 +2785,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:113 +#: plinth/modules/users/views.py:120 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:120 +#: plinth/modules/users/views.py:127 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:129 +#: plinth/modules/users/views.py:136 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:130 +#: plinth/modules/users/views.py:137 msgid "Password changed successfully." msgstr "" @@ -2616,8 +2873,9 @@ msgstr "" msgid "Secure Shell (SSH) Server" msgstr "" -#: plinth/service.py:78 -msgid "FreedomBox Web Interface (Plinth)" +#: plinth/service.py:79 +#, python-brace-format +msgid "{box_name} Web Interface (Plinth)" msgstr "" #: plinth/templates/404.html:25 @@ -2648,27 +2906,24 @@ msgid "" msgstr "" #: plinth/templates/base.html:49 -msgid "Plinth administrative interface for the FreedomBox" -msgstr "" - -#: plinth/templates/base.html:52 plinth/templates/base.html.py:88 -msgid "FreedomBox" +#, python-format +msgid "Plinth administrative interface for the %(box_name)s" msgstr "" -#: plinth/templates/base.html:81 +#: plinth/templates/base.html:83 msgid "Toggle navigation" msgstr "" -#: plinth/templates/base.html:121 plinth/templates/base.html.py:122 +#: plinth/templates/base.html:125 plinth/templates/base.html.py:126 msgid "Change password" msgstr "" -#: plinth/templates/base.html:125 plinth/templates/base.html.py:126 -#: plinth/templates/base.html:139 plinth/templates/base.html.py:141 +#: plinth/templates/base.html:129 plinth/templates/base.html.py:130 +#: plinth/templates/base.html:143 plinth/templates/base.html.py:145 msgid "Log out" msgstr "" -#: plinth/templates/base.html:131 plinth/templates/base.html.py:133 +#: plinth/templates/base.html:135 plinth/templates/base.html.py:137 msgid "Log in" msgstr "" @@ -2708,8 +2963,20 @@ msgstr "" msgid "%(percentage)s%% complete" msgstr "" +#~ msgid "show password" +#~ msgstr "రహస్యపదం చూపించు" + +#~ msgid "The following is the current status:" +#~ msgstr "ఇది ప్రస్తుత స్థితి:" + +#~ msgid "Next" +#~ msgstr "తర్వాత" + +#~ msgid "FreedomBox Manual" +#~ msgstr "ఫ్రీడమ్ బాక్స్ నిర్దేశిక" + +#~ msgid "Create Wiki/Blog" +#~ msgstr "వికీ/బ్లాగ్ సృష్టించు" + #~ msgid "Physical interface" #~ msgstr "శారీరక సంవిధానం" - -#~ msgid "Delete Connection %(name)s" -#~ msgstr "అనుసంధానం తొలగించు %(name)s" diff --git a/plinth/locale/tr/LC_MESSAGES/django.po b/plinth/locale/tr/LC_MESSAGES/django.po index 983591431..9e2f38208 100644 --- a/plinth/locale/tr/LC_MESSAGES/django.po +++ b/plinth/locale/tr/LC_MESSAGES/django.po @@ -6,11 +6,11 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-01-08 15:55+0100\n" +"POT-Creation-Date: 2016-01-31 22:19+0530\n" "PO-Revision-Date: 2016-01-15 21:21+0000\n" "Last-Translator: Caly \n" -"Language-Team: Turkish " -"\n" +"Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -48,12 +48,15 @@ msgstr "{host}:{port} konumuna bağlan" msgid "Cannot connect to {host}:{port}" msgstr "{host}:{port} konumuna bağlanılamadı" +#: plinth/context_processors.py:36 +msgid "FreedomBox" +msgstr "FreedomBox" + #: plinth/modules/apps/apps.py:26 msgid "Apps" msgstr "Uygulamalar" -#: plinth/modules/apps/apps.py:32 plinth/templates/base.html.py:91 -#: plinth/templates/base.html.py:90 +#: plinth/modules/apps/apps.py:32 plinth/templates/base.html.py:93 msgid "Applications" msgstr "Uygulamalar" @@ -95,10 +98,18 @@ msgid "Enable service discovery" msgstr "Servis keşfini etkinleştir" #: plinth/modules/avahi/templates/avahi.html:29 -msgid "" -"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 " +#, fuzzy, python-format +#| msgid "" +#| "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." +msgid "" +"Service discovery allows other devices on the network to discover your " +"%(box_name)s and services running on it. It also allows %(box_name)s to " +"discover other devices 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." @@ -113,14 +124,15 @@ msgstr "" #: plinth/modules/avahi/templates/avahi.html:40 #: plinth/modules/datetime/templates/datetime.html:35 #: plinth/modules/deluge/templates/deluge.html:39 -#: plinth/modules/dynamicdns/dynamicdns.py:38 +#: plinth/modules/dynamicdns/dynamicdns.py:39 #: plinth/modules/firewall/templates/firewall.html:57 #: plinth/modules/mumble/templates/mumble.html:44 #: plinth/modules/networks/templates/connection_show.html:261 #: plinth/modules/openvpn/templates/openvpn.html:81 #: plinth/modules/privoxy/templates/privoxy.html:48 #: plinth/modules/quassel/templates/quassel.html:50 -#: plinth/modules/tor/templates/tor.html:39 +#: plinth/modules/repro/templates/repro.html:58 +#: plinth/modules/tor/templates/tor.html:48 #: plinth/modules/transmission/templates/transmission.html:42 #: plinth/modules/xmpp/templates/xmpp.html:58 msgid "Status" @@ -143,9 +155,10 @@ msgstr "Servis keşfi sunucusu çalışmamaktadır" #: plinth/modules/owncloud/templates/owncloud.html:51 #: plinth/modules/privoxy/templates/privoxy.html:62 #: plinth/modules/quassel/templates/quassel.html:65 +#: plinth/modules/repro/templates/repro.html:72 #: plinth/modules/roundcube/templates/roundcube.html:62 #: plinth/modules/shaarli/templates/shaarli.html:40 -#: plinth/modules/tor/templates/tor.html:74 +#: plinth/modules/tor/templates/tor.html:92 #: plinth/modules/transmission/templates/transmission.html:56 #: plinth/modules/xmpp/templates/xmpp.html:72 msgid "Configuration" @@ -161,10 +174,11 @@ msgstr "Yapılandırma" #: plinth/modules/openvpn/templates/openvpn.html:138 #: plinth/modules/privoxy/templates/privoxy.html:70 #: plinth/modules/quassel/templates/quassel.html:73 +#: plinth/modules/repro/templates/repro.html:80 #: plinth/modules/restore/templates/restore_index.html:54 #: plinth/modules/roundcube/templates/roundcube.html:70 #: plinth/modules/shaarli/templates/shaarli.html:48 -#: plinth/modules/tor/templates/tor.html:82 +#: plinth/modules/tor/templates/tor.html:100 #: plinth/modules/transmission/templates/transmission.html:64 #: plinth/modules/upgrades/templates/upgrades_configure.html:34 #: plinth/modules/xmpp/templates/xmpp.html:80 @@ -173,13 +187,13 @@ msgstr "Kurulumu güncelle" #: plinth/modules/avahi/views.py:73 plinth/modules/datetime/views.py:85 #: plinth/modules/deluge/views.py:80 -#: plinth/modules/dynamicdns/dynamicdns.py:368 +#: plinth/modules/dynamicdns/dynamicdns.py:371 #: plinth/modules/ikiwiki/views.py:95 plinth/modules/mumble/views.py:80 #: plinth/modules/openvpn/views.py:142 plinth/modules/privoxy/views.py:83 -#: plinth/modules/quassel/views.py:76 plinth/modules/restore/views.py:68 -#: plinth/modules/roundcube/views.py:84 plinth/modules/shaarli/views.py:74 -#: plinth/modules/transmission/views.py:109 plinth/modules/xmpp/views.py:100 -#: plinth/modules/transmission/views.py:105 +#: plinth/modules/quassel/views.py:76 plinth/modules/repro/views.py:77 +#: plinth/modules/restore/views.py:68 plinth/modules/roundcube/views.py:84 +#: plinth/modules/shaarli/views.py:74 plinth/modules/transmission/views.py:109 +#: plinth/modules/xmpp/views.py:100 msgid "Configuration updated" msgstr "Kurulum güncellendi" @@ -187,28 +201,34 @@ msgstr "Kurulum güncellendi" #: plinth/modules/deluge/views.py:82 plinth/modules/ikiwiki/views.py:97 #: plinth/modules/mumble/views.py:82 plinth/modules/openvpn/views.py:144 #: plinth/modules/owncloud/owncloud.py:93 plinth/modules/privoxy/views.py:85 -#: plinth/modules/quassel/views.py:78 plinth/modules/restore/views.py:70 -#: plinth/modules/roundcube/views.py:86 plinth/modules/shaarli/views.py:76 -#: plinth/modules/tor/tor.py:250 plinth/modules/transmission/views.py:111 -#: plinth/modules/upgrades/views.py:103 plinth/modules/xmpp/views.py:102 -#: plinth/modules/transmission/views.py:107 +#: plinth/modules/quassel/views.py:78 plinth/modules/repro/views.py:79 +#: plinth/modules/restore/views.py:70 plinth/modules/roundcube/views.py:86 +#: plinth/modules/shaarli/views.py:76 plinth/modules/tor/views.py:111 +#: plinth/modules/transmission/views.py:111 +#: plinth/modules/upgrades/views.py:118 plinth/modules/xmpp/views.py:102 msgid "Setting unchanged" msgstr "Ayar değiştirilmedi" -#: plinth/modules/config/config.py:83 plinth/modules/config/config.py:120 -#: plinth/modules/dynamicdns/dynamicdns.py:145 +#: plinth/modules/config/config.py:84 plinth/modules/config/config.py:121 +#: plinth/modules/dynamicdns/dynamicdns.py:148 msgid "Invalid domain name" msgstr "Geçersiz alan ismi" -#: plinth/modules/config/config.py:94 +#: plinth/modules/config/config.py:95 msgid "Hostname" msgstr "Makine ismi" -#: plinth/modules/config/config.py:96 -msgid "" -"Hostname is the local name by which other machines on the local network " -"reach your machine. It must start and end with an alphabet or a digit and " -"have as interior characters only alphabets, digits and hyphens. Total " +#: plinth/modules/config/config.py:97 +#, fuzzy, python-brace-format +#| msgid "" +#| "Hostname is the local name by which other machines on the local network " +#| "reach your machine. It must start and end with an alphabet or a digit " +#| "and have as interior characters only alphabets, digits and hyphens. " +#| "Total length must be 63 characters or less." +msgid "" +"Hostname is the local name by which other devices on the local network can " +"reach your {box_name}. It must start and end with an alphabet or a digit " +"and have as interior characters only alphabets, digits and hyphens. Total " "length must be 63 characters or less." msgstr "" "Makine ismi yerel şebekedeki diğer makinelerin sizin makinenize erişmek için " @@ -216,24 +236,32 @@ msgstr "" "gerekir ve sadece alfabe harfleri, sayılar ve tireler içerebilir. Toplam " "uzunluğun 63 karakter veya daha azı olması gerekmektedir." -#: plinth/modules/config/config.py:104 +#: plinth/modules/config/config.py:105 msgid "Invalid hostname" msgstr "Geçersiz makine ismi" -#: plinth/modules/config/config.py:107 plinth/modules/config/config.py:153 +#: plinth/modules/config/config.py:108 plinth/modules/config/config.py:153 #: plinth/modules/config/config.py:265 -#: plinth/modules/dynamicdns/dynamicdns.py:140 +#: plinth/modules/dynamicdns/dynamicdns.py:143 msgid "Domain Name" msgstr "Alan Adı" -#: plinth/modules/config/config.py:109 -msgid "" -"Domain name is the global name by which other machines on the Internet can " -"reach you. It must consist of labels separated by dots. Each label must " -"start and end with an alphabet or a digit and have as interior characters " -"only alphabets, digits and hyphens. Length of each label must be 63 " -"characters or less. Total length of domain name must be 253 characters or " -"less." +#: plinth/modules/config/config.py:110 +#, fuzzy, python-brace-format +#| msgid "" +#| "Domain name is the global name by which other machines on the Internet " +#| "can reach you. It must consist of labels separated by dots. Each label " +#| "must start and end with an alphabet or a digit and have as interior " +#| "characters only alphabets, digits and hyphens. Length of each label must " +#| "be 63 characters or less. Total length of domain name must be 253 " +#| "characters or less." +msgid "" +"Domain name is the global name by which other devices on the Internet can " +"reach your {box_name}. It must consist of labels separated by dots. Each " +"label must start and end with an alphabet or a digit and have as interior " +"characters only alphabets, digits and hyphens. Length of each label must be " +"63 characters or less. Total length of domain name must be 253 characters " +"or less." msgstr "" "Alan adı, İnternet'teki diğer makinelerin size erişmek için kullanacakları " "global isimdir. Noktalarla ayrılmış gruplardan oluşmalıdır. Her grubun bir " @@ -242,16 +270,18 @@ msgstr "" "karakter ya da daha azı olmalıdır. Alan adının toplam uzunluğu 253 karakter " "ya da daha azı olmalıdır." -#: plinth/modules/config/config.py:124 +#: plinth/modules/config/config.py:125 msgid "Language" msgstr "Lisan" -#: plinth/modules/config/config.py:126 -msgid "Language for this FreedomBox web administration interface" +#: plinth/modules/config/config.py:127 +#, fuzzy +#| msgid "Language for this FreedomBox web administration interface" +msgid "Language for this web administration interface" msgstr "Bu FreedomBox'un web yönetim arayüzü için kullanılacak dil" #: plinth/modules/config/config.py:135 -#: plinth/modules/dynamicdns/dynamicdns.py:36 +#: plinth/modules/dynamicdns/dynamicdns.py:37 #: plinth/modules/ikiwiki/views.py:36 msgid "Configure" msgstr "Yapılandır" @@ -448,16 +478,16 @@ msgstr "Test" msgid "Result" msgstr "Sonuç" -#: plinth/modules/dynamicdns/dynamicdns.py:34 plinth/modules/help/help.py:40 +#: plinth/modules/dynamicdns/dynamicdns.py:35 plinth/modules/help/help.py:40 msgid "About" msgstr "Hakkında" -#: plinth/modules/dynamicdns/dynamicdns.py:44 -#: plinth/modules/dynamicdns/dynamicdns.py:53 +#: plinth/modules/dynamicdns/dynamicdns.py:45 +#: plinth/modules/dynamicdns/dynamicdns.py:54 msgid "Dynamic DNS" msgstr "Dinamik DNS" -#: plinth/modules/dynamicdns/dynamicdns.py:70 +#: plinth/modules/dynamicdns/dynamicdns.py:71 msgid "" "The Variables <User>, <Pass>, <Ip>, <Domain> may be " "used within the URL. For details see the update URL templates of the example " @@ -467,7 +497,7 @@ msgstr "" "(bağlantıda) kullanılabilir. Ayrıntılar için örnek sunucuların URL " "güncelleme şablonlarına bakınız." -#: plinth/modules/dynamicdns/dynamicdns.py:74 +#: plinth/modules/dynamicdns/dynamicdns.py:75 msgid "" "Please choose an update protocol according to your provider. If your " "provider does not support the GnudIP protocol or your provider is not listed " @@ -477,24 +507,30 @@ msgstr "" "sağlayıcınız GnudIP protokolünü desteklemiyorsa ya da listelenmemişse " "sağlayıcınızın güncelleme bağlantısını (URL) kullanabilirsiniz." -#: plinth/modules/dynamicdns/dynamicdns.py:79 +#: plinth/modules/dynamicdns/dynamicdns.py:80 +#, fuzzy +#| msgid "" +#| "Please do not enter a URL here (like \"https://example.com/\") but only " +#| "the hostname of the GnuDIP server (like \"example.pcom\")." msgid "" "Please do not enter a URL here (like \"https://example.com/\") but only the " -"hostname of the GnuDIP server (like \"example.pcom\")." +"hostname of the GnuDIP server (like \"example.com\")." msgstr "" "Buraya lütfen \"https://example.com/\" gibi bir URL girmeyin, sadece GnuDIP " "sunucusunun makine ismini girin (\"example.com\" gibi)." -#: plinth/modules/dynamicdns/dynamicdns.py:83 -msgid "The public domain name you want use to reach your box." +#: plinth/modules/dynamicdns/dynamicdns.py:84 +#, fuzzy, python-brace-format +#| msgid "The public domain name you want use to reach your box." +msgid "The public domain name you want use to reach your {box_name}." msgstr "Kutunuza erişilmesi için kullanmak istediğiniz herkese açık alan ismi." -#: plinth/modules/dynamicdns/dynamicdns.py:85 +#: plinth/modules/dynamicdns/dynamicdns.py:87 msgid "Use this option if your provider uses self signed certificates." msgstr "" "Sağlayıcınız kendi imzaladığı sertifikalar kullanıyorsa bu seçeneği kullanın." -#: plinth/modules/dynamicdns/dynamicdns.py:88 +#: plinth/modules/dynamicdns/dynamicdns.py:90 msgid "" "If this option is selected, your username and password will be used for HTTP " "basic authentication." @@ -502,134 +538,159 @@ msgstr "" "Eğer bu seçenek seçiliyse, kullanıcı isminiz ve parolanız temel HTTP kimlik " "doğrulaması için kullanılacaktır." -#: plinth/modules/dynamicdns/dynamicdns.py:91 +#: plinth/modules/dynamicdns/dynamicdns.py:93 msgid "" "Leave this field empty if you want to keep your previous configured password." msgstr "" "Önceki yapılandırılmış parolanızı tutmak istiyorsanız bu alanı boş bırakın." -#: plinth/modules/dynamicdns/dynamicdns.py:94 +#: plinth/modules/dynamicdns/dynamicdns.py:96 +#, fuzzy, python-brace-format +#| msgid "" +#| "Optional Value. If your FreedomBox is not connected directly to the " +#| "Internet (i.e. connected to a NAT router) this URL is used to figure out " +#| "the real Internet IP. The URL should simply return the IP wherethe client " +#| "comes from. Example: http://myip.datasystems24.de" msgid "" -"Optional Value. If your FreedomBox is not connected directly to the Internet " +"Optional Value. If your {box_name} is not connected directly to the Internet " "(i.e. connected to a NAT router) this URL is used to figure out the real " -"Internet IP. The URL should simply return the IP wherethe client comes from. " -"Example: http://myip.datasystems24.de" +"Internet IP. The URL should simply return the IP where the client comes from " +"(example: http://myip.datasystems24.de)." msgstr "" -"Seçeneğe bağlı değer. FreedomBox'unuz İnternet'e doğrudan bağlı değilse (" -"yani bir NAT yönlendiricisine bağlıysa) bu URL gerçek İnternet IP adresini " +"Seçeneğe bağlı değer. FreedomBox'unuz İnternet'e doğrudan bağlı değilse " +"(yani bir NAT yönlendiricisine bağlıysa) bu URL gerçek İnternet IP adresini " "bulmak için kullanılır. URL sadece istemcinin bulunduğu yerin IP'sini " "vermelidir. Mesela: http://myip.datasystems24.de" -#: plinth/modules/dynamicdns/dynamicdns.py:101 +#: plinth/modules/dynamicdns/dynamicdns.py:104 msgid "" "You should have been requested to select a username when you created the " "account." msgstr "" "Hesabı oluşturduğunuzda bir kullanıcı ismi seçmeniz talep edilmiş olmalıydı." -#: plinth/modules/dynamicdns/dynamicdns.py:112 +#: plinth/modules/dynamicdns/dynamicdns.py:115 msgid "Enable Dynamic DNS" msgstr "Dinamik DNS'i Etkinleştir" -#: plinth/modules/dynamicdns/dynamicdns.py:115 +#: plinth/modules/dynamicdns/dynamicdns.py:118 msgid "Service type" msgstr "Servis türü" -#: plinth/modules/dynamicdns/dynamicdns.py:120 +#: plinth/modules/dynamicdns/dynamicdns.py:123 msgid "GnudIP Server Address" msgstr "GnudIP Sunucu Adresi" -#: plinth/modules/dynamicdns/dynamicdns.py:125 +#: plinth/modules/dynamicdns/dynamicdns.py:128 msgid "Invalid server name" msgstr "Geçersiz sunucu ismi" -#: plinth/modules/dynamicdns/dynamicdns.py:128 +#: plinth/modules/dynamicdns/dynamicdns.py:131 msgid "Update URL" msgstr "URL'i Güncelle" -#: plinth/modules/dynamicdns/dynamicdns.py:132 -msgid "accept all SSL certificates" +#: plinth/modules/dynamicdns/dynamicdns.py:135 +#, fuzzy +#| msgid "accept all SSL certificates" +msgid "Accept all SSL certificates" msgstr "Tüm SSL sertifikalarını kabul et" -#: plinth/modules/dynamicdns/dynamicdns.py:136 -msgid "use HTTP basic authentication" +#: plinth/modules/dynamicdns/dynamicdns.py:139 +#, fuzzy +#| msgid "use HTTP basic authentication" +msgid "Use HTTP basic authentication" msgstr "temel HTTP kimlik doğrulamasını kullan" -#: plinth/modules/dynamicdns/dynamicdns.py:148 +#: plinth/modules/dynamicdns/dynamicdns.py:151 #: plinth/modules/networks/forms.py:146 plinth/modules/transmission/forms.py:39 -#: plinth/modules/networks/forms.py:118 msgid "Username" msgstr "Kullanıcı ismi" -#: plinth/modules/dynamicdns/dynamicdns.py:151 +#: plinth/modules/dynamicdns/dynamicdns.py:154 #: plinth/modules/networks/forms.py:147 plinth/modules/transmission/forms.py:43 -#: plinth/modules/networks/forms.py:119 msgid "Password" msgstr "Parola" -#: plinth/modules/dynamicdns/dynamicdns.py:154 -msgid "show password" -msgstr "parolayı göster" +#: plinth/modules/dynamicdns/dynamicdns.py:157 +#: plinth/modules/networks/forms.py:149 +msgid "Show password" +msgstr "Parolayı göster" -#: plinth/modules/dynamicdns/dynamicdns.py:158 +#: plinth/modules/dynamicdns/dynamicdns.py:161 msgid "IP check URL" msgstr "IP kontrol bağlantısı" -#: plinth/modules/dynamicdns/dynamicdns.py:184 +#: plinth/modules/dynamicdns/dynamicdns.py:187 msgid "Please provide update URL or a GnuDIP Server" msgstr "Lütfen bir güncelleme URL'i ya da GnuDIP Sunucusu belirtin" -#: plinth/modules/dynamicdns/dynamicdns.py:187 +#: plinth/modules/dynamicdns/dynamicdns.py:190 msgid "Please provide GnuDIP username" msgstr "Lütfen GnuDIP kullanıcı ismi belirtin" -#: plinth/modules/dynamicdns/dynamicdns.py:190 +#: plinth/modules/dynamicdns/dynamicdns.py:193 msgid "Please provide GnuDIP domain" msgstr "Lütfen GnuDIP alanı belirtin" -#: plinth/modules/dynamicdns/dynamicdns.py:195 +#: plinth/modules/dynamicdns/dynamicdns.py:198 msgid "Please provide a password" msgstr "Lütfen bir parola girin" -#: plinth/modules/dynamicdns/dynamicdns.py:214 +#: plinth/modules/dynamicdns/dynamicdns.py:217 msgid "Configure Dynamic DNS" msgstr "Dİnamik DNS'i Yapılandır" -#: plinth/modules/dynamicdns/dynamicdns.py:236 +#: plinth/modules/dynamicdns/dynamicdns.py:239 msgid "Status of Dynamic DNS" msgstr "Dinamik DNS Durumu" #: plinth/modules/dynamicdns/templates/dynamicdns.html:25 -msgid "DynamicDNS client" +#, fuzzy +#| msgid "DynamicDNS client" +msgid "Dynamic DNS Client" msgstr "DynamicDNS istemcisi" #: plinth/modules/dynamicdns/templates/dynamicdns.html:28 +#, fuzzy, python-format +#| msgid "" +#| "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)." msgid "" "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)." +"may find the services which are provided by %(box_name)s, such as ownCloud." msgstr "" -"Eğer İnternet erişim sağlayıcınız IP adresinizi periyodik bir şekilde (" -"mesela her 24 saatte bir) değiştiriyorsa diğer kişiler sizi ağda bulmakta " -"zorlanabilir. Ve bu sebeple kimse FreedomBox tarafından sunulan servisleri (" -"sizin ownCloud'unuz gibi) bulamayabilir." +"Eğer İnternet erişim sağlayıcınız IP adresinizi periyodik bir şekilde " +"(mesela her 24 saatte bir) değiştiriyorsa diğer kişiler sizi ağda bulmakta " +"zorlanabilir. Ve bu sebeple kimse FreedomBox tarafından sunulan servisleri " +"(sizin ownCloud'unuz gibi) bulamayabilir." #: plinth/modules/dynamicdns/templates/dynamicdns.html:37 +#, fuzzy +#| msgid "" +#| "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 gnudip " +#| "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." msgid "" "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 gnudip 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." +"Internet asks for your DNS name he will get your current IP answered." msgstr "" "Çözüm, IP adresinize bir DNS ismi atamak ve DNS ismini IP adresiniz İnternet " "erişim sağlayıcınız tarafından her değiştirildiğinde güncellemektir. Dinamik " -"DNS güncel genel İnternet adresinizi bir gnudip " -"sunucusuna gönderir. Bunun ardından sunucu DNS isminizi yeni IP adresi ile " -"ilişkilendirecek ve İnternet'te birisi DNS isminizi sorguladığında güncel IP " -"adresinizi elde edebilecektir." +"DNS güncel genel İnternet adresinizi bir gnudip sunucusuna gönderir. Bunun ardından " +"sunucu DNS isminizi yeni IP adresi ile ilişkilendirecek ve İnternet'te " +"birisi DNS isminizi sorguladığında güncel IP adresinizi elde edebilecektir." #: plinth/modules/dynamicdns/templates/dynamicdns.html:50 msgid "" @@ -640,16 +701,20 @@ msgid "" "freedns.afraid.org." msgstr "" "Eğer ücretsiz bir dinamik DNS hesabı arıyorsanız, bedava bir GnuDIP " -"servisini gnudip.datasystems24.net adresinde ya da ücretsiz URL " -"güncelleme temelli servisleri freedns.afraid.org adresinde bulabilirsiniz." +"servisini gnudip." +"datasystems24.net adresinde ya da ücretsiz URL güncelleme temelli " +"servisleri freedns." +"afraid.org adresinde bulabilirsiniz." #: plinth/modules/dynamicdns/templates/dynamicdns.html:61 +#, fuzzy, python-format +#| msgid "" +#| "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." msgid "" -"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." +"If your %(box_name)s is connected behind some NAT router, don't forget to " +"add port forwarding (i.e. forward some standard ports like 80 and 443)." msgstr "" "Eğer FreedomBox'unuz bir NAT yönlendiriciye bağlıysa, FreedomBox cihazınıza " "port yönlendirme (yani 80 ve 443 gibi bazı standart portları yönlendirmeyi) " @@ -676,22 +741,29 @@ msgstr "" "girmezseniz NAT türü tespit edilmeyecektir." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:35 -msgid "Direct connection to the internet." +#, fuzzy +#| msgid "Direct connection to the internet." +msgid "Direct connection to the Internet." msgstr "İnternet'e doğrudan bağlantı." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:37 -#, python-format -msgid "" -"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)s minutes until we " -"update your DNS entry in case of WAN IP change." +#, fuzzy, python-format +#| msgid "" +#| "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)s " +#| "minutes until we update your DNS entry in case of WAN IP change." +msgid "" +"Behind NAT. This means that Dynamic DNS service will poll the \"IP check URL" +"\" for changes (the \"IP check URL\" entry is needed for this - otherwise IP " +"changes will not be detected). In case the WAN IP changes, it may take up " +"to %(timer)s minutes until your DNS entry is updated." msgstr "" "NAT arkasında, bu, dinamik DNS servisinin \"IP kontrolü bağlantısını\" " "değişiklikler için yoklayacağı anlamına gelir (\"IP kontrolü bağlantısına\" " "bu sebeple ihtiyaç duymaktayız - aksi takdirde IP değişikliklerini tespit " -"edemeyiz). WAN IP değişikliği durumunda DNS girdisini güncellememiz %(timer)" -"s dakika alabilir." +"edemeyiz). WAN IP değişikliği durumunda DNS girdisini güncellememiz " +"%(timer)s dakika alabilir." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:48 msgid "Last update" @@ -704,11 +776,15 @@ msgid "Firewall" msgstr "Güvenlik Duvarı" #: plinth/modules/firewall/templates/firewall.html:28 -#, python-format +#, fuzzy, python-format +#| msgid "" +#| "Firewall is a network security system that controls the incoming and " +#| "outgoing network traffic on your %(box_name)s. Keeping a firewall enabled " +#| "and properly configured reduces risk of security threat from the Internet." msgid "" -"Firewall is a network security system that controls the incoming and " -"outgoing network traffic on your %(box_name)s. Keeping a firewall enabled " -"and properly configured reduces risk of security threat from the Internet." +"Firewall is a security system that controls the incoming and outgoing " +"network traffic on your %(box_name)s. Keeping a firewall enabled and " +"properly configured reduces risk of security threat from the Internet." msgstr "" "Güvenlik duvarı %(box_name)s kutunuzda içeri gelen ve dışarı giden şebeke " "trafiğini kontrol eden bir ağ güvenlik sistemidir. Güvenlik duvarını " @@ -716,8 +792,8 @@ msgstr "" "tehditlerini azaltır." #: plinth/modules/firewall/templates/firewall.html:36 -msgid "The following is the current status:" -msgstr "Aşağıdaki güncel durumdur:" +msgid "Current status:" +msgstr "" #: plinth/modules/firewall/templates/firewall.html:41 #, python-format @@ -766,10 +842,15 @@ msgid "Blocked" msgstr "Engellenmiş" #: plinth/modules/firewall/templates/firewall.html:103 +#, fuzzy +#| msgid "" +#| "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." msgid "" "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." +"also permitted in the firewall and when you disable a service it is also " +"disabled in the firewall." msgstr "" "Güvenlik duvarının işleyişi otomatiktir. Bir servisi etkinleştirdiğinizde " "otomatik olarak güvenlik duvarında izinli hale gelir ve devre dışı " @@ -789,8 +870,7 @@ msgstr "Kullanıcı hesabı oluşturuldu, artık giriş yaptınız" #: plinth/modules/first_boot/templates/firstboot_navbar.html:23 #: plinth/modules/help/templates/help_index.html:25 -#: plinth/templates/base.html:100 -#: plinth/templates/base.html:98 +#: plinth/templates/base.html:102 msgid "Help" msgstr "Yardım" @@ -808,12 +888,10 @@ msgstr "" "bilgileri belirtin." #: plinth/modules/first_boot/templates/firstboot_state1.html:41 -#: plinth/modules/first_boot/templates/firstboot_state1.html:39 msgid "Administrator Account" msgstr "Yönetici Hesabı" #: plinth/modules/first_boot/templates/firstboot_state1.html:44 -#: plinth/modules/first_boot/templates/firstboot_state1.html:42 msgid "" "Choose a username and password to access this web interface. The password " "can be changed later. This user will be granted administrative privileges. " @@ -824,7 +902,6 @@ msgstr "" "kullanıcılar daha sonra ilave edilebilir." #: plinth/modules/first_boot/templates/firstboot_state1.html:57 -#: plinth/modules/first_boot/templates/firstboot_state1.html:55 msgid "Box it up!" msgstr "Kaydet ve FreedomBox'u başlat!" @@ -833,18 +910,21 @@ msgid "Setup Complete!" msgstr "Yapılandırma Tamamlandı!" #: plinth/modules/first_boot/templates/firstboot_state10.html:32 -#, python-format +#, fuzzy, python-format +#| msgid "" +#| "%(box_name)s setup is now complete. To make your %(box_name)s " +#| "functional, you need some applications. Applications will be installed " +#| "the first time you access them." msgid "" "%(box_name)s setup is now complete. To make your %(box_name)s functional, " -"you need some applications. Applications will be installed the first time " -"you access them." +"you need some applications. They will be installed the first time you " +"access them." msgstr "" "%(box_name)s kurulumu artık tamamlanmıştır. %(box_name)s kutunuzu işlevsel " "hale getirmek için bazı uygulamalara ihtiyacınız vardır. Uygulamalar onlara " "ilk kez eriştiğinizde kurulacaktır." #: plinth/modules/first_boot/templates/firstboot_state10.html:41 -#: plinth/modules/first_boot/templates/firstboot_state10.html:59 msgid "Go to Apps" msgstr "Uygulamalara Git" @@ -861,7 +941,6 @@ msgstr "" "Varsayılan kablosuz ağ parolalarını değiştirmeyi unutmayın!" #: plinth/modules/first_boot/templates/firstboot_state10.html:57 -#: plinth/modules/first_boot/templates/firstboot_state10.html:54 msgid "Go to Networks" msgstr "Ağlara Git" @@ -877,9 +956,9 @@ msgstr "Belgelendirme" msgid "Where to Get Help" msgstr "Nerede Yardım Bulabilirim" -#: plinth/modules/help/help.py:38 plinth/modules/help/help.py:72 -msgid "FreedomBox Manual" -msgstr "FreedomBox Kullanım Kılavuzu" +#: plinth/modules/help/help.py:38 +msgid "Manual" +msgstr "" #: plinth/modules/help/help.py:48 msgid "Documentation and FAQ" @@ -890,15 +969,30 @@ msgstr "Belgelendirme ve SSS" msgid "About {box_name}" msgstr "{box_name} hakkında" +#: plinth/modules/help/help.py:73 +#, fuzzy, python-brace-format +#| msgid "About {box_name}" +msgid "{box_name} Manual" +msgstr "{box_name} hakkında" + #: plinth/modules/help/templates/help_about.html:30 -msgid "" -"FreedomBox is a community project to develop, design and promote personal " +#, fuzzy, python-format +#| msgid "" +#| "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." +msgid "" +"%(box_name)s 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." +"and a Tor relay, on a device that can replace your Wi-Fi router, so that " +"your data stays with you." msgstr "" "FreedomBox, özel iletişimler için özgür yazılım çalıştıran kişisel sunucular " "tasarlayan, geliştiren ve kullanımını teşvik eden bir topluluk projesidir. " @@ -925,27 +1019,37 @@ msgstr "" "İnternet'i amaçlanan eşten eşe mimarisine geri getiriyoruz." #: plinth/modules/help/templates/help_about.html:56 +#, fuzzy, python-format +#| msgid "" +#| "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." msgid "" "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." +"services; %(box_name)s aims to bring them all together in a convenient " +"package." msgstr "" "Eşten eşe, dağıtılmış servisler geleceği için çalışan çeşitli projeler " "bulunmaktadır: FreedomBox'un amacı onların tümünü kişisel bir sunucuda bir " "araya getirmektir." #: plinth/modules/help/templates/help_about.html:64 +#, fuzzy, python-format +#| msgid "" +#| "For more information about the FreedomBox project, see the FreedomBox Wiki." msgid "" -"For more information about the FreedomBox project, see the FreedomBox Wiki." +"For more information about the %(box_name)s project, see the %(box_name)s Wiki." msgstr "" -"FreedomBox projesi hakkında daha fazla bilgi için FreedomBox Vikisini okuyunuz." +"FreedomBox projesi hakkında daha fazla bilgi için FreedomBox Vikisini okuyunuz." -#: plinth/modules/help/templates/help_about.html:72 +#: plinth/modules/help/templates/help_about.html:73 msgid "Learn more »" msgstr "Daha fazla bilgi edinin »" -#: plinth/modules/help/templates/help_about.html:75 +#: plinth/modules/help/templates/help_about.html:76 #, python-format msgid "You are running Plinth version %(version)s." msgstr "Plinth yazılımının %(version)s sürümünü kullanıyorsunuz." @@ -956,53 +1060,72 @@ msgid "%(box_name)s Setup" msgstr "%(box_name)s Kurulumu" #: plinth/modules/help/templates/help_index.html:29 -#, python-format +#, fuzzy, python-format +#| msgid "" +#| "The FreedomBox Manual is the best place to " +#| "start for information regarding %(box_name)s." msgid "" -"The FreedomBox Manual is the best place to " +"The %(box_name)s Manual is the best place to " "start for information regarding %(box_name)s." msgstr "" -"%(box_name)s. hakkında daha fazla bilgi edinmeye başlamak için en uygun yer <" -"a href=\"%(manual_url)s\">FreedomBox Kullanım Kılavuzudur." +"%(box_name)s. hakkında daha fazla bilgi edinmeye başlamak için en uygun yer " +"FreedomBox Kullanım Kılavuzudur." #: plinth/modules/help/templates/help_index.html:36 +#, fuzzy, python-format +#| msgid "" +#| " " +#| "FreedomBox project wiki contains further information." msgid "" -" FreedomBox " -"project wiki contains further information." +" " +"%(box_name)s project wiki contains further information." msgstr "" " FreedomBox " "proje vikisi daha fazla bilgi içerir." #: plinth/modules/help/templates/help_index.html:43 -msgid "" -"To seek help from FreedomBox community, queries may be posted on the " -"mailing list. The list archives also contain information about problems " -"faced by other users and possible solutions." -msgstr "" -"FreedomBox topluluğundan yardım istiyorsanız, sorularınızı e-" -"posta listesine yollayabilirsiniz. Liste arşivleri diğer " -"kullanıcıların karşılaştıkları sorunlar ve mümkün çözümler hakkında da bilgi " -"içerir." +#, fuzzy, python-format +#| msgid "" +#| "To seek help from FreedomBox community, queries may be posted on the mailing list. The list archives also contain information about " +#| "problems faced by other users and possible solutions." +msgid "" +"To seek help from %(box_name)s community, queries may be posted on the mailing list. The list archives also contain information about " +"problems faced by other users and possible solutions." +msgstr "" +"FreedomBox topluluğundan yardım istiyorsanız, sorularınızı e-posta " +"listesine yollayabilirsiniz. Liste arşivleri diğer kullanıcıların " +"karşılaştıkları sorunlar ve mümkün çözümler hakkında da bilgi içerir." #: plinth/modules/help/templates/help_index.html:53 +#, python-format msgid "" -"Many FreedomBox contributors and users are also available on the #freedombox " -"channel of the irc.oftc.net IRC network." +"Many %(box_name)s contributors and users are also available on the irc.oftc." +"net IRC network. Join and request help on the #freedombox " +"channel using the IRC web interface." msgstr "" -"Birçok FreedomBox iştirakçileri ve kullanıcıları irc.oftc.net IRC ağındaki #" -"freedombox kanalındadır." #: plinth/modules/ikiwiki/__init__.py:38 -msgid "Wiki & Blog (Ikiwiki)" +#, fuzzy +#| msgid "Wiki & Blog (Ikiwiki)" +msgid "Wiki and Blog (ikiwiki)" msgstr "Viki & Blog (Ikiwiki)" #: plinth/modules/ikiwiki/__init__.py:43 -msgid "Ikiwiki wikis and blogs" +#, fuzzy +#| msgid "Ikiwiki wikis and blogs" +msgid "ikiwiki wikis and blogs" msgstr "Ikiwiki vikileri ve blogları" #: plinth/modules/ikiwiki/forms.py:29 -msgid "Enable Ikiwiki" +#, fuzzy +#| msgid "Enable Ikiwiki" +msgid "Enable ikiwiki" msgstr "Ikiwiki'yi etkinleştir" #: plinth/modules/ikiwiki/forms.py:36 @@ -1028,28 +1151,34 @@ msgid "" "When enabled, the blogs and wikis will be available from /ikiwiki." msgstr "" -"Etkinleştirildilerinde, bloglar ve vikilere erişim /ikiwiki adresinden mümkün olacaktır." +"Etkinleştirildilerinde, bloglar ve vikilere erişim /" +"ikiwiki adresinden mümkün olacaktır." #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:27 -#, python-format -msgid "Delete Wiki/Blog %(name)s" +#, fuzzy, python-format +#| msgid "Delete Wiki/Blog %(name)s" +msgid "Delete Wiki or Blog %(name)s" msgstr "%(name)s ismli Viki/Blogu sil" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:33 +#, fuzzy +#| msgid "" +#| "This action will remove all the posts, pages and comments including " +#| "revision history. Delete this wiki/blog permanently?" msgid "" "This action will remove all the posts, pages and comments including revision " -"history. Delete this wiki/blog permanently?" +"history. Delete this wiki or blog permanently?" msgstr "" "Bu eylem revizyon geçmişi de dahil olmak üzere tüm mesajları, sayfaları ve " "yorumları silecektir. Bu viki/blogu daimi olarak silmek istiyor musunuz?" -#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:43 +#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:44 #, python-format msgid "Delete %(name)s" msgstr "%(name)s unsurunu sil" -#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:46 +#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:47 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:60 #: plinth/modules/networks/templates/connections_delete.html:41 #: plinth/modules/users/templates/users_delete.html:41 msgid "Cancel" @@ -1082,7 +1211,9 @@ msgid "Create" msgstr "Oluştur" #: plinth/modules/ikiwiki/views.py:73 -msgid "Wiki & Blog" +#, fuzzy +#| msgid "Wiki & Blog" +msgid "Wiki and Blog" msgstr "Viki & Blog" #: plinth/modules/ikiwiki/views.py:106 @@ -1090,8 +1221,10 @@ msgid "Manage Wikis and Blogs" msgstr "Viki ve Blogları Yönet" #: plinth/modules/ikiwiki/views.py:132 -msgid "Create Wiki/Blog" -msgstr "Viki/Blog Oluştur" +#, fuzzy +#| msgid "Create a Wiki or Blog" +msgid "Create Wiki or Blog" +msgstr "Bir Viki ya da Blog oluştur" #: plinth/modules/ikiwiki/views.py:145 #, python-brace-format @@ -1124,7 +1257,9 @@ msgid "Could not delete {name}: {error}" msgstr "{name} silinemedi: {error}" #: plinth/modules/ikiwiki/views.py:182 -msgid "Delete Wiki/Blog" +#, fuzzy +#| msgid "Delete Wiki/Blog" +msgid "Delete Wiki or Blog" msgstr "Viki/Blogu Sil" #: plinth/modules/letsencrypt/__init__.py:43 @@ -1158,11 +1293,12 @@ msgid "" msgstr "" "Let's Encrypt, Internet Security Research Group (ISRG) tarafından işletilen, " "kamunun yararına çalışan ücretsiz, otomatik ve açık bir sertifika " -"otoritesidir. Bu servisi kullanmadan önce lütfen Let's Encrypt Abone Sözleşmesini " -"okuyup kabul edin." +"otoritesidir. Bu servisi kullanmadan önce lütfen Let's Encrypt Abone Sözleşmesini okuyup " +"kabul edin." #: plinth/modules/letsencrypt/templates/letsencrypt.html:66 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:70 msgid "Domain" msgstr "Alan" @@ -1175,6 +1311,7 @@ msgid "Website Security" msgstr "Site Güvenliği" #: plinth/modules/letsencrypt/templates/letsencrypt.html:69 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:72 msgid "Actions" msgstr "Eylemler" @@ -1207,7 +1344,8 @@ msgstr "{domain} alanı için sertifika başarılı bir şekilde iptal edildi" #: plinth/modules/letsencrypt/views.py:60 #, python-brace-format msgid "Failed to revoke certificate for domain {domain}: {error}" -msgstr "{domain} alanı için sertifikanın iptal edilmesi başarısız oldu: {error}" +msgstr "" +"{domain} alanı için sertifikanın iptal edilmesi başarısız oldu: {error}" #: plinth/modules/letsencrypt/views.py:72 #, python-brace-format @@ -1219,6 +1357,60 @@ msgstr "{domain} alanı için sertifika başarılı bir şekilde edinildi" msgid "Failed to obtain certificate for domain {domain}: {error}" msgstr "{domain} alanı için sertifika edinilemedi: {error}" +#: plinth/modules/monkeysphere/__init__.py:32 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:35 +#: plinth/modules/monkeysphere/views.py:44 +msgid "Monkeysphere" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:38 +msgid "" +"With Monkeysphere, a PGP key can be generated for each configured domain " +"serving SSH. The PGP public key can then be uploaded to the PGP keyservers. " +"Users connecting to this machine through SSH can verify that they are " +"connecting to the correct host. For users to trust the key, at least one " +"person (usually the machine owner) must sign the key using the regular PGP " +"key signing process. See the Monkeysphere SSH documentation for more details." +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:53 +msgid "Publishing key to keyserver..." +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:71 +msgid "GPG Fingerprint" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:83 +#: plinth/modules/names/views.py:45 +msgid "Not Available" +msgstr "Mevcut değil" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:93 +msgid "Generate PGP Key" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:101 +msgid "Publish Key" +msgstr "" + +#: plinth/modules/monkeysphere/views.py:58 +msgid "Generated PGP key." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:83 +msgid "Cancelled key publishing." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:120 +msgid "Published key to keyserver." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:122 +msgid "Error occurred while publishing key." +msgstr "" + #: plinth/modules/mumble/__init__.py:38 #: plinth/modules/mumble/templates/mumble.html:26 #: plinth/modules/mumble/views.py:58 @@ -1259,68 +1451,48 @@ msgstr "Mumble sunucusu çalışmaktadır" msgid "Mumble server is not running" msgstr "Mumble sunucusu çalışmamaktadır" -#: plinth/modules/names/__init__.py:30 +#: plinth/modules/names/__init__.py:29 msgid "HTTP" msgstr "HTTP" -#: plinth/modules/names/__init__.py:31 +#: plinth/modules/names/__init__.py:30 msgid "HTTPS" msgstr "HTTPS" -#: plinth/modules/names/__init__.py:32 +#: plinth/modules/names/__init__.py:31 msgid "SSH" msgstr "SSH" -#: plinth/modules/names/__init__.py:46 plinth/modules/names/views.py:34 +#: plinth/modules/names/__init__.py:45 plinth/modules/names/views.py:34 msgid "Name Services" msgstr "İsim Servisleri" -#: plinth/modules/names/__init__.py:107 -msgid "Not Available" -msgstr "Mevcut değil" - #: plinth/modules/networks/__init__.py:108 #, python-brace-format msgid "Using DNSSEC on IPv{kind}" msgstr "IPv{kind} üzerinde DNSSEC kullanılıyor" #: plinth/modules/networks/forms.py:30 -#: plinth/modules/networks/forms.py:42 msgid "Connection Type" msgstr "Bağlantı Türü" #: plinth/modules/networks/forms.py:37 -#: plinth/modules/networks/forms.py:49 -#: plinth/modules/networks/forms.py:106 -#: plinth/modules/networks/forms.py:133 msgid "Connection Name" msgstr "Bağlantı İsmi" #: plinth/modules/networks/forms.py:39 -#: plinth/modules/networks/forms.py:51 -#: plinth/modules/networks/forms.py:108 -#: plinth/modules/networks/forms.py:135 msgid "Physical Interface" msgstr "Fiziki Arayüz" #: plinth/modules/networks/forms.py:41 -#: plinth/modules/networks/forms.py:53 -#: plinth/modules/networks/forms.py:110 -#: plinth/modules/networks/forms.py:137 msgid "The network device that this connection should be bound to." msgstr "Bu bağlantının bağlanacağı ağ cihazı." #: plinth/modules/networks/forms.py:44 -#: plinth/modules/networks/forms.py:56 -#: plinth/modules/networks/forms.py:113 -#: plinth/modules/networks/forms.py:140 msgid "Firewall Zone" msgstr "Güvenlik Duvarı Alanı" #: plinth/modules/networks/forms.py:45 -#: plinth/modules/networks/forms.py:57 -#: plinth/modules/networks/forms.py:114 -#: plinth/modules/networks/forms.py:141 msgid "" "The firewall zone will control which services are available over this " "interfaces. Select Internal only for trusted networks." @@ -1329,13 +1501,10 @@ msgstr "" "kontrol eder. Dahiliyi sadece güvenilir şebekeler için seçin." #: plinth/modules/networks/forms.py:49 -#: plinth/modules/networks/forms.py:61 -#: plinth/modules/networks/forms.py:162 msgid "IPv4 Addressing Method" msgstr "IPv4 Adresleme Metodu" #: plinth/modules/networks/forms.py:50 -#: plinth/modules/networks/forms.py:62 msgid "" "\"Shared\" method will start a DHCP server and \"Automatic\" method will " "acquire configuration from a DHCP server." @@ -1344,20 +1513,14 @@ msgstr "" "yapılandırmayı bir DHCP sunucusundan alacaktır." #: plinth/modules/networks/forms.py:56 -#: plinth/modules/networks/forms.py:68 -#: plinth/modules/networks/forms.py:170 msgid "Address" msgstr "Adres" #: plinth/modules/networks/forms.py:60 -#: plinth/modules/networks/forms.py:72 -#: plinth/modules/networks/forms.py:174 msgid "Netmask" msgstr "Ağ Maskesi" #: plinth/modules/networks/forms.py:61 -#: plinth/modules/networks/forms.py:73 -#: plinth/modules/networks/forms.py:175 msgid "" "Optional value. If left blank, a default netmask based on the address will " "be used." @@ -1368,85 +1531,62 @@ msgstr "" #: plinth/modules/networks/forms.py:66 #: plinth/modules/networks/templates/connection_show.html:202 #: plinth/modules/networks/templates/connection_show.html:241 -#: plinth/modules/networks/forms.py:78 -#: plinth/modules/networks/forms.py:180 msgid "Gateway" msgstr "Geçit" #: plinth/modules/networks/forms.py:67 -#: plinth/modules/networks/forms.py:79 -#: plinth/modules/networks/forms.py:181 msgid "Optional value." msgstr "Seçime dayalı değer." #: plinth/modules/networks/forms.py:71 -#: plinth/modules/networks/forms.py:83 -#: plinth/modules/networks/forms.py:185 msgid "DNS Server" msgstr "DNS Sunucusu" #: plinth/modules/networks/forms.py:72 -#: plinth/modules/networks/forms.py:84 -#: plinth/modules/networks/forms.py:186 msgid "" "Optional value. If this value is given and IPv4 addressing method is " "\"Automatic\", the DNS Servers provided by a DHCP server will be ignored." msgstr "" -"Seçime dayalı değer. Eğer bu değer belirtildiyse ve IPv4 adresleme metodu \"" -"Otomatik\" ise, DHCP sunucusu tarafından sunulan DNS sunucuları görmezden " +"Seçime dayalı değer. Eğer bu değer belirtildiyse ve IPv4 adresleme metodu " +"\"Otomatik\" ise, DHCP sunucusu tarafından sunulan DNS sunucuları görmezden " "gelinecektir." #: plinth/modules/networks/forms.py:78 -#: plinth/modules/networks/forms.py:90 -#: plinth/modules/networks/forms.py:192 msgid "Second DNS Server" msgstr "İkinci DNS Sunucusu" #: plinth/modules/networks/forms.py:79 -#: plinth/modules/networks/forms.py:91 -#: plinth/modules/networks/forms.py:193 msgid "" "Optional value. If this value is given and IPv4 Addressing Method is " "\"Automatic\", the DNS Servers provided by a DHCP server will be ignored." msgstr "" -"Seçime dayalı değer. Eğer bu değer belirtildiyse ve IPv4 Adresleme Metodu \"" -"Otomatik\" ise, DHCP sunucusu tarafından sunulan DNS sunucuları görmezden " +"Seçime dayalı değer. Eğer bu değer belirtildiyse ve IPv4 Adresleme Metodu " +"\"Otomatik\" ise, DHCP sunucusu tarafından sunulan DNS sunucuları görmezden " "gelinecektir." #: plinth/modules/networks/forms.py:89 -#: plinth/modules/networks/forms.py:30 msgid "-- select --" msgstr "-- seç --" -#: plinth/modules/networks/forms.py:149 -#: plinth/modules/networks/forms.py:121 -msgid "Show password" -msgstr "Parolayı göster" - #: plinth/modules/networks/forms.py:175 #: plinth/modules/networks/templates/connection_show.html:144 -#: plinth/modules/networks/forms.py:145 msgid "SSID" msgstr "SSID" #: plinth/modules/networks/forms.py:176 -#: plinth/modules/networks/forms.py:146 msgid "The visible name of the network." msgstr "Şebekenin görünür ismi." #: plinth/modules/networks/forms.py:178 #: plinth/modules/networks/templates/connection_show.html:157 -#: plinth/modules/networks/forms.py:148 msgid "Mode" msgstr "Kip" #: plinth/modules/networks/forms.py:183 -#: plinth/modules/networks/forms.py:153 msgid "Authentication Mode" msgstr "Kimlik Doğrulama Kipi" #: plinth/modules/networks/forms.py:184 -#: plinth/modules/networks/forms.py:154 msgid "" "Select WPA if the wireless network is secured and requires clients to have " "the password to connect." @@ -1455,7 +1595,6 @@ msgstr "" "olmasını gerektiriyorsa WPA'yi seçin." #: plinth/modules/networks/forms.py:188 -#: plinth/modules/networks/forms.py:158 msgid "Passphrase" msgstr "Parola" @@ -1466,13 +1605,11 @@ msgstr "Ağ Bağlantıları" #: plinth/modules/networks/networks.py:38 #: plinth/modules/networks/networks.py:242 -#: plinth/modules/networks/networks.py:273 msgid "Nearby Wi-Fi Networks" msgstr "Yakındaki Wi-Fi Ağları" #: plinth/modules/networks/networks.py:40 #: plinth/modules/networks/networks.py:264 -#: plinth/modules/networks/networks.py:295 msgid "Add Connection" msgstr "Bağlantı Ekle" @@ -1499,71 +1636,58 @@ msgstr "Bu tip bağlantı henüz anlaşılamamaktadır." #: plinth/modules/networks/networks.py:139 #: plinth/modules/networks/networks.py:198 #: plinth/modules/networks/templates/connections_edit.html:34 -#: plinth/modules/networks/networks.py:170 -#: plinth/modules/networks/networks.py:229 msgid "Edit Connection" msgstr "Bağlantıyı Düzenle" #: plinth/modules/networks/networks.py:209 -#: plinth/modules/networks/networks.py:240 #, python-brace-format msgid "Activated connection {name}." msgstr "{name} bağlantısı etkinleştirildi." #: plinth/modules/networks/networks.py:212 -#: plinth/modules/networks/networks.py:243 msgid "Failed to activate connection: Connection not found." msgstr "Bağlantı etkinleştirilemedi: bağlantı bulunamadı." #: plinth/modules/networks/networks.py:216 -#: plinth/modules/networks/networks.py:247 #, python-brace-format msgid "Failed to activate connection {name}: No suitable device is available." msgstr "" "{name} isimli bağlantı etkinleştirilemedi: hiçbir uygun cihaz mevcut değil." #: plinth/modules/networks/networks.py:229 -#: plinth/modules/networks/networks.py:260 #, python-brace-format msgid "Deactivated connection {name}." msgstr "{name} isimli bağlantı devre dışı bırakıldı." #: plinth/modules/networks/networks.py:232 -#: plinth/modules/networks/networks.py:263 msgid "Failed to de-activate connection: Connection not found." -msgstr "Bağlantının devre dışı bırakılması başarısız oldu: bağlantı bulunamadı." +msgstr "" +"Bağlantının devre dışı bırakılması başarısız oldu: bağlantı bulunamadı." #: plinth/modules/networks/networks.py:282 -#: plinth/modules/networks/networks.py:325 msgid "Adding New Ethernet Connection" msgstr "Yeni Ethernet Bağlantısı Ekleniyor" #: plinth/modules/networks/networks.py:300 -#: plinth/modules/networks/networks.py:350 msgid "Adding New PPPoE Connection" msgstr "Yeni PPPoE Bağlantısı Ekleniyor" #: plinth/modules/networks/networks.py:332 -#: plinth/modules/networks/networks.py:399 msgid "Adding New Wi-Fi Connection" msgstr "Yeni Kablosuz Bağlantı Ekleniyor" #: plinth/modules/networks/networks.py:346 -#: plinth/modules/networks/networks.py:413 #, python-brace-format msgid "Connection {name} deleted." msgstr "{name} isimli bağlantı silindi." #: plinth/modules/networks/networks.py:349 #: plinth/modules/networks/networks.py:358 -#: plinth/modules/networks/networks.py:416 -#: plinth/modules/networks/networks.py:425 msgid "Failed to delete connection: Connection not found." msgstr "Bağlantının silinmesi başarısız oldu: bağlantı bulunamadı." #: plinth/modules/networks/networks.py:363 #: plinth/modules/networks/templates/connections_delete.html:26 -#: plinth/modules/networks/networks.py:430 msgid "Delete Connection" msgstr "Bağlantıyı Sil" @@ -1572,8 +1696,7 @@ msgid "Edit connection" msgstr "Bağlantıyı Düzenle" #: plinth/modules/networks/templates/connection_show.html:43 -#: plinth/templates/base.html:121 -#: plinth/templates/base.html:119 +#: plinth/templates/base.html:123 msgid "Edit" msgstr "Düzenle" @@ -1719,30 +1842,47 @@ msgid "Firewall zone" msgstr "Güvenlik duvarı alanı" #: plinth/modules/networks/templates/connection_show.html:280 +#, fuzzy +#| msgid "" +#| "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." msgid "" -"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." +"This interface should be connected to a 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." msgstr "" "Bu arayüz yerel ağa/makineye bağlı olmalıdır. Eğer bu arayüzü herkese açık " "bir şebekeye bağlarsanız, sadece dahili olması amaçlanan servislere harici " "erişim mümkün olacaktır. Bu bir güvenlik riskidir." #: plinth/modules/networks/templates/connection_show.html:300 +#, fuzzy +#| msgid "" +#| "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." msgid "" -"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." +"This interface should receive your Internet connection. If you connect it to " +"a local network/machine, many services meant to available only internally " +"will not be available." msgstr "" "Bu arayüz sizin İnternet bağlantınızı almalıdır. Eğer onu yerel bir ağ/" "makineye bağlarsanız, sadece dahili olarak erişilebilir olması amaçlanan " "servislerin birçoğuna erişim mümkün olmayacaktır." #: plinth/modules/networks/templates/connection_show.html:319 -msgid "" -"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 " +#, fuzzy, python-format +#| msgid "" +#| "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." +msgid "" +"This interface is not maintained by %(box_name)s. Its security status is " +"unknown to %(box_name)s. Many %(box_name)s services may not be available on " +"this interface. It is recommended that you deactivate or delete this " "connection and re-configure it." msgstr "" "Bu arayüz FreedomBox tarafından korunmaz. Güvenlik durumu FreedomBox " @@ -1835,10 +1975,17 @@ msgid "Enable OpenVPN server" msgstr "OpenVPN sunucusunu etkinleştir" #: plinth/modules/openvpn/templates/openvpn.html:38 -#, python-format +#, fuzzy, python-format +#| msgid "" +#| "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 %(box_name)s in order to join " +#| "your home network and access private/internal services provided by " +#| "%(box_name)s. You can also access the rest of the Internet via " +#| "%(box_name)s for added security and anonymity." msgid "" "Virtual Private Network (VPN) is a technique for securely connecting two " -"machines in order to access resources of a private network. While you are " +"devices in order to access resources of a private network. While you are " "away from home, you can connect to your %(box_name)s in order to join your " "home network and access private/internal services provided by %(box_name)s. " "You can also access the rest of the Internet via %(box_name)s for added " @@ -1856,21 +2003,28 @@ msgid "Profile" msgstr "Profil" #: plinth/modules/openvpn/templates/openvpn.html:54 -#, python-format +#, fuzzy, python-format +#| msgid "" +#| "To connect to %(box_name)s'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 documentation on recommended clients and instructions on how to " +#| "configure them." msgid "" "To connect to %(box_name)s'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 documentation on recommended clients and instructions on how to " "configure them." msgstr "" "%(box_name)s kutusunun VPN'ine erişmek için bir profil indirmeniz ve bunu " "mobil ya da masaüstü makinenize yüklemeniz gerekir. OpenVPN istemcileri " "platformların çoğu için mevcuttur. Tavsiye edilen istemciler ve onları " -"yapılandırma talimatları için belgelendirmeyi okuyun." +"yapılandırma talimatları için belgelendirmeyi " +"okuyun." #: plinth/modules/openvpn/templates/openvpn.html:66 #, python-format @@ -1974,9 +2128,9 @@ msgid "" "owncloud\">/owncloud path on the web server. Visit this URL to set up " "the initial administration account for ownCloud." msgstr "" -"Etkinleştirildiğinde ownCloud kurulumuna web sunucusunun /owncloud yoluyla erişim mümkün olacaktır. ownCloud için ilk " -"yönetici hesabını yapılandırmak için bu bağlantıyı ziyaret edin." +"Etkinleştirildiğinde ownCloud kurulumuna web sunucusunun /owncloud yoluyla erişim mümkün olacaktır. ownCloud için ilk yönetici " +"hesabını yapılandırmak için bu bağlantıyı ziyaret edin." #: plinth/modules/owncloud/templates/owncloud.html:59 msgid "Apply changes" @@ -2085,8 +2239,8 @@ msgid "" "This service is available as a standard service. Please use the \"Standard " "Services\" page to enable it." msgstr "" -"Bu servis standart bir servis olarak mevcuttur. Etkinleştirmek için lütfen \"" -"Standart Servisler\" sayfasını kullanın." +"Bu servis standart bir servis olarak mevcuttur. Etkinleştirmek için lütfen " +"\"Standart Servisler\" sayfasını kullanın." #: plinth/modules/pagekite/forms.py:234 msgid "Added custom service" @@ -2196,9 +2350,9 @@ msgid "" msgstr "" "PageKite NAT, güvenlik duvarları ve IP adresi sınırlamalarına rağmen tünel " "ve ters vekil sunucular birleşimini kullanarak işleyebilir. Herhangi bir " -"pagekite servis sağlayıcısını kullanabilirsiniz, örneğin pagekite.net. Gelecekte bunun için " -"arkadaşlarınızın %(box_name)s kutusunu kullanmanız mümkün olacaktır." +"pagekite servis sağlayıcısını kullanabilirsiniz, örneğin pagekite.net. Gelecekte bunun için arkadaşlarınızın " +"%(box_name)s kutusunu kullanmanız mümkün olacaktır." #: plinth/modules/pagekite/templates/pagekite_introduction.html:78 #: plinth/modules/pagekite/views.py:36 @@ -2252,8 +2406,8 @@ msgid "" "See SSH client setup instructions" msgstr "" -"SSH istemci kurulum talimatlarını okuyun" +"SSH istemci kurulum talimatlarını okuyun" #: plinth/modules/pagekite/utils.py:276 msgid "Pagekite" @@ -2354,9 +2508,9 @@ msgstr "" "Privoxy'yi tarayıcınızın vekil sunucu ayarlarını %(box_name)s kutunuzun " "makine ismine (ya da IP adresine) 8118 numaralı port ile ayarlayarak " "kullanabilirsiniz. Privoxy'yi kullanırken belgelendirmesini ve yapılandırma " -"ayrıntılarını http://config.privoxy.org/ veya http://p.p " -"adresinde görebilirsiniz." +"ayrıntılarını http://config.privoxy." +"org/ veya http://p.p adresinde " +"görebilirsiniz." #: plinth/modules/privoxy/templates/privoxy.html:53 msgid "Privoxy is running" @@ -2406,8 +2560,8 @@ msgid "" msgstr "" "Quassel çekirdeğine varsayılan Quassel portu olan 4242 numaralı porttan " "bağlanabilirsiniz. Quassel'e bağlanacak masaüstü ve mobil cihaz istemcileri mevcuttur." +"downloads\">masaüstü ve mobil cihaz istemcileri mevcuttur." #: plinth/modules/quassel/templates/quassel.html:55 msgid "Quassel core service is running" @@ -2417,6 +2571,64 @@ msgstr "Quassel çekirdek servisi çalışmaktadır" msgid "Quassel core service is not running" msgstr "Quassel çekirdek servisi çalışmamaktadır" +#: plinth/modules/repro/__init__.py:36 +#: plinth/modules/repro/templates/repro.html:26 +#: plinth/modules/repro/views.py:55 +#, fuzzy +#| msgid "Server port" +msgid "SIP Server (repro)" +msgstr "Sunucu portu" + +#: plinth/modules/repro/__init__.py:41 +#, fuzzy +#| msgid "Second DNS Server" +msgid "repro SIP Server" +msgstr "İkinci DNS Sunucusu" + +#: plinth/modules/repro/forms.py:29 +#, fuzzy +#| msgid "Enable Quassel core service" +msgid "Enable repro service" +msgstr "Quassel çekirdek servisini etkinleştir" + +#: plinth/modules/repro/templates/repro.html:29 +msgid "" +"repro provides various SIP services that a SIP softphone can utilize to " +"provide audio and video calls as well as presence and instant messaging. " +"repro provides a server and SIP user accounts that clients can use to let " +"their presence known. It also acts as a proxy to federate SIP " +"communications to other servers on the Internet similar to email." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:39 +msgid "" +"To make SIP calls, a client application is needed. Available clients include " +"Jitsi (for computers) and CSipSimple (for Android phones)." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:48 +msgid "" +"Note: Before using repro, domains and users will need to " +"be configured using the web-based " +"configuration panel. Users in the admin group will be able to " +"log in to the repro configuration panel. After setting the domain, it is " +"required to restart the repro service. Disable the service and re-enable it." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:63 +#, fuzzy +#| msgid "Quassel core service is running" +msgid "repro service is running" +msgstr "Quassel çekirdek servisi çalışmaktadır" + +#: plinth/modules/repro/templates/repro.html:66 +#, fuzzy +#| msgid "Quassel core service is not running" +msgid "repro service is not running" +msgstr "Quassel çekirdek servisi çalışmamaktadır" + #: plinth/modules/restore/__init__.py:36 #: plinth/modules/restore/templates/restore_index.html:26 #: plinth/modules/restore/views.py:46 @@ -2432,13 +2644,19 @@ msgid "Enable reStore" msgstr "reStore'u Etkinleştir" #: plinth/modules/restore/templates/restore_index.html:29 -#, python-format +#, fuzzy, python-format +#| msgid "" +#| "reStore is a server for unhosted web " +#| "applications. The idea is to uncouple web applications from data. No " +#| "matter where a web application is served from, the data can be stored on " +#| "an unhosted storage server of user's choice. With reStore, your " +#| "%(cfg.box_name)s becomes your unhosted storage server." msgid "" "reStore is a server for unhosted web " "applications. The idea is to uncouple web applications from data. No " "matter where a web application is served from, the data can be stored on an " -"unhosted storage server of user's choice. With reStore, your " -"%(cfg.box_name)s becomes your unhosted storage server." +"unhosted storage server of user's choice. With reStore, your %(box_name)s " +"becomes your unhosted storage server." msgstr "" "reStore, barındırılmayan (unhosted) ağ " "uygulamaları için bir sunucudur. Öne çıkan fikir, ağ uygulamalarının " @@ -2504,9 +2722,8 @@ msgstr "" "GMail için kullanıcı ismi GMail adresiniz, parolanız Google hesap parolanız " "ve sunucu ise imaps://imap.gmail.com olacaktır. Google hesap " "seçeneklerinde (https://www.google.com/settings/security/lesssecureapps) \"daha az " -"güvenli uygulamalara\" müsaade etmeniz gerekeceğini unutmayın." +"lesssecureapps\" >https://www.google.com/settings/security/lesssecureapps) \"daha az güvenli uygulamalara\" müsaade etmeniz gerekeceğini unutmayın." #: plinth/modules/shaarli/__init__.py:37 #: plinth/modules/shaarli/templates/shaarli.html:26 @@ -2532,8 +2749,8 @@ msgid "" "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." msgstr "" -"Etkinleştirildiğinde, Shaarli'ye ağ sunucusunda /shaarli yolunda erişilebilecektir. Shaarli'nin ilk ziyaretinizde " +"Etkinleştirildiğinde, Shaarli'ye ağ sunucusunda /" +"shaarli yolunda erişilebilecektir. Shaarli'nin ilk ziyaretinizde " "ayarlamanız gerekecek olan sadece tek bir kullanıcı hesabını desteklediğini " "unutmayın." @@ -2543,8 +2760,7 @@ msgstr "Sistem" #: plinth/modules/system/system.py:33 #: plinth/modules/system/templates/system.html:25 -#: plinth/templates/base.html:107 -#: plinth/templates/base.html:105 +#: plinth/templates/base.html:109 msgid "System Configuration" msgstr "Sistem Yapılandırması" @@ -2561,33 +2777,81 @@ msgstr "" "Seçenekler %(box_name)s kutusunu en genel düzeyde etkiler, bu nedenle " "dikkatli olun!" -#: plinth/modules/tor/__init__.py:50 +#: plinth/modules/tor/__init__.py:48 plinth/modules/tor/templates/tor.html:35 +msgid "Anonymity Network (Tor)" +msgstr "Anonimlik Ağı (Tor)" + +#: plinth/modules/tor/__init__.py:53 +#, fuzzy +#| msgid "Anonymity Network (Tor)" +msgid "Tor Anonymity Network" +msgstr "Anonimlik Ağı (Tor)" + +#: plinth/modules/tor/__init__.py:58 +msgid "Tor Bridge Relay" +msgstr "" + +#: plinth/modules/tor/__init__.py:76 plinth/modules/tor/views.py:144 +msgid "Tor Hidden Service" +msgstr "Tor Gizli Servisi" + +#: plinth/modules/tor/__init__.py:222 msgid "Tor relay port available" msgstr "Tor geçit portu mevcuttur" -#: plinth/modules/tor/__init__.py:58 +#: plinth/modules/tor/__init__.py:230 msgid "Obfs3 transport registered" msgstr "Obfs3 taşıma kayıtlıdır" -#: plinth/modules/tor/__init__.py:64 +#: plinth/modules/tor/__init__.py:236 msgid "Obfs4 transport registered" msgstr "Obfs4 taşıma kayıtlıdır" -#: plinth/modules/tor/__init__.py:101 +#: plinth/modules/tor/__init__.py:273 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "{url} bağlantısına tcp{kind} üzerinden Tor vasıtasıyla eriş" -#: plinth/modules/tor/__init__.py:112 +#: plinth/modules/tor/__init__.py:284 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "tcp{kind} üzerinden {url} konumunda Tor kullanımını teyit et" -#: plinth/modules/tor/templates/tor.html:26 plinth/modules/tor/tor.py:66 -msgid "Anonymity Network (Tor)" -msgstr "Anonimlik Ağı (Tor)" +#: plinth/modules/tor/forms.py:32 +msgid "Enable Tor" +msgstr "Tor'u Etkinleştir" + +#: plinth/modules/tor/forms.py:35 +msgid "Enable Tor Hidden Service" +msgstr "Tor Gizli Servisi Etkinleştir" + +#: plinth/modules/tor/forms.py:38 +#, fuzzy, python-brace-format +#| msgid "" +#| "A hidden service will allow FreedomBox to provide selected services (such " +#| "as ownCloud or Chat) without revealing its location." +msgid "" +"A hidden service will allow {box_name} to provide selected services (such as " +"ownCloud or chat) without revealing its location." +msgstr "" +"Gizli servisler FreedomBox'un (ownCloud ya da sohbet gibi) seçili servisleri " +"konumunu ortaya çıkarmadan sağlamasına imkân verir." + +#: plinth/modules/tor/forms.py:42 +msgid "Download software packages over Tor" +msgstr "Yazılım paketlerini Tor üzerinden indir" + +#: plinth/modules/tor/forms.py:44 +msgid "" +"When enabled, software will be downloaded over the Tor network for " +"installations and upgrades. This adds a degree of privacy and security " +"during software downloads." +msgstr "" +"Etkinleştirildiğinde, kurulum ve güncellemeler için yazılımlar Tor ağı " +"üzerinden indirilecektir. Bu, yazılım indirmeleri sırasında bir derece " +"güvenlilik ve gizlilik ekler." -#: plinth/modules/tor/templates/tor.html:29 +#: plinth/modules/tor/templates/tor.html:38 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -2601,28 +2865,34 @@ msgstr "" "href=\"https://www.torproject.org/download/download-easy.html\"> Tor " "Tarayıcısını kullanmanızı tavsiye eder." -#: plinth/modules/tor/templates/tor.html:44 +#: plinth/modules/tor/templates/tor.html:54 +#, fuzzy +#| msgid "Configuration updated" +msgid "Tor configuration is being updated" +msgstr "Kurulum güncellendi" + +#: plinth/modules/tor/templates/tor.html:62 msgid "Tor is running" msgstr "Tor çalışmaktadır" -#: plinth/modules/tor/templates/tor.html:47 +#: plinth/modules/tor/templates/tor.html:65 msgid "Tor is not running" msgstr "Tor çalışmamaktadır" -#: plinth/modules/tor/templates/tor.html:59 +#: plinth/modules/tor/templates/tor.html:77 msgid "Hidden Service" msgstr "Gizli Servis" -#: plinth/modules/tor/templates/tor.html:60 -#: plinth/modules/tor/templates/tor.html:102 +#: plinth/modules/tor/templates/tor.html:78 +#: plinth/modules/tor/templates/tor.html:120 msgid "Port" msgstr "Port" -#: plinth/modules/tor/templates/tor.html:85 +#: plinth/modules/tor/templates/tor.html:103 msgid "Bridge" msgstr "Köprü" -#: plinth/modules/tor/templates/tor.html:88 +#: plinth/modules/tor/templates/tor.html:106 #, python-format msgid "" "Your %(box_name)s is configured as a Tor bridge with obfsproxy, so it can " @@ -2635,92 +2905,43 @@ msgstr "" "güvenlik duvarı arkasındaysa ve gerekiyorsa aşağıdaki bağlantı noktalarının " "(port) açık ve yönlendirilmiş olduğundan emin olun:" -#: plinth/modules/tor/templates/tor.html:101 +#: plinth/modules/tor/templates/tor.html:119 msgid "Service" msgstr "Servis" -#: plinth/modules/tor/templates/tor.html:117 +#: plinth/modules/tor/templates/tor.html:135 msgid "SOCKS" msgstr "SOCKS" -#: plinth/modules/tor/templates/tor.html:120 +#: plinth/modules/tor/templates/tor.html:138 #, python-format msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "" "Bir Tor SOCKS bağlantı noktası %(box_name)s kutunuzda TCP 9050 numaralı " "portta mevcuttur." -#: plinth/modules/tor/tor.py:46 -msgid "Enable Tor" -msgstr "Tor'u Etkinleştir" - -#: plinth/modules/tor/tor.py:49 -msgid "Enable Tor Hidden Service" -msgstr "Tor Gizli Servisi Etkinleştir" - -#: plinth/modules/tor/tor.py:51 -msgid "" -"A hidden service will allow FreedomBox to provide selected services (such as " -"ownCloud or Chat) without revealing its location." -msgstr "" -"Gizli servisler FreedomBox'un (ownCloud ya da sohbet gibi) seçili servisleri " -"konumunu ortaya çıkarmadan sağlamasına imkân verir." - -#: plinth/modules/tor/tor.py:55 -msgid "Download software packages over Tor" -msgstr "Yazılım paketlerini Tor üzerinden indir" - -#: plinth/modules/tor/tor.py:57 -msgid "" -"When enabled, software will be downloaded over the Tor network for " -"installations and upgrades. This adds a degree of privacy and security " -"during software downloads." -msgstr "" -"Etkinleştirildiğinde, kurulum ve güncellemeler için yazılımlar Tor ağı " -"üzerinden indirilecektir. Bu, yazılım indirmeleri sırasında bir derece " -"güvenlilik ve gizlilik ekler." - -#: plinth/modules/tor/tor.py:85 plinth/modules/tor/tor.py:285 -msgid "Tor Hidden Service" -msgstr "Tor Gizli Servisi" - -#: plinth/modules/tor/tor.py:115 +#: plinth/modules/tor/views.py:68 msgid "Tor Control Panel" msgstr "Tor Kontrol Panosu" -#: plinth/modules/tor/tor.py:240 +#: plinth/modules/tor/views.py:79 #, python-brace-format msgid "Action error: {0} [{1}] [{2}]" msgstr "Eylem hatası: {0} [{1}] [{2}]" -#: plinth/modules/tor/tor.py:256 -msgid "Tor enabled" -msgstr "Tor etkindir" - -#: plinth/modules/tor/tor.py:259 -msgid "Tor disabled" -msgstr "Tor devre dışıdır" - -#: plinth/modules/tor/tor.py:264 -msgid "Tor hidden service enabled" -msgstr "Tor gizli servisi etkindir" - -#: plinth/modules/tor/tor.py:267 -msgid "Tor hidden service disabled" -msgstr "Tor gizli servisi devre dışıdır" - -#: plinth/modules/tor/tor.py:292 -msgid "Enabled package download over Tor" -msgstr "Yazılım paketlerinin Tor üzerinden indirilmesi etkinleştirildi" +#: plinth/modules/tor/views.py:148 +#, fuzzy +#| msgid "Configuration updated" +msgid "Configuration updated." +msgstr "Kurulum güncellendi" -#: plinth/modules/tor/tor.py:295 -msgid "Disabled package download over Tor" -msgstr "Yazılım paketlerinin Tor üzerinden indirilmesi devre dışı bırakıldı" +#: plinth/modules/tor/views.py:150 +msgid "An error occurred during configuration." +msgstr "" #: plinth/modules/transmission/__init__.py:38 #: plinth/modules/transmission/templates/transmission.html:26 #: plinth/modules/transmission/views.py:67 -#: plinth/modules/transmission/views.py:63 msgid "BitTorrent (Transmission)" msgstr "BitTorrent (Transmission)" @@ -2799,73 +3020,72 @@ msgstr "" "Etkinleştirildiğinde unattended-upgrades programı günde bir kez " "çalıştırılacaktır. Mevcut paket yükseltmelerini uygulamayı deneyecektir." -#: plinth/modules/upgrades/templates/upgrades.html:40 -msgid "There was an error while upgrading." -msgstr "Yükseltme sırasında bir hata meydana geldi." - -#: plinth/modules/upgrades/templates/upgrades.html:43 -#: plinth/modules/upgrades/templates/upgrades.html:59 -msgid "Output from unattended-upgrades:" -msgstr "unattended-upgrades çıktısı:" - -#: plinth/modules/upgrades/templates/upgrades.html:50 -msgid "The operating system is up to date now.  " -msgstr "İşletim sistemi artık günceldir.  " - -#: plinth/modules/upgrades/templates/upgrades.html:53 -msgid "Show Details" -msgstr "Ayrıntıları Göster" +#: plinth/modules/upgrades/templates/upgrades.html:37 +msgid "" +"Upgrades install the latest software and security updates. When automatic " +"upgrades are enabled, upgrades are automatically run every night. You don't " +"normally need to start the upgrade process." +msgstr "" -#: plinth/modules/upgrades/templates/upgrades.html:69 +#: plinth/modules/upgrades/templates/upgrades.html:45 msgid "" -"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." +"Depending on the number of packages to install, this may take a long time to " +"complete. While upgrades are in progress, you will not be able to install " +"other packages. During the upgrade, this web interface may be temporarily " +"unavailable and show an error. Refresh the page to continue." msgstr "" -"Bu, sisteminizi en güncel Debian paketlerine yükseltmeyi deneyecek " -"unattended-upgrades programını çalıştıracaktır. Tamamlanması birkaç dakika " -"alabilir." -#: plinth/modules/upgrades/templates/upgrades.html:80 +#: plinth/modules/upgrades/templates/upgrades.html:58 msgid "Upgrade now »" msgstr "Şimdi yükselt »" -#: plinth/modules/upgrades/templates/upgrades.html:87 -msgid "System is being upgraded." -msgstr "Sistem yükseltilmektedir." +#: plinth/modules/upgrades/templates/upgrades.html:65 +#, fuzzy +#| msgid "ejabberd is running" +msgid "A package manager is running." +msgstr "ejabberd çalışmaktadır" + +#: plinth/modules/upgrades/templates/upgrades.html:70 +msgid "Recent log from upgrades:" +msgstr "" -#: plinth/modules/upgrades/views.py:35 plinth/modules/upgrades/views.py:64 +#: plinth/modules/upgrades/views.py:36 plinth/modules/upgrades/views.py:66 msgid "Automatic Upgrades" msgstr "Otomatik Yükseltmeler" -#: plinth/modules/upgrades/views.py:37 +#: plinth/modules/upgrades/views.py:38 msgid "Upgrade Packages" msgstr "Paketleri Yükselt" -#: plinth/modules/upgrades/views.py:75 +#: plinth/modules/upgrades/views.py:96 +#, fuzzy +#| msgid "Upgrade completed." +msgid "Upgrade process started." +msgstr "Yükseltme tamamlandı." + +#: plinth/modules/upgrades/views.py:99 +#, fuzzy +#| msgid "Upgrade failed." +msgid "Starting upgrade failed." +msgstr "Yükseltme başarısız oldu." + +#: plinth/modules/upgrades/views.py:102 msgid "Package Upgrades" msgstr "Paket Yükseltmeler" -#: plinth/modules/upgrades/views.py:116 +#: plinth/modules/upgrades/views.py:131 #, python-brace-format msgid "Error when configuring unattended-upgrades: {error}" msgstr "unattended-upgrades yapılandırılırken bir hata oluştu: {error}" -#: plinth/modules/upgrades/views.py:121 +#: plinth/modules/upgrades/views.py:136 msgid "Automatic upgrades enabled" msgstr "Otomatik yükseltmeler etkinleştirildi" -#: plinth/modules/upgrades/views.py:123 +#: plinth/modules/upgrades/views.py:138 msgid "Automatic upgrades disabled" msgstr "Otomatik yükseltmeler devre dışı bırakıldı" -#: plinth/modules/upgrades/views.py:142 -msgid "Upgrade completed." -msgstr "Yükseltme tamamlandı." - -#: plinth/modules/upgrades/views.py:144 -msgid "Upgrade failed." -msgstr "Yükseltme başarısız oldu." - #: plinth/modules/users/__init__.py:36 msgid "Users and Groups" msgstr "Kullanıcılar ve Gruplar" @@ -2906,19 +3126,30 @@ msgstr "" msgid "Failed to add new user to {group} group." msgstr "{group} grubuna yeni kullanıcı ilâve edilmesi başarısız oldu." -#: plinth/modules/users/forms.py:126 +#: plinth/modules/users/forms.py:92 +msgid "SSH Keys" +msgstr "" + +#: plinth/modules/users/forms.py:96 +msgid "" +"Setting an SSH public key will allow this user to securely log in to the " +"system without using a password. You may enter multiple keys, one on each " +"line. Blank lines and lines starting with # will be ignored." +msgstr "" + +#: plinth/modules/users/forms.py:136 msgid "Renaming LDAP user failed." msgstr "LDAP kullanıcısının tekrar adlandırılması başarısız oldu." -#: plinth/modules/users/forms.py:138 +#: plinth/modules/users/forms.py:148 msgid "Failed to remove user from group." msgstr "Kullanıcının gruptan kaldırılması başarısız oldu." -#: plinth/modules/users/forms.py:149 +#: plinth/modules/users/forms.py:159 msgid "Failed to add user to group." msgstr "Kullanıcının gruba eklenmesi başarısız oldu." -#: plinth/modules/users/forms.py:174 +#: plinth/modules/users/forms.py:188 msgid "Changing LDAP user password failed." msgstr "LDAP kullanıcı parolasının değiştirilmesi başarısız oldu." @@ -2937,7 +3168,7 @@ msgid "Create User" msgstr "Kullanıcı Oluştur" #: plinth/modules/users/templates/users_delete.html:26 -#: plinth/modules/users/views.py:103 +#: plinth/modules/users/views.py:110 msgid "Delete User" msgstr "Kullanıcıyı Sil" @@ -2992,20 +3223,20 @@ msgstr "%(username)s kullanıcısı güncellendi." msgid "Edit User" msgstr "Kullanıcıyı Düzenle" -#: plinth/modules/users/views.py:113 +#: plinth/modules/users/views.py:120 #, python-brace-format msgid "User {user} deleted." msgstr "{user} kullanıcısı silindi." -#: plinth/modules/users/views.py:120 +#: plinth/modules/users/views.py:127 msgid "Deleting LDAP user failed." msgstr "LDAP kullanıcısının silinmesi başarısız oldu." -#: plinth/modules/users/views.py:129 +#: plinth/modules/users/views.py:136 msgid "Change Password" msgstr "Parolayı Değiştir" -#: plinth/modules/users/views.py:130 +#: plinth/modules/users/views.py:137 msgid "Password changed successfully." msgstr "Parola başarılı bir şekilde değiştirildi." @@ -3089,8 +3320,10 @@ msgstr "SSL (Secure Socket Layer) üzerinden Web Sunucusu" msgid "Secure Shell (SSH) Server" msgstr "Güvenli Kabuk (SSH) Sunucusu" -#: plinth/service.py:78 -msgid "FreedomBox Web Interface (Plinth)" +#: plinth/service.py:79 +#, fuzzy, python-brace-format +#| msgid "FreedomBox Web Interface (Plinth)" +msgid "{box_name} Web Interface (Plinth)" msgstr "FreedomBox Ağ Arayüzü (Plinth)" #: plinth/templates/404.html:25 @@ -3123,40 +3356,29 @@ msgid "" "\">bug tracker so we can fix it." msgstr "" "Bu dahili bir hatadır ve sizin yaptığınız ya da giderebileceğiniz bir hata " -"değildir. Lütfen hatayı hata izleyicisinde rapor edin ki sorunu giderebilelim." +"değildir. Lütfen hatayı hata izleyicisinde rapor edin ki sorunu giderebilelim." #: plinth/templates/base.html:49 -msgid "Plinth administrative interface for the FreedomBox" +#, fuzzy, python-format +#| msgid "Plinth administrative interface for the FreedomBox" +msgid "Plinth administrative interface for the %(box_name)s" msgstr "FreedomBox için Plinth yönetim arayüzü" -#: plinth/templates/base.html:52 -#: plinth/templates/base.html.py:88 -msgid "FreedomBox" -msgstr "FreedomBox" - -#: plinth/templates/base.html:81 +#: plinth/templates/base.html:83 msgid "Toggle navigation" msgstr "Tarama Geçişi" -#: plinth/templates/base.html:123 plinth/templates/base.html.py:124 -#: plinth/templates/base.html:121 -#: plinth/templates/base.html.py:122 +#: plinth/templates/base.html:125 plinth/templates/base.html.py:126 msgid "Change password" msgstr "Parolayı değiştir" -#: plinth/templates/base.html:127 plinth/templates/base.html.py:128 -#: plinth/templates/base.html:141 plinth/templates/base.html.py:143 -#: plinth/templates/base.html:125 -#: plinth/templates/base.html.py:126 -#: plinth/templates/base.html:139 -#: plinth/templates/base.html.py:141 +#: plinth/templates/base.html:129 plinth/templates/base.html.py:130 +#: plinth/templates/base.html:143 plinth/templates/base.html.py:145 msgid "Log out" msgstr "Çıkış yap" -#: plinth/templates/base.html:133 plinth/templates/base.html.py:135 -#: plinth/templates/base.html:131 -#: plinth/templates/base.html.py:133 +#: plinth/templates/base.html:135 plinth/templates/base.html.py:137 msgid "Log in" msgstr "Giriş yap" @@ -3197,3 +3419,64 @@ msgstr "%(package_names)s kuruluyor: %(status)s" #, python-format msgid "%(percentage)s%% complete" msgstr "%(percentage)s%% tamamlandı" + +#~ msgid "show password" +#~ msgstr "parolayı göster" + +#~ msgid "The following is the current status:" +#~ msgstr "Aşağıdaki güncel durumdur:" + +#~ msgid "FreedomBox Manual" +#~ msgstr "FreedomBox Kullanım Kılavuzu" + +#~ msgid "" +#~ "Many FreedomBox contributors and users are also available on the " +#~ "#freedombox channel of the irc.oftc.net IRC network." +#~ msgstr "" +#~ "Birçok FreedomBox iştirakçileri ve kullanıcıları irc.oftc.net IRC " +#~ "ağındaki #freedombox kanalındadır." + +#~ msgid "Create Wiki/Blog" +#~ msgstr "Viki/Blog Oluştur" + +#~ msgid "Tor enabled" +#~ msgstr "Tor etkindir" + +#~ msgid "Tor disabled" +#~ msgstr "Tor devre dışıdır" + +#~ msgid "Tor hidden service enabled" +#~ msgstr "Tor gizli servisi etkindir" + +#~ msgid "Tor hidden service disabled" +#~ msgstr "Tor gizli servisi devre dışıdır" + +#~ msgid "Enabled package download over Tor" +#~ msgstr "Yazılım paketlerinin Tor üzerinden indirilmesi etkinleştirildi" + +#~ msgid "Disabled package download over Tor" +#~ msgstr "Yazılım paketlerinin Tor üzerinden indirilmesi devre dışı bırakıldı" + +#~ msgid "There was an error while upgrading." +#~ msgstr "Yükseltme sırasında bir hata meydana geldi." + +#~ msgid "Output from unattended-upgrades:" +#~ msgstr "unattended-upgrades çıktısı:" + +#~ msgid "The operating system is up to date now.  " +#~ msgstr "İşletim sistemi artık günceldir.  " + +#~ msgid "Show Details" +#~ msgstr "Ayrıntıları Göster" + +#~ msgid "" +#~ "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." +#~ msgstr "" +#~ "Bu, sisteminizi en güncel Debian paketlerine yükseltmeyi deneyecek " +#~ "unattended-upgrades programını çalıştıracaktır. Tamamlanması birkaç " +#~ "dakika alabilir." + +#~ msgid "System is being upgraded." +#~ msgstr "Sistem yükseltilmektedir." diff --git a/plinth/locale/zh_CN/LC_MESSAGES/django.po b/plinth/locale/zh_CN/LC_MESSAGES/django.po index 099853fec..21eb0148e 100644 --- a/plinth/locale/zh_CN/LC_MESSAGES/django.po +++ b/plinth/locale/zh_CN/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-01-28 08:07+0530\n" +"POT-Creation-Date: 2016-01-31 22:19+0530\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -111,7 +111,7 @@ msgstr "" #: plinth/modules/privoxy/templates/privoxy.html:48 #: plinth/modules/quassel/templates/quassel.html:50 #: plinth/modules/repro/templates/repro.html:58 -#: plinth/modules/tor/templates/tor.html:39 +#: plinth/modules/tor/templates/tor.html:48 #: plinth/modules/transmission/templates/transmission.html:42 #: plinth/modules/xmpp/templates/xmpp.html:58 msgid "Status" @@ -137,7 +137,7 @@ msgstr "" #: plinth/modules/repro/templates/repro.html:72 #: plinth/modules/roundcube/templates/roundcube.html:62 #: plinth/modules/shaarli/templates/shaarli.html:40 -#: plinth/modules/tor/templates/tor.html:74 +#: plinth/modules/tor/templates/tor.html:92 #: plinth/modules/transmission/templates/transmission.html:56 #: plinth/modules/xmpp/templates/xmpp.html:72 msgid "Configuration" @@ -157,7 +157,7 @@ msgstr "" #: plinth/modules/restore/templates/restore_index.html:54 #: plinth/modules/roundcube/templates/roundcube.html:70 #: plinth/modules/shaarli/templates/shaarli.html:48 -#: plinth/modules/tor/templates/tor.html:82 +#: plinth/modules/tor/templates/tor.html:100 #: plinth/modules/transmission/templates/transmission.html:64 #: plinth/modules/upgrades/templates/upgrades_configure.html:34 #: plinth/modules/xmpp/templates/xmpp.html:80 @@ -182,7 +182,7 @@ msgstr "" #: plinth/modules/owncloud/owncloud.py:93 plinth/modules/privoxy/views.py:85 #: plinth/modules/quassel/views.py:78 plinth/modules/repro/views.py:79 #: plinth/modules/restore/views.py:70 plinth/modules/roundcube/views.py:86 -#: plinth/modules/shaarli/views.py:76 plinth/modules/tor/tor.py:252 +#: plinth/modules/shaarli/views.py:76 plinth/modules/tor/views.py:111 #: plinth/modules/transmission/views.py:111 #: plinth/modules/upgrades/views.py:118 plinth/modules/xmpp/views.py:102 msgid "Setting unchanged" @@ -2326,33 +2326,71 @@ msgid "" "The options affect the %(box_name)s at its most general level, so be careful!" msgstr "" -#: plinth/modules/tor/__init__.py:50 -msgid "Tor relay port available" +#: plinth/modules/tor/__init__.py:48 plinth/modules/tor/templates/tor.html:35 +msgid "Anonymity Network (Tor)" +msgstr "" + +#: plinth/modules/tor/__init__.py:53 +msgid "Tor Anonymity Network" msgstr "" #: plinth/modules/tor/__init__.py:58 +msgid "Tor Bridge Relay" +msgstr "" + +#: plinth/modules/tor/__init__.py:76 plinth/modules/tor/views.py:144 +msgid "Tor Hidden Service" +msgstr "" + +#: plinth/modules/tor/__init__.py:222 +msgid "Tor relay port available" +msgstr "" + +#: plinth/modules/tor/__init__.py:230 msgid "Obfs3 transport registered" msgstr "" -#: plinth/modules/tor/__init__.py:64 +#: plinth/modules/tor/__init__.py:236 msgid "Obfs4 transport registered" msgstr "" -#: plinth/modules/tor/__init__.py:101 +#: plinth/modules/tor/__init__.py:273 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" msgstr "" -#: plinth/modules/tor/__init__.py:112 +#: plinth/modules/tor/__init__.py:284 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" msgstr "" -#: plinth/modules/tor/templates/tor.html:26 plinth/modules/tor/tor.py:68 -msgid "Anonymity Network (Tor)" +#: plinth/modules/tor/forms.py:32 +msgid "Enable Tor" +msgstr "" + +#: plinth/modules/tor/forms.py:35 +msgid "Enable Tor Hidden Service" +msgstr "" + +#: plinth/modules/tor/forms.py:38 +#, python-brace-format +msgid "" +"A hidden service will allow {box_name} to provide selected services (such as " +"ownCloud or chat) without revealing its location." +msgstr "" + +#: plinth/modules/tor/forms.py:42 +msgid "Download software packages over Tor" msgstr "" -#: plinth/modules/tor/templates/tor.html:29 +#: plinth/modules/tor/forms.py:44 +msgid "" +"When enabled, software will be downloaded over the Tor network for " +"installations and upgrades. This adds a degree of privacy and security " +"during software downloads." +msgstr "" + +#: plinth/modules/tor/templates/tor.html:38 msgid "" "Tor is an anonymous communication system. You can learn more about it from " "the Tor Project website. For " @@ -2361,28 +2399,32 @@ msgid "" "Tor Browser." msgstr "" -#: plinth/modules/tor/templates/tor.html:44 +#: plinth/modules/tor/templates/tor.html:54 +msgid "Tor configuration is being updated" +msgstr "" + +#: plinth/modules/tor/templates/tor.html:62 msgid "Tor is running" msgstr "" -#: plinth/modules/tor/templates/tor.html:47 +#: plinth/modules/tor/templates/tor.html:65 msgid "Tor is not running" msgstr "" -#: plinth/modules/tor/templates/tor.html:59 +#: plinth/modules/tor/templates/tor.html:77 msgid "Hidden Service" msgstr "" -#: plinth/modules/tor/templates/tor.html:60 -#: plinth/modules/tor/templates/tor.html:102 +#: plinth/modules/tor/templates/tor.html:78 +#: plinth/modules/tor/templates/tor.html:120 msgid "Port" msgstr "" -#: plinth/modules/tor/templates/tor.html:85 +#: plinth/modules/tor/templates/tor.html:103 msgid "Bridge" msgstr "" -#: plinth/modules/tor/templates/tor.html:88 +#: plinth/modules/tor/templates/tor.html:106 #, python-format msgid "" "Your %(box_name)s is configured as a Tor bridge with obfsproxy, so it can " @@ -2391,80 +2433,34 @@ msgid "" "forwarded, if necessary:" msgstr "" -#: plinth/modules/tor/templates/tor.html:101 +#: plinth/modules/tor/templates/tor.html:119 msgid "Service" msgstr "" -#: plinth/modules/tor/templates/tor.html:117 +#: plinth/modules/tor/templates/tor.html:135 msgid "SOCKS" msgstr "" -#: plinth/modules/tor/templates/tor.html:120 +#: plinth/modules/tor/templates/tor.html:138 #, python-format msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "" -#: plinth/modules/tor/tor.py:47 -msgid "Enable Tor" -msgstr "" - -#: plinth/modules/tor/tor.py:50 -msgid "Enable Tor Hidden Service" -msgstr "" - -#: plinth/modules/tor/tor.py:53 -#, python-brace-format -msgid "" -"A hidden service will allow {box_name} to provide selected services (such as " -"ownCloud or chat) without revealing its location." -msgstr "" - -#: plinth/modules/tor/tor.py:57 -msgid "Download software packages over Tor" -msgstr "" - -#: plinth/modules/tor/tor.py:59 -msgid "" -"When enabled, software will be downloaded over the Tor network for " -"installations and upgrades. This adds a degree of privacy and security " -"during software downloads." -msgstr "" - -#: plinth/modules/tor/tor.py:87 plinth/modules/tor/tor.py:287 -msgid "Tor Hidden Service" -msgstr "" - -#: plinth/modules/tor/tor.py:117 +#: plinth/modules/tor/views.py:68 msgid "Tor Control Panel" msgstr "" -#: plinth/modules/tor/tor.py:242 +#: plinth/modules/tor/views.py:79 #, python-brace-format msgid "Action error: {0} [{1}] [{2}]" msgstr "" -#: plinth/modules/tor/tor.py:258 -msgid "Tor enabled" -msgstr "" - -#: plinth/modules/tor/tor.py:261 -msgid "Tor disabled" -msgstr "" - -#: plinth/modules/tor/tor.py:266 -msgid "Tor hidden service enabled" -msgstr "" - -#: plinth/modules/tor/tor.py:269 -msgid "Tor hidden service disabled" +#: plinth/modules/tor/views.py:148 +msgid "Configuration updated." msgstr "" -#: plinth/modules/tor/tor.py:294 -msgid "Enabled package download over Tor" -msgstr "" - -#: plinth/modules/tor/tor.py:297 -msgid "Disabled package download over Tor" +#: plinth/modules/tor/views.py:150 +msgid "An error occurred during configuration." msgstr "" #: plinth/modules/transmission/__init__.py:38 @@ -2630,19 +2626,30 @@ msgstr "" msgid "Failed to add new user to {group} group." msgstr "" -#: plinth/modules/users/forms.py:126 +#: plinth/modules/users/forms.py:92 +msgid "SSH Keys" +msgstr "" + +#: plinth/modules/users/forms.py:96 +msgid "" +"Setting an SSH public key will allow this user to securely log in to the " +"system without using a password. You may enter multiple keys, one on each " +"line. Blank lines and lines starting with # will be ignored." +msgstr "" + +#: plinth/modules/users/forms.py:136 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:138 +#: plinth/modules/users/forms.py:148 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:149 +#: plinth/modules/users/forms.py:159 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:174 +#: plinth/modules/users/forms.py:188 msgid "Changing LDAP user password failed." msgstr "" @@ -2661,7 +2668,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:26 -#: plinth/modules/users/views.py:103 +#: plinth/modules/users/views.py:110 msgid "Delete User" msgstr "" @@ -2714,20 +2721,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:113 +#: plinth/modules/users/views.py:120 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:120 +#: plinth/modules/users/views.py:127 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:129 +#: plinth/modules/users/views.py:136 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:130 +#: plinth/modules/users/views.py:137 msgid "Password changed successfully." msgstr "" From aa71221dddc65d28b7f7206eba9733b2101ee79a Mon Sep 17 00:00:00 2001 From: Caly Date: Sun, 31 Jan 2016 17:56:03 +0100 Subject: [PATCH 045/189] Translated using Weblate (Swedish) Currently translated at 41.9% (236 of 562 strings) --- plinth/locale/sv/LC_MESSAGES/django.po | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/plinth/locale/sv/LC_MESSAGES/django.po b/plinth/locale/sv/LC_MESSAGES/django.po index 9f3e7bb6d..f0e002093 100644 --- a/plinth/locale/sv/LC_MESSAGES/django.po +++ b/plinth/locale/sv/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-01-15 19:42+0530\n" -"PO-Revision-Date: 2016-01-21 15:15+0000\n" +"PO-Revision-Date: 2016-01-31 17:56+0000\n" "Last-Translator: Caly \n" "Language-Team: Swedish " "\n" @@ -1356,54 +1356,64 @@ msgid "" "The firewall zone will control which services are available over this " "interfaces. Select Internal only for trusted networks." msgstr "" +"Brandväggs-zonen bestämmer vilka tjänster är tillgängliga genom detta " +"gränssnitt. Välj endast interna för betrodda nätverk." #: plinth/modules/networks/forms.py:49 msgid "IPv4 Addressing Method" -msgstr "" +msgstr "Addresseringsmetod för IPv4" #: plinth/modules/networks/forms.py:50 msgid "" "\"Shared\" method will start a DHCP server and \"Automatic\" method will " "acquire configuration from a DHCP server." msgstr "" +"Metoden \"Delad\" kommer att starta en DHCP-server. Metoden \"Automatisk\" " +"kommer att hämta konfiguration från en DHCP-server." #: plinth/modules/networks/forms.py:56 msgid "Address" -msgstr "" +msgstr "Adress" #: plinth/modules/networks/forms.py:60 msgid "Netmask" -msgstr "" +msgstr "Nätmask" #: plinth/modules/networks/forms.py:61 msgid "" "Optional value. If left blank, a default netmask based on the address will " "be used." msgstr "" +"Valfritt värde. Om detta lämnas tomt kommer en standard nätmask baserad på " +"adressen användas." #: plinth/modules/networks/forms.py:66 #: plinth/modules/networks/templates/connection_show.html:202 #: plinth/modules/networks/templates/connection_show.html:241 +#, fuzzy msgid "Gateway" -msgstr "" +msgstr "Gateway" #: plinth/modules/networks/forms.py:67 msgid "Optional value." -msgstr "" +msgstr "Valfritt värde." #: plinth/modules/networks/forms.py:71 msgid "DNS Server" -msgstr "" +msgstr "DNS-Server" #: plinth/modules/networks/forms.py:72 msgid "" "Optional value. If this value is given and IPv4 addressing method is " "\"Automatic\", the DNS Servers provided by a DHCP server will be ignored." msgstr "" +"Valfritt värde. Om detta anges och IPv4-adresserings metod är satt till \"" +"Automatisk\", kommer DNS-servrar tillhandahållna av en DHCP-server att " +"ignoreras." #: plinth/modules/networks/forms.py:78 msgid "Second DNS Server" -msgstr "" +msgstr "Sekundär DNS-server" #: plinth/modules/networks/forms.py:79 msgid "" From a5584fb7005a388e4510b2c9ea2555b145d4a0b5 Mon Sep 17 00:00:00 2001 From: Caly Date: Sun, 31 Jan 2016 18:15:01 +0100 Subject: [PATCH 046/189] Translated using Weblate (Swedish) Currently translated at 43.7% (246 of 562 strings) --- plinth/locale/sv/LC_MESSAGES/django.po | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/plinth/locale/sv/LC_MESSAGES/django.po b/plinth/locale/sv/LC_MESSAGES/django.po index f0e002093..2de366dc7 100644 --- a/plinth/locale/sv/LC_MESSAGES/django.po +++ b/plinth/locale/sv/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-01-15 19:42+0530\n" -"PO-Revision-Date: 2016-01-31 17:56+0000\n" +"PO-Revision-Date: 2016-01-31 18:15+0000\n" "Last-Translator: Caly \n" "Language-Team: Swedish " "\n" @@ -1420,52 +1420,57 @@ msgid "" "Optional value. If this value is given and IPv4 Addressing Method is " "\"Automatic\", the DNS Servers provided by a DHCP server will be ignored." msgstr "" +"Valfritt värde. Om värde anges och IPv4-adresseringsmetod är \"Automatisk\", " +"kommer DNS-servrar tillhandahållna av en DHCP-server att ignoreras." #: plinth/modules/networks/forms.py:89 msgid "-- select --" -msgstr "" +msgstr "--Välj--" #: plinth/modules/networks/forms.py:149 msgid "Show password" -msgstr "" +msgstr "Visa lösenord" #: plinth/modules/networks/forms.py:175 #: plinth/modules/networks/templates/connection_show.html:144 +#, fuzzy msgid "SSID" -msgstr "" +msgstr "SSID" #: plinth/modules/networks/forms.py:176 msgid "The visible name of the network." -msgstr "" +msgstr "Synligt namn för nätverket." #: plinth/modules/networks/forms.py:178 #: plinth/modules/networks/templates/connection_show.html:157 msgid "Mode" -msgstr "" +msgstr "Läge" #: plinth/modules/networks/forms.py:183 msgid "Authentication Mode" -msgstr "" +msgstr "Autentiseringsläge" #: plinth/modules/networks/forms.py:184 msgid "" "Select WPA if the wireless network is secured and requires clients to have " "the password to connect." msgstr "" +"Välj WPA om det trådlösa nätverket är säkert och kräver att användare har " +"lösenord för att ansluta." #: plinth/modules/networks/forms.py:188 msgid "Passphrase" -msgstr "" +msgstr "Lösenord" #: plinth/modules/networks/networks.py:36 #: plinth/modules/networks/networks.py:56 msgid "Network Connections" -msgstr "" +msgstr "Nätverksanslutningar" #: plinth/modules/networks/networks.py:38 #: plinth/modules/networks/networks.py:242 msgid "Nearby Wi-Fi Networks" -msgstr "" +msgstr "Wi-Fi-nätverk i närheten" #: plinth/modules/networks/networks.py:40 #: plinth/modules/networks/networks.py:264 From a90039889d63b6080d07e2b38ab7a9e604c0492b Mon Sep 17 00:00:00 2001 From: Daniel Steglich Date: Sat, 28 Nov 2015 13:37:48 +0000 Subject: [PATCH 047/189] dynamicdns: Fix passing password via stdin * Add an option to pass the password via cmdline (optional, not used by plinth) if called manually. * Fix: If -p option was not the last given option, everything after -p was lost. Closes #310. --- actions/dynamicdns | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/actions/dynamicdns b/actions/dynamicdns index 993ea13a1..b9b145412 100755 --- a/actions/dynamicdns +++ b/actions/dynamicdns @@ -65,7 +65,7 @@ doGetOpt() basicauth=0 ignoreCertError=0 - while getopts ":s:d:u:p:I:U:c:b:" opt; do + while getopts ":s:d:u:P:I:U:c:b:p" opt; do case ${opt} in s) if [ "${OPTARG}" != "${EMPTYSTRING}" ];then @@ -80,6 +80,9 @@ doGetOpt() u) user=${OPTARG} ;; + P) + pass=${OPTARG} + ;; p) if read -t 0; then IFS= read -r pass @@ -293,7 +296,7 @@ doGetWANIP() doUpdate() { local dnsentry=$(nslookup "${host}"|tail -n2|grep A|sed s/[^0-9.]//g) - if [ "${dnsentry}" = "${wanip}" ];then + if [ "${dnsentry}" = "${wanip}" ];then return fi if [ ! -z "${server}" ];then @@ -428,6 +431,7 @@ case ${cmd} in echo "-s Gnudip Server address" echo "-d Domain to be updated" echo "-u Account username" + echo "-P Account password" echo "-p Read Account Password from stdin" echo "-I A URL which returns the IP of the client who is requesting" echo "-U The update URL (a HTTP GET on this URL will be done)" From ffbe1f0ce5d8d6277975156b20429482b9fbff74 Mon Sep 17 00:00:00 2001 From: Tong Hui Date: Mon, 1 Feb 2016 01:46:13 +0100 Subject: [PATCH 048/189] Translated using Weblate (Chinese (China)) Currently translated at 4.9% (28 of 569 strings) --- plinth/locale/zh_CN/LC_MESSAGES/django.po | 68 ++++++++++++----------- 1 file changed, 36 insertions(+), 32 deletions(-) diff --git a/plinth/locale/zh_CN/LC_MESSAGES/django.po b/plinth/locale/zh_CN/LC_MESSAGES/django.po index 21eb0148e..6f6c8a6fd 100644 --- a/plinth/locale/zh_CN/LC_MESSAGES/django.po +++ b/plinth/locale/zh_CN/LC_MESSAGES/django.po @@ -3,65 +3,67 @@ # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # -#, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-01-31 22:19+0530\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" +"PO-Revision-Date: 2016-02-01 01:46+0000\n" +"Last-Translator: Tong Hui \n" +"Language-Team: Chinese (China) " +"\n" +"Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 2.5-dev\n" #: plinth/action_utils.py:203 #, python-brace-format msgid "Listening on {kind} port {listen_address}:{port}" -msgstr "" +msgstr "正在 {kind} 侦听端口 {listen_address}:{port}" #: plinth/action_utils.py:206 #, python-brace-format msgid "Listening on {kind} port {port}" -msgstr "" +msgstr "正在 {kind} 侦听端口 {port}" #: plinth/action_utils.py:287 #, python-brace-format msgid "Access URL {url} on tcp{kind}" -msgstr "" +msgstr "在 tcp {kind} 访问 URL {url}" #: plinth/action_utils.py:290 #, python-brace-format msgid "Access URL {url}" -msgstr "" +msgstr "访问 URL {url}" #: plinth/action_utils.py:321 #, python-brace-format msgid "Connect to {host}:{port}" -msgstr "" +msgstr "连接到的主机 {host}: {port}" #: plinth/action_utils.py:324 #, python-brace-format msgid "Cannot connect to {host}:{port}" -msgstr "" +msgstr "不能连接到的主机 {host}: {port}" #: plinth/context_processors.py:36 msgid "FreedomBox" -msgstr "" +msgstr "FreedomBox" #: plinth/modules/apps/apps.py:26 msgid "Apps" -msgstr "" +msgstr "应用程序" #: plinth/modules/apps/apps.py:32 plinth/templates/base.html.py:93 msgid "Applications" -msgstr "" +msgstr "应用程序" #: plinth/modules/apps/templates/apps.html:25 msgid "Services and Applications" -msgstr "" +msgstr "服务和应用程序" #: plinth/modules/apps/templates/apps.html:28 #, python-format @@ -69,7 +71,7 @@ msgid "" "You can install and run various services and applications on your " "%(box_name)s. Click on any app page link on the left to read a description " "of the application and choose to install it." -msgstr "" +msgstr "你可以安装和运行各种服务和应用程序在您 %(box_name)s 上。点击左边应用程序链接阅读相应的描述,并选择是否要安装。" #: plinth/modules/apps/templates/apps.html:36 msgid "" @@ -78,16 +80,18 @@ msgid "" "one of those too. Many of the services you use on the web could soon be on " "site and under your control!" msgstr "" +"这个盒子可以是你的照片分享网站,即时消息传递站点,你的社交网站,您的新闻站点。 还记得门户网站吗?我们也可以是那些之一。 您在 web " +"上使用的服务和网站上很快都会在你控制之下!" #: plinth/modules/avahi/__init__.py:40 plinth/modules/avahi/__init__.py:45 #: plinth/modules/avahi/templates/avahi.html:26 #: plinth/modules/avahi/views.py:53 msgid "Service Discovery" -msgstr "" +msgstr "发现服务" #: plinth/modules/avahi/forms.py:29 msgid "Enable service discovery" -msgstr "" +msgstr "启用服务发现" #: plinth/modules/avahi/templates/avahi.html:29 #, python-format @@ -115,15 +119,15 @@ msgstr "" #: plinth/modules/transmission/templates/transmission.html:42 #: plinth/modules/xmpp/templates/xmpp.html:58 msgid "Status" -msgstr "" +msgstr "状态" #: plinth/modules/avahi/templates/avahi.html:45 msgid "Service discovery server is running" -msgstr "" +msgstr "服务发现服务正在运行" #: plinth/modules/avahi/templates/avahi.html:48 msgid "Service discovery server is not running" -msgstr "" +msgstr "服务发现服务未运行" #: plinth/modules/avahi/templates/avahi.html:52 #: plinth/modules/datetime/templates/datetime.html:48 @@ -141,7 +145,7 @@ msgstr "" #: plinth/modules/transmission/templates/transmission.html:56 #: plinth/modules/xmpp/templates/xmpp.html:72 msgid "Configuration" -msgstr "" +msgstr "配置" #: plinth/modules/avahi/templates/avahi.html:60 #: plinth/modules/datetime/templates/datetime.html:56 @@ -162,7 +166,7 @@ msgstr "" #: plinth/modules/upgrades/templates/upgrades_configure.html:34 #: plinth/modules/xmpp/templates/xmpp.html:80 msgid "Update setup" -msgstr "" +msgstr "更新安装程序" #: plinth/modules/avahi/views.py:73 plinth/modules/datetime/views.py:85 #: plinth/modules/deluge/views.py:80 @@ -174,7 +178,7 @@ msgstr "" #: plinth/modules/shaarli/views.py:74 plinth/modules/transmission/views.py:109 #: plinth/modules/xmpp/views.py:100 msgid "Configuration updated" -msgstr "" +msgstr "配置已更新" #: plinth/modules/avahi/views.py:76 plinth/modules/datetime/views.py:99 #: plinth/modules/deluge/views.py:82 plinth/modules/ikiwiki/views.py:97 @@ -186,16 +190,16 @@ msgstr "" #: plinth/modules/transmission/views.py:111 #: plinth/modules/upgrades/views.py:118 plinth/modules/xmpp/views.py:102 msgid "Setting unchanged" -msgstr "" +msgstr "设置不变" #: plinth/modules/config/config.py:84 plinth/modules/config/config.py:121 #: plinth/modules/dynamicdns/dynamicdns.py:148 msgid "Invalid domain name" -msgstr "" +msgstr "无效的域名" #: plinth/modules/config/config.py:95 msgid "Hostname" -msgstr "" +msgstr "主机名" #: plinth/modules/config/config.py:97 #, python-brace-format @@ -208,13 +212,13 @@ msgstr "" #: plinth/modules/config/config.py:105 msgid "Invalid hostname" -msgstr "" +msgstr "无效的主机名" #: plinth/modules/config/config.py:108 plinth/modules/config/config.py:153 #: plinth/modules/config/config.py:265 #: plinth/modules/dynamicdns/dynamicdns.py:143 msgid "Domain Name" -msgstr "" +msgstr "域名" #: plinth/modules/config/config.py:110 #, python-brace-format @@ -229,17 +233,17 @@ msgstr "" #: plinth/modules/config/config.py:125 msgid "Language" -msgstr "" +msgstr "语言" #: plinth/modules/config/config.py:127 msgid "Language for this web administration interface" -msgstr "" +msgstr "此 web 管理界面的语言" #: plinth/modules/config/config.py:135 #: plinth/modules/dynamicdns/dynamicdns.py:37 #: plinth/modules/ikiwiki/views.py:36 msgid "Configure" -msgstr "" +msgstr "配置" #: plinth/modules/config/config.py:176 msgid "General Configuration" From dd65cb7835688e9eaa0e877590db6e55f99d9bcd Mon Sep 17 00:00:00 2001 From: Caly Date: Sun, 31 Jan 2016 18:23:53 +0100 Subject: [PATCH 049/189] Translated using Weblate (Swedish) Currently translated at 37.0% (211 of 569 strings) --- plinth/locale/sv/LC_MESSAGES/django.po | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/plinth/locale/sv/LC_MESSAGES/django.po b/plinth/locale/sv/LC_MESSAGES/django.po index af2f5ec00..3934dd10c 100644 --- a/plinth/locale/sv/LC_MESSAGES/django.po +++ b/plinth/locale/sv/LC_MESSAGES/django.po @@ -8,10 +8,10 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-01-15 19:42+0530\n" -"PO-Revision-Date: 2016-01-31 18:15+0000\n" +"PO-Revision-Date: 2016-01-31 18:23+0000\n" "Last-Translator: Caly \n" -"Language-Team: Swedish \n" +"Language-Team: Swedish " +"\n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -614,7 +614,7 @@ msgstr "Lösenord" #: plinth/modules/dynamicdns/dynamicdns.py:157 #: plinth/modules/networks/forms.py:149 msgid "Show password" -msgstr "" +msgstr "Visa lösenord" #: plinth/modules/dynamicdns/dynamicdns.py:161 msgid "IP check URL" @@ -1579,10 +1579,6 @@ msgstr "" msgid "-- select --" msgstr "--Välj--" -#: plinth/modules/networks/forms.py:149 -msgid "Show password" -msgstr "Visa lösenord" - #: plinth/modules/networks/forms.py:175 #: plinth/modules/networks/templates/connection_show.html:144 #, fuzzy @@ -1627,7 +1623,7 @@ msgstr "Wi-Fi-nätverk i närheten" #: plinth/modules/networks/networks.py:40 #: plinth/modules/networks/networks.py:264 msgid "Add Connection" -msgstr "" +msgstr "Lägg till Anslutning" #: plinth/modules/networks/networks.py:46 msgid "Networks" From 2a030f91fec7e18820b500ba65b708e0576f8065 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Mon, 1 Feb 2016 10:53:26 +0530 Subject: [PATCH 050/189] dynamicdns: Fix reading configuration file - The current code to parse the configuration file does not work proper if there is an '=' in the password. Fix it. - Also if predesignated keyword like 'server' occurs in the password, configuration can't be read properly. Fix it. --- actions/dynamicdns | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/actions/dynamicdns b/actions/dynamicdns index b9b145412..4b45a8c37 100755 --- a/actions/dynamicdns +++ b/actions/dynamicdns @@ -189,10 +189,10 @@ doReadCFG() ipurl="" if [ ! -z "${cfgfile}" ];then - host=$(grep host "${cfgfile}" 2> /dev/null |cut -d = -f 2) - server=$(grep server "${cfgfile}" 2> /dev/null |cut -d = -f 2 |grep -v ^\'\') - user=$(grep user "${cfgfile}" 2> /dev/null |cut -d = -f 2 |cut -d : -f 1 ) - pass=$(grep user "${cfgfile}" 2> /dev/null |cut -d = -f 2 |cut -d : -f 2) + host=$(grep ^host= "${cfgfile}" 2> /dev/null | cut -d = -f 2-) + server=$(grep ^server= "${cfgfile}" 2> /dev/null | cut -d = -f 2- | grep -v ^\'\') + user=$(grep ^user= "${cfgfile}" 2> /dev/null | cut -d = -f 2- | cut -d : -f 1 ) + pass=$(grep ^user= "${cfgfile}" 2> /dev/null | cut -d = -f 2- | cut -d : -f 2-) fi if [ ! -z ${HELPERCFG} ];then @@ -338,7 +338,7 @@ case ${cmd} in doGetWANIP if [ "$(grep ^NAT ${HELPERCFG} | awk '{print $2}')" = "no" ];then #if we are not behind a NAT device and we use gnudip, start the daemon tool - local gnudipServer=$(grep server ${cfgfile} 2> /dev/null |cut -d = -f 2 |grep -v ^\'\') + local gnudipServer=$(grep ^server= ${cfgfile} 2> /dev/null | cut -d = -f 2- |grep -v ^\'\') if [ -f ${CFG} -a ! -z "${gnudipServer}" ];then mv ${CFG_disabled} ${CFG} /etc/init.d/${TOOLNAME} start From aa5efd498489bc966282ae99a19f3a5ca39891f0 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Mon, 1 Feb 2016 10:57:33 +0530 Subject: [PATCH 051/189] dynamicdns: Fix computing update times Currenly uptime is being taken as measure to decide whether update must run. Uptime is the number of seconds since machine has booted. If a machine has run for 30 hours, and rebooted, then update will not be done until the machine has run for 30 hours + desinated time. Using seconds since epoch fixes this. --- actions/dynamicdns | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/actions/dynamicdns b/actions/dynamicdns index 4b45a8c37..3968d744f 100755 --- a/actions/dynamicdns +++ b/actions/dynamicdns @@ -374,10 +374,10 @@ case ${cmd} in fi # if we don't know our WAN IP do a blind update once a hour if [ "${wanip}" = ${NOIP} ];then - uptime=$(cut -d . -f 1 /proc/uptime) + currenttime=$(date +%s) LAST=0 [ -f ${LASTUPDATE} ] && LAST=$(cat ${LASTUPDATE}) - diff=$((uptime - LAST)) + diff=$((currenttime - LAST)) if [ ${diff} -gt ${UPDATEMINUTESUNKNOWN} ];then doUpdate fi @@ -392,7 +392,7 @@ case ${cmd} in success) date=$(date) echo "last update done (${date})" > ${STATUSFILE} - awk '{print $1}' /proc/uptime |cut -d . -f 1 > ${LASTUPDATE} + date +%s > ${LASTUPDATE} # if called from cronjob, the current IP is given as parameter if [ $# -eq 1 ];then echo "${1}" > ${IPFILE} From ea1e9b6e2a1b57737ffad962a15ba3528eff9b22 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Mon, 1 Feb 2016 11:00:46 +0530 Subject: [PATCH 052/189] dynamicdns: Fix writing configuration for no NAT - When writing the configuration file for no NAT case, append then last part of the file instead of overwriting. - Also 'echo' statements are missing leading to attempt to execute the config options instead of writing them to a file. --- actions/dynamicdns | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/actions/dynamicdns b/actions/dynamicdns index 3968d744f..aae9b9992 100755 --- a/actions/dynamicdns +++ b/actions/dynamicdns @@ -167,11 +167,11 @@ doWriteCFG() echo "NAT no" >> ${HELPERCFG} # if this file is added ez-ipupdate will take ip form this interface { - "interface=${default_interface}" + echo "interface=${default_interface}" # if this line is added to config file, ez-ipupdate will be launched on startup via init.d - "daemon" - "execute=${0} success" - } > ${out_file} + echo "daemon" + echo "execute=${0} success" + } >> ${out_file} fi fi } From 51dd1bb0007802a4b7b186bc6c569dcf82bc5e0d Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Mon, 1 Feb 2016 11:02:43 +0530 Subject: [PATCH 053/189] dynamicdns: Fix an invalid syntax 'local' keyword can't be used outside a method. --- actions/dynamicdns | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actions/dynamicdns b/actions/dynamicdns index aae9b9992..f437e657a 100755 --- a/actions/dynamicdns +++ b/actions/dynamicdns @@ -338,7 +338,7 @@ case ${cmd} in doGetWANIP if [ "$(grep ^NAT ${HELPERCFG} | awk '{print $2}')" = "no" ];then #if we are not behind a NAT device and we use gnudip, start the daemon tool - local gnudipServer=$(grep ^server= ${cfgfile} 2> /dev/null | cut -d = -f 2- |grep -v ^\'\') + gnudipServer=$(grep ^server= ${cfgfile} 2> /dev/null | cut -d = -f 2- |grep -v ^\'\') if [ -f ${CFG} -a ! -z "${gnudipServer}" ];then mv ${CFG_disabled} ${CFG} /etc/init.d/${TOOLNAME} start From 83ec57414ce1d2b2025a240f6055dcfa862a51ad Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Mon, 1 Feb 2016 11:03:54 +0530 Subject: [PATCH 054/189] dynamicdns: Fix starting daemon for no NAT Incase the machine is not behind NAT, fix the logic that decides to start the daemon. --- actions/dynamicdns | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actions/dynamicdns b/actions/dynamicdns index f437e657a..34aca8d87 100755 --- a/actions/dynamicdns +++ b/actions/dynamicdns @@ -339,7 +339,7 @@ case ${cmd} in if [ "$(grep ^NAT ${HELPERCFG} | awk '{print $2}')" = "no" ];then #if we are not behind a NAT device and we use gnudip, start the daemon tool gnudipServer=$(grep ^server= ${cfgfile} 2> /dev/null | cut -d = -f 2- |grep -v ^\'\') - if [ -f ${CFG} -a ! -z "${gnudipServer}" ];then + if [ ! -f ${CFG} -a ! -z "${gnudipServer}" ];then mv ${CFG_disabled} ${CFG} /etc/init.d/${TOOLNAME} start fi From a23a40dede79748e69e84d848d540d8e4311930e Mon Sep 17 00:00:00 2001 From: Joel Valleroy Date: Tue, 2 Feb 2016 00:12:07 +0000 Subject: [PATCH 055/189] Removed default password warning. Fixes #386. --- .../pagekite/templates/pagekite_standard_services.html | 7 ------- 1 file changed, 7 deletions(-) diff --git a/plinth/modules/pagekite/templates/pagekite_standard_services.html b/plinth/modules/pagekite/templates/pagekite_standard_services.html index b3d3db832..8bd472655 100644 --- a/plinth/modules/pagekite/templates/pagekite_standard_services.html +++ b/plinth/modules/pagekite/templates/pagekite_standard_services.html @@ -46,13 +46,6 @@ {% endblocktrans %}

-

- {% blocktrans trimmed %} - Exposing SSH with the default password for 'fbx' is a VERY BAD - idea. - {% endblocktrans %} -

-
From e4c0e86c6a68ecb9504c6880c74e50e5ede35a9d Mon Sep 17 00:00:00 2001 From: Tong Hui Date: Tue, 2 Feb 2016 12:20:01 +0100 Subject: [PATCH 056/189] Translated using Weblate (Chinese (China)) Currently translated at 69.0% (393 of 569 strings) --- plinth/locale/zh_CN/LC_MESSAGES/django.po | 733 +++++++++++----------- 1 file changed, 374 insertions(+), 359 deletions(-) diff --git a/plinth/locale/zh_CN/LC_MESSAGES/django.po b/plinth/locale/zh_CN/LC_MESSAGES/django.po index 6f6c8a6fd..6f68b2b82 100644 --- a/plinth/locale/zh_CN/LC_MESSAGES/django.po +++ b/plinth/locale/zh_CN/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-01-31 22:19+0530\n" -"PO-Revision-Date: 2016-02-01 01:46+0000\n" +"PO-Revision-Date: 2016-02-02 12:20+0000\n" "Last-Translator: Tong Hui \n" "Language-Team: Chinese (China) " "\n" @@ -87,7 +87,7 @@ msgstr "" #: plinth/modules/avahi/templates/avahi.html:26 #: plinth/modules/avahi/views.py:53 msgid "Service Discovery" -msgstr "发现服务" +msgstr "服务发现" #: plinth/modules/avahi/forms.py:29 msgid "Enable service discovery" @@ -190,7 +190,7 @@ msgstr "配置已更新" #: plinth/modules/transmission/views.py:111 #: plinth/modules/upgrades/views.py:118 plinth/modules/xmpp/views.py:102 msgid "Setting unchanged" -msgstr "设置不变" +msgstr "设置未改变" #: plinth/modules/config/config.py:84 plinth/modules/config/config.py:121 #: plinth/modules/dynamicdns/dynamicdns.py:148 @@ -247,113 +247,113 @@ msgstr "配置" #: plinth/modules/config/config.py:176 msgid "General Configuration" -msgstr "" +msgstr "常规配置" #: plinth/modules/config/config.py:193 #, python-brace-format msgid "Error setting hostname: {exception}" -msgstr "" +msgstr "设置主机名错误:{exception}" #: plinth/modules/config/config.py:196 msgid "Hostname set" -msgstr "" +msgstr "主机名设置" #: plinth/modules/config/config.py:202 #, python-brace-format msgid "Error setting domain name: {exception}" -msgstr "" +msgstr "设置域名错误:{exception}" #: plinth/modules/config/config.py:205 msgid "Domain name set" -msgstr "" +msgstr "域名集" #: plinth/modules/config/config.py:213 #, python-brace-format msgid "Error setting language: {exception}" -msgstr "" +msgstr "设置语言错误:{exception}" #: plinth/modules/config/config.py:216 msgid "Language changed" -msgstr "" +msgstr "语言已更改" #: plinth/modules/config/templates/config.html:32 msgid "Submit" -msgstr "" +msgstr "提交" #: plinth/modules/datetime/__init__.py:39 #: plinth/modules/datetime/templates/datetime.html:26 #: plinth/modules/datetime/views.py:58 msgid "Date & Time" -msgstr "" +msgstr "日期与时间" #: plinth/modules/datetime/__init__.py:44 msgid "Network Time Server" -msgstr "" +msgstr "网络时间服务器" #: plinth/modules/datetime/__init__.py:76 msgid "NTP client in contact with servers" -msgstr "" +msgstr "NTP 客户端正在与服务器联系" #: plinth/modules/datetime/forms.py:31 msgid "Enable network time" -msgstr "" +msgstr "启用网络时间" #: plinth/modules/datetime/forms.py:35 msgid "Time Zone" -msgstr "" +msgstr "时区" #: plinth/modules/datetime/forms.py:36 msgid "" "Set your time zone to get accurate timestamps. This will set the systemwide " "time zone." -msgstr "" +msgstr "设置您的时区来得到准确的时间戳。这将影响全系统时区。" #: plinth/modules/datetime/forms.py:47 msgid "-- no time zone set --" -msgstr "" +msgstr "-- 时区未设置 --" #: plinth/modules/datetime/templates/datetime.html:29 msgid "" "Network time server is a program that maintians the system time in " "synchronization with servers on the Internet." -msgstr "" +msgstr "网络时间服务是与 Internet 上的服务器同步系统时间的一个程序。" #: plinth/modules/datetime/templates/datetime.html:40 msgid "Network time server is running" -msgstr "" +msgstr "网络时间服务器运行中" #: plinth/modules/datetime/templates/datetime.html:43 msgid "Network time server is not running" -msgstr "" +msgstr "网络时间服务器未运行" #: plinth/modules/datetime/views.py:93 #, python-brace-format msgid "Error setting time zone: {exception}" -msgstr "" +msgstr "设置时区错误:{exception}" #: plinth/modules/datetime/views.py:96 msgid "Time zone set" -msgstr "" +msgstr "时区设置" #: plinth/modules/deluge/__init__.py:38 plinth/modules/deluge/views.py:56 msgid "BitTorrent (Deluge)" -msgstr "" +msgstr "BitTorrent 下载(Deluge)" #: plinth/modules/deluge/__init__.py:43 msgid "Deluge BitTorrent" -msgstr "" +msgstr "Deluge BitTorrent 客户端" #: plinth/modules/deluge/forms.py:29 msgid "Enable Deluge" -msgstr "" +msgstr "启用 Deluge" #: plinth/modules/deluge/templates/deluge.html:26 msgid "BitTorrent Web Client (Deluge)" -msgstr "" +msgstr "BitTorrent 网页客户端(Deluge)" #: plinth/modules/deluge/templates/deluge.html:28 msgid "Deluge is a BitTorrent client that features a Web UI." -msgstr "" +msgstr "Deluge 是一个有网页界面的 BitTorrent 客户端。" #: plinth/modules/deluge/templates/deluge.html:31 msgid "" @@ -364,77 +364,77 @@ msgstr "" #: plinth/modules/deluge/templates/deluge.html:44 msgid "deluge-web is running" -msgstr "" +msgstr "deluge-web 正在运行" #: plinth/modules/deluge/templates/deluge.html:47 msgid "deluge-web is not running" -msgstr "" +msgstr "deluge-web 未运行" #: plinth/modules/diagnostics/diagnostics.py:45 msgid "Diagnostics" -msgstr "" +msgstr "诊断程序" #: plinth/modules/diagnostics/diagnostics.py:55 msgid "System Diagnostics" -msgstr "" +msgstr "系统诊断" #: plinth/modules/diagnostics/diagnostics.py:78 msgid "Diagnostic Test" -msgstr "" +msgstr "诊断测试" #: plinth/modules/diagnostics/templates/diagnostics.html:37 msgid "" "The system diagnostic test will run a number of checks on your system to " "confirm that applications and services are working as expected." -msgstr "" +msgstr "系统诊断将运行测试程序检查您的系统以确认应用程序和服务正在按预期方式运行。" #: plinth/modules/diagnostics/templates/diagnostics.html:50 #: plinth/modules/diagnostics/templates/diagnostics_button.html:27 msgid "Run Diagnostics" -msgstr "" +msgstr "运行诊断程序" #: plinth/modules/diagnostics/templates/diagnostics.html:53 msgid "Diagnotics test is currently running" -msgstr "" +msgstr "当前正在运行诊断测试" #: plinth/modules/diagnostics/templates/diagnostics.html:66 msgid "Results" -msgstr "" +msgstr "结果" #: plinth/modules/diagnostics/templates/diagnostics.html:74 #, python-format msgid "Module: %(module)s" -msgstr "" +msgstr "模块:%(module)s" #: plinth/modules/diagnostics/templates/diagnostics_module.html:25 msgid "Diagnostic Results" -msgstr "" +msgstr "诊断结果" #: plinth/modules/diagnostics/templates/diagnostics_module.html:27 #, python-format msgid "Module: %(module_name)s" -msgstr "" +msgstr "模块:%(module_name)s" #: plinth/modules/diagnostics/templates/diagnostics_module.html:32 msgid "This module does not support diagnostics" -msgstr "" +msgstr "此模块不支持诊断" #: plinth/modules/diagnostics/templates/diagnostics_results.html:27 msgid "Test" -msgstr "" +msgstr "测试" #: plinth/modules/diagnostics/templates/diagnostics_results.html:28 msgid "Result" -msgstr "" +msgstr "结果" #: plinth/modules/dynamicdns/dynamicdns.py:35 plinth/modules/help/help.py:40 msgid "About" -msgstr "" +msgstr "关于" #: plinth/modules/dynamicdns/dynamicdns.py:45 #: plinth/modules/dynamicdns/dynamicdns.py:54 msgid "Dynamic DNS" -msgstr "" +msgstr "动态 DNS" #: plinth/modules/dynamicdns/dynamicdns.py:71 msgid "" @@ -442,39 +442,42 @@ msgid "" "used within the URL. For details see the update URL templates of the example " "providers." msgstr "" +"变量 < 用户 > < 传递 > < Ip > < 域 > 可能在 URL 内使用。详细信息请参见更新 " +"URL 模板的示例提供程序。" #: plinth/modules/dynamicdns/dynamicdns.py:75 msgid "" "Please choose an update protocol according to your provider. If your " "provider does not support the GnudIP protocol or your provider is not listed " "you may use the update URL of your provider." -msgstr "" +msgstr "请选择您的提供商更新协议。如果您的提供商不支持 GnudIP 协议或未列出您的提供商可能会使用您的提供商的更新 URL。" #: plinth/modules/dynamicdns/dynamicdns.py:80 msgid "" "Please do not enter a URL here (like \"https://example.com/\") but only the " "hostname of the GnuDIP server (like \"example.com\")." msgstr "" +"请不要在此输入 URL(如\"https://example.com/\"),只输入 GnuDIP 服务器的主机名(例如“example.com”)。" #: plinth/modules/dynamicdns/dynamicdns.py:84 #, python-brace-format msgid "The public domain name you want use to reach your {box_name}." -msgstr "" +msgstr "你要访问你的 {box_name} 想使用的公开域名。" #: plinth/modules/dynamicdns/dynamicdns.py:87 msgid "Use this option if your provider uses self signed certificates." -msgstr "" +msgstr "如果您的提供商使用自签名的证书,请使用此选项。" #: plinth/modules/dynamicdns/dynamicdns.py:90 msgid "" "If this option is selected, your username and password will be used for HTTP " "basic authentication." -msgstr "" +msgstr "如果选择了此选项,您的用户名和密码将用于 HTTP 基本身份验证。" #: plinth/modules/dynamicdns/dynamicdns.py:93 msgid "" "Leave this field empty if you want to keep your previous configured password." -msgstr "" +msgstr "如果你想保持你以前配置的密码,请将此字段留空的。" #: plinth/modules/dynamicdns/dynamicdns.py:96 #, python-brace-format @@ -489,82 +492,82 @@ msgstr "" msgid "" "You should have been requested to select a username when you created the " "account." -msgstr "" +msgstr "您在创建该帐户时应该被要求选择一个用户名。" #: plinth/modules/dynamicdns/dynamicdns.py:115 msgid "Enable Dynamic DNS" -msgstr "" +msgstr "启用动态 DNS" #: plinth/modules/dynamicdns/dynamicdns.py:118 msgid "Service type" -msgstr "" +msgstr "服务类型" #: plinth/modules/dynamicdns/dynamicdns.py:123 msgid "GnudIP Server Address" -msgstr "" +msgstr "GnudIP 服务器地址" #: plinth/modules/dynamicdns/dynamicdns.py:128 msgid "Invalid server name" -msgstr "" +msgstr "服务器名称无效" #: plinth/modules/dynamicdns/dynamicdns.py:131 msgid "Update URL" -msgstr "" +msgstr "更新 URL" #: plinth/modules/dynamicdns/dynamicdns.py:135 msgid "Accept all SSL certificates" -msgstr "" +msgstr "接受所有 SSL 证书" #: plinth/modules/dynamicdns/dynamicdns.py:139 msgid "Use HTTP basic authentication" -msgstr "" +msgstr "使用 HTTP 基本身份验证" #: plinth/modules/dynamicdns/dynamicdns.py:151 #: plinth/modules/networks/forms.py:146 plinth/modules/transmission/forms.py:39 msgid "Username" -msgstr "" +msgstr "用户名" #: plinth/modules/dynamicdns/dynamicdns.py:154 #: plinth/modules/networks/forms.py:147 plinth/modules/transmission/forms.py:43 msgid "Password" -msgstr "" +msgstr "密码" #: plinth/modules/dynamicdns/dynamicdns.py:157 #: plinth/modules/networks/forms.py:149 msgid "Show password" -msgstr "" +msgstr "显示密码" #: plinth/modules/dynamicdns/dynamicdns.py:161 msgid "IP check URL" -msgstr "" +msgstr "IP 检查 URL" #: plinth/modules/dynamicdns/dynamicdns.py:187 msgid "Please provide update URL or a GnuDIP Server" -msgstr "" +msgstr "请提供更新 URL 或 GnuDIP 服务器" #: plinth/modules/dynamicdns/dynamicdns.py:190 msgid "Please provide GnuDIP username" -msgstr "" +msgstr "请提供 GnuDIP 用户名" #: plinth/modules/dynamicdns/dynamicdns.py:193 msgid "Please provide GnuDIP domain" -msgstr "" +msgstr "请提供 GnuDIP 域" #: plinth/modules/dynamicdns/dynamicdns.py:198 msgid "Please provide a password" -msgstr "" +msgstr "请提供一个密码" #: plinth/modules/dynamicdns/dynamicdns.py:217 msgid "Configure Dynamic DNS" -msgstr "" +msgstr "配置动态 DNS" #: plinth/modules/dynamicdns/dynamicdns.py:239 msgid "Status of Dynamic DNS" -msgstr "" +msgstr "动态 DNS 的状态" #: plinth/modules/dynamicdns/templates/dynamicdns.html:25 msgid "Dynamic DNS Client" -msgstr "" +msgstr "动态 DNS 客户端" #: plinth/modules/dynamicdns/templates/dynamicdns.html:28 #, python-format @@ -598,27 +601,27 @@ msgstr "" msgid "" "If your %(box_name)s is connected behind some NAT router, don't forget to " "add port forwarding (i.e. forward some standard ports like 80 and 443)." -msgstr "" +msgstr "如果您的 %(box_name)s 通过 NAT 方式的路由连接,别忘了添加端口转发(即转发一些标准端口像 80 和 443)。" #: plinth/modules/dynamicdns/templates/dynamicdns_configure.html:30 msgid "" "You have disabled Javascript. Dynamic form mode is disabled and some helper " "functions may not work (but the main functionality should work)." -msgstr "" +msgstr "您已禁用 Javascript。禁用动态表单模式和一些 helper 函数可能无法工作(但主要功能应该工作)。" #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:25 msgid "NAT type" -msgstr "" +msgstr "NAT 类型" #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:29 msgid "" "NAT type not detected yet, if you do not provide a \"IP check URL\" we will " "not detect a NAT type." -msgstr "" +msgstr "不能探测到 NAT 类型,如果你不提供”IP 检查 URL“我们将检测不到 NAT 类型。" #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:35 msgid "Direct connection to the Internet." -msgstr "" +msgstr "直接连接到互联网。" #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:37 #, python-format @@ -631,13 +634,13 @@ msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:48 msgid "Last update" -msgstr "" +msgstr "最后一次更新" #: plinth/modules/firewall/firewall.py:39 #: plinth/modules/firewall/firewall.py:49 #: plinth/modules/firewall/firewall.py:57 msgid "Firewall" -msgstr "" +msgstr "防火墙" #: plinth/modules/firewall/templates/firewall.html:28 #, python-format @@ -645,11 +648,11 @@ msgid "" "Firewall is a security system that controls the incoming and outgoing " "network traffic on your %(box_name)s. Keeping a firewall enabled and " "properly configured reduces risk of security threat from the Internet." -msgstr "" +msgstr "防火墙控制你 %(box_name)s 上的进出网络流量。启用并正确配置防火墙上可以减少来自互联网的安全威胁。" #: plinth/modules/firewall/templates/firewall.html:36 msgid "Current status:" -msgstr "" +msgstr "当前状态:" #: plinth/modules/firewall/templates/firewall.html:41 #, python-format @@ -662,90 +665,90 @@ msgstr "" #: plinth/modules/firewall/templates/firewall.html:56 msgid "Service/Port" -msgstr "" +msgstr "服务/端口" #: plinth/modules/firewall/templates/firewall.html:67 #: plinth/modules/letsencrypt/templates/letsencrypt.html:91 #: plinth/modules/names/templates/names.html:51 msgid "Enabled" -msgstr "" +msgstr "启用" #: plinth/modules/firewall/templates/firewall.html:70 #: plinth/modules/letsencrypt/templates/letsencrypt.html:93 #: plinth/modules/names/templates/names.html:53 msgid "Disabled" -msgstr "" +msgstr "已禁用" #: plinth/modules/firewall/templates/firewall.html:81 msgid "Permitted" -msgstr "" +msgstr "允许" #: plinth/modules/firewall/templates/firewall.html:84 msgid "Permitted (internal only)" -msgstr "" +msgstr "允许(只允许内部连接)" #: plinth/modules/firewall/templates/firewall.html:87 msgid "Permitted (external only)" -msgstr "" +msgstr "允许(只允许外部连接)" #: plinth/modules/firewall/templates/firewall.html:90 msgid "Blocked" -msgstr "" +msgstr "已阻止" #: plinth/modules/firewall/templates/firewall.html:103 msgid "" "The operation of the firewall is automatic. When you enable a service it is " "also permitted in the firewall and when you disable a service it is also " "disabled in the firewall." -msgstr "" +msgstr "防火墙的操作是自动的。当您启用服务时它也在防火墙中允许,当禁用一项服务时也会禁用防火墙中的相应服务。" #: plinth/modules/first_boot/forms.py:48 plinth/modules/users/forms.py:70 msgid "Creating LDAP user failed." -msgstr "" +msgstr "创建 LDAP 用户失败。" #: plinth/modules/first_boot/forms.py:56 msgid "Failed to add new user to admin group." -msgstr "" +msgstr "未能将新用户添加到管理员组。" #: plinth/modules/first_boot/forms.py:78 msgid "User account created, you are now logged in" -msgstr "" +msgstr "用户帐户已创建,您现在可以登录" #: plinth/modules/first_boot/templates/firstboot_navbar.html:23 #: plinth/modules/help/templates/help_index.html:25 #: plinth/templates/base.html:102 msgid "Help" -msgstr "" +msgstr "帮助" #: plinth/modules/first_boot/templates/firstboot_state0.html:45 msgid "Start Setup" -msgstr "" +msgstr "启动安装程序" #: plinth/modules/first_boot/templates/firstboot_state0.html:49 #, python-format msgid "" "To complete the setup of your %(box_name)s, please provide some basic " "information." -msgstr "" +msgstr "要完成您的 %(box_name)s 安装,请提供一些基本信息。" #: plinth/modules/first_boot/templates/firstboot_state1.html:41 msgid "Administrator Account" -msgstr "" +msgstr "管理员帐户" #: plinth/modules/first_boot/templates/firstboot_state1.html:44 msgid "" "Choose a username and password to access this web interface. The password " "can be changed later. This user will be granted administrative privileges. " "Other users can be added later." -msgstr "" +msgstr "选择一个用户名和密码才能访问此 web 界面。以后可以更改密码。此用户将被授予管理权限。其他用户可以在以后添加。" #: plinth/modules/first_boot/templates/firstboot_state1.html:57 msgid "Box it up!" -msgstr "" +msgstr "用起来!" #: plinth/modules/first_boot/templates/firstboot_state10.html:29 msgid "Setup Complete!" -msgstr "" +msgstr "安装已完成!" #: plinth/modules/first_boot/templates/firstboot_state10.html:32 #, python-format @@ -753,55 +756,55 @@ msgid "" "%(box_name)s setup is now complete. To make your %(box_name)s functional, " "you need some applications. They will be installed the first time you " "access them." -msgstr "" +msgstr "%(box_name)s 安装程序现已完成。 若要使您的 %(box_name)s 起作用,您需要一些应用程序。 它们会在您首次访问时安装。" #: plinth/modules/first_boot/templates/firstboot_state10.html:41 msgid "Go to Apps" -msgstr "" +msgstr "转到应用程序" #: plinth/modules/first_boot/templates/firstboot_state10.html:44 msgid "Current Network Configuration" -msgstr "" +msgstr "当前的网络配置" #: plinth/modules/first_boot/templates/firstboot_state10.html:47 msgid "" "You should check the network setup and modify it if necessary. Do not forget " "to change the default Wi-Fi passwords!" -msgstr "" +msgstr "你应该检查网络设置,如果有必要可对其修改。若要更改默认无线上网密码,请不要忘记!" #: plinth/modules/first_boot/templates/firstboot_state10.html:57 msgid "Go to Networks" -msgstr "" +msgstr "转到网络" #: plinth/modules/first_boot/views.py:60 msgid "Setup Complete" -msgstr "" +msgstr "安装完成" #: plinth/modules/help/help.py:34 msgid "Documentation" -msgstr "" +msgstr "文档" #: plinth/modules/help/help.py:36 msgid "Where to Get Help" -msgstr "" +msgstr "从何处获得帮助" #: plinth/modules/help/help.py:38 msgid "Manual" -msgstr "" +msgstr "手册" #: plinth/modules/help/help.py:48 msgid "Documentation and FAQ" -msgstr "" +msgstr "文档和 FAQ" #: plinth/modules/help/help.py:55 #, python-brace-format msgid "About {box_name}" -msgstr "" +msgstr "关于 {box_name}" #: plinth/modules/help/help.py:73 #, python-brace-format msgid "{box_name} Manual" -msgstr "" +msgstr "{box_name} 手册" #: plinth/modules/help/templates/help_about.html:30 #, python-format @@ -839,20 +842,22 @@ msgid "" "For more information about the %(box_name)s project, see the %(box_name)s Wiki." msgstr "" +"有关 %(box_name)s 项目的详细信息,请参阅 %(box_name)s Wiki。" #: plinth/modules/help/templates/help_about.html:73 msgid "Learn more »" -msgstr "" +msgstr "了解更多»" #: plinth/modules/help/templates/help_about.html:76 #, python-format msgid "You are running Plinth version %(version)s." -msgstr "" +msgstr "您正在运行 Plinth 版本 %(version)s。" #: plinth/modules/help/templates/help_base.html:36 #, python-format msgid "%(box_name)s Setup" -msgstr "" +msgstr "%(box_name)s 安装程序" #: plinth/modules/help/templates/help_index.html:29 #, python-format @@ -860,6 +865,7 @@ msgid "" "The %(box_name)s Manual is the best place to " "start for information regarding %(box_name)s." msgstr "" +" %(box_name)s 手册 是开始了解 %(box_name)s 有关信息最好的地方。" #: plinth/modules/help/templates/help_index.html:36 #, python-format @@ -867,6 +873,8 @@ msgid "" " " "%(box_name)s project wiki contains further information." msgstr "" +" %(box_name)" +"s 项目 wiki 包含更多信息。" #: plinth/modules/help/templates/help_index.html:43 #, python-format @@ -888,140 +896,140 @@ msgstr "" #: plinth/modules/ikiwiki/__init__.py:38 msgid "Wiki and Blog (ikiwiki)" -msgstr "" +msgstr "Wiki 和博客(ikiwiki)" #: plinth/modules/ikiwiki/__init__.py:43 msgid "ikiwiki wikis and blogs" -msgstr "" +msgstr "ikiwiki wiki 和博客" #: plinth/modules/ikiwiki/forms.py:29 msgid "Enable ikiwiki" -msgstr "" +msgstr "启用 ikiwiki" #: plinth/modules/ikiwiki/forms.py:36 #: plinth/modules/networks/templates/connection_show.html:98 msgid "Type" -msgstr "" +msgstr "类型" #: plinth/modules/ikiwiki/forms.py:39 #: plinth/modules/networks/templates/connection_show.html:78 msgid "Name" -msgstr "" +msgstr "名称" #: plinth/modules/ikiwiki/forms.py:41 msgid "Admin Account Name" -msgstr "" +msgstr "管理员帐户名称" #: plinth/modules/ikiwiki/forms.py:44 msgid "Admin Account Password" -msgstr "" +msgstr "管理员帐户密码" #: plinth/modules/ikiwiki/templates/ikiwiki.html:27 msgid "" "When enabled, the blogs and wikis will be available from /ikiwiki." -msgstr "" +msgstr "启用以后,博客和 wiki 将可从 /ikiwiki 访问。" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:27 #, python-format msgid "Delete Wiki or Blog %(name)s" -msgstr "" +msgstr "删除 wiki 页面或博客 %(name)s " #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:33 msgid "" "This action will remove all the posts, pages and comments including revision " "history. Delete this wiki or blog permanently?" -msgstr "" +msgstr "此操作将删除所有文章、 网页和评论包括修订历史记录。 永久删除此 wiki 或博客吗?" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:44 #, python-format msgid "Delete %(name)s" -msgstr "" +msgstr "删除 %(name)s" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:47 #: plinth/modules/monkeysphere/templates/monkeysphere.html:60 #: plinth/modules/networks/templates/connections_delete.html:41 #: plinth/modules/users/templates/users_delete.html:41 msgid "Cancel" -msgstr "" +msgstr "取消" #: plinth/modules/ikiwiki/templates/ikiwiki_manage.html:41 msgid "No wikis or blogs available." -msgstr "" +msgstr "没有 wiki 或博客可用。" #: plinth/modules/ikiwiki/templates/ikiwiki_manage.html:45 msgid "Create a Wiki or Blog" -msgstr "" +msgstr "创建一个 Wiki 或博客" #: plinth/modules/ikiwiki/templates/ikiwiki_manage.html:55 #, python-format msgid "Delete site %(site)s" -msgstr "" +msgstr "删除站点 %(site)s" #: plinth/modules/ikiwiki/templates/ikiwiki_manage.html:61 #, python-format msgid "Go to site %(site)s" -msgstr "" +msgstr "转到站点 %(site)s" #: plinth/modules/ikiwiki/views.py:38 msgid "Manage" -msgstr "" +msgstr "管理" #: plinth/modules/ikiwiki/views.py:40 msgid "Create" -msgstr "" +msgstr "创建" #: plinth/modules/ikiwiki/views.py:73 msgid "Wiki and Blog" -msgstr "" +msgstr "Wiki 和博客" #: plinth/modules/ikiwiki/views.py:106 msgid "Manage Wikis and Blogs" -msgstr "" +msgstr "管理 Wiki 和博客" #: plinth/modules/ikiwiki/views.py:132 msgid "Create Wiki or Blog" -msgstr "" +msgstr "创建 Wiki 或博客" #: plinth/modules/ikiwiki/views.py:145 #, python-brace-format msgid "Created wiki {name}." -msgstr "" +msgstr "创建 wiki {name}。" #: plinth/modules/ikiwiki/views.py:147 #, python-brace-format msgid "Could not create wiki: {error}" -msgstr "" +msgstr "不能创建 wiki:{error}" #: plinth/modules/ikiwiki/views.py:159 #, python-brace-format msgid "Created blog {name}." -msgstr "" +msgstr "已创建的博客 {name}。" #: plinth/modules/ikiwiki/views.py:161 #, python-brace-format msgid "Could not create blog: {error}" -msgstr "" +msgstr "不能创建博客:{error}" #: plinth/modules/ikiwiki/views.py:174 #, python-brace-format msgid "{name} deleted." -msgstr "" +msgstr "{name} 已删除。" #: plinth/modules/ikiwiki/views.py:176 #, python-brace-format msgid "Could not delete {name}: {error}" -msgstr "" +msgstr "不能删除 {name}:{error}" #: plinth/modules/ikiwiki/views.py:182 msgid "Delete Wiki or Blog" -msgstr "" +msgstr "删除 wiki 页面或博客" #: plinth/modules/letsencrypt/__init__.py:43 #: plinth/modules/letsencrypt/templates/letsencrypt.html:38 #: plinth/modules/letsencrypt/views.py:45 msgid "Certificates (Let's Encrypt)" -msgstr "" +msgstr "证书(Let's Encrypt)" #: plinth/modules/letsencrypt/templates/letsencrypt.html:41 #, python-format @@ -1044,67 +1052,67 @@ msgstr "" #: plinth/modules/letsencrypt/templates/letsencrypt.html:66 #: plinth/modules/monkeysphere/templates/monkeysphere.html:70 msgid "Domain" -msgstr "" +msgstr "域名" #: plinth/modules/letsencrypt/templates/letsencrypt.html:67 msgid "Certificate Status" -msgstr "" +msgstr "证书状态" #: plinth/modules/letsencrypt/templates/letsencrypt.html:68 msgid "Website Security" -msgstr "" +msgstr "网站安全" #: plinth/modules/letsencrypt/templates/letsencrypt.html:69 #: plinth/modules/monkeysphere/templates/monkeysphere.html:72 msgid "Actions" -msgstr "" +msgstr "行动" #: plinth/modules/letsencrypt/templates/letsencrypt.html:79 #, python-format msgid "Expires on %(expiry_date)s" -msgstr "" +msgstr "到期日期 %(expiry_date)s" #: plinth/modules/letsencrypt/templates/letsencrypt.html:85 msgid "No certficate" -msgstr "" +msgstr "没有证书" #: plinth/modules/letsencrypt/templates/letsencrypt.html:102 msgid "Revoke" -msgstr "" +msgstr "撤销" #: plinth/modules/letsencrypt/templates/letsencrypt.html:108 msgid "Re-obtain" -msgstr "" +msgstr "重新获取" #: plinth/modules/letsencrypt/templates/letsencrypt.html:115 msgid "Obtain" -msgstr "" +msgstr "获取" #: plinth/modules/letsencrypt/views.py:55 #, python-brace-format msgid "Certificate successfully revoked for domain {domain}" -msgstr "" +msgstr "成功为域名 {domain} 吊销证书" #: plinth/modules/letsencrypt/views.py:60 #, python-brace-format msgid "Failed to revoke certificate for domain {domain}: {error}" -msgstr "" +msgstr "无法为 {domain} 撤销证书:{error}" #: plinth/modules/letsencrypt/views.py:72 #, python-brace-format msgid "Certificate successfully obtained for domain {domain}" -msgstr "" +msgstr "为域名 {domain} 成功获得证书" #: plinth/modules/letsencrypt/views.py:77 #, python-brace-format msgid "Failed to obtain certificate for domain {domain}: {error}" -msgstr "" +msgstr "未能为域名 {domain} 获取证书:{error}" #: plinth/modules/monkeysphere/__init__.py:32 #: plinth/modules/monkeysphere/templates/monkeysphere.html:35 #: plinth/modules/monkeysphere/views.py:44 msgid "Monkeysphere" -msgstr "" +msgstr "Monkeysphere" #: plinth/modules/monkeysphere/templates/monkeysphere.html:38 msgid "" @@ -1119,60 +1127,60 @@ msgstr "" #: plinth/modules/monkeysphere/templates/monkeysphere.html:53 msgid "Publishing key to keyserver..." -msgstr "" +msgstr "正在发布密钥到密钥服务器..." #: plinth/modules/monkeysphere/templates/monkeysphere.html:71 msgid "GPG Fingerprint" -msgstr "" +msgstr "GPG 指纹" #: plinth/modules/monkeysphere/templates/monkeysphere.html:83 #: plinth/modules/names/views.py:45 msgid "Not Available" -msgstr "" +msgstr "不可用" #: plinth/modules/monkeysphere/templates/monkeysphere.html:93 msgid "Generate PGP Key" -msgstr "" +msgstr "生成 PGP 密钥" #: plinth/modules/monkeysphere/templates/monkeysphere.html:101 msgid "Publish Key" -msgstr "" +msgstr "发布密钥" #: plinth/modules/monkeysphere/views.py:58 msgid "Generated PGP key." -msgstr "" +msgstr "已生成的 PGP 密钥。" #: plinth/modules/monkeysphere/views.py:83 msgid "Cancelled key publishing." -msgstr "" +msgstr "已取消的密钥发布。" #: plinth/modules/monkeysphere/views.py:120 msgid "Published key to keyserver." -msgstr "" +msgstr "已发布到密钥服务器的密钥。" #: plinth/modules/monkeysphere/views.py:122 msgid "Error occurred while publishing key." -msgstr "" +msgstr "发布密钥时出现错误。" #: plinth/modules/mumble/__init__.py:38 #: plinth/modules/mumble/templates/mumble.html:26 #: plinth/modules/mumble/views.py:58 msgid "Voice Chat (Mumble)" -msgstr "" +msgstr "语音聊天(Mumble)" #: plinth/modules/mumble/__init__.py:43 msgid "Mumble Voice Chat Server" -msgstr "" +msgstr "Mumble 语音聊天服务器" #: plinth/modules/mumble/forms.py:29 msgid "Enable Mumble daemon" -msgstr "" +msgstr "启用 Mumble 守护进程" #: plinth/modules/mumble/templates/mumble.html:29 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " "software." -msgstr "" +msgstr "Mumble 是一个开放源码的低延迟、 加密、 高品质语音聊天软件。" #: plinth/modules/mumble/templates/mumble.html:36 msgid "" @@ -1180,265 +1188,267 @@ msgid "" "href=\"http://mumble.info\">Clients to connect to Mumble from your " "desktop and Android devices are available." msgstr "" +"您可以使用常规端口 64738 连接到您的 Mumble 服务器。您可以从桌面和 Android 设备连接 Mumble 客户端。" #: plinth/modules/mumble/templates/mumble.html:49 msgid "Mumble server is running" -msgstr "" +msgstr "Mumble 服务器正在运行" #: plinth/modules/mumble/templates/mumble.html:52 msgid "Mumble server is not running" -msgstr "" +msgstr "Mumble 服务器未运行" #: plinth/modules/names/__init__.py:29 msgid "HTTP" -msgstr "" +msgstr "HTTP" #: plinth/modules/names/__init__.py:30 msgid "HTTPS" -msgstr "" +msgstr "HTTPS" #: plinth/modules/names/__init__.py:31 msgid "SSH" -msgstr "" +msgstr "SSH" #: plinth/modules/names/__init__.py:45 plinth/modules/names/views.py:34 msgid "Name Services" -msgstr "" +msgstr "名称服务" #: plinth/modules/networks/__init__.py:108 #, python-brace-format msgid "Using DNSSEC on IPv{kind}" -msgstr "" +msgstr "在 IPv{kind} 上使用 DNSSEC" #: plinth/modules/networks/forms.py:30 msgid "Connection Type" -msgstr "" +msgstr "连接类型" #: plinth/modules/networks/forms.py:37 msgid "Connection Name" -msgstr "" +msgstr "连接名称" #: plinth/modules/networks/forms.py:39 msgid "Physical Interface" -msgstr "" +msgstr "物理接口" #: plinth/modules/networks/forms.py:41 msgid "The network device that this connection should be bound to." -msgstr "" +msgstr "连接应绑定到的网络设备。" #: plinth/modules/networks/forms.py:44 msgid "Firewall Zone" -msgstr "" +msgstr "防火墙区域" #: plinth/modules/networks/forms.py:45 msgid "" "The firewall zone will control which services are available over this " "interfaces. Select Internal only for trusted networks." -msgstr "" +msgstr "防火墙区域将控制哪些服务可用在此接口。选择内部只有受信任的网络。" #: plinth/modules/networks/forms.py:49 msgid "IPv4 Addressing Method" -msgstr "" +msgstr "IPv4 寻址方式" #: plinth/modules/networks/forms.py:50 msgid "" "\"Shared\" method will start a DHCP server and \"Automatic\" method will " "acquire configuration from a DHCP server." -msgstr "" +msgstr "\"共享\"的方法将启动 DHCP 服务器而\"自动\"方法将获得从 DHCP 服务器的配置。" #: plinth/modules/networks/forms.py:56 msgid "Address" -msgstr "" +msgstr "地址" #: plinth/modules/networks/forms.py:60 msgid "Netmask" -msgstr "" +msgstr "子网掩码" #: plinth/modules/networks/forms.py:61 msgid "" "Optional value. If left blank, a default netmask based on the address will " "be used." -msgstr "" +msgstr "可选的值。如果为空,则将使用基于地址的默认子网掩码。" #: plinth/modules/networks/forms.py:66 #: plinth/modules/networks/templates/connection_show.html:202 #: plinth/modules/networks/templates/connection_show.html:241 msgid "Gateway" -msgstr "" +msgstr "网关" #: plinth/modules/networks/forms.py:67 msgid "Optional value." -msgstr "" +msgstr "可选的值。" #: plinth/modules/networks/forms.py:71 msgid "DNS Server" -msgstr "" +msgstr "DNS 服务器" #: plinth/modules/networks/forms.py:72 msgid "" "Optional value. If this value is given and IPv4 addressing method is " "\"Automatic\", the DNS Servers provided by a DHCP server will be ignored." -msgstr "" +msgstr "可选的值。如果给出了此值和 IPv4 寻址方法是\"自动\",将忽略由 DHCP 服务器提供的 DNS 服务器。" #: plinth/modules/networks/forms.py:78 msgid "Second DNS Server" -msgstr "" +msgstr "备选 DNS 服务器" #: plinth/modules/networks/forms.py:79 msgid "" "Optional value. If this value is given and IPv4 Addressing Method is " "\"Automatic\", the DNS Servers provided by a DHCP server will be ignored." -msgstr "" +msgstr "可选的值。如果给出了此值和 IPv4 寻址方式是\"自动\",将忽略由 DHCP 服务器提供的 DNS 服务器。" #: plinth/modules/networks/forms.py:89 msgid "-- select --" -msgstr "" +msgstr "-- 选择 --" #: plinth/modules/networks/forms.py:175 #: plinth/modules/networks/templates/connection_show.html:144 msgid "SSID" -msgstr "" +msgstr "SSID" #: plinth/modules/networks/forms.py:176 msgid "The visible name of the network." -msgstr "" +msgstr "可见网络的名称。" #: plinth/modules/networks/forms.py:178 #: plinth/modules/networks/templates/connection_show.html:157 msgid "Mode" -msgstr "" +msgstr "模式" #: plinth/modules/networks/forms.py:183 msgid "Authentication Mode" -msgstr "" +msgstr "身份验证模式" #: plinth/modules/networks/forms.py:184 msgid "" "Select WPA if the wireless network is secured and requires clients to have " "the password to connect." -msgstr "" +msgstr "如果无线网络安全的和要求客户端具有密码才能连接,请选择 WPA。" #: plinth/modules/networks/forms.py:188 msgid "Passphrase" -msgstr "" +msgstr "密码" #: plinth/modules/networks/networks.py:36 #: plinth/modules/networks/networks.py:56 msgid "Network Connections" -msgstr "" +msgstr "网络连接" #: plinth/modules/networks/networks.py:38 #: plinth/modules/networks/networks.py:242 msgid "Nearby Wi-Fi Networks" -msgstr "" +msgstr "附近的无线网络" #: plinth/modules/networks/networks.py:40 #: plinth/modules/networks/networks.py:264 msgid "Add Connection" -msgstr "" +msgstr "添加连接" #: plinth/modules/networks/networks.py:46 msgid "Networks" -msgstr "" +msgstr "网络" #: plinth/modules/networks/networks.py:66 msgid "Cannot show connection: Connection not found." -msgstr "" +msgstr "不能显示连接: 找不到连接。" #: plinth/modules/networks/networks.py:100 msgid "Show Connection information" -msgstr "" +msgstr "显示连接信息" #: plinth/modules/networks/networks.py:113 msgid "Cannot edit connection: Connection not found." -msgstr "" +msgstr "不能编辑连接: 找不到连接。" #: plinth/modules/networks/networks.py:119 msgid "This type of connection is not yet understood." -msgstr "" +msgstr "这种类型的连接尚没有引入。" #: plinth/modules/networks/networks.py:139 #: plinth/modules/networks/networks.py:198 #: plinth/modules/networks/templates/connections_edit.html:34 msgid "Edit Connection" -msgstr "" +msgstr "编辑连接" #: plinth/modules/networks/networks.py:209 #, python-brace-format msgid "Activated connection {name}." -msgstr "" +msgstr "激活的连接 {name}。" #: plinth/modules/networks/networks.py:212 msgid "Failed to activate connection: Connection not found." -msgstr "" +msgstr "未能激活连接: 找不到连接。" #: plinth/modules/networks/networks.py:216 #, python-brace-format msgid "Failed to activate connection {name}: No suitable device is available." -msgstr "" +msgstr "未能激活连接 {name}: 没有合适的设备是可用。" #: plinth/modules/networks/networks.py:229 #, python-brace-format msgid "Deactivated connection {name}." -msgstr "" +msgstr "停用的连接 {name}。" #: plinth/modules/networks/networks.py:232 msgid "Failed to de-activate connection: Connection not found." -msgstr "" +msgstr "无法取消激活连接: 找不到连接。" #: plinth/modules/networks/networks.py:282 msgid "Adding New Ethernet Connection" -msgstr "" +msgstr "添加新的以太网连接" #: plinth/modules/networks/networks.py:300 msgid "Adding New PPPoE Connection" -msgstr "" +msgstr "添加新的 PPPoE 连接" #: plinth/modules/networks/networks.py:332 msgid "Adding New Wi-Fi Connection" -msgstr "" +msgstr "添加新的 Wi-Fi 连接" #: plinth/modules/networks/networks.py:346 #, python-brace-format msgid "Connection {name} deleted." -msgstr "" +msgstr "连接 {name} 已删除。" #: plinth/modules/networks/networks.py:349 #: plinth/modules/networks/networks.py:358 msgid "Failed to delete connection: Connection not found." -msgstr "" +msgstr "删除连接失败: 找不到连接。" #: plinth/modules/networks/networks.py:363 #: plinth/modules/networks/templates/connections_delete.html:26 msgid "Delete Connection" -msgstr "" +msgstr "删除连接" #: plinth/modules/networks/templates/connection_show.html:43 msgid "Edit connection" -msgstr "" +msgstr "编辑连接" #: plinth/modules/networks/templates/connection_show.html:43 #: plinth/templates/base.html:123 msgid "Edit" -msgstr "" +msgstr "編輯" #: plinth/modules/networks/templates/connection_show.html:50 #: plinth/modules/networks/templates/connections_list.html:78 msgid "Deactivate" -msgstr "" +msgstr "停用" #: plinth/modules/networks/templates/connection_show.html:57 #: plinth/modules/networks/templates/connections_list.html:86 msgid "Activate" -msgstr "" +msgstr "激活" #: plinth/modules/networks/templates/connection_show.html:63 msgid "Delete connection" -msgstr "" +msgstr "删除连接" #: plinth/modules/networks/templates/connection_show.html:63 msgid "Delete" -msgstr "" +msgstr "删除" #: plinth/modules/networks/templates/connection_show.html:66 #: plinth/modules/networks/templates/connections_diagram.html:73 @@ -1446,136 +1456,136 @@ msgstr "" #: plinth/modules/networks/templates/connections_diagram.html:105 #: plinth/modules/networks/templates/connections_diagram.html:127 msgid "Connection" -msgstr "" +msgstr "连接" #: plinth/modules/networks/templates/connection_show.html:71 msgid "Primary connection" -msgstr "" +msgstr "主连接" #: plinth/modules/networks/templates/connection_show.html:73 #: plinth/modules/networks/templates/connection_show.html:217 #: plinth/modules/networks/templates/connection_show.html:256 msgid "yes" -msgstr "" +msgstr "是的" #: plinth/modules/networks/templates/connection_show.html:84 msgid "Device" -msgstr "" +msgstr "设备" #: plinth/modules/networks/templates/connection_show.html:88 msgid "State" -msgstr "" +msgstr "状态" #: plinth/modules/networks/templates/connection_show.html:93 msgid "State reason" -msgstr "" +msgstr "状态原因" #: plinth/modules/networks/templates/connection_show.html:102 msgid "MAC address" -msgstr "" +msgstr "MAC 地址" #: plinth/modules/networks/templates/connection_show.html:106 msgid "Interface" -msgstr "" +msgstr "接口" #: plinth/modules/networks/templates/connection_show.html:110 msgid "Description" -msgstr "" +msgstr "描述" #: plinth/modules/networks/templates/connection_show.html:116 msgid "Physical Link" -msgstr "" +msgstr "物理链路" #: plinth/modules/networks/templates/connection_show.html:121 msgid "Link state" -msgstr "" +msgstr "链路状态" #: plinth/modules/networks/templates/connection_show.html:125 msgid "cable is connected" -msgstr "" +msgstr "线缆已连接" #: plinth/modules/networks/templates/connection_show.html:128 msgid "please check cable" -msgstr "" +msgstr "请检查线缆" #: plinth/modules/networks/templates/connection_show.html:133 #: plinth/modules/networks/templates/connection_show.html:149 msgid "Speed" -msgstr "" +msgstr "速度" #: plinth/modules/networks/templates/connection_show.html:135 #, python-format msgid "%(ethernet_speed)s Mbit/s" -msgstr "" +msgstr "%(ethernet_speed)s Mbit/s" #: plinth/modules/networks/templates/connection_show.html:151 #, python-format msgid "%(wireless_bitrate)s Mbit/s" -msgstr "" +msgstr "%(wireless_bitrate)s Mbit/s" #: plinth/modules/networks/templates/connection_show.html:163 msgid "Signal strength" -msgstr "" +msgstr "信号强度" #: plinth/modules/networks/templates/connection_show.html:173 msgid "Channel" -msgstr "" +msgstr "信道" #: plinth/modules/networks/templates/connection_show.html:181 msgid "IPv4" -msgstr "" +msgstr "IPv4" #: plinth/modules/networks/templates/connection_show.html:186 #: plinth/modules/networks/templates/connection_show.html:227 msgid "Method" -msgstr "" +msgstr "方法" #: plinth/modules/networks/templates/connection_show.html:193 #: plinth/modules/networks/templates/connection_show.html:234 msgid "IP address" -msgstr "" +msgstr "IP 地址" #: plinth/modules/networks/templates/connection_show.html:209 #: plinth/modules/networks/templates/connection_show.html:248 msgid "DNS server" -msgstr "" +msgstr "DNS 服务器" #: plinth/modules/networks/templates/connection_show.html:216 #: plinth/modules/networks/templates/connection_show.html:255 msgid "Default" -msgstr "" +msgstr "默认" #: plinth/modules/networks/templates/connection_show.html:222 msgid "IPv6" -msgstr "" +msgstr "IPv6" #: plinth/modules/networks/templates/connection_show.html:263 msgid "This connection is not active." -msgstr "" +msgstr "此连接未处于激活状态。" #: plinth/modules/networks/templates/connection_show.html:266 msgid "Security" -msgstr "" +msgstr "安全" #: plinth/modules/networks/templates/connection_show.html:271 #: plinth/modules/networks/templates/connection_show.html:291 #: plinth/modules/networks/templates/connection_show.html:310 msgid "Firewall zone" -msgstr "" +msgstr "防火墙区域" #: plinth/modules/networks/templates/connection_show.html:280 msgid "" "This interface should be connected to a 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." -msgstr "" +msgstr "此接口应该连接到本地网络。 如果您将此接口连接到公用网络,意味着只为内网提供的服务将成开放给外网。这会产生安全风险。" #: plinth/modules/networks/templates/connection_show.html:300 msgid "" "This interface should receive your Internet connection. If you connect it to " "a local network/machine, many services meant to available only internally " "will not be available." -msgstr "" +msgstr "此接口应该接收您的 Internet 连接。如果你将其连接到本地网络,这意味着很多仅在内网可用的服务将不可用。" #: plinth/modules/networks/templates/connection_show.html:319 #, python-format @@ -1589,86 +1599,86 @@ msgstr "" #: plinth/modules/networks/templates/connections_add.html:34 #: plinth/modules/networks/templates/connections_type_select.html:34 msgid "Create..." -msgstr "" +msgstr "创建..." #: plinth/modules/networks/templates/connections_create.html:34 msgid "Create Connection" -msgstr "" +msgstr "创建连接" #: plinth/modules/networks/templates/connections_delete.html:29 #, python-format msgid "Delete connection %(name)s permanently?" -msgstr "" +msgstr "永久删除连接 %(name)s?" #: plinth/modules/networks/templates/connections_diagram.html:65 msgid "Internet" -msgstr "" +msgstr "互联网" #: plinth/modules/networks/templates/connections_diagram.html:70 #: plinth/modules/networks/templates/connections_diagram.html:102 msgid "Spacing" -msgstr "" +msgstr "间距" #: plinth/modules/networks/templates/connections_diagram.html:78 msgid "External" -msgstr "" +msgstr "外网" #: plinth/modules/networks/templates/connections_diagram.html:83 #: plinth/modules/networks/templates/connections_diagram.html:113 #: plinth/network.py:37 msgid "Ethernet" -msgstr "" +msgstr "以太网" #: plinth/modules/networks/templates/connections_diagram.html:86 #: plinth/modules/networks/templates/connections_diagram.html:116 #: plinth/network.py:38 msgid "Wi-Fi" -msgstr "" +msgstr "Wi-Fi" #: plinth/modules/networks/templates/connections_diagram.html:89 #, python-format msgid "Show connection %(connection.name)s" -msgstr "" +msgstr "显示连接 %(connection.name)s" #: plinth/modules/networks/templates/connections_diagram.html:107 msgid "Internal" -msgstr "" +msgstr "内网" #: plinth/modules/networks/templates/connections_diagram.html:119 #, python-format msgid "Show connection %(name)s" -msgstr "" +msgstr "显示连接 %(name)s" #: plinth/modules/networks/templates/connections_diagram.html:131 msgid "Computer" -msgstr "" +msgstr "计算机" #: plinth/modules/networks/templates/connections_list.html:67 #, python-format msgid "Delete connection %(name)s" -msgstr "" +msgstr "删除连接 %(name)s" #: plinth/modules/networks/templates/connections_list.html:92 msgid "Active" -msgstr "" +msgstr "激活" #: plinth/modules/networks/templates/connections_list.html:95 msgid "Inactive" -msgstr "" +msgstr "未激活" #: plinth/modules/openvpn/__init__.py:38 #: plinth/modules/openvpn/templates/openvpn.html:35 #: plinth/modules/openvpn/views.py:62 msgid "Virtual Private Network (OpenVPN)" -msgstr "" +msgstr "虚拟专用网络(OpenVPN)" #: plinth/modules/openvpn/__init__.py:43 msgid "OpenVPN" -msgstr "" +msgstr "OpenVPN" #: plinth/modules/openvpn/forms.py:29 msgid "Enable OpenVPN server" -msgstr "" +msgstr "启用 OpenVPN 服务器" #: plinth/modules/openvpn/templates/openvpn.html:38 #, python-format @@ -1683,7 +1693,7 @@ msgstr "" #: plinth/modules/openvpn/templates/openvpn.html:51 msgid "Profile" -msgstr "" +msgstr "配置文件" #: plinth/modules/openvpn/templates/openvpn.html:54 #, python-format @@ -1699,11 +1709,11 @@ msgstr "" #: plinth/modules/openvpn/templates/openvpn.html:66 #, python-format msgid "Profile is specific to each user of %(box_name)s. Keep it a secret." -msgstr "" +msgstr "配置文件是特定于每个 %(box_name)s 用户的。请保持其私密。" #: plinth/modules/openvpn/templates/openvpn.html:76 msgid "Download my profile" -msgstr "" +msgstr "下载我的配置文件" #: plinth/modules/openvpn/templates/openvpn.html:85 #, python-format @@ -1712,14 +1722,16 @@ msgid "" "time. Depending on how fast your %(box_name)s is, it may even take hours. " "If the setup is interrupted, you may start it again." msgstr "" +"OpenVPN 尚未安装。 执行安全的安装需要很长的时间。 根据您的 %(box_name)s 运行速度,它甚至可能需要小时。 " +"如果安装程序中断,您可以重新启动。" #: plinth/modules/openvpn/templates/openvpn.html:97 msgid "Start setup" -msgstr "" +msgstr "启动安装程序" #: plinth/modules/openvpn/templates/openvpn.html:104 msgid "OpenVPN setup is running" -msgstr "" +msgstr "OpenVPN 安装程序正在运行" #: plinth/modules/openvpn/templates/openvpn.html:108 #, python-format @@ -1728,44 +1740,45 @@ msgid "" "on how fast your %(box_name)s is, it may even take hours. If the setup is " "interrupted, you may start it again." msgstr "" +"若要执行更安全的安装,此过程需要很长的时间。根据您的 %(box_name)s 运行速度,它甚至可能需要数小时。如果安装程序中断,您可以重新启动。" #: plinth/modules/openvpn/templates/openvpn.html:121 msgid "OpenVPN server is running" -msgstr "" +msgstr "OpenVPN 服务正在运行" #: plinth/modules/openvpn/templates/openvpn.html:124 msgid "OpenVPN server is not running" -msgstr "" +msgstr "OpenVPN 服务器未运行" #: plinth/modules/openvpn/views.py:124 msgid "Setup completed." -msgstr "" +msgstr "安装已完成。" #: plinth/modules/openvpn/views.py:126 msgid "Setup failed." -msgstr "" +msgstr "安装失败。" #: plinth/modules/owncloud/owncloud.py:38 msgid "Enable ownCloud" -msgstr "" +msgstr "启用 ownCloud" #: plinth/modules/owncloud/owncloud.py:44 #: plinth/modules/owncloud/templates/owncloud.html:26 msgid "File Hosting (ownCloud)" -msgstr "" +msgstr "文件存储(ownCloud)" #: plinth/modules/owncloud/owncloud.py:51 #: plinth/modules/owncloud/owncloud.py:80 msgid "ownCloud" -msgstr "" +msgstr "ownCloud" #: plinth/modules/owncloud/owncloud.py:97 msgid "ownCloud enabled" -msgstr "" +msgstr "ownCloud 已启用" #: plinth/modules/owncloud/owncloud.py:100 msgid "ownCloud disabled" -msgstr "" +msgstr "ownCloud 已禁用" #: plinth/modules/owncloud/templates/owncloud.html:29 msgid "" @@ -1786,49 +1799,49 @@ msgstr "" #: plinth/modules/owncloud/templates/owncloud.html:59 msgid "Apply changes" -msgstr "" +msgstr "应用更改" #: plinth/modules/pagekite/__init__.py:35 plinth/modules/pagekite/views.py:46 msgid "Public Visibility (PageKite)" -msgstr "" +msgstr "公开可见性(PageKite)" #: plinth/modules/pagekite/forms.py:46 msgid "Enable PageKite" -msgstr "" +msgstr "启用 PageKite" #: plinth/modules/pagekite/forms.py:49 msgid "Server domain" -msgstr "" +msgstr "服务器域" #: plinth/modules/pagekite/forms.py:51 msgid "" "Select your pagekite server. Set \"pagekite.net\" to use the default " "pagekite.net server." -msgstr "" +msgstr "选择您的 pagekite 服务器。设置\"pagekite.net\"以便使用默认的 pagekite.net 服务器。" #: plinth/modules/pagekite/forms.py:55 msgid "Server port" -msgstr "" +msgstr "服务器端口" #: plinth/modules/pagekite/forms.py:56 msgid "Port of your pagekite server (default: 80)" -msgstr "" +msgstr "你 pagekite 服务器的端口 (默认: 80)" #: plinth/modules/pagekite/forms.py:58 msgid "Kite name" -msgstr "" +msgstr "Kite 名字" #: plinth/modules/pagekite/forms.py:59 msgid "Example: mybox.pagekite.me" -msgstr "" +msgstr "示例: mybox.pagekite.me" #: plinth/modules/pagekite/forms.py:62 msgid "Invalid kite name" -msgstr "" +msgstr "无效的 Kite 名称" #: plinth/modules/pagekite/forms.py:65 msgid "Kite secret" -msgstr "" +msgstr "Kite 密码" #: plinth/modules/pagekite/forms.py:67 msgid "" @@ -1838,71 +1851,71 @@ msgstr "" #: plinth/modules/pagekite/forms.py:83 msgid "Kite details set" -msgstr "" +msgstr "Kite 详细信息设置" #: plinth/modules/pagekite/forms.py:90 msgid "Pagekite server set" -msgstr "" +msgstr "Pagekite 服务器设置" #: plinth/modules/pagekite/forms.py:96 msgid "PageKite enabled" -msgstr "" +msgstr "PageKite 已启用" #: plinth/modules/pagekite/forms.py:99 msgid "PageKite disabled" -msgstr "" +msgstr "PageKite 已禁用" #: plinth/modules/pagekite/forms.py:135 #, python-brace-format msgid "Service enabled: {name}" -msgstr "" +msgstr "启用的服务:{name}" #: plinth/modules/pagekite/forms.py:139 #, python-brace-format msgid "Service disabled: {name}" -msgstr "" +msgstr "已禁用的服务:{name}" #: plinth/modules/pagekite/forms.py:150 msgid "protocol" -msgstr "" +msgstr "协议" #: plinth/modules/pagekite/forms.py:153 msgid "external (frontend) port" -msgstr "" +msgstr "外网(前端)端口" #: plinth/modules/pagekite/forms.py:156 msgid "internal (freedombox) port" -msgstr "" +msgstr "内网(freedombox)端口" #: plinth/modules/pagekite/forms.py:158 msgid "Enable Subdomains" -msgstr "" +msgstr "启用子域" #: plinth/modules/pagekite/forms.py:191 msgid "Deleted custom service" -msgstr "" +msgstr "删除自定义服务" #: plinth/modules/pagekite/forms.py:225 msgid "" "This service is available as a standard service. Please use the \"Standard " "Services\" page to enable it." -msgstr "" +msgstr "这项服务是可作为标准的服务。请使用\"标准服务\"页启用它。" #: plinth/modules/pagekite/forms.py:234 msgid "Added custom service" -msgstr "" +msgstr "已添加的自定义服务" #: plinth/modules/pagekite/forms.py:237 msgid "This service already exists" -msgstr "" +msgstr "此服务已存在" #: plinth/modules/pagekite/templates/pagekite_configure.html:33 msgid "PageKite Account" -msgstr "" +msgstr "PageKite 帐户" #: plinth/modules/pagekite/templates/pagekite_configure.html:41 msgid "Save settings" -msgstr "" +msgstr "保存设置" #: plinth/modules/pagekite/templates/pagekite_custom_services.html:44 msgid "" @@ -1913,28 +1926,28 @@ msgstr "" #: plinth/modules/pagekite/templates/pagekite_custom_services.html:56 msgid "Create a custom service" -msgstr "" +msgstr "创建一个自定义的服务" #: plinth/modules/pagekite/templates/pagekite_custom_services.html:64 msgid "Add Service" -msgstr "" +msgstr "添加服务" #: plinth/modules/pagekite/templates/pagekite_custom_services.html:71 msgid "Existing custom services" -msgstr "" +msgstr "现有的自定义服务" #: plinth/modules/pagekite/templates/pagekite_custom_services.html:74 msgid "You don't have any Custom Services enabled" -msgstr "" +msgstr "你没有启用任何自定义服务" #: plinth/modules/pagekite/templates/pagekite_custom_services.html:89 #, python-format msgid "connected to %(backend_host)s:%(backend_port)s" -msgstr "" +msgstr "连接到 %(backend_host)s:%(backend_port)s" #: plinth/modules/pagekite/templates/pagekite_custom_services.html:101 msgid "Delete this service" -msgstr "" +msgstr "删除此服务" #: plinth/modules/pagekite/templates/pagekite_introduction.html:26 #, python-format @@ -1948,29 +1961,29 @@ msgstr "" #: plinth/modules/pagekite/templates/pagekite_introduction.html:37 #, python-format msgid "%(box_name)s is behind a restricted firewall." -msgstr "" +msgstr "%(box_name)s 位于受限的防火墙的后面。" #: plinth/modules/pagekite/templates/pagekite_introduction.html:43 #, python-format msgid "" "%(box_name)s is connected to a (wireless) router which you don't control." -msgstr "" +msgstr "%(box_name)s 已连接到你不能控制的(无线)路由器。" #: plinth/modules/pagekite/templates/pagekite_introduction.html:50 msgid "" "Your ISP does not provide you an external IP address and instead provides " "Internet connection through NAT." -msgstr "" +msgstr "您的 ISP 没有提供外部的 IP 地址而是通过提供 NAT 连接互联网。" #: plinth/modules/pagekite/templates/pagekite_introduction.html:57 msgid "" "Your ISP does not provide you a static IP address and your IP address " "changes evertime you connect to Internet." -msgstr "" +msgstr "您的 ISP 不提供你一个静态的 IP 地址且你连接到互联网的 IP 地址每次会更改。" #: plinth/modules/pagekite/templates/pagekite_introduction.html:63 msgid "Your ISP limits incoming connections." -msgstr "" +msgstr "您的 ISP 限制传入的连接。" #: plinth/modules/pagekite/templates/pagekite_introduction.html:67 #, python-format @@ -1984,124 +1997,126 @@ msgstr "" #: plinth/modules/pagekite/templates/pagekite_introduction.html:78 #: plinth/modules/pagekite/views.py:36 msgid "Configure PageKite" -msgstr "" +msgstr "配置 PageKite" #: plinth/modules/pagekite/templates/pagekite_standard_services.html:40 msgid "Warning:
" -msgstr "" +msgstr "警告:
" #: plinth/modules/pagekite/templates/pagekite_standard_services.html:43 msgid "" "Published services are accessible and attackable from the evil internet." -msgstr "" +msgstr "已发布的服务可从互联网访问并受到邪恶攻击。" #: plinth/modules/pagekite/templates/pagekite_standard_services.html:50 msgid "Exposing SSH with the default password for 'fbx' is a VERY BAD idea." -msgstr "" +msgstr "将 SSH 暴露出来使用默认密码 \"fbx\" 是非常不明智的。" #: plinth/modules/pagekite/templates/pagekite_standard_services.html:65 msgid "Save Services" -msgstr "" +msgstr "保存服务" #: plinth/modules/pagekite/utils.py:53 msgid "Web Server (HTTP)" -msgstr "" +msgstr "Web 服务器(HTTP)" #: plinth/modules/pagekite/utils.py:54 #, python-brace-format msgid "Site will be available at http://{0}" -msgstr "" +msgstr "网站可从 http://{0} 访问" #: plinth/modules/pagekite/utils.py:63 msgid "Web Server (HTTPS)" -msgstr "" +msgstr "Web 服务器(HTTPS)" #: plinth/modules/pagekite/utils.py:64 #, python-brace-format msgid "Site will be available at https://{0}" -msgstr "" +msgstr "网站可从 https://{0} 访问" #: plinth/modules/pagekite/utils.py:73 msgid "Secure Shell (SSH)" -msgstr "" +msgstr "安全 Shell(SSH)" #: plinth/modules/pagekite/utils.py:74 msgid "" "See SSH client setup instructions" msgstr "" +"请参见 SSH 客户端安装 " +"说明" #: plinth/modules/pagekite/utils.py:276 msgid "Pagekite" -msgstr "" +msgstr "Pagekite" #: plinth/modules/pagekite/views.py:34 msgid "About PageKite" -msgstr "" +msgstr "关于 PageKite" #: plinth/modules/pagekite/views.py:38 msgid "Standard Services" -msgstr "" +msgstr "标准服务" #: plinth/modules/pagekite/views.py:40 msgid "Custom Services" -msgstr "" +msgstr "定制服务" #: plinth/modules/power/__init__.py:32 plinth/modules/power/views.py:33 #: plinth/modules/power/views.py:47 plinth/modules/power/views.py:62 msgid "Power" -msgstr "" +msgstr "电源" #: plinth/modules/power/templates/power.html:29 msgid "Restart or shut down the system." -msgstr "" +msgstr "重新启动或关闭系统。" #: plinth/modules/power/templates/power.html:34 msgid "Restart »" -msgstr "" +msgstr "重新启动 »" #: plinth/modules/power/templates/power.html:37 msgid "Shut Down »" -msgstr "" +msgstr "关闭 »" #: plinth/modules/power/templates/power_restart.html:29 msgid "" "Are you sure you want to restart? You will not be able to access this web " "interface for a few minutes until the system is restarted." -msgstr "" +msgstr "你确定要重新启动?你将在几分钟内不能访问此 web 界面,直到重新启动系统。" #: plinth/modules/power/templates/power_restart.html:42 msgid "Restart Now" -msgstr "" +msgstr "现在重新启动" #: plinth/modules/power/templates/power_shutdown.html:29 msgid "" "Are you sure you want to shut down? You will not be able to access this web " "interface after shut down." -msgstr "" +msgstr "你确定要关闭? 关闭以后将不能访问此 web 界面。" #: plinth/modules/power/templates/power_shutdown.html:41 msgid "Shut Down Now" -msgstr "" +msgstr "现在关闭" #: plinth/modules/privoxy/__init__.py:39 #: plinth/modules/privoxy/templates/privoxy.html:26 #: plinth/modules/privoxy/views.py:59 msgid "Web Proxy (Privoxy)" -msgstr "" +msgstr "网页代理(Privoxy)" #: plinth/modules/privoxy/__init__.py:44 msgid "Privoxy Web Proxy" -msgstr "" +msgstr "Privoxy 网页代理" #: plinth/modules/privoxy/__init__.py:86 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" -msgstr "" +msgstr "在 tcp{kind} 上通过 {proxy} 访问 {url}" #: plinth/modules/privoxy/forms.py:29 msgid "Enable Privoxy" -msgstr "" +msgstr "启用 Privoxy" #: plinth/modules/privoxy/templates/privoxy.html:29 msgid "" @@ -2122,25 +2137,25 @@ msgstr "" #: plinth/modules/privoxy/templates/privoxy.html:53 msgid "Privoxy is running" -msgstr "" +msgstr "Privoxy 正在运行" #: plinth/modules/privoxy/templates/privoxy.html:56 msgid "Privoxy is not running" -msgstr "" +msgstr "Privoxy 未运行" #: plinth/modules/quassel/__init__.py:36 #: plinth/modules/quassel/templates/quassel.html:26 #: plinth/modules/quassel/views.py:54 msgid "IRC Client (Quassel)" -msgstr "" +msgstr "IRC 客户端(Quassel)" #: plinth/modules/quassel/__init__.py:41 msgid "Quassel IRC Client" -msgstr "" +msgstr "Quassel IRC 客户端" #: plinth/modules/quassel/forms.py:29 msgid "Enable Quassel core service" -msgstr "" +msgstr "启用 Quassel 核心服务" #: plinth/modules/quassel/templates/quassel.html:29 #, python-format @@ -2163,25 +2178,25 @@ msgstr "" #: plinth/modules/quassel/templates/quassel.html:55 msgid "Quassel core service is running" -msgstr "" +msgstr "Quassel 核心服务正在运行" #: plinth/modules/quassel/templates/quassel.html:58 msgid "Quassel core service is not running" -msgstr "" +msgstr "Quassel 核心服务未运行" #: plinth/modules/repro/__init__.py:36 #: plinth/modules/repro/templates/repro.html:26 #: plinth/modules/repro/views.py:55 msgid "SIP Server (repro)" -msgstr "" +msgstr "SIP 服务器(摄制)" #: plinth/modules/repro/__init__.py:41 msgid "repro SIP Server" -msgstr "" +msgstr "repro SIP 服务器" #: plinth/modules/repro/forms.py:29 msgid "Enable repro service" -msgstr "" +msgstr "启用 repro 服务" #: plinth/modules/repro/templates/repro.html:29 msgid "" From 78588454aa64d639efed9a3487238e88047cea6f Mon Sep 17 00:00:00 2001 From: ultrapeer Date: Tue, 2 Feb 2016 19:24:54 +0100 Subject: [PATCH 057/189] Translated using Weblate (Turkish) Currently translated at 100.0% (569 of 569 strings) --- plinth/locale/tr/LC_MESSAGES/django.po | 350 +++++++++++++------------ 1 file changed, 183 insertions(+), 167 deletions(-) diff --git a/plinth/locale/tr/LC_MESSAGES/django.po b/plinth/locale/tr/LC_MESSAGES/django.po index 9e2f38208..4553b1c6a 100644 --- a/plinth/locale/tr/LC_MESSAGES/django.po +++ b/plinth/locale/tr/LC_MESSAGES/django.po @@ -7,10 +7,10 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-01-31 22:19+0530\n" -"PO-Revision-Date: 2016-01-15 21:21+0000\n" -"Last-Translator: Caly \n" -"Language-Team: Turkish \n" +"PO-Revision-Date: 2016-02-02 19:24+0000\n" +"Last-Translator: ultrapeer \n" +"Language-Team: Turkish " +"\n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -98,7 +98,7 @@ msgid "Enable service discovery" msgstr "Servis keşfini etkinleştir" #: plinth/modules/avahi/templates/avahi.html:29 -#, fuzzy, python-format +#, python-format #| msgid "" #| "Service discovery allows other machines on the network to discover your " #| "FreedomBox and services running on it. It also allows FreedomBox to " @@ -114,9 +114,9 @@ msgid "" "disabled to improve security especially when connecting to a hostile local " "network." msgstr "" -"Servis keşfi şebekedeki diğer makinelerin sizin FreedomBox'unuzu ve onun " -"üzerinde çalışan servisleri keşfetmelerine yarar. Buna ek olarak " -"FreedomBox'un yerel ağınızdaki diğer makineleri ve etkin servisleri " +"Servis keşfi şebekedeki diğer makinelerin sizin %(box_name)s kutunuzu ve " +"onun üzerinde çalışan servisleri keşfetmelerine yarar. Buna ek olarak " +"%(box_name)s kutusunun yerel ağınızdaki diğer makineleri ve etkin servisleri " "keşfetmesine de yarar. Servis keşfi mutlaka gerekli değildir ve sadece " "dahili şebekelerde çalışır. Özellikle düşman yerel bir ağa bağlanıldığında " "güvenliği arttırmak için devre dışı bırakılabilir." @@ -219,7 +219,7 @@ msgid "Hostname" msgstr "Makine ismi" #: plinth/modules/config/config.py:97 -#, fuzzy, python-brace-format +#, python-brace-format #| msgid "" #| "Hostname is the local name by which other machines on the local network " #| "reach your machine. It must start and end with an alphabet or a digit " @@ -231,10 +231,10 @@ msgid "" "and have as interior characters only alphabets, digits and hyphens. Total " "length must be 63 characters or less." msgstr "" -"Makine ismi yerel şebekedeki diğer makinelerin sizin makinenize erişmek için " -"kullanacakları yerel isimdir. Bir harf ya da sayı ile başlayıp sona ermesi " -"gerekir ve sadece alfabe harfleri, sayılar ve tireler içerebilir. Toplam " -"uzunluğun 63 karakter veya daha azı olması gerekmektedir." +"Makine ismi yerel şebekedeki diğer cihazların sizin {box_name} kutunuza " +"erişmebilmek için kullanacakları yerel isimdir. Bir harf ya da sayı ile " +"başlayıp sona ermesi gerekir ve sadece alfabe harfleri, sayılar ve tireler " +"içerebilir. Toplam uzunluğun 63 karakter veya daha azı olması gerekmektedir." #: plinth/modules/config/config.py:105 msgid "Invalid hostname" @@ -247,7 +247,7 @@ msgid "Domain Name" msgstr "Alan Adı" #: plinth/modules/config/config.py:110 -#, fuzzy, python-brace-format +#, python-brace-format #| msgid "" #| "Domain name is the global name by which other machines on the Internet " #| "can reach you. It must consist of labels separated by dots. Each label " @@ -263,22 +263,21 @@ msgid "" "63 characters or less. Total length of domain name must be 253 characters " "or less." msgstr "" -"Alan adı, İnternet'teki diğer makinelerin size erişmek için kullanacakları " -"global isimdir. Noktalarla ayrılmış gruplardan oluşmalıdır. Her grubun bir " -"alfabe harfi ya da bir sayı ile başlaması ve sona ermesi gerekir ve içerik " -"harfler, sayılar ve tireler ile sınırlı kalmalıdır. Her grubun uzunluğu 63 " -"karakter ya da daha azı olmalıdır. Alan adının toplam uzunluğu 253 karakter " -"ya da daha azı olmalıdır." +"Alan adı, İnternet'teki diğer cihazların sizin {box_name} kutunuza erişmek " +"için kullanacakları global isimdir. Noktalarla ayrılmış gruplardan " +"oluşmalıdır. Her grubun bir alfabe harfi ya da bir sayı ile başlaması ve " +"sona ermesi gerekir ve içerik harfler, sayılar ve tireler ile sınırlı " +"kalmalıdır. Her grubun uzunluğu 63 karakter ya da daha azı olmalıdır. Alan " +"adının toplam uzunluğu 253 karakter ya da daha azı olmalıdır." #: plinth/modules/config/config.py:125 msgid "Language" msgstr "Lisan" #: plinth/modules/config/config.py:127 -#, fuzzy #| msgid "Language for this FreedomBox web administration interface" msgid "Language for this web administration interface" -msgstr "Bu FreedomBox'un web yönetim arayüzü için kullanılacak dil" +msgstr "Bu web yönetim arayüzü için kullanılacak dil" #: plinth/modules/config/config.py:135 #: plinth/modules/dynamicdns/dynamicdns.py:37 @@ -508,7 +507,6 @@ msgstr "" "sağlayıcınızın güncelleme bağlantısını (URL) kullanabilirsiniz." #: plinth/modules/dynamicdns/dynamicdns.py:80 -#, fuzzy #| msgid "" #| "Please do not enter a URL here (like \"https://example.com/\") but only " #| "the hostname of the GnuDIP server (like \"example.pcom\")." @@ -520,10 +518,12 @@ msgstr "" "sunucusunun makine ismini girin (\"example.com\" gibi)." #: plinth/modules/dynamicdns/dynamicdns.py:84 -#, fuzzy, python-brace-format +#, python-brace-format #| msgid "The public domain name you want use to reach your box." msgid "The public domain name you want use to reach your {box_name}." -msgstr "Kutunuza erişilmesi için kullanmak istediğiniz herkese açık alan ismi." +msgstr "" +"{box_name} kutunuza erişilmesi için kullanmak istediğiniz herkese açık alan " +"ismi." #: plinth/modules/dynamicdns/dynamicdns.py:87 msgid "Use this option if your provider uses self signed certificates." @@ -545,7 +545,7 @@ msgstr "" "Önceki yapılandırılmış parolanızı tutmak istiyorsanız bu alanı boş bırakın." #: plinth/modules/dynamicdns/dynamicdns.py:96 -#, fuzzy, python-brace-format +#, python-brace-format #| msgid "" #| "Optional Value. If your FreedomBox is not connected directly to the " #| "Internet (i.e. connected to a NAT router) this URL is used to figure out " @@ -557,10 +557,10 @@ msgid "" "Internet IP. The URL should simply return the IP where the client comes from " "(example: http://myip.datasystems24.de)." msgstr "" -"Seçeneğe bağlı değer. FreedomBox'unuz İnternet'e doğrudan bağlı değilse " -"(yani bir NAT yönlendiricisine bağlıysa) bu URL gerçek İnternet IP adresini " +"Seçeneğe bağlı değer. {box_name} kutunuz İnternet'e doğrudan bağlı değilse (" +"yani bir NAT yönlendiricisine bağlıysa) bu URL gerçek İnternet IP adresini " "bulmak için kullanılır. URL sadece istemcinin bulunduğu yerin IP'sini " -"vermelidir. Mesela: http://myip.datasystems24.de" +"vermelidir (mesela: http://myip.datasystems24.de)." #: plinth/modules/dynamicdns/dynamicdns.py:104 msgid "" @@ -590,16 +590,14 @@ msgid "Update URL" msgstr "URL'i Güncelle" #: plinth/modules/dynamicdns/dynamicdns.py:135 -#, fuzzy #| msgid "accept all SSL certificates" msgid "Accept all SSL certificates" msgstr "Tüm SSL sertifikalarını kabul et" #: plinth/modules/dynamicdns/dynamicdns.py:139 -#, fuzzy #| msgid "use HTTP basic authentication" msgid "Use HTTP basic authentication" -msgstr "temel HTTP kimlik doğrulamasını kullan" +msgstr "Temel HTTP kimlik doğrulamasını kullan" #: plinth/modules/dynamicdns/dynamicdns.py:151 #: plinth/modules/networks/forms.py:146 plinth/modules/transmission/forms.py:39 @@ -645,13 +643,12 @@ msgid "Status of Dynamic DNS" msgstr "Dinamik DNS Durumu" #: plinth/modules/dynamicdns/templates/dynamicdns.html:25 -#, fuzzy #| msgid "DynamicDNS client" msgid "Dynamic DNS Client" -msgstr "DynamicDNS istemcisi" +msgstr "Dinamik DNS istemcisi" #: plinth/modules/dynamicdns/templates/dynamicdns.html:28 -#, fuzzy, python-format +#, python-format #| msgid "" #| "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 " @@ -662,13 +659,12 @@ msgid "" "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 %(box_name)s, such as ownCloud." msgstr "" -"Eğer İnternet erişim sağlayıcınız IP adresinizi periyodik bir şekilde " -"(mesela her 24 saatte bir) değiştiriyorsa diğer kişiler sizi ağda bulmakta " -"zorlanabilir. Ve bu sebeple kimse FreedomBox tarafından sunulan servisleri " -"(sizin ownCloud'unuz gibi) bulamayabilir." +"Eğer İnternet erişim sağlayıcınız IP adresinizi periyodik bir şekilde (" +"mesela her 24 saatte bir) değiştiriyorsa diğer kişiler sizi ağda bulmakta " +"zorlanabilir. Ve bu sebeple kimse sizin ownCloud'unuz gibi %(box_name)s " +"tarafından sunulan servisleri bulamayabilir." #: plinth/modules/dynamicdns/templates/dynamicdns.html:37 -#, fuzzy #| msgid "" #| "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 " @@ -687,10 +683,11 @@ msgid "" msgstr "" "Çözüm, IP adresinize bir DNS ismi atamak ve DNS ismini IP adresiniz İnternet " "erişim sağlayıcınız tarafından her değiştirildiğinde güncellemektir. Dinamik " -"DNS güncel genel İnternet adresinizi bir gnudip sunucusuna gönderir. Bunun ardından " -"sunucu DNS isminizi yeni IP adresi ile ilişkilendirecek ve İnternet'te " -"birisi DNS isminizi sorguladığında güncel IP adresinizi elde edebilecektir." +"DNS güncel genel İnternet adresinizi bir gnudip " +"sunucusuna gönderir. Bunun ardından sunucu DNS isminizi yeni IP adresi ile " +"ilişkilendirecek ve İnternet'te birisi DNS isminizi sorguladığında güncel IP " +"adresinizi elde edebilecektir." #: plinth/modules/dynamicdns/templates/dynamicdns.html:50 msgid "" @@ -707,7 +704,7 @@ msgstr "" "afraid.org adresinde bulabilirsiniz." #: plinth/modules/dynamicdns/templates/dynamicdns.html:61 -#, fuzzy, python-format +#, python-format #| msgid "" #| "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 " @@ -716,9 +713,9 @@ msgid "" "If your %(box_name)s is connected behind some NAT router, don't forget to " "add port forwarding (i.e. forward some standard ports like 80 and 443)." msgstr "" -"Eğer FreedomBox'unuz bir NAT yönlendiriciye bağlıysa, FreedomBox cihazınıza " -"port yönlendirme (yani 80 ve 443 gibi bazı standart portları yönlendirmeyi) " -"eklemeyi unutmayınız." +"Eğer %(box_name)s kutunuz bir NAT yönlendiriciye bağlıysa, port yönlendirme (" +"yani 80 ve 443 gibi bazı standart portları yönlendirmeyi) eklemeyi " +"unutmayınız." #: plinth/modules/dynamicdns/templates/dynamicdns_configure.html:30 msgid "" @@ -741,13 +738,12 @@ msgstr "" "girmezseniz NAT türü tespit edilmeyecektir." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:35 -#, fuzzy #| msgid "Direct connection to the internet." msgid "Direct connection to the Internet." msgstr "İnternet'e doğrudan bağlantı." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:37 -#, fuzzy, python-format +#, python-format #| msgid "" #| "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 - " @@ -759,11 +755,11 @@ msgid "" "changes will not be detected). In case the WAN IP changes, it may take up " "to %(timer)s minutes until your DNS entry is updated." msgstr "" -"NAT arkasında, bu, dinamik DNS servisinin \"IP kontrolü bağlantısını\" " -"değişiklikler için yoklayacağı anlamına gelir (\"IP kontrolü bağlantısına\" " -"bu sebeple ihtiyaç duymaktayız - aksi takdirde IP değişikliklerini tespit " -"edemeyiz). WAN IP değişikliği durumunda DNS girdisini güncellememiz " -"%(timer)s dakika alabilir." +"NAT arkasında. Bu, dinamik DNS servisinin \"IP kontrolü bağlantısını\" " +"değişiklikler için yoklayacağı anlamına gelir (\"IP kontrolü bağlantısı\" bu " +"sebeple gereklidir - aksi takdirde IP değişiklikleri tespit edilemez). WAN " +"IP değişikliği durumunda DNS girdinizin güncellenmesi %(timer)s dakika " +"alabilir." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:48 msgid "Last update" @@ -776,7 +772,7 @@ msgid "Firewall" msgstr "Güvenlik Duvarı" #: plinth/modules/firewall/templates/firewall.html:28 -#, fuzzy, python-format +#, python-format #| msgid "" #| "Firewall is a network security system that controls the incoming and " #| "outgoing network traffic on your %(box_name)s. Keeping a firewall enabled " @@ -787,13 +783,13 @@ msgid "" "properly configured reduces risk of security threat from the Internet." msgstr "" "Güvenlik duvarı %(box_name)s kutunuzda içeri gelen ve dışarı giden şebeke " -"trafiğini kontrol eden bir ağ güvenlik sistemidir. Güvenlik duvarını " +"trafiğini kontrol eden bir güvenlik sistemidir. Güvenlik duvarını " "etkinleştirip gerektiği gibi yapılandırmak İnternet'ten gelen güvenlik " "tehditlerini azaltır." #: plinth/modules/firewall/templates/firewall.html:36 msgid "Current status:" -msgstr "" +msgstr "Güncel durum:" #: plinth/modules/firewall/templates/firewall.html:41 #, python-format @@ -842,7 +838,6 @@ msgid "Blocked" msgstr "Engellenmiş" #: plinth/modules/firewall/templates/firewall.html:103 -#, fuzzy #| msgid "" #| "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 " @@ -853,8 +848,8 @@ msgid "" "disabled in the firewall." msgstr "" "Güvenlik duvarının işleyişi otomatiktir. Bir servisi etkinleştirdiğinizde " -"otomatik olarak güvenlik duvarında izinli hale gelir ve devre dışı " -"bıraktığınızda otomatik olarak güvenlik duvarında da devre dışı bırakılır." +"güvenlik duvarında da izinli hale gelir ve devre dışı bıraktığınızda " +"güvenlik duvarında da devre dışı bırakılır." #: plinth/modules/first_boot/forms.py:48 plinth/modules/users/forms.py:70 msgid "Creating LDAP user failed." @@ -910,7 +905,7 @@ msgid "Setup Complete!" msgstr "Yapılandırma Tamamlandı!" #: plinth/modules/first_boot/templates/firstboot_state10.html:32 -#, fuzzy, python-format +#, python-format #| msgid "" #| "%(box_name)s setup is now complete. To make your %(box_name)s " #| "functional, you need some applications. Applications will be installed " @@ -958,7 +953,7 @@ msgstr "Nerede Yardım Bulabilirim" #: plinth/modules/help/help.py:38 msgid "Manual" -msgstr "" +msgstr "El ile" #: plinth/modules/help/help.py:48 msgid "Documentation and FAQ" @@ -970,13 +965,13 @@ msgid "About {box_name}" msgstr "{box_name} hakkında" #: plinth/modules/help/help.py:73 -#, fuzzy, python-brace-format +#, python-brace-format #| msgid "About {box_name}" msgid "{box_name} Manual" -msgstr "{box_name} hakkında" +msgstr "{box_name} Kılavuzu" #: plinth/modules/help/templates/help_about.html:30 -#, fuzzy, python-format +#, python-format #| msgid "" #| "FreedomBox is a community project to develop, design and promote personal " #| "servers running free software for private, personal communications. It " @@ -994,13 +989,13 @@ msgid "" "and a Tor relay, on a device that can replace your Wi-Fi router, so that " "your data stays with you." msgstr "" -"FreedomBox, özel iletişimler için özgür yazılım çalıştıran kişisel sunucular " -"tasarlayan, geliştiren ve kullanımını teşvik eden bir topluluk projesidir. " -"Veri güvenliğini ve gizliliği koruyan şartlarda İnternet'e bağlantıda arayüz " -"görevi görecek bir ağ cihazıdır. Verilerinizin sizinle kalması için Wi-Fi " -"yönlendiricisinin yerine geçebilecek bir cihazda blog, viki, ağ sitesi, " -"sosyal ağ, e-posta, vekil sunucu ve Tor aktarıcısı gibi uygulamalar " -"barındırır." +"%(box_name)s, özel iletişimler için özgür yazılım çalıştıran kişisel " +"sunucular tasarlayan, geliştiren ve kullanımını teşvik eden bir topluluk " +"projesidir. Veri güvenliğini ve gizliliği koruyan şartlarda İnternet'e " +"bağlantıda arayüz görevi görecek bir ağ cihazıdır. Verilerinizin sizinle " +"kalması için Wi-Fi yönlendiricisinin yerine geçebilecek bir cihazda blog, " +"viki, ağ sitesi, sosyal ağ, e-posta, vekil sunucu ve Tor aktarıcısı gibi " +"uygulamalar barındırır." #: plinth/modules/help/templates/help_about.html:43 msgid "" @@ -1019,7 +1014,7 @@ msgstr "" "İnternet'i amaçlanan eşten eşe mimarisine geri getiriyoruz." #: plinth/modules/help/templates/help_about.html:56 -#, fuzzy, python-format +#, python-format #| msgid "" #| "There are a number of projects working to realize a future of distributed " #| "services; FreedomBox aims to bring them all together in a convenient " @@ -1030,11 +1025,11 @@ msgid "" "package." msgstr "" "Eşten eşe, dağıtılmış servisler geleceği için çalışan çeşitli projeler " -"bulunmaktadır: FreedomBox'un amacı onların tümünü kişisel bir sunucuda bir " -"araya getirmektir." +"bulunmaktadır: %(box_name)s kutusunun amacı onların tümünü kişisel bir " +"sunucuda bir araya getirmektir." #: plinth/modules/help/templates/help_about.html:64 -#, fuzzy, python-format +#, python-format #| msgid "" #| "For more information about the FreedomBox project, see the FreedomBox Wiki." @@ -1042,8 +1037,8 @@ msgid "" "For more information about the %(box_name)s project, see the %(box_name)s Wiki." msgstr "" -"FreedomBox projesi hakkında daha fazla bilgi için FreedomBox Vikisini okuyunuz." +"%(box_name)s projesi hakkında daha fazla bilgi için %(box_name)s Vikisini okuyunuz." #: plinth/modules/help/templates/help_about.html:73 msgid "Learn more »" @@ -1060,7 +1055,7 @@ msgid "%(box_name)s Setup" msgstr "%(box_name)s Kurulumu" #: plinth/modules/help/templates/help_index.html:29 -#, fuzzy, python-format +#, python-format #| msgid "" #| "The FreedomBox Manual is the best place to " #| "start for information regarding %(box_name)s." @@ -1068,11 +1063,11 @@ msgid "" "The %(box_name)s Manual is the best place to " "start for information regarding %(box_name)s." msgstr "" -"%(box_name)s. hakkında daha fazla bilgi edinmeye başlamak için en uygun yer " -"FreedomBox Kullanım Kılavuzudur." +"%(box_name)s. hakkında daha fazla bilgi edinmeye başlamak için en uygun yer <" +"a href=\"%(manual_url)s\">%(box_name)s Kullanım Kılavuzudur." #: plinth/modules/help/templates/help_index.html:36 -#, fuzzy, python-format +#, python-format #| msgid "" #| " " #| "FreedomBox project wiki contains further information." @@ -1080,11 +1075,11 @@ msgid "" " " "%(box_name)s project wiki contains further information." msgstr "" -" FreedomBox " -"proje vikisi daha fazla bilgi içerir." +" %(box_name)" +"s proje vikisi daha fazla bilgi içerir." #: plinth/modules/help/templates/help_index.html:43 -#, fuzzy, python-format +#, python-format #| msgid "" #| "To seek help from FreedomBox community, queries may be posted on the mailing list. The list archives also contain information about " "problems faced by other users and possible solutions." msgstr "" -"FreedomBox topluluğundan yardım istiyorsanız, sorularınızı e-posta " -"listesine yollayabilirsiniz. Liste arşivleri diğer kullanıcıların " -"karşılaştıkları sorunlar ve mümkün çözümler hakkında da bilgi içerir." +"%(box_name)s topluluğundan yardım istiyorsanız, sorularınızı e-" +"posta listesine yollayabilirsiniz. Liste arşivleri diğer " +"kullanıcıların karşılaştıkları sorunlar ve mümkün çözümler hakkında da bilgi " +"içerir." #: plinth/modules/help/templates/help_index.html:53 #, python-format @@ -1109,24 +1105,25 @@ msgid "" "oftc.net/?randomnick=1&channels=freedombox&prompt=1\"> #freedombox " "channel using the IRC web interface." msgstr "" +"Birçok %(box_name)s iştirakçisi ve kullancısı irc.oftc.net IRC ağında da " +"bulunabilir. IRC web arayüzünü kullanarak " +"#freedombox kanalına katılın ve yardım talebinde bulunun." #: plinth/modules/ikiwiki/__init__.py:38 -#, fuzzy #| msgid "Wiki & Blog (Ikiwiki)" msgid "Wiki and Blog (ikiwiki)" -msgstr "Viki & Blog (Ikiwiki)" +msgstr "Viki ve Blog (ikiwiki)" #: plinth/modules/ikiwiki/__init__.py:43 -#, fuzzy #| msgid "Ikiwiki wikis and blogs" msgid "ikiwiki wikis and blogs" -msgstr "Ikiwiki vikileri ve blogları" +msgstr "ikiwiki vikileri ve blogları" #: plinth/modules/ikiwiki/forms.py:29 -#, fuzzy #| msgid "Enable Ikiwiki" msgid "Enable ikiwiki" -msgstr "Ikiwiki'yi etkinleştir" +msgstr "ikiwiki'yi Etkinleştir" #: plinth/modules/ikiwiki/forms.py:36 #: plinth/modules/networks/templates/connection_show.html:98 @@ -1155,13 +1152,12 @@ msgstr "" "ikiwiki adresinden mümkün olacaktır." #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:27 -#, fuzzy, python-format +#, python-format #| msgid "Delete Wiki/Blog %(name)s" msgid "Delete Wiki or Blog %(name)s" -msgstr "%(name)s ismli Viki/Blogu sil" +msgstr "%(name)s isimli Viki ya da Blogu sil" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:33 -#, fuzzy #| msgid "" #| "This action will remove all the posts, pages and comments including " #| "revision history. Delete this wiki/blog permanently?" @@ -1170,7 +1166,8 @@ msgid "" "history. Delete this wiki or blog permanently?" msgstr "" "Bu eylem revizyon geçmişi de dahil olmak üzere tüm mesajları, sayfaları ve " -"yorumları silecektir. Bu viki/blogu daimi olarak silmek istiyor musunuz?" +"yorumları silecektir. Bu viki ya da blogu daimi olarak silmek istiyor " +"musunuz?" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:44 #, python-format @@ -1211,20 +1208,18 @@ msgid "Create" msgstr "Oluştur" #: plinth/modules/ikiwiki/views.py:73 -#, fuzzy #| msgid "Wiki & Blog" msgid "Wiki and Blog" -msgstr "Viki & Blog" +msgstr "Viki ve Blog" #: plinth/modules/ikiwiki/views.py:106 msgid "Manage Wikis and Blogs" msgstr "Viki ve Blogları Yönet" #: plinth/modules/ikiwiki/views.py:132 -#, fuzzy #| msgid "Create a Wiki or Blog" msgid "Create Wiki or Blog" -msgstr "Bir Viki ya da Blog oluştur" +msgstr "Viki ya da Blog oluştur" #: plinth/modules/ikiwiki/views.py:145 #, python-brace-format @@ -1257,10 +1252,9 @@ msgid "Could not delete {name}: {error}" msgstr "{name} silinemedi: {error}" #: plinth/modules/ikiwiki/views.py:182 -#, fuzzy #| msgid "Delete Wiki/Blog" msgid "Delete Wiki or Blog" -msgstr "Viki/Blogu Sil" +msgstr "Viki ya da Blogu Sil" #: plinth/modules/letsencrypt/__init__.py:43 #: plinth/modules/letsencrypt/templates/letsencrypt.html:38 @@ -1361,7 +1355,7 @@ msgstr "{domain} alanı için sertifika edinilemedi: {error}" #: plinth/modules/monkeysphere/templates/monkeysphere.html:35 #: plinth/modules/monkeysphere/views.py:44 msgid "Monkeysphere" -msgstr "" +msgstr "Monkeysphere" #: plinth/modules/monkeysphere/templates/monkeysphere.html:38 msgid "" @@ -1373,14 +1367,22 @@ msgid "" "key signing process. See the Monkeysphere SSH documentation for more details." msgstr "" +"Monkeysphere ile her SSH sunan yapılandırılmış alan için bir PGP anahtarı " +"oluşturulabilir. Bunun ardından herkese açık PGP anahtarı PGP anahtar " +"sunucularına yüklenebilir. Bu makineye SSH vasıtasıyla bağlanan kullanıcılar " +"doğru makineye bağlandıklarını teyit edebilirler. Kullanıcıların anahtara " +"güvenebilmeleri için en az bir kişinin (genellikle makine sahibi) anahtarı " +"olağan PGP anahtar imzalama süreciyle imzalaması gerekir. Daha fazla bilgi " +"için " +"Monkeysphere SSH belgelendirmesine bakınız." #: plinth/modules/monkeysphere/templates/monkeysphere.html:53 msgid "Publishing key to keyserver..." -msgstr "" +msgstr "Anahtar, anahtar sunucusuna yayınlanıyor..." #: plinth/modules/monkeysphere/templates/monkeysphere.html:71 msgid "GPG Fingerprint" -msgstr "" +msgstr "GPG Parmak izi" #: plinth/modules/monkeysphere/templates/monkeysphere.html:83 #: plinth/modules/names/views.py:45 @@ -1389,27 +1391,27 @@ msgstr "Mevcut değil" #: plinth/modules/monkeysphere/templates/monkeysphere.html:93 msgid "Generate PGP Key" -msgstr "" +msgstr "PGP Anahtarı Oluştur" #: plinth/modules/monkeysphere/templates/monkeysphere.html:101 msgid "Publish Key" -msgstr "" +msgstr "Anahtarı Yayınla" #: plinth/modules/monkeysphere/views.py:58 msgid "Generated PGP key." -msgstr "" +msgstr "Oluşturulan PGP anahtarı." #: plinth/modules/monkeysphere/views.py:83 msgid "Cancelled key publishing." -msgstr "" +msgstr "Anahtar yayını iptal edildi." #: plinth/modules/monkeysphere/views.py:120 msgid "Published key to keyserver." -msgstr "" +msgstr "Anahtar, anahtar sunucusuna yayınlandı." #: plinth/modules/monkeysphere/views.py:122 msgid "Error occurred while publishing key." -msgstr "" +msgstr "Anahtarın yayınlanmasında bir hata meydana geldi." #: plinth/modules/mumble/__init__.py:38 #: plinth/modules/mumble/templates/mumble.html:26 @@ -1842,7 +1844,6 @@ msgid "Firewall zone" msgstr "Güvenlik duvarı alanı" #: plinth/modules/networks/templates/connection_show.html:280 -#, fuzzy #| msgid "" #| "This interface should be connected to local network/machine. If you " #| "connect this interface to a public network, services meant to be " @@ -1853,12 +1854,11 @@ msgid "" "connect this interface to a public network, services meant to be available " "only internally will become available externally. This is a security risk." msgstr "" -"Bu arayüz yerel ağa/makineye bağlı olmalıdır. Eğer bu arayüzü herkese açık " -"bir şebekeye bağlarsanız, sadece dahili olması amaçlanan servislere harici " -"erişim mümkün olacaktır. Bu bir güvenlik riskidir." +"Bu arayüz yerel bir ağa/makineye bağlı olmalıdır. Eğer bu arayüzü herkese " +"açık bir şebekeye bağlarsanız, sadece dahili olması amaçlanan servislere " +"harici erişim mümkün olacaktır. Bu bir güvenlik riskidir." #: plinth/modules/networks/templates/connection_show.html:300 -#, fuzzy #| msgid "" #| "This interface should receive your Internet connection. If you connect it " #| "your a local network/machine, many services meant to available only " @@ -1873,7 +1873,7 @@ msgstr "" "servislerin birçoğuna erişim mümkün olmayacaktır." #: plinth/modules/networks/templates/connection_show.html:319 -#, fuzzy, python-format +#, python-format #| msgid "" #| "This interface is not maintained by FreedomBox. Its security status is " #| "unknown to FreedomBox. Many FreedomBox services may not be available on " @@ -1885,10 +1885,10 @@ msgid "" "this interface. It is recommended that you deactivate or delete this " "connection and re-configure it." msgstr "" -"Bu arayüz FreedomBox tarafından korunmaz. Güvenlik durumu FreedomBox " -"tarafından bilinmemektedir. Birçok FreedomBox servisi bu arayüzde mevcut " -"olmayabilir. Bu bağlantıyı devre dışı bırakmanız/silmeniz ve yeniden " -"yapılandırmanız tavsiye edilir." +"Bu arayüzün bakımı %(box_name)s tarafından yapılmaz. Güvenlik durumu " +"%(box_name)s tarafından bilinmemektedir. Birçok %(box_name)s servisi bu " +"arayüzde mevcut olmayabilir. Bu bağlantıyı devre dışı bırakmanız/silmeniz ve " +"yeniden yapılandırmanız tavsiye edilir." #: plinth/modules/networks/templates/connections_add.html:34 #: plinth/modules/networks/templates/connections_type_select.html:34 @@ -1975,7 +1975,7 @@ msgid "Enable OpenVPN server" msgstr "OpenVPN sunucusunu etkinleştir" #: plinth/modules/openvpn/templates/openvpn.html:38 -#, fuzzy, python-format +#, python-format #| msgid "" #| "Virtual Private Network (VPN) is a technique for securely connecting two " #| "machines in order to access resources of a private network. While you " @@ -1992,7 +1992,7 @@ msgid "" "security and anonymity." msgstr "" "Sanal Özel Ağ (Virtual Private Network, VPN), özel bir ağın kaynaklarına " -"erişmek için iki makine arasında güvenli bir şekilde bağlantı kurmak için " +"erişmek için iki cihaz arasında güvenli bir şekilde bağlantı kurmak için " "kullanılan tekniktir. Evinizden uzaktayken ev ağınıza erişmek için " "%(box_name)s kutusuna bağlanıp %(box_name)s tarafından sunulan özel/dahili " "servisleri kullanabilirsiniz. Aynı zamanda ek güvenlik ve anonimlik için " @@ -2003,7 +2003,7 @@ msgid "Profile" msgstr "Profil" #: plinth/modules/openvpn/templates/openvpn.html:54 -#, fuzzy, python-format +#, python-format #| msgid "" #| "To connect to %(box_name)s's VPN, you need to download a profile and feed " #| "it to an OpenVPN client on your mobile or desktop machine. OpenVPN " @@ -2022,9 +2022,9 @@ msgstr "" "%(box_name)s kutusunun VPN'ine erişmek için bir profil indirmeniz ve bunu " "mobil ya da masaüstü makinenize yüklemeniz gerekir. OpenVPN istemcileri " "platformların çoğu için mevcuttur. Tavsiye edilen istemciler ve onları " -"yapılandırma talimatları için belgelendirmeyi " -"okuyun." +"yapılandırma talimatları için belgelendirmeyi okuyun." #: plinth/modules/openvpn/templates/openvpn.html:66 #, python-format @@ -2574,22 +2574,19 @@ msgstr "Quassel çekirdek servisi çalışmamaktadır" #: plinth/modules/repro/__init__.py:36 #: plinth/modules/repro/templates/repro.html:26 #: plinth/modules/repro/views.py:55 -#, fuzzy #| msgid "Server port" msgid "SIP Server (repro)" -msgstr "Sunucu portu" +msgstr "SIP Sunucusu (repro)" #: plinth/modules/repro/__init__.py:41 -#, fuzzy #| msgid "Second DNS Server" msgid "repro SIP Server" -msgstr "İkinci DNS Sunucusu" +msgstr "repro SIP Sunucusu" #: plinth/modules/repro/forms.py:29 -#, fuzzy #| msgid "Enable Quassel core service" msgid "Enable repro service" -msgstr "Quassel çekirdek servisini etkinleştir" +msgstr "repro servisini etkinleştir" #: plinth/modules/repro/templates/repro.html:29 msgid "" @@ -2599,6 +2596,11 @@ msgid "" "their presence known. It also acts as a proxy to federate SIP " "communications to other servers on the Internet similar to email." msgstr "" +"repro, bir SIP telefonunun hem varlık ve anlık mesajlaşma, hem de ses ya da " +"video aramalar için kullanabileceği çeşitli SIP hizmetleri sunar. repro, " +"istemcilerin varlıklarını bildirebilecekleri bir sunucu ve SIP kullanıcı " +"hesapları sağlar. Aynı zamanda e-postaya benzer bir şekilde diğer sunucular " +"ile SIP bağlantılarını federe edecek bir vekil sunucu görevi de yapar." #: plinth/modules/repro/templates/repro.html:39 msgid "" @@ -2607,6 +2609,10 @@ msgid "" "\"https://f-droid.org/repository/browse/?fdid=com.csipsimple\"> CSipSimple (for Android phones)." msgstr "" +"SIP aramalarında bulunabilmek için istemci bir programa ihtiyaç vardır. " +"Mevcut istemciler Jitsi (bilgisayarlar " +"için) ve CSipSimple'ı (Android telefonlar için) içerir." #: plinth/modules/repro/templates/repro.html:48 msgid "" @@ -2616,18 +2622,22 @@ msgid "" "log in to the repro configuration panel. After setting the domain, it is " "required to restart the repro service. Disable the service and re-enable it." msgstr "" +"Not: repro'yu kullanmadan önce alanlar ve kullanıcılar ağ tabanlı yapılandırma paneli ile " +"yapılandırılmalıdır. admin (yani yönetici) grubundaki kullanıcılar " +"repro yapılandırma paneline giriş yapabileceklerdir. Alan ayarlandıktan " +"sonra repro servisini tekrar başlatmak gerekir. Servisi devre dışı bırakıp " +"tekrar etkinleştirin." #: plinth/modules/repro/templates/repro.html:63 -#, fuzzy #| msgid "Quassel core service is running" msgid "repro service is running" -msgstr "Quassel çekirdek servisi çalışmaktadır" +msgstr "repro servisi çalışmaktadır" #: plinth/modules/repro/templates/repro.html:66 -#, fuzzy #| msgid "Quassel core service is not running" msgid "repro service is not running" -msgstr "Quassel çekirdek servisi çalışmamaktadır" +msgstr "repro servisi çalışmamaktadır" #: plinth/modules/restore/__init__.py:36 #: plinth/modules/restore/templates/restore_index.html:26 @@ -2644,7 +2654,7 @@ msgid "Enable reStore" msgstr "reStore'u Etkinleştir" #: plinth/modules/restore/templates/restore_index.html:29 -#, fuzzy, python-format +#, python-format #| msgid "" #| "reStore is a server for unhosted web " #| "applications. The idea is to uncouple web applications from data. No " @@ -2662,8 +2672,8 @@ msgstr "" "uygulamaları için bir sunucudur. Öne çıkan fikir, ağ uygulamalarının " "verilerden ayrılmasıdır. Ağ uygulamalarının nereden sunulduğuna bakmaksızın " "veriler kullanıcının seçtiği herhangi bir barındırılmayan depolama " -"sunucusunda depolanabilir. reStore ile %(cfg.box_name)s kutunuz " -"barındırılmayan depolama sunucunuz haline gelir." +"sunucusunda depolanabilir. reStore ile %(box_name)s kutunuz barındırılmayan " +"depolama sunucunuz haline gelir." #: plinth/modules/restore/templates/restore_index.html:40 msgid "" @@ -2782,14 +2792,13 @@ msgid "Anonymity Network (Tor)" msgstr "Anonimlik Ağı (Tor)" #: plinth/modules/tor/__init__.py:53 -#, fuzzy #| msgid "Anonymity Network (Tor)" msgid "Tor Anonymity Network" -msgstr "Anonimlik Ağı (Tor)" +msgstr "Tor Anonimlik Ağı" #: plinth/modules/tor/__init__.py:58 msgid "Tor Bridge Relay" -msgstr "" +msgstr "Tor Köprü Aktarması" #: plinth/modules/tor/__init__.py:76 plinth/modules/tor/views.py:144 msgid "Tor Hidden Service" @@ -2826,7 +2835,7 @@ msgid "Enable Tor Hidden Service" msgstr "Tor Gizli Servisi Etkinleştir" #: plinth/modules/tor/forms.py:38 -#, fuzzy, python-brace-format +#, python-brace-format #| msgid "" #| "A hidden service will allow FreedomBox to provide selected services (such " #| "as ownCloud or Chat) without revealing its location." @@ -2834,8 +2843,8 @@ msgid "" "A hidden service will allow {box_name} to provide selected services (such as " "ownCloud or chat) without revealing its location." msgstr "" -"Gizli servisler FreedomBox'un (ownCloud ya da sohbet gibi) seçili servisleri " -"konumunu ortaya çıkarmadan sağlamasına imkân verir." +"Gizli servisler {box_name} kutusunun (ownCloud ya da sohbet gibi) seçili " +"servisleri konumunu ortaya çıkarmadan sağlamasına imkân verir." #: plinth/modules/tor/forms.py:42 msgid "Download software packages over Tor" @@ -2866,10 +2875,9 @@ msgstr "" "Tarayıcısını kullanmanızı tavsiye eder." #: plinth/modules/tor/templates/tor.html:54 -#, fuzzy #| msgid "Configuration updated" msgid "Tor configuration is being updated" -msgstr "Kurulum güncellendi" +msgstr "Tor yapılandırması güncellenmektedir" #: plinth/modules/tor/templates/tor.html:62 msgid "Tor is running" @@ -2930,14 +2938,13 @@ msgid "Action error: {0} [{1}] [{2}]" msgstr "Eylem hatası: {0} [{1}] [{2}]" #: plinth/modules/tor/views.py:148 -#, fuzzy #| msgid "Configuration updated" msgid "Configuration updated." -msgstr "Kurulum güncellendi" +msgstr "Kurulum güncellendi." #: plinth/modules/tor/views.py:150 msgid "An error occurred during configuration." -msgstr "" +msgstr "Yapılandırma sırasında bir hata meydana geldi." #: plinth/modules/transmission/__init__.py:38 #: plinth/modules/transmission/templates/transmission.html:26 @@ -3026,6 +3033,10 @@ msgid "" "upgrades are enabled, upgrades are automatically run every night. You don't " "normally need to start the upgrade process." msgstr "" +"Yükseltmeler en son yazılım ve güvenlik güncellemelerini kurar. Otomatik " +"yükseltmeler etkinleştirildiğinde yükseltmeler her gece otomatik olarak " +"çalıştırılacaktır. Normal olarak yükseltme sürecini başlatmanıza gerek " +"yoktur." #: plinth/modules/upgrades/templates/upgrades.html:45 msgid "" @@ -3034,20 +3045,23 @@ msgid "" "other packages. During the upgrade, this web interface may be temporarily " "unavailable and show an error. Refresh the page to continue." msgstr "" +"Kurulacak paket sayısına göre bunun tamamlanması uzun bir süre alabilir. " +"Yükseltmeler sürmekteyken başka paket kurmanız mümkün olmayacaktır. " +"Yükseltme sırasında bu ağ arayüzüne geçici olarak erişim mümkün olmayabilir " +"ve bir hata gösterebilir. Devam etmek için sayfayı tazeleyin." #: plinth/modules/upgrades/templates/upgrades.html:58 msgid "Upgrade now »" msgstr "Şimdi yükselt »" #: plinth/modules/upgrades/templates/upgrades.html:65 -#, fuzzy #| msgid "ejabberd is running" msgid "A package manager is running." -msgstr "ejabberd çalışmaktadır" +msgstr "Bir paket yöneticisi çalışmaktadır." #: plinth/modules/upgrades/templates/upgrades.html:70 msgid "Recent log from upgrades:" -msgstr "" +msgstr "Yükseltmelerin yakın geçmişteki kütüğü:" #: plinth/modules/upgrades/views.py:36 plinth/modules/upgrades/views.py:66 msgid "Automatic Upgrades" @@ -3058,16 +3072,14 @@ msgid "Upgrade Packages" msgstr "Paketleri Yükselt" #: plinth/modules/upgrades/views.py:96 -#, fuzzy #| msgid "Upgrade completed." msgid "Upgrade process started." -msgstr "Yükseltme tamamlandı." +msgstr "Yükseltme süreci başlamıştır." #: plinth/modules/upgrades/views.py:99 -#, fuzzy #| msgid "Upgrade failed." msgid "Starting upgrade failed." -msgstr "Yükseltme başarısız oldu." +msgstr "Yükseltmenin başlatılması başarısız oldu." #: plinth/modules/upgrades/views.py:102 msgid "Package Upgrades" @@ -3128,7 +3140,7 @@ msgstr "{group} grubuna yeni kullanıcı ilâve edilmesi başarısız oldu." #: plinth/modules/users/forms.py:92 msgid "SSH Keys" -msgstr "" +msgstr "SSH Anahtarları" #: plinth/modules/users/forms.py:96 msgid "" @@ -3136,6 +3148,10 @@ msgid "" "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" +"Herkese açık bir SSH anahtarı ayarlamak, bu kullanıcının sisteme parola " +"kullanmadan güvenli bir şekilde giriş yapmasına müsaade edecektir. Birden " +"çok anahtar girebilirsiniz, her anahtarı yeni bir satırda girin. Boş " +"satırlar ve # ile başlayan satırlar görmezden gelinecektir." #: plinth/modules/users/forms.py:136 msgid "Renaming LDAP user failed." @@ -3321,10 +3337,10 @@ msgid "Secure Shell (SSH) Server" msgstr "Güvenli Kabuk (SSH) Sunucusu" #: plinth/service.py:79 -#, fuzzy, python-brace-format +#, python-brace-format #| msgid "FreedomBox Web Interface (Plinth)" msgid "{box_name} Web Interface (Plinth)" -msgstr "FreedomBox Ağ Arayüzü (Plinth)" +msgstr "{box_name} Ağ Arayüzü (Plinth)" #: plinth/templates/404.html:25 msgid "404" @@ -3360,10 +3376,10 @@ msgstr "" "\">hata izleyicisinde rapor edin ki sorunu giderebilelim." #: plinth/templates/base.html:49 -#, fuzzy, python-format +#, python-format #| msgid "Plinth administrative interface for the FreedomBox" msgid "Plinth administrative interface for the %(box_name)s" -msgstr "FreedomBox için Plinth yönetim arayüzü" +msgstr "%(box_name)s için Plinth yönetim arayüzü" #: plinth/templates/base.html:83 msgid "Toggle navigation" From 0b1932765dabc3c0f530a1ff7ed67c422b71443c Mon Sep 17 00:00:00 2001 From: Dietmar Date: Fri, 5 Feb 2016 22:05:19 +0100 Subject: [PATCH 058/189] Translated using Weblate (German) Currently translated at 100.0% (569 of 569 strings) --- plinth/locale/de/LC_MESSAGES/django.po | 380 +++++++++++++------------ 1 file changed, 199 insertions(+), 181 deletions(-) diff --git a/plinth/locale/de/LC_MESSAGES/django.po b/plinth/locale/de/LC_MESSAGES/django.po index da9c30971..0ed266fcf 100644 --- a/plinth/locale/de/LC_MESSAGES/django.po +++ b/plinth/locale/de/LC_MESSAGES/django.po @@ -10,10 +10,10 @@ msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-01-31 22:19+0530\n" -"PO-Revision-Date: 2015-12-20 17:46+0000\n" +"PO-Revision-Date: 2016-02-05 22:07+0000\n" "Last-Translator: Dietmar \n" -"Language-Team: German \n" +"Language-Team: German " +"\n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -102,7 +102,7 @@ msgid "Enable service discovery" msgstr "Dienste-Erkennung einschalten" #: plinth/modules/avahi/templates/avahi.html:29 -#, fuzzy, python-format +#, python-format #| msgid "" #| "Service discovery allows other machines on the network to discover your " #| "FreedomBox and services running on it. It also allows FreedomBox to " @@ -118,9 +118,9 @@ msgid "" "disabled to improve security especially when connecting to a hostile local " "network." msgstr "" -"Dienste-Erkennung erlaubt es anderen Geräten im Netzwerk die FreedomBox und " -"deren Dienste zu finden. Zudem erlaubt es der FreedomBox andere Geräte im " -"Netzwerk ausfindig zu machen. Dienste-Erkennung ist nicht zwingend " +"Die Dienste-Erkennung erlaubt es anderen Geräten im Netzwerk Ihre %(box_name)" +"s und deren Dienste zu finden. Zudem erlaubt es %(box_name)s andere Geräte " +"im Netzwerk ausfindig zu machen. Dienste-Erkennung ist nicht zwingend " "erforderlich und funktioniert nur in internen Netzen. Es kann deaktiviert " "werden um die Sicherheit vor allem in einem unsicheren Netz zu erhöhen." @@ -222,7 +222,7 @@ msgid "Hostname" msgstr "Hostname" #: plinth/modules/config/config.py:97 -#, fuzzy, python-brace-format +#, python-brace-format #| msgid "" #| "Hostname is the local name by which other machines on the local network " #| "reach your machine. It must start and end with an alphabet or a digit " @@ -235,7 +235,7 @@ msgid "" "length must be 63 characters or less." msgstr "" "Ein Hostname ist der lokale Name unter dem andere Geräte im lokalen Netzwerk " -"Ihr Gerät erreichen können. Er muss alphanumerisch sein, mit einem " +"Ihre {box_name} erreichen können. Er muss alphanumerisch sein, mit einem " "Buchstaben beginnen und enden und darf nicht länger als 63 Zeichen sein." #: plinth/modules/config/config.py:105 @@ -249,7 +249,7 @@ msgid "Domain Name" msgstr "Domain-Name" #: plinth/modules/config/config.py:110 -#, fuzzy, python-brace-format +#, python-brace-format #| msgid "" #| "Domain name is the global name by which other machines on the Internet " #| "can reach you. It must consist of labels separated by dots. Each label " @@ -265,8 +265,8 @@ msgid "" "63 characters or less. Total length of domain name must be 253 characters " "or less." msgstr "" -"Ein Domainname ist der globale Name unter dem andere Geräte im Internet Ihr " -"Gerät erreichen können. Er muss aus durch Punkte getrennte Kennungen " +"Ein Domainname ist der globale Name unter dem andere Geräte im Internet Ihre " +"{box_name} erreichen können. Er muss aus durch Punkte getrennte Kennungen " "bestehen. Jede Kennung muss alphanumerisch beginnen und enden und aus " "alphanumerischen Zeichen und Bindestrichen bestehen. Jede Kennung darf " "maximal 63 Zeichen lang sein, die Gesamtlänge des Domainnames 253 Zeichen." @@ -276,10 +276,9 @@ msgid "Language" msgstr "Sprache" #: plinth/modules/config/config.py:127 -#, fuzzy #| msgid "Language for this FreedomBox web administration interface" msgid "Language for this web administration interface" -msgstr "Sprache für dieses FreedomBox Web-Interface" +msgstr "Sprache dieses Web-Interfaces" #: plinth/modules/config/config.py:135 #: plinth/modules/dynamicdns/dynamicdns.py:37 @@ -508,7 +507,6 @@ msgstr "" "kann die Aktualisierungs-URL Ihres Anbieters angegeben werden." #: plinth/modules/dynamicdns/dynamicdns.py:80 -#, fuzzy #| msgid "" #| "Please do not enter a URL here (like \"https://example.com/\") but only " #| "the hostname of the GnuDIP server (like \"example.pcom\")." @@ -520,12 +518,11 @@ msgstr "" "den Hostnamen des GnuDIP Servers (wie \"example.com\")." #: plinth/modules/dynamicdns/dynamicdns.py:84 -#, fuzzy, python-brace-format +#, python-brace-format #| msgid "The public domain name you want use to reach your box." msgid "The public domain name you want use to reach your {box_name}." msgstr "" -"Der öffentliche Domain Name unter welchem die FreedomBox erreichbar sein " -"soll." +"Der öffentliche Domain Name unter dem Ihre {box_name} erreichbar sein soll." #: plinth/modules/dynamicdns/dynamicdns.py:87 msgid "Use this option if your provider uses self signed certificates." @@ -548,7 +545,7 @@ msgid "" msgstr "Wird dieses Feld leer gelassen, dann bleibt das Passwort unverändert." #: plinth/modules/dynamicdns/dynamicdns.py:96 -#, fuzzy, python-brace-format +#, python-brace-format #| msgid "" #| "Optional Value. If your FreedomBox is not connected directly to the " #| "Internet (i.e. connected to a NAT router) this URL is used to figure out " @@ -560,11 +557,10 @@ msgid "" "Internet IP. The URL should simply return the IP where the client comes from " "(example: http://myip.datasystems24.de)." msgstr "" -"Optionaler Wert. Wenn die FreedomBox nicht direkt mit dem Internet verbunden " -"ist (zum Beispiel weil die Box an einen Router angeschlossen ist welcher die " -"IP per NAT umsetzt) wird diese URL verwendet um die öffentliche IP Adresse " -"in Erfahrung zu bringen. Die URL sollte nichts weiter als die IP Adresse " -"liefern. Beispiel: http://myip.datasystems24.de" +"Optionaler Wert. Wenn Ihre {box_name} nicht direkt mit dem Internet " +"verbunden ist, (zum Beispiel über ein NAT) wird diese URL verwendet um die " +"öffentliche IP Adresse in Erfahrung zu bringen. Die URL sollte einfach nur " +"IP-Adresse des Clients liefern (zum Beispiel: http://myip.datasystems24.de)." #: plinth/modules/dynamicdns/dynamicdns.py:104 msgid "" @@ -595,13 +591,11 @@ msgid "Update URL" msgstr "Update URL" #: plinth/modules/dynamicdns/dynamicdns.py:135 -#, fuzzy #| msgid "accept all SSL certificates" msgid "Accept all SSL certificates" -msgstr "alle Zertifikate akzeptieren" +msgstr "Alle Zertifikate akzeptieren" #: plinth/modules/dynamicdns/dynamicdns.py:139 -#, fuzzy #| msgid "use HTTP basic authentication" msgid "Use HTTP basic authentication" msgstr "HTTP basic authentication verwenden" @@ -650,13 +644,12 @@ msgid "Status of Dynamic DNS" msgstr "Status des Dynamischen DNS" #: plinth/modules/dynamicdns/templates/dynamicdns.html:25 -#, fuzzy #| msgid "DynamicDNS client" msgid "Dynamic DNS Client" msgstr "Dynamischer DNS Client" #: plinth/modules/dynamicdns/templates/dynamicdns.html:28 -#, fuzzy, python-format +#, python-format #| msgid "" #| "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 " @@ -669,12 +662,10 @@ msgid "" msgstr "" "Wenn Ihr Internetanbieter die öffentliche IP Adresse zyklisch erneuert (zum " "Beispiel alle 24 Stunden) dann ist es für andere Internetnutzer nicht " -"möglich Ihre FreedomBox im Netz zu finden. Aus diesem Grund können " -"FreedomBox Dienste wie zum Beispiel ownCloud nicht aus dem Internet erreicht " -"werden." +"möglich Sie im Netz zu finden. Aus diesem Grund können %(box_name)s Dienste " +"wie zum Beispiel ownCloud nicht aus dem Internet erreicht werden." #: plinth/modules/dynamicdns/templates/dynamicdns.html:37 -#, fuzzy #| msgid "" #| "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 " @@ -691,12 +682,13 @@ msgid "" "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." msgstr "" -"Die Lösung ist, einen Dynamischen Domain Namen (DNS) mit der IP Adresse zu " +"Die Lösung ist, einen Dynamischen Domain Namen (DNS) mit der IP-Adresse zu " "verknüpfen und diesen DNS Eintrag jedes mal zu aktualisieren wenn sich die " "IP Adresse ändert. Dynamisches DNS erlaubt es die aktuelle IP Adresse zu " "einem gnudip " "Server zu übertragen. Anschließend wird der Server die aktuelle IP Adresse " -"mit dem DNS Namen verknüpfen." +"mit dem DNS Namen verknüpfen und wenn jemand aus dem Internet nach Ihrem DNS " +"Namen sucht erhält er die aktuelle IP-Adresse." #: plinth/modules/dynamicdns/templates/dynamicdns.html:50 msgid "" @@ -713,7 +705,7 @@ msgstr "" "target='_blank'>freedns.afraid.org können per update URL genutzt werden." #: plinth/modules/dynamicdns/templates/dynamicdns.html:61 -#, fuzzy, python-format +#, python-format #| msgid "" #| "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 " @@ -722,10 +714,9 @@ msgid "" "If your %(box_name)s is connected behind some NAT router, don't forget to " "add port forwarding (i.e. forward some standard ports like 80 and 443)." msgstr "" -"Wenn die FreedomBox an einen NAT Router angeschlossen ist, muss zusätzlich " -"ein Portforwarding im Router eingerichtet werden. Zum Beispiel können die " -"TCP Standard Ports (80 und 443) auf die IP Adresse der FreedomBox weiter " -"geleitet werden." +"Wenn Ihre %(box_name)s an einen NAT Router angeschlossen ist, muss " +"zusätzlich ein Portforwarding im Router eingerichtet werden (zum Beispiel " +"Standard Ports wie 80 und 443)." #: plinth/modules/dynamicdns/templates/dynamicdns_configure.html:30 msgid "" @@ -749,13 +740,12 @@ msgstr "" "angegeben wurde, dann kann der NAT Typ nicht erkannt werden." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:35 -#, fuzzy #| msgid "Direct connection to the internet." msgid "Direct connection to the Internet." msgstr "Direkte Verbindung zum Internet." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:37 -#, fuzzy, python-format +#, python-format #| msgid "" #| "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 - " @@ -767,9 +757,9 @@ msgid "" "changes will not be detected). In case the WAN IP changes, it may take up " "to %(timer)s minutes until your DNS entry is updated." msgstr "" -"Hinter einem NAT; das bedeutet dass der Dynamische DNS Dienst zyklisch die " -"\"IP check URL\" abfragen wird (aus diesem Grund wird eine \"IP check URL\" " -"zwingend benötigt). Nach einer Änderung der IP Adresse durch Ihren " +"Hinter einem NAT; das bedeutet dass der Dynamische DNS Dienst zyklisch die \"" +"IP check URL\" abfragen wird (aus diesem Grund wird eine \"IP check URL\" " +"zwingend benötigt). Nach einer Änderung der IP-Adresse durch Ihren " "Internetanbieter kann es bis zu %(timer)s Minuten dauern bis die neue IP " "Adresse dem DNS Server bekannt gemacht wird." @@ -784,7 +774,7 @@ msgid "Firewall" msgstr "Firewall" #: plinth/modules/firewall/templates/firewall.html:28 -#, fuzzy, python-format +#, python-format #| msgid "" #| "Firewall is a network security system that controls the incoming and " #| "outgoing network traffic on your %(box_name)s. Keeping a firewall enabled " @@ -794,13 +784,13 @@ msgid "" "network traffic on your %(box_name)s. Keeping a firewall enabled and " "properly configured reduces risk of security threat from the Internet." msgstr "" -"Firewall ist ein Netzwerk-Sicherheitssystem das den ein- und ausgehenden " -"Verkehr der %(box_name)s kontrolliert. Die Firewall aktiv und korrekt " -"konfiguriert zu halten reduziert Sicherheitsrisiken aus dem Internet." +"Firewall ist ein Sicherheitssystem das den ein- und ausgehenden Verkehr der " +"%(box_name)s kontrolliert. Die Firewall aktiv und korrekt konfiguriert zu " +"halten reduziert Sicherheitsrisiken aus dem Internet." #: plinth/modules/firewall/templates/firewall.html:36 msgid "Current status:" -msgstr "" +msgstr "Aktueller Status:" #: plinth/modules/firewall/templates/firewall.html:41 #, python-format @@ -848,7 +838,6 @@ msgid "Blocked" msgstr "Geblockt" #: plinth/modules/firewall/templates/firewall.html:103 -#, fuzzy #| msgid "" #| "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 " @@ -859,8 +848,8 @@ msgid "" "disabled in the firewall." msgstr "" "Der Betrieb der Firewall erfolgt automatisch. Wenn ein Dienst eingeschaltet " -"wird, wird er automatisch in der Firewall zugelassen und wenn ein Dienst " -"ausgeschaltet wird, wird er automatisch in der Firewall verboten." +"wird, wird er auch in der Firewall zugelassen und wenn ein Dienst " +"ausgeschaltet wird, wird er auch in der Firewall verboten." #: plinth/modules/first_boot/forms.py:48 plinth/modules/users/forms.py:70 msgid "Creating LDAP user failed." @@ -881,7 +870,6 @@ msgid "Help" msgstr "Hilfe" #: plinth/modules/first_boot/templates/firstboot_state0.html:45 -#, fuzzy #| msgid "Start setup" msgid "Start Setup" msgstr "Einrichten beginnen" @@ -892,6 +880,8 @@ msgid "" "To complete the setup of your %(box_name)s, please provide some basic " "information." msgstr "" +"Um die Installation Ihrer %(box_name)s abzuschließen, stellen Sie bitte " +"einige Grundinformationen bereit." #: plinth/modules/first_boot/templates/firstboot_state1.html:41 msgid "Administrator Account" @@ -917,7 +907,7 @@ msgid "Setup Complete!" msgstr "Installation komplett!" #: plinth/modules/first_boot/templates/firstboot_state10.html:32 -#, fuzzy, python-format +#, python-format #| msgid "" #| "To make your FreedomBox functional, you need some applications. " #| "Applications will be installed the first time you access them." @@ -926,22 +916,20 @@ msgid "" "you need some applications. They will be installed the first time you " "access them." msgstr "" -"Um Ihre FreedomBox funktionsfähig zu machen benötigen Sie einige Anwendungen " -"(Apps). Die Anwendungen werden installiert wenn Sie das erste Mal auf sie " -"zugreifen." +"%(box_name)s Installation ist jetzt abgeschlossen. Um Ihre %(box_name)s " +"funktionsfähig zu machen benötigen Sie einige Anwendungen (Apps). Die " +"Anwendungen werden installiert wenn Sie das erste Mal auf sie zugreifen." #: plinth/modules/first_boot/templates/firstboot_state10.html:41 msgid "Go to Apps" msgstr "Zu den Anwendungen" #: plinth/modules/first_boot/templates/firstboot_state10.html:44 -#, fuzzy #| msgid "Network Configuration" msgid "Current Network Configuration" -msgstr "Netzwerk-Konfiguration" +msgstr "Aktuelle Netzwerk-Konfiguration" #: plinth/modules/first_boot/templates/firstboot_state10.html:47 -#, fuzzy #| msgid "" #| "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-" @@ -950,9 +938,8 @@ msgid "" "You should check the network setup and modify it if necessary. Do not forget " "to change the default Wi-Fi passwords!" msgstr "" -"Die FreedomBox Installation ist jetzt abgeschlossen. Allerdings sollten Sie " -"die Netzwerkkonfiguration überprüfen und gegebenenfalls ändern. Vergessen " -"Sie nicht, die standardmäßigen WLAN-Passwörter zu ändern." +"Sie sollten die Netzwerkkonfiguration überprüfen und gegebenenfalls ändern. " +"Vergessen Sie nicht, die standardmäßigen Wi-Fi-Passwörter zu ändern!" #: plinth/modules/first_boot/templates/firstboot_state10.html:57 msgid "Go to Networks" @@ -972,7 +959,7 @@ msgstr "Wo man Hilfe bekommt" #: plinth/modules/help/help.py:38 msgid "Manual" -msgstr "" +msgstr "Handbuch" #: plinth/modules/help/help.py:48 msgid "Documentation and FAQ" @@ -984,13 +971,13 @@ msgid "About {box_name}" msgstr "Über {box_name}" #: plinth/modules/help/help.py:73 -#, fuzzy, python-brace-format +#, python-brace-format #| msgid "About {box_name}" msgid "{box_name} Manual" -msgstr "Über {box_name}" +msgstr "{box_name} Handbuch" #: plinth/modules/help/templates/help_about.html:30 -#, fuzzy, python-format +#, python-format #| msgid "" #| "FreedomBox is a community project to develop, design and promote personal " #| "servers running free software for private, personal communications. It " @@ -1008,12 +995,12 @@ msgid "" "and a Tor relay, on a device that can replace your Wi-Fi router, so that " "your data stays with you." msgstr "" -"FreedomBox ist ein Gemeinschaftsprojekt zur Entwicklung, Gestaltung und " -"Förderung persönlicher Server mit freier Software für die private, " +"%(box_name)s ist ein Gemeinschaftsprojekt zur Entwicklung, Gestaltung und " +"Förderung persönlicher Server mit freier Software für die private, " "persönliche Kommunikation. Es ist als Netzwerkgerät so konzipiert, dass es " "eine Schnittstelle mit dem Internet darstellt bei Beibehaltung der " "geschützten Privatsphäre und Datensicherheit. Es beherbergt Anwendungen wie " -"Blog, Wiki, Website, soziale Netzwerke, E-Mail, Web-Proxy und einen Tor-" +"Blog, Wiki, Webseite, soziale Netzwerke, E-Mail, Web-Proxy und einen Tor-" "Server auf einem Gerät, das Wi-Fi-Router ersetzen kann, so dass Ihre Daten " "immer bei Ihnen bleiben." @@ -1036,7 +1023,7 @@ msgstr "" "vorgesehenen Peer-to-Peer-Architektur (Gleiche mit Gleichen) zurück." #: plinth/modules/help/templates/help_about.html:56 -#, fuzzy, python-format +#, python-format #| msgid "" #| "There are a number of projects working to realize a future of distributed " #| "services; FreedomBox aims to bring them all together in a convenient " @@ -1047,11 +1034,11 @@ msgid "" "package." msgstr "" "Es gibt eine Vielzahl von Projekten die an eine Zukunft von verteilten " -"Diensten arbeiten; FreedomBox zielt darauf ab diese alle in einem " -"praktischen Paket zusammenzubringen ." +"Diensten arbeiten; %(box_name)s zielt darauf ab diese alle in einem " +"praktischen Paket zusammenzubringen." #: plinth/modules/help/templates/help_about.html:64 -#, fuzzy, python-format +#, python-format #| msgid "" #| "For more information about the FreedomBox project, see the FreedomBox Wiki." @@ -1059,8 +1046,8 @@ msgid "" "For more information about the %(box_name)s project, see the %(box_name)s Wiki." msgstr "" -"Mehr Informationen über das FreedomBox Projekt finden Sie auf dem FreedomBox Wiki." +"Mehr Informationen über das %(box_name)s Projekt finden Sie im %(box_name)s Wiki." #: plinth/modules/help/templates/help_about.html:73 msgid "Learn more »" @@ -1074,10 +1061,10 @@ msgstr "Es läuft Plinth Version %(version)s." #: plinth/modules/help/templates/help_base.html:36 #, python-format msgid "%(box_name)s Setup" -msgstr "" +msgstr "%(box_name)s Installation" #: plinth/modules/help/templates/help_index.html:29 -#, fuzzy, python-format +#, python-format #| msgid "" #| "The FreedomBox Manual is the best place to " #| "start for information regarding %(box_name)s." @@ -1085,11 +1072,11 @@ msgid "" "The %(box_name)s Manual is the best place to " "start for information regarding %(box_name)s." msgstr "" -"Das FreedomBox Handbuch ist der beste Ort für " -"erste Informationen über %(box_name)s." +"Das %(box_name)s Handbuch ist der beste Ort " +"für erste Informationen über %(box_name)s." #: plinth/modules/help/templates/help_index.html:36 -#, fuzzy, python-format +#, python-format #| msgid "" #| " " #| "FreedomBox project wiki contains further information." @@ -1097,11 +1084,11 @@ msgid "" " " "%(box_name)s project wiki contains further information." msgstr "" -"Das FreedomBox Wiki Projekt enthält weitere Informationen." +"Das %(box_name)s Wiki Projekt enthält weitere Informationen." #: plinth/modules/help/templates/help_index.html:43 -#, fuzzy, python-format +#, python-format #| msgid "" #| "To seek help from FreedomBox community, queries may be posted on the mailing list. The list archives also contain information about " "problems faced by other users and possible solutions." msgstr "" -"Um Hilfe von der FreedomBox Gemeinschaft zu bekommen können Anfragen an die " -"Mailingliste gestellt werden. Das Listenarchiv enthält auch " +"Um Hilfe von der %(box_name)s Gemeinschaft zu bekommen können Anfragen an " +"die Mailingliste gestellt werden. Das Listenarchiv enthält auch " "Informationen über Probleme anderer Benutzer und mögliche Lösungen." #: plinth/modules/help/templates/help_index.html:53 @@ -1126,24 +1113,25 @@ msgid "" "oftc.net/?randomnick=1&channels=freedombox&prompt=1\"> #freedombox " "channel using the IRC web interface." msgstr "" +"Viele %(box_name)s Mitarbeiter und Benutzer sind auch im irc.oftc.net IRC " +"Netzwerk erreichbar. Treten Sie ihm bei und bitten um Hilfe im " +"#freedombox Kanal des IRC Web-Interfaces." #: plinth/modules/ikiwiki/__init__.py:38 -#, fuzzy #| msgid "Wiki & Blog (Ikiwiki)" msgid "Wiki and Blog (ikiwiki)" -msgstr "Wiki & Blog (Ikiwiki)" +msgstr "Wiki und Blog (ikiwiki)" #: plinth/modules/ikiwiki/__init__.py:43 -#, fuzzy #| msgid "Ikiwiki wikis and blogs" msgid "ikiwiki wikis and blogs" -msgstr "Ikiwiki Wikis und Blogs" +msgstr "ikiwiki Wikis und Blogs" #: plinth/modules/ikiwiki/forms.py:29 -#, fuzzy #| msgid "Enable Ikiwiki" msgid "Enable ikiwiki" -msgstr "Ikiwiki einschalten" +msgstr "ikiwiki einschalten" #: plinth/modules/ikiwiki/forms.py:36 #: plinth/modules/networks/templates/connection_show.html:98 @@ -1172,13 +1160,12 @@ msgstr "" "ikiwiki zur Verfügung." #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:27 -#, fuzzy, python-format +#, python-format #| msgid "Delete Wiki/Blog %(name)s" msgid "Delete Wiki or Blog %(name)s" -msgstr "Lösche Wiki/Blog %(name)s" +msgstr "Lösche Wiki oder Blog %(name)s" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:33 -#, fuzzy #| msgid "" #| "This action will remove all the posts, pages and comments including " #| "revision history. Delete this wiki/blog permanently?" @@ -1187,7 +1174,7 @@ msgid "" "history. Delete this wiki or blog permanently?" msgstr "" "Diese Aktion wird alle Posts, Seiten und Kommentare einschließlich der " -"Historie löschen. Dieses Wiki/Blog permanent löschen?" +"Historie löschen. Dieses Wiki oder den Blog permanent löschen?" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:44 #, python-format @@ -1228,20 +1215,18 @@ msgid "Create" msgstr "Anlegen" #: plinth/modules/ikiwiki/views.py:73 -#, fuzzy #| msgid "Wiki & Blog" msgid "Wiki and Blog" -msgstr "Wiki & Blog" +msgstr "Wiki und Blog" #: plinth/modules/ikiwiki/views.py:106 msgid "Manage Wikis and Blogs" msgstr "Wikis und Blogs verwalten" #: plinth/modules/ikiwiki/views.py:132 -#, fuzzy #| msgid "Create a Wiki or Blog" msgid "Create Wiki or Blog" -msgstr "Ein Wiki oder Blog anlegen" +msgstr "Wiki oder Blog anlegen" #: plinth/modules/ikiwiki/views.py:145 #, python-brace-format @@ -1274,16 +1259,15 @@ msgid "Could not delete {name}: {error}" msgstr "Konnte {name} nicht löschen: {error}" #: plinth/modules/ikiwiki/views.py:182 -#, fuzzy #| msgid "Delete Wiki/Blog" msgid "Delete Wiki or Blog" -msgstr "Lösche Wiki/Blog" +msgstr "Lösche Wiki oder Blog" #: plinth/modules/letsencrypt/__init__.py:43 #: plinth/modules/letsencrypt/templates/letsencrypt.html:38 #: plinth/modules/letsencrypt/views.py:45 msgid "Certificates (Let's Encrypt)" -msgstr "" +msgstr "Zertifikate (Let's Encrypt)" #: plinth/modules/letsencrypt/templates/letsencrypt.html:41 #, python-format @@ -1294,6 +1278,12 @@ msgid "" "domain. It does so by proving itself to be the owner of a domain to Let's " "Encrypt, a certficate authority (CA)." msgstr "" +"Ein digitales Zertifikat ermöglicht es Benutzern von einem Web-Service, die " +"Identität des Dienstes zu überprüfen und sicher mit ihm zu kommunizieren. " +"%(box_name)s kann automatisch digitale Zertifikate für jede verfügbare " +"Domain beziehen und installieren. Es tut dies, indem es gegenüber Let's " +"Encrypt, einer Zertifizierungsstelle (CA), nachweist der Inhaber einer " +"Domain zu sein." #: plinth/modules/letsencrypt/templates/letsencrypt.html:52 msgid "" @@ -1302,77 +1292,79 @@ msgid "" "read and agree with the Let's Encrypt Subscriber Agreement before using this service." msgstr "" +"Let's Encrypt ist eine freie, automatisierte und offene " +"Zertifizierungsstelle, zum Nutzen der Öffentlichkeit betrieben von der " +"Internet Security Research Group (ISRG). Bitte lesen und akzeptieren Sie die " +"Let's Encrypt " +"Abonnentenvereinbarung vor der Verwendung dieses Dienstes." #: plinth/modules/letsencrypt/templates/letsencrypt.html:66 #: plinth/modules/monkeysphere/templates/monkeysphere.html:70 -#, fuzzy #| msgid "Domain Name" msgid "Domain" -msgstr "Domain-Name" +msgstr "Domain" #: plinth/modules/letsencrypt/templates/letsencrypt.html:67 msgid "Certificate Status" -msgstr "" +msgstr "Status des Zertifikats" #: plinth/modules/letsencrypt/templates/letsencrypt.html:68 -#, fuzzy #| msgid "Security" msgid "Website Security" -msgstr "Sicherheit" +msgstr "Webseiten-Sicherheit" #: plinth/modules/letsencrypt/templates/letsencrypt.html:69 #: plinth/modules/monkeysphere/templates/monkeysphere.html:72 -#, fuzzy #| msgid "Applications" msgid "Actions" -msgstr "Anwendungen" +msgstr "Aktion" #: plinth/modules/letsencrypt/templates/letsencrypt.html:79 #, python-format msgid "Expires on %(expiry_date)s" -msgstr "" +msgstr "Verfällt am %(expiry_date)s" #: plinth/modules/letsencrypt/templates/letsencrypt.html:85 msgid "No certficate" -msgstr "" +msgstr "Kein Zertifikat" #: plinth/modules/letsencrypt/templates/letsencrypt.html:102 msgid "Revoke" -msgstr "" +msgstr "Zurückziehen" #: plinth/modules/letsencrypt/templates/letsencrypt.html:108 msgid "Re-obtain" -msgstr "" +msgstr "Wieder erhalten" #: plinth/modules/letsencrypt/templates/letsencrypt.html:115 msgid "Obtain" -msgstr "" +msgstr "Erhalten" #: plinth/modules/letsencrypt/views.py:55 #, python-brace-format msgid "Certificate successfully revoked for domain {domain}" -msgstr "" +msgstr "Zertifikat erfolgreich zurückgezogen für Domain {domain}" #: plinth/modules/letsencrypt/views.py:60 #, python-brace-format msgid "Failed to revoke certificate for domain {domain}: {error}" -msgstr "" +msgstr "Zurückziehen des Zertifikats für Domain {domain} gescheiter: {error}" #: plinth/modules/letsencrypt/views.py:72 #, python-brace-format msgid "Certificate successfully obtained for domain {domain}" -msgstr "" +msgstr "Zertifikat erfolgreich erhalten für Domain {domain}" #: plinth/modules/letsencrypt/views.py:77 #, python-brace-format msgid "Failed to obtain certificate for domain {domain}: {error}" -msgstr "" +msgstr "Erhalten des Zertifikats für Domain {domain} fehlgeschlagen: {error}" #: plinth/modules/monkeysphere/__init__.py:32 #: plinth/modules/monkeysphere/templates/monkeysphere.html:35 #: plinth/modules/monkeysphere/views.py:44 msgid "Monkeysphere" -msgstr "" +msgstr "Monkeysphere" #: plinth/modules/monkeysphere/templates/monkeysphere.html:38 msgid "" @@ -1384,14 +1376,23 @@ msgid "" "key signing process. See the Monkeysphere SSH documentation for more details." msgstr "" +"Mit Monkeysphere kann ein PGP-Schlüssel für jede konfigurierte Domain die " +"SSH bedient generiert werden. Die öffentlichen PGP-Schlüssel können dann auf " +"die PGP-Schlüsselserver hochgeladen werden. Benutzer, die mit diesem Gerät " +"über SSH verbunden sind, können überprüfen, ob sie mit den richtigen Host " +"verbunden sind. Damit Anwender dem Schlüssel vertrauen können, muss " +"mindestens eine Person (in der Regel der Gerätebetreiber) den Schlüssel mit " +"dem regulären PGP Keysigning-Verfahren signieren. Siehe die Monkeysphere SSH " +"Dokumentation für weitere Details." #: plinth/modules/monkeysphere/templates/monkeysphere.html:53 msgid "Publishing key to keyserver..." -msgstr "" +msgstr "Veröffentliche den Schlüssel beim Schlüssel-Server..." #: plinth/modules/monkeysphere/templates/monkeysphere.html:71 msgid "GPG Fingerprint" -msgstr "" +msgstr "GPG Fingerabdruck" #: plinth/modules/monkeysphere/templates/monkeysphere.html:83 #: plinth/modules/names/views.py:45 @@ -1400,27 +1401,27 @@ msgstr "Nicht verfügbar" #: plinth/modules/monkeysphere/templates/monkeysphere.html:93 msgid "Generate PGP Key" -msgstr "" +msgstr "Generiere PGP Schlüssel" #: plinth/modules/monkeysphere/templates/monkeysphere.html:101 msgid "Publish Key" -msgstr "" +msgstr "Schlüssel veröffentlichen" #: plinth/modules/monkeysphere/views.py:58 msgid "Generated PGP key." -msgstr "" +msgstr "PGP Schlüssel erzeugt." #: plinth/modules/monkeysphere/views.py:83 msgid "Cancelled key publishing." -msgstr "" +msgstr "Schlüssel-Veröffentlichung abgebrochen." #: plinth/modules/monkeysphere/views.py:120 msgid "Published key to keyserver." -msgstr "" +msgstr "Veröffentlichte Schlüssel auf dem Server." #: plinth/modules/monkeysphere/views.py:122 msgid "Error occurred while publishing key." -msgstr "" +msgstr "Ein Fehler ist beim Veröffentlichen des Schlüssels aufgetreten." #: plinth/modules/mumble/__init__.py:38 #: plinth/modules/mumble/templates/mumble.html:26 @@ -1853,7 +1854,6 @@ msgid "Firewall zone" msgstr "Firewall Zone" #: plinth/modules/networks/templates/connection_show.html:280 -#, fuzzy #| msgid "" #| "This interface should be connected to local network/machine. If you " #| "connect this interface to a public network, services meant to be " @@ -1864,13 +1864,12 @@ msgid "" "connect this interface to a public network, services meant to be available " "only internally will become available externally. This is a security risk." msgstr "" -"Diese Schnittstelle sollte auf lokales Netzwerk / Gerät angeschlossen sein. " -"Wenn Sie diese Schnittstelle mit einem öffentlichen Netzwerk verbinden, " -"werden Dienste die nur intern zur Verfügung stehen sollten extern " +"Diese Schnittstelle sollte an ein lokales Netzwerk / Gerät angeschlossen " +"sein. Wenn Sie diese Schnittstelle mit einem öffentlichen Netzwerk " +"verbinden, werden Dienste die nur intern zur Verfügung stehen sollten extern " "erreichbar sein. Dies ist ein Sicherheitsrisiko." #: plinth/modules/networks/templates/connection_show.html:300 -#, fuzzy #| msgid "" #| "This interface should receive your Internet connection. If you connect it " #| "your a local network/machine, many services meant to available only " @@ -1885,7 +1884,7 @@ msgstr "" "intern zur Verfügung stehen sollten nicht verfügbar sein." #: plinth/modules/networks/templates/connection_show.html:319 -#, fuzzy, python-format +#, python-format #| msgid "" #| "This interface is not maintained by FreedomBox. Its security status is " #| "unknown to FreedomBox. Many FreedomBox services may not be available on " @@ -1897,10 +1896,11 @@ msgid "" "this interface. It is recommended that you deactivate or delete this " "connection and re-configure it." msgstr "" -"Diese Schnittstelle wird von FreedomBox nicht gepflegt. Sein " -"Sicherheitsstatus ist FreedomBox unbekannt. Viele FreedomBox Dienste sind " -"möglicherweise nicht über diese Schnittstelle erreichbar. Es wird empfohlen " -"diese Verbindung zu deaktivieren / löschen und neu zu konfigurieren." +"Diese Schnittstelle wird von %(box_name)s nicht gepflegt. Sein " +"Sicherheitsstatus ist %(box_name)s unbekannt. Viele %(box_name)s Dienste " +"sind möglicherweise nicht über diese Schnittstelle erreichbar. Es wird " +"empfohlen diese Verbindung zu deaktivieren oder zu löschen und neu zu " +"konfigurieren." #: plinth/modules/networks/templates/connections_add.html:34 #: plinth/modules/networks/templates/connections_type_select.html:34 @@ -1987,7 +1987,7 @@ msgid "Enable OpenVPN server" msgstr "OpenVPN Server einschalten" #: plinth/modules/openvpn/templates/openvpn.html:38 -#, fuzzy, python-format +#, python-format #| msgid "" #| "Virtual Private Network (VPN) is a technique for securely connecting two " #| "machines in order to access resources of a private network. While you " @@ -2016,7 +2016,7 @@ msgid "Profile" msgstr "Profil" #: plinth/modules/openvpn/templates/openvpn.html:54 -#, fuzzy, python-format +#, python-format #| msgid "" #| "To connect to %(box_name)s's VPN, you need to download a profile and feed " #| "it to an OpenVPN client on your mobile or desktop machine. OpenVPN " @@ -2036,7 +2036,7 @@ msgstr "" "herunterladen und einem OpenVPN-Client auf Ihrem Mobiltelefon oder Desktop-" "Rechner weiterleiten. OpenVPN-Clients sind für die meisten Plattformen " "verfügbar. Siehe die Dokumentation zu " +"OpenVPN\" title=\"%(box_name)s Handbuch OpenVPN\">Dokumentation zu " "empfohlenen Clients und Hinweisen, wie sie zu konfigurieren sind." #: plinth/modules/openvpn/templates/openvpn.html:66 @@ -2590,22 +2590,19 @@ msgstr "Quassel Kern läuft nicht" #: plinth/modules/repro/__init__.py:36 #: plinth/modules/repro/templates/repro.html:26 #: plinth/modules/repro/views.py:55 -#, fuzzy #| msgid "Server port" msgid "SIP Server (repro)" -msgstr "Server Port" +msgstr "SIP Server (repro)" #: plinth/modules/repro/__init__.py:41 -#, fuzzy #| msgid "Second DNS Server" msgid "repro SIP Server" -msgstr "Zweiter DNS Server" +msgstr "repro SIP Server" #: plinth/modules/repro/forms.py:29 -#, fuzzy #| msgid "Enable Quassel core service" msgid "Enable repro service" -msgstr "Quassel-Kern einschalten" +msgstr "repro Dienst einschalten" #: plinth/modules/repro/templates/repro.html:29 msgid "" @@ -2615,6 +2612,12 @@ msgid "" "their presence known. It also acts as a proxy to federate SIP " "communications to other servers on the Internet similar to email." msgstr "" +"repro bietet verschiedene SIP-Dienste an, die ein SIP-Softphone nutzen kann " +"um Audio- und Video-Anrufe sowie Präsenz und Sofortnachrichten zur Verfügung " +"zu stellen. repro stellt einen Server und SIP-Benutzerkonten bereit, die " +"Kunden nutzen können, um ihre Präsenz bekannt zu machen. Es fungiert auch " +"als Proxy zu verbündeten SIP-Kommunikationen mit anderen Servern über das " +"Internet ähnlich wie E-Mail." #: plinth/modules/repro/templates/repro.html:39 msgid "" @@ -2623,6 +2626,10 @@ msgid "" "\"https://f-droid.org/repository/browse/?fdid=com.csipsimple\"> CSipSimple (for Android phones)." msgstr "" +"Um SIP-Anrufe zu tätigen wird eine Client-Anwendung benötigt. Verfügbare " +"Clients sind unter anderem Jitsi (für " +"Computer) und CSipSimple (für Android-Telefone)." #: plinth/modules/repro/templates/repro.html:48 msgid "" @@ -2632,18 +2639,22 @@ msgid "" "log in to the repro configuration panel. After setting the domain, it is " "required to restart the repro service. Disable the service and re-enable it." msgstr "" +"Hinweis: Vor der Verwendung von repro, müssen Domains und " +"Benutzer über das web-basierte " +"Konfigurations-Panel konfiguriert werden. Die Nutzer der admin " +"Gruppe können sich dort anmelden. Nach dem Festlegen der Domain ist es " +"erforderlich den repro Dienst neu zu starten. Deaktivieren Sie den Dienst " +"und aktivieren ihn wieder." #: plinth/modules/repro/templates/repro.html:63 -#, fuzzy #| msgid "Quassel core service is running" msgid "repro service is running" -msgstr "Quassel Kern läuft" +msgstr "repro service läuft" #: plinth/modules/repro/templates/repro.html:66 -#, fuzzy #| msgid "Quassel core service is not running" msgid "repro service is not running" -msgstr "Quassel Kern läuft nicht" +msgstr "repro Dienst läuft nicht" #: plinth/modules/restore/__init__.py:36 #: plinth/modules/restore/templates/restore_index.html:26 @@ -2660,7 +2671,7 @@ msgid "Enable reStore" msgstr "reStore einschalten" #: plinth/modules/restore/templates/restore_index.html:29 -#, fuzzy, python-format +#, python-format #| msgid "" #| "reStore is a server for unhosted web " #| "applications. The idea is to uncouple web applications from data. No " @@ -2678,7 +2689,7 @@ msgstr "" "Anwendungen. Die Idee ist, Web-Anwendungen von den Daten zu entkoppeln. " "Unabhängig davon von wo eine Web-Anwendung aus bedient wird, können die " "Daten auf einem unhosted Speicherserver der Wahl des Benutzers gespeichert " -"werden. Mit reStore, wird Ihre %(cfg.box_name)s Ihr unhosted Speicherserver." +"werden. Mit reStore, wird Ihre %(box_name)s Ihr unhosted Speicherserver." #: plinth/modules/restore/templates/restore_index.html:40 msgid "" @@ -2798,14 +2809,13 @@ msgid "Anonymity Network (Tor)" msgstr "Anonymisierungsnetzwerk (Tor)" #: plinth/modules/tor/__init__.py:53 -#, fuzzy #| msgid "Anonymity Network (Tor)" msgid "Tor Anonymity Network" -msgstr "Anonymisierungsnetzwerk (Tor)" +msgstr "Tor Anonymisierungs-Netzwerk" #: plinth/modules/tor/__init__.py:58 msgid "Tor Bridge Relay" -msgstr "" +msgstr "Tor Bridge Relay" #: plinth/modules/tor/__init__.py:76 plinth/modules/tor/views.py:144 msgid "Tor Hidden Service" @@ -2842,7 +2852,7 @@ msgid "Enable Tor Hidden Service" msgstr "Tor Verborgenen Dienst einschalten" #: plinth/modules/tor/forms.py:38 -#, fuzzy, python-brace-format +#, python-brace-format #| msgid "" #| "A hidden service will allow FreedomBox to provide selected services (such " #| "as ownCloud or Chat) without revealing its location." @@ -2850,7 +2860,7 @@ msgid "" "A hidden service will allow {box_name} to provide selected services (such as " "ownCloud or chat) without revealing its location." msgstr "" -"Ein verborgener Dienst ermöglicht FreedomBox ausgewählte Dienste (wie " +"Ein verborgener Dienst ermöglicht {box_name} ausgewählte Dienste (wie " "ownCloud oder Chat) ohne Offenlegung seiner Position anzubieten." #: plinth/modules/tor/forms.py:42 @@ -2875,17 +2885,16 @@ msgid "" "the " "Tor Browser." msgstr "" -"Tor ist ein anonymes Kommunikationssystem. Sie können mehr darüber auf der " -"Tor Projekt Website erfahren. " +"Tor ist ein anonymes Kommunikationssystem. Sie können mehr darüber auf der <" +"a href=\"https://www.torproject.org/\">Tor Projekt Webseite erfahren. " "Für besten Schutz beim Surfen im Web, empfiehlt das Tor-Projekt, dass Sie " -"den Tor Browser verwenden." +"den " +"Tor Browser verwenden." #: plinth/modules/tor/templates/tor.html:54 -#, fuzzy #| msgid "Configuration updated" msgid "Tor configuration is being updated" -msgstr "Konfiguration aktualisiert" +msgstr "Tor-Konfiguration wird aktualisiert" #: plinth/modules/tor/templates/tor.html:62 msgid "Tor is running" @@ -2945,14 +2954,13 @@ msgid "Action error: {0} [{1}] [{2}]" msgstr "Action error: {0} [{1}] [{2}]" #: plinth/modules/tor/views.py:148 -#, fuzzy #| msgid "Configuration updated" msgid "Configuration updated." -msgstr "Konfiguration aktualisiert" +msgstr "Konfiguration aktualisiert." #: plinth/modules/tor/views.py:150 msgid "An error occurred during configuration." -msgstr "" +msgstr "Ein Fehler ist bei der Konfiguration aufgetreten." #: plinth/modules/transmission/__init__.py:38 #: plinth/modules/transmission/templates/transmission.html:26 @@ -3042,6 +3050,10 @@ msgid "" "upgrades are enabled, upgrades are automatically run every night. You don't " "normally need to start the upgrade process." msgstr "" +"Upgrades installiert die neuesten Software- und Sicherheitsupdates. Wenn " +"automatische Upgrades aktiviert sind, werden Aktualisierungen automatisch " +"jede Nacht durchgeführt. Sie brauchen normalerweise den Upgrade-Prozess " +"nicht zu starten." #: plinth/modules/upgrades/templates/upgrades.html:45 msgid "" @@ -3050,20 +3062,24 @@ msgid "" "other packages. During the upgrade, this web interface may be temporarily " "unavailable and show an error. Refresh the page to continue." msgstr "" +"Abhängig von der Anzahl der zu installierenden Pakete, kann dies eine lange " +"Zeit dauern. Während Aktualisierungen im Gange sind, werden Sie nicht in der " +"Lage sein, andere Pakete zu installieren. Während der Aktualisierung kann " +"dieses Web-Interface vorübergehend nicht verfügbar sein und eine " +"Fehlermeldung anzeigen. Aktualisieren Sie die Seite um fortzufahren." #: plinth/modules/upgrades/templates/upgrades.html:58 msgid "Upgrade now »" msgstr "Updates jetzt durchführen »" #: plinth/modules/upgrades/templates/upgrades.html:65 -#, fuzzy #| msgid "ejabberd is running" msgid "A package manager is running." -msgstr "ejabberd läuft" +msgstr "Ein Paket-Manager läuft." #: plinth/modules/upgrades/templates/upgrades.html:70 msgid "Recent log from upgrades:" -msgstr "" +msgstr "Letzte Protokolle der Aktualisierungen:" #: plinth/modules/upgrades/views.py:36 plinth/modules/upgrades/views.py:66 msgid "Automatic Upgrades" @@ -3074,16 +3090,14 @@ msgid "Upgrade Packages" msgstr "Pakete aktualisieren" #: plinth/modules/upgrades/views.py:96 -#, fuzzy #| msgid "Upgrade completed." msgid "Upgrade process started." -msgstr "Aktualisierung beendet." +msgstr "Aktualisierung begonnen." #: plinth/modules/upgrades/views.py:99 -#, fuzzy #| msgid "Upgrade failed." msgid "Starting upgrade failed." -msgstr "Aktualisierung fehlgeschlagen." +msgstr "Starten der Aktualisierung fehlgeschlagen." #: plinth/modules/upgrades/views.py:102 msgid "Package Upgrades" @@ -3144,7 +3158,7 @@ msgstr "Der Benutzer konnte nicht der Gruppe {group} hinzugefügt werden." #: plinth/modules/users/forms.py:92 msgid "SSH Keys" -msgstr "" +msgstr "SSH Schlüssel" #: plinth/modules/users/forms.py:96 msgid "" @@ -3152,6 +3166,10 @@ msgid "" "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" +"Einen SSH-Public-Key festzulegen erlaubt dem Benutzer erlauben sich sicher " +"ohne Kennwort an das System anzumelden. Sie können mehrere Schlüssel, einen " +"auf jeder Zeile, eingeben. Leerzeilen und Zeilen beginnend mit # werden " +"ignoriert." #: plinth/modules/users/forms.py:136 msgid "Renaming LDAP user failed." @@ -3338,10 +3356,10 @@ msgid "Secure Shell (SSH) Server" msgstr "Secure Shell (SSH) Server" #: plinth/service.py:79 -#, fuzzy, python-brace-format +#, python-brace-format #| msgid "FreedomBox Web Interface (Plinth)" msgid "{box_name} Web Interface (Plinth)" -msgstr "FreedomBox Web Benutzerschnittstelle (Plinth)" +msgstr "{box_name} Web Benutzerschnittstelle (Plinth)" #: plinth/templates/404.html:25 msgid "404" @@ -3377,10 +3395,10 @@ msgstr "" "com/freedombox/Plinth/issues\">Bugtracker, so dass wir es beheben können." #: plinth/templates/base.html:49 -#, fuzzy, python-format +#, python-format #| msgid "Plinth administrative interface for the FreedomBox" msgid "Plinth administrative interface for the %(box_name)s" -msgstr "Plinth Verwaltungsschnittstelle für die FreedomBox" +msgstr "Plinth Verwaltungsschnittstelle für %(box_name)s" #: plinth/templates/base.html:83 msgid "Toggle navigation" From 12b3abcd45efb83c3cc878b6b5d0c6b1f35af73b Mon Sep 17 00:00:00 2001 From: Tong Hui Date: Thu, 4 Feb 2016 02:36:52 +0100 Subject: [PATCH 059/189] Translated using Weblate (Chinese (China)) Currently translated at 92.9% (529 of 569 strings) --- plinth/locale/zh_CN/LC_MESSAGES/django.po | 273 ++++++++++++---------- 1 file changed, 144 insertions(+), 129 deletions(-) diff --git a/plinth/locale/zh_CN/LC_MESSAGES/django.po b/plinth/locale/zh_CN/LC_MESSAGES/django.po index 6f68b2b82..2409b31b6 100644 --- a/plinth/locale/zh_CN/LC_MESSAGES/django.po +++ b/plinth/locale/zh_CN/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-01-31 22:19+0530\n" -"PO-Revision-Date: 2016-02-02 12:20+0000\n" +"PO-Revision-Date: 2016-02-04 02:36+0000\n" "Last-Translator: Tong Hui \n" "Language-Team: Chinese (China) " "\n" @@ -103,6 +103,8 @@ msgid "" "disabled to improve security especially when connecting to a hostile local " "network." msgstr "" +"服务发现允许其他设备在网络上发现你的 %(box_name)s 和在其上运行的服务。它还允许 %(box_name)s " +"发现在您本地网络上运行的其他设备和服务。服务发现是非必需的,且只能在内部网络上运行。可以禁用以提高安全性,尤其是当连接到一个充满敌意的本地网络。" #: plinth/modules/avahi/templates/avahi.html:40 #: plinth/modules/datetime/templates/datetime.html:35 @@ -209,6 +211,8 @@ msgid "" "and have as interior characters only alphabets, digits and hyphens. Total " "length must be 63 characters or less." msgstr "" +"主机名是本地网络上的其他设备可以到达你 {box_name} 的本地名称。它必须以字母或数字结束和开始作为内部字符只有字母、数字和连字符。总长度必须为 " +"63 个字符或更少。" #: plinth/modules/config/config.py:105 msgid "Invalid hostname" @@ -2226,25 +2230,25 @@ msgstr "" #: plinth/modules/repro/templates/repro.html:63 msgid "repro service is running" -msgstr "" +msgstr "repro 服务正在运行" #: plinth/modules/repro/templates/repro.html:66 msgid "repro service is not running" -msgstr "" +msgstr "repro 服务未运行" #: plinth/modules/restore/__init__.py:36 #: plinth/modules/restore/templates/restore_index.html:26 #: plinth/modules/restore/views.py:46 msgid "Unhosted Storage (reStore)" -msgstr "" +msgstr "未托管存储(reStrore)" #: plinth/modules/restore/__init__.py:41 msgid "reStore" -msgstr "" +msgstr "reStore" #: plinth/modules/restore/forms.py:29 msgid "Enable reStore" -msgstr "" +msgstr "启用 reStore" #: plinth/modules/restore/templates/restore_index.html:29 #, python-format @@ -2260,17 +2264,17 @@ msgstr "" msgid "" "You can create and edit accounts in the reStore web-" "interface." -msgstr "" +msgstr "您可以在 reStrore 的 web 界面 中创建和编辑帐户 。" #: plinth/modules/roundcube/__init__.py:36 #: plinth/modules/roundcube/templates/roundcube.html:26 #: plinth/modules/roundcube/views.py:64 msgid "Email Client (Roundcube)" -msgstr "" +msgstr "邮件客户端(Roundcube)" #: plinth/modules/roundcube/forms.py:29 msgid "Enable Roundcube" -msgstr "" +msgstr "启用 Roundcube" #: plinth/modules/roundcube/templates/roundcube.html:29 msgid "" @@ -2303,19 +2307,19 @@ msgstr "" #: plinth/modules/shaarli/templates/shaarli.html:26 #: plinth/modules/shaarli/views.py:52 msgid "Bookmarks (Shaarli)" -msgstr "" +msgstr "书签(Shaarli)" #: plinth/modules/shaarli/__init__.py:42 msgid "Shaarli" -msgstr "" +msgstr "Shaarli" #: plinth/modules/shaarli/forms.py:29 msgid "Enable Shaarli" -msgstr "" +msgstr "启用 Shaarli" #: plinth/modules/shaarli/templates/shaarli.html:28 msgid "Shaarli allows you to save and share bookmarks." -msgstr "" +msgstr "Shaarli 允许您保存和共享书签。" #: plinth/modules/shaarli/templates/shaarli.html:31 msgid "" @@ -2323,91 +2327,93 @@ msgid "" "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." msgstr "" +"当启用时,Shaarli 将可从 /shaarli 路径访问。请注意,Shaarli " +"只支持单用户帐户,您在首次访问时安装程序。" #: plinth/modules/system/system.py:26 msgid "System" -msgstr "" +msgstr "系统" #: plinth/modules/system/system.py:33 #: plinth/modules/system/templates/system.html:25 #: plinth/templates/base.html:109 msgid "System Configuration" -msgstr "" +msgstr "系统配置" #: plinth/modules/system/templates/system.html:28 #, python-format msgid "Here you can administrate the underlying system of your %(box_name)s." -msgstr "" +msgstr "在这里您可以管理 %(box_name)s 的底层系统。" #: plinth/modules/system/templates/system.html:35 #, python-format msgid "" "The options affect the %(box_name)s at its most general level, so be careful!" -msgstr "" +msgstr "此选项会在通用层面影响 %(box_name)s 所以要小心!" #: plinth/modules/tor/__init__.py:48 plinth/modules/tor/templates/tor.html:35 msgid "Anonymity Network (Tor)" -msgstr "" +msgstr "匿名网络(Tor)" #: plinth/modules/tor/__init__.py:53 msgid "Tor Anonymity Network" -msgstr "" +msgstr "Tor 匿名网络" #: plinth/modules/tor/__init__.py:58 msgid "Tor Bridge Relay" -msgstr "" +msgstr "Tor 网桥中继" #: plinth/modules/tor/__init__.py:76 plinth/modules/tor/views.py:144 msgid "Tor Hidden Service" -msgstr "" +msgstr "隐藏的 Tor 服务" #: plinth/modules/tor/__init__.py:222 msgid "Tor relay port available" -msgstr "" +msgstr "Tor 中继端口可用" #: plinth/modules/tor/__init__.py:230 msgid "Obfs3 transport registered" -msgstr "" +msgstr "已注册 Obfs3 传输" #: plinth/modules/tor/__init__.py:236 msgid "Obfs4 transport registered" -msgstr "" +msgstr "已注册 Obfs4 传输" #: plinth/modules/tor/__init__.py:273 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" -msgstr "" +msgstr "在 tcp{kind} 上通过 Tor 访问 {url}" #: plinth/modules/tor/__init__.py:284 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" -msgstr "" +msgstr "确认使用 Tor 通过 tcp{kind} 访问 {url}" #: plinth/modules/tor/forms.py:32 msgid "Enable Tor" -msgstr "" +msgstr "启用 Tor" #: plinth/modules/tor/forms.py:35 msgid "Enable Tor Hidden Service" -msgstr "" +msgstr "启用隐藏的 Tor 服务" #: plinth/modules/tor/forms.py:38 #, python-brace-format msgid "" "A hidden service will allow {box_name} to provide selected services (such as " "ownCloud or chat) without revealing its location." -msgstr "" +msgstr "隐藏的服务将允许 {box_name} 提供某些服务(如 ownCloud 或聊天),而不暴露其位置。" #: plinth/modules/tor/forms.py:42 msgid "Download software packages over Tor" -msgstr "" +msgstr "通过 Tor 下载软件包" #: plinth/modules/tor/forms.py:44 msgid "" "When enabled, software will be downloaded over the Tor network for " "installations and upgrades. This adds a degree of privacy and security " "during software downloads." -msgstr "" +msgstr "当启用时,软件将会下载 Tor 网络的安装和升级。这在软件下载过程中添加了一定程度的隐私和安全。" #: plinth/modules/tor/templates/tor.html:38 msgid "" @@ -2420,28 +2426,28 @@ msgstr "" #: plinth/modules/tor/templates/tor.html:54 msgid "Tor configuration is being updated" -msgstr "" +msgstr "Tor 配置已更新" #: plinth/modules/tor/templates/tor.html:62 msgid "Tor is running" -msgstr "" +msgstr "Tor 正在运行" #: plinth/modules/tor/templates/tor.html:65 msgid "Tor is not running" -msgstr "" +msgstr "Tor 未运行" #: plinth/modules/tor/templates/tor.html:77 msgid "Hidden Service" -msgstr "" +msgstr "隐藏的服务" #: plinth/modules/tor/templates/tor.html:78 #: plinth/modules/tor/templates/tor.html:120 msgid "Port" -msgstr "" +msgstr "端口" #: plinth/modules/tor/templates/tor.html:103 msgid "Bridge" -msgstr "" +msgstr "网桥" #: plinth/modules/tor/templates/tor.html:106 #, python-format @@ -2454,108 +2460,109 @@ msgstr "" #: plinth/modules/tor/templates/tor.html:119 msgid "Service" -msgstr "" +msgstr "服务" #: plinth/modules/tor/templates/tor.html:135 msgid "SOCKS" -msgstr "" +msgstr "SOCKS" #: plinth/modules/tor/templates/tor.html:138 #, python-format msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." -msgstr "" +msgstr "Tor SOCKS 端口是你 %(box_name)s 上的 TCP 端口 9050 。" #: plinth/modules/tor/views.py:68 msgid "Tor Control Panel" -msgstr "" +msgstr "Tor 控制面板" #: plinth/modules/tor/views.py:79 #, python-brace-format msgid "Action error: {0} [{1}] [{2}]" -msgstr "" +msgstr "操作错误:{0} [{1}] [{2}]" #: plinth/modules/tor/views.py:148 msgid "Configuration updated." -msgstr "" +msgstr "配置已更新。" #: plinth/modules/tor/views.py:150 msgid "An error occurred during configuration." -msgstr "" +msgstr "在配置过程中出错。" #: plinth/modules/transmission/__init__.py:38 #: plinth/modules/transmission/templates/transmission.html:26 #: plinth/modules/transmission/views.py:67 msgid "BitTorrent (Transmission)" -msgstr "" +msgstr "BitTorrent(Transmission)" #: plinth/modules/transmission/__init__.py:43 msgid "Transmission BitTorrent" -msgstr "" +msgstr "Transmission BitTorrent" #: plinth/modules/transmission/forms.py:29 msgid "Enable Transmission daemon" -msgstr "" +msgstr "启用 Transmission 守护进程" #: plinth/modules/transmission/forms.py:33 msgid "Download directory" -msgstr "" +msgstr "下载目录" #: plinth/modules/transmission/forms.py:34 msgid "" "Directory where downloads are saved. If you change the default directory, " "ensure that the new directory exists and is writable by \"debian-transmission" "\" user." -msgstr "" +msgstr "保存下载的目录。 如果您更改默认目录,请确保新目录存在并且允许用户“debian-transmission”可写。" #: plinth/modules/transmission/forms.py:40 msgid "Username to login to the web interface." -msgstr "" +msgstr "登录到 web 界面的用户名。" #: plinth/modules/transmission/forms.py:44 msgid "" "Password to login to the web interface. Current password is shown in a " "hashed format. To set a new password, enter the password in plain text." -msgstr "" +msgstr "登录到 web 界面的密码。当前密码以哈希格式所示。若要设置一个新密码,请以纯文本格式输入密码。" #: plinth/modules/transmission/templates/transmission.html:29 msgid "" "BitTorrent is a peer-to-peer file sharing protocol. Transmission daemon " "handles Bitorrent file sharing. Note that BitTorrent is not anonymous." msgstr "" +"BitTorrent 是对等文件共享协议。Transmission 守护进程处理 Bitorrent 文件共享。请注意,BitTorrent 不是匿名。" #: plinth/modules/transmission/templates/transmission.html:37 msgid "" "Access the web interface at /transmission." -msgstr "" +msgstr "通过 /transmission 访问其 web 界面。" #: plinth/modules/transmission/templates/transmission.html:47 msgid "Transmission daemon is running" -msgstr "" +msgstr "Transmission 守护程序正在运行" #: plinth/modules/transmission/templates/transmission.html:50 msgid "Transmission daemon is not running." -msgstr "" +msgstr "Transmission 守护程序未运行。" #: plinth/modules/upgrades/__init__.py:33 msgid "Software Upgrades" -msgstr "" +msgstr "软件升级" #: plinth/modules/upgrades/forms.py:29 msgid "Enable automatic upgrades" -msgstr "" +msgstr "启用自动升级" #: plinth/modules/upgrades/forms.py:30 msgid "" "When enabled, the unattended-upgrades program will be run once per day. It " "will attempt to perform any package upgrades that are available." -msgstr "" +msgstr "当启用时,将每天一次运行无人值守升级程序。它会尝试执行任何可用的软件包升级。" #: plinth/modules/upgrades/templates/upgrades.html:37 msgid "" "Upgrades install the latest software and security updates. When automatic " "upgrades are enabled, upgrades are automatically run every night. You don't " "normally need to start the upgrade process." -msgstr "" +msgstr "升级安装最新的软件和安全更新。启用自动升级后,每个夜晚自动运行升级。你通常不需要经常关注升级过程。" #: plinth/modules/upgrades/templates/upgrades.html:45 msgid "" @@ -2564,72 +2571,74 @@ msgid "" "other packages. During the upgrade, this web interface may be temporarily " "unavailable and show an error. Refresh the page to continue." msgstr "" +"根据要安装的程序包数量,这可能需要很长的时间才能完成。升级进行时,你将无法安装其它软件包。升级期间,此 web " +"界面可能暂时不可用并显示错误消息。刷新页面后,可以继续。" #: plinth/modules/upgrades/templates/upgrades.html:58 msgid "Upgrade now »" -msgstr "" +msgstr "现在升级 »" #: plinth/modules/upgrades/templates/upgrades.html:65 msgid "A package manager is running." -msgstr "" +msgstr "软件包管理器正在运行。" #: plinth/modules/upgrades/templates/upgrades.html:70 msgid "Recent log from upgrades:" -msgstr "" +msgstr "最新更新日志:" #: plinth/modules/upgrades/views.py:36 plinth/modules/upgrades/views.py:66 msgid "Automatic Upgrades" -msgstr "" +msgstr "自动升级" #: plinth/modules/upgrades/views.py:38 msgid "Upgrade Packages" -msgstr "" +msgstr "升级软件包" #: plinth/modules/upgrades/views.py:96 msgid "Upgrade process started." -msgstr "" +msgstr "升级过程开始。" #: plinth/modules/upgrades/views.py:99 msgid "Starting upgrade failed." -msgstr "" +msgstr "开始升级失败。" #: plinth/modules/upgrades/views.py:102 msgid "Package Upgrades" -msgstr "" +msgstr "软件包升级" #: plinth/modules/upgrades/views.py:131 #, python-brace-format msgid "Error when configuring unattended-upgrades: {error}" -msgstr "" +msgstr "配置无人参与升级时错误:{error}" #: plinth/modules/upgrades/views.py:136 msgid "Automatic upgrades enabled" -msgstr "" +msgstr "已启用自动升级" #: plinth/modules/upgrades/views.py:138 msgid "Automatic upgrades disabled" -msgstr "" +msgstr "已禁用自动升级" #: plinth/modules/users/__init__.py:36 msgid "Users and Groups" -msgstr "" +msgstr "用户和组" #: plinth/modules/users/__init__.py:65 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" -msgstr "" +msgstr "请检查 LDAP 条目“{search_item}”" #: plinth/modules/users/forms.py:28 msgid "admin" -msgstr "" +msgstr "管理员" #: plinth/modules/users/forms.py:29 msgid "wiki" -msgstr "" +msgstr "维基" #: plinth/modules/users/forms.py:41 msgid "Groups" -msgstr "" +msgstr "群組" #: plinth/modules/users/forms.py:45 msgid "" @@ -2643,134 +2652,134 @@ msgstr "" #: plinth/modules/users/forms.py:80 #, python-brace-format msgid "Failed to add new user to {group} group." -msgstr "" +msgstr "未能将新用户添加到 {group}。" #: plinth/modules/users/forms.py:92 msgid "SSH Keys" -msgstr "" +msgstr "SSH 密钥" #: plinth/modules/users/forms.py:96 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." -msgstr "" +msgstr "设置 SSH 公钥将允许此用户安全地登录到系统不使用密码。您可以输入多个密钥,每行一个。将忽略空行和以 # 开头的行。" #: plinth/modules/users/forms.py:136 msgid "Renaming LDAP user failed." -msgstr "" +msgstr "重命名 LDAP 用户失败。" #: plinth/modules/users/forms.py:148 msgid "Failed to remove user from group." -msgstr "" +msgstr "无法从组中删除用户。" #: plinth/modules/users/forms.py:159 msgid "Failed to add user to group." -msgstr "" +msgstr "无法将用户添加到组。" #: plinth/modules/users/forms.py:188 msgid "Changing LDAP user password failed." -msgstr "" +msgstr "更改 LDAP 用户密码失败。" #: plinth/modules/users/templates/users_change_password.html:27 #, python-format msgid "Change Password for %(username)s" -msgstr "" +msgstr "为%(username)s更改密码" #: plinth/modules/users/templates/users_change_password.html:40 msgid "Save Password" -msgstr "" +msgstr "保存密码" #: plinth/modules/users/templates/users_create.html:42 #: plinth/modules/users/views.py:36 plinth/modules/users/views.py:56 msgid "Create User" -msgstr "" +msgstr "创建用户" #: plinth/modules/users/templates/users_delete.html:26 #: plinth/modules/users/views.py:110 msgid "Delete User" -msgstr "" +msgstr "删除用户" #: plinth/modules/users/templates/users_delete.html:29 #, python-format msgid "Delete user %(username)s permanently?" -msgstr "" +msgstr "永久删除用户 %(username)s?" #: plinth/modules/users/templates/users_delete.html:38 #, python-format msgid "Delete %(username)s" -msgstr "" +msgstr "删除 %(username)s" #: plinth/modules/users/templates/users_list.html:46 #, python-format msgid "Delete user %(username)s" -msgstr "" +msgstr "删除用户 %(username)s" #: plinth/modules/users/templates/users_list.html:53 #, python-format msgid "Edit user %(username)s" -msgstr "" +msgstr "编辑用户 %(username)s" #: plinth/modules/users/templates/users_update.html:39 #, python-format msgid "" "Use the change password form to " "change the password." -msgstr "" +msgstr "使用 更改密码窗口 更改密码。" #: plinth/modules/users/templates/users_update.html:53 msgid "Save Changes" -msgstr "" +msgstr "保存更改" #: plinth/modules/users/views.py:34 plinth/modules/users/views.py:69 msgid "Users" -msgstr "" +msgstr "用户" #: plinth/modules/users/views.py:54 #, python-format msgid "User %(username)s created." -msgstr "" +msgstr "用户 %(username)s 已创建。" #: plinth/modules/users/views.py:78 #, python-format msgid "User %(username)s updated." -msgstr "" +msgstr "用户 %(username)s 已更新。" #: plinth/modules/users/views.py:79 msgid "Edit User" -msgstr "" +msgstr "编辑用户" #: plinth/modules/users/views.py:120 #, python-brace-format msgid "User {user} deleted." -msgstr "" +msgstr "用户 {user} 已删除。" #: plinth/modules/users/views.py:127 msgid "Deleting LDAP user failed." -msgstr "" +msgstr "删除 LDAP 用户失败。" #: plinth/modules/users/views.py:136 msgid "Change Password" -msgstr "" +msgstr "更改密码" #: plinth/modules/users/views.py:137 msgid "Password changed successfully." -msgstr "" +msgstr "已成功更改密码。" #: plinth/modules/xmpp/__init__.py:41 plinth/modules/xmpp/__init__.py:46 #: plinth/modules/xmpp/templates/xmpp.html:26 plinth/modules/xmpp/views.py:75 msgid "Chat Server (XMPP)" -msgstr "" +msgstr "聊天服务器(XMPP)" #: plinth/modules/xmpp/forms.py:29 msgid "Enable XMPP" -msgstr "" +msgstr "启用 XMPP" #: plinth/modules/xmpp/templates/xmpp.html:29 msgid "" "XMPP is an open and standardized communication protocol. Here you can run " "and configure your XMPP server, called ejabberd." -msgstr "" +msgstr "XMPP 是一种开放标准的通信协议。在这里你可以运行并配置您的 XMPP 服务器,称为 ejabberd。" #: plinth/modules/xmpp/templates/xmpp.html:36 msgid "" @@ -2778,6 +2787,8 @@ msgid "" "any other XMPP client." msgstr "" +"要实际沟通,您可以使用 web 客户端 或任何其他 XMPP 客户端。" #: plinth/modules/xmpp/templates/xmpp.html:45 #, python-format @@ -2789,58 +2800,58 @@ msgstr "" #: plinth/modules/xmpp/templates/xmpp.html:55 msgid "Launch web client" -msgstr "" +msgstr "启动 web 客户端" #: plinth/modules/xmpp/templates/xmpp.html:63 msgid "ejabberd is running" -msgstr "" +msgstr "ejabberd 正在运行" #: plinth/modules/xmpp/templates/xmpp.html:66 msgid "ejabberd is not running" -msgstr "" +msgstr "ejabberd 未运行" #: plinth/network.py:39 msgid "PPPoE" -msgstr "" +msgstr "PPPoE" #: plinth/package.py:156 msgid "packages not found" -msgstr "" +msgstr "找不到软件包" #: plinth/package.py:263 msgid "Installed and configured packages successfully." -msgstr "" +msgstr "安装和配置软件包成功。" #: plinth/package.py:268 #, python-brace-format msgid "Error installing packages: {string} {details}" -msgstr "" +msgstr "安装软件包时出错:{string}{details}" #: plinth/service.py:73 msgid "Web Server" -msgstr "" +msgstr "Web 服务器" #: plinth/service.py:74 msgid "Web Server over Secure Socket Layer" -msgstr "" +msgstr "Web 服务器安全套接字层" #: plinth/service.py:76 msgid "Secure Shell (SSH) Server" -msgstr "" +msgstr "安全 Shell(SSH)服务器" #: plinth/service.py:79 #, python-brace-format msgid "{box_name} Web Interface (Plinth)" -msgstr "" +msgstr "{box_name} Web 界面(Plinth)" #: plinth/templates/404.html:25 msgid "404" -msgstr "" +msgstr "404" #: plinth/templates/404.html:28 #, python-format msgid "Requested page %(request_path)s was not found." -msgstr "" +msgstr "找不到请求的页面 %(request_path)s。" #: plinth/templates/404.html:34 msgid "" @@ -2848,10 +2859,12 @@ msgid "" "Plinth project issue " "tracker." msgstr "" +"如果你相信这个丢失的页面应该存在,请在 Plinth 项目 问题跟踪 报告 bug。" #: plinth/templates/500.html:25 msgid "500" -msgstr "" +msgstr "500" #: plinth/templates/500.html:28 msgid "" @@ -2859,61 +2872,63 @@ msgid "" "report the error on the bug tracker so we can fix it." msgstr "" +"这是一个内部错误,不是你造成的或可以修复。 请报告到 bug 追踪器 上这样我们就可以修复该错误。" #: plinth/templates/base.html:49 #, python-format msgid "Plinth administrative interface for the %(box_name)s" -msgstr "" +msgstr "Plinth %(box_name)s 管理界面" #: plinth/templates/base.html:83 msgid "Toggle navigation" -msgstr "" +msgstr "切换导航" #: plinth/templates/base.html:125 plinth/templates/base.html.py:126 msgid "Change password" -msgstr "" +msgstr "更改密码" #: plinth/templates/base.html:129 plinth/templates/base.html.py:130 #: plinth/templates/base.html:143 plinth/templates/base.html.py:145 msgid "Log out" -msgstr "" +msgstr "登出" #: plinth/templates/base.html:135 plinth/templates/base.html.py:137 msgid "Log in" -msgstr "" +msgstr "登录" #: plinth/templates/login.html:35 msgid "Login" -msgstr "" +msgstr "登录" #: plinth/templates/package_install.html:35 msgid "Installation" -msgstr "" +msgstr "安装" #: plinth/templates/package_install.html:40 msgid "" "This feature requires addtional packages to be installed. Do you wish to " "install them?" -msgstr "" +msgstr "此功能需要安装额外的软件包。你想安装它们吗?" #: plinth/templates/package_install.html:49 msgid "Package" -msgstr "" +msgstr "软件包" #: plinth/templates/package_install.html:50 msgid "Summary" -msgstr "" +msgstr "摘要" #: plinth/templates/package_install.html:67 msgid "Install" -msgstr "" +msgstr "安装" #: plinth/templates/package_install.html:74 #, python-format msgid "Installing %(package_names)s: %(status)s" -msgstr "" +msgstr "正在安装 %(package_names)s:%(status)s" #: plinth/templates/package_install.html:84 #, python-format msgid "%(percentage)s%% complete" -msgstr "" +msgstr "已完成 %(percentage)s%%" From 9646274e0bb3110338693c759fbe034fa44381e8 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sat, 6 Feb 2016 14:48:10 +0530 Subject: [PATCH 060/189] New locale file for Russian (ru) --- plinth/locale/ru/LC_MESSAGES/django.po | 2899 ++++++++++++++++++++++++ 1 file changed, 2899 insertions(+) create mode 100644 plinth/locale/ru/LC_MESSAGES/django.po diff --git a/plinth/locale/ru/LC_MESSAGES/django.po b/plinth/locale/ru/LC_MESSAGES/django.po new file mode 100644 index 000000000..e2137658f --- /dev/null +++ b/plinth/locale/ru/LC_MESSAGES/django.po @@ -0,0 +1,2899 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-02-06 14:44+0530\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n" +"%100>=11 && n%100<=14)? 2 : 3);\n" + +#: plinth/action_utils.py:203 +#, python-brace-format +msgid "Listening on {kind} port {listen_address}:{port}" +msgstr "" + +#: plinth/action_utils.py:206 +#, python-brace-format +msgid "Listening on {kind} port {port}" +msgstr "" + +#: plinth/action_utils.py:287 +#, python-brace-format +msgid "Access URL {url} on tcp{kind}" +msgstr "" + +#: plinth/action_utils.py:290 +#, python-brace-format +msgid "Access URL {url}" +msgstr "" + +#: plinth/action_utils.py:321 +#, python-brace-format +msgid "Connect to {host}:{port}" +msgstr "" + +#: plinth/action_utils.py:324 +#, python-brace-format +msgid "Cannot connect to {host}:{port}" +msgstr "" + +#: plinth/context_processors.py:36 +msgid "FreedomBox" +msgstr "" + +#: plinth/modules/apps/apps.py:26 +msgid "Apps" +msgstr "" + +#: plinth/modules/apps/apps.py:32 plinth/templates/base.html.py:93 +msgid "Applications" +msgstr "" + +#: plinth/modules/apps/templates/apps.html:25 +msgid "Services and Applications" +msgstr "" + +#: plinth/modules/apps/templates/apps.html:28 +#, python-format +msgid "" +"You can install and run various services and applications on your " +"%(box_name)s. Click on any app page link on the left to read a description " +"of the application and choose to install it." +msgstr "" + +#: plinth/modules/apps/templates/apps.html:36 +msgid "" +"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!" +msgstr "" + +#: plinth/modules/avahi/__init__.py:40 plinth/modules/avahi/__init__.py:45 +#: plinth/modules/avahi/templates/avahi.html:26 +#: plinth/modules/avahi/views.py:53 +msgid "Service Discovery" +msgstr "" + +#: plinth/modules/avahi/forms.py:29 +msgid "Enable service discovery" +msgstr "" + +#: plinth/modules/avahi/templates/avahi.html:29 +#, python-format +msgid "" +"Service discovery allows other devices on the network to discover your " +"%(box_name)s and services running on it. It also allows %(box_name)s to " +"discover other devices 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." +msgstr "" + +#: plinth/modules/avahi/templates/avahi.html:40 +#: plinth/modules/datetime/templates/datetime.html:35 +#: plinth/modules/deluge/templates/deluge.html:39 +#: plinth/modules/dynamicdns/dynamicdns.py:39 +#: plinth/modules/firewall/templates/firewall.html:57 +#: plinth/modules/mumble/templates/mumble.html:44 +#: plinth/modules/networks/templates/connection_show.html:261 +#: plinth/modules/openvpn/templates/openvpn.html:81 +#: plinth/modules/privoxy/templates/privoxy.html:48 +#: plinth/modules/quassel/templates/quassel.html:50 +#: plinth/modules/repro/templates/repro.html:58 +#: plinth/modules/tor/templates/tor.html:48 +#: plinth/modules/transmission/templates/transmission.html:42 +#: plinth/modules/xmpp/templates/xmpp.html:58 +msgid "Status" +msgstr "" + +#: plinth/modules/avahi/templates/avahi.html:45 +msgid "Service discovery server is running" +msgstr "" + +#: plinth/modules/avahi/templates/avahi.html:48 +msgid "Service discovery server is not running" +msgstr "" + +#: plinth/modules/avahi/templates/avahi.html:52 +#: plinth/modules/datetime/templates/datetime.html:48 +#: plinth/modules/deluge/templates/deluge.html:53 +#: plinth/modules/ikiwiki/templates/ikiwiki.html:35 +#: plinth/modules/mumble/templates/mumble.html:59 +#: plinth/modules/openvpn/templates/openvpn.html:130 +#: plinth/modules/owncloud/templates/owncloud.html:51 +#: plinth/modules/privoxy/templates/privoxy.html:62 +#: plinth/modules/quassel/templates/quassel.html:65 +#: plinth/modules/repro/templates/repro.html:72 +#: plinth/modules/roundcube/templates/roundcube.html:62 +#: plinth/modules/shaarli/templates/shaarli.html:40 +#: plinth/modules/tor/templates/tor.html:92 +#: plinth/modules/transmission/templates/transmission.html:56 +#: plinth/modules/xmpp/templates/xmpp.html:72 +msgid "Configuration" +msgstr "" + +#: plinth/modules/avahi/templates/avahi.html:60 +#: plinth/modules/datetime/templates/datetime.html:56 +#: plinth/modules/deluge/templates/deluge.html:61 +#: plinth/modules/dynamicdns/templates/dynamicdns_configure.html:40 +#: plinth/modules/ikiwiki/templates/ikiwiki.html:43 +#: plinth/modules/ikiwiki/templates/ikiwiki_create.html:32 +#: plinth/modules/mumble/templates/mumble.html:67 +#: plinth/modules/openvpn/templates/openvpn.html:138 +#: plinth/modules/privoxy/templates/privoxy.html:70 +#: plinth/modules/quassel/templates/quassel.html:73 +#: plinth/modules/repro/templates/repro.html:80 +#: plinth/modules/restore/templates/restore_index.html:54 +#: plinth/modules/roundcube/templates/roundcube.html:70 +#: plinth/modules/shaarli/templates/shaarli.html:48 +#: plinth/modules/tor/templates/tor.html:100 +#: plinth/modules/transmission/templates/transmission.html:64 +#: plinth/modules/upgrades/templates/upgrades_configure.html:34 +#: plinth/modules/xmpp/templates/xmpp.html:80 +msgid "Update setup" +msgstr "" + +#: plinth/modules/avahi/views.py:73 plinth/modules/datetime/views.py:85 +#: plinth/modules/deluge/views.py:80 +#: plinth/modules/dynamicdns/dynamicdns.py:371 +#: plinth/modules/ikiwiki/views.py:95 plinth/modules/mumble/views.py:80 +#: plinth/modules/openvpn/views.py:142 plinth/modules/privoxy/views.py:83 +#: plinth/modules/quassel/views.py:76 plinth/modules/repro/views.py:77 +#: plinth/modules/restore/views.py:68 plinth/modules/roundcube/views.py:84 +#: plinth/modules/shaarli/views.py:74 plinth/modules/transmission/views.py:109 +#: plinth/modules/xmpp/views.py:100 +msgid "Configuration updated" +msgstr "" + +#: plinth/modules/avahi/views.py:76 plinth/modules/datetime/views.py:99 +#: plinth/modules/deluge/views.py:82 plinth/modules/ikiwiki/views.py:97 +#: plinth/modules/mumble/views.py:82 plinth/modules/openvpn/views.py:144 +#: plinth/modules/owncloud/owncloud.py:93 plinth/modules/privoxy/views.py:85 +#: plinth/modules/quassel/views.py:78 plinth/modules/repro/views.py:79 +#: plinth/modules/restore/views.py:70 plinth/modules/roundcube/views.py:86 +#: plinth/modules/shaarli/views.py:76 plinth/modules/tor/views.py:111 +#: plinth/modules/transmission/views.py:111 +#: plinth/modules/upgrades/views.py:118 plinth/modules/xmpp/views.py:102 +msgid "Setting unchanged" +msgstr "" + +#: plinth/modules/config/config.py:84 plinth/modules/config/config.py:121 +#: plinth/modules/dynamicdns/dynamicdns.py:148 +msgid "Invalid domain name" +msgstr "" + +#: plinth/modules/config/config.py:95 +msgid "Hostname" +msgstr "" + +#: plinth/modules/config/config.py:97 +#, python-brace-format +msgid "" +"Hostname is the local name by which other devices on the local network can " +"reach your {box_name}. It must start and end with an alphabet or a digit " +"and have as interior characters only alphabets, digits and hyphens. Total " +"length must be 63 characters or less." +msgstr "" + +#: plinth/modules/config/config.py:105 +msgid "Invalid hostname" +msgstr "" + +#: plinth/modules/config/config.py:108 plinth/modules/config/config.py:153 +#: plinth/modules/config/config.py:265 +#: plinth/modules/dynamicdns/dynamicdns.py:143 +msgid "Domain Name" +msgstr "" + +#: plinth/modules/config/config.py:110 +#, python-brace-format +msgid "" +"Domain name is the global name by which other devices on the Internet can " +"reach your {box_name}. It must consist of labels separated by dots. Each " +"label must start and end with an alphabet or a digit and have as interior " +"characters only alphabets, digits and hyphens. Length of each label must be " +"63 characters or less. Total length of domain name must be 253 characters " +"or less." +msgstr "" + +#: plinth/modules/config/config.py:125 +msgid "Language" +msgstr "" + +#: plinth/modules/config/config.py:127 +msgid "Language for this web administration interface" +msgstr "" + +#: plinth/modules/config/config.py:135 +#: plinth/modules/dynamicdns/dynamicdns.py:37 +#: plinth/modules/ikiwiki/views.py:36 +msgid "Configure" +msgstr "" + +#: plinth/modules/config/config.py:176 +msgid "General Configuration" +msgstr "" + +#: plinth/modules/config/config.py:193 +#, python-brace-format +msgid "Error setting hostname: {exception}" +msgstr "" + +#: plinth/modules/config/config.py:196 +msgid "Hostname set" +msgstr "" + +#: plinth/modules/config/config.py:202 +#, python-brace-format +msgid "Error setting domain name: {exception}" +msgstr "" + +#: plinth/modules/config/config.py:205 +msgid "Domain name set" +msgstr "" + +#: plinth/modules/config/config.py:213 +#, python-brace-format +msgid "Error setting language: {exception}" +msgstr "" + +#: plinth/modules/config/config.py:216 +msgid "Language changed" +msgstr "" + +#: plinth/modules/config/templates/config.html:32 +msgid "Submit" +msgstr "" + +#: plinth/modules/datetime/__init__.py:39 +#: plinth/modules/datetime/templates/datetime.html:26 +#: plinth/modules/datetime/views.py:58 +msgid "Date & Time" +msgstr "" + +#: plinth/modules/datetime/__init__.py:44 +msgid "Network Time Server" +msgstr "" + +#: plinth/modules/datetime/__init__.py:76 +msgid "NTP client in contact with servers" +msgstr "" + +#: plinth/modules/datetime/forms.py:31 +msgid "Enable network time" +msgstr "" + +#: plinth/modules/datetime/forms.py:35 +msgid "Time Zone" +msgstr "" + +#: plinth/modules/datetime/forms.py:36 +msgid "" +"Set your time zone to get accurate timestamps. This will set the systemwide " +"time zone." +msgstr "" + +#: plinth/modules/datetime/forms.py:47 +msgid "-- no time zone set --" +msgstr "" + +#: plinth/modules/datetime/templates/datetime.html:29 +msgid "" +"Network time server is a program that maintians the system time in " +"synchronization with servers on the Internet." +msgstr "" + +#: plinth/modules/datetime/templates/datetime.html:40 +msgid "Network time server is running" +msgstr "" + +#: plinth/modules/datetime/templates/datetime.html:43 +msgid "Network time server is not running" +msgstr "" + +#: plinth/modules/datetime/views.py:93 +#, python-brace-format +msgid "Error setting time zone: {exception}" +msgstr "" + +#: plinth/modules/datetime/views.py:96 +msgid "Time zone set" +msgstr "" + +#: plinth/modules/deluge/__init__.py:38 plinth/modules/deluge/views.py:56 +msgid "BitTorrent (Deluge)" +msgstr "" + +#: plinth/modules/deluge/__init__.py:43 +msgid "Deluge BitTorrent" +msgstr "" + +#: plinth/modules/deluge/forms.py:29 +msgid "Enable Deluge" +msgstr "" + +#: plinth/modules/deluge/templates/deluge.html:26 +msgid "BitTorrent Web Client (Deluge)" +msgstr "" + +#: plinth/modules/deluge/templates/deluge.html:28 +msgid "Deluge is a BitTorrent client that features a Web UI." +msgstr "" + +#: plinth/modules/deluge/templates/deluge.html:31 +msgid "" +"When enabled, the Deluge web client will be available from /deluge path on the web server. The default password is 'deluge', but " +"you should log in and change it immediately after enabling this service." +msgstr "" + +#: plinth/modules/deluge/templates/deluge.html:44 +msgid "deluge-web is running" +msgstr "" + +#: plinth/modules/deluge/templates/deluge.html:47 +msgid "deluge-web is not running" +msgstr "" + +#: plinth/modules/diagnostics/diagnostics.py:45 +msgid "Diagnostics" +msgstr "" + +#: plinth/modules/diagnostics/diagnostics.py:55 +msgid "System Diagnostics" +msgstr "" + +#: plinth/modules/diagnostics/diagnostics.py:78 +msgid "Diagnostic Test" +msgstr "" + +#: plinth/modules/diagnostics/templates/diagnostics.html:37 +msgid "" +"The system diagnostic test will run a number of checks on your system to " +"confirm that applications and services are working as expected." +msgstr "" + +#: plinth/modules/diagnostics/templates/diagnostics.html:50 +#: plinth/modules/diagnostics/templates/diagnostics_button.html:27 +msgid "Run Diagnostics" +msgstr "" + +#: plinth/modules/diagnostics/templates/diagnostics.html:53 +msgid "Diagnotics test is currently running" +msgstr "" + +#: plinth/modules/diagnostics/templates/diagnostics.html:66 +msgid "Results" +msgstr "" + +#: plinth/modules/diagnostics/templates/diagnostics.html:74 +#, python-format +msgid "Module: %(module)s" +msgstr "" + +#: plinth/modules/diagnostics/templates/diagnostics_module.html:25 +msgid "Diagnostic Results" +msgstr "" + +#: plinth/modules/diagnostics/templates/diagnostics_module.html:27 +#, python-format +msgid "Module: %(module_name)s" +msgstr "" + +#: plinth/modules/diagnostics/templates/diagnostics_module.html:32 +msgid "This module does not support diagnostics" +msgstr "" + +#: plinth/modules/diagnostics/templates/diagnostics_results.html:27 +msgid "Test" +msgstr "" + +#: plinth/modules/diagnostics/templates/diagnostics_results.html:28 +msgid "Result" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:35 plinth/modules/help/help.py:40 +msgid "About" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:45 +#: plinth/modules/dynamicdns/dynamicdns.py:54 +msgid "Dynamic DNS" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:71 +msgid "" +"The Variables <User>, <Pass>, <Ip>, <Domain> may be " +"used within the URL. For details see the update URL templates of the example " +"providers." +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:75 +msgid "" +"Please choose an update protocol according to your provider. If your " +"provider does not support the GnudIP protocol or your provider is not listed " +"you may use the update URL of your provider." +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:80 +msgid "" +"Please do not enter a URL here (like \"https://example.com/\") but only the " +"hostname of the GnuDIP server (like \"example.com\")." +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:84 +#, python-brace-format +msgid "The public domain name you want use to reach your {box_name}." +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:87 +msgid "Use this option if your provider uses self signed certificates." +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:90 +msgid "" +"If this option is selected, your username and password will be used for HTTP " +"basic authentication." +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:93 +msgid "" +"Leave this field empty if you want to keep your previous configured password." +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:96 +#, python-brace-format +msgid "" +"Optional Value. If your {box_name} is not connected directly to the Internet " +"(i.e. connected to a NAT router) this URL is used to figure out the real " +"Internet IP. The URL should simply return the IP where the client comes from " +"(example: http://myip.datasystems24.de)." +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:104 +msgid "" +"You should have been requested to select a username when you created the " +"account." +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:115 +msgid "Enable Dynamic DNS" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:118 +msgid "Service type" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:123 +msgid "GnudIP Server Address" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:128 +msgid "Invalid server name" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:131 +msgid "Update URL" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:135 +msgid "Accept all SSL certificates" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:139 +msgid "Use HTTP basic authentication" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:151 +#: plinth/modules/networks/forms.py:146 plinth/modules/transmission/forms.py:39 +msgid "Username" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:154 +#: plinth/modules/networks/forms.py:147 plinth/modules/transmission/forms.py:43 +msgid "Password" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:157 +#: plinth/modules/networks/forms.py:149 +msgid "Show password" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:161 +msgid "IP check URL" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:187 +msgid "Please provide update URL or a GnuDIP Server" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:190 +msgid "Please provide GnuDIP username" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:193 +msgid "Please provide GnuDIP domain" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:198 +msgid "Please provide a password" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:217 +msgid "Configure Dynamic DNS" +msgstr "" + +#: plinth/modules/dynamicdns/dynamicdns.py:239 +msgid "Status of Dynamic DNS" +msgstr "" + +#: plinth/modules/dynamicdns/templates/dynamicdns.html:25 +msgid "Dynamic DNS Client" +msgstr "" + +#: plinth/modules/dynamicdns/templates/dynamicdns.html:28 +#, python-format +msgid "" +"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 %(box_name)s, such as ownCloud." +msgstr "" + +#: plinth/modules/dynamicdns/templates/dynamicdns.html:37 +msgid "" +"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 gnudip 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." +msgstr "" + +#: plinth/modules/dynamicdns/templates/dynamicdns.html:50 +msgid "" +"If you are looking for a free dynamic DNS account, you may find a free " +"GnuDIP service at gnudip.datasystems24.net or you may find free update URL " +"based services on " +"freedns.afraid.org." +msgstr "" + +#: plinth/modules/dynamicdns/templates/dynamicdns.html:61 +#, python-format +msgid "" +"If your %(box_name)s is connected behind some NAT router, don't forget to " +"add port forwarding (i.e. forward some standard ports like 80 and 443)." +msgstr "" + +#: plinth/modules/dynamicdns/templates/dynamicdns_configure.html:30 +msgid "" +"You have disabled Javascript. Dynamic form mode is disabled and some helper " +"functions may not work (but the main functionality should work)." +msgstr "" + +#: plinth/modules/dynamicdns/templates/dynamicdns_status.html:25 +msgid "NAT type" +msgstr "" + +#: plinth/modules/dynamicdns/templates/dynamicdns_status.html:29 +msgid "" +"NAT type not detected yet, if you do not provide a \"IP check URL\" we will " +"not detect a NAT type." +msgstr "" + +#: plinth/modules/dynamicdns/templates/dynamicdns_status.html:35 +msgid "Direct connection to the Internet." +msgstr "" + +#: plinth/modules/dynamicdns/templates/dynamicdns_status.html:37 +#, python-format +msgid "" +"Behind NAT. This means that Dynamic DNS service will poll the \"IP check URL" +"\" for changes (the \"IP check URL\" entry is needed for this - otherwise IP " +"changes will not be detected). In case the WAN IP changes, it may take up " +"to %(timer)s minutes until your DNS entry is updated." +msgstr "" + +#: plinth/modules/dynamicdns/templates/dynamicdns_status.html:48 +msgid "Last update" +msgstr "" + +#: plinth/modules/firewall/firewall.py:39 +#: plinth/modules/firewall/firewall.py:49 +#: plinth/modules/firewall/firewall.py:57 +msgid "Firewall" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:28 +#, python-format +msgid "" +"Firewall is a security system that controls the incoming and outgoing " +"network traffic on your %(box_name)s. Keeping a firewall enabled and " +"properly configured reduces risk of security threat from the Internet." +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:36 +msgid "Current status:" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:41 +#, python-format +msgid "" +"Firewall daemon is not running. Please run it. Firewall comes enabled by " +"default on %(box_name)s. On any Debian based system (such as %(box_name)s) " +"you may run it using the command 'service firewalld start' or in case of a " +"system with systemd 'systemctl start firewalld'." +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:56 +msgid "Service/Port" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:67 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:91 +#: plinth/modules/names/templates/names.html:51 +msgid "Enabled" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:70 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:93 +#: plinth/modules/names/templates/names.html:53 +msgid "Disabled" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:81 +msgid "Permitted" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:84 +msgid "Permitted (internal only)" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:87 +msgid "Permitted (external only)" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:90 +msgid "Blocked" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:103 +msgid "" +"The operation of the firewall is automatic. When you enable a service it is " +"also permitted in the firewall and when you disable a service it is also " +"disabled in the firewall." +msgstr "" + +#: plinth/modules/first_boot/forms.py:48 plinth/modules/users/forms.py:70 +msgid "Creating LDAP user failed." +msgstr "" + +#: plinth/modules/first_boot/forms.py:56 +msgid "Failed to add new user to admin group." +msgstr "" + +#: plinth/modules/first_boot/forms.py:78 +msgid "User account created, you are now logged in" +msgstr "" + +#: plinth/modules/first_boot/templates/firstboot_navbar.html:23 +#: plinth/modules/help/templates/help_index.html:25 +#: plinth/templates/base.html:102 +msgid "Help" +msgstr "" + +#: plinth/modules/first_boot/templates/firstboot_state0.html:45 +msgid "Start Setup" +msgstr "" + +#: plinth/modules/first_boot/templates/firstboot_state0.html:49 +#, python-format +msgid "" +"To complete the setup of your %(box_name)s, please provide some basic " +"information." +msgstr "" + +#: plinth/modules/first_boot/templates/firstboot_state1.html:41 +msgid "Administrator Account" +msgstr "" + +#: plinth/modules/first_boot/templates/firstboot_state1.html:44 +msgid "" +"Choose a username and password to access this web interface. The password " +"can be changed later. This user will be granted administrative privileges. " +"Other users can be added later." +msgstr "" + +#: plinth/modules/first_boot/templates/firstboot_state1.html:57 +msgid "Box it up!" +msgstr "" + +#: plinth/modules/first_boot/templates/firstboot_state10.html:29 +msgid "Setup Complete!" +msgstr "" + +#: plinth/modules/first_boot/templates/firstboot_state10.html:32 +#, python-format +msgid "" +"%(box_name)s setup is now complete. To make your %(box_name)s functional, " +"you need some applications. They will be installed the first time you " +"access them." +msgstr "" + +#: plinth/modules/first_boot/templates/firstboot_state10.html:41 +msgid "Go to Apps" +msgstr "" + +#: plinth/modules/first_boot/templates/firstboot_state10.html:44 +msgid "Current Network Configuration" +msgstr "" + +#: plinth/modules/first_boot/templates/firstboot_state10.html:47 +msgid "" +"You should check the network setup and modify it if necessary. Do not forget " +"to change the default Wi-Fi passwords!" +msgstr "" + +#: plinth/modules/first_boot/templates/firstboot_state10.html:57 +msgid "Go to Networks" +msgstr "" + +#: plinth/modules/first_boot/views.py:60 +msgid "Setup Complete" +msgstr "" + +#: plinth/modules/help/help.py:34 +msgid "Documentation" +msgstr "" + +#: plinth/modules/help/help.py:36 +msgid "Where to Get Help" +msgstr "" + +#: plinth/modules/help/help.py:38 +msgid "Manual" +msgstr "" + +#: plinth/modules/help/help.py:48 +msgid "Documentation and FAQ" +msgstr "" + +#: plinth/modules/help/help.py:55 +#, python-brace-format +msgid "About {box_name}" +msgstr "" + +#: plinth/modules/help/help.py:73 +#, python-brace-format +msgid "{box_name} Manual" +msgstr "" + +#: plinth/modules/help/templates/help_about.html:30 +#, python-format +msgid "" +"%(box_name)s 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." +msgstr "" + +#: plinth/modules/help/templates/help_about.html:43 +msgid "" +"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." +msgstr "" + +#: plinth/modules/help/templates/help_about.html:56 +#, python-format +msgid "" +"There are a number of projects working to realize a future of distributed " +"services; %(box_name)s aims to bring them all together in a convenient " +"package." +msgstr "" + +#: plinth/modules/help/templates/help_about.html:64 +#, python-format +msgid "" +"For more information about the %(box_name)s project, see the %(box_name)s Wiki." +msgstr "" + +#: plinth/modules/help/templates/help_about.html:73 +msgid "Learn more »" +msgstr "" + +#: plinth/modules/help/templates/help_about.html:76 +#, python-format +msgid "You are running Plinth version %(version)s." +msgstr "" + +#: plinth/modules/help/templates/help_base.html:36 +#, python-format +msgid "%(box_name)s Setup" +msgstr "" + +#: plinth/modules/help/templates/help_index.html:29 +#, python-format +msgid "" +"The %(box_name)s Manual is the best place to " +"start for information regarding %(box_name)s." +msgstr "" + +#: plinth/modules/help/templates/help_index.html:36 +#, python-format +msgid "" +" " +"%(box_name)s project wiki contains further information." +msgstr "" + +#: plinth/modules/help/templates/help_index.html:43 +#, python-format +msgid "" +"To seek help from %(box_name)s community, queries may be posted on the mailing list. The list archives also contain information about " +"problems faced by other users and possible solutions." +msgstr "" + +#: plinth/modules/help/templates/help_index.html:53 +#, python-format +msgid "" +"Many %(box_name)s contributors and users are also available on the irc.oftc." +"net IRC network. Join and request help on the #freedombox " +"channel using the IRC web interface." +msgstr "" + +#: plinth/modules/ikiwiki/__init__.py:38 +msgid "Wiki and Blog (ikiwiki)" +msgstr "" + +#: plinth/modules/ikiwiki/__init__.py:43 +msgid "ikiwiki wikis and blogs" +msgstr "" + +#: plinth/modules/ikiwiki/forms.py:29 +msgid "Enable ikiwiki" +msgstr "" + +#: plinth/modules/ikiwiki/forms.py:36 +#: plinth/modules/networks/templates/connection_show.html:98 +msgid "Type" +msgstr "" + +#: plinth/modules/ikiwiki/forms.py:39 +#: plinth/modules/networks/templates/connection_show.html:78 +msgid "Name" +msgstr "" + +#: plinth/modules/ikiwiki/forms.py:41 +msgid "Admin Account Name" +msgstr "" + +#: plinth/modules/ikiwiki/forms.py:44 +msgid "Admin Account Password" +msgstr "" + +#: plinth/modules/ikiwiki/templates/ikiwiki.html:27 +msgid "" +"When enabled, the blogs and wikis will be available from /ikiwiki." +msgstr "" + +#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:27 +#, python-format +msgid "Delete Wiki or Blog %(name)s" +msgstr "" + +#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:33 +msgid "" +"This action will remove all the posts, pages and comments including revision " +"history. Delete this wiki or blog permanently?" +msgstr "" + +#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:44 +#, python-format +msgid "Delete %(name)s" +msgstr "" + +#: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:47 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:60 +#: plinth/modules/networks/templates/connections_delete.html:41 +#: plinth/modules/users/templates/users_delete.html:41 +msgid "Cancel" +msgstr "" + +#: plinth/modules/ikiwiki/templates/ikiwiki_manage.html:41 +msgid "No wikis or blogs available." +msgstr "" + +#: plinth/modules/ikiwiki/templates/ikiwiki_manage.html:45 +msgid "Create a Wiki or Blog" +msgstr "" + +#: plinth/modules/ikiwiki/templates/ikiwiki_manage.html:55 +#, python-format +msgid "Delete site %(site)s" +msgstr "" + +#: plinth/modules/ikiwiki/templates/ikiwiki_manage.html:61 +#, python-format +msgid "Go to site %(site)s" +msgstr "" + +#: plinth/modules/ikiwiki/views.py:38 +msgid "Manage" +msgstr "" + +#: plinth/modules/ikiwiki/views.py:40 +msgid "Create" +msgstr "" + +#: plinth/modules/ikiwiki/views.py:73 +msgid "Wiki and Blog" +msgstr "" + +#: plinth/modules/ikiwiki/views.py:106 +msgid "Manage Wikis and Blogs" +msgstr "" + +#: plinth/modules/ikiwiki/views.py:132 +msgid "Create Wiki or Blog" +msgstr "" + +#: plinth/modules/ikiwiki/views.py:145 +#, python-brace-format +msgid "Created wiki {name}." +msgstr "" + +#: plinth/modules/ikiwiki/views.py:147 +#, python-brace-format +msgid "Could not create wiki: {error}" +msgstr "" + +#: plinth/modules/ikiwiki/views.py:159 +#, python-brace-format +msgid "Created blog {name}." +msgstr "" + +#: plinth/modules/ikiwiki/views.py:161 +#, python-brace-format +msgid "Could not create blog: {error}" +msgstr "" + +#: plinth/modules/ikiwiki/views.py:174 +#, python-brace-format +msgid "{name} deleted." +msgstr "" + +#: plinth/modules/ikiwiki/views.py:176 +#, python-brace-format +msgid "Could not delete {name}: {error}" +msgstr "" + +#: plinth/modules/ikiwiki/views.py:182 +msgid "Delete Wiki or Blog" +msgstr "" + +#: plinth/modules/letsencrypt/__init__.py:43 +#: plinth/modules/letsencrypt/templates/letsencrypt.html:38 +#: plinth/modules/letsencrypt/views.py:45 +msgid "Certificates (Let's Encrypt)" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:41 +#, python-format +msgid "" +"A digital certficate allows users of a web service to verify the identity of " +"the service and to securely communicate with it. %(box_name)s can " +"automatically obtain and setup digital certificates for each available " +"domain. It does so by proving itself to be the owner of a domain to Let's " +"Encrypt, a certficate authority (CA)." +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:52 +msgid "" +"Let's Encrypt is a free, automated, and open certificate authority, run for " +"the public’s benefit by the Internet Security Research Group (ISRG). Please " +"read and agree with the Let's Encrypt Subscriber Agreement before using this service." +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:66 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:70 +msgid "Domain" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:67 +msgid "Certificate Status" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:68 +msgid "Website Security" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:69 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:72 +msgid "Actions" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:79 +#, python-format +msgid "Expires on %(expiry_date)s" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:85 +msgid "No certficate" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:102 +msgid "Revoke" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:108 +msgid "Re-obtain" +msgstr "" + +#: plinth/modules/letsencrypt/templates/letsencrypt.html:115 +msgid "Obtain" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:55 +#, python-brace-format +msgid "Certificate successfully revoked for domain {domain}" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:60 +#, python-brace-format +msgid "Failed to revoke certificate for domain {domain}: {error}" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:72 +#, python-brace-format +msgid "Certificate successfully obtained for domain {domain}" +msgstr "" + +#: plinth/modules/letsencrypt/views.py:77 +#, python-brace-format +msgid "Failed to obtain certificate for domain {domain}: {error}" +msgstr "" + +#: plinth/modules/monkeysphere/__init__.py:32 +#: plinth/modules/monkeysphere/templates/monkeysphere.html:35 +#: plinth/modules/monkeysphere/views.py:44 +msgid "Monkeysphere" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:38 +msgid "" +"With Monkeysphere, a PGP key can be generated for each configured domain " +"serving SSH. The PGP public key can then be uploaded to the PGP keyservers. " +"Users connecting to this machine through SSH can verify that they are " +"connecting to the correct host. For users to trust the key, at least one " +"person (usually the machine owner) must sign the key using the regular PGP " +"key signing process. See the Monkeysphere SSH documentation for more details." +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:53 +msgid "Publishing key to keyserver..." +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:71 +msgid "GPG Fingerprint" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:83 +#: plinth/modules/names/views.py:45 +msgid "Not Available" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:93 +msgid "Generate PGP Key" +msgstr "" + +#: plinth/modules/monkeysphere/templates/monkeysphere.html:101 +msgid "Publish Key" +msgstr "" + +#: plinth/modules/monkeysphere/views.py:58 +msgid "Generated PGP key." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:83 +msgid "Cancelled key publishing." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:120 +msgid "Published key to keyserver." +msgstr "" + +#: plinth/modules/monkeysphere/views.py:122 +msgid "Error occurred while publishing key." +msgstr "" + +#: plinth/modules/mumble/__init__.py:38 +#: plinth/modules/mumble/templates/mumble.html:26 +#: plinth/modules/mumble/views.py:58 +msgid "Voice Chat (Mumble)" +msgstr "" + +#: plinth/modules/mumble/__init__.py:43 +msgid "Mumble Voice Chat Server" +msgstr "" + +#: plinth/modules/mumble/forms.py:29 +msgid "Enable Mumble daemon" +msgstr "" + +#: plinth/modules/mumble/templates/mumble.html:29 +msgid "" +"Mumble is an open source, low-latency, encrypted, high quality voice chat " +"software." +msgstr "" + +#: plinth/modules/mumble/templates/mumble.html:36 +msgid "" +"You can connect to your Mumble server on the regular Mumble port 64738. Clients to connect to Mumble from your " +"desktop and Android devices are available." +msgstr "" + +#: plinth/modules/mumble/templates/mumble.html:49 +msgid "Mumble server is running" +msgstr "" + +#: plinth/modules/mumble/templates/mumble.html:52 +msgid "Mumble server is not running" +msgstr "" + +#: plinth/modules/names/__init__.py:29 +msgid "HTTP" +msgstr "" + +#: plinth/modules/names/__init__.py:30 +msgid "HTTPS" +msgstr "" + +#: plinth/modules/names/__init__.py:31 +msgid "SSH" +msgstr "" + +#: plinth/modules/names/__init__.py:45 plinth/modules/names/views.py:34 +msgid "Name Services" +msgstr "" + +#: plinth/modules/networks/__init__.py:108 +#, python-brace-format +msgid "Using DNSSEC on IPv{kind}" +msgstr "" + +#: plinth/modules/networks/forms.py:30 +msgid "Connection Type" +msgstr "" + +#: plinth/modules/networks/forms.py:37 +msgid "Connection Name" +msgstr "" + +#: plinth/modules/networks/forms.py:39 +msgid "Physical Interface" +msgstr "" + +#: plinth/modules/networks/forms.py:41 +msgid "The network device that this connection should be bound to." +msgstr "" + +#: plinth/modules/networks/forms.py:44 +msgid "Firewall Zone" +msgstr "" + +#: plinth/modules/networks/forms.py:45 +msgid "" +"The firewall zone will control which services are available over this " +"interfaces. Select Internal only for trusted networks." +msgstr "" + +#: plinth/modules/networks/forms.py:49 +msgid "IPv4 Addressing Method" +msgstr "" + +#: plinth/modules/networks/forms.py:50 +msgid "" +"\"Shared\" method will start a DHCP server and \"Automatic\" method will " +"acquire configuration from a DHCP server." +msgstr "" + +#: plinth/modules/networks/forms.py:56 +msgid "Address" +msgstr "" + +#: plinth/modules/networks/forms.py:60 +msgid "Netmask" +msgstr "" + +#: plinth/modules/networks/forms.py:61 +msgid "" +"Optional value. If left blank, a default netmask based on the address will " +"be used." +msgstr "" + +#: plinth/modules/networks/forms.py:66 +#: plinth/modules/networks/templates/connection_show.html:202 +#: plinth/modules/networks/templates/connection_show.html:241 +msgid "Gateway" +msgstr "" + +#: plinth/modules/networks/forms.py:67 +msgid "Optional value." +msgstr "" + +#: plinth/modules/networks/forms.py:71 +msgid "DNS Server" +msgstr "" + +#: plinth/modules/networks/forms.py:72 +msgid "" +"Optional value. If this value is given and IPv4 addressing method is " +"\"Automatic\", the DNS Servers provided by a DHCP server will be ignored." +msgstr "" + +#: plinth/modules/networks/forms.py:78 +msgid "Second DNS Server" +msgstr "" + +#: plinth/modules/networks/forms.py:79 +msgid "" +"Optional value. If this value is given and IPv4 Addressing Method is " +"\"Automatic\", the DNS Servers provided by a DHCP server will be ignored." +msgstr "" + +#: plinth/modules/networks/forms.py:89 +msgid "-- select --" +msgstr "" + +#: plinth/modules/networks/forms.py:175 +#: plinth/modules/networks/templates/connection_show.html:144 +msgid "SSID" +msgstr "" + +#: plinth/modules/networks/forms.py:176 +msgid "The visible name of the network." +msgstr "" + +#: plinth/modules/networks/forms.py:178 +#: plinth/modules/networks/templates/connection_show.html:157 +msgid "Mode" +msgstr "" + +#: plinth/modules/networks/forms.py:183 +msgid "Authentication Mode" +msgstr "" + +#: plinth/modules/networks/forms.py:184 +msgid "" +"Select WPA if the wireless network is secured and requires clients to have " +"the password to connect." +msgstr "" + +#: plinth/modules/networks/forms.py:188 +msgid "Passphrase" +msgstr "" + +#: plinth/modules/networks/networks.py:36 +#: plinth/modules/networks/networks.py:56 +msgid "Network Connections" +msgstr "" + +#: plinth/modules/networks/networks.py:38 +#: plinth/modules/networks/networks.py:242 +msgid "Nearby Wi-Fi Networks" +msgstr "" + +#: plinth/modules/networks/networks.py:40 +#: plinth/modules/networks/networks.py:264 +msgid "Add Connection" +msgstr "" + +#: plinth/modules/networks/networks.py:46 +msgid "Networks" +msgstr "" + +#: plinth/modules/networks/networks.py:66 +msgid "Cannot show connection: Connection not found." +msgstr "" + +#: plinth/modules/networks/networks.py:100 +msgid "Show Connection information" +msgstr "" + +#: plinth/modules/networks/networks.py:113 +msgid "Cannot edit connection: Connection not found." +msgstr "" + +#: plinth/modules/networks/networks.py:119 +msgid "This type of connection is not yet understood." +msgstr "" + +#: plinth/modules/networks/networks.py:139 +#: plinth/modules/networks/networks.py:198 +#: plinth/modules/networks/templates/connections_edit.html:34 +msgid "Edit Connection" +msgstr "" + +#: plinth/modules/networks/networks.py:209 +#, python-brace-format +msgid "Activated connection {name}." +msgstr "" + +#: plinth/modules/networks/networks.py:212 +msgid "Failed to activate connection: Connection not found." +msgstr "" + +#: plinth/modules/networks/networks.py:216 +#, python-brace-format +msgid "Failed to activate connection {name}: No suitable device is available." +msgstr "" + +#: plinth/modules/networks/networks.py:229 +#, python-brace-format +msgid "Deactivated connection {name}." +msgstr "" + +#: plinth/modules/networks/networks.py:232 +msgid "Failed to de-activate connection: Connection not found." +msgstr "" + +#: plinth/modules/networks/networks.py:282 +msgid "Adding New Ethernet Connection" +msgstr "" + +#: plinth/modules/networks/networks.py:300 +msgid "Adding New PPPoE Connection" +msgstr "" + +#: plinth/modules/networks/networks.py:332 +msgid "Adding New Wi-Fi Connection" +msgstr "" + +#: plinth/modules/networks/networks.py:346 +#, python-brace-format +msgid "Connection {name} deleted." +msgstr "" + +#: plinth/modules/networks/networks.py:349 +#: plinth/modules/networks/networks.py:358 +msgid "Failed to delete connection: Connection not found." +msgstr "" + +#: plinth/modules/networks/networks.py:363 +#: plinth/modules/networks/templates/connections_delete.html:26 +msgid "Delete Connection" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:43 +msgid "Edit connection" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:43 +#: plinth/templates/base.html:123 +msgid "Edit" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:50 +#: plinth/modules/networks/templates/connections_list.html:78 +msgid "Deactivate" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:57 +#: plinth/modules/networks/templates/connections_list.html:86 +msgid "Activate" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:63 +msgid "Delete connection" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:63 +msgid "Delete" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:66 +#: plinth/modules/networks/templates/connections_diagram.html:73 +#: plinth/modules/networks/templates/connections_diagram.html:76 +#: plinth/modules/networks/templates/connections_diagram.html:105 +#: plinth/modules/networks/templates/connections_diagram.html:127 +msgid "Connection" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:71 +msgid "Primary connection" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:73 +#: plinth/modules/networks/templates/connection_show.html:217 +#: plinth/modules/networks/templates/connection_show.html:256 +msgid "yes" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:84 +msgid "Device" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:88 +msgid "State" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:93 +msgid "State reason" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:102 +msgid "MAC address" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:106 +msgid "Interface" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:110 +msgid "Description" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:116 +msgid "Physical Link" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:121 +msgid "Link state" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:125 +msgid "cable is connected" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:128 +msgid "please check cable" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:133 +#: plinth/modules/networks/templates/connection_show.html:149 +msgid "Speed" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:135 +#, python-format +msgid "%(ethernet_speed)s Mbit/s" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:151 +#, python-format +msgid "%(wireless_bitrate)s Mbit/s" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:163 +msgid "Signal strength" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:173 +msgid "Channel" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:181 +msgid "IPv4" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:186 +#: plinth/modules/networks/templates/connection_show.html:227 +msgid "Method" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:193 +#: plinth/modules/networks/templates/connection_show.html:234 +msgid "IP address" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:209 +#: plinth/modules/networks/templates/connection_show.html:248 +msgid "DNS server" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:216 +#: plinth/modules/networks/templates/connection_show.html:255 +msgid "Default" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:222 +msgid "IPv6" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:263 +msgid "This connection is not active." +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:266 +msgid "Security" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:271 +#: plinth/modules/networks/templates/connection_show.html:291 +#: plinth/modules/networks/templates/connection_show.html:310 +msgid "Firewall zone" +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:280 +msgid "" +"This interface should be connected to a 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." +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:300 +msgid "" +"This interface should receive your Internet connection. If you connect it to " +"a local network/machine, many services meant to available only internally " +"will not be available." +msgstr "" + +#: plinth/modules/networks/templates/connection_show.html:319 +#, python-format +msgid "" +"This interface is not maintained by %(box_name)s. Its security status is " +"unknown to %(box_name)s. Many %(box_name)s services may not be available on " +"this interface. It is recommended that you deactivate or delete this " +"connection and re-configure it." +msgstr "" + +#: plinth/modules/networks/templates/connections_add.html:34 +#: plinth/modules/networks/templates/connections_type_select.html:34 +msgid "Create..." +msgstr "" + +#: plinth/modules/networks/templates/connections_create.html:34 +msgid "Create Connection" +msgstr "" + +#: plinth/modules/networks/templates/connections_delete.html:29 +#, python-format +msgid "Delete connection %(name)s permanently?" +msgstr "" + +#: plinth/modules/networks/templates/connections_diagram.html:65 +msgid "Internet" +msgstr "" + +#: plinth/modules/networks/templates/connections_diagram.html:70 +#: plinth/modules/networks/templates/connections_diagram.html:102 +msgid "Spacing" +msgstr "" + +#: plinth/modules/networks/templates/connections_diagram.html:78 +msgid "External" +msgstr "" + +#: plinth/modules/networks/templates/connections_diagram.html:83 +#: plinth/modules/networks/templates/connections_diagram.html:113 +#: plinth/network.py:37 +msgid "Ethernet" +msgstr "" + +#: plinth/modules/networks/templates/connections_diagram.html:86 +#: plinth/modules/networks/templates/connections_diagram.html:116 +#: plinth/network.py:38 +msgid "Wi-Fi" +msgstr "" + +#: plinth/modules/networks/templates/connections_diagram.html:89 +#, python-format +msgid "Show connection %(connection.name)s" +msgstr "" + +#: plinth/modules/networks/templates/connections_diagram.html:107 +msgid "Internal" +msgstr "" + +#: plinth/modules/networks/templates/connections_diagram.html:119 +#, python-format +msgid "Show connection %(name)s" +msgstr "" + +#: plinth/modules/networks/templates/connections_diagram.html:131 +msgid "Computer" +msgstr "" + +#: plinth/modules/networks/templates/connections_list.html:67 +#, python-format +msgid "Delete connection %(name)s" +msgstr "" + +#: plinth/modules/networks/templates/connections_list.html:92 +msgid "Active" +msgstr "" + +#: plinth/modules/networks/templates/connections_list.html:95 +msgid "Inactive" +msgstr "" + +#: plinth/modules/openvpn/__init__.py:38 +#: plinth/modules/openvpn/templates/openvpn.html:35 +#: plinth/modules/openvpn/views.py:62 +msgid "Virtual Private Network (OpenVPN)" +msgstr "" + +#: plinth/modules/openvpn/__init__.py:43 +msgid "OpenVPN" +msgstr "" + +#: plinth/modules/openvpn/forms.py:29 +msgid "Enable OpenVPN server" +msgstr "" + +#: plinth/modules/openvpn/templates/openvpn.html:38 +#, python-format +msgid "" +"Virtual Private Network (VPN) is a technique for securely connecting two " +"devices in order to access resources of a private network. While you are " +"away from home, you can connect to your %(box_name)s in order to join your " +"home network and access private/internal services provided by %(box_name)s. " +"You can also access the rest of the Internet via %(box_name)s for added " +"security and anonymity." +msgstr "" + +#: plinth/modules/openvpn/templates/openvpn.html:51 +msgid "Profile" +msgstr "" + +#: plinth/modules/openvpn/templates/openvpn.html:54 +#, python-format +msgid "" +"To connect to %(box_name)s'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 documentation on recommended clients and instructions on how to " +"configure them." +msgstr "" + +#: plinth/modules/openvpn/templates/openvpn.html:66 +#, python-format +msgid "Profile is specific to each user of %(box_name)s. Keep it a secret." +msgstr "" + +#: plinth/modules/openvpn/templates/openvpn.html:76 +msgid "Download my profile" +msgstr "" + +#: plinth/modules/openvpn/templates/openvpn.html:85 +#, python-format +msgid "" +"OpenVPN has not yet been setup. Performing a secure setup takes a very long " +"time. Depending on how fast your %(box_name)s is, it may even take hours. " +"If the setup is interrupted, you may start it again." +msgstr "" + +#: plinth/modules/openvpn/templates/openvpn.html:97 +msgid "Start setup" +msgstr "" + +#: plinth/modules/openvpn/templates/openvpn.html:104 +msgid "OpenVPN setup is running" +msgstr "" + +#: plinth/modules/openvpn/templates/openvpn.html:108 +#, python-format +msgid "" +"To perform a secure setup, this process takes a very long time. Depending " +"on how fast your %(box_name)s is, it may even take hours. If the setup is " +"interrupted, you may start it again." +msgstr "" + +#: plinth/modules/openvpn/templates/openvpn.html:121 +msgid "OpenVPN server is running" +msgstr "" + +#: plinth/modules/openvpn/templates/openvpn.html:124 +msgid "OpenVPN server is not running" +msgstr "" + +#: plinth/modules/openvpn/views.py:124 +msgid "Setup completed." +msgstr "" + +#: plinth/modules/openvpn/views.py:126 +msgid "Setup failed." +msgstr "" + +#: plinth/modules/owncloud/owncloud.py:38 +msgid "Enable ownCloud" +msgstr "" + +#: plinth/modules/owncloud/owncloud.py:44 +#: plinth/modules/owncloud/templates/owncloud.html:26 +msgid "File Hosting (ownCloud)" +msgstr "" + +#: plinth/modules/owncloud/owncloud.py:51 +#: plinth/modules/owncloud/owncloud.py:80 +msgid "ownCloud" +msgstr "" + +#: plinth/modules/owncloud/owncloud.py:97 +msgid "ownCloud enabled" +msgstr "" + +#: plinth/modules/owncloud/owncloud.py:100 +msgid "ownCloud disabled" +msgstr "" + +#: plinth/modules/owncloud/templates/owncloud.html:29 +msgid "" +"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." +msgstr "" + +#: plinth/modules/owncloud/templates/owncloud.html:41 +msgid "" +"When enabled, the ownCloud installation will be available from /owncloud path on the web server. Visit this URL to set up " +"the initial administration account for ownCloud." +msgstr "" + +#: plinth/modules/owncloud/templates/owncloud.html:59 +msgid "Apply changes" +msgstr "" + +#: plinth/modules/pagekite/__init__.py:35 plinth/modules/pagekite/views.py:46 +msgid "Public Visibility (PageKite)" +msgstr "" + +#: plinth/modules/pagekite/forms.py:46 +msgid "Enable PageKite" +msgstr "" + +#: plinth/modules/pagekite/forms.py:49 +msgid "Server domain" +msgstr "" + +#: plinth/modules/pagekite/forms.py:51 +msgid "" +"Select your pagekite server. Set \"pagekite.net\" to use the default " +"pagekite.net server." +msgstr "" + +#: plinth/modules/pagekite/forms.py:55 +msgid "Server port" +msgstr "" + +#: plinth/modules/pagekite/forms.py:56 +msgid "Port of your pagekite server (default: 80)" +msgstr "" + +#: plinth/modules/pagekite/forms.py:58 +msgid "Kite name" +msgstr "" + +#: plinth/modules/pagekite/forms.py:59 +msgid "Example: mybox.pagekite.me" +msgstr "" + +#: plinth/modules/pagekite/forms.py:62 +msgid "Invalid kite name" +msgstr "" + +#: plinth/modules/pagekite/forms.py:65 +msgid "Kite secret" +msgstr "" + +#: plinth/modules/pagekite/forms.py:67 +msgid "" +"A secret associated with the kite or the default secret for your account if " +"no secret is set on the kite." +msgstr "" + +#: plinth/modules/pagekite/forms.py:83 +msgid "Kite details set" +msgstr "" + +#: plinth/modules/pagekite/forms.py:90 +msgid "Pagekite server set" +msgstr "" + +#: plinth/modules/pagekite/forms.py:96 +msgid "PageKite enabled" +msgstr "" + +#: plinth/modules/pagekite/forms.py:99 +msgid "PageKite disabled" +msgstr "" + +#: plinth/modules/pagekite/forms.py:135 +#, python-brace-format +msgid "Service enabled: {name}" +msgstr "" + +#: plinth/modules/pagekite/forms.py:139 +#, python-brace-format +msgid "Service disabled: {name}" +msgstr "" + +#: plinth/modules/pagekite/forms.py:150 +msgid "protocol" +msgstr "" + +#: plinth/modules/pagekite/forms.py:153 +msgid "external (frontend) port" +msgstr "" + +#: plinth/modules/pagekite/forms.py:156 +msgid "internal (freedombox) port" +msgstr "" + +#: plinth/modules/pagekite/forms.py:158 +msgid "Enable Subdomains" +msgstr "" + +#: plinth/modules/pagekite/forms.py:191 +msgid "Deleted custom service" +msgstr "" + +#: plinth/modules/pagekite/forms.py:225 +msgid "" +"This service is available as a standard service. Please use the \"Standard " +"Services\" page to enable it." +msgstr "" + +#: plinth/modules/pagekite/forms.py:234 +msgid "Added custom service" +msgstr "" + +#: plinth/modules/pagekite/forms.py:237 +msgid "This service already exists" +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_configure.html:33 +msgid "PageKite Account" +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_configure.html:41 +msgid "Save settings" +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_custom_services.html:44 +msgid "" +"Warning:
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." +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_custom_services.html:56 +msgid "Create a custom service" +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_custom_services.html:64 +msgid "Add Service" +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_custom_services.html:71 +msgid "Existing custom services" +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_custom_services.html:74 +msgid "You don't have any Custom Services enabled" +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_custom_services.html:89 +#, python-format +msgid "connected to %(backend_host)s:%(backend_port)s" +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_custom_services.html:101 +msgid "Delete this service" +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_introduction.html:26 +#, python-format +msgid "" +"PageKite is a system for exposing %(box_name)s services when you don't have " +"a direct connection to the Internet. You only need this if your %(box_name)s " +"services are unreachable from the rest of the Internet. This includes the " +"following situations:" +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_introduction.html:37 +#, python-format +msgid "%(box_name)s is behind a restricted firewall." +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_introduction.html:43 +#, python-format +msgid "" +"%(box_name)s is connected to a (wireless) router which you don't control." +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_introduction.html:50 +msgid "" +"Your ISP does not provide you an external IP address and instead provides " +"Internet connection through NAT." +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_introduction.html:57 +msgid "" +"Your ISP does not provide you a static IP address and your IP address " +"changes evertime you connect to Internet." +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_introduction.html:63 +msgid "Your ISP limits incoming connections." +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_introduction.html:67 +#, python-format +msgid "" +"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 pagekite.net. In " +"future it might be possible to use your buddy's %(box_name)s for this." +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_introduction.html:78 +#: plinth/modules/pagekite/views.py:36 +msgid "Configure PageKite" +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_standard_services.html:40 +msgid "Warning:
" +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_standard_services.html:43 +msgid "" +"Published services are accessible and attackable from the evil internet." +msgstr "" + +#: plinth/modules/pagekite/templates/pagekite_standard_services.html:58 +msgid "Save Services" +msgstr "" + +#: plinth/modules/pagekite/utils.py:53 +msgid "Web Server (HTTP)" +msgstr "" + +#: plinth/modules/pagekite/utils.py:54 +#, python-brace-format +msgid "Site will be available at http://{0}" +msgstr "" + +#: plinth/modules/pagekite/utils.py:63 +msgid "Web Server (HTTPS)" +msgstr "" + +#: plinth/modules/pagekite/utils.py:64 +#, python-brace-format +msgid "Site will be available at https://{0}" +msgstr "" + +#: plinth/modules/pagekite/utils.py:73 +msgid "Secure Shell (SSH)" +msgstr "" + +#: plinth/modules/pagekite/utils.py:74 +msgid "" +"See SSH client setup instructions" +msgstr "" + +#: plinth/modules/pagekite/utils.py:276 +msgid "Pagekite" +msgstr "" + +#: plinth/modules/pagekite/views.py:34 +msgid "About PageKite" +msgstr "" + +#: plinth/modules/pagekite/views.py:38 +msgid "Standard Services" +msgstr "" + +#: plinth/modules/pagekite/views.py:40 +msgid "Custom Services" +msgstr "" + +#: plinth/modules/power/__init__.py:32 plinth/modules/power/views.py:33 +#: plinth/modules/power/views.py:47 plinth/modules/power/views.py:62 +msgid "Power" +msgstr "" + +#: plinth/modules/power/templates/power.html:29 +msgid "Restart or shut down the system." +msgstr "" + +#: plinth/modules/power/templates/power.html:34 +msgid "Restart »" +msgstr "" + +#: plinth/modules/power/templates/power.html:37 +msgid "Shut Down »" +msgstr "" + +#: plinth/modules/power/templates/power_restart.html:29 +msgid "" +"Are you sure you want to restart? You will not be able to access this web " +"interface for a few minutes until the system is restarted." +msgstr "" + +#: plinth/modules/power/templates/power_restart.html:42 +msgid "Restart Now" +msgstr "" + +#: plinth/modules/power/templates/power_shutdown.html:29 +msgid "" +"Are you sure you want to shut down? You will not be able to access this web " +"interface after shut down." +msgstr "" + +#: plinth/modules/power/templates/power_shutdown.html:41 +msgid "Shut Down Now" +msgstr "" + +#: plinth/modules/privoxy/__init__.py:39 +#: plinth/modules/privoxy/templates/privoxy.html:26 +#: plinth/modules/privoxy/views.py:59 +msgid "Web Proxy (Privoxy)" +msgstr "" + +#: plinth/modules/privoxy/__init__.py:44 +msgid "Privoxy Web Proxy" +msgstr "" + +#: plinth/modules/privoxy/__init__.py:86 +#, python-brace-format +msgid "Access {url} with proxy {proxy} on tcp{kind}" +msgstr "" + +#: plinth/modules/privoxy/forms.py:29 +msgid "Enable Privoxy" +msgstr "" + +#: plinth/modules/privoxy/templates/privoxy.html:29 +msgid "" +"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." +msgstr "" + +#: plinth/modules/privoxy/templates/privoxy.html:38 +#, python-format +msgid "" +"You can use Privoxy by modifying your browser proxy settings to your " +"%(box_name)s hostname (or IP address) with port 8118. While using Privoxy, " +"you can see its configuration details and documentation at http://config.privoxy.org/ or http://p.p." +msgstr "" + +#: plinth/modules/privoxy/templates/privoxy.html:53 +msgid "Privoxy is running" +msgstr "" + +#: plinth/modules/privoxy/templates/privoxy.html:56 +msgid "Privoxy is not running" +msgstr "" + +#: plinth/modules/quassel/__init__.py:36 +#: plinth/modules/quassel/templates/quassel.html:26 +#: plinth/modules/quassel/views.py:54 +msgid "IRC Client (Quassel)" +msgstr "" + +#: plinth/modules/quassel/__init__.py:41 +msgid "Quassel IRC Client" +msgstr "" + +#: plinth/modules/quassel/forms.py:29 +msgid "Enable Quassel core service" +msgstr "" + +#: plinth/modules/quassel/templates/quassel.html:29 +#, python-format +msgid "" +"Quassel is an IRC application that is split into two parts, a \"core\" and a " +"\"client\". This allows the core to remain connected to IRC servers, and to " +"continue receiving messages, even when the client is disconnected. " +"%(box_name)s can run the Quassel core service keeping you always online and " +"one or more Quassel clients from a desktop or a mobile can be used to " +"connect and disconnect from it." +msgstr "" + +#: plinth/modules/quassel/templates/quassel.html:41 +msgid "" +"You can connect to your Quassel core on the default Quassel port 4242. " +"Clients to connect to Quassel from your desktop and mobile devices are available." +msgstr "" + +#: plinth/modules/quassel/templates/quassel.html:55 +msgid "Quassel core service is running" +msgstr "" + +#: plinth/modules/quassel/templates/quassel.html:58 +msgid "Quassel core service is not running" +msgstr "" + +#: plinth/modules/repro/__init__.py:36 +#: plinth/modules/repro/templates/repro.html:26 +#: plinth/modules/repro/views.py:55 +msgid "SIP Server (repro)" +msgstr "" + +#: plinth/modules/repro/__init__.py:41 +msgid "repro SIP Server" +msgstr "" + +#: plinth/modules/repro/forms.py:29 +msgid "Enable repro service" +msgstr "" + +#: plinth/modules/repro/templates/repro.html:29 +msgid "" +"repro provides various SIP services that a SIP softphone can utilize to " +"provide audio and video calls as well as presence and instant messaging. " +"repro provides a server and SIP user accounts that clients can use to let " +"their presence known. It also acts as a proxy to federate SIP " +"communications to other servers on the Internet similar to email." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:39 +msgid "" +"To make SIP calls, a client application is needed. Available clients include " +"Jitsi (for computers) and CSipSimple (for Android phones)." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:48 +msgid "" +"Note: Before using repro, domains and users will need to " +"be configured using the web-based " +"configuration panel. Users in the admin group will be able to " +"log in to the repro configuration panel. After setting the domain, it is " +"required to restart the repro service. Disable the service and re-enable it." +msgstr "" + +#: plinth/modules/repro/templates/repro.html:63 +msgid "repro service is running" +msgstr "" + +#: plinth/modules/repro/templates/repro.html:66 +msgid "repro service is not running" +msgstr "" + +#: plinth/modules/restore/__init__.py:36 +#: plinth/modules/restore/templates/restore_index.html:26 +#: plinth/modules/restore/views.py:46 +msgid "Unhosted Storage (reStore)" +msgstr "" + +#: plinth/modules/restore/__init__.py:41 +msgid "reStore" +msgstr "" + +#: plinth/modules/restore/forms.py:29 +msgid "Enable reStore" +msgstr "" + +#: plinth/modules/restore/templates/restore_index.html:29 +#, python-format +msgid "" +"reStore is a server for unhosted web " +"applications. The idea is to uncouple web applications from data. No " +"matter where a web application is served from, the data can be stored on an " +"unhosted storage server of user's choice. With reStore, your %(box_name)s " +"becomes your unhosted storage server." +msgstr "" + +#: plinth/modules/restore/templates/restore_index.html:40 +msgid "" +"You can create and edit accounts in the reStore web-" +"interface." +msgstr "" + +#: plinth/modules/roundcube/__init__.py:36 +#: plinth/modules/roundcube/templates/roundcube.html:26 +#: plinth/modules/roundcube/views.py:64 +msgid "Email Client (Roundcube)" +msgstr "" + +#: plinth/modules/roundcube/forms.py:29 +msgid "Enable Roundcube" +msgstr "" + +#: plinth/modules/roundcube/templates/roundcube.html:29 +msgid "" +"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." +msgstr "" + +#: plinth/modules/roundcube/templates/roundcube.html:39 +msgid "" +"You can access Roundcube from /roundcube. 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 " +"imap.example.com. For IMAP over SSL (recommended), fill the " +"server field like imaps://imap.example.com." +msgstr "" + +#: plinth/modules/roundcube/templates/roundcube.html:50 +msgid "" +"For Gmail, username will be your Gmail address, password will be your Google " +"account password and server will be imaps://imap.gmail.com. " +"Note that you will also need to enable \"Less secure apps\" in your Google " +"account settings (https://www.google.com/settings/security/lesssecureapps)." +msgstr "" + +#: plinth/modules/shaarli/__init__.py:37 +#: plinth/modules/shaarli/templates/shaarli.html:26 +#: plinth/modules/shaarli/views.py:52 +msgid "Bookmarks (Shaarli)" +msgstr "" + +#: plinth/modules/shaarli/__init__.py:42 +msgid "Shaarli" +msgstr "" + +#: plinth/modules/shaarli/forms.py:29 +msgid "Enable Shaarli" +msgstr "" + +#: plinth/modules/shaarli/templates/shaarli.html:28 +msgid "Shaarli allows you to save and share bookmarks." +msgstr "" + +#: plinth/modules/shaarli/templates/shaarli.html:31 +msgid "" +"When enabled, Shaarli will be available from /shaarli path on the web server. Note that Shaarli only supports a single user " +"account, which you will need to setup on the initial visit." +msgstr "" + +#: plinth/modules/system/system.py:26 +msgid "System" +msgstr "" + +#: plinth/modules/system/system.py:33 +#: plinth/modules/system/templates/system.html:25 +#: plinth/templates/base.html:109 +msgid "System Configuration" +msgstr "" + +#: plinth/modules/system/templates/system.html:28 +#, python-format +msgid "Here you can administrate the underlying system of your %(box_name)s." +msgstr "" + +#: plinth/modules/system/templates/system.html:35 +#, python-format +msgid "" +"The options affect the %(box_name)s at its most general level, so be careful!" +msgstr "" + +#: plinth/modules/tor/__init__.py:48 plinth/modules/tor/templates/tor.html:35 +msgid "Anonymity Network (Tor)" +msgstr "" + +#: plinth/modules/tor/__init__.py:53 +msgid "Tor Anonymity Network" +msgstr "" + +#: plinth/modules/tor/__init__.py:58 +msgid "Tor Bridge Relay" +msgstr "" + +#: plinth/modules/tor/__init__.py:76 plinth/modules/tor/views.py:144 +msgid "Tor Hidden Service" +msgstr "" + +#: plinth/modules/tor/__init__.py:222 +msgid "Tor relay port available" +msgstr "" + +#: plinth/modules/tor/__init__.py:230 +msgid "Obfs3 transport registered" +msgstr "" + +#: plinth/modules/tor/__init__.py:236 +msgid "Obfs4 transport registered" +msgstr "" + +#: plinth/modules/tor/__init__.py:273 +#, python-brace-format +msgid "Access URL {url} on tcp{kind} via Tor" +msgstr "" + +#: plinth/modules/tor/__init__.py:284 +#, python-brace-format +msgid "Confirm Tor usage at {url} on tcp{kind}" +msgstr "" + +#: plinth/modules/tor/forms.py:32 +msgid "Enable Tor" +msgstr "" + +#: plinth/modules/tor/forms.py:35 +msgid "Enable Tor Hidden Service" +msgstr "" + +#: plinth/modules/tor/forms.py:38 +#, python-brace-format +msgid "" +"A hidden service will allow {box_name} to provide selected services (such as " +"ownCloud or chat) without revealing its location." +msgstr "" + +#: plinth/modules/tor/forms.py:42 +msgid "Download software packages over Tor" +msgstr "" + +#: plinth/modules/tor/forms.py:44 +msgid "" +"When enabled, software will be downloaded over the Tor network for " +"installations and upgrades. This adds a degree of privacy and security " +"during software downloads." +msgstr "" + +#: plinth/modules/tor/templates/tor.html:38 +msgid "" +"Tor is an anonymous communication system. You can learn more about it from " +"the Tor Project website. For " +"best protection when web surfing, the Tor Project recommends that you use " +"the " +"Tor Browser." +msgstr "" + +#: plinth/modules/tor/templates/tor.html:54 +msgid "Tor configuration is being updated" +msgstr "" + +#: plinth/modules/tor/templates/tor.html:62 +msgid "Tor is running" +msgstr "" + +#: plinth/modules/tor/templates/tor.html:65 +msgid "Tor is not running" +msgstr "" + +#: plinth/modules/tor/templates/tor.html:77 +msgid "Hidden Service" +msgstr "" + +#: plinth/modules/tor/templates/tor.html:78 +#: plinth/modules/tor/templates/tor.html:120 +msgid "Port" +msgstr "" + +#: plinth/modules/tor/templates/tor.html:103 +msgid "Bridge" +msgstr "" + +#: plinth/modules/tor/templates/tor.html:106 +#, python-format +msgid "" +"Your %(box_name)s is configured as a Tor bridge with obfsproxy, so it can " +"help circumvent censorship. If your %(box_name)s is behind a router or " +"firewall, you should make sure the following ports are open, and port-" +"forwarded, if necessary:" +msgstr "" + +#: plinth/modules/tor/templates/tor.html:119 +msgid "Service" +msgstr "" + +#: plinth/modules/tor/templates/tor.html:135 +msgid "SOCKS" +msgstr "" + +#: plinth/modules/tor/templates/tor.html:138 +#, python-format +msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." +msgstr "" + +#: plinth/modules/tor/views.py:68 +msgid "Tor Control Panel" +msgstr "" + +#: plinth/modules/tor/views.py:79 +#, python-brace-format +msgid "Action error: {0} [{1}] [{2}]" +msgstr "" + +#: plinth/modules/tor/views.py:148 +msgid "Configuration updated." +msgstr "" + +#: plinth/modules/tor/views.py:150 +msgid "An error occurred during configuration." +msgstr "" + +#: plinth/modules/transmission/__init__.py:38 +#: plinth/modules/transmission/templates/transmission.html:26 +#: plinth/modules/transmission/views.py:67 +msgid "BitTorrent (Transmission)" +msgstr "" + +#: plinth/modules/transmission/__init__.py:43 +msgid "Transmission BitTorrent" +msgstr "" + +#: plinth/modules/transmission/forms.py:29 +msgid "Enable Transmission daemon" +msgstr "" + +#: plinth/modules/transmission/forms.py:33 +msgid "Download directory" +msgstr "" + +#: plinth/modules/transmission/forms.py:34 +msgid "" +"Directory where downloads are saved. If you change the default directory, " +"ensure that the new directory exists and is writable by \"debian-transmission" +"\" user." +msgstr "" + +#: plinth/modules/transmission/forms.py:40 +msgid "Username to login to the web interface." +msgstr "" + +#: plinth/modules/transmission/forms.py:44 +msgid "" +"Password to login to the web interface. Current password is shown in a " +"hashed format. To set a new password, enter the password in plain text." +msgstr "" + +#: plinth/modules/transmission/templates/transmission.html:29 +msgid "" +"BitTorrent is a peer-to-peer file sharing protocol. Transmission daemon " +"handles Bitorrent file sharing. Note that BitTorrent is not anonymous." +msgstr "" + +#: plinth/modules/transmission/templates/transmission.html:37 +msgid "" +"Access the web interface at /transmission." +msgstr "" + +#: plinth/modules/transmission/templates/transmission.html:47 +msgid "Transmission daemon is running" +msgstr "" + +#: plinth/modules/transmission/templates/transmission.html:50 +msgid "Transmission daemon is not running." +msgstr "" + +#: plinth/modules/upgrades/__init__.py:33 +msgid "Software Upgrades" +msgstr "" + +#: plinth/modules/upgrades/forms.py:29 +msgid "Enable automatic upgrades" +msgstr "" + +#: plinth/modules/upgrades/forms.py:30 +msgid "" +"When enabled, the unattended-upgrades program will be run once per day. It " +"will attempt to perform any package upgrades that are available." +msgstr "" + +#: plinth/modules/upgrades/templates/upgrades.html:37 +msgid "" +"Upgrades install the latest software and security updates. When automatic " +"upgrades are enabled, upgrades are automatically run every night. You don't " +"normally need to start the upgrade process." +msgstr "" + +#: plinth/modules/upgrades/templates/upgrades.html:45 +msgid "" +"Depending on the number of packages to install, this may take a long time to " +"complete. While upgrades are in progress, you will not be able to install " +"other packages. During the upgrade, this web interface may be temporarily " +"unavailable and show an error. Refresh the page to continue." +msgstr "" + +#: plinth/modules/upgrades/templates/upgrades.html:58 +msgid "Upgrade now »" +msgstr "" + +#: plinth/modules/upgrades/templates/upgrades.html:65 +msgid "A package manager is running." +msgstr "" + +#: plinth/modules/upgrades/templates/upgrades.html:70 +msgid "Recent log from upgrades:" +msgstr "" + +#: plinth/modules/upgrades/views.py:36 plinth/modules/upgrades/views.py:66 +msgid "Automatic Upgrades" +msgstr "" + +#: plinth/modules/upgrades/views.py:38 +msgid "Upgrade Packages" +msgstr "" + +#: plinth/modules/upgrades/views.py:96 +msgid "Upgrade process started." +msgstr "" + +#: plinth/modules/upgrades/views.py:99 +msgid "Starting upgrade failed." +msgstr "" + +#: plinth/modules/upgrades/views.py:102 +msgid "Package Upgrades" +msgstr "" + +#: plinth/modules/upgrades/views.py:131 +#, python-brace-format +msgid "Error when configuring unattended-upgrades: {error}" +msgstr "" + +#: plinth/modules/upgrades/views.py:136 +msgid "Automatic upgrades enabled" +msgstr "" + +#: plinth/modules/upgrades/views.py:138 +msgid "Automatic upgrades disabled" +msgstr "" + +#: plinth/modules/users/__init__.py:36 +msgid "Users and Groups" +msgstr "" + +#: plinth/modules/users/__init__.py:65 +#, python-brace-format +msgid "Check LDAP entry \"{search_item}\"" +msgstr "" + +#: plinth/modules/users/forms.py:28 +msgid "admin" +msgstr "" + +#: plinth/modules/users/forms.py:29 +msgid "wiki" +msgstr "" + +#: plinth/modules/users/forms.py:41 +msgid "Groups" +msgstr "" + +#: plinth/modules/users/forms.py:45 +msgid "" +"Select which services should be available to the new user. The user will be " +"able to log in to services that support single sign-on through LDAP, if they " +"are in the appropriate group.

Users in the admin group will be " +"able to log in to all services. They can also log in to the system through " +"SSH and have administrative privileges (sudo)." +msgstr "" + +#: plinth/modules/users/forms.py:80 +#, python-brace-format +msgid "Failed to add new user to {group} group." +msgstr "" + +#: plinth/modules/users/forms.py:92 +msgid "SSH Keys" +msgstr "" + +#: plinth/modules/users/forms.py:96 +msgid "" +"Setting an SSH public key will allow this user to securely log in to the " +"system without using a password. You may enter multiple keys, one on each " +"line. Blank lines and lines starting with # will be ignored." +msgstr "" + +#: plinth/modules/users/forms.py:136 +msgid "Renaming LDAP user failed." +msgstr "" + +#: plinth/modules/users/forms.py:148 +msgid "Failed to remove user from group." +msgstr "" + +#: plinth/modules/users/forms.py:159 +msgid "Failed to add user to group." +msgstr "" + +#: plinth/modules/users/forms.py:188 +msgid "Changing LDAP user password failed." +msgstr "" + +#: plinth/modules/users/templates/users_change_password.html:27 +#, python-format +msgid "Change Password for %(username)s" +msgstr "" + +#: plinth/modules/users/templates/users_change_password.html:40 +msgid "Save Password" +msgstr "" + +#: plinth/modules/users/templates/users_create.html:42 +#: plinth/modules/users/views.py:36 plinth/modules/users/views.py:56 +msgid "Create User" +msgstr "" + +#: plinth/modules/users/templates/users_delete.html:26 +#: plinth/modules/users/views.py:110 +msgid "Delete User" +msgstr "" + +#: plinth/modules/users/templates/users_delete.html:29 +#, python-format +msgid "Delete user %(username)s permanently?" +msgstr "" + +#: plinth/modules/users/templates/users_delete.html:38 +#, python-format +msgid "Delete %(username)s" +msgstr "" + +#: plinth/modules/users/templates/users_list.html:46 +#, python-format +msgid "Delete user %(username)s" +msgstr "" + +#: plinth/modules/users/templates/users_list.html:53 +#, python-format +msgid "Edit user %(username)s" +msgstr "" + +#: plinth/modules/users/templates/users_update.html:39 +#, python-format +msgid "" +"Use the change password form to " +"change the password." +msgstr "" + +#: plinth/modules/users/templates/users_update.html:53 +msgid "Save Changes" +msgstr "" + +#: plinth/modules/users/views.py:34 plinth/modules/users/views.py:69 +msgid "Users" +msgstr "" + +#: plinth/modules/users/views.py:54 +#, python-format +msgid "User %(username)s created." +msgstr "" + +#: plinth/modules/users/views.py:78 +#, python-format +msgid "User %(username)s updated." +msgstr "" + +#: plinth/modules/users/views.py:79 +msgid "Edit User" +msgstr "" + +#: plinth/modules/users/views.py:120 +#, python-brace-format +msgid "User {user} deleted." +msgstr "" + +#: plinth/modules/users/views.py:127 +msgid "Deleting LDAP user failed." +msgstr "" + +#: plinth/modules/users/views.py:136 +msgid "Change Password" +msgstr "" + +#: plinth/modules/users/views.py:137 +msgid "Password changed successfully." +msgstr "" + +#: plinth/modules/xmpp/__init__.py:41 plinth/modules/xmpp/__init__.py:46 +#: plinth/modules/xmpp/templates/xmpp.html:26 plinth/modules/xmpp/views.py:75 +msgid "Chat Server (XMPP)" +msgstr "" + +#: plinth/modules/xmpp/forms.py:29 +msgid "Enable XMPP" +msgstr "" + +#: plinth/modules/xmpp/templates/xmpp.html:29 +msgid "" +"XMPP is an open and standardized communication protocol. Here you can run " +"and configure your XMPP server, called ejabberd." +msgstr "" + +#: plinth/modules/xmpp/templates/xmpp.html:36 +msgid "" +"To actually communicate, you can use the web client or " +"any other XMPP client." +msgstr "" + +#: plinth/modules/xmpp/templates/xmpp.html:45 +#, python-format +msgid "" +"Your XMPP server domain is set to %(domainname)s. User IDs will look " +"like username@%(domainname)s. You can setup your domain on the system " +"Configure page." +msgstr "" + +#: plinth/modules/xmpp/templates/xmpp.html:55 +msgid "Launch web client" +msgstr "" + +#: plinth/modules/xmpp/templates/xmpp.html:63 +msgid "ejabberd is running" +msgstr "" + +#: plinth/modules/xmpp/templates/xmpp.html:66 +msgid "ejabberd is not running" +msgstr "" + +#: plinth/network.py:39 +msgid "PPPoE" +msgstr "" + +#: plinth/package.py:156 +msgid "packages not found" +msgstr "" + +#: plinth/package.py:263 +msgid "Installed and configured packages successfully." +msgstr "" + +#: plinth/package.py:268 +#, python-brace-format +msgid "Error installing packages: {string} {details}" +msgstr "" + +#: plinth/service.py:73 +msgid "Web Server" +msgstr "" + +#: plinth/service.py:74 +msgid "Web Server over Secure Socket Layer" +msgstr "" + +#: plinth/service.py:76 +msgid "Secure Shell (SSH) Server" +msgstr "" + +#: plinth/service.py:79 +#, python-brace-format +msgid "{box_name} Web Interface (Plinth)" +msgstr "" + +#: plinth/templates/404.html:25 +msgid "404" +msgstr "" + +#: plinth/templates/404.html:28 +#, python-format +msgid "Requested page %(request_path)s was not found." +msgstr "" + +#: plinth/templates/404.html:34 +msgid "" +"If you believe this missing page should exist, please file a bug at the " +"Plinth project issue " +"tracker." +msgstr "" + +#: plinth/templates/500.html:25 +msgid "500" +msgstr "" + +#: plinth/templates/500.html:28 +msgid "" +"This is an internal error and not something you caused or can fix. Please " +"report the error on the bug tracker so we can fix it." +msgstr "" + +#: plinth/templates/base.html:49 +#, python-format +msgid "Plinth administrative interface for the %(box_name)s" +msgstr "" + +#: plinth/templates/base.html:83 +msgid "Toggle navigation" +msgstr "" + +#: plinth/templates/base.html:125 plinth/templates/base.html.py:126 +msgid "Change password" +msgstr "" + +#: plinth/templates/base.html:129 plinth/templates/base.html.py:130 +#: plinth/templates/base.html:143 plinth/templates/base.html.py:145 +msgid "Log out" +msgstr "" + +#: plinth/templates/base.html:135 plinth/templates/base.html.py:137 +msgid "Log in" +msgstr "" + +#: plinth/templates/login.html:35 +msgid "Login" +msgstr "" + +#: plinth/templates/package_install.html:35 +msgid "Installation" +msgstr "" + +#: plinth/templates/package_install.html:40 +msgid "" +"This feature requires addtional packages to be installed. Do you wish to " +"install them?" +msgstr "" + +#: plinth/templates/package_install.html:49 +msgid "Package" +msgstr "" + +#: plinth/templates/package_install.html:50 +msgid "Summary" +msgstr "" + +#: plinth/templates/package_install.html:67 +msgid "Install" +msgstr "" + +#: plinth/templates/package_install.html:74 +#, python-format +msgid "Installing %(package_names)s: %(status)s" +msgstr "" + +#: plinth/templates/package_install.html:84 +#, python-format +msgid "%(percentage)s%% complete" +msgstr "" From 747728926e40710543ab1cfd0cb76add1813ee14 Mon Sep 17 00:00:00 2001 From: Dietmar Date: Fri, 5 Feb 2016 22:11:16 +0100 Subject: [PATCH 061/189] Translated using Weblate (German) Currently translated at 100.0% (569 of 569 strings) --- plinth/locale/de/LC_MESSAGES/django.po | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/plinth/locale/de/LC_MESSAGES/django.po b/plinth/locale/de/LC_MESSAGES/django.po index 0ed266fcf..dd1fd6617 100644 --- a/plinth/locale/de/LC_MESSAGES/django.po +++ b/plinth/locale/de/LC_MESSAGES/django.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-01-31 22:19+0530\n" -"PO-Revision-Date: 2016-02-05 22:07+0000\n" +"PO-Revision-Date: 2016-02-05 22:11+0000\n" "Last-Translator: Dietmar \n" "Language-Team: German " "\n" @@ -1334,11 +1334,11 @@ msgstr "Zurückziehen" #: plinth/modules/letsencrypt/templates/letsencrypt.html:108 msgid "Re-obtain" -msgstr "Wieder erhalten" +msgstr "Wieder beziehen" #: plinth/modules/letsencrypt/templates/letsencrypt.html:115 msgid "Obtain" -msgstr "Erhalten" +msgstr "Beziehen" #: plinth/modules/letsencrypt/views.py:55 #, python-brace-format @@ -1353,12 +1353,12 @@ msgstr "Zurückziehen des Zertifikats für Domain {domain} gescheiter: {error}" #: plinth/modules/letsencrypt/views.py:72 #, python-brace-format msgid "Certificate successfully obtained for domain {domain}" -msgstr "Zertifikat erfolgreich erhalten für Domain {domain}" +msgstr "Zertifikat erfolgreich bezogen für Domain {domain}" #: plinth/modules/letsencrypt/views.py:77 #, python-brace-format msgid "Failed to obtain certificate for domain {domain}: {error}" -msgstr "Erhalten des Zertifikats für Domain {domain} fehlgeschlagen: {error}" +msgstr "Beziehen des Zertifikats für Domain {domain} fehlgeschlagen: {error}" #: plinth/modules/monkeysphere/__init__.py:32 #: plinth/modules/monkeysphere/templates/monkeysphere.html:35 @@ -2649,7 +2649,7 @@ msgstr "" #: plinth/modules/repro/templates/repro.html:63 #| msgid "Quassel core service is running" msgid "repro service is running" -msgstr "repro service läuft" +msgstr "repro Dienst läuft" #: plinth/modules/repro/templates/repro.html:66 #| msgid "Quassel core service is not running" @@ -2819,7 +2819,7 @@ msgstr "Tor Bridge Relay" #: plinth/modules/tor/__init__.py:76 plinth/modules/tor/views.py:144 msgid "Tor Hidden Service" -msgstr "Tor Hidden Service" +msgstr "Tor Hidden Dienst" #: plinth/modules/tor/__init__.py:222 msgid "Tor relay port available" From 01777542016f305a6014ce949ea29c9b1515c045 Mon Sep 17 00:00:00 2001 From: Joel Valleroy Date: Sat, 6 Feb 2016 16:25:05 +0000 Subject: [PATCH 062/189] Added packagekit to dependency list per issue-369 --- INSTALL | 1 + 1 file changed, 1 insertion(+) diff --git a/INSTALL b/INSTALL index c28df6be6..a08401cc5 100644 --- a/INSTALL +++ b/INSTALL @@ -17,6 +17,7 @@ libjs-modernizr \ make \ network-manager \ + packagekit \ ppp \ pppoe \ python3 \ From 04c096972fbdfc147f8b1d2c72bc89cb9a4b83a9 Mon Sep 17 00:00:00 2001 From: the29a Date: Sat, 6 Feb 2016 14:27:59 +0100 Subject: [PATCH 063/189] Translated using Weblate (Russian) Currently translated at 24.2% (138 of 568 strings) --- plinth/locale/ru/LC_MESSAGES/django.po | 365 ++++++++++++++++--------- 1 file changed, 243 insertions(+), 122 deletions(-) diff --git a/plinth/locale/ru/LC_MESSAGES/django.po b/plinth/locale/ru/LC_MESSAGES/django.po index e2137658f..4d074ea63 100644 --- a/plinth/locale/ru/LC_MESSAGES/django.po +++ b/plinth/locale/ru/LC_MESSAGES/django.po @@ -3,32 +3,32 @@ # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # -#, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-02-06 14:44+0530\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" +"PO-Revision-Date: 2016-02-06 14:27+0000\n" +"Last-Translator: Алексей «Forgotten Woods» Доку \n" +"Language-Team: Russian " +"\n" +"Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n" -"%100>=11 && n%100<=14)? 2 : 3);\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=" +"4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 2.5-dev\n" #: plinth/action_utils.py:203 #, python-brace-format msgid "Listening on {kind} port {listen_address}:{port}" -msgstr "" +msgstr "Слушать на {kind} порт {listen_address}{port}" #: plinth/action_utils.py:206 #, python-brace-format msgid "Listening on {kind} port {port}" -msgstr "" +msgstr "Слушать порт {port} на {kind}" #: plinth/action_utils.py:287 #, python-brace-format @@ -43,54 +43,62 @@ msgstr "" #: plinth/action_utils.py:321 #, python-brace-format msgid "Connect to {host}:{port}" -msgstr "" +msgstr "Подключение к {host}:{port}" #: plinth/action_utils.py:324 #, python-brace-format msgid "Cannot connect to {host}:{port}" -msgstr "" +msgstr "Невозможно подключиться к {host}{port}" #: plinth/context_processors.py:36 msgid "FreedomBox" -msgstr "" +msgstr "FreedomBox" #: plinth/modules/apps/apps.py:26 msgid "Apps" -msgstr "" +msgstr "Приложения" #: plinth/modules/apps/apps.py:32 plinth/templates/base.html.py:93 msgid "Applications" -msgstr "" +msgstr "Приложения" #: plinth/modules/apps/templates/apps.html:25 msgid "Services and Applications" -msgstr "" +msgstr "Службы и Приложения" #: plinth/modules/apps/templates/apps.html:28 -#, python-format +#, fuzzy, python-format msgid "" "You can install and run various services and applications on your " "%(box_name)s. Click on any app page link on the left to read a description " "of the application and choose to install it." msgstr "" +"Вы можете установить и запустить различные службы и приложения на вашем " +"%(box_name)s. Нажмите на любую страницу приложения слева, чтобы прочитать " +"описание приложения и выбрать для установки." #: plinth/modules/apps/templates/apps.html:36 +#, fuzzy msgid "" "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!" msgstr "" +"Эта коробка может быть вашим средством обмена фотографиями, обмена " +"мгновенными сообщениями, вашей социальной сетью, вашей новостной лентой. " +"Помните Web-порталы? Вы можете быть одним из них. Многие службы, которыми " +"пользуетесь Вы, могут быть в этой коробке и под Вашим контролем!" #: plinth/modules/avahi/__init__.py:40 plinth/modules/avahi/__init__.py:45 #: plinth/modules/avahi/templates/avahi.html:26 #: plinth/modules/avahi/views.py:53 msgid "Service Discovery" -msgstr "" +msgstr "Обнаружение служб" #: plinth/modules/avahi/forms.py:29 msgid "Enable service discovery" -msgstr "" +msgstr "Включить обнаружение служб" #: plinth/modules/avahi/templates/avahi.html:29 #, python-format @@ -102,6 +110,12 @@ msgid "" "disabled to improve security especially when connecting to a hostile local " "network." msgstr "" +"Обнаружение служб позволяет другим устройствам в сети обнаруживать ваш " +"%(box_name)s и службы, запущенные на нем. Это так же позволяет %(box_name)s " +"находить другие устройства и службы запущенные в вашей локальной сети. " +"Обнаружение служб не является существенным и работает только внутри вашей " +"сети. Она может быть отключена в целях повышения безопасности, особенно при " +"подключении к вражеской сети." #: plinth/modules/avahi/templates/avahi.html:40 #: plinth/modules/datetime/templates/datetime.html:35 @@ -118,15 +132,15 @@ msgstr "" #: plinth/modules/transmission/templates/transmission.html:42 #: plinth/modules/xmpp/templates/xmpp.html:58 msgid "Status" -msgstr "" +msgstr "Статус" #: plinth/modules/avahi/templates/avahi.html:45 msgid "Service discovery server is running" -msgstr "" +msgstr "Выполняется служба обнаружения сервера" #: plinth/modules/avahi/templates/avahi.html:48 msgid "Service discovery server is not running" -msgstr "" +msgstr "Не запущена служба обнаружения сервера" #: plinth/modules/avahi/templates/avahi.html:52 #: plinth/modules/datetime/templates/datetime.html:48 @@ -144,7 +158,7 @@ msgstr "" #: plinth/modules/transmission/templates/transmission.html:56 #: plinth/modules/xmpp/templates/xmpp.html:72 msgid "Configuration" -msgstr "" +msgstr "Конфигурация" #: plinth/modules/avahi/templates/avahi.html:60 #: plinth/modules/datetime/templates/datetime.html:56 @@ -165,7 +179,7 @@ msgstr "" #: plinth/modules/upgrades/templates/upgrades_configure.html:34 #: plinth/modules/xmpp/templates/xmpp.html:80 msgid "Update setup" -msgstr "" +msgstr "Обновление установки" #: plinth/modules/avahi/views.py:73 plinth/modules/datetime/views.py:85 #: plinth/modules/deluge/views.py:80 @@ -177,7 +191,7 @@ msgstr "" #: plinth/modules/shaarli/views.py:74 plinth/modules/transmission/views.py:109 #: plinth/modules/xmpp/views.py:100 msgid "Configuration updated" -msgstr "" +msgstr "Конфигурация обновлена" #: plinth/modules/avahi/views.py:76 plinth/modules/datetime/views.py:99 #: plinth/modules/deluge/views.py:82 plinth/modules/ikiwiki/views.py:97 @@ -189,16 +203,16 @@ msgstr "" #: plinth/modules/transmission/views.py:111 #: plinth/modules/upgrades/views.py:118 plinth/modules/xmpp/views.py:102 msgid "Setting unchanged" -msgstr "" +msgstr "Настройки без изменений" #: plinth/modules/config/config.py:84 plinth/modules/config/config.py:121 #: plinth/modules/dynamicdns/dynamicdns.py:148 msgid "Invalid domain name" -msgstr "" +msgstr "Недопустимое имя домена" #: plinth/modules/config/config.py:95 msgid "Hostname" -msgstr "" +msgstr "Имя хоста" #: plinth/modules/config/config.py:97 #, python-brace-format @@ -208,16 +222,20 @@ msgid "" "and have as interior characters only alphabets, digits and hyphens. Total " "length must be 63 characters or less." msgstr "" +"Имя узла это локальное имя, по которому другие устройства в локальной сети " +"могут достигнуть ваш {box_name}. Оно должно начинаться и заканчиваться с " +"букв или цифр, внутри так же могут быть цифры, буквы или дефисы. Общая " +"длинна должна быть не более 63 символов." #: plinth/modules/config/config.py:105 msgid "Invalid hostname" -msgstr "" +msgstr "Недопустимое имя хоста" #: plinth/modules/config/config.py:108 plinth/modules/config/config.py:153 #: plinth/modules/config/config.py:265 #: plinth/modules/dynamicdns/dynamicdns.py:143 msgid "Domain Name" -msgstr "" +msgstr "Доменное имя" #: plinth/modules/config/config.py:110 #, python-brace-format @@ -229,110 +247,119 @@ msgid "" "63 characters or less. Total length of domain name must be 253 characters " "or less." msgstr "" +"Доменное имя это глобальное имя, по которому другие устройства в интернете " +"могут обнаруживать {box_name}. Оно должно состоять из меток, разделенных " +"точками. Каждая метка должна состоять из букв или цифр, Длина каждой метки " +"должны быть 63 символов или меньше. Общая длина имени домена должно быть 253 " +"символов или меньше." #: plinth/modules/config/config.py:125 msgid "Language" -msgstr "" +msgstr "Язык" #: plinth/modules/config/config.py:127 msgid "Language for this web administration interface" -msgstr "" +msgstr "Язык для этого веб-интерфейса администрирования" #: plinth/modules/config/config.py:135 #: plinth/modules/dynamicdns/dynamicdns.py:37 #: plinth/modules/ikiwiki/views.py:36 msgid "Configure" -msgstr "" +msgstr "Настроить" #: plinth/modules/config/config.py:176 msgid "General Configuration" -msgstr "" +msgstr "Общие настройки" #: plinth/modules/config/config.py:193 #, python-brace-format msgid "Error setting hostname: {exception}" -msgstr "" +msgstr "Ошибка параметра hostname: {exception}" #: plinth/modules/config/config.py:196 msgid "Hostname set" -msgstr "" +msgstr "Смена имени хоста" #: plinth/modules/config/config.py:202 #, python-brace-format msgid "Error setting domain name: {exception}" -msgstr "" +msgstr "Ошибка параметра имени домена: {exception}" #: plinth/modules/config/config.py:205 msgid "Domain name set" -msgstr "" +msgstr "Смена доменного имени" #: plinth/modules/config/config.py:213 #, python-brace-format msgid "Error setting language: {exception}" -msgstr "" +msgstr "Ошибка настройки языка: {exception}" #: plinth/modules/config/config.py:216 msgid "Language changed" -msgstr "" +msgstr "Язык изменен" #: plinth/modules/config/templates/config.html:32 msgid "Submit" -msgstr "" +msgstr "Отправить" #: plinth/modules/datetime/__init__.py:39 #: plinth/modules/datetime/templates/datetime.html:26 #: plinth/modules/datetime/views.py:58 msgid "Date & Time" -msgstr "" +msgstr "Дата и Время" #: plinth/modules/datetime/__init__.py:44 msgid "Network Time Server" -msgstr "" +msgstr "Сетевой сервер времени" #: plinth/modules/datetime/__init__.py:76 msgid "NTP client in contact with servers" -msgstr "" +msgstr "NTP-клиент в контакте с серверами" #: plinth/modules/datetime/forms.py:31 msgid "Enable network time" -msgstr "" +msgstr "Включить время сети" #: plinth/modules/datetime/forms.py:35 msgid "Time Zone" -msgstr "" +msgstr "Часовой пояс" #: plinth/modules/datetime/forms.py:36 msgid "" "Set your time zone to get accurate timestamps. This will set the systemwide " "time zone." msgstr "" +"Задайте свой часовой пояс, чтобы получить точные временные метки. Это " +"позволит установить общесистемный часовой пояс." #: plinth/modules/datetime/forms.py:47 msgid "-- no time zone set --" -msgstr "" +msgstr "-- не выбран часовой пояс --" #: plinth/modules/datetime/templates/datetime.html:29 msgid "" "Network time server is a program that maintians the system time in " "synchronization with servers on the Internet." msgstr "" +"Сервер сетевого времени это программа позволяющая системе синхронизировать " +"время с серверами в Интернете." #: plinth/modules/datetime/templates/datetime.html:40 msgid "Network time server is running" -msgstr "" +msgstr "Сетевой сервер времени выполняется" #: plinth/modules/datetime/templates/datetime.html:43 msgid "Network time server is not running" -msgstr "" +msgstr "Сетевой сервер времени не выполняется" #: plinth/modules/datetime/views.py:93 #, python-brace-format msgid "Error setting time zone: {exception}" -msgstr "" +msgstr "Ошибка установки часового пояса: {exception}" #: plinth/modules/datetime/views.py:96 msgid "Time zone set" -msgstr "" +msgstr "Смена часового пояса" #: plinth/modules/deluge/__init__.py:38 plinth/modules/deluge/views.py:56 msgid "BitTorrent (Deluge)" @@ -344,15 +371,15 @@ msgstr "" #: plinth/modules/deluge/forms.py:29 msgid "Enable Deluge" -msgstr "" +msgstr "Включить Deluge" #: plinth/modules/deluge/templates/deluge.html:26 msgid "BitTorrent Web Client (Deluge)" -msgstr "" +msgstr "BitTorrent Веб Клиент (Deluge)" #: plinth/modules/deluge/templates/deluge.html:28 msgid "Deluge is a BitTorrent client that features a Web UI." -msgstr "" +msgstr "Deluge это клиент BitTorrent, имеющий веб-интерфейс." #: plinth/modules/deluge/templates/deluge.html:31 msgid "" @@ -360,129 +387,155 @@ msgid "" "\">/deluge path on the web server. The default password is 'deluge', but " "you should log in and change it immediately after enabling this service." msgstr "" +"Когда запущен, Deluge веб-клиент доступен по адресу: /deluge на веб-сервере. Пароль по умолчанию 'deluge', но вы должны " +"войти и изменить его сразу же после включения этой службы." #: plinth/modules/deluge/templates/deluge.html:44 msgid "deluge-web is running" -msgstr "" +msgstr "deluge-web выполняется" #: plinth/modules/deluge/templates/deluge.html:47 msgid "deluge-web is not running" -msgstr "" +msgstr "deluge-web не выполняется" #: plinth/modules/diagnostics/diagnostics.py:45 msgid "Diagnostics" -msgstr "" +msgstr "Диагностика" #: plinth/modules/diagnostics/diagnostics.py:55 msgid "System Diagnostics" -msgstr "" +msgstr "Диагностика системы" #: plinth/modules/diagnostics/diagnostics.py:78 msgid "Diagnostic Test" -msgstr "" +msgstr "Диагностический тест" #: plinth/modules/diagnostics/templates/diagnostics.html:37 msgid "" "The system diagnostic test will run a number of checks on your system to " "confirm that applications and services are working as expected." msgstr "" +"Диагностический тест системы проведет ряд проверок, чтобы убедиться, что " +"приложения и службы работают, как ожидалось." #: plinth/modules/diagnostics/templates/diagnostics.html:50 #: plinth/modules/diagnostics/templates/diagnostics_button.html:27 msgid "Run Diagnostics" -msgstr "" +msgstr "Запуск диагностики" #: plinth/modules/diagnostics/templates/diagnostics.html:53 msgid "Diagnotics test is currently running" -msgstr "" +msgstr "В настоящее время диагностический тес запущен" #: plinth/modules/diagnostics/templates/diagnostics.html:66 msgid "Results" -msgstr "" +msgstr "Результаты" #: plinth/modules/diagnostics/templates/diagnostics.html:74 #, python-format msgid "Module: %(module)s" -msgstr "" +msgstr "Модуль: %(module)s" #: plinth/modules/diagnostics/templates/diagnostics_module.html:25 msgid "Diagnostic Results" -msgstr "" +msgstr "Результаты диагностики" #: plinth/modules/diagnostics/templates/diagnostics_module.html:27 #, python-format msgid "Module: %(module_name)s" -msgstr "" +msgstr "Модуль: %(module_name)s" #: plinth/modules/diagnostics/templates/diagnostics_module.html:32 msgid "This module does not support diagnostics" -msgstr "" +msgstr "Этот модуль не поддерживает диагностику" #: plinth/modules/diagnostics/templates/diagnostics_results.html:27 msgid "Test" -msgstr "" +msgstr "Тест" #: plinth/modules/diagnostics/templates/diagnostics_results.html:28 msgid "Result" -msgstr "" +msgstr "Результат" #: plinth/modules/dynamicdns/dynamicdns.py:35 plinth/modules/help/help.py:40 msgid "About" -msgstr "" +msgstr "О службе" #: plinth/modules/dynamicdns/dynamicdns.py:45 #: plinth/modules/dynamicdns/dynamicdns.py:54 msgid "Dynamic DNS" -msgstr "" +msgstr "Динамический DNS" #: plinth/modules/dynamicdns/dynamicdns.py:71 +#, fuzzy msgid "" "The Variables <User>, <Pass>, <Ip>, <Domain> may be " "used within the URL. For details see the update URL templates of the example " "providers." msgstr "" +"Переменные < User >, < Pass >, < lp >, < Domain > " +"могут использоваться в URL-адресе. Для примеров смотрите обновление URL " +"поставщика примеров." #: plinth/modules/dynamicdns/dynamicdns.py:75 +#, fuzzy msgid "" "Please choose an update protocol according to your provider. If your " "provider does not support the GnudIP protocol or your provider is not listed " "you may use the update URL of your provider." msgstr "" +"Пожалуйста, выберите протокол обновления согласно вашего провайдера. Если " +"ваш провайдер не поддерживает протокол GnudIP или поставщик не указан, вы " +"можете использовать URL-адрес обновления вашего провайдера." #: plinth/modules/dynamicdns/dynamicdns.py:80 msgid "" "Please do not enter a URL here (like \"https://example.com/\") but only the " "hostname of the GnuDIP server (like \"example.com\")." msgstr "" +"Пожалуйста, не вводите URL здесь (как «https://example.com/»), только имя " +"хоста сервера GnuDIP (как \"example.com\")." #: plinth/modules/dynamicdns/dynamicdns.py:84 -#, python-brace-format +#, fuzzy, python-brace-format msgid "The public domain name you want use to reach your {box_name}." msgstr "" +"Общее доменное имя вы хотите использовать для достижения ваших {box_name}" #: plinth/modules/dynamicdns/dynamicdns.py:87 msgid "Use this option if your provider uses self signed certificates." msgstr "" +"Используйте этот параметр, если ваш провайдер использует самостоятельно " +"подписанные сертификаты." #: plinth/modules/dynamicdns/dynamicdns.py:90 msgid "" "If this option is selected, your username and password will be used for HTTP " "basic authentication." msgstr "" +"Если выбран этот параметр, будет использоваться имя пользователя и пароль " +"для обычной проверки подлинности HTTP." #: plinth/modules/dynamicdns/dynamicdns.py:93 msgid "" "Leave this field empty if you want to keep your previous configured password." msgstr "" +"Оставьте это поле пустым, если вы хотите сохранить ваш предыдущий " +"настроенный пароль" #: plinth/modules/dynamicdns/dynamicdns.py:96 -#, python-brace-format +#, fuzzy, python-brace-format msgid "" "Optional Value. If your {box_name} is not connected directly to the Internet " "(i.e. connected to a NAT router) this URL is used to figure out the real " "Internet IP. The URL should simply return the IP where the client comes from " "(example: http://myip.datasystems24.de)." msgstr "" +"Необязательное значение. Если ваш {box_name} не подключен непосредственно к " +"Интернету, (т.е. подключенный к маршрутизатору) этот URL-адрес используется " +"для получения \"белого\" IP. URL-адрес должен просто вернуть IP (пример: " +"http://myip.datasystems24.de)" #: plinth/modules/dynamicdns/dynamicdns.py:104 msgid "" @@ -492,78 +545,78 @@ msgstr "" #: plinth/modules/dynamicdns/dynamicdns.py:115 msgid "Enable Dynamic DNS" -msgstr "" +msgstr "Включение динамического DNS" #: plinth/modules/dynamicdns/dynamicdns.py:118 msgid "Service type" -msgstr "" +msgstr "Тип службы" #: plinth/modules/dynamicdns/dynamicdns.py:123 msgid "GnudIP Server Address" -msgstr "" +msgstr "Адрес сервера GnudIP" #: plinth/modules/dynamicdns/dynamicdns.py:128 msgid "Invalid server name" -msgstr "" +msgstr "Недопустимое имя сервера" #: plinth/modules/dynamicdns/dynamicdns.py:131 msgid "Update URL" -msgstr "" +msgstr "Обновление URL-адреса" #: plinth/modules/dynamicdns/dynamicdns.py:135 msgid "Accept all SSL certificates" -msgstr "" +msgstr "Принимать все SSL-сертификаты" #: plinth/modules/dynamicdns/dynamicdns.py:139 msgid "Use HTTP basic authentication" -msgstr "" +msgstr "Использовать базовую аутентификацию HTTP" #: plinth/modules/dynamicdns/dynamicdns.py:151 #: plinth/modules/networks/forms.py:146 plinth/modules/transmission/forms.py:39 msgid "Username" -msgstr "" +msgstr "Имя пользователя" #: plinth/modules/dynamicdns/dynamicdns.py:154 #: plinth/modules/networks/forms.py:147 plinth/modules/transmission/forms.py:43 msgid "Password" -msgstr "" +msgstr "Пароль" #: plinth/modules/dynamicdns/dynamicdns.py:157 #: plinth/modules/networks/forms.py:149 msgid "Show password" -msgstr "" +msgstr "Показать пароль" #: plinth/modules/dynamicdns/dynamicdns.py:161 msgid "IP check URL" -msgstr "" +msgstr "IP проверить URL-адрес" #: plinth/modules/dynamicdns/dynamicdns.py:187 msgid "Please provide update URL or a GnuDIP Server" -msgstr "" +msgstr "Просьба представить обновление URL-адреса или сервера GnuDIP" #: plinth/modules/dynamicdns/dynamicdns.py:190 msgid "Please provide GnuDIP username" -msgstr "" +msgstr "Просьба представить имя пользователя GnuDIP" #: plinth/modules/dynamicdns/dynamicdns.py:193 msgid "Please provide GnuDIP domain" -msgstr "" +msgstr "Просьба представить домен GnuDIP" #: plinth/modules/dynamicdns/dynamicdns.py:198 msgid "Please provide a password" -msgstr "" +msgstr "Введите пароль" #: plinth/modules/dynamicdns/dynamicdns.py:217 msgid "Configure Dynamic DNS" -msgstr "" +msgstr "Настройка динамического DNS" #: plinth/modules/dynamicdns/dynamicdns.py:239 msgid "Status of Dynamic DNS" -msgstr "" +msgstr "Состояние динамического DNS" #: plinth/modules/dynamicdns/templates/dynamicdns.html:25 msgid "Dynamic DNS Client" -msgstr "" +msgstr "Клиент динамического DNS" #: plinth/modules/dynamicdns/templates/dynamicdns.html:28 #, python-format @@ -572,6 +625,9 @@ msgid "" "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 %(box_name)s, such as ownCloud." msgstr "" +"Если ваш Интернет-провайдер меняет ваш IP-адрес периодически, это может " +"стать препятствиям, чтобы найти вас в сети. И по этой причине никто не может " +"найти услуги, которые предоставляются %(box_name)s, например ownCloud." #: plinth/modules/dynamicdns/templates/dynamicdns.html:37 msgid "" @@ -582,8 +638,15 @@ msgid "" "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." msgstr "" +"Решение заключается в назначении имени DNS к вашему IP адресу и обновлять " +"DNS имя каждый раз, как будет изменен ваш IP адрес. Динамический DNS " +"позволяет вам публиковать ваш текущий публичный IP адрес gnudip сервере. " +"После этого сервер будет назначать DNS имя с новым IP и если кто-то из " +"Интернет запрашивает DNS-имя, он получит ваш текущий IP." #: plinth/modules/dynamicdns/templates/dynamicdns.html:50 +#, fuzzy msgid "" "If you are looking for a free dynamic DNS account, you may find a free " "GnuDIP service at " "freedns.afraid.org." msgstr "" +"Если вы ищете бесплатный сервер динамического DNS, вы можете найти " +"бесплатный сервис GnuDIP на gnudip.datasystems24.net или вы можете найти беслатную " +"службу обновления URL-адреса на freedns.afraid.org" #: plinth/modules/dynamicdns/templates/dynamicdns.html:61 #, python-format @@ -598,26 +666,34 @@ msgid "" "If your %(box_name)s is connected behind some NAT router, don't forget to " "add port forwarding (i.e. forward some standard ports like 80 and 443)." msgstr "" +"Если ваш %(box_name)s) подключен за NAT-маршрутизатором, не забудьте " +"добавить перенаправление портов (например, стандартные 80 или 443)" #: plinth/modules/dynamicdns/templates/dynamicdns_configure.html:30 msgid "" "You have disabled Javascript. Dynamic form mode is disabled and some helper " "functions may not work (but the main functionality should work)." msgstr "" +"Вы отключили Javascript. Динамические элементы отключены и некоторые " +"вспомогательные функции могут не работать (но основные функции должны " +"работать)." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:25 msgid "NAT type" -msgstr "" +msgstr "Тип NAT" #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:29 +#, fuzzy msgid "" "NAT type not detected yet, if you do not provide a \"IP check URL\" we will " "not detect a NAT type." msgstr "" +"Тип NAT не обнаружен, если вы не предоставляете «IP проверить URL» мы не " +"можем определить тип NAT." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:35 msgid "Direct connection to the Internet." -msgstr "" +msgstr "Прямое подключение к Интернету." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:37 #, python-format @@ -627,16 +703,21 @@ msgid "" "changes will not be detected). In case the WAN IP changes, it may take up " "to %(timer)s minutes until your DNS entry is updated." msgstr "" +"За NAT. Это означает, что служба динамического DNS будет опрашивать «IP " +"проверить URL-адрес» для изменения (для этого необходима запись «IP " +"проверить URL-адрес» - в противном случае не будет обнаружено изменение IP )" +". В случае, если WAN IP меняется, это может занять до %(timer)s минут до тех " +"пор, пока ваш DNS-запись обновляется." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:48 msgid "Last update" -msgstr "" +msgstr "Последнее обновление:" #: plinth/modules/firewall/firewall.py:39 #: plinth/modules/firewall/firewall.py:49 #: plinth/modules/firewall/firewall.py:57 msgid "Firewall" -msgstr "" +msgstr "Брандмауэр" #: plinth/modules/firewall/templates/firewall.html:28 #, python-format @@ -645,10 +726,14 @@ msgid "" "network traffic on your %(box_name)s. Keeping a firewall enabled and " "properly configured reduces risk of security threat from the Internet." msgstr "" +"Брандмауэр — система безопасности, которая контролирует входящий и исходящий " +"сетевой трафик на вашем %(box_name)s. Держите брандмауэр включенным и " +"правильно настроенным, чтобы уменьшить риск информационной опасности из " +"Интернета." #: plinth/modules/firewall/templates/firewall.html:36 msgid "Current status:" -msgstr "" +msgstr "Текущий статус:" #: plinth/modules/firewall/templates/firewall.html:41 #, python-format @@ -658,38 +743,43 @@ msgid "" "you may run it using the command 'service firewalld start' or in case of a " "system with systemd 'systemctl start firewalld'." msgstr "" +"Демон брандмауэра не выполняется. Пожалуйста, запустите его. На %(box_name)s " +"межсетевой экран включен по умолчанию. На любюй системе, базирующейся на " +"Debian (как и %(box_name)s) которые вы можете запустить его с помощью " +"команды 'service firewalld start' или в случае системы с systemd 'systemctl " +"start firewalld'." #: plinth/modules/firewall/templates/firewall.html:56 msgid "Service/Port" -msgstr "" +msgstr "Служба/Порт" #: plinth/modules/firewall/templates/firewall.html:67 #: plinth/modules/letsencrypt/templates/letsencrypt.html:91 #: plinth/modules/names/templates/names.html:51 msgid "Enabled" -msgstr "" +msgstr "Включено" #: plinth/modules/firewall/templates/firewall.html:70 #: plinth/modules/letsencrypt/templates/letsencrypt.html:93 #: plinth/modules/names/templates/names.html:53 msgid "Disabled" -msgstr "" +msgstr "Выключено" #: plinth/modules/firewall/templates/firewall.html:81 msgid "Permitted" -msgstr "" +msgstr "Разрешено" #: plinth/modules/firewall/templates/firewall.html:84 msgid "Permitted (internal only)" -msgstr "" +msgstr "Разрешено (только внутренние)" #: plinth/modules/firewall/templates/firewall.html:87 msgid "Permitted (external only)" -msgstr "" +msgstr "Разрешено (только внешние)" #: plinth/modules/firewall/templates/firewall.html:90 msgid "Blocked" -msgstr "" +msgstr "Заблокировано" #: plinth/modules/firewall/templates/firewall.html:103 msgid "" @@ -697,28 +787,31 @@ msgid "" "also permitted in the firewall and when you disable a service it is also " "disabled in the firewall." msgstr "" +"Действия брандмауэр автоматические. При включении службы, она также " +"разрешается в брандмауэре и при отключении службы она также запрещается в " +"брандмауэре." #: plinth/modules/first_boot/forms.py:48 plinth/modules/users/forms.py:70 msgid "Creating LDAP user failed." -msgstr "" +msgstr "Создание пользователя LDAP не удалось." #: plinth/modules/first_boot/forms.py:56 msgid "Failed to add new user to admin group." -msgstr "" +msgstr "Не удалось добавить нового пользователя в группу администратора." #: plinth/modules/first_boot/forms.py:78 msgid "User account created, you are now logged in" -msgstr "" +msgstr "Учетная запись пользователя создана, теперь вы вошли" #: plinth/modules/first_boot/templates/firstboot_navbar.html:23 #: plinth/modules/help/templates/help_index.html:25 #: plinth/templates/base.html:102 msgid "Help" -msgstr "" +msgstr "Справка" #: plinth/modules/first_boot/templates/firstboot_state0.html:45 msgid "Start Setup" -msgstr "" +msgstr "Запуск программы установки" #: plinth/modules/first_boot/templates/firstboot_state0.html:49 #, python-format @@ -726,10 +819,12 @@ msgid "" "To complete the setup of your %(box_name)s, please provide some basic " "information." msgstr "" +"Для завершения установки вашей %(box_name)s, просьба представьте некоторую " +"базовую информацию." #: plinth/modules/first_boot/templates/firstboot_state1.html:41 msgid "Administrator Account" -msgstr "" +msgstr "Учетная запись администратора" #: plinth/modules/first_boot/templates/firstboot_state1.html:44 msgid "" @@ -737,6 +832,9 @@ msgid "" "can be changed later. This user will be granted administrative privileges. " "Other users can be added later." msgstr "" +"Выберите имя пользователя и пароль для доступа к веб-интерфейсу. Пароль " +"можно изменить позднее. Этому пользователю будут предоставляться " +"административные привилегии. Другие пользователи могут быть добавлены позже." #: plinth/modules/first_boot/templates/firstboot_state1.html:57 msgid "Box it up!" @@ -744,7 +842,7 @@ msgstr "" #: plinth/modules/first_boot/templates/firstboot_state10.html:29 msgid "Setup Complete!" -msgstr "" +msgstr "Установка Завершена!" #: plinth/modules/first_boot/templates/firstboot_state10.html:32 #, python-format @@ -753,54 +851,59 @@ msgid "" "you need some applications. They will be installed the first time you " "access them." msgstr "" +"Установка %(box_name)s Завершена. Чтобы сделать ваш %(box_name)s " +"функциональным, вам нужны некоторые приложения. Они могут быть по первому " +"доступу к ним." #: plinth/modules/first_boot/templates/firstboot_state10.html:41 msgid "Go to Apps" -msgstr "" +msgstr "Перейдите в раздел приложения" #: plinth/modules/first_boot/templates/firstboot_state10.html:44 msgid "Current Network Configuration" -msgstr "" +msgstr "Текущая конфигурация сети" #: plinth/modules/first_boot/templates/firstboot_state10.html:47 msgid "" "You should check the network setup and modify it if necessary. Do not forget " "to change the default Wi-Fi passwords!" msgstr "" +"Вам необходимо проверить настройки сети и изменить их при необходимости. Не " +"забудьте изменить пароли Wi-Fi по умолчанию!" #: plinth/modules/first_boot/templates/firstboot_state10.html:57 msgid "Go to Networks" -msgstr "" +msgstr "Перейти к сетям" #: plinth/modules/first_boot/views.py:60 msgid "Setup Complete" -msgstr "" +msgstr "Установка Завершена" #: plinth/modules/help/help.py:34 msgid "Documentation" -msgstr "" +msgstr "Документация" #: plinth/modules/help/help.py:36 msgid "Where to Get Help" -msgstr "" +msgstr "Где получить помощь" #: plinth/modules/help/help.py:38 msgid "Manual" -msgstr "" +msgstr "Вручную" #: plinth/modules/help/help.py:48 msgid "Documentation and FAQ" -msgstr "" +msgstr "Документация и FAQ" #: plinth/modules/help/help.py:55 #, python-brace-format msgid "About {box_name}" -msgstr "" +msgstr "О {box_name}" #: plinth/modules/help/help.py:73 #, python-brace-format msgid "{box_name} Manual" -msgstr "" +msgstr "Руководство {box_name}" #: plinth/modules/help/templates/help_about.html:30 #, python-format @@ -813,6 +916,14 @@ msgid "" "and a Tor relay, on a device that can replace your Wi-Fi router, so that " "your data stays with you." msgstr "" +"%(box_name)s - это проект сообщества для разработки, дизайна и поощрения " +"личных серверов под управлением свободного программного обеспечения для " +"частных, личных сообщений. Это сетевое устройство, предназначенное разрешить " +"взаимодействие с остальной частью Интернета в условиях защиты " +"конфиденциальности и безопасности данных. Он содержит различные приложения, " +"такие как блог, вики, веб-сайт, социальную сеть, электронную почту, Web-" +"прокси и сервер Tor, на устройстве, которое может заменить ваш маршрутизатор " +"Wi-Fi, так что ваши данные остаются с вами." #: plinth/modules/help/templates/help_about.html:43 msgid "" @@ -823,6 +934,12 @@ msgid "" "giving back power to the users over their networks and machines, we are " "returning the Internet to its intended peer-to-peer architecture." msgstr "" +"Мы живем в мире, сетями владеют те, с кем у нас не всегда общие интересы. " +"Путем создания программного обеспечения, которое не полагается на " +"центральную службу, мы можем восстановить контроль и конфиденциальность. " +"Сохраняя наши данные в наших домах, мы получаем полезную правовую защиту над " +"ними. Давая обратно власть пользователям в их сетях и машины, мы " +"возвращаемся к его предполагаемую архитектуру Интернета peer-to-peer." #: plinth/modules/help/templates/help_about.html:56 #, python-format @@ -831,6 +948,8 @@ msgid "" "services; %(box_name)s aims to bring them all together in a convenient " "package." msgstr "" +"Существует ряд проектов, которые работают в сторону реализации будущего " +"распределенных служб, %(box_name)s стремится объединить их в удобном пакете." #: plinth/modules/help/templates/help_about.html:64 #, python-format @@ -838,20 +957,22 @@ msgid "" "For more information about the %(box_name)s project, see the %(box_name)s Wiki." msgstr "" +"Дополнительные сведения о проекте %(box_name)s смотрите в Wiki ." #: plinth/modules/help/templates/help_about.html:73 msgid "Learn more »" -msgstr "" +msgstr "Подробнее »" #: plinth/modules/help/templates/help_about.html:76 #, python-format msgid "You are running Plinth version %(version)s." -msgstr "" +msgstr "Вы используете Plinth версии %(version)s." #: plinth/modules/help/templates/help_base.html:36 #, python-format msgid "%(box_name)s Setup" -msgstr "" +msgstr "Установка %(box_name)s" #: plinth/modules/help/templates/help_index.html:29 #, python-format From 73c125f1ae18201a4d7f9cc805c5b7fadbe4f7af Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Fri, 5 Feb 2016 20:24:24 -0500 Subject: [PATCH 064/189] Remove Plinth.egg-info/ during clean. Fixes #335. --- setup.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index f1c92d95f..c56b01c4c 100755 --- a/setup.py +++ b/setup.py @@ -107,9 +107,10 @@ class CustomBuild(build): class CustomClean(clean): - """Override clean command to clean documentation directory""" + """Override clean command to clean doc, locales, and egg-info.""" def run(self): """Execute clean command""" + subprocess.check_call(['rm', '-rf', 'Plinth.egg-info/']) subprocess.check_call(['make', '-C', 'doc', 'clean']) for dir_path, dir_names, file_names in os.walk('plinth/locale/'): for file_name in file_names: From 41db74d6cd889ba109c5987de160af7bb9922222 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sun, 7 Feb 2016 11:30:25 +0530 Subject: [PATCH 065/189] =?UTF-8?q?Translated=20using=20Transifex=20(Norwe?= =?UTF-8?q?gian=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plinth/locale/nb/LC_MESSAGES/django.po | 703 +++++++++---------------- 1 file changed, 238 insertions(+), 465 deletions(-) diff --git a/plinth/locale/nb/LC_MESSAGES/django.po b/plinth/locale/nb/LC_MESSAGES/django.po index ab90a45f5..18b4d1941 100644 --- a/plinth/locale/nb/LC_MESSAGES/django.po +++ b/plinth/locale/nb/LC_MESSAGES/django.po @@ -4,9 +4,10 @@ # # Translators: # abjectio, 2015 +# Ingrid Yrvin , 2015-2016 # Ingrid Yrvin , 2015 -# Ingrid Yrvin , 2015 -# oeyrvin , 2015 +# Ole-Erik Yrvin , 2015 +# Ole-Erik Yrvin , 2016 # pere , 2015-2016 # Petter Reinholdtsen , 2015 # Philippe Baret , 2015 @@ -14,9 +15,9 @@ msgid "" msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-01-31 22:19+0530\n" -"PO-Revision-Date: 2016-01-16 08:50+0000\n" -"Last-Translator: pere \n" +"POT-Creation-Date: 2016-02-07 11:29+0530\n" +"PO-Revision-Date: 2016-02-04 17:12+0000\n" +"Last-Translator: Ingrid Yrvin \n" "Language-Team: Norwegian Bokmål (http://www.transifex.com/freedombox/plinth/" "language/nb/)\n" "Language: nb\n" @@ -105,14 +106,7 @@ msgid "Enable service discovery" msgstr "Aktivere finne tjenesten (Service Discovery)" #: plinth/modules/avahi/templates/avahi.html:29 -#, fuzzy, python-format -#| msgid "" -#| "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." +#, python-format msgid "" "Service discovery allows other devices on the network to discover your " "%(box_name)s and services running on it. It also allows %(box_name)s to " @@ -121,12 +115,12 @@ msgid "" "disabled to improve security especially when connecting to a hostile local " "network." msgstr "" -"Finne tjenester (tjenesten Discovery) tillater andre maskiner i nettverket å " -"finne din FreedomBox og tjenester som kjører på den. Den tillater også " -"FreedomBox å oppdage andre maskiner og tjenester som kjører på det lokale " -"nettverket. Å finne tjenesten er ikke avgjørende, og virker bare i interne " -"nettverk. Det kan være deaktivert for å bedre sikkerheten, spesielt når du " -"kobler til et fremmed lokalt nettverk." +"Finne tjenester (tjenesten Discovery) tillater andre enheter i nettverket å " +"oppdage din %(box_name)s og tjenester som kjører på den. Den tillater også " +"%(box_name)s å oppdage andre enheter og tjenester som kjører på det lokale " +"nettverket. Discovery er ikke avgjørende, og virker bare på interne " +"nettverk. De kan deaktiveres for å bedre sikkerheten, spesielt når du kobler " +"til et fremmed lokalt nettverk." #: plinth/modules/avahi/templates/avahi.html:40 #: plinth/modules/datetime/templates/datetime.html:35 @@ -226,22 +220,17 @@ msgid "Hostname" msgstr "Vertsnavn" #: plinth/modules/config/config.py:97 -#, fuzzy, python-brace-format -#| msgid "" -#| "Hostname is the local name by which other machines on the local network " -#| "reach your machine. It must start and end with an alphabet or a digit " -#| "and have as interior characters only alphabets, digits and hyphens. " -#| "Total length must be 63 characters or less." +#, python-brace-format msgid "" "Hostname is the local name by which other devices on the local network can " "reach your {box_name}. It must start and end with an alphabet or a digit " "and have as interior characters only alphabets, digits and hyphens. Total " "length must be 63 characters or less." msgstr "" -"Vertsnavn er det lokale navnet som andre maskiner på ditt lokalnett bruker " -"for å nå din maskin. Det må starte og slutte med en bokstav eller et " -"siffer, og som interne tegn kun ha bokstaver, siffer eller bindestrek. " -"Total lengde må være 63 tegn eller mindre." +"Vertsnavn er det lokale navnet som andre enheter i det lokale nettverket kan " +"nå ditt {box_name} med. Det må starte og avslutte med en bokstav eller et " +"tall, og inneholde bokstaver tall eller bindrestreker. Lengden må være 63 " +"tegn eller mindre." #: plinth/modules/config/config.py:105 msgid "Invalid hostname" @@ -254,14 +243,7 @@ msgid "Domain Name" msgstr "Domenenavn" #: plinth/modules/config/config.py:110 -#, fuzzy, python-brace-format -#| msgid "" -#| "Domain name is the global name by which other machines on the Internet " -#| "can reach you. It must consist of labels separated by dots. Each label " -#| "must start and end with an alphabet or a digit and have as interior " -#| "characters only alphabets, digits and hyphens. Length of each label must " -#| "be 63 characters or less. Total length of domain name must be 253 " -#| "characters or less." +#, python-brace-format msgid "" "Domain name is the global name by which other devices on the Internet can " "reach your {box_name}. It must consist of labels separated by dots. Each " @@ -270,22 +252,19 @@ msgid "" "63 characters or less. Total length of domain name must be 253 characters " "or less." msgstr "" -"Domenenavn er det globale navnet som andre maskiner på Internett bruker for " -"å nå din maskin. Det må bestå av delnavn med punktum mellom seg. Hvert " -"delnavn må starte og slutte med en bokstav eller et siffer, og som interne " -"tegn kun ha bokstaver, siffer eller bindestrek. Lengden på hvert delnavn må " -"være 63 tegn eller færre. Total lengde for domenenavnet må være 253 tegn " -"eller færre." +"Domenenavnet er det globale navnet som andre enheter på Internettet kan nå " +"ditt {box_name} med. Det må bestå av merkelapper atskilt med punktum. Hver " +"merkelapp må starte og avslutte med en bokstav eller et tall, og imellom " +"bare bokstaver, tall og bindestreker. Lengden på hver merkelapp må være 63 " +"tegn, eller mindre. Lengden på domenenavnet må være 253 tegn, eller mindre." #: plinth/modules/config/config.py:125 msgid "Language" msgstr "Språk" #: plinth/modules/config/config.py:127 -#, fuzzy -#| msgid "Language for this FreedomBox web administration interface" msgid "Language for this web administration interface" -msgstr "Språk for webadministrasjonsgrensesnittet til denne FreedomBox-en" +msgstr "Språk i denne nettadministrasjonens brukergrensesnitt. " #: plinth/modules/config/config.py:135 #: plinth/modules/dynamicdns/dynamicdns.py:37 @@ -515,22 +494,17 @@ msgstr "" "oppført, kan du bruke leverandørens nettadresse for oppdatering." #: plinth/modules/dynamicdns/dynamicdns.py:80 -#, fuzzy -#| msgid "" -#| "Please do not enter a URL here (like \"https://example.com/\") but only " -#| "the hostname of the GnuDIP server (like \"example.pcom\")." msgid "" "Please do not enter a URL here (like \"https://example.com/\") but only the " "hostname of the GnuDIP server (like \"example.com\")." msgstr "" -"Vennligst ikke kjør en nettadresse her (som \"https://example.com/\") men " -"bare vertsnavnet til GnuDIP-tjeneren (som \"example.com\")." +"Vennligst ikke kjør en nettadresse her (som \"https://example.com/\"), men " +"bare vertsnavnet til GnuDIP-serveren (som \"example.com\")." #: plinth/modules/dynamicdns/dynamicdns.py:84 -#, fuzzy, python-brace-format -#| msgid "The public domain name you want use to reach your box." +#, python-brace-format msgid "The public domain name you want use to reach your {box_name}." -msgstr "Det offentlige domenenavnet du vil bruke for å nå din boks." +msgstr "Det offentlige domenenavnet du vil bruke for å nå ditt {box_name}." #: plinth/modules/dynamicdns/dynamicdns.py:87 msgid "Use this option if your provider uses self signed certificates." @@ -551,22 +525,17 @@ msgid "" msgstr "La dette feltet stå tomt hvis du vil beholde ditt forrige passord." #: plinth/modules/dynamicdns/dynamicdns.py:96 -#, fuzzy, python-brace-format -#| msgid "" -#| "Optional Value. If your FreedomBox is not connected directly to the " -#| "Internet (i.e. connected to a NAT router) this URL is used to figure out " -#| "the real Internet IP. The URL should simply return the IP wherethe client " -#| "comes from. Example: http://myip.datasystems24.de" +#, python-brace-format msgid "" "Optional Value. If your {box_name} is not connected directly to the Internet " "(i.e. connected to a NAT router) this URL is used to figure out the real " "Internet IP. The URL should simply return the IP where the client comes from " "(example: http://myip.datasystems24.de)." msgstr "" -"Valgfri verdi. Hvis din FreedomBox ikke er koblet direkte til Internett " -"(dvs. koblet til en NAT-ruter) brukes denne nettadressen til å finne den " -"virkelige Internett-IP. Nettadressen skal bare returnere IP-en som klienten " -"kommer fra. Eksempel: http://myip.datasystems24.de" +"Valgfri verdi. Hvis ditt {box_name} ikke er koblet direkte til Internett " +"(dvs. koblet til en NAT-ruter), blir denne nettadressen brukt til å finne " +"den virkelige Internett-IP-en. Nettadressen skal bare returnere IP-en som " +"tjeneren kommer fra (eksempelvis: http://myip.datasystems24.de). " #: plinth/modules/dynamicdns/dynamicdns.py:104 msgid "" @@ -595,16 +564,12 @@ msgid "Update URL" msgstr "Oppdater URL" #: plinth/modules/dynamicdns/dynamicdns.py:135 -#, fuzzy -#| msgid "accept all SSL certificates" msgid "Accept all SSL certificates" -msgstr "godta alle SSL-sertifikater" +msgstr "Godta alle SSL-sertifikater" #: plinth/modules/dynamicdns/dynamicdns.py:139 -#, fuzzy -#| msgid "use HTTP basic authentication" msgid "Use HTTP basic authentication" -msgstr "benytt HTTP grunnleggende autentisering" +msgstr "Bruk HTTP basisgodkjenning" #: plinth/modules/dynamicdns/dynamicdns.py:151 #: plinth/modules/networks/forms.py:146 plinth/modules/transmission/forms.py:39 @@ -650,38 +615,22 @@ msgid "Status of Dynamic DNS" msgstr "Status for dynamisk DNS" #: plinth/modules/dynamicdns/templates/dynamicdns.html:25 -#, fuzzy -#| msgid "DynamicDNS client" msgid "Dynamic DNS Client" msgstr "Dynamisk DNS-klient" #: plinth/modules/dynamicdns/templates/dynamicdns.html:28 -#, fuzzy, python-format -#| msgid "" -#| "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)." +#, python-format msgid "" "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 %(box_name)s, such as ownCloud." msgstr "" -"Hvis Internett-leverandøren endrer din IP-adresse periodisk (dvs. hver 24h/ " -"hver 24 time) kan det være vanskelig for andre å finne deg på Internett. Og " -"av den grunn kan ingen finne de tjenestene som leveres av FreedomBox (som " -"din ownCloud)." +"Hvis Internett-leverandøren endrer din IP-adresse periodisk (for eksempel " +"hver 24. time), kan det være vanskelig for andre å finne deg på Internettet. " +"Av denne grunn kan ingen finne tjenestene som leveres av %(box_name)s, som " +"for eksempel av ownCloud." #: plinth/modules/dynamicdns/templates/dynamicdns.html:37 -#, fuzzy -#| msgid "" -#| "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 gnudip " -#| "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." msgid "" "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 " @@ -690,11 +639,12 @@ msgid "" "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." msgstr "" -"Hvis IP endres av din internettleverandør, tillater dynamisk DNS å presse " -"din nåværende offentlige IP-adressen til en gnudip -tjener. Nå vil tjeneren " -"tildele ditt DNS-navn med den nye IP-en, og hvis noen fra Internettet ber om " -"ditt DNS-navn blir din nåværende IP besvart." +"Løsningen er å tildele et DNS-navn til din IP-adresse, og oppdatere DNS-" +"navnet hver gang din IP endres av din Internett-leverandør. Dynamisk DNS kan " +"du presse din nåværende offentlige IP-adressen til en gnudip -tjener. Nå vil " +"tjeneren tildele ditt DNS-navn med den nye IP-en, og hvis noen fra " +"Internettet ber om ditt DNS-navn, blir din nåværende IP besvart." #: plinth/modules/dynamicdns/templates/dynamicdns.html:50 msgid "" @@ -711,18 +661,14 @@ msgstr "" "target=\"_blank\"> freedns.afraid.org ." #: plinth/modules/dynamicdns/templates/dynamicdns.html:61 -#, fuzzy, python-format -#| msgid "" -#| "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." +#, python-format msgid "" "If your %(box_name)s is connected behind some NAT router, don't forget to " "add port forwarding (i.e. forward some standard ports like 80 and 443)." msgstr "" -"Hvis FreedomBox er koblet bak en NAT-ruter, ikke glem å legge videresending " -"av porten (dvs. videresende noen standard porter som 80 og 443) til din " -"FreedomBox enhet." +"Hvis din %(box_name)s er tilkoblet bak en NAT-ruter, ikke glem å legge til " +"port for å videresende (dvs. videresende til noen standard porter som 80 og " +"443)." #: plinth/modules/dynamicdns/templates/dynamicdns_configure.html:30 msgid "" @@ -745,28 +691,21 @@ msgstr "" "vi ikke oppdage NAT-typen." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:35 -#, fuzzy -#| msgid "Direct connection to the internet." msgid "Direct connection to the Internet." -msgstr "Direkte kobling til Internett." +msgstr "Direkte forbindelse til Internettet." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:37 -#, fuzzy, python-format -#| msgid "" -#| "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)s " -#| "minutes until we update your DNS entry in case of WAN IP change." +#, python-format msgid "" "Behind NAT. This means that Dynamic DNS service will poll the \"IP check URL" "\" for changes (the \"IP check URL\" entry is needed for this - otherwise IP " "changes will not be detected). In case the WAN IP changes, it may take up " "to %(timer)s minutes until your DNS entry is updated." msgstr "" -"Bak NAT, betyr dette at den dynamiske DNS-tjenesten vil spørre etter «IP " -"sjekk URL» etter endringer (vi trenger «IP sjekk URL» på grunn av dette - " -"ellers vil vi ikke oppdage IP-endringer). Det kan ta opptil %(timer)s " -"minutter før vi oppdaterer din DNS-inngang i tilfelle av endring av WAN IP." +"Bak NAT. Dette betyr at Dynamic DNS-tjenesten vil undersøke endringene i «IP " +"check URL» («check URL IP»-adgangen er nødvendig - ellers vil ikke IP-" +"endringene bli oppdaget). I tilfelle WAN IP endres, kan det ta opp til " +"%(timer)s minutter til DNS-adgangen er oppdatert. " #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:48 msgid "Last update" @@ -779,23 +718,19 @@ msgid "Firewall" msgstr "Brannmur" #: plinth/modules/firewall/templates/firewall.html:28 -#, fuzzy, python-format -#| msgid "" -#| "Firewall is a network security system that controls the incoming and " -#| "outgoing network traffic on your %(box_name)s. Keeping a firewall enabled " -#| "and properly configured reduces risk of security threat from the Internet." +#, python-format msgid "" "Firewall is a security system that controls the incoming and outgoing " "network traffic on your %(box_name)s. Keeping a firewall enabled and " "properly configured reduces risk of security threat from the Internet." msgstr "" -"Firewall er et sikkerhetssystem for nettverk som styrer innkommende og " -"utgående nettverkstrafikk på %(box_name)s. Å holde en brannmur aktivert og " -"riktig konfigurert, reduserer risikoen for sikkerhetstrusler fra Internett." +"Firewall er et sikkerhetssystem som styrer innkommende og utgående " +"nettverkstrafikk på din %(box_name)s. Å holde en brannmur aktivert og riktig " +"oppsatt reduserer risikoen for sikkerhetstrusler fra Internett." #: plinth/modules/firewall/templates/firewall.html:36 msgid "Current status:" -msgstr "" +msgstr "Nåværende status:" #: plinth/modules/firewall/templates/firewall.html:41 #, python-format @@ -843,19 +778,14 @@ msgid "Blocked" msgstr "Blokkert" #: plinth/modules/firewall/templates/firewall.html:103 -#, fuzzy -#| msgid "" -#| "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." msgid "" "The operation of the firewall is automatic. When you enable a service it is " "also permitted in the firewall and when you disable a service it is also " "disabled in the firewall." msgstr "" -"Driften av brannmuren er automatisk. Når du aktiverer en tjeneste, blir den " -"automatisk tillatt i brannmuren, og hvis du deaktiverer en tjeneste, blir " -"den automatisk deaktivert i brannmuren." +"Driften av brannmuren er automatisk. Når du aktiverer en tjeneste, er den " +"også tillatt i brannmuren, og når du deaktiverer en tjeneste, er den også " +"deaktivert i brannmuren." #: plinth/modules/first_boot/forms.py:48 plinth/modules/users/forms.py:70 msgid "Creating LDAP user failed." @@ -876,10 +806,8 @@ msgid "Help" msgstr "Hjelp" #: plinth/modules/first_boot/templates/firstboot_state0.html:45 -#, fuzzy -#| msgid "Start setup" msgid "Start Setup" -msgstr "Start oppsett" +msgstr "Start Setup" #: plinth/modules/first_boot/templates/firstboot_state0.html:49 #, python-format @@ -887,6 +815,8 @@ msgid "" "To complete the setup of your %(box_name)s, please provide some basic " "information." msgstr "" +"For å fullføre oppsettet til din %(box_name)s, trengs det noen " +"basisinformasjoner." #: plinth/modules/first_boot/templates/firstboot_state1.html:41 msgid "Administrator Account" @@ -911,40 +841,30 @@ msgid "Setup Complete!" msgstr "Oppsett komplett!" #: plinth/modules/first_boot/templates/firstboot_state10.html:32 -#, fuzzy, python-format -#| msgid "" -#| "To make your FreedomBox functional, you need some applications. " -#| "Applications will be installed the first time you access them." +#, python-format msgid "" "%(box_name)s setup is now complete. To make your %(box_name)s functional, " "you need some applications. They will be installed the first time you " "access them." msgstr "" -"For å gjøre din FreedomBox funksjonell trenger du noen programmer. De vil " -"bli installert første gang du bruker dem." +"%(box_name)s-oppsettet er nå fullført. For å få din %(box_name)s funksjonell " +"trenger du noen programmer. De vil bli installert første gang du åpner dem. " #: plinth/modules/first_boot/templates/firstboot_state10.html:41 msgid "Go to Apps" msgstr "Gå til applikasjoner" #: plinth/modules/first_boot/templates/firstboot_state10.html:44 -#, fuzzy -#| msgid "Network Configuration" msgid "Current Network Configuration" -msgstr "Nettverkskonfigurering" +msgstr "Nåværende nettverksoppsett" #: plinth/modules/first_boot/templates/firstboot_state10.html:47 -#, fuzzy -#| msgid "" -#| "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." msgid "" "You should check the network setup and modify it if necessary. Do not forget " "to change the default Wi-Fi passwords!" msgstr "" -"FreedomBox-oppsettet er nå fullført. Men du bør sjekke nettverksoppsettet og " -"endre det om nødvendig. Ikke glem å endre standard Wi-Fi-passordene." +"Du bør sjekke nettverksoppsettet, og endre det om nødvendig. Ikke glem å " +"endre standard Wi-Fi-passordene!" #: plinth/modules/first_boot/templates/firstboot_state10.html:57 msgid "Go to Networks" @@ -964,7 +884,7 @@ msgstr "Hvor kan en få hjelp" #: plinth/modules/help/help.py:38 msgid "Manual" -msgstr "" +msgstr "Manual" #: plinth/modules/help/help.py:48 msgid "Documentation and FAQ" @@ -976,21 +896,12 @@ msgid "About {box_name}" msgstr "Om {box_name}" #: plinth/modules/help/help.py:73 -#, fuzzy, python-brace-format -#| msgid "About {box_name}" +#, python-brace-format msgid "{box_name} Manual" -msgstr "Om {box_name}" +msgstr "{box_name} Manual" #: plinth/modules/help/templates/help_about.html:30 -#, fuzzy, python-format -#| msgid "" -#| "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." +#, python-format msgid "" "%(box_name)s is a community project to develop, design and promote personal " "servers running free software for private, personal communications. It is a " @@ -1000,13 +911,13 @@ msgid "" "and a Tor relay, on a device that can replace your Wi-Fi router, so that " "your data stays with you." msgstr "" -"FreedomBox er et fellesskapsprosjekt for å utvikle, designe og fremme " -"personlige tjenermaskiner som kjører gratis programvare for privat, " -"personlig kommunikasjon. Det er et nettverksprogram utviklet for å tillate " -"samvirke med resten av Internett med beskyttet personvern og datasikkerhet. " -"Det har applikasjoner som blogg, wiki, hjemmeside, sosiale nettverk, e-post, " -"nettmellomtjener og et Tor relé på en enhet som kan erstatte din Wi-Fi-" -"ruter, slik at dataene blir hos deg." +"%(box_name)s er et communityprosjekt (fellesskapsprosjekt) for å utvikle, " +"designe og fremme personlige servere som kjører gratis programvare for " +"privat, personlig kommunikasjon. Det er en nettverksanvendelse utviklet for " +"å tillate samvirke med resten av Internettet med beskyttet personvern og " +"datasikkerhet. Det omfatter programmer som blogg, wiki, hjemmeside, sosiale " +"nettverk, e-post, mellomtjener for nett og et Tor relé, samlet på en enhet " +"som kan erstatte din Wi-Fi-ruter, slik at dataene dine blir hos deg." #: plinth/modules/help/templates/help_about.html:43 msgid "" @@ -1026,30 +937,24 @@ msgstr "" "arkitektur." #: plinth/modules/help/templates/help_about.html:56 -#, fuzzy, python-format -#| msgid "" -#| "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." +#, python-format msgid "" "There are a number of projects working to realize a future of distributed " "services; %(box_name)s aims to bring them all together in a convenient " "package." msgstr "" -"En rekke prosjekter arbeider for å realisere en fremtid med distribuerte " -"tjenester; FreedomBoxs mål er å bringe alle sammen i en praktisk pakke." +"Det er en rekke prosjekter som arbeider for å realisere en fremtid med " +"distribuerte tjenester; %(box_name)s mål er å bringe dem sammen i en " +"praktisk pakke." #: plinth/modules/help/templates/help_about.html:64 -#, fuzzy, python-format -#| msgid "" -#| "For more information about the FreedomBox project, see the FreedomBox Wiki." +#, python-format msgid "" "For more information about the %(box_name)s project, see the %(box_name)s Wiki." msgstr "" -"For mer informasjon om FreedomBox prosjektet, se FreedomBox Wiki." +"For mer informasjon om %(box_name)s-prosjektet, se %(box_name)s Wiki." #: plinth/modules/help/templates/help_about.html:73 msgid "Learn more »" @@ -1063,49 +968,38 @@ msgstr "Du benytter Plinth versjon %(version)s." #: plinth/modules/help/templates/help_base.html:36 #, python-format msgid "%(box_name)s Setup" -msgstr "" +msgstr "%(box_name)s Oppsett" #: plinth/modules/help/templates/help_index.html:29 -#, fuzzy, python-format -#| msgid "" -#| "The FreedomBox Manual is the best place to " -#| "start for information regarding %(box_name)s." +#, python-format msgid "" "The %(box_name)s Manual is the best place to " "start for information regarding %(box_name)s." msgstr "" -"FreedomBox Manual \n" -"er det beste stedet å starte for informasjon om %(box_name)s." +"Det beste stedet å starte for å få informasjon om %(box_name)s er %(box_name)s Manual." #: plinth/modules/help/templates/help_index.html:36 -#, fuzzy, python-format -#| msgid "" -#| " " -#| "FreedomBox project wiki contains further information." +#, python-format msgid "" " " "%(box_name)s project wiki contains further information." msgstr "" -" FreedomBox " -"prosjekt wiki har ytterligere informasjon." +" " +"%(box_name)s project wiki har mer informasjon." #: plinth/modules/help/templates/help_index.html:43 -#, fuzzy, python-format -#| msgid "" -#| "To seek help from FreedomBox community, queries may be posted on the mailing list. The list archives also contain information about " -#| "problems faced by other users and possible solutions." +#, python-format msgid "" "To seek help from %(box_name)s community, queries may be posted on the mailing list. The list archives also contain information about " "problems faced by other users and possible solutions." msgstr "" -"Å søke hjelp fra fellesskapet til FreedomBox-fellesskapet, kan spørsmål " -"legges ut på mailing list. Listen har også informasjon om " -"problemer andre brukere møter, og mulige løsninger." +"For å få hjelp fra %(box_name)s community, kan henvendelser legges inn på mailing list. Listen inneholder også informasjon om problemer andre " +"brukere har møtt, og mulige løsninger." #: plinth/modules/help/templates/help_index.html:53 #, python-format @@ -1115,24 +1009,22 @@ msgid "" "oftc.net/?randomnick=1&channels=freedombox&prompt=1\"> #freedombox " "channel using the IRC web interface." msgstr "" +"Mange %(box_name)s bidragsytere og brukere er også tilgjengelige i irc.oftc." +"net IRC-nettverket. Delta og be om hjelp på #freedombox-kanalen " +"ved å bruke IRC-nettbrukergrensesnittet. " #: plinth/modules/ikiwiki/__init__.py:38 -#, fuzzy -#| msgid "Wiki & Blog (Ikiwiki)" msgid "Wiki and Blog (ikiwiki)" -msgstr "Wiki og blogg (Ikiwiki)" +msgstr "Wiki og blogg (ikiwiki)" #: plinth/modules/ikiwiki/__init__.py:43 -#, fuzzy -#| msgid "Ikiwiki wikis and blogs" msgid "ikiwiki wikis and blogs" -msgstr "Ikiwiki wikier og blogger" +msgstr "ikiwiki wikis og blogger" #: plinth/modules/ikiwiki/forms.py:29 -#, fuzzy -#| msgid "Enable Ikiwiki" msgid "Enable ikiwiki" -msgstr "Aktiver Ikiwiki" +msgstr "Aktiver ikiwiki" #: plinth/modules/ikiwiki/forms.py:36 #: plinth/modules/networks/templates/connection_show.html:98 @@ -1161,22 +1053,17 @@ msgstr "" "ikiwiki." #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:27 -#, fuzzy, python-format -#| msgid "Delete Wiki/Blog %(name)s" +#, python-format msgid "Delete Wiki or Blog %(name)s" -msgstr "Slett Wiki/Blogg %(name)s" +msgstr "Slette wiki eller blogg %(name)s" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:33 -#, fuzzy -#| msgid "" -#| "This action will remove all the posts, pages and comments including " -#| "revision history. Delete this wiki/blog permanently?" msgid "" "This action will remove all the posts, pages and comments including revision " "history. Delete this wiki or blog permanently?" msgstr "" -"Denne handlingen vil fjerne alle innlegg, sider og kommentarer, medregnet " -"endringshistorikken. Slette wiki/blogg permanent?" +"Denne handlingen vil fjerne alle poster, sider og kommentarer inkludert " +"revisjonshistorien. Skal denne wiki eller bloggen slettes permanent?" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:44 #, python-format @@ -1192,11 +1079,11 @@ msgstr "Kanseller" #: plinth/modules/ikiwiki/templates/ikiwiki_manage.html:41 msgid "No wikis or blogs available." -msgstr "Ingen wikier eller blogger tilgjengelig." +msgstr "Ingen wikis eller blogger tilgjengelig." #: plinth/modules/ikiwiki/templates/ikiwiki_manage.html:45 msgid "Create a Wiki or Blog" -msgstr "Opprett en Wiki eller blogg" +msgstr "Opprett en Wiki eller Blogg" #: plinth/modules/ikiwiki/templates/ikiwiki_manage.html:55 #, python-format @@ -1217,20 +1104,16 @@ msgid "Create" msgstr "Opprett" #: plinth/modules/ikiwiki/views.py:73 -#, fuzzy -#| msgid "Wiki & Blog" msgid "Wiki and Blog" -msgstr "Wiki og blogg" +msgstr "Wiki og Blogg" #: plinth/modules/ikiwiki/views.py:106 msgid "Manage Wikis and Blogs" -msgstr "Vedlikehold Wiki og blogg" +msgstr "Vedlikehold Wiki og Blogg" #: plinth/modules/ikiwiki/views.py:132 -#, fuzzy -#| msgid "Create a Wiki or Blog" msgid "Create Wiki or Blog" -msgstr "Opprett en Wiki eller blogg" +msgstr "Lage Wiki eller Blogg" #: plinth/modules/ikiwiki/views.py:145 #, python-brace-format @@ -1240,7 +1123,7 @@ msgstr "Opprettet wiki {name}." #: plinth/modules/ikiwiki/views.py:147 #, python-brace-format msgid "Could not create wiki: {error}" -msgstr "Kunne ikke opprette Wiki: {error}" +msgstr "Kunne ikke opprette wiki: {error}" #: plinth/modules/ikiwiki/views.py:159 #, python-brace-format @@ -1263,16 +1146,14 @@ msgid "Could not delete {name}: {error}" msgstr "Kunne ikke slette {name}: {error}" #: plinth/modules/ikiwiki/views.py:182 -#, fuzzy -#| msgid "Delete Wiki/Blog" msgid "Delete Wiki or Blog" -msgstr "Slette Wiki/blogg" +msgstr "Slette wiki eller blogg" #: plinth/modules/letsencrypt/__init__.py:43 #: plinth/modules/letsencrypt/templates/letsencrypt.html:38 #: plinth/modules/letsencrypt/views.py:45 msgid "Certificates (Let's Encrypt)" -msgstr "" +msgstr "Sertifikater (Let's Encrypt)" #: plinth/modules/letsencrypt/templates/letsencrypt.html:41 #, python-format @@ -1283,6 +1164,11 @@ msgid "" "domain. It does so by proving itself to be the owner of a domain to Let's " "Encrypt, a certficate authority (CA)." msgstr "" +"Et digitalt sertifikat lar brukere av en nettjeneste bekrefte identiteten " +"til tjenesten, og til å kommunisere sikkert med den. %(box_name)s kan " +"automatisk få, og sette opp digitale sertifikater for hvert tilgjengelige " +"domene. Det gjøres ved å bekrefte eierskapet til et domene til " +"sertifiseringsinstansen (CA): Let's Encrypt." #: plinth/modules/letsencrypt/templates/letsencrypt.html:52 msgid "" @@ -1291,77 +1177,75 @@ msgid "" "read and agree with the Let's Encrypt Subscriber Agreement before using this service." msgstr "" +"Let's Encrypt er en gratis, automatisert, og åpen sertifiseringsinstans, til " +"allmenn nytte, laget av Internet Security Research Group (ISRG). Vennligst " +"les og aksepter Let's " +"Encrypt Subscriber Agreement før tjenesten brukes." #: plinth/modules/letsencrypt/templates/letsencrypt.html:66 #: plinth/modules/monkeysphere/templates/monkeysphere.html:70 -#, fuzzy -#| msgid "Domain Name" msgid "Domain" -msgstr "Domenenavn" +msgstr "Domene" #: plinth/modules/letsencrypt/templates/letsencrypt.html:67 msgid "Certificate Status" -msgstr "" +msgstr "Sertifikatsstatus" #: plinth/modules/letsencrypt/templates/letsencrypt.html:68 -#, fuzzy -#| msgid "Security" msgid "Website Security" -msgstr "Sikkerhet" +msgstr "Nettstedssikkerhet " #: plinth/modules/letsencrypt/templates/letsencrypt.html:69 #: plinth/modules/monkeysphere/templates/monkeysphere.html:72 -#, fuzzy -#| msgid "Applications" msgid "Actions" -msgstr "Anvendelser" +msgstr "Handlinger" #: plinth/modules/letsencrypt/templates/letsencrypt.html:79 #, python-format msgid "Expires on %(expiry_date)s" -msgstr "" +msgstr "Utløper %(expiry_date)s" #: plinth/modules/letsencrypt/templates/letsencrypt.html:85 msgid "No certficate" -msgstr "" +msgstr "Sertifikat mangler" #: plinth/modules/letsencrypt/templates/letsencrypt.html:102 msgid "Revoke" -msgstr "" +msgstr "Inndra" #: plinth/modules/letsencrypt/templates/letsencrypt.html:108 msgid "Re-obtain" -msgstr "" +msgstr "Gjeninnhente" #: plinth/modules/letsencrypt/templates/letsencrypt.html:115 msgid "Obtain" -msgstr "" +msgstr "Innhente" #: plinth/modules/letsencrypt/views.py:55 #, python-brace-format msgid "Certificate successfully revoked for domain {domain}" -msgstr "" +msgstr "Sertifikat vellykket tilbakekalt for domenet {domain}" #: plinth/modules/letsencrypt/views.py:60 #, python-brace-format msgid "Failed to revoke certificate for domain {domain}: {error}" -msgstr "" +msgstr "Klarte ikke å inndra sertifikatet for domenet {domain}: {error}" #: plinth/modules/letsencrypt/views.py:72 #, python-brace-format msgid "Certificate successfully obtained for domain {domain}" -msgstr "" +msgstr "Sertifikat vellykket innhentet til domene {domain}" #: plinth/modules/letsencrypt/views.py:77 #, python-brace-format msgid "Failed to obtain certificate for domain {domain}: {error}" -msgstr "" +msgstr "Klarte ikke å oppnå sertifikat til domene {domain}: {error}" #: plinth/modules/monkeysphere/__init__.py:32 #: plinth/modules/monkeysphere/templates/monkeysphere.html:35 #: plinth/modules/monkeysphere/views.py:44 msgid "Monkeysphere" -msgstr "" +msgstr "Monkeysphere" #: plinth/modules/monkeysphere/templates/monkeysphere.html:38 msgid "" @@ -1373,14 +1257,22 @@ msgid "" "key signing process. See the Monkeysphere SSH documentation for more details." msgstr "" +"Med Monkeysphere kan en PGP-nøkkel genereres for hvert konfigurert domene " +"som tjener (server) SSH. En offentlig PGP-nøkkel kan deretter lastes opp til " +"PGP-nøkkeltjenerne. Brukere som kobler til denne maskinen via SSH kan få " +"bekreftet at de kobler til riktig vert. For at brukerne skal stole på " +"nøkkelen, må minst en person (vanligvis maskinens eier) signere nøkkelen med " +"en vanlig PGP-nøkkel-godkjenningsprosess. Se Monkeysphere SSH documentation for flere detaljer." #: plinth/modules/monkeysphere/templates/monkeysphere.html:53 msgid "Publishing key to keyserver..." -msgstr "" +msgstr "Legge ut nøkkel til nøkkeltjenere" #: plinth/modules/monkeysphere/templates/monkeysphere.html:71 msgid "GPG Fingerprint" -msgstr "" +msgstr "GPG-fingeravtrykk" #: plinth/modules/monkeysphere/templates/monkeysphere.html:83 #: plinth/modules/names/views.py:45 @@ -1389,27 +1281,27 @@ msgstr "Ikke tilgjengelig" #: plinth/modules/monkeysphere/templates/monkeysphere.html:93 msgid "Generate PGP Key" -msgstr "" +msgstr "Generere PGP-nøkkel" #: plinth/modules/monkeysphere/templates/monkeysphere.html:101 msgid "Publish Key" -msgstr "" +msgstr "Legge ut nøkkel" #: plinth/modules/monkeysphere/views.py:58 msgid "Generated PGP key." -msgstr "" +msgstr "Generere PGP-nøkkel" #: plinth/modules/monkeysphere/views.py:83 msgid "Cancelled key publishing." -msgstr "" +msgstr "Avbrutt nøkkelutlegging" #: plinth/modules/monkeysphere/views.py:120 msgid "Published key to keyserver." -msgstr "" +msgstr "Publisert nøkkel til nøkkeltjener" #: plinth/modules/monkeysphere/views.py:122 msgid "Error occurred while publishing key." -msgstr "" +msgstr "Feil oppstått under utlegging av nøkkel." #: plinth/modules/mumble/__init__.py:38 #: plinth/modules/mumble/templates/mumble.html:26 @@ -1839,54 +1731,39 @@ msgid "Firewall zone" msgstr "Brannmursone" #: plinth/modules/networks/templates/connection_show.html:280 -#, fuzzy -#| msgid "" -#| "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." msgid "" "This interface should be connected to a 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." msgstr "" -"Dette grensesnittet skal kobles til lokalt nettverk/maskin. Hvis du kobler " -"det til et offentlig nettverk, vil tjenester som er ment å bare være " -"tilgjengelig internt, bli tilgjengelig eksternt. Dette er en " -"sikkerhetsrisiko." +"Dette grensesnittet skal kobles til et lokalt nettverk/maskin. Hvis du " +"kobler dette grensesnittet til et offentlig nettverk, vil tjenester som er " +"ment å bare være tilgjengelig internt, bli tilgjengelig eksternt. Dette er " +"en sikkerhetsrisiko." #: plinth/modules/networks/templates/connection_show.html:300 -#, fuzzy -#| msgid "" -#| "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." msgid "" "This interface should receive your Internet connection. If you connect it to " "a local network/machine, many services meant to available only internally " "will not be available." msgstr "" -"Dette grensesnittet skal motta din Internett-forbindelse. Hvis du kobler den " -"til et lokalt nettverk/maskin, vil mange tjenester som er ment å kun være " -"tilgjengelig internt, ikke være tilgjengelige." +"Dette grensesnittet skal motta din Internett-forbindelse. Hvis du kobler det " +"til et lokalt nettverk/maskin, vil mange tjenester som er ment å være " +"tilgjengelig internt ikke være tilgjengelige." #: plinth/modules/networks/templates/connection_show.html:319 -#, fuzzy, python-format -#| msgid "" -#| "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." +#, python-format msgid "" "This interface is not maintained by %(box_name)s. Its security status is " "unknown to %(box_name)s. Many %(box_name)s services may not be available on " "this interface. It is recommended that you deactivate or delete this " "connection and re-configure it." msgstr "" -"Dette grensesnittet er ikke vedlikeholdt av FreedomBox. FreedomBox kjenner " -"derfor ikke sikkerhetsstatusen. Mange FreedomBox-tjenester blir kanskje " -"ikke tilgjengelige i dette grensesnittet. Det anbefales at du deaktiverer/" -"sletter denne forbindelsen og rekonfigurerer." +"Dette grensesnittet er ikke vedlikeholdt av %(box_name)s, og " +"sikkerhetsstatusen er ikke kjent for %(box_name)s. Mange %(box_name)s-" +"tjenester blir kanskje ikke tilgjengelige i dette grensesnittet. Det " +"anbefales derfor at du deaktiverer/sletter denne forbindelsen, og " +"rekonfigurerer." #: plinth/modules/networks/templates/connections_add.html:34 #: plinth/modules/networks/templates/connections_type_select.html:34 @@ -1973,14 +1850,7 @@ msgid "Enable OpenVPN server" msgstr "Aktiver OpenVPN-tjener" #: plinth/modules/openvpn/templates/openvpn.html:38 -#, fuzzy, python-format -#| msgid "" -#| "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 %(box_name)s in order to join " -#| "your home network and access private/internal services provided by " -#| "%(box_name)s. You can also access the rest of the Internet via " -#| "%(box_name)s for added security and anonymity." +#, python-format msgid "" "Virtual Private Network (VPN) is a technique for securely connecting two " "devices in order to access resources of a private network. While you are " @@ -1990,9 +1860,9 @@ msgid "" "security and anonymity." msgstr "" "Virtual Private Network (VPN) er en teknikk for sikker tilkobling av to " -"maskiner for å få tilgang til ressurser fra et privat nettverk. Mens du er " +"maskiner for å få tilgang til ressurser i et privat nettverk. Mens du er " "borte hjemmefra, kan du koble til din %(box_name)s \n" -"til ditt hjemmenettverk, og få tilgang til privat/interne tjenester i " +"til ditt hjemmenettverk, og få tilgang til dine private/interne tjenester i " "%(box_name)s. \n" "Du kan også få tilgang til resten av Internettet via %(box_name)s for ekstra " "sikkerhet og anonymitet." @@ -2002,14 +1872,7 @@ msgid "Profile" msgstr "Profil" #: plinth/modules/openvpn/templates/openvpn.html:54 -#, fuzzy, python-format -#| msgid "" -#| "To connect to %(box_name)s'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 documentation on recommended clients and instructions on how to " -#| "configure them." +#, python-format msgid "" "To connect to %(box_name)s's VPN, you need to download a profile and feed it " "to an OpenVPN client on your mobile or desktop machine. OpenVPN Clients are " @@ -2018,11 +1881,11 @@ msgid "" "\">documentation on recommended clients and instructions on how to " "configure them." msgstr "" -"For å koble til %(box_name)s VPN, må du laste ned en profil og legge den til " -"en OpenVPN-klient på mobilen eller på en stasjonære maskin. OpenVPN-klienter " +"For å koble til %(box_name)s VPN må du laste ned en profil og legge den til " +"en OpenVPN-klient på mobilen eller på en stasjonær maskin. OpenVPN-klienter " "er tilgjengelig for de fleste plattformer. Se dokumentasjon om anbefate klienter og instruksjoner om hvordan de " +"org/FreedomBox/Manual/OpenVPN\" title=\"%(box_name)s Manual - OpenVPN" +"\">documentation om anbefalte klienter, og instruksjoner om hvordan de " "settes opp." #: plinth/modules/openvpn/templates/openvpn.html:66 @@ -2365,12 +2228,7 @@ msgid "" msgstr "" "Åpne tjenester på Internett er tilgjengelige og kan angripes og skades." -#: plinth/modules/pagekite/templates/pagekite_standard_services.html:50 -msgid "Exposing SSH with the default password for 'fbx' is a VERY BAD idea." -msgstr "" -"Å eksponere SSH med standardpassordet for «fbx»er en VELDIG DÅRLIG idé." - -#: plinth/modules/pagekite/templates/pagekite_standard_services.html:65 +#: plinth/modules/pagekite/templates/pagekite_standard_services.html:58 msgid "Save Services" msgstr "Lagre tjenester" @@ -2570,22 +2428,16 @@ msgstr "Quassel kjernetjeneste kjører ikke" #: plinth/modules/repro/__init__.py:36 #: plinth/modules/repro/templates/repro.html:26 #: plinth/modules/repro/views.py:55 -#, fuzzy -#| msgid "Server port" msgid "SIP Server (repro)" -msgstr "Tjenerport" +msgstr "SIP Server (repro)" #: plinth/modules/repro/__init__.py:41 -#, fuzzy -#| msgid "Second DNS Server" msgid "repro SIP Server" -msgstr "Andre DNS-tjener" +msgstr "repro SIP Server" #: plinth/modules/repro/forms.py:29 -#, fuzzy -#| msgid "Enable Quassel core service" msgid "Enable repro service" -msgstr "Aktiver Quassel kjernetjeneste" +msgstr "Aktiver repro service" #: plinth/modules/repro/templates/repro.html:29 msgid "" @@ -2595,6 +2447,11 @@ msgid "" "their presence known. It also acts as a proxy to federate SIP " "communications to other servers on the Internet similar to email." msgstr "" +"repro gir ulike SIP-tjenester som en SIP softphone kan bruke for å gi lyd- " +"og videosamtaler, tilstedeværelse og direktemeldinger. repro gir en server " +"og SIP-brukerkontoer som klientene kan bruke til å vise sin tilstedeværelse. " +"Den fungerer også som en mellomtjener for å forene SIP-kommunikasjon til " +"andre servere på Internett på samme måte som e-post." #: plinth/modules/repro/templates/repro.html:39 msgid "" @@ -2603,6 +2460,10 @@ msgid "" "\"https://f-droid.org/repository/browse/?fdid=com.csipsimple\"> CSipSimple (for Android phones)." msgstr "" +" Til SIP-samtaler, trengs et klientprogram. Tilgjengelige klienter omfatter " +"Jitsi (for datamaskiner) og CSipSimple (for Android telefoner)." #: plinth/modules/repro/templates/repro.html:48 msgid "" @@ -2612,18 +2473,19 @@ msgid "" "log in to the repro configuration panel. After setting the domain, it is " "required to restart the repro service. Disable the service and re-enable it." msgstr "" +"Note: Før du bruker repro, domener og brukere, må det " +"konfigureres ved hjelp av web-based " +"configuration panel. Brukere i admin gruppen kan logge seg inn " +"i repros konfigureringspanel. Etter innstillingen av domenet, er det " +"nødvendig å restarte repro-tjenesten. Deaktiver tjenesten og reaktiver den." #: plinth/modules/repro/templates/repro.html:63 -#, fuzzy -#| msgid "Quassel core service is running" msgid "repro service is running" -msgstr "Quassel kjernetjeneste kjører" +msgstr "repro-tjenesten kjører" #: plinth/modules/repro/templates/repro.html:66 -#, fuzzy -#| msgid "Quassel core service is not running" msgid "repro service is not running" -msgstr "Quassel kjernetjeneste kjører ikke" +msgstr "repro-tjenesten kjører ikke" #: plinth/modules/restore/__init__.py:36 #: plinth/modules/restore/templates/restore_index.html:26 @@ -2640,13 +2502,7 @@ msgid "Enable reStore" msgstr "Aktivere reStore" #: plinth/modules/restore/templates/restore_index.html:29 -#, fuzzy, python-format -#| msgid "" -#| "reStore is a server for unhosted web " -#| "applications. The idea is to uncouple web applications from data. No " -#| "matter where a web application is served from, the data can be stored on " -#| "an unhosted storage server of user's choice. With reStore, your " -#| "%(cfg.box_name)s becomes your unhosted storage server." +#, python-format msgid "" "reStore is a server for unhosted web " "applications. The idea is to uncouple web applications from data. No " @@ -2654,11 +2510,11 @@ msgid "" "unhosted storage server of user's choice. With reStore, your %(box_name)s " "becomes your unhosted storage server." msgstr "" -"reStore er en tjener for vertsløse web-" -"anvendelser. Ideen er å fjerne koblingen mellom web-anvendelser og data. " -"Uansett hvor web-anvendelsen kommer fra, så kan datasettet være lagret på en " -"vertsløs lagringstjener etter brukerens valg. Med reStore blir din " -"%(cfg.box_name)s en vertsløs lagringstjener." +"reStore er en tjener for vertsfrie " +"nettprogrammer. Ideen er å frikoble nettprogrammer fra data. Uansett hvor " +"en nettapplikasjon betjenes fra, kan dataene lagres på en vertsfri " +"lagringsserver etter brukerens valg. Med reStore, blir %(box_name)s din " +"vertsfrie lagringsserver. " #: plinth/modules/restore/templates/restore_index.html:40 msgid "" @@ -2778,14 +2634,12 @@ msgid "Anonymity Network (Tor)" msgstr "Anonymitetsnettverk (Tor)" #: plinth/modules/tor/__init__.py:53 -#, fuzzy -#| msgid "Anonymity Network (Tor)" msgid "Tor Anonymity Network" -msgstr "Anonymitetsnettverk (Tor)" +msgstr "Tor Anonymity Network" #: plinth/modules/tor/__init__.py:58 msgid "Tor Bridge Relay" -msgstr "" +msgstr "Tor Bridge Relay" #: plinth/modules/tor/__init__.py:76 plinth/modules/tor/views.py:144 msgid "Tor Hidden Service" @@ -2822,16 +2676,13 @@ msgid "Enable Tor Hidden Service" msgstr "Aktiver skjulte Tor-tjenester" #: plinth/modules/tor/forms.py:38 -#, fuzzy, python-brace-format -#| msgid "" -#| "A hidden service will allow FreedomBox to provide selected services (such " -#| "as ownCloud or Chat) without revealing its location." +#, python-brace-format msgid "" "A hidden service will allow {box_name} to provide selected services (such as " "ownCloud or chat) without revealing its location." msgstr "" -"En skjult tjeneste vil tillate FreedomBox å levere valgte tjenester (for " -"eksempel ownCloud eller Chat) uten å avsløre sin beliggenhet." +"En skjult tjeneste som vil tillate {box_name} å gi valgte tjenester (slike " +"som ownCloud eller chat) uten å avsløre sin beliggenhet." #: plinth/modules/tor/forms.py:42 msgid "Download software packages over Tor" @@ -2862,10 +2713,8 @@ msgstr "" "Browser." #: plinth/modules/tor/templates/tor.html:54 -#, fuzzy -#| msgid "Configuration updated" msgid "Tor configuration is being updated" -msgstr "Oppsett oppdatert" +msgstr "Tor-konfigureringen blir oppdatert. " #: plinth/modules/tor/templates/tor.html:62 msgid "Tor is running" @@ -2925,14 +2774,12 @@ msgid "Action error: {0} [{1}] [{2}]" msgstr "Handlingsfeil: {0} [{1}] [{2}]" #: plinth/modules/tor/views.py:148 -#, fuzzy -#| msgid "Configuration updated" msgid "Configuration updated." -msgstr "Oppsett oppdatert" +msgstr "Konfigurering oppdatert." #: plinth/modules/tor/views.py:150 msgid "An error occurred during configuration." -msgstr "" +msgstr "En feil oppsto under konfigureringen." #: plinth/modules/transmission/__init__.py:38 #: plinth/modules/transmission/templates/transmission.html:26 @@ -3019,6 +2866,9 @@ msgid "" "upgrades are enabled, upgrades are automatically run every night. You don't " "normally need to start the upgrade process." msgstr "" +"Upgrades installerer de nyeste programvare- og sikkerhetsoppdateringene. Når " +"automatiske oppgraderinger er aktivert, blir de kjørt automatisk hver natt. " +"Vanligvis trenger du ikke å starte oppdateringsprosessen." #: plinth/modules/upgrades/templates/upgrades.html:45 msgid "" @@ -3027,20 +2877,22 @@ msgid "" "other packages. During the upgrade, this web interface may be temporarily " "unavailable and show an error. Refresh the page to continue." msgstr "" +"Avhengig av hvor mange pakker som skal installeres, kan fullføringen ta lang " +"tid. Mens oppgraderingen pågår, kan du ikke installere andre pakker. Under " +"oppgraderingen kan dette nettgrensesnittet være midlertidig utilgjengelig, " +"og vise en feil. Oppdater siden for å fortsette." #: plinth/modules/upgrades/templates/upgrades.html:58 msgid "Upgrade now »" msgstr "Oppgradere nå »" #: plinth/modules/upgrades/templates/upgrades.html:65 -#, fuzzy -#| msgid "ejabberd is running" msgid "A package manager is running." -msgstr "ejabberd kjører" +msgstr "En pakkebehandler kjører." #: plinth/modules/upgrades/templates/upgrades.html:70 msgid "Recent log from upgrades:" -msgstr "" +msgstr "Seneste logg fra upgrades (oppdateringer):" #: plinth/modules/upgrades/views.py:36 plinth/modules/upgrades/views.py:66 msgid "Automatic Upgrades" @@ -3051,16 +2903,12 @@ msgid "Upgrade Packages" msgstr "Oppgrader pakker" #: plinth/modules/upgrades/views.py:96 -#, fuzzy -#| msgid "Upgrade completed." msgid "Upgrade process started." -msgstr "Oppgradering fullført." +msgstr "Upgrade-prosessen har startet." #: plinth/modules/upgrades/views.py:99 -#, fuzzy -#| msgid "Upgrade failed." msgid "Starting upgrade failed." -msgstr "Oppgradering feilet." +msgstr "Å starte upgrade feilet." #: plinth/modules/upgrades/views.py:102 msgid "Package Upgrades" @@ -3121,7 +2969,7 @@ msgstr "Klarte ikke legge ny bruker til gruppe {group}." #: plinth/modules/users/forms.py:92 msgid "SSH Keys" -msgstr "" +msgstr "SSH-nøkler" #: plinth/modules/users/forms.py:96 msgid "" @@ -3129,6 +2977,9 @@ msgid "" "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" +"Å sette en SSH offentlig nøkkel vil tillate denne brukeren å logge sikkert " +"på systemet uten å bruke passord. Du kan legge inn multiple nøkler, én på " +"hver linje. Blanke linjer og linjer som starter med # vil bli ignorert." #: plinth/modules/users/forms.py:136 msgid "Renaming LDAP user failed." @@ -3313,10 +3164,9 @@ msgid "Secure Shell (SSH) Server" msgstr "Secure Shell (SSH) tjener" #: plinth/service.py:79 -#, fuzzy, python-brace-format -#| msgid "FreedomBox Web Interface (Plinth)" +#, python-brace-format msgid "{box_name} Web Interface (Plinth)" -msgstr "FreedomBox Web Interface (grensesnitt) (Plinth)" +msgstr "{box_name} Web Interface (Plinth)" #: plinth/templates/404.html:25 msgid "404" @@ -3352,10 +3202,9 @@ msgstr "" "issues\"> bug tracker så det kan bli ordnet." #: plinth/templates/base.html:49 -#, fuzzy, python-format -#| msgid "Plinth administrative interface for the FreedomBox" +#, python-format msgid "Plinth administrative interface for the %(box_name)s" -msgstr "Plinth administrative brukergrensesnitt for FreedomBox" +msgstr "Plinth administrativt brukergrensesnitt for %(box_name)s" #: plinth/templates/base.html:83 msgid "Toggle navigation" @@ -3411,82 +3260,6 @@ msgstr "Installere %(package_names)s: %(status)s" msgid "%(percentage)s%% complete" msgstr "%(percentage)s%% fullført" -#~ msgid "show password" -#~ msgstr "vis passord" - -#~ msgid "The following is the current status:" -#~ msgstr "Følgende er nåværende status:" - -#~ msgid "Congratulations! Your FreedomBox is up and running!" -#~ msgstr "Gratulerer! Din FreedomBox er oppe og går!" - -#~ msgid "" -#~ "Please provide the following basic information to complete the setup " -#~ "process." -#~ msgstr "" -#~ "Vennligst oppgi følgende grunnleggende informasjon for å fullføre " -#~ "installasjonsprosessen." - -#~ msgid "Next" -#~ msgstr "Neste" - -#~ msgid "FreedomBox Manual" -#~ msgstr "Håndbok for FreedomBox" - -#~ msgid "" -#~ "Many FreedomBox contributors and users are also available on the " -#~ "#freedombox channel of the irc.oftc.net IRC network." -#~ msgstr "" -#~ "Mange FreedomBox bidragsytere og brukere er også tilgjengelig på " -#~ "#freedombox kanalen til irc.oftc.net IRC-nettverk." - -#~ msgid "Create Wiki/Blog" -#~ msgstr "Opprett Wiki/blogg" - -#~ msgid "" -#~ "Select Automatic (DHCP) if you are connecting to an existing wireless " -#~ "network. Shared mode is useful when running an Access Point." +#~ msgid "Exposing SSH with the default password for 'fbx' is a VERY BAD idea." #~ msgstr "" -#~ "Velg Automatisk (DHCP) hvis du kobler til et eksisterende trådløst " -#~ "nettverk. Felles modus er nyttig når du kjører et Access Point." - -#~ msgid "Tor enabled" -#~ msgstr "Tor aktivert" - -#~ msgid "Tor disabled" -#~ msgstr "Tor deaktivert" - -#~ msgid "Tor hidden service enabled" -#~ msgstr "Skjult Tor-tjeneste aktivert" - -#~ msgid "Tor hidden service disabled" -#~ msgstr "Tor skjult tjeneste deaktivert" - -#~ msgid "Enabled package download over Tor" -#~ msgstr "Aktivert pakkenedlasting over Tor" - -#~ msgid "Disabled package download over Tor" -#~ msgstr "Deaktivert pakke lastet ned over Tor" - -#~ msgid "There was an error while upgrading." -#~ msgstr "Det var en feil under oppgradering." - -#~ msgid "Output from unattended-upgrades:" -#~ msgstr "Resultat fra unattended-upgrades:" - -#~ msgid "The operating system is up to date now.  " -#~ msgstr "Operativsystemet er oppdatert nå.  " - -#~ msgid "Show Details" -#~ msgstr "Vis detaljer" - -#~ msgid "" -#~ "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." -#~ msgstr "" -#~ "Dette vil kjøre oppgraderinger uten tilsyn, og søke å oppgradere systemet " -#~ "ditt med de nyeste Debian-pakkene. Det kan ta noen minutter å fullføre." - -#~ msgid "System is being upgraded." -#~ msgstr "Systemet blir oppgradert." +#~ "Å eksponere SSH med standardpassordet for «fbx»er en VELDIG DÅRLIG idé." From 1851b1583675fdf798f86201ab0fe81bf75361be Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Mon, 8 Feb 2016 17:41:48 -0500 Subject: [PATCH 066/189] networks: Fix tests, move settings to a dict --- plinth/tests/test_network.py | 126 +++++++++++++++++++++++++++-------- 1 file changed, 98 insertions(+), 28 deletions(-) diff --git a/plinth/tests/test_network.py b/plinth/tests/test_network.py index 1811deeec..c74504072 100644 --- a/plinth/tests/test_network.py +++ b/plinth/tests/test_network.py @@ -19,6 +19,7 @@ Test module for network configuration utilities. """ +import copy import os import unittest @@ -27,6 +28,52 @@ if euid == 0: from plinth import network +ethernet_settings = { + 'common': { + 'type': '802-3-ethernet', + 'name': 'plinth_test_eth', + 'interface': 'eth0', + 'zone': 'internal', + }, + 'ipv4': { + 'method': 'auto', + 'dns': '', + 'second_dns': '', + }, +} + +wifi_settings = { + 'common': { + 'type': '802-11-wireless', + 'name': 'plinth_test_wifi', + 'interface': 'wlan0', + 'zone': 'external', + }, + 'ipv4': { + 'method': 'auto', + 'dns': '', + 'second_dns': '', + }, + 'wireless': { + 'ssid': 'plinthtestwifi', + 'mode': 'adhoc', + 'auth_mode': 'open', + }, +} + +pppoe_settings = { + 'common': { + 'type': 'pppoe', + 'name': 'plinth_test_pppoe', + 'interface': 'eth1', + 'zone': 'internal', + }, + 'pppoe': { + 'username': 'x-user', + 'password': 'x-password', + }, +} + class TestNetwork(unittest.TestCase): """Verify that the network module performs as expected.""" @@ -37,16 +84,9 @@ class TestNetwork(unittest.TestCase): @classmethod def setUp(cls): - cls.ethernet_uuid = network.add_ethernet_connection( - 'plinth_test_eth', 'eth0', 'internal', - 'auto', '', '', '', '', '') - cls.wifi_uuid = network.add_wifi_connection( - 'plinth_test_wifi', 'wlan0', 'external', - 'plinthtestwifi', 'adhoc', 'open', '', - 'auto', '', '', '', '', '') - cls.pppoe_uuid = network.add_pppoe_connection( - 'plinth_test_pppoe', 'eth1', 'internal', - 'x-user', 'x-password') + cls.ethernet_uuid = network.add_connection(ethernet_settings) + cls.wifi_uuid = network.add_connection(wifi_settings) + cls.pppoe_uuid = network.add_connection(pppoe_settings) @classmethod def tearDown(cls): @@ -81,9 +121,12 @@ def test_get_connection(self): def test_edit_ethernet_connection(self): """Check that we can update an ethernet connection.""" connection = network.get_connection(self.ethernet_uuid) - network.edit_ethernet_connection( - connection, 'plinth_test_eth_new', 'eth1', 'external', - 'auto', '', '', '', '', '') + ethernet_settings2 = copy.deepcopy(ethernet_settings) + ethernet_settings2['common']['name'] = 'plinth_test_eth_new' + ethernet_settings2['common']['interface'] = 'eth1' + ethernet_settings2['common']['zone'] = 'external' + ethernet_settings2['ipv4']['method'] = 'auto' + network.edit_connection(connection, ethernet_settings2) connection = network.get_connection(self.ethernet_uuid) self.assertEqual(connection.get_id(), 'plinth_test_eth_new') @@ -99,9 +142,13 @@ def test_edit_ethernet_connection(self): def test_edit_pppoe_connection(self): """Check that we can update a PPPoE connection.""" connection = network.get_connection(self.ethernet_uuid) - network.edit_pppoe_connection( - connection, 'plinth_test_pppoe_new', 'eth2', 'external', - 'x-user-new', 'x-password-new') + pppoe_settings2 = copy.deepcopy(pppoe_settings) + pppoe_settings2['common']['name'] = 'plinth_test_pppoe_new' + pppoe_settings2['common']['interface'] = 'eth2' + pppoe_settings2['common']['zone'] = 'external' + pppoe_settings2['pppoe']['username'] = 'x-user-new' + pppoe_settings2['pppoe']['password'] = 'x-password-new' + network.edit_connection(connection, pppoe_settings2) connection = network.get_connection(self.ethernet_uuid) self.assertEqual(connection.get_id(), 'plinth_test_pppoe_new') @@ -123,10 +170,16 @@ def test_edit_pppoe_connection(self): def test_edit_wifi_connection(self): """Check that we can update a wifi connection.""" connection = network.get_connection(self.wifi_uuid) - network.edit_wifi_connection( - connection, 'plinth_test_wifi_new', 'wlan1', 'external', - 'plinthtestwifi2', 'infrastructure', 'wpa', 'secretpassword', - 'auto', '', '', '', '', '') + wifi_settings2 = copy.deepcopy(wifi_settings) + wifi_settings2['common']['name'] = 'plinth_test_wifi_new' + wifi_settings2['common']['interface'] = 'wlan1' + wifi_settings2['common']['zone'] = 'external' + wifi_settings2['ipv4']['method'] = 'auto' + wifi_settings2['wireless']['ssid'] = 'plinthtestwifi2' + wifi_settings2['wireless']['mode'] = 'infrastructure' + wifi_settings2['wireless']['auth_mode'] = 'wpa' + wifi_settings2['wireless']['passphrase'] = 'secretpassword' + network.edit_connection(connection, wifi_settings2) connection = network.get_connection(self.wifi_uuid) @@ -153,10 +206,17 @@ def test_edit_wifi_connection(self): def test_ethernet_manual_ipv4_address(self): """Check that we can manually set IPv4 address on ethernet.""" connection = network.get_connection(self.ethernet_uuid) - network.edit_ethernet_connection( - connection, 'plinth_test_eth_new', 'eth0', 'external', 'manual', - '169.254.0.1', '255.255.254.0', '169.254.0.254', '1.2.3.4', - '1.2.3.5') + ethernet_settings2 = copy.deepcopy(ethernet_settings) + ethernet_settings2['common']['name'] = 'plinth_test_eth_new' + ethernet_settings2['common']['interface'] = 'eth0' + ethernet_settings2['common']['zone'] = 'external' + ethernet_settings2['ipv4']['method'] = 'manual' + ethernet_settings2['ipv4']['address'] = '169.254.0.1' + ethernet_settings2['ipv4']['netmask'] = '255.255.254.0' + ethernet_settings2['ipv4']['gateway'] = '169.254.0.254' + ethernet_settings2['ipv4']['dns'] = '1.2.3.4' + ethernet_settings2['ipv4']['second_dns'] = '1.2.3.5' + network.edit_connection(connection, ethernet_settings2) connection = network.get_connection(self.ethernet_uuid) settings_ipv4 = connection.get_setting_ip4_config() @@ -174,10 +234,20 @@ def test_ethernet_manual_ipv4_address(self): def test_wifi_manual_ipv4_address(self): """Check that we can manually set IPv4 address on wifi.""" connection = network.get_connection(self.wifi_uuid) - network.edit_wifi_connection( - connection, 'plinth_test_wifi_new', 'wlan0', 'external', - 'plinthtestwifi', 'adhoc', 'open', '', 'manual', '169.254.0.2', - '255.255.254.0', '169.254.0.254', '1.2.3.4', '1.2.3.5') + wifi_settings2 = copy.deepcopy(wifi_settings) + wifi_settings2['common']['name'] = 'plinth_test_wifi_new' + wifi_settings2['common']['interface'] = 'wlan0' + wifi_settings2['common']['zone'] = 'external' + wifi_settings2['ipv4']['method'] = 'manual' + wifi_settings2['ipv4']['address'] = '169.254.0.2' + wifi_settings2['ipv4']['netmask'] = '255.255.254.0' + wifi_settings2['ipv4']['gateway'] = '169.254.0.254' + wifi_settings2['ipv4']['dns'] = '1.2.3.4' + wifi_settings2['ipv4']['second_dns'] = '1.2.3.5' + wifi_settings2['wireless']['ssid'] = 'plinthtestwifi' + wifi_settings2['wireless']['mode'] = 'adhoc' + wifi_settings2['wireless']['auth_mode'] = 'open' + network.edit_connection(connection, wifi_settings2) connection = network.get_connection(self.wifi_uuid) settings_ipv4 = connection.get_setting_ip4_config() From 082c5ee1ce1ef95bb35d16fc5ede3128086008f7 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Tue, 9 Feb 2016 09:33:25 +0530 Subject: [PATCH 067/189] networks: Minor trimming to tests - To focus only on what is being tested. --- plinth/tests/test_network.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/plinth/tests/test_network.py b/plinth/tests/test_network.py index c74504072..63fb93b2e 100644 --- a/plinth/tests/test_network.py +++ b/plinth/tests/test_network.py @@ -207,9 +207,6 @@ def test_ethernet_manual_ipv4_address(self): """Check that we can manually set IPv4 address on ethernet.""" connection = network.get_connection(self.ethernet_uuid) ethernet_settings2 = copy.deepcopy(ethernet_settings) - ethernet_settings2['common']['name'] = 'plinth_test_eth_new' - ethernet_settings2['common']['interface'] = 'eth0' - ethernet_settings2['common']['zone'] = 'external' ethernet_settings2['ipv4']['method'] = 'manual' ethernet_settings2['ipv4']['address'] = '169.254.0.1' ethernet_settings2['ipv4']['netmask'] = '255.255.254.0' @@ -235,9 +232,6 @@ def test_wifi_manual_ipv4_address(self): """Check that we can manually set IPv4 address on wifi.""" connection = network.get_connection(self.wifi_uuid) wifi_settings2 = copy.deepcopy(wifi_settings) - wifi_settings2['common']['name'] = 'plinth_test_wifi_new' - wifi_settings2['common']['interface'] = 'wlan0' - wifi_settings2['common']['zone'] = 'external' wifi_settings2['ipv4']['method'] = 'manual' wifi_settings2['ipv4']['address'] = '169.254.0.2' wifi_settings2['ipv4']['netmask'] = '255.255.254.0' From de802f334d54e908586b8c32f13d4a4130ae1c6d Mon Sep 17 00:00:00 2001 From: Caly Date: Sun, 7 Feb 2016 20:49:07 +0100 Subject: [PATCH 068/189] Translated using Weblate (Swedish) Currently translated at 49.9% (284 of 569 strings) --- plinth/locale/sv/LC_MESSAGES/django.po | 266 ++++++++++++------------- 1 file changed, 123 insertions(+), 143 deletions(-) diff --git a/plinth/locale/sv/LC_MESSAGES/django.po b/plinth/locale/sv/LC_MESSAGES/django.po index 3934dd10c..6027ba8bb 100644 --- a/plinth/locale/sv/LC_MESSAGES/django.po +++ b/plinth/locale/sv/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-01-15 19:42+0530\n" -"PO-Revision-Date: 2016-01-31 18:23+0000\n" +"PO-Revision-Date: 2016-02-07 20:49+0000\n" "Last-Translator: Caly \n" "Language-Team: Swedish " "\n" @@ -51,7 +51,7 @@ msgstr "Kan inte ansluta till {host}:{port}" #: plinth/context_processors.py:36 msgid "FreedomBox" -msgstr "" +msgstr "FreedomBox" #: plinth/modules/apps/apps.py:26 msgid "Apps" @@ -99,7 +99,7 @@ msgid "Enable service discovery" msgstr "Aktivera tjänstidentifiering" #: plinth/modules/avahi/templates/avahi.html:29 -#, fuzzy, python-format +#, python-format #| msgid "" #| "Service discovery allows other machines on the network to discover your " #| "FreedomBox and services running on it. It also allows FreedomBox to " @@ -115,12 +115,12 @@ msgid "" "disabled to improve security especially when connecting to a hostile local " "network." msgstr "" -"Tjänstidentifiering tilllåter andra enheter i nätverket att upptäcka din " -"FreedomBox och se vilka tjänster den kör. Det tillåter även din FreedomBox " -"att upptäcka andra maskiner och vilka tjänster de kör på ditt lokala " -"nätverk. Tjänstidentifiering är inte nödvändigt och fungerar bara på interna " -"nätverk. Du kan låta den vara inaktiverad för att förbättra din säkerhet, " -"särskilt om du ansluter till ett osäkert lokalt nätverk." +"Tjänstidentifiering tillåter andra enheter i nätverket att upptäcka din " +"%(box_name)s och se vilka tjänster den kör. Det tillåter även din " +"%(box_name)s att upptäcka andra maskiner och vilka tjänster de kör på ditt " +"lokala nätverk. Tjänstidentifiering är inte nödvändigt och fungerar bara på " +"interna nätverk. Du kan låta den vara inaktiverad för att förbättra din " +"säkerhet, särskilt om du ansluter till ett osäkert lokalt nätverk." #: plinth/modules/avahi/templates/avahi.html:40 #: plinth/modules/datetime/templates/datetime.html:35 @@ -220,7 +220,7 @@ msgid "Hostname" msgstr "Värdnamn" #: plinth/modules/config/config.py:97 -#, fuzzy, python-brace-format +#, python-brace-format #| msgid "" #| "Hostname is the local name by which other machines on the local network " #| "reach your machine. It must start and end with an alphabet or a digit " @@ -232,9 +232,10 @@ msgid "" "and have as interior characters only alphabets, digits and hyphens. Total " "length must be 63 characters or less." msgstr "" -"Värdnamn är namnet på din enhet som andra enheter i det lokala nätverket kan " -"nå dig via. Det får endast bestå av bokstäver, siffror och bindestreck, men " -"får inte börja eller sluta med bindestreck. Värdnamn får vara max 63 tecken." +"Värdnamn är namnet på din {box_name} som andra enheter i det lokala " +"nätverket kan nå dig via. Det får endast bestå av bokstäver, siffror och " +"bindestreck, men får inte börja eller sluta med bindestreck. Värdnamn får " +"vara max 63 tecken." #: plinth/modules/config/config.py:105 msgid "Invalid hostname" @@ -247,7 +248,7 @@ msgid "Domain Name" msgstr "Domännamn" #: plinth/modules/config/config.py:110 -#, fuzzy, python-brace-format +#, python-brace-format #| msgid "" #| "Domain name is the global name by which other machines on the Internet " #| "can reach you. It must consist of labels separated by dots. Each label " @@ -263,21 +264,20 @@ msgid "" "63 characters or less. Total length of domain name must be 253 characters " "or less." msgstr "" -"Domännamn är det globala namn som andra maskiner på Internet kan nå dig " -"via. Det skall bestå av ord åtskilda av punkter. Varje ord får endast bestå " -"av bokstäver, siffror och bindestreck, men får inte börja eller sluta med " -"bindestreck. Varje ord får vara max 63 tecken. Total längd på domännamnet " -"får max vara 253 tecken." +"Domännamn är det globala namn som andra enheter på Internet kan nå din " +"{box_name} via. Det skall bestå av ord åtskilda av punkter. Varje ord får " +"endast bestå av bokstäver, siffror och bindestreck, men får inte börja eller " +"sluta med bindestreck. Varje ord får vara max 63 tecken. Total längd på " +"domännamnet får max vara 253 tecken." #: plinth/modules/config/config.py:125 msgid "Language" msgstr "Språkval" #: plinth/modules/config/config.py:127 -#, fuzzy #| msgid "Language for this FreedomBox web administration interface" msgid "Language for this web administration interface" -msgstr "Språkval för webbgränssnittet att administrera denna FreedomBox med" +msgstr "Språkval för detta administrations-webbgränssnitt" #: plinth/modules/config/config.py:135 #: plinth/modules/dynamicdns/dynamicdns.py:37 @@ -508,7 +508,6 @@ msgstr "" "leverantörs uppdateringsadress." #: plinth/modules/dynamicdns/dynamicdns.py:80 -#, fuzzy #| msgid "" #| "Please do not enter a URL here (like \"https://example.com/\") but only " #| "the hostname of the GnuDIP server (like \"example.pcom\")." @@ -516,15 +515,15 @@ msgid "" "Please do not enter a URL here (like \"https://example.com/\") but only the " "hostname of the GnuDIP server (like \"example.com\")." msgstr "" -"Skriv inte en full webadress här (tex: \"https://exempel.com/\"), utan " -"endast värdnamnet för GnuDIP servern (tex: \"exempel.com\")." +"Skriv inte en full webbadress här (t.ex.: \"https://exempel.com/\"), utan " +"endast värdnamnet för GnuDIP servern (t.ex.: \"exempel.com\")." #: plinth/modules/dynamicdns/dynamicdns.py:84 -#, fuzzy, python-brace-format +#, python-brace-format #| msgid "The public domain name you want use to reach your box." msgid "The public domain name you want use to reach your {box_name}." msgstr "" -"Publikt domännamn du önskar använda för att ansluta till din FreedomBox." +"Publikt domännamn du önskar använda för att ansluta till din {box_name}." #: plinth/modules/dynamicdns/dynamicdns.py:87 msgid "Use this option if your provider uses self signed certificates." @@ -546,7 +545,7 @@ msgid "" msgstr "Lämna fältet tomt om du vill behålla tidigare konfigurerat lösenord." #: plinth/modules/dynamicdns/dynamicdns.py:96 -#, fuzzy, python-brace-format +#, python-brace-format #| msgid "" #| "Optional Value. If your FreedomBox is not connected directly to the " #| "Internet (i.e. connected to a NAT router) this URL is used to figure out " @@ -558,10 +557,10 @@ msgid "" "Internet IP. The URL should simply return the IP where the client comes from " "(example: http://myip.datasystems24.de)." msgstr "" -"Tillval. Om din FreedomBox inte är direkt ansluten till Internet (dvs " +"Tillval. Om din {box_name} inte är direkt ansluten till Internet (dvs " "anslutna via en NAT-router) används denna webbadress för att hitta korrekt " "IP. Webbadressen ska helt enkelt returnera det IP som klienten kommer från. " -"(exempel: http://myip.datasystems24.de)" +"(exempel: http://myip.datasystems24.de)." #: plinth/modules/dynamicdns/dynamicdns.py:104 msgid "" @@ -590,16 +589,14 @@ msgid "Update URL" msgstr "Adress för uppdateringar" #: plinth/modules/dynamicdns/dynamicdns.py:135 -#, fuzzy #| msgid "accept all SSL certificates" msgid "Accept all SSL certificates" msgstr "Acceptera alla SSL-certifikat" #: plinth/modules/dynamicdns/dynamicdns.py:139 -#, fuzzy #| msgid "use HTTP basic authentication" msgid "Use HTTP basic authentication" -msgstr "Avänd grundläggande HTTP-autentisering" +msgstr "Använd grundläggande HTTP-autentisering" #: plinth/modules/dynamicdns/dynamicdns.py:151 #: plinth/modules/networks/forms.py:146 plinth/modules/transmission/forms.py:39 @@ -645,13 +642,12 @@ msgid "Status of Dynamic DNS" msgstr "Status för Dynamisk DNS" #: plinth/modules/dynamicdns/templates/dynamicdns.html:25 -#, fuzzy #| msgid "DynamicDNS client" msgid "Dynamic DNS Client" msgstr "Klient för Dynamisk DNS" #: plinth/modules/dynamicdns/templates/dynamicdns.html:28 -#, fuzzy, python-format +#, python-format #| msgid "" #| "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 " @@ -664,10 +660,9 @@ msgid "" msgstr "" "Om din Internetleverantör periodiskt ändrar din IP-adress (dvs varje 24h) " "kan det vara svårt för andra att hitta dig på nätet. Då kan ingen hitta de " -"tjänster som tillhandahålls av FreedomBox (tex. din ownCloud)." +"tjänster som tillhandahålls av %(box_name)s (tex. din ownCloud)." #: plinth/modules/dynamicdns/templates/dynamicdns.html:37 -#, fuzzy #| msgid "" #| "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 " @@ -686,10 +681,10 @@ msgid "" msgstr "" "Lösningen är att tilldela DNS-namn till din IP-adress och uppdatera DNS-namn " "varje gång din IP ändras av din Internetleverantör. Dynamisk DNS kopplar din " -"nuvarande offentliga IP-adressen till en gnudip server. Därefter tilldelar servern ditt " -"DNS-namn med din nya IP, och om någon från Internet ber om din DNS-namn, " -"kommer han bli skickad till din aktuella IP." +"nuvarande offentliga IP-adressen till en gnudip server. " +"Därefter tilldelar servern ditt DNS-namn med din nya IP, och om någon från " +"Internet ber om ditt DNS-namn, kommer han bli skickad till din aktuella IP." #: plinth/modules/dynamicdns/templates/dynamicdns.html:50 msgid "" @@ -706,7 +701,7 @@ msgstr "" "target='_blank'> freedns.afraid.org." #: plinth/modules/dynamicdns/templates/dynamicdns.html:61 -#, fuzzy, python-format +#, python-format #| msgid "" #| "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 " @@ -715,8 +710,9 @@ msgid "" "If your %(box_name)s is connected behind some NAT router, don't forget to " "add port forwarding (i.e. forward some standard ports like 80 and 443)." msgstr "" -"Om din FreedomBox är ansluten bakom en NAT-router, glöm inte att lägga till " -"port forwarding (dvs vidarebefordra några standardportar, såsom 80 och 443)." +"Om din %(box_name)s är ansluten bakom en NAT-router, glöm inte att lägga " +"till port forwarding (dvs vidarebefordra några standardportar, såsom 80 och " +"443)." #: plinth/modules/dynamicdns/templates/dynamicdns_configure.html:30 msgid "" @@ -740,13 +736,12 @@ msgstr "" "kommer vi inte att upptäcka en NAT-typ." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:35 -#, fuzzy #| msgid "Direct connection to the internet." msgid "Direct connection to the Internet." msgstr "Direktanslutning till Internet." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:37 -#, fuzzy, python-format +#, python-format #| msgid "" #| "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 - " @@ -758,10 +753,10 @@ msgid "" "changes will not be detected). In case the WAN IP changes, it may take up " "to %(timer)s minutes until your DNS entry is updated." msgstr "" -"Bakom NAT. Detta innebär att tjänsten dynamisk DNS kommer att fråga \"IP-" -"kontrolladress\" för ändringar (vi behöver därför \"IP-kontrolladress\" - " -"annars kommer vi inte att upptäcka ändringar av IP). Det kan ta upp till " -"%(timer)s minuter tills vi uppdaterar din DNS-inställning om WAN IP ändrats." +"Bakom NAT. Detta betyder att dynamisk DNS-tjänsten kommer att fråga \"IP-" +"kontrolladress\" om ändringar skett (\"IP-kontrolladress\" behöver därför " +"anges, annars kan inte ändringar av IP adress upptäckas). Det kan ta upp " +"till %(timer)s minuter tills din DNS-inställning uppdateras." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:48 msgid "Last update" @@ -774,7 +769,7 @@ msgid "Firewall" msgstr "Brandvägg" #: plinth/modules/firewall/templates/firewall.html:28 -#, fuzzy, python-format +#, python-format #| msgid "" #| "Firewall is a network security system that controls the incoming and " #| "outgoing network traffic on your %(box_name)s. Keeping a firewall enabled " @@ -790,7 +785,7 @@ msgstr "" #: plinth/modules/firewall/templates/firewall.html:36 msgid "Current status:" -msgstr "" +msgstr "Nuvarande status:" #: plinth/modules/firewall/templates/firewall.html:41 #, python-format @@ -838,7 +833,6 @@ msgid "Blocked" msgstr "Blockerade" #: plinth/modules/firewall/templates/firewall.html:103 -#, fuzzy #| msgid "" #| "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 " @@ -906,7 +900,7 @@ msgid "Setup Complete!" msgstr "Installation klar!" #: plinth/modules/first_boot/templates/firstboot_state10.html:32 -#, fuzzy, python-format +#, python-format #| msgid "" #| "%(box_name)s setup is now complete. To make your %(box_name)s " #| "functional, you need some applications. Applications will be installed " @@ -916,7 +910,7 @@ msgid "" "you need some applications. They will be installed the first time you " "access them." msgstr "" -"%(box_name)s installationen är klar. För att göra din %(box_name)s " +"Installationen av %(box_name)s är klar. För att göra din %(box_name)s " "funktionell, behöver du några applikationer. De kommer att installeras " "första gången du använder dem." @@ -953,8 +947,9 @@ msgid "Where to Get Help" msgstr "Vart Du Kan Få Hjälp" #: plinth/modules/help/help.py:38 +#, fuzzy msgid "Manual" -msgstr "" +msgstr "Manual" #: plinth/modules/help/help.py:48 msgid "Documentation and FAQ" @@ -966,13 +961,13 @@ msgid "About {box_name}" msgstr "Om {box_name}" #: plinth/modules/help/help.py:73 -#, fuzzy, python-brace-format +#, python-brace-format #| msgid "About {box_name}" msgid "{box_name} Manual" -msgstr "Om {box_name}" +msgstr "{box_name} Manual" #: plinth/modules/help/templates/help_about.html:30 -#, fuzzy, python-format +#, python-format #| msgid "" #| "FreedomBox is a community project to develop, design and promote personal " #| "servers running free software for private, personal communications. It " @@ -990,13 +985,13 @@ msgid "" "and a Tor relay, on a device that can replace your Wi-Fi router, so that " "your data stays with you." msgstr "" -"FreedomBox är ett kollaborativtprojekt för att utveckla, designa och främja " -"personliga servrar med fri programvara för privat och personlig " +"%(box_name)s är ett kollaborativt projekt för att utveckla, designa och " +"främja personliga servrar med fri programvara för privat och personlig " "kommunikation. Det är en nätverksenhet gjord för att kommunicera med resten " "av Internet under skyddad sekretess och hög datasäkerhet. Den har " -"applikationer såsom blogg, wiki, hemsida, sociala nätverk, e-post, webbproxy " -"och en Tor-server, på en enhet som kan ersätta din Wi-Fi-router, så att din " -"personliga data alltid stannar hos dig och under din kontroll." +"applikationer såsom blogg, wiki, hemsida, sociala nätverk, e-post, webb-" +"proxy och en Tor-server, på en enhet som kan ersätta din Wi-Fi-router, så " +"att din personliga data alltid stannar hos dig och under din kontroll." #: plinth/modules/help/templates/help_about.html:43 msgid "" @@ -1016,7 +1011,7 @@ msgstr "" "peer-arkitektur." #: plinth/modules/help/templates/help_about.html:56 -#, fuzzy, python-format +#, python-format #| msgid "" #| "There are a number of projects working to realize a future of distributed " #| "services; FreedomBox aims to bring them all together in a convenient " @@ -1027,11 +1022,11 @@ msgid "" "package." msgstr "" "Det finns ett flertal projekt avsedda att förverkliga en framtid av " -"distribuerade tjänster. FreedomBox avser att samla dem alla tillsammans i " +"distribuerade tjänster. %(box_name)s avser att samla dem alla tillsammans i " "ett enda praktiskt paket." #: plinth/modules/help/templates/help_about.html:64 -#, fuzzy, python-format +#, python-format #| msgid "" #| "For more information about the FreedomBox project, see the FreedomBox Wiki." @@ -1039,8 +1034,8 @@ msgid "" "For more information about the %(box_name)s project, see the %(box_name)s Wiki." msgstr "" -"Mer information om FreedomBox-projektet finns på FreedomBox wiki." +"Mer information om %(box_name)s -projektet finns på %(box_name)s wiki." #: plinth/modules/help/templates/help_about.html:73 msgid "Learn more »" @@ -1057,7 +1052,7 @@ msgid "%(box_name)s Setup" msgstr "%(box_name)s Installation" #: plinth/modules/help/templates/help_index.html:29 -#, fuzzy, python-format +#, python-format #| msgid "" #| "The FreedomBox Manual is the best place to " #| "start for information regarding %(box_name)s." @@ -1065,11 +1060,11 @@ msgid "" "The %(box_name)s Manual is the best place to " "start for information regarding %(box_name)s." msgstr "" -"FreedomBox Manual är det bästa stället att " -"börja för information om %(box_name)s." +"%(box_name)s Manual är det bästa stället att " +"börja för aff få information om %(box_name)s." #: plinth/modules/help/templates/help_index.html:36 -#, fuzzy, python-format +#, python-format #| msgid "" #| " " #| "FreedomBox project wiki contains further information." @@ -1077,11 +1072,11 @@ msgid "" " " "%(box_name)s project wiki contains further information." msgstr "" -" FreedomBox " -"project wiki innehåller ytterligare information." +" %(box_name)" +"s projekt-wiki innehåller ytterligare information." #: plinth/modules/help/templates/help_index.html:43 -#, fuzzy, python-format +#, python-format #| msgid "" #| "To seek help from FreedomBox community, queries may be posted on the mailing list. The list archives also contain information about " "problems faced by other users and possible solutions." msgstr "" -"För att få hjälp från FreedomBox användargrupp kan du ställa frågor på mailing list. Arkiven innehåller även information om möjliga " -"lösningar på problem som andra användare haft." +"För att få hjälp från %(box_name)s användargrupp kan du ställa frågor på " +" e-post-lista. Arkiven innehåller även information om möjliga lösningar " +"på problem som andra användare haft." #: plinth/modules/help/templates/help_index.html:53 -#, fuzzy, python-format +#, python-format #| msgid "" #| "Many FreedomBox contributors and users are also available on the irc.oftc." #| "net IRC network. Join and request help on the #freedombox " "channel using the IRC web interface." msgstr "" -"Många utvecklare och användare av FreedomBox finns också tillgängliga på IRC-" -"nätverket irc.oftc.net. Gå med, ställ frågor och be om hjälp i " +"Många utvecklare och användare av %(box_name)s finns också tillgängliga på " +"IRC-nätverket irc.oftc.net. Gå med, ställ frågor och be om hjälp i " "#freedombox kanal via webbchatten." #: plinth/modules/ikiwiki/__init__.py:38 -#, fuzzy #| msgid "Wiki & Blog (Ikiwiki)" msgid "Wiki and Blog (ikiwiki)" -msgstr "Wiki & Blogg (Ikiwiki)" +msgstr "Wiki och Blogg (ikiwiki)" #: plinth/modules/ikiwiki/__init__.py:43 -#, fuzzy #| msgid "Ikiwiki wikis and blogs" msgid "ikiwiki wikis and blogs" -msgstr "Ikiwiki wikis och bloggar" +msgstr "ikiwiki wikis och bloggar" #: plinth/modules/ikiwiki/forms.py:29 -#, fuzzy #| msgid "Enable Ikiwiki" msgid "Enable ikiwiki" -msgstr "Aktivera Ikiwiki" +msgstr "Aktivera ikiwiki" #: plinth/modules/ikiwiki/forms.py:36 #: plinth/modules/networks/templates/connection_show.html:98 @@ -1161,13 +1153,12 @@ msgstr "" "ikiwiki\">/ikiwiki." #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:27 -#, fuzzy, python-format +#, python-format #| msgid "Delete Wiki/Blog %(name)s" msgid "Delete Wiki or Blog %(name)s" -msgstr "Ta bort Wiki/Blogg %(name)s" +msgstr "Ta bort Wiki eller Blogg %(name)s" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:33 -#, fuzzy #| msgid "" #| "This action will remove all the posts, pages and comments including " #| "revision history. Delete this wiki/blog permanently?" @@ -1176,7 +1167,7 @@ msgid "" "history. Delete this wiki or blog permanently?" msgstr "" "Den här åtgärden tar bort alla inlägg, sidor och kommentarer, även " -"versionshistorik. Ta bort denna wiki/blogg permanent?" +"versionshistorik. Ta bort denna wiki eller blogg permanent?" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:44 #, python-format @@ -1217,20 +1208,18 @@ msgid "Create" msgstr "Skapa" #: plinth/modules/ikiwiki/views.py:73 -#, fuzzy #| msgid "Wiki & Blog" msgid "Wiki and Blog" -msgstr "Wiki och blogg" +msgstr "Wiki och Blogg" #: plinth/modules/ikiwiki/views.py:106 msgid "Manage Wikis and Blogs" msgstr "Hantera wikis och bloggar" #: plinth/modules/ikiwiki/views.py:132 -#, fuzzy #| msgid "Create a Wiki or Blog" msgid "Create Wiki or Blog" -msgstr "Skapa en wiki eller blogg" +msgstr "Skapa en Wiki eller Blogg" #: plinth/modules/ikiwiki/views.py:145 #, python-brace-format @@ -1263,10 +1252,9 @@ msgid "Could not delete {name}: {error}" msgstr "Kunde inte ta bort {name}: {error}" #: plinth/modules/ikiwiki/views.py:182 -#, fuzzy #| msgid "Delete Wiki/Blog" msgid "Delete Wiki or Blog" -msgstr "Ta bort wiki eller blogg" +msgstr "Ta Bort Wiki eller Blogg" #: plinth/modules/letsencrypt/__init__.py:43 #: plinth/modules/letsencrypt/templates/letsencrypt.html:38 @@ -1542,7 +1530,6 @@ msgstr "" #: plinth/modules/networks/forms.py:66 #: plinth/modules/networks/templates/connection_show.html:202 #: plinth/modules/networks/templates/connection_show.html:241 -#, fuzzy msgid "Gateway" msgstr "Gateway" @@ -1581,7 +1568,6 @@ msgstr "--Välj--" #: plinth/modules/networks/forms.py:175 #: plinth/modules/networks/templates/connection_show.html:144 -#, fuzzy msgid "SSID" msgstr "SSID" @@ -1627,106 +1613,108 @@ msgstr "Lägg till Anslutning" #: plinth/modules/networks/networks.py:46 msgid "Networks" -msgstr "" +msgstr "Nätverk" #: plinth/modules/networks/networks.py:66 msgid "Cannot show connection: Connection not found." -msgstr "" +msgstr "Kan inte visa anslutning: Ingen anslutning hittades." #: plinth/modules/networks/networks.py:100 msgid "Show Connection information" -msgstr "" +msgstr "Visa Anslutningsinformation" #: plinth/modules/networks/networks.py:113 msgid "Cannot edit connection: Connection not found." -msgstr "" +msgstr "Kan inte redigera anslutning: Ingen anslutning hittades." #: plinth/modules/networks/networks.py:119 msgid "This type of connection is not yet understood." -msgstr "" +msgstr "Denna typ av anslutning är inte förstådd ännu." #: plinth/modules/networks/networks.py:139 #: plinth/modules/networks/networks.py:198 #: plinth/modules/networks/templates/connections_edit.html:34 msgid "Edit Connection" -msgstr "" +msgstr "Redigera Anslutning" #: plinth/modules/networks/networks.py:209 #, python-brace-format msgid "Activated connection {name}." -msgstr "" +msgstr "Aktiverad anslutning {name}." #: plinth/modules/networks/networks.py:212 msgid "Failed to activate connection: Connection not found." -msgstr "" +msgstr "Det gick inte att aktivera anslutning: Ingen anslutning hittades." #: plinth/modules/networks/networks.py:216 #, python-brace-format msgid "Failed to activate connection {name}: No suitable device is available." msgstr "" +"Det gick inte att aktivera anslutningen {name}: Ingen lämplig enhet är " +"tillgänglig." #: plinth/modules/networks/networks.py:229 #, python-brace-format msgid "Deactivated connection {name}." -msgstr "" +msgstr "Inaktiverade anslutning {name}." #: plinth/modules/networks/networks.py:232 msgid "Failed to de-activate connection: Connection not found." -msgstr "" +msgstr "Kunde inte de-aktivera anslutning: Anslutning hittades inte." #: plinth/modules/networks/networks.py:282 msgid "Adding New Ethernet Connection" -msgstr "" +msgstr "Lägg Till Ny Ethernet-Anslutning" #: plinth/modules/networks/networks.py:300 msgid "Adding New PPPoE Connection" -msgstr "" +msgstr "Lägg Till Ny PPPoE-Anslutning" #: plinth/modules/networks/networks.py:332 msgid "Adding New Wi-Fi Connection" -msgstr "" +msgstr "Lägg Till Ny Wi-Fi-Anslutning" #: plinth/modules/networks/networks.py:346 #, python-brace-format msgid "Connection {name} deleted." -msgstr "" +msgstr "Anslutning {name} borttagen." #: plinth/modules/networks/networks.py:349 #: plinth/modules/networks/networks.py:358 msgid "Failed to delete connection: Connection not found." -msgstr "" +msgstr "Det gick inte att ta bort anslutning: Anslutning hittades inte." #: plinth/modules/networks/networks.py:363 #: plinth/modules/networks/templates/connections_delete.html:26 msgid "Delete Connection" -msgstr "" +msgstr "Ta Bort Anslutning" #: plinth/modules/networks/templates/connection_show.html:43 msgid "Edit connection" -msgstr "" +msgstr "Redigera anslutning" #: plinth/modules/networks/templates/connection_show.html:43 #: plinth/templates/base.html:123 msgid "Edit" -msgstr "" +msgstr "Redigera" #: plinth/modules/networks/templates/connection_show.html:50 #: plinth/modules/networks/templates/connections_list.html:78 msgid "Deactivate" -msgstr "" +msgstr "Avaktivera" #: plinth/modules/networks/templates/connection_show.html:57 #: plinth/modules/networks/templates/connections_list.html:86 msgid "Activate" -msgstr "" +msgstr "Aktivera" #: plinth/modules/networks/templates/connection_show.html:63 msgid "Delete connection" -msgstr "" +msgstr "Ta bort anslutning" #: plinth/modules/networks/templates/connection_show.html:63 msgid "Delete" -msgstr "" +msgstr "Ta bort" #: plinth/modules/networks/templates/connection_show.html:66 #: plinth/modules/networks/templates/connections_diagram.html:73 @@ -1734,21 +1722,21 @@ msgstr "" #: plinth/modules/networks/templates/connections_diagram.html:105 #: plinth/modules/networks/templates/connections_diagram.html:127 msgid "Connection" -msgstr "" +msgstr "Anslutning" #: plinth/modules/networks/templates/connection_show.html:71 msgid "Primary connection" -msgstr "" +msgstr "Primär anslutning" #: plinth/modules/networks/templates/connection_show.html:73 #: plinth/modules/networks/templates/connection_show.html:217 #: plinth/modules/networks/templates/connection_show.html:256 msgid "yes" -msgstr "" +msgstr "Ja" #: plinth/modules/networks/templates/connection_show.html:84 msgid "Device" -msgstr "" +msgstr "Enhet" #: plinth/modules/networks/templates/connection_show.html:88 msgid "State" @@ -2460,20 +2448,18 @@ msgstr "" #: plinth/modules/repro/__init__.py:36 #: plinth/modules/repro/templates/repro.html:26 #: plinth/modules/repro/views.py:55 -#, fuzzy #| msgid "GnudIP Server Address" msgid "SIP Server (repro)" -msgstr "GnudIP Serveradress" +msgstr "SIP-Server (repro)" #: plinth/modules/repro/__init__.py:41 msgid "repro SIP Server" msgstr "" #: plinth/modules/repro/forms.py:29 -#, fuzzy #| msgid "Enable service discovery" msgid "Enable repro service" -msgstr "Aktivera tjänstidentifiering" +msgstr "Aktivera tjänsten repro" #: plinth/modules/repro/templates/repro.html:29 msgid "" @@ -2502,16 +2488,14 @@ msgid "" msgstr "" #: plinth/modules/repro/templates/repro.html:63 -#, fuzzy #| msgid "Mumble server is running" msgid "repro service is running" -msgstr "Mumble-servern är aktiverad" +msgstr "Tjänsten repro är aktiverad" #: plinth/modules/repro/templates/repro.html:66 -#, fuzzy #| msgid "Mumble server is not running" msgid "repro service is not running" -msgstr "Mumble-servern är inaktiverad" +msgstr "Tjänsten repro är inaktiverad" #: plinth/modules/restore/__init__.py:36 #: plinth/modules/restore/templates/restore_index.html:26 @@ -2631,10 +2615,9 @@ msgid "Anonymity Network (Tor)" msgstr "" #: plinth/modules/tor/__init__.py:53 -#, fuzzy #| msgid "Go to Networks" msgid "Tor Anonymity Network" -msgstr "Gå till Nätverk" +msgstr "Tor Anonymitetsnätverk" #: plinth/modules/tor/__init__.py:58 msgid "Tor Bridge Relay" @@ -2702,10 +2685,9 @@ msgid "" msgstr "" #: plinth/modules/tor/templates/tor.html:54 -#, fuzzy #| msgid "Configuration updated" msgid "Tor configuration is being updated" -msgstr "Konfiguration uppdaterad" +msgstr "Konfigurationen av Tor uppdateras" #: plinth/modules/tor/templates/tor.html:62 msgid "Tor is running" @@ -2760,10 +2742,9 @@ msgid "Action error: {0} [{1}] [{2}]" msgstr "" #: plinth/modules/tor/views.py:148 -#, fuzzy #| msgid "Configuration updated" msgid "Configuration updated." -msgstr "Konfiguration uppdaterad" +msgstr "Konfiguration uppdaterad." #: plinth/modules/tor/views.py:150 msgid "An error occurred during configuration." @@ -2877,10 +2858,9 @@ msgid "Upgrade process started." msgstr "" #: plinth/modules/upgrades/views.py:99 -#, fuzzy #| msgid "Creating LDAP user failed." msgid "Starting upgrade failed." -msgstr "Det gick inte att skapa LDAP-användare." +msgstr "Det gick inte att starta uppgraderingen." #: plinth/modules/upgrades/views.py:102 msgid "Package Upgrades" From 7f4c5f7410b08134bb737ea15a96d625ba62861a Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Thu, 11 Feb 2016 09:45:09 +0530 Subject: [PATCH 069/189] Make app names as module identifiers - The last part of the module import path is the module name. This also becomes the Django app name. Apps names have to be unique. Hence, there is no scope for two different modules with same name but different load path to exist in the project. - Most uses of list of loaded modules are dealing with app names instead of full module load path. This is due to the fact that Django deals with app names and not module paths. - It is also somewhat clumsy to access a loaded module as we are re-importing every time to get access module. - Simplify all of the above by using app names are module identifiers and maintaing an ordered dictionary of app names to loadded modules. - Remove unused imports. - Minor styling fixes. --- plinth/__main__.py | 4 +-- plinth/module_loader.py | 38 ++++++++++++----------- plinth/modules/avahi/__init__.py | 4 +-- plinth/modules/config/__init__.py | 4 +-- plinth/modules/config/urls.py | 2 +- plinth/modules/datetime/__init__.py | 3 +- plinth/modules/deluge/__init__.py | 3 +- plinth/modules/diagnostics/__init__.py | 2 +- plinth/modules/diagnostics/diagnostics.py | 27 ++++++---------- plinth/modules/dynamicdns/__init__.py | 2 +- plinth/modules/firewall/__init__.py | 2 +- plinth/modules/ikiwiki/__init__.py | 3 +- plinth/modules/letsencrypt/__init__.py | 8 +---- plinth/modules/monkeysphere/__init__.py | 2 +- plinth/modules/mumble/__init__.py | 3 +- plinth/modules/names/__init__.py | 2 +- plinth/modules/networks/__init__.py | 2 +- plinth/modules/openvpn/__init__.py | 2 +- plinth/modules/owncloud/__init__.py | 2 +- plinth/modules/pagekite/__init__.py | 2 +- plinth/modules/power/__init__.py | 2 +- plinth/modules/privoxy/__init__.py | 7 ++--- plinth/modules/quassel/__init__.py | 2 +- plinth/modules/repro/__init__.py | 2 +- plinth/modules/restore/__init__.py | 2 +- plinth/modules/roundcube/__init__.py | 4 +-- plinth/modules/shaarli/__init__.py | 2 +- plinth/modules/tor/__init__.py | 2 +- plinth/modules/transmission/__init__.py | 3 +- plinth/modules/upgrades/__init__.py | 2 +- plinth/modules/users/__init__.py | 4 +-- plinth/modules/xmpp/__init__.py | 3 +- 32 files changed, 61 insertions(+), 91 deletions(-) diff --git a/plinth/__main__.py b/plinth/__main__.py index 37e62ea4b..b3f31ce3c 100644 --- a/plinth/__main__.py +++ b/plinth/__main__.py @@ -132,9 +132,7 @@ def setup_server(): cherrypy.tree.mount(None, manual_url, config) logger.debug('Serving manual images %s on %s', manual_dir, manual_url) - for module_import_path in module_loader.loaded_modules: - module = importlib.import_module(module_import_path) - module_name = module_import_path.split('.')[-1] + for module_name, module in module_loader.loaded_modules.items(): module_path = os.path.dirname(module.__file__) static_dir = os.path.join(module_path, 'static') if not os.path.isdir(static_dir): diff --git a/plinth/module_loader.py b/plinth/module_loader.py index e8cfd6dc9..c8e58cac1 100644 --- a/plinth/module_loader.py +++ b/plinth/module_loader.py @@ -19,6 +19,7 @@ Discover, load and manage Plinth modules """ +import collections import django import importlib import logging @@ -29,9 +30,9 @@ from plinth import urls from plinth.signals import pre_module_loading, post_module_loading -LOGGER = logging.getLogger(__name__) +logger = logging.getLogger(__name__) -loaded_modules = [] +loaded_modules = collections.OrderedDict() _modules_to_load = None @@ -42,16 +43,18 @@ def load_modules(): """ pre_module_loading.send_robust(sender="module_loader") modules = {} - for module_name in get_modules_to_load(): - LOGGER.info('Importing %s', module_name) + for module_import_path in get_modules_to_load(): + logger.info('Importing %s', module_import_path) + module_name = module_import_path.split('.')[-1] try: - modules[module_name] = importlib.import_module(module_name) + modules[module_name] = importlib.import_module(module_import_path) except Exception as exception: - LOGGER.exception('Could not import %s: %s', module_name, exception) + logger.exception('Could not import %s: %s', module_import_path, + exception) if cfg.debug: raise - _include_module_urls(module_name) + _include_module_urls(module_import_path, module_name) ordered_modules = [] remaining_modules = dict(modules) # Make a copy @@ -64,14 +67,14 @@ def load_modules(): _insert_modules(module_name, module, remaining_modules, ordered_modules) except KeyError: - LOGGER.error('Unsatified dependency for module - %s', + logger.error('Unsatified dependency for module - %s', module_name) - LOGGER.debug('Module load order - %s', ordered_modules) + logger.debug('Module load order - %s', ordered_modules) for module_name in ordered_modules: _initialize_module(modules[module_name]) - loaded_modules.append(module_name) + loaded_modules[module_name] = modules[module_name] post_module_loading.send_robust(sender="module_loader") @@ -94,7 +97,7 @@ def _insert_modules(module_name, module, remaining_modules, ordered_modules): try: module = remaining_modules.pop(dependency) except KeyError: - LOGGER.error('Not found or circular dependency - %s, %s', + logger.error('Not found or circular dependency - %s, %s', module_name, dependency) raise @@ -103,16 +106,15 @@ def _insert_modules(module_name, module, remaining_modules, ordered_modules): ordered_modules.append(module_name) -def _include_module_urls(module_name): +def _include_module_urls(module_import_path, module_name): """Include the module's URLs in global project URLs list""" - namespace = module_name.split('.')[-1] - url_module = module_name + '.urls' + url_module = module_import_path + '.urls' try: urls.urlpatterns += [ django.conf.urls.url( - r'', django.conf.urls.include(url_module, namespace))] + r'', django.conf.urls.include(url_module, module_name))] except ImportError: - LOGGER.debug('No URLs for %s', module_name) + logger.debug('No URLs for %s', module_name) if cfg.debug: raise @@ -122,13 +124,13 @@ def _initialize_module(module): try: init = module.init except AttributeError: - LOGGER.debug('No init() for module - %s', module.__name__) + logger.debug('No init() for module - %s', module.__name__) return try: init() except Exception as exception: - LOGGER.exception('Exception while running init for %s: %s', + logger.exception('Exception while running init for %s: %s', module, exception) if cfg.debug: raise diff --git a/plinth/modules/avahi/__init__.py b/plinth/modules/avahi/__init__.py index 7c8f5592c..84987cdc7 100644 --- a/plinth/modules/avahi/__init__.py +++ b/plinth/modules/avahi/__init__.py @@ -20,16 +20,14 @@ """ from django.utils.translation import ugettext_lazy as _ -import subprocess -from plinth import actions from plinth import action_utils from plinth import cfg from plinth import service as service_module # pylint: disable=C0103 -depends = ['plinth.modules.system'] +depends = ['system'] service = None diff --git a/plinth/modules/config/__init__.py b/plinth/modules/config/__init__.py index 12cb341ff..f4f34c4e3 100644 --- a/plinth/modules/config/__init__.py +++ b/plinth/modules/config/__init__.py @@ -24,6 +24,4 @@ __all__ = ['config', 'init'] -depends = ['plinth.modules.system', - 'plinth.modules.firewall', - 'plinth.modules.names'] +depends = ['system', 'firewall', 'names'] diff --git a/plinth/modules/config/urls.py b/plinth/modules/config/urls.py index 35f392f31..846f6e19f 100644 --- a/plinth/modules/config/urls.py +++ b/plinth/modules/config/urls.py @@ -19,7 +19,7 @@ URLs for the Configuration module """ -from django.conf.urls import patterns, url +from django.conf.urls import url from . import config as views diff --git a/plinth/modules/datetime/__init__.py b/plinth/modules/datetime/__init__.py index 147b95146..1ca8f6244 100644 --- a/plinth/modules/datetime/__init__.py +++ b/plinth/modules/datetime/__init__.py @@ -22,13 +22,12 @@ from django.utils.translation import ugettext_lazy as _ import subprocess -from plinth import actions from plinth import action_utils from plinth import cfg from plinth import service as service_module -depends = ['plinth.modules.system'] +depends = ['system'] service = None diff --git a/plinth/modules/deluge/__init__.py b/plinth/modules/deluge/__init__.py index 7038d3696..40fc0fd40 100644 --- a/plinth/modules/deluge/__init__.py +++ b/plinth/modules/deluge/__init__.py @@ -21,13 +21,12 @@ from django.utils.translation import ugettext_lazy as _ -from plinth import actions from plinth import action_utils from plinth import cfg from plinth import service as service_module -depends = ['plinth.modules.apps'] +depends = ['apps'] service = None diff --git a/plinth/modules/diagnostics/__init__.py b/plinth/modules/diagnostics/__init__.py index 8005882b3..294d3f884 100644 --- a/plinth/modules/diagnostics/__init__.py +++ b/plinth/modules/diagnostics/__init__.py @@ -25,7 +25,7 @@ __all__ = ['diagnostics', 'init'] -depends = ['plinth.modules.system'] +depends = ['system'] def diagnose(): diff --git a/plinth/modules/diagnostics/diagnostics.py b/plinth/modules/diagnostics/diagnostics.py index 19ab23e7d..4ce058e09 100644 --- a/plinth/modules/diagnostics/diagnostics.py +++ b/plinth/modules/diagnostics/diagnostics.py @@ -60,19 +60,14 @@ def index(request): @require_POST def module(request, module_name): """Return diagnostics for a particular module.""" - found = False - for module_import_path in module_loader.loaded_modules: - if module_name == module_import_path.split('.')[-1]: - found = True - break - - if not found: + try: + module = module_loader.loaded_modules[module_name] + except KeyError: raise Http404('Module does not exist or not loaded') - loaded_module = importlib.import_module(module_import_path) results = [] - if hasattr(loaded_module, 'diagnose'): - results = loaded_module.diagnose() + if hasattr(module, 'diagnose'): + results = module.diagnose() return TemplateResponse(request, 'diagnostics_module.html', {'title': _('Diagnostic Test'), @@ -110,17 +105,15 @@ def run_on_all_modules(): 'progress_percentage': 0} modules = [] - for module_import_path in module_loader.loaded_modules: - loaded_module = importlib.import_module(module_import_path) - if not hasattr(loaded_module, 'diagnose'): + for module_name, module in module_loader.loaded_modules.items(): + if not hasattr(module, 'diagnose'): continue - module_name = module_import_path.split('.')[-1] - modules.append((module_name, loaded_module)) + modules.append((module_name, module)) current_results['results'][module_name] = None current_results['modules'] = modules - for current_index, (module_name, loaded_module) in enumerate(modules): - current_results['results'][module_name] = loaded_module.diagnose() + for current_index, (module_name, module) in enumerate(modules): + current_results['results'][module_name] = module.diagnose() current_results['progress_percentage'] = \ int((current_index + 1) * 100 / len(modules)) diff --git a/plinth/modules/dynamicdns/__init__.py b/plinth/modules/dynamicdns/__init__.py index 747482e9d..7b4bc398d 100644 --- a/plinth/modules/dynamicdns/__init__.py +++ b/plinth/modules/dynamicdns/__init__.py @@ -24,4 +24,4 @@ __all__ = ['dynamicdns', 'init'] -depends = ['plinth.modules.apps'] +depends = ['apps'] diff --git a/plinth/modules/firewall/__init__.py b/plinth/modules/firewall/__init__.py index 27daf85a0..3abc58c06 100644 --- a/plinth/modules/firewall/__init__.py +++ b/plinth/modules/firewall/__init__.py @@ -24,4 +24,4 @@ __all__ = ['firewall', 'init'] -depends = ['plinth.modules.system'] +depends = ['system'] diff --git a/plinth/modules/ikiwiki/__init__.py b/plinth/modules/ikiwiki/__init__.py index 402f4b6ae..8830af010 100644 --- a/plinth/modules/ikiwiki/__init__.py +++ b/plinth/modules/ikiwiki/__init__.py @@ -21,13 +21,12 @@ from django.utils.translation import ugettext_lazy as _ -from plinth import actions from plinth import action_utils from plinth import cfg from plinth import service as service_module -depends = ['plinth.modules.apps'] +depends = ['apps'] service = None diff --git a/plinth/modules/letsencrypt/__init__.py b/plinth/modules/letsencrypt/__init__.py index 565d78bed..1375ed176 100644 --- a/plinth/modules/letsencrypt/__init__.py +++ b/plinth/modules/letsencrypt/__init__.py @@ -20,19 +20,13 @@ """ from django.utils.translation import ugettext_lazy as _ -import json -from plinth import actions from plinth import action_utils from plinth import cfg -from plinth import service as service_module from plinth.modules import names -depends = [ - 'plinth.modules.apps', - 'plinth.modules.names' -] +depends = ['apps', 'names'] service = None diff --git a/plinth/modules/monkeysphere/__init__.py b/plinth/modules/monkeysphere/__init__.py index d9501870d..b7a8329f3 100644 --- a/plinth/modules/monkeysphere/__init__.py +++ b/plinth/modules/monkeysphere/__init__.py @@ -23,7 +23,7 @@ from plinth import cfg -depends = ['plinth.modules.system'] +depends = ['system'] def init(): diff --git a/plinth/modules/mumble/__init__.py b/plinth/modules/mumble/__init__.py index 570a57cc8..846681b29 100644 --- a/plinth/modules/mumble/__init__.py +++ b/plinth/modules/mumble/__init__.py @@ -21,13 +21,12 @@ from django.utils.translation import ugettext_lazy as _ -from plinth import actions from plinth import action_utils from plinth import cfg from plinth import service as service_module -depends = ['plinth.modules.apps'] +depends = ['apps'] service = None diff --git a/plinth/modules/names/__init__.py b/plinth/modules/names/__init__.py index 841b95f7f..8f9fd8488 100644 --- a/plinth/modules/names/__init__.py +++ b/plinth/modules/names/__init__.py @@ -31,7 +31,7 @@ ('ssh', _('SSH'), 22), ) -depends = ['plinth.modules.system'] +depends = ['system'] domain_types = {} domains = {} diff --git a/plinth/modules/networks/__init__.py b/plinth/modules/networks/__init__.py index a3a679823..c3c93a17b 100644 --- a/plinth/modules/networks/__init__.py +++ b/plinth/modules/networks/__init__.py @@ -31,7 +31,7 @@ __all__ = ['networks', 'init'] -depends = ['plinth.modules.system'] +depends = ['system'] logger = Logger(__name__) diff --git a/plinth/modules/openvpn/__init__.py b/plinth/modules/openvpn/__init__.py index 20be7aabe..688b1507f 100644 --- a/plinth/modules/openvpn/__init__.py +++ b/plinth/modules/openvpn/__init__.py @@ -27,7 +27,7 @@ from plinth import service as service_module -depends = ['plinth.modules.apps'] +depends = ['apps'] service = None diff --git a/plinth/modules/owncloud/__init__.py b/plinth/modules/owncloud/__init__.py index e48fcae2d..543909e21 100644 --- a/plinth/modules/owncloud/__init__.py +++ b/plinth/modules/owncloud/__init__.py @@ -26,7 +26,7 @@ __all__ = ['owncloud', 'init'] -depends = ['plinth.modules.apps'] +depends = ['apps'] def diagnose(): diff --git a/plinth/modules/pagekite/__init__.py b/plinth/modules/pagekite/__init__.py index b83c7e5ae..7e5f689ba 100644 --- a/plinth/modules/pagekite/__init__.py +++ b/plinth/modules/pagekite/__init__.py @@ -26,7 +26,7 @@ __all__ = ['init'] -depends = ['plinth.modules.apps', 'plinth.modules.names'] +depends = ['apps', 'names'] def init(): diff --git a/plinth/modules/power/__init__.py b/plinth/modules/power/__init__.py index f8f4c4e56..32cd2af14 100644 --- a/plinth/modules/power/__init__.py +++ b/plinth/modules/power/__init__.py @@ -23,7 +23,7 @@ from plinth import cfg -depends = ['plinth.modules.system'] +depends = ['system'] def init(): diff --git a/plinth/modules/privoxy/__init__.py b/plinth/modules/privoxy/__init__.py index 545020a0f..4c3e07627 100644 --- a/plinth/modules/privoxy/__init__.py +++ b/plinth/modules/privoxy/__init__.py @@ -20,7 +20,6 @@ """ from django.utils.translation import ugettext_lazy as _ -import json from plinth import actions from plinth import action_utils @@ -28,7 +27,7 @@ from plinth import service as service_module -depends = ['plinth.modules.apps'] +depends = ['apps'] service = None @@ -84,9 +83,7 @@ def diagnose_url_with_proxy(): result = action_utils.diagnose_url(url, kind=address['kind'], env=env) result[0] = _('Access {url} with proxy {proxy} on tcp{kind}') \ - .format(url=url, proxy=proxy, kind=address['kind']) + .format(url=url, proxy=proxy, kind=address['kind']) results.append(result) return results - - diff --git a/plinth/modules/quassel/__init__.py b/plinth/modules/quassel/__init__.py index 3e8c1b03a..54a2ec45b 100644 --- a/plinth/modules/quassel/__init__.py +++ b/plinth/modules/quassel/__init__.py @@ -25,7 +25,7 @@ from plinth import cfg from plinth import service as service_module -depends = ['plinth.modules.apps'] +depends = ['apps'] service = None diff --git a/plinth/modules/repro/__init__.py b/plinth/modules/repro/__init__.py index 7517052f8..5cba93082 100644 --- a/plinth/modules/repro/__init__.py +++ b/plinth/modules/repro/__init__.py @@ -25,7 +25,7 @@ from plinth import cfg from plinth import service as service_module -depends = ['plinth.modules.apps'] +depends = ['apps'] service = None diff --git a/plinth/modules/restore/__init__.py b/plinth/modules/restore/__init__.py index 21bb030d4..45404a27a 100644 --- a/plinth/modules/restore/__init__.py +++ b/plinth/modules/restore/__init__.py @@ -27,7 +27,7 @@ __all__ = ['init'] -depends = ['plinth.modules.apps'] +depends = ['apps'] def init(): diff --git a/plinth/modules/roundcube/__init__.py b/plinth/modules/roundcube/__init__.py index 5d9bd1e40..c170c6f2b 100644 --- a/plinth/modules/roundcube/__init__.py +++ b/plinth/modules/roundcube/__init__.py @@ -21,13 +21,11 @@ from django.utils.translation import ugettext_lazy as _ -from plinth import actions from plinth import action_utils from plinth import cfg -from plinth import service as service_module -depends = ['plinth.modules.apps'] +depends = ['apps'] def init(): diff --git a/plinth/modules/shaarli/__init__.py b/plinth/modules/shaarli/__init__.py index e23af9186..ac2e07df1 100644 --- a/plinth/modules/shaarli/__init__.py +++ b/plinth/modules/shaarli/__init__.py @@ -26,7 +26,7 @@ from plinth import service as service_module -depends = ['plinth.modules.apps'] +depends = ['apps'] service = None diff --git a/plinth/modules/tor/__init__.py b/plinth/modules/tor/__init__.py index bd7ef694e..6933e9348 100644 --- a/plinth/modules/tor/__init__.py +++ b/plinth/modules/tor/__init__.py @@ -32,7 +32,7 @@ from plinth.signals import domain_added -depends = ['plinth.modules.apps', 'plinth.modules.names'] +depends = ['apps', 'names'] socks_service = None bridge_service = None diff --git a/plinth/modules/transmission/__init__.py b/plinth/modules/transmission/__init__.py index b57797b99..4206c1985 100644 --- a/plinth/modules/transmission/__init__.py +++ b/plinth/modules/transmission/__init__.py @@ -21,13 +21,12 @@ from django.utils.translation import ugettext_lazy as _ -from plinth import actions from plinth import action_utils from plinth import cfg from plinth import service as service_module -depends = ['plinth.modules.apps'] +depends = ['apps'] service = None diff --git a/plinth/modules/upgrades/__init__.py b/plinth/modules/upgrades/__init__.py index 28b9f7c4a..2e5110a16 100644 --- a/plinth/modules/upgrades/__init__.py +++ b/plinth/modules/upgrades/__init__.py @@ -24,7 +24,7 @@ from plinth import cfg -depends = ['plinth.modules.system'] +depends = ['system'] def init(): diff --git a/plinth/modules/users/__init__.py b/plinth/modules/users/__init__.py index 7232efaa1..7cb738071 100644 --- a/plinth/modules/users/__init__.py +++ b/plinth/modules/users/__init__.py @@ -20,14 +20,12 @@ """ from django.utils.translation import ugettext_lazy as _ -import json import subprocess from plinth import cfg -from plinth import actions from plinth import action_utils -depends = ['plinth.modules.system'] +depends = ['system'] def init(): diff --git a/plinth/modules/xmpp/__init__.py b/plinth/modules/xmpp/__init__.py index d0851c24a..65e8a3c19 100644 --- a/plinth/modules/xmpp/__init__.py +++ b/plinth/modules/xmpp/__init__.py @@ -20,7 +20,6 @@ """ from django.utils.translation import ugettext_lazy as _ -import json from plinth import actions from plinth import action_utils @@ -30,7 +29,7 @@ from plinth.signals import domainname_change -depends = ['plinth.modules.apps'] +depends = ['apps'] service = None From 1e8cc6f2904783bba3f2b4467269b4356459bd52 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Thu, 11 Feb 2016 09:51:39 +0530 Subject: [PATCH 070/189] Cleanup final use of urls.patterns() method - As deprecated in Django 1.9. --- plinth/urls.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/plinth/urls.py b/plinth/urls.py index 5ab1c866e..44be0a509 100644 --- a/plinth/urls.py +++ b/plinth/urls.py @@ -19,10 +19,9 @@ Django URLconf file containing all urls """ -from django.conf.urls import patterns, url +from django.conf.urls import url +from . import views - -urlpatterns = patterns( # pylint: disable-msg=C0103 - 'plinth.views', - url(r'^$', 'index', name='index') -) +urlpatterns = [ + url(r'^$', views.index, name='index') +] From 20a97488d90a23be266af0d198c5330c8ec97912 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 13:43:15 +0530 Subject: [PATCH 071/189] package: Proper string casting of PackageException --- plinth/package.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plinth/package.py b/plinth/package.py index 75a8bfca0..5342d9f23 100644 --- a/plinth/package.py +++ b/plinth/package.py @@ -46,6 +46,11 @@ def __init__(self, error_string=None, error_details=None, *args, **kwargs): self.error_string = error_string self.error_details = error_details + def __str__(self): + """Return the strin representation of the exception.""" + return 'PackageException(error_string="{0}", error_details="{1}")' \ + .format(self.error_string, self.error_details) + class Transaction(object): """Information about an ongoing transaction.""" From 716ba5f1a02897c426114a879bf8c01b0d960729 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 13:45:24 +0530 Subject: [PATCH 072/189] package: Expose starting install without thread --- plinth/package.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plinth/package.py b/plinth/package.py index 5342d9f23..5a5f2ae3c 100644 --- a/plinth/package.py +++ b/plinth/package.py @@ -94,15 +94,15 @@ def __str__(self): self.package_names, self.allow_cancel, self.status_string, self.percentage, self.package, self.item_progress) - def start_install(self): + def start_install_in_thread(self): """Start a PackageKit transaction to install given list of packages. This operation is non-blocking at it spawns a new thread. """ - thread = threading.Thread(target=self._install) + thread = threading.Thread(target=self.install) thread.start() - def _install(self): + def install(self): """Run a PackageKit transaction to install given packages.""" try: if self.before_install: @@ -319,4 +319,4 @@ def start_install(package_names, before_install=None, on_install=None): on_install=on_install) transactions[frozenset(package_names)] = transaction - transaction.start_install() + transaction.start_install_in_thread() From 2bba8b07fed49a984699285e3242cb9618a96fa0 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 13:46:42 +0530 Subject: [PATCH 073/189] models: New model to store module setup versions --- plinth/migrations/0002_modulestore.py | 22 ++++++++++++++++++++++ plinth/models.py | 6 ++++++ 2 files changed, 28 insertions(+) create mode 100644 plinth/migrations/0002_modulestore.py diff --git a/plinth/migrations/0002_modulestore.py b/plinth/migrations/0002_modulestore.py new file mode 100644 index 000000000..43b81c064 --- /dev/null +++ b/plinth/migrations/0002_modulestore.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.2 on 2016-02-10 12:30 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('plinth', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Module', + fields=[ + ('name', models.TextField(primary_key=True, serialize=False)), + ('setup_version', models.IntegerField()), + ], + ), + ] diff --git a/plinth/models.py b/plinth/models.py index 8dc1cfd03..bf2bf3350 100644 --- a/plinth/models.py +++ b/plinth/models.py @@ -37,3 +37,9 @@ def value(self): def value(self, val): """Store the value of the key/value pair by JSON encoding it""" self.value_json = json.dumps(val) + + +class Module(models.Model): + """Model to store current setup versions of a module.""" + name = models.TextField(primary_key=True) + setup_version = models.IntegerField() From be6ccabec27fa9379ad744e4740dbde17ab90a4a Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 13:54:25 +0530 Subject: [PATCH 074/189] setup: New module to handle application setup - There shall be a setup helper object in every module. The setup process will simply call methods in helper. - Helper is responsible for loading/storing/checking module setup versions. - Methods help in showing progress of setup process automatically. --- plinth/setup.py | 163 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 plinth/setup.py diff --git a/plinth/setup.py b/plinth/setup.py new file mode 100644 index 000000000..2ade51021 --- /dev/null +++ b/plinth/setup.py @@ -0,0 +1,163 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Plinth module with utilites for performing application setup operations. +""" + +import logging +import threading + +from . import package +import plinth + +logger = logging.getLogger(__name__) + + +class Helper(object): + """Helper routines for modules to show progress.""" + + def __init__(self, module_name, module): + """Initialize the object.""" + self.module_name = module_name + self.module = module + self.current_operation = None + self.is_finished = None + self.exception = None + + def run_in_thread(self): + """Execute the setup process in a thread.""" + thread = threading.Thread(target=self._run) + thread.start() + + def _run(self): + """Collect exceptions when running in a thread.""" + try: + self.run() + except Exception as exception: + self.exception = exception + + def collect_result(self): + """Return the exception if any.""" + exception = self.exception + self.exception = None + self.is_finished = None + return exception + + def run(self): + """Execute the setup process.""" + # Setup for the module is already running + if self.current_operation: + return + + current_version = self.get_setup_version() + if current_version >= self.module.version: + return + + self.exception = None + self.current_operation = None + self.is_finished = False + try: + if hasattr(self.module, 'setup'): + logger.info('Running module setup - %s', self.module_name) + self.module.setup(self, old_version=current_version) + else: + logger.info('Module does not require setup - %s', + self.module_name) + except Exception as exception: + logger.exception('Error running setup - %s', exception) + raise exception + else: + self.set_setup_version(self.module.version) + finally: + self.is_finished = True + self.current_operation = None + + def install(self, package_names): + """Install a set of packages marking progress.""" + logger.info('Running install for module - %s, packages - %s', + self.module_name, package_names) + transaction = package.Transaction(package_names) + self.current_operation = { + 'step': 'install', + 'transaction': transaction, + } + + transaction.install() + if transaction.exception: + logger.error('Error running install - %s', transaction.exception) + raise transaction.exception + + def call(self, step, method, *args, **kwargs): + """Call an arbitrary method during setup and note down its stage.""" + logger.info('Running step for module - %s, step - %s', + self.module_name, step) + self.current_operation = {'step': step} + return method(*args, **kwargs) + + def get_state(self): + """Return whether the module is not setup or needs upgrade.""" + current_version = self.get_setup_version() + if current_version and self.module.version <= current_version: + return 'up-to-date' + + # If a module need installing/updating but no setup method is + # available, then automatically set version. + # + # Minor violation of 'get' only discipline for convenience. + if not hasattr(self.module, 'setup'): + self.set_setup_version(self.module.version) + return 'up-to-date' + + if not current_version: + return 'needs-setup' + else: + return 'needs-update' + + def get_setup_version(self): + """Return the setup version of a module.""" + # XXX: Optimize version gets + from . import models + + try: + module_entry = models.Module.objects.get(pk=self.module_name) + return module_entry.setup_version + except models.Module.DoesNotExist: + return 0 + + def set_setup_version(self, version): + """Set a module's setup version.""" + from . import models + + models.Module.objects.update_or_create( + pk=self.module_name, defaults={'setup_version': version}) + + +def init(module_name, module): + """Create a setup helper for a module for later use.""" + if not hasattr(module, 'setup_helper'): + module.setup_helper = Helper(module_name, module) + + +def setup_all_modules(essential=False): + """Run setup on all essential modules and exit.""" + logger.info('Running setup for all modules, essential - %s', essential) + for module_name, module in plinth.module_loader.loaded_modules.items(): + if essential and not getattr(module, 'is_essential', False): + continue + + module.setup_helper.run() From 80d9f0d41e6df73945b439224ae128a0d4f259f9 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 13:57:20 +0530 Subject: [PATCH 075/189] module_loader: Add setup helper to every module - During initialization add a setup helper to every module. For use later. --- plinth/module_loader.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/plinth/module_loader.py b/plinth/module_loader.py index c8e58cac1..272c1ae78 100644 --- a/plinth/module_loader.py +++ b/plinth/module_loader.py @@ -28,6 +28,7 @@ from plinth import cfg from plinth import urls +from plinth import setup from plinth.signals import pre_module_loading, post_module_loading logger = logging.getLogger(__name__) @@ -73,7 +74,7 @@ def load_modules(): logger.debug('Module load order - %s', ordered_modules) for module_name in ordered_modules: - _initialize_module(modules[module_name]) + _initialize_module(module_name, modules[module_name]) loaded_modules[module_name] = modules[module_name] post_module_loading.send_robust(sender="module_loader") @@ -119,8 +120,11 @@ def _include_module_urls(module_import_path, module_name): raise -def _initialize_module(module): +def _initialize_module(module_name, module): """Call initialization method in the module if it exists""" + # Perform setup related initialization on the module + setup.init(module_name, module) + try: init = module.init except AttributeError: From 7a4a8fbc990864e1ab29f73113037df2d8027cf4 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 13:58:28 +0530 Subject: [PATCH 076/189] views: New view to show setup need and progress --- plinth/templates/setup.html | 101 ++++++++++++++++++++++++++++++++++++ plinth/views.py | 26 ++++++++++ 2 files changed, 127 insertions(+) create mode 100644 plinth/templates/setup.html diff --git a/plinth/templates/setup.html b/plinth/templates/setup.html new file mode 100644 index 000000000..4cd25ee0f --- /dev/null +++ b/plinth/templates/setup.html @@ -0,0 +1,101 @@ +{% extends "base.html" %} +{% comment %} +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +{% endcomment %} + +{% load bootstrap %} +{% load i18n %} + +{% block page_head %} + + {% if setup_helper.current_operation %} + + {% endif %} + +{% endblock %} + + +{% block content %} + +

{% trans "Installation" %}: {{ setup_helper.module.title }}

+ + {% for paragraph in setup_helper.module.description %} +

{{ paragraph|safe }}

+ {% endfor %} + + {% if not setup_helper.current_operation %} + + {% if setup_helper.get_state == 'needs-setup' %} +

+ {% blocktrans trimmed %} + Install this application? + {% endblocktrans %} +

+ + + {% csrf_token %} + + + + {% elif setup_helper.get_state == 'needs-update' %} +

+ {% blocktrans trimmed %} + This application needs an update. Update now? + {% endblocktrans %} +

+ +
+ {% csrf_token %} + + +
+ {% endif %} + + {% else %} + + {% if setup_helper.current_operation.step == 'pre' %} + {% trans "Performing pre-install operation" %} + {% elif setup_helper.current_operation.step == 'post' %} + {% trans "Performing post-install operation" %} + {% elif setup_helper.current_operation.step == 'install' %} + {% with transaction=setup_helper.current_operation.transaction %} +
+ {% blocktrans trimmed with package_names=transaction.package_names|join:", " status=transaction.status_string %} + Installing {{ package_names }}: {{ status }} + {% endblocktrans %} +
+
+
+ + {% blocktrans trimmed with percentage=transaction.percentage %} + {{ percentage }}% complete + {% endblocktrans %} + +
+
+ {% endwith %} + {% endif %} + + {% endif %} + +{% endblock %} diff --git a/plinth/views.py b/plinth/views.py index cfbbd608b..8cee96adf 100644 --- a/plinth/views.py +++ b/plinth/views.py @@ -22,6 +22,7 @@ from django.core.urlresolvers import reverse from django.http.response import HttpResponseRedirect from django.views.generic import TemplateView +import time from plinth import package as package_module @@ -61,3 +62,28 @@ def post(self, *args, **kwargs): before_install=self.kwargs.get('before_install'), on_install=self.kwargs.get('on_install')) return self.render_to_response(self.get_context_data()) + + +class SetupView(TemplateView): + """View to prompt and setup applications.""" + template_name = 'setup.html' + + def get_context_data(self, **kwargs): + """Return the context data rendering the template.""" + context = super(SetupView, self).get_context_data(**kwargs) + context['setup_helper'] = self.kwargs['setup_helper'] + return context + + def post(self, *args, **kwargs): + """Handle installing/upgrading applications. + + Start the application setup, and refresh the page every few + seconds to keep displaying the status. + """ + self.kwargs['setup_helper'].run_in_thread() + + # Give a moment for the setup process to start and show + # meaningful status. + time.sleep(1) + + return self.render_to_response(self.get_context_data()) From 8dcafe3e0eea1b0a38eee7e41e5e3ac668e05e25 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 13:59:40 +0530 Subject: [PATCH 077/189] middleware: New middleware to check need for setup - Call the setup helper to check if a installation or update of a module is required. - Show installation and progress using the setup view. --- plinth/__main__.py | 1 + plinth/middleware.py | 75 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 plinth/middleware.py diff --git a/plinth/__main__.py b/plinth/__main__.py index b3f31ce3c..af4a82d5b 100644 --- a/plinth/__main__.py +++ b/plinth/__main__.py @@ -256,6 +256,7 @@ def configure_django(): 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'stronghold.middleware.LoginRequiredMiddleware', 'plinth.modules.first_boot.middleware.FirstBootMiddleware', + 'plinth.middleware.SetupMiddleware', ), ROOT_URLCONF='plinth.urls', SECURE_PROXY_SSL_HEADER=secure_proxy_ssl_header, diff --git a/plinth/middleware.py b/plinth/middleware.py new file mode 100644 index 000000000..b4ad0f0b4 --- /dev/null +++ b/plinth/middleware.py @@ -0,0 +1,75 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Django middleware to show pre-setup message and setup progress. +""" + +from django.contrib import messages +from django.core.urlresolvers import resolve +from django.utils.translation import ugettext_lazy as _ +import logging + +import plinth +from plinth.package import PackageException +from . import views + + +logger = logging.getLogger(__name__) + + +class SetupMiddleware(object): + """Show setup page or progress if setup is neccessary or running.""" + + @staticmethod + def process_request(request): + """Handle a request as Django middleware request handler.""" + # Perform a URL resolution. This is slightly inefficient as + # Django will do this resolution again. + resolver_match = resolve(request.path_info) + if not resolver_match.namespaces or not len(resolver_match.namespaces): + # Requested URL does not belong to any application + return + + module_name = resolver_match.namespaces[0] + module = plinth.module_loader.loaded_modules[module_name] + + # Collect errors from any previous operations and show them + if module.setup_helper.is_finished: + exception = module.setup_helper.collect_result() + if not exception: + messages.success(request, _('Application installed.')) + else: + if isinstance(exception, PackageException): + error_string = getattr(exception, 'error_string', + str(exception)) + error_details = getattr(exception, 'error_details', '') + message = _('Error installing application: {string} ' + '{details}').format( + string=error_string, details=error_details) + else: + message = _('Error installing application: {error}') \ + .format(error=exception) + + messages.error(request, message) + + # Check if application is up-to-date + if module.setup_helper.get_state() == 'up-to-date': + return + + view = views.SetupView.as_view() + return view(request, setup_helper=module.setup_helper) From 2c836046a61b4132d090848620307136caa06540 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 14:00:47 +0530 Subject: [PATCH 078/189] main: Add command argument to setup essential apps - The --setup argument sets up all applications that declare themselves as essential. - This is done synchronously. - Plinth exits after the setup is complete. - Plinth fails with an error in case any of the setup tasks fail. The process will be continued on next invocation or access of application from UI. --- plinth/__main__.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/plinth/__main__.py b/plinth/__main__.py index af4a82d5b..6b463d272 100644 --- a/plinth/__main__.py +++ b/plinth/__main__.py @@ -33,6 +33,7 @@ from plinth import cfg from plinth import module_loader from plinth import service +from plinth import setup logger = logging.getLogger(__name__) @@ -57,6 +58,9 @@ def parse_arguments(): parser.add_argument( '--no-daemon', action='store_true', default=cfg.no_daemon, help='do not start as a daemon') + parser.add_argument( + '--setup', action='store_true', default=False, + help='run setup tasks on all essential modules and exit') parser.add_argument( '--diagnose', action='store_true', default=False, help='run diagnostic tests and exit') @@ -277,6 +281,18 @@ def configure_django(): os.chmod(cfg.store_file, stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP) +def run_setup_and_exit(): + """Run setup on all essential modules and exit.""" + error_code = 0 + try: + setup.setup_all_modules(essential=True) + except Exception as exception: + logger.error('Error running setup - %s', exception) + error_code = 1 + + sys.exit(error_code) + + def run_diagnostics_and_exit(): """Run diagostics on all modules and exit.""" module = importlib.import_module('plinth.modules.diagnostics.diagnostics') @@ -314,6 +330,9 @@ def main(): module_loader.load_modules() + if arguments.setup: + run_setup_and_exit() + if arguments.diagnose: run_diagnostics_and_exit() From 45a1bff51d3ef5daef5207569bc73c805205aa26 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 14:03:36 +0530 Subject: [PATCH 079/189] templates: Base template for all applications To show introduction and title of a module which will be available as properties of a module. This allows the setup process to show the introduction to the application instead of a blank page. --- plinth/templates/app.html | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 plinth/templates/app.html diff --git a/plinth/templates/app.html b/plinth/templates/app.html new file mode 100644 index 000000000..023171c08 --- /dev/null +++ b/plinth/templates/app.html @@ -0,0 +1,33 @@ +{% extends "base.html" %} +{% comment %} +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +{% endcomment %} + +{% load i18n %} + +{% block content %} +

{{ title }}

+ + {% for paragraph in description %} +

{{ paragraph|safe }}

+ {% endfor %} + + {% block configuration %} + {% endblock %} + +{% endblock %} From b112c828897a3d062632bd8bcea6ce5cf59cae39 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 14:06:43 +0530 Subject: [PATCH 080/189] privoxy: Use new setup mechanism --- plinth/modules/privoxy/__init__.py | 35 ++++++++++++++++--- plinth/modules/privoxy/templates/privoxy.html | 26 ++------------ plinth/modules/privoxy/views.py | 11 ++---- 3 files changed, 35 insertions(+), 37 deletions(-) diff --git a/plinth/modules/privoxy/__init__.py b/plinth/modules/privoxy/__init__.py index 4c3e07627..eaf0d20d1 100644 --- a/plinth/modules/privoxy/__init__.py +++ b/plinth/modules/privoxy/__init__.py @@ -25,23 +25,50 @@ from plinth import action_utils from plinth import cfg from plinth import service as service_module +from plinth.utils import format_lazy +version = 1 + +is_essential = False + depends = ['apps'] +title = _('Web Proxy (Privoxy)') + +description = [ + _('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. '), + + format_lazy( + _('You can use Privoxy by modifying your browser proxy settings to ' + 'your {box_name} hostname (or IP address) with port 8118. ' + 'While using Privoxy, you can see its configuration details and ' + 'documentation at ' + 'http://config.privoxy.org/ ' + 'or http://p.p.'), box_name=_(cfg.box_name)) +] + service = None def init(): """Intialize the module.""" menu = cfg.main_menu.get('apps:index') - menu.add_urlname(_('Web Proxy (Privoxy)'), 'glyphicon-cloud-upload', - 'privoxy:index', 1000) + menu.add_urlname(title, 'glyphicon-cloud-upload', 'privoxy:index', 1000) global service service = service_module.Service( - 'privoxy', _('Privoxy Web Proxy'), - is_external=False, enabled=is_enabled()) + 'privoxy', title, is_external=False, enabled=is_enabled()) + + +def setup(helper, old_version=None): + """Install and configure the module.""" + helper.install(['privoxy']) + helper.call('post', actions.superuser_run, 'privoxy', ['setup']) + helper.call('post', service.notify_enabled, None, True) def is_enabled(): diff --git a/plinth/modules/privoxy/templates/privoxy.html b/plinth/modules/privoxy/templates/privoxy.html index 4a4f82c00..d80099eb4 100644 --- a/plinth/modules/privoxy/templates/privoxy.html +++ b/plinth/modules/privoxy/templates/privoxy.html @@ -1,4 +1,4 @@ -{% extends "base.html" %} +{% extends "app.html" %} {% comment %} # # This file is part of Plinth. @@ -21,29 +21,7 @@ {% load bootstrap %} {% load i18n %} -{% block content %} - -

{% trans "Web Proxy (Privoxy)" %}

- -

- {% 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 %} -

- -

- {% blocktrans trimmed %} - You can use Privoxy by modifying your browser proxy settings to - your {{ box_name }} hostname (or IP address) with port 8118. - While using Privoxy, you can see its configuration details and - documentation at - http://config.privoxy.org/ - or http://p.p. - {% endblocktrans %} -

+{% block configuration %}

{% trans "Status" %}

diff --git a/plinth/modules/privoxy/views.py b/plinth/modules/privoxy/views.py index 47bb844c7..853f8709f 100644 --- a/plinth/modules/privoxy/views.py +++ b/plinth/modules/privoxy/views.py @@ -26,19 +26,11 @@ from .forms import PrivoxyForm from plinth import actions -from plinth import package from plinth.modules import privoxy logger = logging.getLogger(__name__) -def on_install(): - """Notify that the service is now enabled.""" - actions.superuser_run('privoxy', ['setup']) - privoxy.service.notify_enabled(None, True) - - -@package.required(['privoxy'], on_install=on_install) def index(request): """Serve configuration page.""" status = get_status() @@ -56,7 +48,8 @@ def index(request): form = PrivoxyForm(initial=status, prefix='privoxy') return TemplateResponse(request, 'privoxy.html', - {'title': _('Web Proxy (Privoxy)'), + {'title': privoxy.title, + 'description': privoxy.description, 'status': status, 'form': form}) From 83a56bba934fcff235ccb36864c15cddc1231847 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 14:09:57 +0530 Subject: [PATCH 081/189] apps: Use new setup mechanism --- plinth/modules/apps/__init__.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plinth/modules/apps/__init__.py b/plinth/modules/apps/__init__.py index 28d22ea0b..b7edfd994 100644 --- a/plinth/modules/apps/__init__.py +++ b/plinth/modules/apps/__init__.py @@ -23,3 +23,7 @@ from .apps import init __all__ = ['apps', 'init'] + +version = 1 + +is_essential = 1 From ad8fea5eb2a8fe8ab67d435d36798c8e2dfc826b Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 14:18:20 +0530 Subject: [PATCH 082/189] avahi: Use new setup mechanism --- plinth/modules/avahi/__init__.py | 29 +++++++++++++++++++---- plinth/modules/avahi/templates/avahi.html | 18 ++------------ plinth/modules/avahi/views.py | 5 ++-- 3 files changed, 29 insertions(+), 23 deletions(-) diff --git a/plinth/modules/avahi/__init__.py b/plinth/modules/avahi/__init__.py index 84987cdc7..c4c0970bc 100644 --- a/plinth/modules/avahi/__init__.py +++ b/plinth/modules/avahi/__init__.py @@ -24,24 +24,45 @@ from plinth import action_utils from plinth import cfg from plinth import service as service_module +from plinth.utils import format_lazy # pylint: disable=C0103 +version = 1 + +is_essential = True + depends = ['system'] +title = _('Service Discovery') + +description = [ + format_lazy( + _('Service discovery allows other devices on the network to ' + 'discover your {{ box_name }} and services running on it. It ' + 'also allows {{ box_name }} to discover other devices 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.'), box_name=_(cfg.box_name)) +] + service = None def init(): """Intialize the service discovery module.""" menu = cfg.main_menu.get('system:index') - menu.add_urlname(_('Service Discovery'), 'glyphicon-lamp', - 'avahi:index', 950) + menu.add_urlname(title, 'glyphicon-lamp', 'avahi:index', 950) global service # pylint: disable=W0603 service = service_module.Service( - 'avahi', _('Service Discovery'), ['mdns'], - is_external=False, enabled=is_enabled()) + 'avahi', title, ['mdns'], is_external=False, enabled=is_enabled()) + + +def setup(helper, old_version=False): + """Install and configure the module.""" + helper.install(['avahi-daemon']) def is_enabled(): diff --git a/plinth/modules/avahi/templates/avahi.html b/plinth/modules/avahi/templates/avahi.html index c3d1b98d7..193a1ac07 100644 --- a/plinth/modules/avahi/templates/avahi.html +++ b/plinth/modules/avahi/templates/avahi.html @@ -1,4 +1,4 @@ -{% extends "base.html" %} +{% extends "app.html" %} {% comment %} # # This file is part of Plinth. @@ -21,21 +21,7 @@ {% load bootstrap %} {% load i18n %} -{% block content %} - -

{% trans "Service Discovery" %}

- -

- {% blocktrans trimmed %} - Service discovery allows other devices on the network to - discover your {{ box_name }} and services running on it. It - also allows {{ box_name }} to discover other devices 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 %} -

+{% block configuration %}

{% trans "Status" %}

diff --git a/plinth/modules/avahi/views.py b/plinth/modules/avahi/views.py index e8fa4b61c..77751abca 100644 --- a/plinth/modules/avahi/views.py +++ b/plinth/modules/avahi/views.py @@ -26,14 +26,12 @@ from .forms import ServiceDiscoveryForm from plinth import actions -from plinth import package from plinth.modules import avahi logger = logging.getLogger(__name__) # pylint: disable=C0103 -@package.required(['avahi-daemon']) def index(request): """Serve configuration page.""" status = get_status() @@ -50,7 +48,8 @@ def index(request): form = ServiceDiscoveryForm(initial=status, prefix='avahi') return TemplateResponse(request, 'avahi.html', - {'title': _('Service Discovery'), + {'title': avahi.title, + 'description': avahi.description, 'status': status, 'form': form}) From 9d1a940d7c843473cf56b16710797a5db9c5a90c Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 14:20:19 +0530 Subject: [PATCH 083/189] config: Use new setup mechanism --- plinth/modules/config/__init__.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plinth/modules/config/__init__.py b/plinth/modules/config/__init__.py index f4f34c4e3..c1bf7de04 100644 --- a/plinth/modules/config/__init__.py +++ b/plinth/modules/config/__init__.py @@ -24,4 +24,8 @@ __all__ = ['config', 'init'] +version = 1 + +is_essential = True + depends = ['system', 'firewall', 'names'] From 0e0b8318d0e362bd7bad04941e1ab0a1adb9bc72 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 14:26:57 +0530 Subject: [PATCH 084/189] datetime: Use new setup mechanism --- plinth/modules/datetime/__init__.py | 23 +++++++++++++++---- .../modules/datetime/templates/datetime.html | 13 ++--------- plinth/modules/datetime/views.py | 10 ++------ 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/plinth/modules/datetime/__init__.py b/plinth/modules/datetime/__init__.py index 1ca8f6244..0c200169a 100644 --- a/plinth/modules/datetime/__init__.py +++ b/plinth/modules/datetime/__init__.py @@ -27,21 +27,36 @@ from plinth import service as service_module +version = 1 + +is_essential = True + depends = ['system'] +title = _('Date & Time') + +description = [ + _('Network time server is a program that maintians the system time ' + 'in synchronization with servers on the Internet.') +] + service = None def init(): """Intialize the date/time module.""" menu = cfg.main_menu.get('system:index') - menu.add_urlname(_('Date & Time'), 'glyphicon-time', - 'datetime:index', 900) + menu.add_urlname(title, 'glyphicon-time', 'datetime:index', 900) global service service = service_module.Service( - 'ntp', _('Network Time Server'), - is_external=False, enabled=is_enabled()) + 'ntp', title, is_external=False, enabled=is_enabled()) + + +def setup(helper, old_version=None): + """Install and configure the module.""" + helper.install(['ntp']) + helper.call('post', service.notify_enabled, None, True) def is_enabled(): diff --git a/plinth/modules/datetime/templates/datetime.html b/plinth/modules/datetime/templates/datetime.html index bce9499f2..d0a7aa407 100644 --- a/plinth/modules/datetime/templates/datetime.html +++ b/plinth/modules/datetime/templates/datetime.html @@ -1,4 +1,4 @@ -{% extends "base.html" %} +{% extends "app.html" %} {% comment %} # # This file is part of Plinth. @@ -21,16 +21,7 @@ {% load bootstrap %} {% load i18n %} -{% block content %} - -

{% trans "Date & Time" %}

- -

- {% blocktrans trimmed %} - Network time server is a program that maintians the system time - in synchronization with servers on the Internet. - {% endblocktrans %} -

+{% block configuration %}

{% trans "Status" %}

diff --git a/plinth/modules/datetime/views.py b/plinth/modules/datetime/views.py index 51ea7e57c..f687e1506 100644 --- a/plinth/modules/datetime/views.py +++ b/plinth/modules/datetime/views.py @@ -26,18 +26,11 @@ from .forms import DateTimeForm from plinth import actions -from plinth import package from plinth.modules import datetime logger = logging.getLogger(__name__) -def on_install(): - """Notify that the service is now enabled.""" - datetime.service.notify_enabled(None, True) - - -@package.required(['ntp'], on_install=on_install) def index(request): """Serve configuration page.""" status = get_status() @@ -55,7 +48,8 @@ def index(request): form = DateTimeForm(initial=status, prefix='datetime') return TemplateResponse(request, 'datetime.html', - {'title': _('Date & Time'), + {'title': datetime.title, + 'description': datetime.description, 'status': status, 'form': form}) From 68881f720c7967385f7539f9a5c202592018224a Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 14:34:13 +0530 Subject: [PATCH 085/189] deluge: Use new setup mechanism --- plinth/modules/deluge/__init__.py | 28 ++++++++++++++++++--- plinth/modules/deluge/templates/deluge.html | 17 ++----------- plinth/modules/deluge/views.py | 11 ++------ 3 files changed, 28 insertions(+), 28 deletions(-) diff --git a/plinth/modules/deluge/__init__.py b/plinth/modules/deluge/__init__.py index 40fc0fd40..f5c1b6f37 100644 --- a/plinth/modules/deluge/__init__.py +++ b/plinth/modules/deluge/__init__.py @@ -21,26 +21,46 @@ from django.utils.translation import ugettext_lazy as _ +from plinth import actions from plinth import action_utils from plinth import cfg from plinth import service as service_module +version = 1 + depends = ['apps'] +title = _('BitTorrent Web Client (Deluge)') + +description = [ + _('Deluge is a BitTorrent client that features a Web UI.'), + + _('When enabled, the Deluge web client will be available from ' + '/deluge path on the web server. The ' + 'default password is \'deluge\', but you should log in and change ' + 'it immediately after enabling this service.') +] + service = None def init(): """Initialize the Deluge module.""" menu = cfg.main_menu.get('apps:index') - menu.add_urlname(_('BitTorrent (Deluge)'), 'glyphicon-magnet', - 'deluge:index', 200) + menu.add_urlname(title, 'glyphicon-magnet', 'deluge:index', 200) global service service = service_module.Service( - 'deluge', _('Deluge BitTorrent'), ['http', 'https'], - is_external=True, enabled=is_enabled()) + 'deluge', title, ['http', 'https'], is_external=True, + enabled=is_enabled()) + + +def setup(helper, old_version=None): + """Install and configure the module.""" + helper.install(['deluged', 'deluge-web']) + helper.call('post', actions.superuser_run, 'deluge', ['enable']) + helper.call('post', service.notify_enabled, None, True) def is_enabled(): diff --git a/plinth/modules/deluge/templates/deluge.html b/plinth/modules/deluge/templates/deluge.html index 51b54c8ef..019c91b64 100644 --- a/plinth/modules/deluge/templates/deluge.html +++ b/plinth/modules/deluge/templates/deluge.html @@ -1,4 +1,4 @@ -{% extends "base.html" %} +{% extends "app.html" %} {% comment %} # # This file is part of Plinth. @@ -21,20 +21,7 @@ {% load bootstrap %} {% load i18n %} -{% block content %} - -

{% trans "BitTorrent Web Client (Deluge)" %}

- -

{% trans "Deluge is a BitTorrent client that features a Web UI." %}

- -

- {% blocktrans trimmed %} - When enabled, the Deluge web client will be available from - /deluge path on the web server. The - default password is 'deluge', but you should log in and change - it immediately after enabling this service. - {% endblocktrans %} -

+{% block configuration %}

{% trans "Status" %}

diff --git a/plinth/modules/deluge/views.py b/plinth/modules/deluge/views.py index 475cffb30..0b48b2333 100644 --- a/plinth/modules/deluge/views.py +++ b/plinth/modules/deluge/views.py @@ -25,17 +25,9 @@ from .forms import DelugeForm from plinth import actions -from plinth import package from plinth.modules import deluge -def on_install(): - """Tasks to run after package install.""" - actions.superuser_run('deluge', ['enable']) - deluge.service.notify_enabled(None, True) - - -@package.required(['deluged', 'deluge-web'], on_install=on_install) def index(request): """Serve configuration page.""" status = get_status() @@ -53,7 +45,8 @@ def index(request): form = DelugeForm(initial=status, prefix='deluge') return TemplateResponse(request, 'deluge.html', - {'title': _('BitTorrent (Deluge)'), + {'title': deluge.title, + 'description': deluge.description, 'status': status, 'form': form}) From 28a889c54b30d530a83206ac48c00b1abc4c7697 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 14:42:02 +0530 Subject: [PATCH 086/189] diagnostics: Use new setup mechanism --- plinth/modules/diagnostics/__init__.py | 23 ++++++++++++++++--- plinth/modules/diagnostics/diagnostics.py | 13 +++-------- .../diagnostics/templates/diagnostics.html | 14 ++--------- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/plinth/modules/diagnostics/__init__.py b/plinth/modules/diagnostics/__init__.py index 294d3f884..f532db3ee 100644 --- a/plinth/modules/diagnostics/__init__.py +++ b/plinth/modules/diagnostics/__init__.py @@ -19,15 +19,32 @@ Plinth module for system diagnostics """ -from . import diagnostics -from .diagnostics import init +from django.utils.translation import ugettext_lazy as _ + from plinth import action_utils +from plinth import cfg + +version = 1 + +is_essential = True -__all__ = ['diagnostics', 'init'] +title = _('Diagnostics') + +description = [ + _('The system diagnostic test will run a number of checks on your ' + 'system to confirm that applications and services are working as ' + 'expected.') +] depends = ['system'] +def init(): + """Initialize the module""" + menu = cfg.main_menu.get('system:index') + menu.add_urlname(title, 'glyphicon-screenshot', 'diagnostics:index', 30) + + def diagnose(): """Run diagnostics and return the results.""" results = [] diff --git a/plinth/modules/diagnostics/diagnostics.py b/plinth/modules/diagnostics/diagnostics.py index 4ce058e09..a44539afe 100644 --- a/plinth/modules/diagnostics/diagnostics.py +++ b/plinth/modules/diagnostics/diagnostics.py @@ -24,12 +24,11 @@ from django.template.response import TemplateResponse from django.views.decorators.http import require_POST from django.utils.translation import ugettext_lazy as _ -import importlib import logging import threading -from plinth import cfg from plinth import module_loader +from plinth.modules import diagnostics logger = logging.Logger(__name__) @@ -39,20 +38,14 @@ _running_task = None -def init(): - """Initialize the module""" - menu = cfg.main_menu.get('system:index') - menu.add_urlname(_('Diagnostics'), 'glyphicon-screenshot', - 'diagnostics:index', 30) - - def index(request): """Serve the index page""" if request.method == 'POST' and not _running_task: _start_task() return TemplateResponse(request, 'diagnostics.html', - {'title': _('System Diagnostics'), + {'title': diagnostics.title, + 'description': diagnostics.description, 'is_running': _running_task is not None, 'results': current_results}) diff --git a/plinth/modules/diagnostics/templates/diagnostics.html b/plinth/modules/diagnostics/templates/diagnostics.html index 2b369732e..066222347 100644 --- a/plinth/modules/diagnostics/templates/diagnostics.html +++ b/plinth/modules/diagnostics/templates/diagnostics.html @@ -1,4 +1,4 @@ -{% extends 'base.html' %} +{% extends 'app.html' %} {% comment %} # # This file is part of Plinth. @@ -29,17 +29,7 @@ {% endblock %} -{% block content %} - -

{{ title }}

- -

- {% 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 %} -

+{% block configuration %} {% if not is_running %}
Date: Fri, 12 Feb 2016 14:54:57 +0530 Subject: [PATCH 087/189] dynamicdns: Use new setup mechanism --- plinth/modules/dynamicdns/__init__.py | 39 +++++++++++++++++-- plinth/modules/dynamicdns/dynamicdns.py | 16 ++------ .../dynamicdns/templates/dynamicdns.html | 29 +------------- 3 files changed, 41 insertions(+), 43 deletions(-) diff --git a/plinth/modules/dynamicdns/__init__.py b/plinth/modules/dynamicdns/__init__.py index 7b4bc398d..c47942f6e 100644 --- a/plinth/modules/dynamicdns/__init__.py +++ b/plinth/modules/dynamicdns/__init__.py @@ -19,9 +19,42 @@ Plinth module to configure ez-ipupdate client """ -from . import dynamicdns -from .dynamicdns import init +from django.utils.translation import ugettext_lazy as _ -__all__ = ['dynamicdns', 'init'] +from plinth import cfg +from plinth.utils import format_lazy + +version = 1 depends = ['apps'] + +title = _('Dynamic DNS Client') + +description = [ + format_lazy( + _('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 {box_name}, such as ownCloud.'), + box_name=_(cfg.box_name)), + + _('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 ' + ' ' + 'gnudip 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.') +] + + +def init(): + """Initialize the module.""" + menu = cfg.main_menu.get('apps:index') + menu.add_urlname(title, 'glyphicon-refresh', 'dynamicdns:index', 500) + + +def setup(helper, old_version=None): + """Install and configure the module.""" + helper.install(['ez-ipupdate']) diff --git a/plinth/modules/dynamicdns/dynamicdns.py b/plinth/modules/dynamicdns/dynamicdns.py index 490ec98c6..b15e49b59 100644 --- a/plinth/modules/dynamicdns/dynamicdns.py +++ b/plinth/modules/dynamicdns/dynamicdns.py @@ -25,7 +25,7 @@ from plinth import actions from plinth import cfg -from plinth import package +from plinth.modules import dynamicdns from plinth.utils import format_lazy logger = logging.getLogger(__name__) @@ -39,19 +39,11 @@ 'text': ugettext_lazy('Status')}] -def init(): - """Initialize the dynamicdns module""" - menu = cfg.main_menu.get('apps:index') - menu.add_urlname(ugettext_lazy('Dynamic DNS'), 'glyphicon-refresh', - 'dynamicdns:index', 500) - - -@package.required(['ez-ipupdate']) def index(request): """Serve Dynamic DNS page.""" - return TemplateResponse(request, 'dynamicdns.html', - {'title': _('Dynamic DNS'), + {'title': dynamicdns.title, + 'description': dynamicdns.description, 'subsubmenu': subsubmenu}) @@ -198,7 +190,6 @@ def clean(self): raise forms.ValidationError(_('Please provide a password')) -@package.required(['ez-ipupdate']) def configure(request): """Serve the configuration form.""" status = get_status() @@ -219,7 +210,6 @@ def configure(request): 'subsubmenu': subsubmenu}) -@package.required(['ez-ipupdate']) def statuspage(request): """Serve the status page.""" check_nat = actions.run('dynamicdns', ['get-nat']) diff --git a/plinth/modules/dynamicdns/templates/dynamicdns.html b/plinth/modules/dynamicdns/templates/dynamicdns.html index 5ad1ec90b..1b3d1bfa7 100644 --- a/plinth/modules/dynamicdns/templates/dynamicdns.html +++ b/plinth/modules/dynamicdns/templates/dynamicdns.html @@ -1,4 +1,4 @@ -{% extends "base.html" %} +{% extends "app.html" %} {% comment %} # # This file is part of Plinth. @@ -20,32 +20,7 @@ {% load i18n %} -{% block content %} - -

{% trans "Dynamic DNS Client" %}

- -

- {% 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 {{ box_name }}, such as ownCloud. - {% endblocktrans %} -

- -

- {% 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 - gnudip - 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 %} -

- +{% block configuration %}

{% blocktrans trimmed %} If you are looking for a free dynamic DNS account, you may find From 38bf4d4549d4fb1b24bb5816e63d0282dc93ab6b Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 15:09:44 +0530 Subject: [PATCH 088/189] firewall: Use new setup mechanism - Also reorganize module to separate out views. --- plinth/modules/config/config.py | 2 +- plinth/modules/firewall/__init__.py | 116 ++++++++++++++- plinth/modules/firewall/firewall.py | 137 ------------------ .../modules/firewall/templates/firewall.html | 15 +- plinth/modules/firewall/urls.py | 2 +- plinth/modules/firewall/views.py | 45 ++++++ 6 files changed, 162 insertions(+), 155 deletions(-) delete mode 100644 plinth/modules/firewall/firewall.py create mode 100644 plinth/modules/firewall/views.py diff --git a/plinth/modules/config/config.py b/plinth/modules/config/config.py index f730f83d1..54c687c2b 100644 --- a/plinth/modules/config/config.py +++ b/plinth/modules/config/config.py @@ -33,7 +33,7 @@ from plinth import actions from plinth import cfg -from plinth.modules.firewall import firewall +from plinth.modules import firewall from plinth.modules.names import SERVICES from plinth.signals import pre_hostname_change, post_hostname_change from plinth.signals import domainname_change diff --git a/plinth/modules/firewall/__init__.py b/plinth/modules/firewall/__init__.py index 3abc58c06..96cb449a1 100644 --- a/plinth/modules/firewall/__init__.py +++ b/plinth/modules/firewall/__init__.py @@ -19,9 +19,119 @@ Plinth module to configure a firewall """ -from . import firewall -from .firewall import init +from django.utils.translation import ugettext_lazy as _ +import logging -__all__ = ['firewall', 'init'] +from plinth import actions +from plinth import cfg +from plinth.signals import service_enabled +import plinth.service as service_module +from plinth.utils import format_lazy + +version = 1 + +is_essential = True depends = ['system'] + +title = _('Firewall') + +description = [ + format_lazy( + _('Firewall is a security system that controls the incoming and ' + 'outgoing network traffic on your {box_name}. Keeping a ' + 'firewall enabled and properly configured reduces risk of ' + 'security threat from the Internet.'), box_name=cfg.box_name) +] + +LOGGER = logging.getLogger(__name__) + + +def init(): + """Initailze firewall module""" + menu = cfg.main_menu.get('system:index') + menu.add_urlname(title, 'glyphicon-fire', 'firewall:index', 50) + + service_enabled.connect(on_service_enabled) + + +def setup(helper, old_version=None): + """Install and configure the module.""" + helper.install(['firewalld']) + + +def get_enabled_status(): + """Return whether firewall is enabled""" + output = _run(['get-status'], superuser=True) + return output.split()[0] == 'running' + + +def get_enabled_services(zone): + """Return the status of various services currently enabled""" + output = _run(['get-enabled-services', '--zone', zone], superuser=True) + return output.split() + + +def add_service(port, zone): + """Enable a service in firewall""" + _run(['add-service', port, '--zone', zone], superuser=True) + + +def remove_service(port, zone): + """Remove a service in firewall""" + _run(['remove-service', port, '--zone', zone], superuser=True) + + +def on_service_enabled(sender, service_id, enabled, **kwargs): + """ + Enable/disable firewall ports when a service is + enabled/disabled. + """ + del sender # Unused + del kwargs # Unused + + internal_enabled_services = get_enabled_services(zone='internal') + external_enabled_services = get_enabled_services(zone='external') + + LOGGER.info('Service enabled - %s, %s', service_id, enabled) + service = service_module.services[service_id] + for port in service.ports: + if enabled: + if port not in internal_enabled_services: + add_service(port, zone='internal') + + if (service.is_external and + port not in external_enabled_services): + add_service(port, zone='external') + else: + # service already configured. + pass + else: + if port in internal_enabled_services: + enabled_services_on_port = [ + service_.is_enabled() + for service_ in service_module.services.values() + if port in service_.ports and + service_id != service_.service_id] + if not any(enabled_services_on_port): + remove_service(port, zone='internal') + + if port in external_enabled_services: + enabled_services_on_port = [ + service_.is_enabled() + for service_ in service_module.services.values() + if port in service_.ports and + service_id != service_.service_id and + service_.is_external] + if not any(enabled_services_on_port): + remove_service(port, zone='external') + + +def _run(arguments, superuser=False): + """Run an given command and raise exception if there was an error""" + command = 'firewall' + + if superuser: + return actions.superuser_run(command, arguments) + else: + return actions.run(command, arguments) diff --git a/plinth/modules/firewall/firewall.py b/plinth/modules/firewall/firewall.py deleted file mode 100644 index dc693af90..000000000 --- a/plinth/modules/firewall/firewall.py +++ /dev/null @@ -1,137 +0,0 @@ -# -# This file is part of Plinth. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# - -""" -Plinth module to configure a firewall -""" - -from django.template.response import TemplateResponse -from django.utils.translation import ugettext_lazy as _ -import logging - -from plinth import actions -from plinth import cfg -from plinth import package -from plinth.signals import service_enabled -import plinth.service as service_module - - -LOGGER = logging.getLogger(__name__) - - -def init(): - """Initailze firewall module""" - menu = cfg.main_menu.get('system:index') - menu.add_urlname(_('Firewall'), 'glyphicon-fire', 'firewall:index', 50) - - service_enabled.connect(on_service_enabled) - - -@package.required(['firewalld']) -def index(request): - """Serve introcution page""" - if not get_enabled_status(): - return TemplateResponse(request, 'firewall.html', - {'title': _('Firewall'), - 'firewall_status': 'not_running'}) - - internal_enabled_services = get_enabled_services(zone='internal') - external_enabled_services = get_enabled_services(zone='external') - - return TemplateResponse( - request, 'firewall.html', - {'title': _('Firewall'), - 'services': list(service_module.services.values()), - 'internal_enabled_services': internal_enabled_services, - 'external_enabled_services': external_enabled_services}) - - -def get_enabled_status(): - """Return whether firewall is enabled""" - output = _run(['get-status'], superuser=True) - return output.split()[0] == 'running' - - -def get_enabled_services(zone): - """Return the status of various services currently enabled""" - output = _run(['get-enabled-services', '--zone', zone], superuser=True) - return output.split() - - -def add_service(port, zone): - """Enable a service in firewall""" - _run(['add-service', port, '--zone', zone], superuser=True) - - -def remove_service(port, zone): - """Remove a service in firewall""" - _run(['remove-service', port, '--zone', zone], superuser=True) - - -def on_service_enabled(sender, service_id, enabled, **kwargs): - """ - Enable/disable firewall ports when a service is - enabled/disabled. - """ - del sender # Unused - del kwargs # Unused - - internal_enabled_services = get_enabled_services(zone='internal') - external_enabled_services = get_enabled_services(zone='external') - - LOGGER.info('Service enabled - %s, %s', service_id, enabled) - service = service_module.services[service_id] - for port in service.ports: - if enabled: - if port not in internal_enabled_services: - add_service(port, zone='internal') - - if (service.is_external and - port not in external_enabled_services): - add_service(port, zone='external') - else: - # service already configured. - pass - else: - if port in internal_enabled_services: - enabled_services_on_port = [ - service_.is_enabled() - for service_ in service_module.services.values() - if port in service_.ports and - service_id != service_.service_id] - if not any(enabled_services_on_port): - remove_service(port, zone='internal') - - if port in external_enabled_services: - enabled_services_on_port = [ - service_.is_enabled() - for service_ in service_module.services.values() - if port in service_.ports and - service_id != service_.service_id and - service_.is_external] - if not any(enabled_services_on_port): - remove_service(port, zone='external') - - -def _run(arguments, superuser=False): - """Run an given command and raise exception if there was an error""" - command = 'firewall' - - if superuser: - return actions.superuser_run(command, arguments) - else: - return actions.run(command, arguments) diff --git a/plinth/modules/firewall/templates/firewall.html b/plinth/modules/firewall/templates/firewall.html index e59d4052d..ec2440702 100644 --- a/plinth/modules/firewall/templates/firewall.html +++ b/plinth/modules/firewall/templates/firewall.html @@ -1,4 +1,4 @@ -{% extends "base.html" %} +{% extends "app.html" %} {% comment %} # # This file is part of Plinth. @@ -20,18 +20,7 @@ {% load i18n %} -{% block content %} - -

{{ title }}

- -

- {% blocktrans trimmed %} - Firewall is a security system that controls the incoming and - outgoing network traffic on your {{ box_name }}. Keeping a - firewall enabled and properly configured reduces risk of - security threat from the Internet. - {% endblocktrans %} -

+{% block configuration %}

{% trans "Current status:" %}

diff --git a/plinth/modules/firewall/urls.py b/plinth/modules/firewall/urls.py index 6448e89f6..8c6765af9 100644 --- a/plinth/modules/firewall/urls.py +++ b/plinth/modules/firewall/urls.py @@ -21,7 +21,7 @@ from django.conf.urls import url -from . import firewall as views +from . import views urlpatterns = [ diff --git a/plinth/modules/firewall/views.py b/plinth/modules/firewall/views.py new file mode 100644 index 000000000..3dab988ab --- /dev/null +++ b/plinth/modules/firewall/views.py @@ -0,0 +1,45 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Plinth module to configure a firewall +""" + +from django.template.response import TemplateResponse + +from plinth.modules import firewall +import plinth.service as service_module + + +def index(request): + """Serve introcution page""" + if not firewall.get_enabled_status(): + return TemplateResponse(request, 'firewall.html', + {'title': firewall.title, + 'description': firewall.description, + 'firewall_status': 'not_running'}) + + internal_enabled_services = firewall.get_enabled_services(zone='internal') + external_enabled_services = firewall.get_enabled_services(zone='external') + + return TemplateResponse( + request, 'firewall.html', + {'title': firewall.title, + 'description': firewall.description, + 'services': list(service_module.services.values()), + 'internal_enabled_services': internal_enabled_services, + 'external_enabled_services': external_enabled_services}) From cceddf5c0ae374fa74a3280041adfb6269572259 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 15:29:47 +0530 Subject: [PATCH 089/189] ikiwiki: Use new setup mechanism --- plinth/modules/ikiwiki/__init__.py | 30 ++++++++++++++++--- plinth/modules/ikiwiki/templates/ikiwiki.html | 11 ++----- plinth/modules/ikiwiki/views.py | 19 ++---------- 3 files changed, 30 insertions(+), 30 deletions(-) diff --git a/plinth/modules/ikiwiki/__init__.py b/plinth/modules/ikiwiki/__init__.py index 8830af010..05f105743 100644 --- a/plinth/modules/ikiwiki/__init__.py +++ b/plinth/modules/ikiwiki/__init__.py @@ -21,26 +21,48 @@ from django.utils.translation import ugettext_lazy as _ +from plinth import actions from plinth import action_utils from plinth import cfg from plinth import service as service_module +version = 1 + depends = ['apps'] +title = _('Wiki and Blog (ikiwiki)') + +description = [ + _('When enabled, the blogs and wikis will be available ' + 'from /ikiwiki.') +] + service = None def init(): """Initialize the ikiwiki module.""" menu = cfg.main_menu.get('apps:index') - menu.add_urlname(_('Wiki and Blog (ikiwiki)'), 'glyphicon-edit', - 'ikiwiki:index', 1100) + menu.add_urlname(title, 'glyphicon-edit', 'ikiwiki:index', 1100) global service service = service_module.Service( - 'ikiwiki', _('ikiwiki wikis and blogs'), ['http', 'https'], - is_external=True, enabled=is_enabled()) + 'ikiwiki', title, ['http', 'https'], is_external=True, + enabled=is_enabled()) + + +def setup(helper, old_version=None): + """Install and configure the module.""" + helper.install(['ikiwiki', + 'gcc', + 'libc6-dev', + 'libtimedate-perl', + 'libcgi-formbuilder-perl', + 'libcgi-session-perl', + 'libxml-writer-perl']) + helper.call('post', actions.superuser_run, 'ikiwiki', ['setup']) + helper.call('post', service.notify_enabled, None, True) def is_enabled(): diff --git a/plinth/modules/ikiwiki/templates/ikiwiki.html b/plinth/modules/ikiwiki/templates/ikiwiki.html index 4cea868ad..e08738cf7 100644 --- a/plinth/modules/ikiwiki/templates/ikiwiki.html +++ b/plinth/modules/ikiwiki/templates/ikiwiki.html @@ -1,4 +1,4 @@ -{% extends "base.html" %} +{% extends "app.html" %} {% comment %} # # This file is part of Plinth. @@ -21,14 +21,7 @@ {% load bootstrap %} {% load i18n %} -{% block content %} - -

- {% blocktrans trimmed %} - When enabled, the blogs and wikis will be available - from /ikiwiki. - {% endblocktrans %} -

+{% block configuration %} {% include "diagnostics_button.html" with module="ikiwiki" %} diff --git a/plinth/modules/ikiwiki/views.py b/plinth/modules/ikiwiki/views.py index 37bfaf5c3..27c1a855a 100644 --- a/plinth/modules/ikiwiki/views.py +++ b/plinth/modules/ikiwiki/views.py @@ -27,8 +27,6 @@ from .forms import IkiwikiForm, IkiwikiCreateForm from plinth import actions -from plinth import action_utils -from plinth import package from plinth.modules import ikiwiki @@ -40,20 +38,6 @@ 'text': ugettext_lazy('Create')}] -def on_install(): - """Enable ikiwiki on install.""" - actions.superuser_run('ikiwiki', ['setup']) - ikiwiki.service.notify_enabled(None, True) - - -@package.required(['ikiwiki', - 'gcc', - 'libc6-dev', - 'libtimedate-perl', - 'libcgi-formbuilder-perl', - 'libcgi-session-perl', - 'libxml-writer-perl'], - on_install=on_install) def index(request): """Serve configuration page.""" status = get_status() @@ -70,7 +54,8 @@ def index(request): form = IkiwikiForm(initial=status, prefix='ikiwiki') return TemplateResponse(request, 'ikiwiki.html', - {'title': _('Wiki and Blog'), + {'title': ikiwiki.title, + 'description': ikiwiki.description, 'status': status, 'form': form, 'subsubmenu': subsubmenu}) From cef8f5c2c4a6ba27468ab2ebe1ebcbe9eeefaea0 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 15:37:02 +0530 Subject: [PATCH 090/189] letsencrypt: Use new setup mechanism --- plinth/modules/letsencrypt/__init__.py | 29 +++++++++++++++++++ .../letsencrypt/templates/letsencrypt.html | 27 ++--------------- plinth/modules/letsencrypt/views.py | 6 ++-- 3 files changed, 34 insertions(+), 28 deletions(-) diff --git a/plinth/modules/letsencrypt/__init__.py b/plinth/modules/letsencrypt/__init__.py index 1375ed176..bfd630c16 100644 --- a/plinth/modules/letsencrypt/__init__.py +++ b/plinth/modules/letsencrypt/__init__.py @@ -24,10 +24,34 @@ from plinth import action_utils from plinth import cfg from plinth.modules import names +from plinth.utils import format_lazy +version = 1 + +is_essential = True + depends = ['apps', 'names'] +title = _('Certificates (Let\'s Encrypt)') + +description = [ + format_lazy( + _('A digital certficate allows users of a web service to verify the ' + 'identity of the service and to securely communicate with it. ' + '{box_name} can automatically obtain and setup digital ' + 'certificates for each available domain. It does so by proving ' + 'itself to be the owner of a domain to Let\'s Encrypt, a ' + 'certficate authority (CA).'), box_name=_(cfg.box_name)), + + _('Let\'s Encrypt is a free, automated, and open certificate ' + 'authority, run for the public’s benefit by the Internet Security ' + 'Research Group (ISRG). Please read and agree with the ' + 'Let\'s Encrypt ' + 'Subscriber Agreement before using this service.') +] + + service = None @@ -38,6 +62,11 @@ def init(): 'glyphicon-lock', 'letsencrypt:index', 20) +def setup(helper, old_version=None): + """Install and configure the module.""" + helper.install(['letsencrypt']) + + def diagnose(): """Run diagnostics and return the results.""" results = [] diff --git a/plinth/modules/letsencrypt/templates/letsencrypt.html b/plinth/modules/letsencrypt/templates/letsencrypt.html index 15043bdf2..1e3e29b2a 100644 --- a/plinth/modules/letsencrypt/templates/letsencrypt.html +++ b/plinth/modules/letsencrypt/templates/letsencrypt.html @@ -1,4 +1,4 @@ -{% extends "base.html" %} +{% extends "app.html" %} {% comment %} # # This file is part of Plinth. @@ -33,30 +33,7 @@ {% endblock %} -{% block content %} - -

{% trans "Certificates (Let's Encrypt)" %}

- -

- {% blocktrans trimmed %} - A digital certficate allows users of a web service to verify the - identity of the service and to securely communicate with it. - {{ box_name }} can automatically obtain and setup digital - certificates for each available domain. It does so by proving - itself to be the owner of a domain to Let's Encrypt, a - certficate authority (CA). - {% endblocktrans %} -

- -

- {% blocktrans trimmed %} - Let's Encrypt is a free, automated, and open certificate - authority, run for the public’s benefit by the Internet Security - Research Group (ISRG). Please read and agree with the - Let's Encrypt - Subscriber Agreement before using this service. - {% endblocktrans %} -

+{% block configuration %}
diff --git a/plinth/modules/letsencrypt/views.py b/plinth/modules/letsencrypt/views.py index eb8660759..ecbdd5ffd 100644 --- a/plinth/modules/letsencrypt/views.py +++ b/plinth/modules/letsencrypt/views.py @@ -29,20 +29,20 @@ import logging from plinth import actions -from plinth import package from plinth.errors import ActionError +from plinth.modules import letsencrypt from plinth.modules import names logger = logging.getLogger(__name__) -@package.required(['letsencrypt']) def index(request): """Serve configuration page.""" status = get_status() return TemplateResponse(request, 'letsencrypt.html', - {'title': _('Certificates (Let\'s Encrypt)'), + {'title': letsencrypt.title, + 'description': letsencrypt.description, 'status': status}) From 608d19dc2b57c1591b11007d0b2b3bd0c411b4be Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 15:53:42 +0530 Subject: [PATCH 091/189] monkeysphere: Use new setup mechanism --- plinth/modules/monkeysphere/__init__.py | 20 +++++++++++++++++++ .../monkeysphere/templates/monkeysphere.html | 19 ++---------------- plinth/modules/monkeysphere/views.py | 6 +++--- 3 files changed, 25 insertions(+), 20 deletions(-) diff --git a/plinth/modules/monkeysphere/__init__.py b/plinth/modules/monkeysphere/__init__.py index b7a8329f3..09be4a195 100644 --- a/plinth/modules/monkeysphere/__init__.py +++ b/plinth/modules/monkeysphere/__init__.py @@ -23,11 +23,31 @@ from plinth import cfg +version = 1 + depends = ['system'] +title = _('Monkeysphere') + +description = [ + _('With Monkeysphere, a PGP key can be generated for each configured ' + 'domain serving SSH. The PGP public key can then be uploaded to the PGP ' + 'keyservers. Users connecting to this machine through SSH can verify ' + 'that they are connecting to the correct host. For users to trust the ' + 'key, at least one person (usually the machine owner) must sign the key ' + 'using the regular PGP key signing process. See the ' + ' ' + 'Monkeysphere SSH documentation for more details.') +] + def init(): """Initialize the monkeysphere module.""" menu = cfg.main_menu.get('system:index') menu.add_urlname(_('Monkeysphere'), 'glyphicon-certificate', 'monkeysphere:index', 970) + + +def setup(helper, old_version=None): + """Install and configure the module.""" + helper.install(['monkeysphere']) diff --git a/plinth/modules/monkeysphere/templates/monkeysphere.html b/plinth/modules/monkeysphere/templates/monkeysphere.html index 2e67c5204..ebe048590 100644 --- a/plinth/modules/monkeysphere/templates/monkeysphere.html +++ b/plinth/modules/monkeysphere/templates/monkeysphere.html @@ -1,4 +1,4 @@ -{% extends "base.html" %} +{% extends "app.html" %} {% comment %} # # This file is part of Plinth. @@ -30,22 +30,7 @@ {% endblock %} -{% block content %} - -

{% trans "Monkeysphere" %}

- -

- {% blocktrans trimmed %} - With Monkeysphere, a PGP key can be generated for each configured domain - serving SSH. The PGP public key can then be uploaded to the PGP - keyservers. Users connecting to this machine through SSH can verify that - they are connecting to the correct host. For users to trust the key, at - least one person (usually the machine owner) must sign the key using the - regular PGP key signing process. See the - - Monkeysphere SSH documentation for more details. - {% endblocktrans %} -

+{% block configuration %} {% if running %}

diff --git a/plinth/modules/monkeysphere/views.py b/plinth/modules/monkeysphere/views.py index 777c64b25..2ce31d22d 100644 --- a/plinth/modules/monkeysphere/views.py +++ b/plinth/modules/monkeysphere/views.py @@ -28,20 +28,20 @@ import json from plinth import actions -from plinth import package +from plinth.modules import monkeysphere from plinth.modules import names publish_process = None -@package.required(['monkeysphere']) def index(request): """Serve configuration page.""" _collect_publish_result(request) status = get_status() return TemplateResponse( request, 'monkeysphere.html', - {'title': _('Monkeysphere'), + {'title': monkeysphere.title, + 'description': monkeysphere.description, 'status': status, 'running': bool(publish_process)}) From 1f8ccb6c933bb46f5e20dfaf410bda54147b027c Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 15:54:03 +0530 Subject: [PATCH 092/189] monkeysphere: Fix error with no host keys --- actions/monkeysphere | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/actions/monkeysphere b/actions/monkeysphere index 6a8b0fc75..31ad6f937 100755 --- a/actions/monkeysphere +++ b/actions/monkeysphere @@ -53,9 +53,11 @@ def subcommand_host_show_keys(arguments): """Show host key fingerprints.""" try: output = subprocess.check_output( - ['monkeysphere-host', 'show-keys'] + arguments.key_ids) + ['monkeysphere-host', 'show-keys'] + arguments.key_ids, + stderr=subprocess.DEVNULL) except subprocess.CalledProcessError: # no keys available + print(json.dumps({'keys': []})) return # parse output From 41e730d7acae2c06c0b0150ef4019e3b6846110a Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 16:01:40 +0530 Subject: [PATCH 093/189] mumble: Use new setup mechanism --- plinth/modules/mumble/__init__.py | 25 +++++++++++++++++---- plinth/modules/mumble/templates/mumble.html | 22 ++---------------- plinth/modules/mumble/views.py | 10 ++------- 3 files changed, 25 insertions(+), 32 deletions(-) diff --git a/plinth/modules/mumble/__init__.py b/plinth/modules/mumble/__init__.py index 846681b29..b7f772494 100644 --- a/plinth/modules/mumble/__init__.py +++ b/plinth/modules/mumble/__init__.py @@ -26,21 +26,38 @@ from plinth import service as service_module +version = 1 + depends = ['apps'] +title = _('Voice Chat (Mumble)') + +description = [ + _('Mumble is an open source, low-latency, encrypted, high quality ' + 'voice chat software.'), + + _('You can connect to your Mumble server on the regular Mumble port ' + '64738. Clients to connect to Mumble ' + 'from your desktop and Android devices are available.') +] + service = None def init(): """Intialize the Mumble module.""" menu = cfg.main_menu.get('apps:index') - menu.add_urlname(_('Voice Chat (Mumble)'), 'glyphicon-headphones', - 'mumble:index', 900) + menu.add_urlname(title, 'glyphicon-headphones', 'mumble:index', 900) global service service = service_module.Service( - 'mumble-plinth', _('Mumble Voice Chat Server'), - is_external=True, enabled=is_enabled()) + 'mumble-plinth', title, is_external=True, enabled=is_enabled()) + + +def setup(helper, old_version=None): + """Install and configure the module.""" + helper.install(['mumble-server']) + helper.call('post', service.notify_enabled, None, True) def is_enabled(): diff --git a/plinth/modules/mumble/templates/mumble.html b/plinth/modules/mumble/templates/mumble.html index 8f9d1d725..96745dfd8 100644 --- a/plinth/modules/mumble/templates/mumble.html +++ b/plinth/modules/mumble/templates/mumble.html @@ -1,4 +1,4 @@ -{% extends "base.html" %} +{% extends "app.html" %} {% comment %} # # This file is part of Plinth. @@ -21,25 +21,7 @@ {% load bootstrap %} {% load i18n %} -{% block content %} - -

{% trans "Voice Chat (Mumble)" %}

- -

- {% blocktrans trimmed %} - Mumble is an open source, low-latency, encrypted, high quality - voice chat software. - {% endblocktrans %} -

- -

- {% blocktrans trimmed %} - You can connect to your Mumble server on the regular Mumble port 64738. - Clients to connect to Mumble - from your desktop and Android devices are available. - {% endblocktrans %} -

- +{% block configuration %}

{% trans "Status" %}

diff --git a/plinth/modules/mumble/views.py b/plinth/modules/mumble/views.py index 3ecadd7cc..4d67f6458 100644 --- a/plinth/modules/mumble/views.py +++ b/plinth/modules/mumble/views.py @@ -26,18 +26,11 @@ from .forms import MumbleForm from plinth import actions -from plinth import package from plinth.modules import mumble logger = logging.getLogger(__name__) -def on_install(): - """Notify that the service is now enabled.""" - mumble.service.notify_enabled(None, True) - - -@package.required(['mumble-server'], on_install=on_install) def index(request): """Serve configuration page.""" status = get_status() @@ -55,7 +48,8 @@ def index(request): form = MumbleForm(initial=status, prefix='mumble') return TemplateResponse(request, 'mumble.html', - {'title': _('Voice Chat (Mumble)'), + {'title': mumble.title, + 'description': mumble.description, 'status': status, 'form': form}) From 0568bf259cf595cf19eddd7a942008d7b239241e Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 16:05:28 +0530 Subject: [PATCH 094/189] names: Use new setup mechanism --- plinth/modules/names/__init__.py | 10 ++++++++-- plinth/modules/names/templates/names.html | 6 ++---- plinth/modules/names/views.py | 3 ++- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/plinth/modules/names/__init__.py b/plinth/modules/names/__init__.py index 8f9fd8488..d2c5e9565 100644 --- a/plinth/modules/names/__init__.py +++ b/plinth/modules/names/__init__.py @@ -31,8 +31,14 @@ ('ssh', _('SSH'), 22), ) +version = 1 + +is_essential = True + depends = ['system'] +title = _('Name Services') + domain_types = {} domains = {} @@ -42,8 +48,7 @@ def init(): """Initialize the names module.""" menu = cfg.main_menu.get('system:index') - menu.add_urlname(_('Name Services'), 'glyphicon-tag', - 'names:index', 19) + menu.add_urlname(title, 'glyphicon-tag', 'names:index', 19) domain_added.connect(on_domain_added) domain_removed.connect(on_domain_removed) @@ -54,6 +59,7 @@ def on_domain_added(sender, domain_type, name='', description='', """Add domain to global list.""" if not domain_type: return + domain_types[domain_type] = description if not name: diff --git a/plinth/modules/names/templates/names.html b/plinth/modules/names/templates/names.html index fffc51897..bbdc0107b 100644 --- a/plinth/modules/names/templates/names.html +++ b/plinth/modules/names/templates/names.html @@ -1,4 +1,4 @@ -{% extends "base.html" %} +{% extends "app.html" %} {% comment %} # # This file is part of Plinth. @@ -21,9 +21,7 @@ {% load bootstrap %} {% load i18n %} -{% block content %} - -

{{ title }}

+{% block configuration %}
diff --git a/plinth/modules/names/views.py b/plinth/modules/names/views.py index c95ea0b00..d8daecd1f 100644 --- a/plinth/modules/names/views.py +++ b/plinth/modules/names/views.py @@ -24,6 +24,7 @@ from . import SERVICES, get_domain_types, get_description from . import get_domain, get_services_status +from plinth.modules import names def index(request): @@ -31,7 +32,7 @@ def index(request): status = get_status() return TemplateResponse(request, 'names.html', - {'title': _('Name Services'), + {'title': names.title, 'status': status}) From 335eeccee95b625988bebaead42e325acbe1ee08 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 16:10:06 +0530 Subject: [PATCH 095/189] networks: Use new setup mechanism --- plinth/modules/networks/__init__.py | 28 ++++++++++++++++++++++------ plinth/modules/networks/networks.py | 10 ---------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/plinth/modules/networks/__init__.py b/plinth/modules/networks/__init__.py index c3c93a17b..d72425a19 100644 --- a/plinth/modules/networks/__init__.py +++ b/plinth/modules/networks/__init__.py @@ -19,23 +19,37 @@ Plinth module to interface with network-manager """ -from django.utils.translation import ugettext as _ +from django.utils.translation import ugettext_lazy as _ from logging import Logger import subprocess -from . import networks -from .networks import init from plinth import action_utils +from plinth import cfg from plinth import network -__all__ = ['networks', 'init'] +version = 1 + +is_essential = True depends = ['system'] +title = _('Networks') + logger = Logger(__name__) +def init(): + """Initialize the Networks module.""" + menu = cfg.main_menu.get('system:index') + menu.add_urlname(title, 'glyphicon-signal', 'networks:index', 18) + + +def setup(helper, old_version=None): + """Install and configure the module.""" + helper.install(['network-manager']) + + def diagnose(): """Run diagnostics and return the results.""" results = [] @@ -44,8 +58,10 @@ def diagnose(): addresses = _get_interface_addresses(interfaces) for address in addresses: - results.append(action_utils.diagnose_port_listening(53, 'tcp', address)) - results.append(action_utils.diagnose_port_listening(53, 'udp', address)) + results.append( + action_utils.diagnose_port_listening(53, 'tcp', address)) + results.append( + action_utils.diagnose_port_listening(53, 'udp', address)) results.append(_diagnose_dnssec('4')) results.append(_diagnose_dnssec('6')) diff --git a/plinth/modules/networks/networks.py b/plinth/modules/networks/networks.py index 88034ee9f..522b08aa1 100644 --- a/plinth/modules/networks/networks.py +++ b/plinth/modules/networks/networks.py @@ -25,9 +25,7 @@ from .forms import (ConnectionTypeSelectForm, EthernetForm, PPPoEForm, WifiForm) -from plinth import cfg from plinth import network -from plinth import package logger = Logger(__name__) @@ -40,14 +38,6 @@ 'text': ugettext_lazy('Add Connection')}] -def init(): - """Initialize the Networks module.""" - menu = cfg.main_menu.get('system:index') - menu.add_urlname(ugettext_lazy('Networks'), 'glyphicon-signal', - 'networks:index', 18) - - -@package.required(['network-manager']) def index(request): """Show connection list.""" connections = network.get_connection_list() From b916d95a0b3f15efb8c2b67f6a761783eddebae7 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 16:14:59 +0530 Subject: [PATCH 096/189] openvpn: Use new setup mechanism --- plinth/modules/openvpn/__init__.py | 27 ++++++++++++++++--- plinth/modules/openvpn/templates/openvpn.html | 18 ++----------- plinth/modules/openvpn/views.py | 5 ++-- 3 files changed, 27 insertions(+), 23 deletions(-) diff --git a/plinth/modules/openvpn/__init__.py b/plinth/modules/openvpn/__init__.py index 688b1507f..c035abb99 100644 --- a/plinth/modules/openvpn/__init__.py +++ b/plinth/modules/openvpn/__init__.py @@ -25,23 +25,42 @@ from plinth import action_utils from plinth import cfg from plinth import service as service_module +from plinth.utils import format_lazy +version = 1 + depends = ['apps'] +title = _('Virtual Private Network (OpenVPN)') + +description = [ + format_lazy( + _('Virtual Private Network (VPN) is a technique for securely ' + 'connecting two devices in order to access resources of a ' + 'private network. While you are away from home, you can connect ' + 'to your {box_name} in order to join your home network and ' + 'access private/internal services provided by {box_name}. ' + 'You can also access the rest of the Internet via {box_name} ' + 'for added security and anonymity.'), box_name=_(cfg.box_name)) +] + service = None def init(): """Intialize the OpenVPN module.""" menu = cfg.main_menu.get('apps:index') - menu.add_urlname(_('Virtual Private Network (OpenVPN)'), 'glyphicon-lock', - 'openvpn:index', 850) + menu.add_urlname(title, 'glyphicon-lock', 'openvpn:index', 850) global service service = service_module.Service( - 'openvpn', _('OpenVPN'), ['openvpn'], - is_external=True, enabled=is_enabled()) + 'openvpn', title, ['openvpn'], is_external=True, enabled=is_enabled()) + + +def setup(helper, old_version=None): + """Install and configure the module.""" + helper.install(['openvpn', 'easy-rsa']) def is_enabled(): diff --git a/plinth/modules/openvpn/templates/openvpn.html b/plinth/modules/openvpn/templates/openvpn.html index d2ff0c5d8..422a9e69f 100644 --- a/plinth/modules/openvpn/templates/openvpn.html +++ b/plinth/modules/openvpn/templates/openvpn.html @@ -1,4 +1,4 @@ -{% extends "base.html" %} +{% extends "app.html" %} {% comment %} # # This file is part of Plinth. @@ -30,21 +30,7 @@ {% endblock %} -{% block content %} - -

{% trans "Virtual Private Network (OpenVPN)" %}

- -

- {% blocktrans trimmed %} - Virtual Private Network (VPN) is a technique for securely - connecting two devices in order to access resources of a - private network. While you are away from home, you can connect - to your {{ box_name }} in order to join your home network and - access private/internal services provided by {{ box_name }}. - You can also access the rest of the Internet via {{ box_name }} - for added security and anonymity. - {% endblocktrans %} -

+{% block configuration %} {% if status.is_setup %} diff --git a/plinth/modules/openvpn/views.py b/plinth/modules/openvpn/views.py index f4cd85ed8..ea1c6aefa 100644 --- a/plinth/modules/openvpn/views.py +++ b/plinth/modules/openvpn/views.py @@ -29,7 +29,6 @@ from .forms import OpenVpnForm from plinth import actions -from plinth import package from plinth.modules import openvpn from plinth.modules.config import config @@ -38,7 +37,6 @@ setup_process = None -@package.required(['openvpn', 'easy-rsa']) def index(request): """Serve configuration page.""" status = get_status() @@ -59,7 +57,8 @@ def index(request): form = OpenVpnForm(initial=status, prefix='openvpn') return TemplateResponse(request, 'openvpn.html', - {'title': _('Virtual Private Network (OpenVPN)'), + {'title': openvpn.title, + 'description': openvpn.description, 'status': status, 'form': form}) From 166ff9b5bf05db525c3a5e3d166c52fcfb21f787 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 16:27:12 +0530 Subject: [PATCH 097/189] owncloud: Use new setup mechanism - Also reorganize views. --- plinth/modules/owncloud/__init__.py | 51 +++++++++++++++++-- plinth/modules/owncloud/forms.py | 30 +++++++++++ .../modules/owncloud/templates/owncloud.html | 27 +--------- plinth/modules/owncloud/urls.py | 2 +- .../owncloud/{owncloud.py => views.py} | 44 +++------------- 5 files changed, 87 insertions(+), 67 deletions(-) create mode 100644 plinth/modules/owncloud/forms.py rename plinth/modules/owncloud/{owncloud.py => views.py} (63%) diff --git a/plinth/modules/owncloud/__init__.py b/plinth/modules/owncloud/__init__.py index 543909e21..29d77934e 100644 --- a/plinth/modules/owncloud/__init__.py +++ b/plinth/modules/owncloud/__init__.py @@ -19,15 +19,60 @@ Plinth module to configure ownCloud """ -from . import owncloud -from .owncloud import init +from django.utils.translation import ugettext_lazy as _ +from plinth import actions from plinth import action_utils +from plinth import cfg +from plinth import service as service_module -__all__ = ['owncloud', 'init'] +version = 1 depends = ['apps'] +title = _('File Hosting (ownCloud)') + +description = [ + _('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.'), + + _('When enabled, the ownCloud installation will be available ' + 'from /owncloud path on the web server. ' + 'Visit this URL to set up the initial administration account for ' + 'ownCloud.') +] + +service = None + + +def init(): + """Initialize the ownCloud module""" + menu = cfg.main_menu.get('apps:index') + menu.add_urlname(title, 'glyphicon-picture', 'owncloud:index', 700) + + global service + service = service_module.Service( + 'owncloud', title, ['http', 'https'], is_external=True, + enabled=is_enabled()) + + +def setup(helper, old_version=None): + """Install and configure the module.""" + helper.install(['postgresql', 'php5-pgsql', 'owncloud']) + helper.call('post', actions.superuser_run, 'owncloud-setup', ['enable']) + helper.call('post', service.notify_enabled, None, True) + + +def is_enabled(): + """Return whether the module is enabled.""" + output = actions.run('owncloud-setup', ['status']) + return 'enable' in output.split() + def diagnose(): """Run diagnostics and return the results.""" diff --git a/plinth/modules/owncloud/forms.py b/plinth/modules/owncloud/forms.py new file mode 100644 index 000000000..3ea4c6f8c --- /dev/null +++ b/plinth/modules/owncloud/forms.py @@ -0,0 +1,30 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Forms for configuring ownCloud. +""" + +from django import forms +from django.utils.translation import ugettext_lazy as _ + + +class OwnCloudForm(forms.Form): # pylint: disable-msg=W0232 + """ownCloud configuration form""" + enabled = forms.BooleanField( + label=_('Enable ownCloud'), + required=False) diff --git a/plinth/modules/owncloud/templates/owncloud.html b/plinth/modules/owncloud/templates/owncloud.html index 410071f08..266967d3d 100644 --- a/plinth/modules/owncloud/templates/owncloud.html +++ b/plinth/modules/owncloud/templates/owncloud.html @@ -1,4 +1,4 @@ -{% extends "base.html" %} +{% extends "app.html" %} {% comment %} # # This file is part of Plinth. @@ -21,30 +21,7 @@ {% load bootstrap %} {% load i18n %} -{% block content %} - -

{% trans "File Hosting (ownCloud)" %}

- -

- {% 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 %} -

- -

- {% blocktrans trimmed %} - When enabled, the ownCloud installation will be available - from /owncloud path on the web server. - Visit this URL to set up the initial administration account for - ownCloud. - {% endblocktrans %} -

+{% block configuration %} {% include "diagnostics_button.html" with module="owncloud" %} diff --git a/plinth/modules/owncloud/urls.py b/plinth/modules/owncloud/urls.py index d69ac14ef..338ad6cc5 100644 --- a/plinth/modules/owncloud/urls.py +++ b/plinth/modules/owncloud/urls.py @@ -21,7 +21,7 @@ from django.conf.urls import url -from . import owncloud as views +from . import views urlpatterns = [ diff --git a/plinth/modules/owncloud/owncloud.py b/plinth/modules/owncloud/views.py similarity index 63% rename from plinth/modules/owncloud/owncloud.py rename to plinth/modules/owncloud/views.py index 249054dbb..b2e77077b 100644 --- a/plinth/modules/owncloud/owncloud.py +++ b/plinth/modules/owncloud/views.py @@ -19,47 +19,15 @@ Plinth module for configuring ownCloud. """ -from django import forms from django.contrib import messages from django.template.response import TemplateResponse from django.utils.translation import ugettext_lazy as _ +from .forms import OwnCloudForm from plinth import actions -from plinth import cfg -from plinth import package -from plinth import service as service_module +from plinth.modules import owncloud -service = None - - -class OwnCloudForm(forms.Form): # pylint: disable-msg=W0232 - """ownCloud configuration form""" - enabled = forms.BooleanField(label=_('Enable ownCloud'), required=False) - - -def init(): - """Initialize the ownCloud module""" - menu = cfg.main_menu.get('apps:index') - menu.add_urlname(_('File Hosting (ownCloud)'), 'glyphicon-picture', - 'owncloud:index', 700) - - status = get_status() - - global service # pylint: disable-msg=W0603 - service = service_module.Service( - 'owncloud', _('ownCloud'), ['http', 'https'], is_external=True, - enabled=status['enabled']) - - -def on_install(): - """Tasks to run after package install.""" - actions.superuser_run('owncloud-setup', ['enable']) - service.notify_enabled(None, True) - - -@package.required(['postgresql', 'php5-pgsql', 'owncloud'], - on_install=on_install) def index(request): """Serve the ownCloud configuration page""" status = get_status() @@ -77,14 +45,14 @@ def index(request): form = OwnCloudForm(initial=status, prefix='owncloud') return TemplateResponse(request, 'owncloud.html', - {'title': _('ownCloud'), + {'title': owncloud.title, + 'description': owncloud.description, 'form': form}) def get_status(): """Return the current status""" - output = actions.run('owncloud-setup', ['status']) - return {'enabled': 'enable' in output.split()} + return {'enabled': owncloud.is_enabled()} def _apply_changes(request, old_status, new_status): @@ -104,4 +72,4 @@ def _apply_changes(request, old_status, new_status): # Send a signal to other modules that the service is # enabled/disabled - service.notify_enabled(None, new_status['enabled']) + owncloud.service.notify_enabled(None, new_status['enabled']) From 5e094934b044b3cdb0f5f3e04add50b5d9c56297 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 16:51:02 +0530 Subject: [PATCH 098/189] pagekite: Use new setup mechanism --- plinth/modules/pagekite/__init__.py | 46 +++++++++++++++- .../templates/pagekite_introduction.html | 55 +------------------ plinth/modules/pagekite/views.py | 13 ++--- 3 files changed, 51 insertions(+), 63 deletions(-) diff --git a/plinth/modules/pagekite/__init__.py b/plinth/modules/pagekite/__init__.py index 7e5f689ba..6862c1b68 100644 --- a/plinth/modules/pagekite/__init__.py +++ b/plinth/modules/pagekite/__init__.py @@ -21,19 +21,59 @@ from django.utils.translation import ugettext_lazy as _ from plinth import cfg +from plinth.utils import format_lazy from . import utils -__all__ = ['init'] +version = 1 depends = ['apps', 'names'] +title = _('Public Visibility (PageKite)') + +description = [ + format_lazy( + _('PageKite is a system for exposing {box_name} services when ' + 'you don\'t have a direct connection to the Internet. You only ' + 'need this if your {box_name} services are unreachable from ' + 'the rest of the Internet. This includes the following ' + 'situations:'), box_name=_(cfg.box_name)), + + format_lazy( + _('{box_name} is behind a restricted firewall.'), + box_name=_(cfg.box_name)), + + format_lazy( + _('{box_name} is connected to a (wireless) router which you ' + 'don\'t control.'), box_name=_(cfg.box_name)), + + _('Your ISP does not provide you an external IP address and ' + 'instead provides Internet connection through NAT.'), + + _('Your ISP does not provide you a static IP address and your IP ' + 'address changes evertime you connect to Internet.'), + + _('Your ISP limits incoming connections.'), + + format_lazy( + _('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 ' + 'pagekite.net. In future it ' + 'might be possible to use your buddy\'s {box_name} for this.'), + box_name=_(cfg.box_name)) +] + def init(): """Intialize the PageKite module""" menu = cfg.main_menu.get('apps:index') - menu.add_urlname(_('Public Visibility (PageKite)'), - 'glyphicon-flag', 'pagekite:index', 800) + menu.add_urlname(title, 'glyphicon-flag', 'pagekite:index', 800) # Register kite name with Name Services module. utils.update_names_module(initial_registration=True) + + +def setup(helper, old_version=None): + """Install and configure the module.""" + helper.install(['pagekite']) diff --git a/plinth/modules/pagekite/templates/pagekite_introduction.html b/plinth/modules/pagekite/templates/pagekite_introduction.html index 92682064d..0961c1923 100644 --- a/plinth/modules/pagekite/templates/pagekite_introduction.html +++ b/plinth/modules/pagekite/templates/pagekite_introduction.html @@ -1,4 +1,4 @@ -{% extends "base.html" %} +{% extends "app.html" %} {% comment %} # # This file is part of Plinth. @@ -20,58 +20,7 @@ {% load i18n %} -{% block content %} - -

- {% blocktrans trimmed %} - PageKite is a system for exposing {{ box_name }} services when - you don't have a direct connection to the Internet. You only - need this if your {{ box_name }} services are unreachable from - the rest of the Internet. This includes the following - situations: - {% endblocktrans %} -

- -
    -
  • - {% blocktrans trimmed %} - {{ box_name }} is behind a restricted firewall. - {% endblocktrans %} -
  • - -
  • - {% blocktrans trimmed %} - {{ box_name }} is connected to a (wireless) router which you - don't control. - {% endblocktrans %} -
  • - -
  • - {% blocktrans trimmed %} - Your ISP does not provide you an external IP address and - instead provides Internet connection through NAT. - {% endblocktrans %} -
  • - -
  • - {% blocktrans trimmed %} - Your ISP does not provide you a static IP address and your IP - address changes evertime you connect to Internet. - {% endblocktrans %} -
  • - -
  • {% trans "Your ISP limits incoming connections." %}
  • -
- -

- {% 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 - pagekite.net. In future it - might be possible to use your buddy's {{ box_name }} for this. - {% endblocktrans %} -

+{% block configuration %}

diff --git a/plinth/modules/pagekite/views.py b/plinth/modules/pagekite/views.py index 99fe0fd46..583f072dc 100644 --- a/plinth/modules/pagekite/views.py +++ b/plinth/modules/pagekite/views.py @@ -18,18 +18,16 @@ from django.core.urlresolvers import reverse, reverse_lazy from django.http.response import HttpResponseRedirect from django.template.response import TemplateResponse -from django.utils.decorators import method_decorator from django.utils.translation import ugettext_lazy as _ from django.views.generic import View, TemplateView from django.views.generic.edit import FormView -from plinth import package from . import utils from .forms import ConfigurationForm, StandardServiceForm, \ AddCustomServiceForm, DeleteCustomServiceForm +from plinth.modules import pagekite -required_packages = ('pagekite',) subsubmenu = [{'url': reverse_lazy('pagekite:index'), 'text': _('About PageKite')}, {'url': reverse_lazy('pagekite:configure'), @@ -43,7 +41,8 @@ def index(request): """Serve introduction page""" return TemplateResponse(request, 'pagekite_introduction.html', - {'title': _('Public Visibility (PageKite)'), + {'title': pagekite.title, + 'description': pagekite.description, 'subsubmenu': subsubmenu}) @@ -59,7 +58,6 @@ def get_context_data(self, **kwargs): context['subsubmenu'] = subsubmenu return context - @method_decorator(package.required(required_packages)) def dispatch(self, *args, **kwargs): return super(ContextMixin, self).dispatch(*args, **kwargs) @@ -81,8 +79,9 @@ def get_context_data(self, *args, **kwargs): unused, custom_services = utils.get_pagekite_services() for service in custom_services: service['form'] = AddCustomServiceForm(initial=service) - context['custom_services'] = [utils.prepare_service_for_display(service) - for service in custom_services] + context['custom_services'] = [ + utils.prepare_service_for_display(service) + for service in custom_services] context.update(utils.get_kite_details()) return context From a33f68f0513333d8b3fbafd581c871456a9d086b Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 16:54:37 +0530 Subject: [PATCH 099/189] power: Use new setup mechanism --- plinth/modules/power/__init__.py | 13 +++++++++++-- plinth/modules/power/templates/power.html | 10 ++-------- plinth/modules/power/views.py | 5 ++++- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/plinth/modules/power/__init__.py b/plinth/modules/power/__init__.py index 32cd2af14..9cf5d0aef 100644 --- a/plinth/modules/power/__init__.py +++ b/plinth/modules/power/__init__.py @@ -23,11 +23,20 @@ from plinth import cfg +version = 1 + +is_essential = True + depends = ['system'] +title = _('Power') + +description = [ + _('Restart or shut down the system.') +] + def init(): """Initialize the power module.""" menu = cfg.main_menu.get('system:index') - menu.add_urlname(_('Power'), 'glyphicon-off', - 'power:index', 1000) + menu.add_urlname(title, 'glyphicon-off', 'power:index', 1000) diff --git a/plinth/modules/power/templates/power.html b/plinth/modules/power/templates/power.html index 642aea911..89553d389 100644 --- a/plinth/modules/power/templates/power.html +++ b/plinth/modules/power/templates/power.html @@ -1,4 +1,4 @@ -{% extends "base.html" %} +{% extends "app.html" %} {% comment %} # # This file is part of Plinth. @@ -21,13 +21,7 @@ {% load bootstrap %} {% load i18n %} -{% block content %} - -

{{ title }}

- -

- {% blocktrans trimmed %}Restart or shut down the system.{% endblocktrans %} -

+{% block configuration %}

diff --git a/plinth/modules/power/views.py b/plinth/modules/power/views.py index e1d835f6a..ae18d4506 100644 --- a/plinth/modules/power/views.py +++ b/plinth/modules/power/views.py @@ -26,11 +26,14 @@ from django.utils.translation import ugettext as _ from plinth import actions +from plinth.modules import power def index(request): """Serve power controls page.""" - return TemplateResponse(request, 'power.html', {'title': _('Power')}) + return TemplateResponse(request, 'power.html', + {'title': power.title, + 'description': power.description}) def restart(request): From 528fe47c160ed1e1b931a404998b91a6d2113207 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 17:02:06 +0530 Subject: [PATCH 100/189] quassel: Use new setup mechanism --- plinth/modules/quassel/__init__.py | 36 ++++++++++++++++--- plinth/modules/quassel/templates/quassel.html | 28 ++------------- plinth/modules/quassel/views.py | 10 ++---- 3 files changed, 35 insertions(+), 39 deletions(-) diff --git a/plinth/modules/quassel/__init__.py b/plinth/modules/quassel/__init__.py index 54a2ec45b..c30f0abcc 100644 --- a/plinth/modules/quassel/__init__.py +++ b/plinth/modules/quassel/__init__.py @@ -16,7 +16,7 @@ # """ -Plinth module for quassel. +Plinth module for Quassel. """ from django.utils.translation import ugettext_lazy as _ @@ -24,22 +24,48 @@ from plinth import action_utils from plinth import cfg from plinth import service as service_module +from plinth.utils import format_lazy + +version = 1 depends = ['apps'] +title = _('IRC Client (Quassel)') + +description = [ + format_lazy( + _('Quassel is an IRC application that is split into two parts, a ' + '"core" and a "client". This allows the core to remain connected ' + 'to IRC servers, and to continue receiving messages, even when ' + 'the client is disconnected. {box_name} can run the Quassel ' + 'core service keeping you always online and one or more Quassel ' + 'clients from a desktop or a mobile can be used to connect and ' + 'disconnect from it.'), box_name=_(cfg.box_name)), + + _('You can connect to your Quassel core on the default Quassel port ' + '4242. Clients to connect to Quassel from your ' + 'desktop and ' + 'mobile devices ' + 'are available.') +] + service = None def init(): """Initialize the quassel module.""" menu = cfg.main_menu.get('apps:index') - menu.add_urlname(_('IRC Client (Quassel)'), 'glyphicon-retweet', - 'quassel:index', 730) + menu.add_urlname(title, 'glyphicon-retweet', 'quassel:index', 730) global service service = service_module.Service( - 'quassel-plinth', _('Quassel IRC Client'), - is_external=True, enabled=is_enabled()) + 'quassel-plinth', title, is_external=True, enabled=is_enabled()) + + +def setup(helper, old_version=None): + """Install and configure the module.""" + helper.install(['quassel-core']) + helper.call('post', service.notify_enabled, None, True) def is_enabled(): diff --git a/plinth/modules/quassel/templates/quassel.html b/plinth/modules/quassel/templates/quassel.html index c2f47ce0c..227769463 100644 --- a/plinth/modules/quassel/templates/quassel.html +++ b/plinth/modules/quassel/templates/quassel.html @@ -1,4 +1,4 @@ -{% extends "base.html" %} +{% extends "app.html" %} {% comment %} # # This file is part of Plinth. @@ -21,31 +21,7 @@ {% load bootstrap %} {% load i18n %} -{% block content %} - -

{% trans "IRC Client (Quassel)" %}

- -

- {% blocktrans trimmed %} - Quassel is an IRC application that is split into two parts, a - "core" and a "client". This allows the core to remain connected - to IRC servers, and to continue receiving messages, even when - the client is disconnected. {{ box_name }} can run the Quassel - core service keeping you always online and one or more Quassel - clients from a desktop or a mobile can be used to connect and - disconnect from it. - {% endblocktrans %} -

- -

- {% blocktrans trimmed %} - You can connect to your Quassel core on the default Quassel port - 4242. Clients to connect to Quassel from your - desktop and - mobile devices - are available. - {% endblocktrans %} -

+{% block configuration %}

{% trans "Status" %}

diff --git a/plinth/modules/quassel/views.py b/plinth/modules/quassel/views.py index 3918c849b..2adee5260 100644 --- a/plinth/modules/quassel/views.py +++ b/plinth/modules/quassel/views.py @@ -25,16 +25,9 @@ from .forms import QuasselForm from plinth import actions -from plinth import package from plinth.modules import quassel -def on_install(): - """Notify that the service is now enabled.""" - quassel.service.notify_enabled(None, True) - - -@package.required(['quassel-core'], on_install=on_install) def index(request): """Serve configuration page.""" status = get_status() @@ -51,7 +44,8 @@ def index(request): form = QuasselForm(initial=status, prefix='quassel') return TemplateResponse(request, 'quassel.html', - {'title': _('IRC Client (Quassel)'), + {'title': quassel.title, + 'description': quassel.description, 'status': status, 'form': form}) From f78a5583577aaca147c1736ff6fa8db776a3187e Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 17:08:41 +0530 Subject: [PATCH 101/189] repro: Use new setup mechanism --- plinth/modules/repro/__init__.py | 40 ++++++++++++++++++++--- plinth/modules/repro/templates/repro.html | 36 ++------------------ plinth/modules/repro/views.py | 11 ++----- 3 files changed, 40 insertions(+), 47 deletions(-) diff --git a/plinth/modules/repro/__init__.py b/plinth/modules/repro/__init__.py index 5cba93082..0a72adcf8 100644 --- a/plinth/modules/repro/__init__.py +++ b/plinth/modules/repro/__init__.py @@ -21,25 +21,57 @@ from django.utils.translation import ugettext_lazy as _ +from plinth import actions from plinth import action_utils from plinth import cfg from plinth import service as service_module +version = 1 + depends = ['apps'] +title = _('SIP Server (repro)') + +description = [ + _('repro provides various SIP services that a SIP softphone can utilize ' + 'to provide audio and video calls as well as presence and instant ' + 'messaging. repro provides a server and SIP user accounts that clients ' + 'can use to let their presence known. It also acts as a proxy to ' + 'federate SIP communications to other servers on the Internet similar ' + 'to email.'), + + _('To make SIP calls, a client application is needed. Available clients ' + 'include Jitsi (for computers) and ' + ' ' + 'CSipSimple (for Android phones).'), + + _('Note: Before using repro, domains and users will ' + 'need to be configured using the ' + 'web-based configuration panel. Users in the admin group ' + 'will be able to log in to the repro configuration panel. After setting ' + 'the domain, it is required to restart the repro service. Disable the ' + 'service and re-enable it.'), +] + service = None def init(): """Initialize the repro module.""" menu = cfg.main_menu.get('apps:index') - menu.add_urlname(_('SIP Server (repro)'), 'glyphicon-phone-alt', - 'repro:index', 825) + menu.add_urlname(title, 'glyphicon-phone-alt', 'repro:index', 825) global service service = service_module.Service( - 'repro', _('repro SIP Server'), ['sip-plinth', 'sip-tls-plinth'], - is_external=True, enabled=is_enabled()) + 'repro', title, ['sip-plinth', 'sip-tls-plinth'], is_external=True, + enabled=is_enabled()) + + +def setup(helper, old_version=None): + """Install and configure the module.""" + helper.install(['repro']) + helper.call('post', actions.superuser_run, 'repro', ['setup']) + helper.call('post', service.notify_enabled, None, True) def is_enabled(): diff --git a/plinth/modules/repro/templates/repro.html b/plinth/modules/repro/templates/repro.html index 1d4b2fe7d..df5109cb0 100644 --- a/plinth/modules/repro/templates/repro.html +++ b/plinth/modules/repro/templates/repro.html @@ -1,4 +1,4 @@ -{% extends "base.html" %} +{% extends "app.html" %} {% comment %} # # This file is part of Plinth. @@ -21,39 +21,7 @@ {% load bootstrap %} {% load i18n %} -{% block content %} - -

{% trans "SIP Server (repro)" %}

- -

- {% blocktrans trimmed %} - repro provides various SIP services that a SIP softphone can utilize to - provide audio and video calls as well as presence and instant messaging. - repro provides a server and SIP user accounts that clients can use to let - their presence known. It also acts as a proxy to federate SIP - communications to other servers on the Internet similar to email. - {% endblocktrans %} -

- -

- {% blocktrans trimmed %} - To make SIP calls, a client application is needed. Available clients - include Jitsi (for computers) and - - CSipSimple (for Android phones). - {% endblocktrans %} -

- -

- {% blocktrans trimmed %} - Note: Before using repro, domains and users will need - to be configured using the web-based - configuration panel. Users in the admin group will be able - to log in to the repro configuration panel. After setting the domain, it - is required to restart the repro service. Disable the service and - re-enable it. - {% endblocktrans %} -

+{% block configuration %}

{% trans "Status" %}

diff --git a/plinth/modules/repro/views.py b/plinth/modules/repro/views.py index 40392f48a..407a96b0c 100644 --- a/plinth/modules/repro/views.py +++ b/plinth/modules/repro/views.py @@ -25,17 +25,9 @@ from .forms import ReproForm from plinth import actions -from plinth import package from plinth.modules import repro -def on_install(): - """Notify that the service is now enabled.""" - actions.superuser_run('repro', ['setup']) - repro.service.notify_enabled(None, True) - - -@package.required(['repro'], on_install=on_install) def index(request): """Serve configuration page.""" status = get_status() @@ -52,7 +44,8 @@ def index(request): form = ReproForm(initial=status, prefix='repro') return TemplateResponse(request, 'repro.html', - {'title': _('SIP Server (repro)'), + {'title': repro.title, + 'description': repro.description, 'status': status, 'form': form}) From c2cb1f32b98212fc6a005188cb442dbfa85dc98d Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 17:32:08 +0530 Subject: [PATCH 102/189] restore: Use new setup mechanism --- plinth/modules/restore/__init__.py | 30 +++++++++++++++---- .../restore/templates/restore_index.html | 24 ++------------- plinth/modules/restore/views.py | 6 ++-- 3 files changed, 30 insertions(+), 30 deletions(-) diff --git a/plinth/modules/restore/__init__.py b/plinth/modules/restore/__init__.py index 45404a27a..dff18b3d4 100644 --- a/plinth/modules/restore/__init__.py +++ b/plinth/modules/restore/__init__.py @@ -22,24 +22,44 @@ from django.utils.translation import ugettext_lazy as _ from plinth import action_utils, cfg from plinth import service as service_module +from plinth.utils import format_lazy service = None -__all__ = ['init'] +version = 1 depends = ['apps'] +title = _('Unhosted Storage (reStore)') + +description = [ + format_lazy( + _('reStore is a server for ' + 'unhosted web applications. The idea is to uncouple web ' + 'applications from data. No matter where a web application is ' + 'served from, the data can be stored on an unhosted storage ' + 'server of user\'s choice. With reStore, your {box_name} becomes ' + 'your unhosted storage server.'), box_name=_(cfg.box_name)), + + _('You can create and edit accounts in the ' + 'reStore web-interface.') +] + def init(): """Initialize the reStore module.""" menu = cfg.main_menu.get('apps:index') - menu.add_urlname(_('Unhosted Storage (reStore)'), 'glyphicon-hdd', - 'restore:index', 750) + menu.add_urlname(title, 'glyphicon-hdd', 'restore:index', 750) global service service = service_module.Service( - 'node-restore', _('reStore'), ['http', 'https'], - is_external=False, enabled=is_enabled()) + 'node-restore', title, ['http', 'https'], is_external=False, + enabled=is_enabled()) + + +def setup(helper, old_version=None): + """Install and configure the module.""" + helper.install(['node-restore']) def is_enabled(): diff --git a/plinth/modules/restore/templates/restore_index.html b/plinth/modules/restore/templates/restore_index.html index 8c9402ba7..4148a047c 100644 --- a/plinth/modules/restore/templates/restore_index.html +++ b/plinth/modules/restore/templates/restore_index.html @@ -1,4 +1,4 @@ -{% extends "base.html" %} +{% extends "app.html" %} {% comment %} # # This file is part of Plinth. @@ -21,27 +21,7 @@ {% load bootstrap %} {% load i18n %} -{% block content %} - -

{% trans "Unhosted Storage (reStore)" %}

- -

- {% blocktrans trimmed %} - reStore is a server for unhosted - web applications. The idea is to uncouple web applications from - data. No matter where a web application is served from, the - data can be stored on an unhosted storage server of user's - choice. With reStore, your {{ box_name }} becomes your - unhosted storage server. - {% endblocktrans %} -

- -

- {% blocktrans trimmed %} - You can create and edit accounts in the - reStore web-interface. - {% endblocktrans %} -

+{% block configuration %}

Configuration

diff --git a/plinth/modules/restore/views.py b/plinth/modules/restore/views.py index e0c75fbd6..0e91904a4 100644 --- a/plinth/modules/restore/views.py +++ b/plinth/modules/restore/views.py @@ -24,11 +24,10 @@ from django.utils.translation import ugettext as _ from .forms import ReStoreForm -from plinth import actions, package +from plinth import actions from plinth.modules import restore -@package.required(['node-restore']) def index(request): """Serve configuration page.""" status = get_status() @@ -43,7 +42,8 @@ def index(request): form = ReStoreForm(initial=status, prefix='restore') return TemplateResponse(request, 'restore_index.html', - {'title': _('Unhosted Storage (reStore)'), + {'title': restore.title, + 'description': restore.description, 'status': status, 'form': form}) From bdfd20d661d4756aceed483f93be29202f85675a Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 17:47:25 +0530 Subject: [PATCH 103/189] roundcube: Use new setup mechanism --- plinth/modules/roundcube/__init__.py | 38 ++++++++++++++++++- .../roundcube/templates/roundcube.html | 38 +------------------ plinth/modules/roundcube/views.py | 16 +------- 3 files changed, 40 insertions(+), 52 deletions(-) diff --git a/plinth/modules/roundcube/__init__.py b/plinth/modules/roundcube/__init__.py index c170c6f2b..1c11596af 100644 --- a/plinth/modules/roundcube/__init__.py +++ b/plinth/modules/roundcube/__init__.py @@ -21,18 +21,52 @@ from django.utils.translation import ugettext_lazy as _ +from plinth import actions from plinth import action_utils from plinth import cfg +version = 1 + depends = ['apps'] +title = _('Email Client (Roundcube)') + +description = [ + _('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.'), + + _('You can access Roundcube from ' + '/roundcube. 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 imap.example.com' + '. For IMAP over SSL (recommended), fill the server field ' + 'like imaps://imap.example.com.'), + + _('For Gmail, username will be your Gmail address, password will be ' + 'your Google account password and server will be ' + 'imaps://imap.gmail.com. Note that you will also need ' + 'to enable "Less secure apps" in your Google account settings ' + '(https://www.google.com/settings/security/lesssecureapps).'), +] + def init(): """Intialize the module.""" menu = cfg.main_menu.get('apps:index') - menu.add_urlname(_('Email Client (Roundcube)'), 'glyphicon-envelope', - 'roundcube:index', 600) + menu.add_urlname(title, 'glyphicon-envelope', 'roundcube:index', 600) + + +def setup(helper, old_version=None): + """Install and configure the module.""" + helper.call('pre', actions.superuser_run, 'roundcube', ['pre-install']) + helper.install(['sqlite3', 'roundcube', 'roundcube-sqlite3']) + helper.call('pre', actions.superuser_run, 'roundcube', ['setup']) + def is_enabled(): """Return whether the module is enabled.""" diff --git a/plinth/modules/roundcube/templates/roundcube.html b/plinth/modules/roundcube/templates/roundcube.html index fea5d2c92..6028f7aba 100644 --- a/plinth/modules/roundcube/templates/roundcube.html +++ b/plinth/modules/roundcube/templates/roundcube.html @@ -1,4 +1,4 @@ -{% extends "base.html" %} +{% extends "app.html" %} {% comment %} # # This file is part of Plinth. @@ -21,41 +21,7 @@ {% load bootstrap %} {% load i18n %} -{% block content %} - -

{% trans "Email Client (Roundcube)" %}

- -

- {% 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 %} -

- -

- {% blocktrans trimmed %} - You can access Roundcube from /roundcube. - 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 imap.example.com. For - IMAP over SSL (recommended), fill the server field like - imaps://imap.example.com. - {% endblocktrans %} -

- -

- {% blocktrans trimmed %} - For Gmail, username will be your Gmail address, password will be - your Google account password and server will be - imaps://imap.gmail.com. Note that you will also need - to enable "Less secure apps" in your Google account settings - (https://www.google.com/settings/security/lesssecureapps). - {% endblocktrans %} -

+{% block configuration %} {% include "diagnostics_button.html" with module="roundcube" %} diff --git a/plinth/modules/roundcube/views.py b/plinth/modules/roundcube/views.py index 1790d8868..610fdb8c0 100644 --- a/plinth/modules/roundcube/views.py +++ b/plinth/modules/roundcube/views.py @@ -26,24 +26,11 @@ from .forms import RoundcubeForm from plinth import actions -from plinth import package from plinth.modules import roundcube logger = logging.getLogger(__name__) -def before_install(): - """Preseed debconf values before the packages are installed.""" - actions.superuser_run('roundcube', ['pre-install']) - - -def on_install(): - """Setup Roundcube Apache configuration.""" - actions.superuser_run('roundcube', ['setup']) - - -@package.required(['sqlite3', 'roundcube', 'roundcube-sqlite3'], - before_install=before_install, on_install=on_install) def index(request): """Serve configuration page.""" status = get_status() @@ -61,7 +48,8 @@ def index(request): form = RoundcubeForm(initial=status, prefix='roundcube') return TemplateResponse(request, 'roundcube.html', - {'title': _('Email Client (Roundcube)'), + {'title': roundcube.title, + 'description': roundcube.description, 'status': status, 'form': form}) From 4066a2f8d62d35bd9f637e26df7cf6820a083249 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 18:12:51 +0530 Subject: [PATCH 104/189] shaarli: Use new setup mechanism --- plinth/modules/shaarli/__init__.py | 26 ++++++++++++++++--- plinth/modules/shaarli/templates/shaarli.html | 18 ++----------- plinth/modules/shaarli/views.py | 8 ++---- 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/plinth/modules/shaarli/__init__.py b/plinth/modules/shaarli/__init__.py index ac2e07df1..2210da998 100644 --- a/plinth/modules/shaarli/__init__.py +++ b/plinth/modules/shaarli/__init__.py @@ -26,21 +26,39 @@ from plinth import service as service_module +version = 1 + depends = ['apps'] +title = _('Bookmarks (Shaarli)') + +description = [ + _('Shaarli allows you to save and share bookmarks.'), + + _('When enabled, Shaarli will be available from ' + '/shaarli path on the web server. Note that Shaarli only supports a ' + 'single user account, which you will need to setup on the initial ' + 'visit.'), +] + service = None def init(): """Initialize the module.""" menu = cfg.main_menu.get('apps:index') - menu.add_urlname(_('Bookmarks (Shaarli)'), 'glyphicon-bookmark', - 'shaarli:index', 350) + menu.add_urlname(title, 'glyphicon-bookmark', 'shaarli:index', 350) global service service = service_module.Service( - 'shaarli', _('Shaarli'), ['http', 'https'], - is_external=True, enabled=is_enabled()) + 'shaarli', title, ['http', 'https'], is_external=True, + enabled=is_enabled()) + + +def setup(helper, old_version=None): + """Install and configure the module.""" + helper.install(['shaarli']) + helper.call('post', service.notify_enabled, None, True) def is_enabled(): diff --git a/plinth/modules/shaarli/templates/shaarli.html b/plinth/modules/shaarli/templates/shaarli.html index 391c25466..9a6c55b0a 100644 --- a/plinth/modules/shaarli/templates/shaarli.html +++ b/plinth/modules/shaarli/templates/shaarli.html @@ -1,4 +1,4 @@ -{% extends "base.html" %} +{% extends "app.html" %} {% comment %} # # This file is part of Plinth. @@ -21,21 +21,7 @@ {% load bootstrap %} {% load i18n %} -{% block content %} - -

{% trans "Bookmarks (Shaarli)" %}

- -

{% trans "Shaarli allows you to save and share bookmarks." %}

- -

- {% blocktrans trimmed %} - - When enabled, Shaarli will be available from /shaarli - path on the web server. Note that Shaarli only supports a single - user account, which you will need to setup on the initial visit. - - {% endblocktrans %} -

+{% block configuration %}

{% trans "Configuration" %}

diff --git a/plinth/modules/shaarli/views.py b/plinth/modules/shaarli/views.py index 6182db539..de174faa7 100644 --- a/plinth/modules/shaarli/views.py +++ b/plinth/modules/shaarli/views.py @@ -25,14 +25,9 @@ from .forms import ShaarliForm from plinth import actions -from plinth import package from plinth.modules import shaarli -def on_install(): - """Notify that the service is now enabled.""" - shaarli.service.notify_enabled(None, True) -@package.required(['shaarli'], on_install=on_install) def index(request): """Serve configuration page.""" status = get_status() @@ -49,7 +44,8 @@ def index(request): form = ShaarliForm(initial=status, prefix='shaarli') return TemplateResponse(request, 'shaarli.html', - {'title': _('Bookmarks (Shaarli)'), + {'title': shaarli.title, + 'description': shaarli.description, 'status': status, 'form': form}) From ecad252653e0cff3cfee22fdb5e15cc81d86f95a Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 18:22:21 +0530 Subject: [PATCH 105/189] system: Use new setup mechanism --- plinth/modules/system/__init__.py | 27 ++++++++++++++++--- plinth/modules/system/templates/system.html | 24 +---------------- plinth/modules/system/urls.py | 2 +- plinth/modules/system/{system.py => views.py} | 12 +++------ 4 files changed, 29 insertions(+), 36 deletions(-) rename plinth/modules/system/{system.py => views.py} (73%) diff --git a/plinth/modules/system/__init__.py b/plinth/modules/system/__init__.py index ec0f9e62d..7b75d3976 100644 --- a/plinth/modules/system/__init__.py +++ b/plinth/modules/system/__init__.py @@ -19,8 +19,29 @@ Plinth module for system section page """ -from . import system -from .system import init +from django.utils.translation import ugettext_lazy as _ +from plinth import cfg +from plinth.utils import format_lazy -__all__ = ['system', 'init'] + +version = 1 + +is_essential = 1 + +title = _('System Configuration') + +description = [ + format_lazy( + _('Here you can administrate the underlying system of your ' + '{box_name}.'), box_name=_(cfg.box_name)), + + format_lazy( + _('The options affect the {box_name} at its most general level, ' + 'so be careful!'), box_name=_(cfg.box_name)) +] + + +def init(): + """Initialize the system module""" + cfg.main_menu.add_urlname(title, 'glyphicon-cog', 'system:index', 100) diff --git a/plinth/modules/system/templates/system.html b/plinth/modules/system/templates/system.html index e8c2a46f3..a60745d8f 100644 --- a/plinth/modules/system/templates/system.html +++ b/plinth/modules/system/templates/system.html @@ -1,4 +1,4 @@ -{% extends 'base.html' %} +{% extends 'app.html' %} {% comment %} # # This file is part of Plinth. @@ -17,25 +17,3 @@ # along with this program. If not, see . # {% endcomment %} - -{% load i18n %} - -{% block content %} - -

{% trans "System Configuration" %}

- -

- {% blocktrans trimmed %} - Here you can administrate the underlying system of your - {{ box_name }}. - {% endblocktrans %} -

- -

- {% blocktrans trimmed %} - The options affect the {{ box_name }} at its most general level, - so be careful! - {% endblocktrans %} -

- -{% endblock %} diff --git a/plinth/modules/system/urls.py b/plinth/modules/system/urls.py index aceecc21d..8e75a6af5 100644 --- a/plinth/modules/system/urls.py +++ b/plinth/modules/system/urls.py @@ -21,7 +21,7 @@ from django.conf.urls import url -from . import system as views +from . import views urlpatterns = [ diff --git a/plinth/modules/system/system.py b/plinth/modules/system/views.py similarity index 73% rename from plinth/modules/system/system.py rename to plinth/modules/system/views.py index c7a68b7f9..bc4dd1953 100644 --- a/plinth/modules/system/system.py +++ b/plinth/modules/system/views.py @@ -16,18 +16,12 @@ # from django.template.response import TemplateResponse -from django.utils.translation import ugettext_lazy as _ -from plinth import cfg - - -def init(): - """Initialize the system module""" - cfg.main_menu.add_urlname(_('System'), 'glyphicon-cog', 'system:index', - 100) +from plinth.modules import system def index(request): """Serve the index page""" return TemplateResponse(request, 'system.html', - {'title': _('System Configuration')}) + {'title': system.title, + 'description': system.description}) From ac558568ba26852573b2fddcdce8843dd36c04db Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 18:31:59 +0530 Subject: [PATCH 106/189] tor: Use new setup mechanism --- plinth/modules/tor/__init__.py | 29 ++++++++++++++++++++++++--- plinth/modules/tor/templates/tor.html | 17 ++-------------- plinth/modules/tor/views.py | 16 ++------------- 3 files changed, 30 insertions(+), 32 deletions(-) diff --git a/plinth/modules/tor/__init__.py b/plinth/modules/tor/__init__.py index 6933e9348..e12773198 100644 --- a/plinth/modules/tor/__init__.py +++ b/plinth/modules/tor/__init__.py @@ -20,7 +20,7 @@ """ import augeas -from django.utils.translation import ugettext as _ +from django.utils.translation import ugettext_lazy as _ import glob import itertools @@ -32,8 +32,21 @@ from plinth.signals import domain_added +version = 1 + depends = ['apps', 'names'] +title = _('Anonymity Network (Tor)') + +description = [ + _('Tor is an anonymous communication system. You can learn more ' + 'about it from the Tor ' + 'Project website. For best protection when web surfing, the ' + 'Tor Project recommends that you use the ' + '' + 'Tor Browser.') +] + socks_service = None bridge_service = None @@ -45,8 +58,7 @@ def init(): """Initialize the module.""" menu = cfg.main_menu.get('apps:index') - menu.add_urlname(_('Anonymity Network (Tor)'), 'glyphicon-eye-close', - 'tor:index', 100) + menu.add_urlname(title, 'glyphicon-eye-close', 'tor:index', 100) global socks_service socks_service = service_module.Service( @@ -77,6 +89,17 @@ def init(): services=hs_services) +def setup(helper, old_version=None): + """Install and configure the module.""" + helper.install(['tor', 'tor-geoipdb', 'torsocks', 'obfs4proxy', + 'apt-transport-tor']) + helper.call('post', actions.superuser_run, 'tor', ['setup']) + helper.call('post', actions.superuser_run, 'tor', + ['configure', '--apt-transport-tor', 'enable']) + helper.call('post', socks_service.notify_enabled, None, True) + helper.call('post', bridge_service.notify_enabled, None, True) + + def is_enabled(): """Return whether the module is enabled.""" return action_utils.service_is_enabled('tor') diff --git a/plinth/modules/tor/templates/tor.html b/plinth/modules/tor/templates/tor.html index 2b1b0f07e..9b6db3ed5 100644 --- a/plinth/modules/tor/templates/tor.html +++ b/plinth/modules/tor/templates/tor.html @@ -1,4 +1,4 @@ -{% extends "base.html" %} +{% extends "app.html" %} {% comment %} # # This file is part of Plinth. @@ -30,20 +30,7 @@ {% endblock %} -{% block content %} - -

{% trans "Anonymity Network (Tor)" %}

- -

- {% blocktrans trimmed %} - Tor is an anonymous communication system. You can learn more - about it from the Tor - Project website. For best protection when web surfing, the - Tor Project recommends that you use the - - Tor Browser. - {% endblocktrans %} -

+{% block configuration %}

{% trans "Status" %}

diff --git a/plinth/modules/tor/views.py b/plinth/modules/tor/views.py index 120e42133..58e513a1f 100644 --- a/plinth/modules/tor/views.py +++ b/plinth/modules/tor/views.py @@ -25,7 +25,6 @@ from .forms import TorForm from plinth import actions -from plinth import package from plinth.errors import ActionError from plinth.modules import tor from plinth.modules.names import SERVICES @@ -34,18 +33,6 @@ config_process = None -def on_install(): - """Setup Tor configuration as soon as it is installed.""" - actions.superuser_run('tor', ['setup']) - actions.superuser_run('tor', - ['configure', '--apt-transport-tor', 'enable']) - tor.socks_service.notify_enabled(None, True) - tor.bridge_service.notify_enabled(None, True) - - -@package.required(['tor', 'tor-geoipdb', 'torsocks', 'obfs4proxy', - 'apt-transport-tor'], - on_install=on_install) def index(request): """Serve configuration page.""" if config_process: @@ -65,7 +52,8 @@ def index(request): form = TorForm(initial=status, prefix='tor') return TemplateResponse(request, 'tor.html', - {'title': _('Tor Control Panel'), + {'title': tor.title, + 'description': tor.description, 'status': status, 'config_running': bool(config_process), 'form': form}) From 065d6c4c0a2e73ae14dd0af73cf7e281784fc6b1 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 18:45:17 +0530 Subject: [PATCH 107/189] transmission: Use new setup mechanism --- plinth/modules/transmission/__init__.py | 32 ++++++++++++++++--- .../transmission/templates/transmission.html | 14 ++------ plinth/modules/transmission/views.py | 15 ++------- 3 files changed, 32 insertions(+), 29 deletions(-) diff --git a/plinth/modules/transmission/__init__.py b/plinth/modules/transmission/__init__.py index 4206c1985..aed1380ed 100644 --- a/plinth/modules/transmission/__init__.py +++ b/plinth/modules/transmission/__init__.py @@ -20,27 +20,51 @@ """ from django.utils.translation import ugettext_lazy as _ +import json +from plinth import actions from plinth import action_utils from plinth import cfg from plinth import service as service_module +version = 1 + depends = ['apps'] +title = _('BitTorrent (Transmission)') + +description = [ + _('BitTorrent is a peer-to-peer file sharing protocol. ' + 'Transmission daemon handles Bitorrent file sharing. Note that ' + 'BitTorrent is not anonymous.') +] + service = None def init(): """Intialize the Transmission module.""" menu = cfg.main_menu.get('apps:index') - menu.add_urlname(_('BitTorrent (Transmission)'), 'glyphicon-save', - 'transmission:index', 300) + menu.add_urlname(title, 'glyphicon-save', 'transmission:index', 300) global service service = service_module.Service( - 'transmission', _('Transmission BitTorrent'), ['http', 'https'], - is_external=True, enabled=is_enabled()) + 'transmission', title, ['http', 'https'], is_external=True, + enabled=is_enabled()) + + +def setup(helper, old_version=None): + """Install and configure the module.""" + helper.install(['transmission-daemon']) + + new_configuration = {'rpc-whitelist-enabled': False} + helper.call('post', actions.superuser_run, 'transmission', + ['merge-configuration'], + input=json.dumps(new_configuration).encode()) + + helper.call('post', actions.superuser_run, 'transmission', ['enable']) + helper.call('post', service.notify_enabled, None, True) def is_enabled(): diff --git a/plinth/modules/transmission/templates/transmission.html b/plinth/modules/transmission/templates/transmission.html index de67c4908..0adf4648f 100644 --- a/plinth/modules/transmission/templates/transmission.html +++ b/plinth/modules/transmission/templates/transmission.html @@ -1,4 +1,4 @@ -{% extends "base.html" %} +{% extends "app.html" %} {% comment %} # # This file is part of Plinth. @@ -21,17 +21,7 @@ {% load bootstrap %} {% load i18n %} -{% block content %} - -

{% trans "BitTorrent (Transmission)" %}

- -

- {% blocktrans trimmed %} - BitTorrent is a peer-to-peer file sharing protocol. - Transmission daemon handles Bitorrent file sharing. Note that - BitTorrent is not anonymous. - {% endblocktrans %} -

+{% block configuration %}

{% blocktrans trimmed %} diff --git a/plinth/modules/transmission/views.py b/plinth/modules/transmission/views.py index 213e69da8..c65c81013 100644 --- a/plinth/modules/transmission/views.py +++ b/plinth/modules/transmission/views.py @@ -28,7 +28,6 @@ from .forms import TransmissionForm from plinth import actions -from plinth import package from plinth.modules import transmission logger = logging.getLogger(__name__) @@ -36,17 +35,6 @@ TRANSMISSION_CONFIG = '/etc/transmission-daemon/settings.json' -def on_install(): - """Enable transmission as soon as it is installed.""" - new_configuration = {'rpc-whitelist-enabled': False} - actions.superuser_run('transmission', ['merge-configuration'], - input=json.dumps(new_configuration).encode()) - - actions.superuser_run('transmission', ['enable']) - transmission.service.notify_enabled(None, True) - - -@package.required(['transmission-daemon'], on_install=on_install) def index(request): """Serve configuration page.""" status = get_status() @@ -64,7 +52,8 @@ def index(request): form = TransmissionForm(initial=status, prefix='transmission') return TemplateResponse(request, 'transmission.html', - {'title': _('BitTorrent (Transmission)'), + {'title': transmission.title, + 'description': transmission.description, 'status': status, 'form': form}) From b5ccada3a6da405f0fd4b173be90c1848e92c408 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 18:55:46 +0530 Subject: [PATCH 108/189] upgrades: Use new setup mechanism --- plinth/modules/upgrades/__init__.py | 22 +++++++++++++++++-- .../modules/upgrades/templates/upgrades.html | 14 ++---------- .../templates/upgrades_configure.html | 6 ++--- plinth/modules/upgrades/views.py | 18 +++++---------- 4 files changed, 30 insertions(+), 30 deletions(-) diff --git a/plinth/modules/upgrades/__init__.py b/plinth/modules/upgrades/__init__.py index 2e5110a16..795b88e1b 100644 --- a/plinth/modules/upgrades/__init__.py +++ b/plinth/modules/upgrades/__init__.py @@ -21,14 +21,32 @@ from django.utils.translation import ugettext_lazy as _ +from plinth import actions from plinth import cfg +version = 1 + +is_essential = 1 + depends = ['system'] +title = _('Software Upgrades') + +description = [ + _('Upgrades install the latest software and security updates. When ' + 'automatic upgrades are enabled, upgrades are automatically run every ' + 'night. You don\'t normally need to start the upgrade process.') +] + def init(): """Initialize the module.""" menu = cfg.main_menu.get('system:index') - menu.add_urlname(_('Software Upgrades'), 'glyphicon-refresh', - 'upgrades:index', 21) + menu.add_urlname(title, 'glyphicon-refresh', 'upgrades:index', 21) + + +def setup(helper, old_version=None): + """Install and configure the module.""" + helper.install(['unattended-upgrades']) + helper.call('post', actions.superuser_run, 'upgrades', ['enable-auto']) diff --git a/plinth/modules/upgrades/templates/upgrades.html b/plinth/modules/upgrades/templates/upgrades.html index 15b0167b2..4cc47be98 100644 --- a/plinth/modules/upgrades/templates/upgrades.html +++ b/plinth/modules/upgrades/templates/upgrades.html @@ -1,4 +1,4 @@ -{% extends 'base.html' %} +{% extends 'app.html' %} {% comment %} # # This file is part of Plinth. @@ -29,17 +29,7 @@ {% endblock %} -{% block content %} - -

{{ title }}

- -

- {% blocktrans trimmed %} - Upgrades install the latest software and security updates. When automatic - upgrades are enabled, upgrades are automatically run every night. You - don't normally need to start the upgrade process. - {% endblocktrans %} -

+{% block configuration %}

{% blocktrans trimmed %} diff --git a/plinth/modules/upgrades/templates/upgrades_configure.html b/plinth/modules/upgrades/templates/upgrades_configure.html index 1ee94ec32..4a4e1c3fe 100644 --- a/plinth/modules/upgrades/templates/upgrades_configure.html +++ b/plinth/modules/upgrades/templates/upgrades_configure.html @@ -1,4 +1,4 @@ -{% extends "base.html" %} +{% extends "app.html" %} {% comment %} # # This file is part of Plinth. @@ -21,9 +21,7 @@ {% load bootstrap %} {% load i18n %} -{% block content %} - -

{{ title }}

+{% block configuration %} {% csrf_token %} diff --git a/plinth/modules/upgrades/views.py b/plinth/modules/upgrades/views.py index d08d6f291..81b0a4ba3 100644 --- a/plinth/modules/upgrades/views.py +++ b/plinth/modules/upgrades/views.py @@ -21,16 +21,14 @@ from django.contrib import messages from django.core.urlresolvers import reverse_lazy -from django.shortcuts import redirect from django.template.response import TemplateResponse from django.utils.translation import ugettext as _, ugettext_lazy -from django.views.decorators.http import require_POST import subprocess from .forms import ConfigureForm from plinth import actions -from plinth import package from plinth.errors import ActionError +from plinth.modules import upgrades subsubmenu = [{'url': reverse_lazy('upgrades:index'), 'text': ugettext_lazy('Automatic Upgrades')}, @@ -41,12 +39,6 @@ LOCK_FILE = '/var/log/dpkg/lock' -def on_install(): - """Enable automatic upgrades after install.""" - actions.superuser_run('upgrades', ['enable-auto']) - - -@package.required(['unattended-upgrades'], on_install=on_install) def index(request): """Serve the configuration form.""" status = get_status() @@ -63,10 +55,12 @@ def index(request): form = ConfigureForm(initial=status, prefix='upgrades') return TemplateResponse(request, 'upgrades_configure.html', - {'title': _('Automatic Upgrades'), + {'title': upgrades.title, + 'description': upgrades.description, 'form': form, 'subsubmenu': subsubmenu}) + def is_package_manager_busy(): """Return whether a package manager is running.""" try: @@ -85,7 +79,6 @@ def get_log(): return None -@package.required(['unattended-upgrades'], on_install=on_install) def upgrade(request): """Serve the upgrade page.""" is_busy = is_package_manager_busy() @@ -99,7 +92,8 @@ def upgrade(request): messages.error(request, _('Starting upgrade failed.')) return TemplateResponse(request, 'upgrades.html', - {'title': _('Package Upgrades'), + {'title': upgrades.title, + 'description': upgrades.description, 'subsubmenu': subsubmenu, 'is_busy': is_busy, 'log': get_log()}) From bee0260af74e1263090442a12036451e8d024acc Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 18:58:01 +0530 Subject: [PATCH 109/189] users: Use new setup mechanism --- plinth/modules/users/__init__.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/plinth/modules/users/__init__.py b/plinth/modules/users/__init__.py index 7cb738071..b7c6c8ca1 100644 --- a/plinth/modules/users/__init__.py +++ b/plinth/modules/users/__init__.py @@ -25,14 +25,19 @@ from plinth import cfg from plinth import action_utils +version = 1 + +is_essential = True + depends = ['system'] +title = _('Users and Groups') + def init(): """Intialize the user module.""" menu = cfg.main_menu.get('system:index') - menu.add_urlname(_('Users and Groups'), 'glyphicon-user', 'users:index', - 15) + menu.add_urlname(title, 'glyphicon-user', 'users:index', 15) def diagnose(): From 30f0876c32ece47d90bc7497a1dd0b81d6c8e252 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 19:07:36 +0530 Subject: [PATCH 110/189] xmpp: Use new setup mechanism --- plinth/modules/xmpp/__init__.py | 42 ++++++++++++++++++++++--- plinth/modules/xmpp/templates/xmpp.html | 21 ++----------- plinth/modules/xmpp/views.py | 29 ++--------------- 3 files changed, 43 insertions(+), 49 deletions(-) diff --git a/plinth/modules/xmpp/__init__.py b/plinth/modules/xmpp/__init__.py index 65e8a3c19..1365f1d98 100644 --- a/plinth/modules/xmpp/__init__.py +++ b/plinth/modules/xmpp/__init__.py @@ -20,6 +20,8 @@ """ from django.utils.translation import ugettext_lazy as _ +import logging +import socket from plinth import actions from plinth import action_utils @@ -29,21 +31,35 @@ from plinth.signals import domainname_change +version = 1 + depends = ['apps'] +title = _('Chat Server (XMPP)') + +description = [ + _('XMPP is an open and standardized communication protocol. Here ' + 'you can run and configure your XMPP server, called ejabberd.'), + + _('To actually communicate, you can use the web ' + 'client or any other ' + 'XMPP client.') +] + service = None +logger = logging.getLogger(__name__) + def init(): """Initialize the XMPP module""" menu = cfg.main_menu.get('apps:index') - menu.add_urlname(_('Chat Server (XMPP)'), 'glyphicon-comment', - 'xmpp:index', 400) + menu.add_urlname(title, 'glyphicon-comment', 'xmpp:index', 400) global service service = service_module.Service( - 'xmpp', _('Chat Server (XMPP)'), - ['xmpp-client', 'xmpp-server', 'xmpp-bosh'], + 'xmpp', title, ['xmpp-client', 'xmpp-server', 'xmpp-bosh'], is_external=True, enabled=is_enabled()) pre_hostname_change.connect(on_pre_hostname_change) @@ -51,6 +67,18 @@ def init(): domainname_change.connect(on_domainname_change) +def setup(helper, old_version=None): + """Install and configure the module.""" + domainname = get_domainname() + logger.info('XMPP service domainname - %s', domainname) + + helper.call('pre', actions.superuser_run, 'xmpp', + ['pre-install', '--domainname', domainname]) + helper.install(['jwchat', 'ejabberd']) + helper.call('post', actions.superuser_run, 'xmpp', ['setup']) + helper.call('post', service.notify_enabled, None, True) + + def is_enabled(): """Return whether the module is enabled.""" return (action_utils.service_is_enabled('ejabberd') and @@ -62,6 +90,12 @@ def is_running(): return action_utils.service_is_running('ejabberd') +def get_domainname(): + """Return the domainname""" + fqdn = socket.getfqdn() + return '.'.join(fqdn.split('.')[1:]) + + def on_pre_hostname_change(sender, old_hostname, new_hostname, **kwargs): """ Backup ejabberd database before hostname is changed. diff --git a/plinth/modules/xmpp/templates/xmpp.html b/plinth/modules/xmpp/templates/xmpp.html index b0f3ac56b..31e387be2 100644 --- a/plinth/modules/xmpp/templates/xmpp.html +++ b/plinth/modules/xmpp/templates/xmpp.html @@ -1,4 +1,4 @@ -{% extends "base.html" %} +{% extends "app.html" %} {% comment %} # # This file is part of Plinth. @@ -21,24 +21,7 @@ {% load bootstrap %} {% load i18n %} -{% block content %} - -

{% trans "Chat Server (XMPP)" %}

- -

- {% blocktrans trimmed %} - XMPP is an open and standardized communication protocol. Here - you can run and configure your XMPP server, called ejabberd. - {% endblocktrans %} -

- -

- {% blocktrans trimmed %} - To actually communicate, you can use the web - client or any other XMPP client. - {% endblocktrans %} -

+{% block configuration %}

{% url 'config:index' as index_url %} diff --git a/plinth/modules/xmpp/views.py b/plinth/modules/xmpp/views.py index 817417177..ca1841535 100644 --- a/plinth/modules/xmpp/views.py +++ b/plinth/modules/xmpp/views.py @@ -23,39 +23,15 @@ from django.template.response import TemplateResponse from django.utils.translation import ugettext as _ import logging -import socket from .forms import XmppForm from plinth import actions -from plinth import package from plinth.modules import xmpp logger = logging.getLogger(__name__) -def get_domainname(): - """Return the domainname""" - fqdn = socket.getfqdn() - return '.'.join(fqdn.split('.')[1:]) - - -def before_install(): - """Preseed debconf values before the packages are installed.""" - domainname = get_domainname() - logger.info('XMPP service domainname - %s', domainname) - actions.superuser_run('xmpp', ['pre-install', '--domainname', domainname]) - - -def on_install(): - """Setup jwchat apache conf""" - actions.superuser_run('xmpp', ['setup']) - xmpp.service.notify_enabled(None, True) - - -@package.required(['jwchat', 'ejabberd'], - before_install=before_install, - on_install=on_install) def index(request): """Serve configuration page""" status = get_status() @@ -72,7 +48,8 @@ def index(request): form = XmppForm(initial=status, prefix='xmpp') return TemplateResponse(request, 'xmpp.html', - {'title': _('Chat Server (XMPP)'), + {'title': xmpp.title, + 'description': xmpp.description, 'status': status, 'form': form}) @@ -81,7 +58,7 @@ def get_status(): """Get the current settings.""" status = {'enabled': xmpp.is_enabled(), 'is_running': xmpp.is_running(), - 'domainname': get_domainname()} + 'domainname': xmpp.get_domainname()} return status From 60c4c17f94f9bc5f0a32553418a939e6330d7807 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sat, 13 Feb 2016 13:47:27 +0530 Subject: [PATCH 111/189] firstboot: Use new setup mechanism --- plinth/modules/first_boot/__init__.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plinth/modules/first_boot/__init__.py b/plinth/modules/first_boot/__init__.py index 558116da9..55d9941a0 100644 --- a/plinth/modules/first_boot/__init__.py +++ b/plinth/modules/first_boot/__init__.py @@ -18,3 +18,7 @@ """ Plinth module for first boot wizard """ + +version = 1 + +is_essential = True From 1f5fa31e53d9c52338139b7466e9899660c5b841 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 21:03:17 +0530 Subject: [PATCH 112/189] package: Remove old package installation methods --- plinth/package.py | 158 +------------------------- plinth/setup.py | 3 - plinth/templates/package_install.html | 94 --------------- plinth/views.py | 34 ------ 4 files changed, 2 insertions(+), 287 deletions(-) delete mode 100644 plinth/templates/package_install.html diff --git a/plinth/package.py b/plinth/package.py index 5a5f2ae3c..562aa0236 100644 --- a/plinth/package.py +++ b/plinth/package.py @@ -19,13 +19,9 @@ Framework for installing and updating distribution packages """ -from django.contrib import messages from django.utils.translation import ugettext as _ -import functools import logging -import threading -import plinth from plinth.utils import import_from_gi glib = import_from_gi('GLib', '2.0') packagekit = import_from_gi('PackageKitGlib', '1.0') @@ -55,15 +51,12 @@ def __str__(self): class Transaction(object): """Information about an ongoing transaction.""" - def __init__(self, package_names, before_install=None, on_install=None): + def __init__(self, package_names): """Initialize transaction object. Set most values to None until they are sent as progress update. """ self.package_names = package_names - # XXX: This is hack, remove after implementing proper setup mechanism. - self.before_install = before_install - self.on_install = on_install # Progress self.allow_cancel = None @@ -79,10 +72,6 @@ def __init__(self, package_names, before_install=None, on_install=None): self.download_size_remaining = None self.speed = None - # Completion - self.is_finished = False - self.exception = None - def get_id(self): """Return a identifier to use as a key in a map of transactions.""" return frozenset(self.package_names) @@ -94,43 +83,12 @@ def __str__(self): self.package_names, self.allow_cancel, self.status_string, self.percentage, self.package, self.item_progress) - def start_install_in_thread(self): - """Start a PackageKit transaction to install given list of packages. - - This operation is non-blocking at it spawns a new thread. - """ - thread = threading.Thread(target=self.install) - thread.start() - def install(self): """Run a PackageKit transaction to install given packages.""" - try: - if self.before_install: - self.before_install() - except Exception as exception: - logger.exception('Error during setup before install - %s', - exception) - self.finish(exception) - return - try: self._do_install() - except PackageException as exception: - self.finish(exception) - return except glib.Error as exception: - self.finish(PackageException(exception.message)) - return - - try: - if self.on_install: - self.on_install() - except Exception as exception: - logger.exception('Error during setup - %s', exception) - self.finish(exception) - return - - self.finish() + raise PackageException(exception.message) def _do_install(self): """Run a PackageKit transaction to install given packages. @@ -208,115 +166,3 @@ def progress_callback(self, progress, progress_type, user_data): else: logger.info('Unhandle packagekit progress callback - %s, %s', progress, progress_type) - - def finish(self, exception=None): - """Mark transaction as complected and store exception if any.""" - self.is_finished = True - self.exception = exception - - def collect_result(self): - """Retrieve the result of this transaction. - - Also remove self from global transactions list. - """ - assert self.is_finished - - del transactions[self.get_id()] - return self.exception - - -def required(package_names, before_install=None, on_install=None): - """Decorate a view to check and install required packages.""" - - def wrapper2(func): - """Return a function to check and install packages.""" - - @functools.wraps(func) - def wrapper(request, *args, **kwargs): - """Check and install packages required by a view.""" - if not _should_show_install_view(request, package_names): - return func(request, *args, **kwargs) - - view = plinth.views.PackageInstallView.as_view() - return view(request, package_names=package_names, - before_install=before_install, on_install=on_install, - *args, **kwargs) - - return wrapper - - return wrapper2 - - -def _should_show_install_view(request, package_names): - """Return whether the installation view should be shown.""" - transaction_id = frozenset(package_names) - - # No transaction in progress - if transaction_id not in transactions: - is_installed = check_installed(package_names) - return not is_installed - - # Installing - transaction = transactions[transaction_id] - if not transaction.is_finished: - return True - - # Transaction finished, waiting to show the result - exception = transaction.collect_result() - if not exception: - messages.success(request, - _('Installed and configured packages successfully.')) - return False - else: - error_string = getattr(exception, 'error_string', str(exception)) - error_details = getattr(exception, 'error_details', '') - messages.error(request, _('Error installing packages: {string} {details}') - .format(string=error_string, details=error_details)) - return True - - -def check_installed(package_names): - """Return a boolean installed status of package. - - This operation is blocking and waits until the check is finished. - """ - def _callback(progress, progress_type, user_data): - """Process progress updates on package resolve operation.""" - pass - - client = packagekit.Client() - response = client.resolve(packagekit.FilterEnum.INSTALLED, - tuple(package_names) + (None, ), None, - _callback, None) - - installed_package_names = [] - for package in response.get_package_array(): - if package.get_info() == packagekit.InfoEnum.INSTALLED: - installed_package_names.append(package.get_name()) - - packages_resolved[package.get_name()] = package - - # When package names could not be resolved - for package_name in package_names: - if package_name not in packages_resolved: - packages_resolved[package_name] = None - - return set(installed_package_names) == set(package_names) - - -def is_installing(package_names): - """Return whether a set of packages are currently being installed.""" - return frozenset(package_names) in transactions - - -def start_install(package_names, before_install=None, on_install=None): - """Start a PackageKit transaction to install given list of packages. - - This operation is non-blocking at it spawns a new thread. - """ - transaction = Transaction(package_names, - before_install=before_install, - on_install=on_install) - transactions[frozenset(package_names)] = transaction - - transaction.start_install_in_thread() diff --git a/plinth/setup.py b/plinth/setup.py index 2ade51021..c8fd747d2 100644 --- a/plinth/setup.py +++ b/plinth/setup.py @@ -98,9 +98,6 @@ def install(self, package_names): } transaction.install() - if transaction.exception: - logger.error('Error running install - %s', transaction.exception) - raise transaction.exception def call(self, step, method, *args, **kwargs): """Call an arbitrary method during setup and note down its stage.""" diff --git a/plinth/templates/package_install.html b/plinth/templates/package_install.html deleted file mode 100644 index 7df7bb8c6..000000000 --- a/plinth/templates/package_install.html +++ /dev/null @@ -1,94 +0,0 @@ -{% extends "base.html" %} -{% comment %} -# -# This file is part of Plinth. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -{% endcomment %} - -{% load bootstrap %} -{% load i18n %} - -{% block page_head %} - - {% if is_installing %} - - {% endif %} - -{% endblock %} - - -{% block content %} - -

{% trans "Installation" %}

- - {% if not is_installing %} - -

- {% blocktrans trimmed %} - This feature requires addtional packages to be installed. Do - you wish to install them? - {% endblocktrans %} -

- - - - - - - - - - {% for package_name, package in packages.items %} - - - - - {% endfor %} - -
{% trans "Package" %}{% trans "Summary" %}
{{ package_name }}{{ package.get_summary }}
- - - {% csrf_token %} - - - - - {% else %} - - {% for key, transaction in transactions.items %} -
- {% blocktrans trimmed with package_names=transaction.package_names|join:", " status=transaction.status_string %} - Installing {{ package_names }}: {{ status }} - {% endblocktrans %} -
-
-
- - {% blocktrans trimmed with percentage=transaction.percentage %} - {{ percentage }}% complete - {% endblocktrans %} - -
-
- {% endfor %} - - {% endif %} - -{% endblock %} diff --git a/plinth/views.py b/plinth/views.py index 8cee96adf..a5b9a7680 100644 --- a/plinth/views.py +++ b/plinth/views.py @@ -24,46 +24,12 @@ from django.views.generic import TemplateView import time -from plinth import package as package_module - def index(request): """Serve the main index page.""" return HttpResponseRedirect(reverse('apps:index')) -class PackageInstallView(TemplateView): - """View to prompt and install packages.""" - template_name = 'package_install.html' - - def get_context_data(self, **kwargs): - """Return the context data rendering the template.""" - context = super(PackageInstallView, self).get_context_data(**kwargs) - - if 'packages_names' not in context: - context['package_names'] = self.kwargs.get('package_names', []) - context['packages'] = { - package_name: package_module.packages_resolved[package_name] - for package_name in context['package_names']} - context['is_installing'] = \ - package_module.is_installing(context['package_names']) - context['transactions'] = package_module.transactions - - return context - - def post(self, *args, **kwargs): - """Handle installing packages - - Start the package installation, and refresh the page every x seconds to - keep displaying PackageInstallView.get() with the installation status. - """ - package_module.start_install( - self.kwargs['package_names'], - before_install=self.kwargs.get('before_install'), - on_install=self.kwargs.get('on_install')) - return self.render_to_response(self.get_context_data()) - - class SetupView(TemplateView): """View to prompt and setup applications.""" template_name = 'setup.html' From 55cabdaa2e7b15ad20280952ec42436c0fe513ba Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sat, 13 Feb 2016 12:36:51 +0530 Subject: [PATCH 113/189] package: Better error handling --- plinth/package.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plinth/package.py b/plinth/package.py index 562aa0236..8a46401ca 100644 --- a/plinth/package.py +++ b/plinth/package.py @@ -88,7 +88,7 @@ def install(self): try: self._do_install() except glib.Error as exception: - raise PackageException(exception.message) + raise PackageException(exception.message) from exception def _do_install(self): """Run a PackageKit transaction to install given packages. From e0c06e3be58cffb76c87768c0ed7d4167f1b5a3e Mon Sep 17 00:00:00 2001 From: Dietmar Date: Fri, 12 Feb 2016 18:31:39 +0100 Subject: [PATCH 114/189] Translated using Weblate (German) Currently translated at 100.0% (569 of 569 strings) --- plinth/locale/de/LC_MESSAGES/django.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plinth/locale/de/LC_MESSAGES/django.po b/plinth/locale/de/LC_MESSAGES/django.po index dd1fd6617..d3bb88715 100644 --- a/plinth/locale/de/LC_MESSAGES/django.po +++ b/plinth/locale/de/LC_MESSAGES/django.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-01-31 22:19+0530\n" -"PO-Revision-Date: 2016-02-05 22:11+0000\n" +"PO-Revision-Date: 2016-02-12 18:31+0000\n" "Last-Translator: Dietmar \n" "Language-Team: German " "\n" @@ -423,7 +423,7 @@ msgstr "Diagnose" #: plinth/modules/diagnostics/diagnostics.py:55 msgid "System Diagnostics" -msgstr "System Diagnose" +msgstr "System-Diagnose" #: plinth/modules/diagnostics/diagnostics.py:78 msgid "Diagnostic Test" From b788358022d5320e79276a5761728e4e7a143fd2 Mon Sep 17 00:00:00 2001 From: Dietmar Date: Sat, 13 Feb 2016 10:11:47 +0100 Subject: [PATCH 115/189] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (568 of 568 strings) --- plinth/locale/nb/LC_MESSAGES/django.po | 27 +++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/plinth/locale/nb/LC_MESSAGES/django.po b/plinth/locale/nb/LC_MESSAGES/django.po index 18b4d1941..b47c04a8c 100644 --- a/plinth/locale/nb/LC_MESSAGES/django.po +++ b/plinth/locale/nb/LC_MESSAGES/django.po @@ -16,15 +16,16 @@ msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-02-07 11:29+0530\n" -"PO-Revision-Date: 2016-02-04 17:12+0000\n" -"Last-Translator: Ingrid Yrvin \n" -"Language-Team: Norwegian Bokmål (http://www.transifex.com/freedombox/plinth/" -"language/nb/)\n" +"PO-Revision-Date: 2016-02-13 10:11+0000\n" +"Last-Translator: Dietmar \n" +"Language-Team: Norwegian Bokmål " +"\n" "Language: nb\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 2.5-dev\n" #: plinth/action_utils.py:203 #, python-brace-format @@ -532,10 +533,10 @@ msgid "" "Internet IP. The URL should simply return the IP where the client comes from " "(example: http://myip.datasystems24.de)." msgstr "" -"Valgfri verdi. Hvis ditt {box_name} ikke er koblet direkte til Internett " -"(dvs. koblet til en NAT-ruter), blir denne nettadressen brukt til å finne " -"den virkelige Internett-IP-en. Nettadressen skal bare returnere IP-en som " -"tjeneren kommer fra (eksempelvis: http://myip.datasystems24.de). " +"Valgfri verdi. Hvis ditt {box_name} ikke er koblet direkte til Internett (" +"dvs. koblet til en NAT-ruter), blir denne nettadressen brukt til å finne den " +"virkelige Internett-IP-en. Nettadressen skal bare returnere IP-en som " +"tjeneren kommer fra (eksempelvis: http://myip.datasystems24.de)." #: plinth/modules/dynamicdns/dynamicdns.py:104 msgid "" @@ -2460,10 +2461,10 @@ msgid "" "\"https://f-droid.org/repository/browse/?fdid=com.csipsimple\"> CSipSimple (for Android phones)." msgstr "" -" Til SIP-samtaler, trengs et klientprogram. Tilgjengelige klienter omfatter " -"Jitsi (for datamaskiner) og CSipSimple (for Android telefoner)." +"Til SIP-samtaler, trengs et klientprogram. Tilgjengelige klienter omfatter <" +"a href=\"https://jitsi.org/\">Jitsi (for datamaskiner) og CSipSimple " +"(for Android telefoner)." #: plinth/modules/repro/templates/repro.html:48 msgid "" From 531ec960e4c10bafac457682cf1bd206cef27087 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Mon, 15 Feb 2016 09:36:04 +0530 Subject: [PATCH 116/189] owncloud: Add packages for external storage The two packages are required when External Storage plugin in ownCloud is enabled. Since this has been a frequently asked question, add it to the dependencies list. --- plinth/modules/owncloud/owncloud.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plinth/modules/owncloud/owncloud.py b/plinth/modules/owncloud/owncloud.py index 249054dbb..f510965d6 100644 --- a/plinth/modules/owncloud/owncloud.py +++ b/plinth/modules/owncloud/owncloud.py @@ -58,8 +58,8 @@ def on_install(): service.notify_enabled(None, True) -@package.required(['postgresql', 'php5-pgsql', 'owncloud'], - on_install=on_install) +@package.required(['postgresql', 'php5-pgsql', 'owncloud', 'php-dropbox', + 'php-google-api-php-client'], on_install=on_install) def index(request): """Serve the ownCloud configuration page""" status = get_status() From aff5e102a5eebf1067b7dacf779626c9364976da Mon Sep 17 00:00:00 2001 From: the29a Date: Sun, 14 Feb 2016 08:36:08 +0100 Subject: [PATCH 117/189] Translated using Weblate (Russian) Currently translated at 98.0% (557 of 568 strings) --- plinth/locale/ru/LC_MESSAGES/django.po | 952 +++++++++++++++---------- 1 file changed, 595 insertions(+), 357 deletions(-) diff --git a/plinth/locale/ru/LC_MESSAGES/django.po b/plinth/locale/ru/LC_MESSAGES/django.po index 4d074ea63..425280d4f 100644 --- a/plinth/locale/ru/LC_MESSAGES/django.po +++ b/plinth/locale/ru/LC_MESSAGES/django.po @@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-02-06 14:44+0530\n" -"PO-Revision-Date: 2016-02-06 14:27+0000\n" -"Last-Translator: Алексей «Forgotten Woods» Доку \n" +"PO-Revision-Date: 2016-02-14 08:36+0000\n" +"Last-Translator: the29a \n" "Language-Team: Russian " "\n" "Language: ru\n" @@ -33,12 +33,12 @@ msgstr "Слушать порт {port} на {kind}" #: plinth/action_utils.py:287 #, python-brace-format msgid "Access URL {url} on tcp{kind}" -msgstr "" +msgstr "Доступ к URL {url} по tcp {kind}" #: plinth/action_utils.py:290 #, python-brace-format msgid "Access URL {url}" -msgstr "" +msgstr "Доступ к URL {url}" #: plinth/action_utils.py:321 #, python-brace-format @@ -52,7 +52,7 @@ msgstr "Невозможно подключиться к {host}{port}" #: plinth/context_processors.py:36 msgid "FreedomBox" -msgstr "FreedomBox" +msgstr "FrеedomBox" #: plinth/modules/apps/apps.py:26 msgid "Apps" @@ -363,11 +363,11 @@ msgstr "Смена часового пояса" #: plinth/modules/deluge/__init__.py:38 plinth/modules/deluge/views.py:56 msgid "BitTorrent (Deluge)" -msgstr "" +msgstr "БитТоррент (Deluge)" #: plinth/modules/deluge/__init__.py:43 msgid "Deluge BitTorrent" -msgstr "" +msgstr "Deluge БитТоррент" #: plinth/modules/deluge/forms.py:29 msgid "Enable Deluge" @@ -522,7 +522,7 @@ msgid "" "Leave this field empty if you want to keep your previous configured password." msgstr "" "Оставьте это поле пустым, если вы хотите сохранить ваш предыдущий " -"настроенный пароль" +"настроенный пароль." #: plinth/modules/dynamicdns/dynamicdns.py:96 #, fuzzy, python-brace-format @@ -541,7 +541,7 @@ msgstr "" msgid "" "You should have been requested to select a username when you created the " "account." -msgstr "" +msgstr "Вы должны выбрать имя пользователя для создания учетной записи." #: plinth/modules/dynamicdns/dynamicdns.py:115 msgid "Enable Dynamic DNS" @@ -667,7 +667,7 @@ msgid "" "add port forwarding (i.e. forward some standard ports like 80 and 443)." msgstr "" "Если ваш %(box_name)s) подключен за NAT-маршрутизатором, не забудьте " -"добавить перенаправление портов (например, стандартные 80 или 443)" +"добавить перенаправление портов (например, стандартные 80 или 443)." #: plinth/modules/dynamicdns/templates/dynamicdns_configure.html:30 msgid "" @@ -711,7 +711,7 @@ msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:48 msgid "Last update" -msgstr "Последнее обновление:" +msgstr "Последнее обновление" #: plinth/modules/firewall/firewall.py:39 #: plinth/modules/firewall/firewall.py:49 @@ -838,7 +838,7 @@ msgstr "" #: plinth/modules/first_boot/templates/firstboot_state1.html:57 msgid "Box it up!" -msgstr "" +msgstr "Box-it up!" #: plinth/modules/first_boot/templates/firstboot_state10.html:29 msgid "Setup Complete!" @@ -980,6 +980,8 @@ msgid "" "The %(box_name)s Manual is the best place to " "start for information regarding %(box_name)s." msgstr "" +"Руководство %(box_name)s это лучшее место для " +"получения информации о %(box_name)s." #: plinth/modules/help/templates/help_index.html:36 #, python-format @@ -987,6 +989,8 @@ msgid "" " " "%(box_name)s project wiki contains further information." msgstr "" +"Вики проекта %(box_name)s содержит исчерпывающую информацию." #: plinth/modules/help/templates/help_index.html:43 #, python-format @@ -996,6 +1000,10 @@ msgid "" "\"> mailing list. The list archives also contain information about " "problems faced by other users and possible solutions." msgstr "" +"Если вам нужна помощь сообщества %(box_name)s, вопросы можно задавать в " +"списке рассылок Архивный лист так же содержит информацию о " +"проблемах и возможных путях решения." #: plinth/modules/help/templates/help_index.html:53 #, python-format @@ -1005,146 +1013,154 @@ msgid "" "oftc.net/?randomnick=1&channels=freedombox&prompt=1\"> #freedombox " "channel using the IRC web interface." msgstr "" +"Множество разработчиков и пользователей %(box_name)s так же доступны в IRC " +"сети irc.oftc.net. Подключайтесь и спросите помощи на канале " +"#freedombox используя веб-интерфейс." #: plinth/modules/ikiwiki/__init__.py:38 msgid "Wiki and Blog (ikiwiki)" -msgstr "" +msgstr "Вики и Блог (ikiwiki)" #: plinth/modules/ikiwiki/__init__.py:43 msgid "ikiwiki wikis and blogs" -msgstr "" +msgstr "ikiwiki вики и блоги" #: plinth/modules/ikiwiki/forms.py:29 msgid "Enable ikiwiki" -msgstr "" +msgstr "Включить ikiwiki" #: plinth/modules/ikiwiki/forms.py:36 #: plinth/modules/networks/templates/connection_show.html:98 msgid "Type" -msgstr "" +msgstr "Тип" #: plinth/modules/ikiwiki/forms.py:39 #: plinth/modules/networks/templates/connection_show.html:78 msgid "Name" -msgstr "" +msgstr "Имя" #: plinth/modules/ikiwiki/forms.py:41 msgid "Admin Account Name" -msgstr "" +msgstr "Имя учетной записи администратора" #: plinth/modules/ikiwiki/forms.py:44 msgid "Admin Account Password" -msgstr "" +msgstr "Пароль учетной записи администратора" #: plinth/modules/ikiwiki/templates/ikiwiki.html:27 msgid "" "When enabled, the blogs and wikis will be available from /ikiwiki." msgstr "" +"Когда включен, блоги и вики-сайты будут доступны на /ikiwiki." #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:27 #, python-format msgid "Delete Wiki or Blog %(name)s" -msgstr "" +msgstr "Удалить Вики или Блог %(name)s" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:33 msgid "" "This action will remove all the posts, pages and comments including revision " "history. Delete this wiki or blog permanently?" msgstr "" +"Это действие приведет к удалению всех постов, страниц и комментариев, " +"включая историю изменений. Окончательно удалить это вики или блог?" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:44 #, python-format msgid "Delete %(name)s" -msgstr "" +msgstr "Удаление %(name)s" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:47 #: plinth/modules/monkeysphere/templates/monkeysphere.html:60 #: plinth/modules/networks/templates/connections_delete.html:41 #: plinth/modules/users/templates/users_delete.html:41 msgid "Cancel" -msgstr "" +msgstr "Отмена" #: plinth/modules/ikiwiki/templates/ikiwiki_manage.html:41 msgid "No wikis or blogs available." -msgstr "" +msgstr "Нет доступных вики или блогов." #: plinth/modules/ikiwiki/templates/ikiwiki_manage.html:45 msgid "Create a Wiki or Blog" -msgstr "" +msgstr "Создать Вики или Блог" #: plinth/modules/ikiwiki/templates/ikiwiki_manage.html:55 #, python-format msgid "Delete site %(site)s" -msgstr "" +msgstr "Удаление узла %(site)s" #: plinth/modules/ikiwiki/templates/ikiwiki_manage.html:61 #, python-format msgid "Go to site %(site)s" -msgstr "" +msgstr "Перейти к %(site)s" #: plinth/modules/ikiwiki/views.py:38 msgid "Manage" -msgstr "" +msgstr "Управление" #: plinth/modules/ikiwiki/views.py:40 msgid "Create" -msgstr "" +msgstr "Создать" #: plinth/modules/ikiwiki/views.py:73 msgid "Wiki and Blog" -msgstr "" +msgstr "Вики и Блог" #: plinth/modules/ikiwiki/views.py:106 msgid "Manage Wikis and Blogs" -msgstr "" +msgstr "Управление Блогами и Вики" #: plinth/modules/ikiwiki/views.py:132 msgid "Create Wiki or Blog" -msgstr "" +msgstr "Создать Блог или Вики" #: plinth/modules/ikiwiki/views.py:145 #, python-brace-format msgid "Created wiki {name}." -msgstr "" +msgstr "Создать вики {name}." #: plinth/modules/ikiwiki/views.py:147 #, python-brace-format msgid "Could not create wiki: {error}" -msgstr "" +msgstr "Не удалось создать вики: {error}" #: plinth/modules/ikiwiki/views.py:159 #, python-brace-format msgid "Created blog {name}." -msgstr "" +msgstr "Созданный блог {name}." #: plinth/modules/ikiwiki/views.py:161 #, python-brace-format msgid "Could not create blog: {error}" -msgstr "" +msgstr "Не удалось создать блог: {error}" #: plinth/modules/ikiwiki/views.py:174 #, python-brace-format msgid "{name} deleted." -msgstr "" +msgstr "{name} удален." #: plinth/modules/ikiwiki/views.py:176 #, python-brace-format msgid "Could not delete {name}: {error}" -msgstr "" +msgstr "Не удалось удалить {name}: {error}" #: plinth/modules/ikiwiki/views.py:182 msgid "Delete Wiki or Blog" -msgstr "" +msgstr "Удаление блога или вики" #: plinth/modules/letsencrypt/__init__.py:43 #: plinth/modules/letsencrypt/templates/letsencrypt.html:38 #: plinth/modules/letsencrypt/views.py:45 msgid "Certificates (Let's Encrypt)" -msgstr "" +msgstr "Сертификаты (Let's Encrypt)" #: plinth/modules/letsencrypt/templates/letsencrypt.html:41 -#, python-format +#, fuzzy, python-format msgid "" "A digital certficate allows users of a web service to verify the identity of " "the service and to securely communicate with it. %(box_name)s can " @@ -1152,6 +1168,10 @@ msgid "" "domain. It does so by proving itself to be the owner of a domain to Let's " "Encrypt, a certficate authority (CA)." msgstr "" +"Цифровой сертификат позволяет пользователям веб-сервиса проверять " +"идентичность службы и безопасно взаимодействовать с ней. %(box_name)s может " +"автоматически получать и устанавливать цифровые сертификаты для каждого " +"доступного домена." #: plinth/modules/letsencrypt/templates/letsencrypt.html:52 msgid "" @@ -1160,71 +1180,75 @@ msgid "" "read and agree with the Let's Encrypt Subscriber Agreement before using this service." msgstr "" +"Let's Encrypt это свободная, автоматизированная и открытая сертификация, " +"запущенная на благо общественности группой nternet Security Research Group " +"(ISRG). Пожалуйста, прочитайте Let's Encrypt Subscriber Agreemen перед использованием этой службы." #: plinth/modules/letsencrypt/templates/letsencrypt.html:66 #: plinth/modules/monkeysphere/templates/monkeysphere.html:70 msgid "Domain" -msgstr "" +msgstr "Домен" #: plinth/modules/letsencrypt/templates/letsencrypt.html:67 msgid "Certificate Status" -msgstr "" +msgstr "Статус сертификата" #: plinth/modules/letsencrypt/templates/letsencrypt.html:68 msgid "Website Security" -msgstr "" +msgstr "Безопасность Веб-сайта" #: plinth/modules/letsencrypt/templates/letsencrypt.html:69 #: plinth/modules/monkeysphere/templates/monkeysphere.html:72 msgid "Actions" -msgstr "" +msgstr "Действия" #: plinth/modules/letsencrypt/templates/letsencrypt.html:79 #, python-format msgid "Expires on %(expiry_date)s" -msgstr "" +msgstr "Истекает %(expiry_date)s" #: plinth/modules/letsencrypt/templates/letsencrypt.html:85 msgid "No certficate" -msgstr "" +msgstr "Не сертификата" #: plinth/modules/letsencrypt/templates/letsencrypt.html:102 msgid "Revoke" -msgstr "" +msgstr "Отменить" #: plinth/modules/letsencrypt/templates/letsencrypt.html:108 msgid "Re-obtain" -msgstr "" +msgstr "Получить повторно" #: plinth/modules/letsencrypt/templates/letsencrypt.html:115 msgid "Obtain" -msgstr "" +msgstr "Получить" #: plinth/modules/letsencrypt/views.py:55 #, python-brace-format msgid "Certificate successfully revoked for domain {domain}" -msgstr "" +msgstr "Сертификат успешно отменен для домена {domain}" #: plinth/modules/letsencrypt/views.py:60 #, python-brace-format msgid "Failed to revoke certificate for domain {domain}: {error}" -msgstr "" +msgstr "Не удалось отозвать сертификат для домена {domain}: {error}" #: plinth/modules/letsencrypt/views.py:72 #, python-brace-format msgid "Certificate successfully obtained for domain {domain}" -msgstr "" +msgstr "Сертификат успешно получен для домена {domain}" #: plinth/modules/letsencrypt/views.py:77 #, python-brace-format msgid "Failed to obtain certificate for domain {domain}: {error}" -msgstr "" +msgstr "Не удалось получить сертификат для домена {domain}: {error}" #: plinth/modules/monkeysphere/__init__.py:32 #: plinth/modules/monkeysphere/templates/monkeysphere.html:35 #: plinth/modules/monkeysphere/views.py:44 msgid "Monkeysphere" -msgstr "" +msgstr "MonkeySphere" #: plinth/modules/monkeysphere/templates/monkeysphere.html:38 msgid "" @@ -1236,63 +1260,71 @@ msgid "" "key signing process. See the Monkeysphere SSH documentation for more details." msgstr "" +"С Monkeysphere PGP ключ может быть создан для каждого настроенного домена, " +"доступного по SSH. Открытый ключ PGP затем может быть загружен на сервер " +"ключей PGP. Пользователи, которые подключаются к этой машине через SSH могуу " +"проверить, что они подключаются к правильному хосту. Для использования, ключ " +"должен быть подписан. Смотрите Monkeysphere SSH documentation для подробностей." #: plinth/modules/monkeysphere/templates/monkeysphere.html:53 msgid "Publishing key to keyserver..." -msgstr "" +msgstr "Публикация ключа на сервер ключей..." #: plinth/modules/monkeysphere/templates/monkeysphere.html:71 msgid "GPG Fingerprint" -msgstr "" +msgstr "GPG отпечаток" #: plinth/modules/monkeysphere/templates/monkeysphere.html:83 #: plinth/modules/names/views.py:45 msgid "Not Available" -msgstr "" +msgstr "Не доступно" #: plinth/modules/monkeysphere/templates/monkeysphere.html:93 msgid "Generate PGP Key" -msgstr "" +msgstr "Генерировать ключ PGP" #: plinth/modules/monkeysphere/templates/monkeysphere.html:101 msgid "Publish Key" -msgstr "" +msgstr "Опубликовать ключ" #: plinth/modules/monkeysphere/views.py:58 msgid "Generated PGP key." -msgstr "" +msgstr "Сгенерированный ключ PGP." #: plinth/modules/monkeysphere/views.py:83 msgid "Cancelled key publishing." -msgstr "" +msgstr "Отменена публикация ключа." #: plinth/modules/monkeysphere/views.py:120 msgid "Published key to keyserver." -msgstr "" +msgstr "Опубликованый ключ на сервере ключей." #: plinth/modules/monkeysphere/views.py:122 msgid "Error occurred while publishing key." -msgstr "" +msgstr "Произошла ошибка при публикации ключа." #: plinth/modules/mumble/__init__.py:38 #: plinth/modules/mumble/templates/mumble.html:26 #: plinth/modules/mumble/views.py:58 msgid "Voice Chat (Mumble)" -msgstr "" +msgstr "Голосовой чат (Mumble)" #: plinth/modules/mumble/__init__.py:43 msgid "Mumble Voice Chat Server" -msgstr "" +msgstr "Mumble Сервер Голосового Чата" #: plinth/modules/mumble/forms.py:29 msgid "Enable Mumble daemon" -msgstr "" +msgstr "Включить Mumble как демон" #: plinth/modules/mumble/templates/mumble.html:29 msgid "" "Mumble is an open source, low-latency, encrypted, high quality voice chat " "software." msgstr "" +"Mumble это шифрованый чат с высоким качеством голоса, низкой задержкой и " +"открытым исходным кодом." #: plinth/modules/mumble/templates/mumble.html:36 msgid "" @@ -1300,265 +1332,280 @@ msgid "" "href=\"http://mumble.info\">Clients to connect to Mumble from your " "desktop and Android devices are available." msgstr "" +"Вы можете подключится к серверу Mumble используя стандартный для него порт: " +"64738. На Клиенты вы можете найти " +"клиенты для вашего компьютера и Android устройств." #: plinth/modules/mumble/templates/mumble.html:49 msgid "Mumble server is running" -msgstr "" +msgstr "Mumble сервер запущен" #: plinth/modules/mumble/templates/mumble.html:52 msgid "Mumble server is not running" -msgstr "" +msgstr "Mumble сервер не запущен" #: plinth/modules/names/__init__.py:29 msgid "HTTP" -msgstr "" +msgstr "HTTP" #: plinth/modules/names/__init__.py:30 msgid "HTTPS" -msgstr "" +msgstr "HTTPS" #: plinth/modules/names/__init__.py:31 msgid "SSH" -msgstr "" +msgstr "SSH" #: plinth/modules/names/__init__.py:45 plinth/modules/names/views.py:34 msgid "Name Services" -msgstr "" +msgstr "Название услуги" #: plinth/modules/networks/__init__.py:108 #, python-brace-format msgid "Using DNSSEC on IPv{kind}" -msgstr "" +msgstr "Использовать DNSSEC на IPv{kind}" #: plinth/modules/networks/forms.py:30 msgid "Connection Type" -msgstr "" +msgstr "Тип подключения" #: plinth/modules/networks/forms.py:37 msgid "Connection Name" -msgstr "" +msgstr "Имя подключения" #: plinth/modules/networks/forms.py:39 msgid "Physical Interface" -msgstr "" +msgstr "Физический интерфейс" #: plinth/modules/networks/forms.py:41 msgid "The network device that this connection should be bound to." -msgstr "" +msgstr "К этому подключению должно быть привязано сетевое устройство." #: plinth/modules/networks/forms.py:44 msgid "Firewall Zone" -msgstr "" +msgstr "Зона Брандмауэра" #: plinth/modules/networks/forms.py:45 msgid "" "The firewall zone will control which services are available over this " "interfaces. Select Internal only for trusted networks." msgstr "" +"Зона брандмауэра будет контролировать службы, доступные через этот " +"интерфейс. Выбирайте Внутренний только в доверенных сетях." #: plinth/modules/networks/forms.py:49 msgid "IPv4 Addressing Method" -msgstr "" +msgstr "Метод адресации IPv4" #: plinth/modules/networks/forms.py:50 msgid "" "\"Shared\" method will start a DHCP server and \"Automatic\" method will " "acquire configuration from a DHCP server." msgstr "" +"\"Общий\" метод запускает DHCP сервер и \"Автоматический\" метод будет " +"получать настройки от DHCP сервера." #: plinth/modules/networks/forms.py:56 msgid "Address" -msgstr "" +msgstr "Адрес" #: plinth/modules/networks/forms.py:60 msgid "Netmask" -msgstr "" +msgstr "Маска сети" #: plinth/modules/networks/forms.py:61 msgid "" "Optional value. If left blank, a default netmask based on the address will " "be used." msgstr "" +"Необязательное значение. Если оставить пустым, будет использоваться маска " +"подсети по умолчанию, основанная на адресе." #: plinth/modules/networks/forms.py:66 #: plinth/modules/networks/templates/connection_show.html:202 #: plinth/modules/networks/templates/connection_show.html:241 msgid "Gateway" -msgstr "" +msgstr "Шлюз" #: plinth/modules/networks/forms.py:67 msgid "Optional value." -msgstr "" +msgstr "Необязательное значение." #: plinth/modules/networks/forms.py:71 msgid "DNS Server" -msgstr "" +msgstr "DNS-сервер" #: plinth/modules/networks/forms.py:72 msgid "" "Optional value. If this value is given and IPv4 addressing method is " "\"Automatic\", the DNS Servers provided by a DHCP server will be ignored." msgstr "" +"Необязательное значение. Если задано это значение, и метод адресации IPv4 " +"«Автомат», предоставляемые DHCP-сервером DNS-серверы будут игнорироваться." #: plinth/modules/networks/forms.py:78 msgid "Second DNS Server" -msgstr "" +msgstr "Второй DNS-сервер" #: plinth/modules/networks/forms.py:79 msgid "" "Optional value. If this value is given and IPv4 Addressing Method is " "\"Automatic\", the DNS Servers provided by a DHCP server will be ignored." msgstr "" +"Необязательное значение. Если задано это значение и метод адресации IPv4 " +"«Автомат», предоставляемые DHCP-сервером DNS-серверы будут игнорироваться." #: plinth/modules/networks/forms.py:89 msgid "-- select --" -msgstr "" +msgstr "-- Выберите --" #: plinth/modules/networks/forms.py:175 #: plinth/modules/networks/templates/connection_show.html:144 msgid "SSID" -msgstr "" +msgstr "SSID" #: plinth/modules/networks/forms.py:176 msgid "The visible name of the network." -msgstr "" +msgstr "Отображаемое имя сети." #: plinth/modules/networks/forms.py:178 #: plinth/modules/networks/templates/connection_show.html:157 msgid "Mode" -msgstr "" +msgstr "Режим" #: plinth/modules/networks/forms.py:183 msgid "Authentication Mode" -msgstr "" +msgstr "Режим проверки подлинности" #: plinth/modules/networks/forms.py:184 msgid "" "Select WPA if the wireless network is secured and requires clients to have " "the password to connect." msgstr "" +"Выберите WPA, если беспроводная сеть защищена и требует от клиентов пароль " +"для подключения." #: plinth/modules/networks/forms.py:188 msgid "Passphrase" -msgstr "" +msgstr "Парольная фраза" #: plinth/modules/networks/networks.py:36 #: plinth/modules/networks/networks.py:56 msgid "Network Connections" -msgstr "" +msgstr "Сетевые подключения" #: plinth/modules/networks/networks.py:38 #: plinth/modules/networks/networks.py:242 msgid "Nearby Wi-Fi Networks" -msgstr "" +msgstr "Соседние сети Wi-Fi" #: plinth/modules/networks/networks.py:40 #: plinth/modules/networks/networks.py:264 msgid "Add Connection" -msgstr "" +msgstr "Добавить подключение" #: plinth/modules/networks/networks.py:46 msgid "Networks" -msgstr "" +msgstr "Сети" #: plinth/modules/networks/networks.py:66 msgid "Cannot show connection: Connection not found." -msgstr "" +msgstr "Не удается показать подключение: соединение не найдено." #: plinth/modules/networks/networks.py:100 msgid "Show Connection information" -msgstr "" +msgstr "Показать сведения о подключении" #: plinth/modules/networks/networks.py:113 msgid "Cannot edit connection: Connection not found." -msgstr "" +msgstr "Нельзя редактировать подключение: подключение не найдено." #: plinth/modules/networks/networks.py:119 msgid "This type of connection is not yet understood." -msgstr "" +msgstr "Этот тип подключения еще не понятен." #: plinth/modules/networks/networks.py:139 #: plinth/modules/networks/networks.py:198 #: plinth/modules/networks/templates/connections_edit.html:34 msgid "Edit Connection" -msgstr "" +msgstr "Редактирование подключения" #: plinth/modules/networks/networks.py:209 #, python-brace-format msgid "Activated connection {name}." -msgstr "" +msgstr "Установленное подключение {name}." #: plinth/modules/networks/networks.py:212 msgid "Failed to activate connection: Connection not found." -msgstr "" +msgstr "Невозможно установить подключение: Поключение не найдено." #: plinth/modules/networks/networks.py:216 #, python-brace-format msgid "Failed to activate connection {name}: No suitable device is available." -msgstr "" +msgstr "Не удалось установить подключение {name}: Нет подходящего устройства." #: plinth/modules/networks/networks.py:229 #, python-brace-format msgid "Deactivated connection {name}." -msgstr "" +msgstr "Разорвано подключение {name}." #: plinth/modules/networks/networks.py:232 msgid "Failed to de-activate connection: Connection not found." -msgstr "" +msgstr "Не удалось разорвать подключение: соединение не найдено." #: plinth/modules/networks/networks.py:282 msgid "Adding New Ethernet Connection" -msgstr "" +msgstr "Добавление нового подключения Ethernet" #: plinth/modules/networks/networks.py:300 msgid "Adding New PPPoE Connection" -msgstr "" +msgstr "Добавление нового подключения PPPoE" #: plinth/modules/networks/networks.py:332 msgid "Adding New Wi-Fi Connection" -msgstr "" +msgstr "Добавление нового подключения Wi-Fi" #: plinth/modules/networks/networks.py:346 #, python-brace-format msgid "Connection {name} deleted." -msgstr "" +msgstr "Подключение {name} удалено." #: plinth/modules/networks/networks.py:349 #: plinth/modules/networks/networks.py:358 msgid "Failed to delete connection: Connection not found." -msgstr "" +msgstr "Не удалось удалить подключение: соединение не найдено." #: plinth/modules/networks/networks.py:363 #: plinth/modules/networks/templates/connections_delete.html:26 msgid "Delete Connection" -msgstr "" +msgstr "Удаление подключения" #: plinth/modules/networks/templates/connection_show.html:43 msgid "Edit connection" -msgstr "" +msgstr "Редактирование подключения" #: plinth/modules/networks/templates/connection_show.html:43 #: plinth/templates/base.html:123 msgid "Edit" -msgstr "" +msgstr "Редактировать" #: plinth/modules/networks/templates/connection_show.html:50 #: plinth/modules/networks/templates/connections_list.html:78 msgid "Deactivate" -msgstr "" +msgstr "Отключить" #: plinth/modules/networks/templates/connection_show.html:57 #: plinth/modules/networks/templates/connections_list.html:86 msgid "Activate" -msgstr "" +msgstr "Включить" #: plinth/modules/networks/templates/connection_show.html:63 msgid "Delete connection" -msgstr "" +msgstr "Удаление подключения" #: plinth/modules/networks/templates/connection_show.html:63 msgid "Delete" -msgstr "" +msgstr "Удалить" #: plinth/modules/networks/templates/connection_show.html:66 #: plinth/modules/networks/templates/connections_diagram.html:73 @@ -1566,122 +1613,123 @@ msgstr "" #: plinth/modules/networks/templates/connections_diagram.html:105 #: plinth/modules/networks/templates/connections_diagram.html:127 msgid "Connection" -msgstr "" +msgstr "Подключение" #: plinth/modules/networks/templates/connection_show.html:71 msgid "Primary connection" -msgstr "" +msgstr "Основное соединение" #: plinth/modules/networks/templates/connection_show.html:73 #: plinth/modules/networks/templates/connection_show.html:217 #: plinth/modules/networks/templates/connection_show.html:256 msgid "yes" -msgstr "" +msgstr "Да" #: plinth/modules/networks/templates/connection_show.html:84 msgid "Device" -msgstr "" +msgstr "Устройство" #: plinth/modules/networks/templates/connection_show.html:88 msgid "State" -msgstr "" +msgstr "Состояние" #: plinth/modules/networks/templates/connection_show.html:93 +#, fuzzy msgid "State reason" -msgstr "" +msgstr "Определение состояния" #: plinth/modules/networks/templates/connection_show.html:102 msgid "MAC address" -msgstr "" +msgstr "MAC-адрес" #: plinth/modules/networks/templates/connection_show.html:106 msgid "Interface" -msgstr "" +msgstr "Интерфейс" #: plinth/modules/networks/templates/connection_show.html:110 msgid "Description" -msgstr "" +msgstr "Описание" #: plinth/modules/networks/templates/connection_show.html:116 msgid "Physical Link" -msgstr "" +msgstr "Физическая связь" #: plinth/modules/networks/templates/connection_show.html:121 msgid "Link state" -msgstr "" +msgstr "Состояния связи" #: plinth/modules/networks/templates/connection_show.html:125 msgid "cable is connected" -msgstr "" +msgstr "кабель подключен" #: plinth/modules/networks/templates/connection_show.html:128 msgid "please check cable" -msgstr "" +msgstr "Проверьте кабель" #: plinth/modules/networks/templates/connection_show.html:133 #: plinth/modules/networks/templates/connection_show.html:149 msgid "Speed" -msgstr "" +msgstr "Скорость" #: plinth/modules/networks/templates/connection_show.html:135 #, python-format msgid "%(ethernet_speed)s Mbit/s" -msgstr "" +msgstr "%(ethernet_speed)s Мбит/сек" #: plinth/modules/networks/templates/connection_show.html:151 #, python-format msgid "%(wireless_bitrate)s Mbit/s" -msgstr "" +msgstr "%(wireless_bitrate)s Мбит/сек" #: plinth/modules/networks/templates/connection_show.html:163 msgid "Signal strength" -msgstr "" +msgstr "Сила сигнала" #: plinth/modules/networks/templates/connection_show.html:173 msgid "Channel" -msgstr "" +msgstr "Канал" #: plinth/modules/networks/templates/connection_show.html:181 msgid "IPv4" -msgstr "" +msgstr "IРv4" #: plinth/modules/networks/templates/connection_show.html:186 #: plinth/modules/networks/templates/connection_show.html:227 msgid "Method" -msgstr "" +msgstr "Метод" #: plinth/modules/networks/templates/connection_show.html:193 #: plinth/modules/networks/templates/connection_show.html:234 msgid "IP address" -msgstr "" +msgstr "IP-адрес" #: plinth/modules/networks/templates/connection_show.html:209 #: plinth/modules/networks/templates/connection_show.html:248 msgid "DNS server" -msgstr "" +msgstr "DNS-сервер" #: plinth/modules/networks/templates/connection_show.html:216 #: plinth/modules/networks/templates/connection_show.html:255 msgid "Default" -msgstr "" +msgstr "По умолчанию" #: plinth/modules/networks/templates/connection_show.html:222 msgid "IPv6" -msgstr "" +msgstr "IРv6" #: plinth/modules/networks/templates/connection_show.html:263 msgid "This connection is not active." -msgstr "" +msgstr "Это подключение не активно." #: plinth/modules/networks/templates/connection_show.html:266 msgid "Security" -msgstr "" +msgstr "Безопасность" #: plinth/modules/networks/templates/connection_show.html:271 #: plinth/modules/networks/templates/connection_show.html:291 #: plinth/modules/networks/templates/connection_show.html:310 msgid "Firewall zone" -msgstr "" +msgstr "Зона Брандмауэра" #: plinth/modules/networks/templates/connection_show.html:280 msgid "" @@ -1689,6 +1737,9 @@ msgid "" "connect this interface to a public network, services meant to be available " "only internally will become available externally. This is a security risk." msgstr "" +"Этот интерфейс должен быть подключен к локальной сети/машине. Если этот " +"интерфейс подключен к публичной сети, внутренние службы будут доступны " +"извне. Это представляет риск для безопасности." #: plinth/modules/networks/templates/connection_show.html:300 msgid "" @@ -1696,6 +1747,8 @@ msgid "" "a local network/machine, many services meant to available only internally " "will not be available." msgstr "" +"Этот интерфейс должен получить подключение к Интернету. Если вы подключите " +"его к локальной сети/машине, многие внутренние службы будут не доступны." #: plinth/modules/networks/templates/connection_show.html:319 #, python-format @@ -1705,90 +1758,94 @@ msgid "" "this interface. It is recommended that you deactivate or delete this " "connection and re-configure it." msgstr "" +"Этот интерфейс не поддерживается %(box_name)s. Его статус безопасности " +"неизвестен для %(box_name)s. Много служб %(box_name)s могут быть недоступны " +"на этом интерфейсе. Мы рекомендуем вам отключить или удалить это подключение " +"и заново настроить его." #: plinth/modules/networks/templates/connections_add.html:34 #: plinth/modules/networks/templates/connections_type_select.html:34 msgid "Create..." -msgstr "" +msgstr "Создать..." #: plinth/modules/networks/templates/connections_create.html:34 msgid "Create Connection" -msgstr "" +msgstr "Создание подключения" #: plinth/modules/networks/templates/connections_delete.html:29 #, python-format msgid "Delete connection %(name)s permanently?" -msgstr "" +msgstr "Окончательно удалить подключение %(name)s?" #: plinth/modules/networks/templates/connections_diagram.html:65 msgid "Internet" -msgstr "" +msgstr "Интернет" #: plinth/modules/networks/templates/connections_diagram.html:70 #: plinth/modules/networks/templates/connections_diagram.html:102 msgid "Spacing" -msgstr "" +msgstr "Интервал" #: plinth/modules/networks/templates/connections_diagram.html:78 msgid "External" -msgstr "" +msgstr "Внешний" #: plinth/modules/networks/templates/connections_diagram.html:83 #: plinth/modules/networks/templates/connections_diagram.html:113 #: plinth/network.py:37 msgid "Ethernet" -msgstr "" +msgstr "Ethernet" #: plinth/modules/networks/templates/connections_diagram.html:86 #: plinth/modules/networks/templates/connections_diagram.html:116 #: plinth/network.py:38 msgid "Wi-Fi" -msgstr "" +msgstr "Wi-Fi" #: plinth/modules/networks/templates/connections_diagram.html:89 #, python-format msgid "Show connection %(connection.name)s" -msgstr "" +msgstr "Показать подключение %(connection.name)s" #: plinth/modules/networks/templates/connections_diagram.html:107 msgid "Internal" -msgstr "" +msgstr "Внутренний" #: plinth/modules/networks/templates/connections_diagram.html:119 #, python-format msgid "Show connection %(name)s" -msgstr "" +msgstr "Показать подключение %(name)s" #: plinth/modules/networks/templates/connections_diagram.html:131 msgid "Computer" -msgstr "" +msgstr "Компьютер" #: plinth/modules/networks/templates/connections_list.html:67 #, python-format msgid "Delete connection %(name)s" -msgstr "" +msgstr "Удалить подключение %(name)s" #: plinth/modules/networks/templates/connections_list.html:92 msgid "Active" -msgstr "" +msgstr "Активные" #: plinth/modules/networks/templates/connections_list.html:95 msgid "Inactive" -msgstr "" +msgstr "Неактивен" #: plinth/modules/openvpn/__init__.py:38 #: plinth/modules/openvpn/templates/openvpn.html:35 #: plinth/modules/openvpn/views.py:62 msgid "Virtual Private Network (OpenVPN)" -msgstr "" +msgstr "Виртуальная частная сеть (OpenVPN)" #: plinth/modules/openvpn/__init__.py:43 msgid "OpenVPN" -msgstr "" +msgstr "OpenVPN" #: plinth/modules/openvpn/forms.py:29 msgid "Enable OpenVPN server" -msgstr "" +msgstr "Включить сервер OpenVPN" #: plinth/modules/openvpn/templates/openvpn.html:38 #, python-format @@ -1800,10 +1857,17 @@ msgid "" "You can also access the rest of the Internet via %(box_name)s for added " "security and anonymity." msgstr "" +"Виртуальные частные сети (VPN) — это метод для безопасного подключения двух " +"устройств для того, чтобы получить доступ к ресурсам частной сети. В то " +"время как вы находитесь вдали от дома, можно подключиться к вашей %(box_name)" +"s для того, чтобы присоединиться к вашей домашней сети и доступа к закрытым/" +"внутренним службам, предоставляемые %(box_name)s. Вы можете также получить " +"доступ к остальной части Интернет через %(box_name)s для дополнительной " +"безопасности и анонимности." #: plinth/modules/openvpn/templates/openvpn.html:51 msgid "Profile" -msgstr "" +msgstr "Профиль" #: plinth/modules/openvpn/templates/openvpn.html:54 #, python-format @@ -1815,15 +1879,22 @@ msgid "" "\">documentation on recommended clients and instructions on how to " "configure them." msgstr "" +"Для подключения к %(box_name)s по VPN, вам надо скачать профиль для OpenVPN-" +"клиента. OpenVPN клиенты доступны для большинства платформ. 2documentation для инструкций и рекомендаций по " +"настройке." #: plinth/modules/openvpn/templates/openvpn.html:66 #, python-format msgid "Profile is specific to each user of %(box_name)s. Keep it a secret." msgstr "" +"Профиль специфичен для каждого пользователя %(box_name)s. Держите профиль в " +"тайне." #: plinth/modules/openvpn/templates/openvpn.html:76 msgid "Download my profile" -msgstr "" +msgstr "Скачать мой профиль" #: plinth/modules/openvpn/templates/openvpn.html:85 #, python-format @@ -1832,14 +1903,17 @@ msgid "" "time. Depending on how fast your %(box_name)s is, it may even take hours. " "If the setup is interrupted, you may start it again." msgstr "" +"OpenVPN еще не настроен. ыполнение безопасной установки занимает очень много " +"времени. В зависимости от мощности вашего %(box_name)s, это может занять " +"продолжительное время. Если установка прерывается, вы можете начать её снова." #: plinth/modules/openvpn/templates/openvpn.html:97 msgid "Start setup" -msgstr "" +msgstr "Запуск программы установки" #: plinth/modules/openvpn/templates/openvpn.html:104 msgid "OpenVPN setup is running" -msgstr "" +msgstr "Выполняется установка OpenVPN" #: plinth/modules/openvpn/templates/openvpn.html:108 #, python-format @@ -1848,44 +1922,48 @@ msgid "" "on how fast your %(box_name)s is, it may even take hours. If the setup is " "interrupted, you may start it again." msgstr "" +"Чтобы выполнить безопасной установки, выполнение безопасной установки " +"занимает очень много времени. В зависимости от мощности вашего %(box_name)s, " +"это может занять продолжительное время. Если установка прерывается, вы " +"можете начать её снова." #: plinth/modules/openvpn/templates/openvpn.html:121 msgid "OpenVPN server is running" -msgstr "" +msgstr "Сервер OpenVPN выполняется" #: plinth/modules/openvpn/templates/openvpn.html:124 msgid "OpenVPN server is not running" -msgstr "" +msgstr "OpenVPN сервер не выполняется" #: plinth/modules/openvpn/views.py:124 msgid "Setup completed." -msgstr "" +msgstr "Установка завершена." #: plinth/modules/openvpn/views.py:126 msgid "Setup failed." -msgstr "" +msgstr "Установка не удалась." #: plinth/modules/owncloud/owncloud.py:38 msgid "Enable ownCloud" -msgstr "" +msgstr "Включить ownCloud" #: plinth/modules/owncloud/owncloud.py:44 #: plinth/modules/owncloud/templates/owncloud.html:26 msgid "File Hosting (ownCloud)" -msgstr "" +msgstr "Файловый хостинг (ownCloud)" #: plinth/modules/owncloud/owncloud.py:51 #: plinth/modules/owncloud/owncloud.py:80 msgid "ownCloud" -msgstr "" +msgstr "оwnCloud" #: plinth/modules/owncloud/owncloud.py:97 msgid "ownCloud enabled" -msgstr "" +msgstr "ownCloud включен" #: plinth/modules/owncloud/owncloud.py:100 msgid "ownCloud disabled" -msgstr "" +msgstr "ownCloud выключен" #: plinth/modules/owncloud/templates/owncloud.html:29 msgid "" @@ -1896,6 +1974,12 @@ msgid "" "special permissions and is quick. ownCloud is extendable via a simple but " "powerful API for applications and plugins." msgstr "" +"ownCloud дает вам всеобщий доступ к вашим файлам через веб-интерфейс или " +"WebDAV. Он также предоставляет платформу для простого просмотра и " +"синхронизации ваших контактов, календарей и закладок между вашими " +"устройствами и включает базовое редактирование онлайн. Установка имеет " +"минимальные системные требования, не требует особых разрешений и быстра. " +"ownCloud расширяется за счет простых, но мощных приложений и плагинов." #: plinth/modules/owncloud/templates/owncloud.html:41 msgid "" @@ -1903,126 +1987,135 @@ msgid "" "owncloud\">/owncloud path on the web server. Visit this URL to set up " "the initial administration account for ownCloud." msgstr "" +"Когда включен, установка ownCloud доступна по адресу /owncloud на веб-сервере. Посетите данный URL для начальной настройки " +"администратора ownCloud." #: plinth/modules/owncloud/templates/owncloud.html:59 msgid "Apply changes" -msgstr "" +msgstr "Применить изменения" #: plinth/modules/pagekite/__init__.py:35 plinth/modules/pagekite/views.py:46 msgid "Public Visibility (PageKite)" -msgstr "" +msgstr "Открытая видимость (PageKite)" #: plinth/modules/pagekite/forms.py:46 msgid "Enable PageKite" -msgstr "" +msgstr "Включить PageKite" #: plinth/modules/pagekite/forms.py:49 msgid "Server domain" -msgstr "" +msgstr "Домен сервера" #: plinth/modules/pagekite/forms.py:51 msgid "" "Select your pagekite server. Set \"pagekite.net\" to use the default " "pagekite.net server." msgstr "" +"Выберите ваш сервер pagekite. Введите «pagekite.net», чтобы использовать " +"стандартный веб-сервер pagekite.net." #: plinth/modules/pagekite/forms.py:55 msgid "Server port" -msgstr "" +msgstr "Порт сервера" #: plinth/modules/pagekite/forms.py:56 msgid "Port of your pagekite server (default: 80)" -msgstr "" +msgstr "Порт сервера pagekite (по умолчанию: 80)" #: plinth/modules/pagekite/forms.py:58 msgid "Kite name" -msgstr "" +msgstr "Имя Kite" #: plinth/modules/pagekite/forms.py:59 msgid "Example: mybox.pagekite.me" -msgstr "" +msgstr "Пример: mybox.pagekite.me" #: plinth/modules/pagekite/forms.py:62 msgid "Invalid kite name" -msgstr "" +msgstr "Недопустимое имя kite" #: plinth/modules/pagekite/forms.py:65 msgid "Kite secret" -msgstr "" +msgstr "Кайт секрет" #: plinth/modules/pagekite/forms.py:67 msgid "" "A secret associated with the kite or the default secret for your account if " "no secret is set on the kite." msgstr "" +"Секрет, связанный с kite или секрет по умолчанию для вашей учетной записи, " +"если не секрет устанавливается на kite." #: plinth/modules/pagekite/forms.py:83 msgid "Kite details set" -msgstr "" +msgstr "Kite изменить детали" #: plinth/modules/pagekite/forms.py:90 msgid "Pagekite server set" -msgstr "" +msgstr "Смена сервера Pagekite" #: plinth/modules/pagekite/forms.py:96 msgid "PageKite enabled" -msgstr "" +msgstr "PageKite включен" #: plinth/modules/pagekite/forms.py:99 msgid "PageKite disabled" -msgstr "" +msgstr "PageKite выключен" #: plinth/modules/pagekite/forms.py:135 #, python-brace-format msgid "Service enabled: {name}" -msgstr "" +msgstr "Включена служба: {name}" #: plinth/modules/pagekite/forms.py:139 #, python-brace-format msgid "Service disabled: {name}" -msgstr "" +msgstr "Служба выключена: {name}" #: plinth/modules/pagekite/forms.py:150 msgid "protocol" -msgstr "" +msgstr "протокол" #: plinth/modules/pagekite/forms.py:153 msgid "external (frontend) port" -msgstr "" +msgstr "внешний (frontend) порт" #: plinth/modules/pagekite/forms.py:156 msgid "internal (freedombox) port" -msgstr "" +msgstr "Внутренний (freedombox) порт" #: plinth/modules/pagekite/forms.py:158 msgid "Enable Subdomains" -msgstr "" +msgstr "Включить поддомены" #: plinth/modules/pagekite/forms.py:191 msgid "Deleted custom service" -msgstr "" +msgstr "Удалить пользовательские службы" #: plinth/modules/pagekite/forms.py:225 msgid "" "This service is available as a standard service. Please use the \"Standard " "Services\" page to enable it." msgstr "" +"Этот сервис доступна как стандартная служба. Пожалуйста, использутей " +"страницу \"Стандартные службы\" чтобы включить её." #: plinth/modules/pagekite/forms.py:234 msgid "Added custom service" -msgstr "" +msgstr "Добавить пользовательскую службу" #: plinth/modules/pagekite/forms.py:237 msgid "This service already exists" -msgstr "" +msgstr "Эта служба уже существует" #: plinth/modules/pagekite/templates/pagekite_configure.html:33 msgid "PageKite Account" -msgstr "" +msgstr "Учетная запись PageKite" #: plinth/modules/pagekite/templates/pagekite_configure.html:41 msgid "Save settings" -msgstr "" +msgstr "Сохранить настройки" #: plinth/modules/pagekite/templates/pagekite_custom_services.html:44 msgid "" @@ -2030,31 +2123,34 @@ msgid "" "protocol/port combinations that you are able to define here. For example, " "HTTPS on ports other than 443 is known to cause problems." msgstr "" +"Предупреждение:
Ваш PageKite frontend сервер может не " +"поддерживать все комбинаци порта протокола, которые вы ввели здесь. Например " +"HTTPS на порты, отличные от 443 могут вызвать проблемы." #: plinth/modules/pagekite/templates/pagekite_custom_services.html:56 msgid "Create a custom service" -msgstr "" +msgstr "Создание пользовательской службы" #: plinth/modules/pagekite/templates/pagekite_custom_services.html:64 msgid "Add Service" -msgstr "" +msgstr "Добавление службы" #: plinth/modules/pagekite/templates/pagekite_custom_services.html:71 msgid "Existing custom services" -msgstr "" +msgstr "Существующие пользовательские службы" #: plinth/modules/pagekite/templates/pagekite_custom_services.html:74 msgid "You don't have any Custom Services enabled" -msgstr "" +msgstr "У вас нет включенных пользовательских служб" #: plinth/modules/pagekite/templates/pagekite_custom_services.html:89 #, python-format msgid "connected to %(backend_host)s:%(backend_port)s" -msgstr "" +msgstr "Подключен к %(backend_host)s%(backend_port)s" #: plinth/modules/pagekite/templates/pagekite_custom_services.html:101 msgid "Delete this service" -msgstr "" +msgstr "Удалить эту службу" #: plinth/modules/pagekite/templates/pagekite_introduction.html:26 #, python-format @@ -2064,33 +2160,43 @@ msgid "" "services are unreachable from the rest of the Internet. This includes the " "following situations:" msgstr "" +"PageKite это система для предоставления служб %(box_name)s, когда вы не " +"имеет прямого доступа к интернету. Вам нужно это если службы %(box_name)s " +"недоступны от остальной части интернета. Это включает в себя следующие " +"ситуации:" #: plinth/modules/pagekite/templates/pagekite_introduction.html:37 #, python-format msgid "%(box_name)s is behind a restricted firewall." -msgstr "" +msgstr "%(box_name)s ограничены брандмауэром." #: plinth/modules/pagekite/templates/pagekite_introduction.html:43 #, python-format msgid "" "%(box_name)s is connected to a (wireless) router which you don't control." msgstr "" +"%(box_name)s подключен к маршрутизатору (беспроводному), который вы не " +"контролируете." #: plinth/modules/pagekite/templates/pagekite_introduction.html:50 msgid "" "Your ISP does not provide you an external IP address and instead provides " "Internet connection through NAT." msgstr "" +"Ваш провайдер не предоставляет вам внешний IP-адрес и вместо этого " +"обеспечивает подключение к Интернету через NAT." #: plinth/modules/pagekite/templates/pagekite_introduction.html:57 msgid "" "Your ISP does not provide you a static IP address and your IP address " "changes evertime you connect to Internet." msgstr "" +"Ваш провайдер не предоставляет вам статический IP-адрес и ваш IP адрес " +"изменяется каждый раз при подключении к Интернету." #: plinth/modules/pagekite/templates/pagekite_introduction.html:63 msgid "Your ISP limits incoming connections." -msgstr "" +msgstr "Ваш провайдер ограничивает входящие соединения." #: plinth/modules/pagekite/templates/pagekite_introduction.html:67 #, python-format @@ -2100,124 +2206,135 @@ msgid "" "provider, for example pagekite.net. In " "future it might be possible to use your buddy's %(box_name)s for this." msgstr "" +"PageKite работает вокруг NAT, брандмауэра и ограничения IP-адреса, используя " +"комбинацию туннелей и обратного прокси. Можно использовать любого поставщик " +"услуг pagekite, например pagekite.net/ " +"В будущем, для этого возможно будет использовать %(box_name)s вашего " +"приятеля." #: plinth/modules/pagekite/templates/pagekite_introduction.html:78 #: plinth/modules/pagekite/views.py:36 msgid "Configure PageKite" -msgstr "" +msgstr "Настройка PageKite" #: plinth/modules/pagekite/templates/pagekite_standard_services.html:40 msgid "Warning:
" -msgstr "" +msgstr "Предупреждение
" #: plinth/modules/pagekite/templates/pagekite_standard_services.html:43 msgid "" "Published services are accessible and attackable from the evil internet." -msgstr "" +msgstr "Публичные службы доступны и уязвимы из злого интернета." #: plinth/modules/pagekite/templates/pagekite_standard_services.html:58 msgid "Save Services" -msgstr "" +msgstr "Сохранить службы" #: plinth/modules/pagekite/utils.py:53 msgid "Web Server (HTTP)" -msgstr "" +msgstr "Веб-сервер (HTTP)" #: plinth/modules/pagekite/utils.py:54 #, python-brace-format msgid "Site will be available at http://{0}" -msgstr "" +msgstr "Сайт будет доступен на http://{0}" #: plinth/modules/pagekite/utils.py:63 msgid "Web Server (HTTPS)" -msgstr "" +msgstr "Веб-сервер (HTTPS)" #: plinth/modules/pagekite/utils.py:64 #, python-brace-format msgid "Site will be available at https://{0}" -msgstr "" +msgstr "Сайт будет доступен на https://{0}" #: plinth/modules/pagekite/utils.py:73 msgid "Secure Shell (SSH)" -msgstr "" +msgstr "Sеcure Shell (SSH)" #: plinth/modules/pagekite/utils.py:74 msgid "" "See SSH client setup instructions" msgstr "" +"Смотрите инструкции SSH клиента" #: plinth/modules/pagekite/utils.py:276 msgid "Pagekite" -msgstr "" +msgstr "Pаgekite" #: plinth/modules/pagekite/views.py:34 msgid "About PageKite" -msgstr "" +msgstr "О PageKite" #: plinth/modules/pagekite/views.py:38 msgid "Standard Services" -msgstr "" +msgstr "Стандартные службы" #: plinth/modules/pagekite/views.py:40 msgid "Custom Services" -msgstr "" +msgstr "Пользовательские службы" #: plinth/modules/power/__init__.py:32 plinth/modules/power/views.py:33 #: plinth/modules/power/views.py:47 plinth/modules/power/views.py:62 msgid "Power" -msgstr "" +msgstr "Pоwer" #: plinth/modules/power/templates/power.html:29 msgid "Restart or shut down the system." -msgstr "" +msgstr "Перезагрузка или завершение работы системы." #: plinth/modules/power/templates/power.html:34 msgid "Restart »" -msgstr "" +msgstr "Рестарт »" #: plinth/modules/power/templates/power.html:37 msgid "Shut Down »" -msgstr "" +msgstr "Выключить »" #: plinth/modules/power/templates/power_restart.html:29 msgid "" "Are you sure you want to restart? You will not be able to access this web " "interface for a few minutes until the system is restarted." msgstr "" +"Вы действительно хотите перезагрузиться? Вы не будете иметь доступ к веб-" +"интерфейсу на время перезагрузки системы." #: plinth/modules/power/templates/power_restart.html:42 msgid "Restart Now" -msgstr "" +msgstr "Перезагрузить сейчас" #: plinth/modules/power/templates/power_shutdown.html:29 msgid "" "Are you sure you want to shut down? You will not be able to access this web " "interface after shut down." msgstr "" +"Вы действительно хотите выключить. Вы не будете иметь доступ к веб-" +"интерфейсу после выключения." #: plinth/modules/power/templates/power_shutdown.html:41 msgid "Shut Down Now" -msgstr "" +msgstr "Завершить работу сейчас" #: plinth/modules/privoxy/__init__.py:39 #: plinth/modules/privoxy/templates/privoxy.html:26 #: plinth/modules/privoxy/views.py:59 msgid "Web Proxy (Privoxy)" -msgstr "" +msgstr "Веб-прокси (Privoxy)" #: plinth/modules/privoxy/__init__.py:44 msgid "Privoxy Web Proxy" -msgstr "" +msgstr "Privoxy Web-прокси" #: plinth/modules/privoxy/__init__.py:86 #, python-brace-format msgid "Access {url} with proxy {proxy} on tcp{kind}" -msgstr "" +msgstr "Доступ к {url} с прокси {proxy} на tcp {kind}" #: plinth/modules/privoxy/forms.py:29 msgid "Enable Privoxy" -msgstr "" +msgstr "Включить Privoxy" #: plinth/modules/privoxy/templates/privoxy.html:29 msgid "" @@ -2225,6 +2342,10 @@ msgid "" "enhancing privacy, modifying web page data and HTTP headers, controlling " "access, and removing ads and other obnoxious Internet junk." msgstr "" +"Privoxy это не-кеширующий веб-прокси с расширенными возможностями фильтрации " +"для повышения конфиденциальности, изменения веб-страницы данных и заголовков " +"HTTP, контроля доступа и удаления рекламы и прочего неприятного мусора в " +"интернете." #: plinth/modules/privoxy/templates/privoxy.html:38 #, python-format @@ -2235,28 +2356,33 @@ msgid "" "config.privoxy.org\">http://config.privoxy.org/ or http://p.p." msgstr "" +"Вы можете использовать Privoxy, изменив настройки прокси в вашем браузере на " +"имя хоста %(box_name)s (или IP адрес) с портом 8118. При использовании " +"Privoxy вы можете увидеть его детали настройки и документацию на http://config.privoxy.org или http://p.p." #: plinth/modules/privoxy/templates/privoxy.html:53 msgid "Privoxy is running" -msgstr "" +msgstr "Privoxy выполняется" #: plinth/modules/privoxy/templates/privoxy.html:56 msgid "Privoxy is not running" -msgstr "" +msgstr "Privoxy не запущена" #: plinth/modules/quassel/__init__.py:36 #: plinth/modules/quassel/templates/quassel.html:26 #: plinth/modules/quassel/views.py:54 msgid "IRC Client (Quassel)" -msgstr "" +msgstr "IRC-клиент (Quassel)" #: plinth/modules/quassel/__init__.py:41 msgid "Quassel IRC Client" -msgstr "" +msgstr "Quassel IRC-клиент" #: plinth/modules/quassel/forms.py:29 msgid "Enable Quassel core service" -msgstr "" +msgstr "Включение службы ядра Quassel" #: plinth/modules/quassel/templates/quassel.html:29 #, python-format @@ -2268,6 +2394,12 @@ msgid "" "one or more Quassel clients from a desktop or a mobile can be used to " "connect and disconnect from it." msgstr "" +"Quassel это приложение IRC, разделено на две части, \"ядро\" и \"клиент\". " +"Это позволяет ядру чтобы оставаться подключенным к IRC серверу и продолжать " +"получать сообщения, даже при отключении клиента. %(box_name)s может " +"запустить ядро службы Quassel, держа всегда онлайн один или несколько " +"клиентов. Для этого могут использоваться как клиенты настольного компьютера, " +"так и мобильные версии." #: plinth/modules/quassel/templates/quassel.html:41 msgid "" @@ -2276,30 +2408,35 @@ msgid "" "downloads\">desktop and mobile devices are available." msgstr "" +"Порт Quassel для подключения по умолчанию является 4242. Клиенты для " +"подключения к Quassel доступны по адресу для десктопов и мобильных устройств." #: plinth/modules/quassel/templates/quassel.html:55 msgid "Quassel core service is running" -msgstr "" +msgstr "Основная служба Quassel запущена" #: plinth/modules/quassel/templates/quassel.html:58 msgid "Quassel core service is not running" -msgstr "" +msgstr "Основная служба Quassel не запущена" #: plinth/modules/repro/__init__.py:36 #: plinth/modules/repro/templates/repro.html:26 #: plinth/modules/repro/views.py:55 msgid "SIP Server (repro)" -msgstr "" +msgstr "Сервер SIP (repro)" #: plinth/modules/repro/__init__.py:41 msgid "repro SIP Server" -msgstr "" +msgstr "repro SIP Сервер" #: plinth/modules/repro/forms.py:29 msgid "Enable repro service" -msgstr "" +msgstr "Включить службу repro" #: plinth/modules/repro/templates/repro.html:29 +#, fuzzy msgid "" "repro provides various SIP services that a SIP softphone can utilize to " "provide audio and video calls as well as presence and instant messaging. " @@ -2307,6 +2444,11 @@ msgid "" "their presence known. It also acts as a proxy to federate SIP " "communications to other servers on the Internet similar to email." msgstr "" +"repro предоставляет различные услуги SIP, SIP софтфон можно использовать для " +"предоставления аудио и видео звонков, для мгновенных сообщений. repro " +"предоставляет сервер и пользовательскую учетную запись SIP. Он также " +"действует как прокси-сервер федерации SIP сообщения на другие серверы в " +"Интернете, похож на электронную почту." #: plinth/modules/repro/templates/repro.html:39 msgid "" @@ -2315,6 +2457,10 @@ msgid "" "\"https://f-droid.org/repository/browse/?fdid=com.csipsimple\"> CSipSimple (for Android phones)." msgstr "" +"Чтобы сделать SIP звонки, требуется клиентское приложение. Доступные " +"клиенты включают Jitsi (для компьютеров) " +"и CSipSimple (для Android телефонов)." #: plinth/modules/repro/templates/repro.html:48 msgid "" @@ -2324,28 +2470,33 @@ msgid "" "log in to the repro configuration panel. After setting the domain, it is " "required to restart the repro service. Disable the service and re-enable it." msgstr "" +"Примечание Перед использованием repro. домены и " +"пользователей необходиимо настроить с помощью веб-панель настроек Пользователей в группе admin могут иметь " +"доступ к панели настроек repro. Аосле настройки домена, необходимо " +"перезапустить службу repro. Отключить и снова включить её." #: plinth/modules/repro/templates/repro.html:63 msgid "repro service is running" -msgstr "" +msgstr "служба repro запущена" #: plinth/modules/repro/templates/repro.html:66 msgid "repro service is not running" -msgstr "" +msgstr "служба repro не запущена" #: plinth/modules/restore/__init__.py:36 #: plinth/modules/restore/templates/restore_index.html:26 #: plinth/modules/restore/views.py:46 msgid "Unhosted Storage (reStore)" -msgstr "" +msgstr "Unhosted хранилище (reStore)" #: plinth/modules/restore/__init__.py:41 msgid "reStore" -msgstr "" +msgstr "rеStore" #: plinth/modules/restore/forms.py:29 msgid "Enable reStore" -msgstr "" +msgstr "Включить reStore" #: plinth/modules/restore/templates/restore_index.html:29 #, python-format @@ -2356,22 +2507,29 @@ msgid "" "unhosted storage server of user's choice. With reStore, your %(box_name)s " "becomes your unhosted storage server." msgstr "" +"reStore это сервер для unhosted веб-" +"приложений. Идея заключается в том, чтобы расцепить веб-приложений от " +"данных. Независимо от того, где веб-приложение выполняется, данные могут " +"храниться на сервере хранения по выбору пользователя. С reStore, ваш " +"%(box_name)s становится сервером хранения unhosted." #: plinth/modules/restore/templates/restore_index.html:40 msgid "" "You can create and edit accounts in the reStore web-" "interface." msgstr "" +"Можно создавать и редактировать учетные записи в веб-" +"интерфейс reStore." #: plinth/modules/roundcube/__init__.py:36 #: plinth/modules/roundcube/templates/roundcube.html:26 #: plinth/modules/roundcube/views.py:64 msgid "Email Client (Roundcube)" -msgstr "" +msgstr "Почтовый клиент (Roundcube)" #: plinth/modules/roundcube/forms.py:29 msgid "Enable Roundcube" -msgstr "" +msgstr "Включить Roundcube" #: plinth/modules/roundcube/templates/roundcube.html:29 msgid "" @@ -2380,6 +2538,10 @@ msgid "" "from an email client, including MIME support, address book, folder " "manipulation, message searching and spell checking." msgstr "" +"Roundcube webmail это осованый на браузере многоязычный IMAP клиент с " +"пользовательским интерфейсом. Это предоставляет полную функциональность, " +"которую вы ожидаете от почтового клиента, включая поддержку MIME, адресную " +"книгу, управление папками, поиск сообщений и проверку орфографии." #: plinth/modules/roundcube/templates/roundcube.html:39 msgid "" @@ -2389,6 +2551,12 @@ msgid "" "imap.example.com. For IMAP over SSL (recommended), fill the " "server field like imaps://imap.example.com." msgstr "" +"Вы можете получить доступ к Roundcube на /roundcube. Предоставьте имя пользователя и пароль от учетной записи " +"электронной почты с указанием доменного имени IMAP сервера вашего провайдера " +"электронной почты, например imap.example.com Для IMAP оver SSL " +"(рекомендуется) заполните поле сервера, например " +"imaps://imap.example.com." #: plinth/modules/roundcube/templates/roundcube.html:50 msgid "" @@ -2399,24 +2567,30 @@ msgid "" "lesssecureapps\" >https://www.google.com/settings/security/lesssecureapps)." msgstr "" +"Для Gmail имя пользователя будет ваш адрес Gmail, пароль будет пароль " +"учетной записи Google, и сервер будет imaps://imap.gmail.com. " +"Обратите внимание, что вам также нужно включить \"Less secure apps\" в в " +"настройках аккаунта Google (https://www.google.com/settings/security/lesssecureapps)." #: plinth/modules/shaarli/__init__.py:37 #: plinth/modules/shaarli/templates/shaarli.html:26 #: plinth/modules/shaarli/views.py:52 msgid "Bookmarks (Shaarli)" -msgstr "" +msgstr "Закладки (Shaarli)" #: plinth/modules/shaarli/__init__.py:42 msgid "Shaarli" -msgstr "" +msgstr "Shаarli" #: plinth/modules/shaarli/forms.py:29 msgid "Enable Shaarli" -msgstr "" +msgstr "Включить Shaarli" #: plinth/modules/shaarli/templates/shaarli.html:28 msgid "Shaarli allows you to save and share bookmarks." -msgstr "" +msgstr "Shaarli позволяет вам сохранять и обмениваться закладками." #: plinth/modules/shaarli/templates/shaarli.html:31 msgid "" @@ -2424,73 +2598,78 @@ msgid "" "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." msgstr "" +"Когда включен, Shaarli будет доступен на /shaarli " +"на веб-сервере. Обратите внимание, что Shaarli поддерживает только одну " +"учетную запись для начальной установки." #: plinth/modules/system/system.py:26 msgid "System" -msgstr "" +msgstr "Система" #: plinth/modules/system/system.py:33 #: plinth/modules/system/templates/system.html:25 #: plinth/templates/base.html:109 msgid "System Configuration" -msgstr "" +msgstr "Конфигурация системы" #: plinth/modules/system/templates/system.html:28 #, python-format msgid "Here you can administrate the underlying system of your %(box_name)s." -msgstr "" +msgstr "Здесь вы можете администрировать базовую систему вашего %(box_name)s." #: plinth/modules/system/templates/system.html:35 #, python-format msgid "" "The options affect the %(box_name)s at its most general level, so be careful!" msgstr "" +"Параметры влияют на %(box_name)s на основном уровне, так что будьте " +"осторожны!" #: plinth/modules/tor/__init__.py:48 plinth/modules/tor/templates/tor.html:35 msgid "Anonymity Network (Tor)" -msgstr "" +msgstr "Анонимная Сеть (Tor)" #: plinth/modules/tor/__init__.py:53 msgid "Tor Anonymity Network" -msgstr "" +msgstr "Tоr Anonymity Network" #: plinth/modules/tor/__init__.py:58 msgid "Tor Bridge Relay" -msgstr "" +msgstr "Ретранслятор Tor типа мост" #: plinth/modules/tor/__init__.py:76 plinth/modules/tor/views.py:144 msgid "Tor Hidden Service" -msgstr "" +msgstr "Скрытый сервис Tor" #: plinth/modules/tor/__init__.py:222 msgid "Tor relay port available" -msgstr "" +msgstr "Доступен порт трансляции Tor" #: plinth/modules/tor/__init__.py:230 msgid "Obfs3 transport registered" -msgstr "" +msgstr "Obfs3 транспорт зарегестрирован" #: plinth/modules/tor/__init__.py:236 msgid "Obfs4 transport registered" -msgstr "" +msgstr "Obfs4 транспорт зарегистрирован" #: plinth/modules/tor/__init__.py:273 #, python-brace-format msgid "Access URL {url} on tcp{kind} via Tor" -msgstr "" +msgstr "Доступ к {url} по tcp{kind} через Tor" #: plinth/modules/tor/__init__.py:284 #, python-brace-format msgid "Confirm Tor usage at {url} on tcp{kind}" -msgstr "" +msgstr "Подтверждение использования Tor в {url} по tcp {kind}" #: plinth/modules/tor/forms.py:32 msgid "Enable Tor" -msgstr "" +msgstr "Включить Tor" #: plinth/modules/tor/forms.py:35 msgid "Enable Tor Hidden Service" -msgstr "" +msgstr "Включить скрытый сервис Tor" #: plinth/modules/tor/forms.py:38 #, python-brace-format @@ -2498,10 +2677,12 @@ msgid "" "A hidden service will allow {box_name} to provide selected services (such as " "ownCloud or chat) without revealing its location." msgstr "" +"Скрытый сервис позволит {box_name} предоставлять услуги, (например, ownCloud " +"или чат) не раскрывая его расположение." #: plinth/modules/tor/forms.py:42 msgid "Download software packages over Tor" -msgstr "" +msgstr "Скачать пакеты программного обеспечения через Tor" #: plinth/modules/tor/forms.py:44 msgid "" @@ -2509,6 +2690,9 @@ msgid "" "installations and upgrades. This adds a degree of privacy and security " "during software downloads." msgstr "" +"Когда включен, программное обеспечение будет загруженно через сеть Tor для " +"установки и обновления. Это добавляет определенную степень безопасности и " +"конфиденциальности во время загрузки программного обеспечения." #: plinth/modules/tor/templates/tor.html:38 msgid "" @@ -2518,31 +2702,35 @@ msgid "" "the " "Tor Browser." msgstr "" +"Tor-это система анонимного общения. Вы можете узнать больше об этом на веб-" +"сайте Tor Project. Для лучшей " +"защиты, когда веб-серфинга, проект Tor рекомендует использовать Tor Browser." #: plinth/modules/tor/templates/tor.html:54 msgid "Tor configuration is being updated" -msgstr "" +msgstr "В настоящее время обновляется конфигурация Tor" #: plinth/modules/tor/templates/tor.html:62 msgid "Tor is running" -msgstr "" +msgstr "Tor запущен" #: plinth/modules/tor/templates/tor.html:65 msgid "Tor is not running" -msgstr "" +msgstr "Tor не запущен" #: plinth/modules/tor/templates/tor.html:77 msgid "Hidden Service" -msgstr "" +msgstr "Скрытая Служба" #: plinth/modules/tor/templates/tor.html:78 #: plinth/modules/tor/templates/tor.html:120 msgid "Port" -msgstr "" +msgstr "Порт" #: plinth/modules/tor/templates/tor.html:103 msgid "Bridge" -msgstr "" +msgstr "Мост" #: plinth/modules/tor/templates/tor.html:106 #, python-format @@ -2552,54 +2740,58 @@ msgid "" "firewall, you should make sure the following ports are open, and port-" "forwarded, if necessary:" msgstr "" +"Ваш %(box_name)s настроен как Tor-мост с obfsproxy, поэтому он может помочь " +"обойти цензуру. Если ваш %(box_name)s находится за маршрутизатором или " +"брандмауэром, вы должны убедиться, что следующие порты являются открытыми и " +"проброшены, если необходимо:" #: plinth/modules/tor/templates/tor.html:119 msgid "Service" -msgstr "" +msgstr "Служба" #: plinth/modules/tor/templates/tor.html:135 msgid "SOCKS" -msgstr "" +msgstr "SОCKS" #: plinth/modules/tor/templates/tor.html:138 #, python-format msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." -msgstr "" +msgstr "Порт Tor SOCKS вашего %(box_name)s доступен по TCP port 9050." #: plinth/modules/tor/views.py:68 msgid "Tor Control Panel" -msgstr "" +msgstr "Панель управления Tor" #: plinth/modules/tor/views.py:79 #, python-brace-format msgid "Action error: {0} [{1}] [{2}]" -msgstr "" +msgstr "Ошибка действий: {0}{1}{2}" #: plinth/modules/tor/views.py:148 msgid "Configuration updated." -msgstr "" +msgstr "Конфигурация обновлена." #: plinth/modules/tor/views.py:150 msgid "An error occurred during configuration." -msgstr "" +msgstr "Произошла ошибка во время настройки." #: plinth/modules/transmission/__init__.py:38 #: plinth/modules/transmission/templates/transmission.html:26 #: plinth/modules/transmission/views.py:67 msgid "BitTorrent (Transmission)" -msgstr "" +msgstr "BitTorrent (Transmissiоn)" #: plinth/modules/transmission/__init__.py:43 msgid "Transmission BitTorrent" -msgstr "" +msgstr "BitTorrent Transmissiоn" #: plinth/modules/transmission/forms.py:29 msgid "Enable Transmission daemon" -msgstr "" +msgstr "Включить демона Transmission" #: plinth/modules/transmission/forms.py:33 msgid "Download directory" -msgstr "" +msgstr "Папка для загрузок" #: plinth/modules/transmission/forms.py:34 msgid "" @@ -2607,49 +2799,60 @@ msgid "" "ensure that the new directory exists and is writable by \"debian-transmission" "\" user." msgstr "" +"Каталог, где хранятся загрузки. Если изменить каталог по умолчанию, " +"убедитесь, что новый каталог существует и доступен для записи пользователем " +"\"debian-transmission\" ." #: plinth/modules/transmission/forms.py:40 msgid "Username to login to the web interface." -msgstr "" +msgstr "Имя пользователя для входа на веб-интерфейс." #: plinth/modules/transmission/forms.py:44 msgid "" "Password to login to the web interface. Current password is shown in a " "hashed format. To set a new password, enter the password in plain text." msgstr "" +"Пароль для входа на веб-интерфейс. Текущий пароль отображается в " +"хэшированном формате. Чтобы задать новый пароль, введите пароль в виде " +"обычного текста." #: plinth/modules/transmission/templates/transmission.html:29 msgid "" "BitTorrent is a peer-to-peer file sharing protocol. Transmission daemon " "handles Bitorrent file sharing. Note that BitTorrent is not anonymous." msgstr "" +"BitTorrent является протокол обмена файлами peer-to-peer. Демон передачи " +"обрабатывает обмен файлами Bitorrent. Обратите внимание, что BitTorrent не " +"является анонимным." #: plinth/modules/transmission/templates/transmission.html:37 msgid "" "Access the web interface at /transmission." -msgstr "" +msgstr "Доступ к веб-интерфейсу на /transmission." #: plinth/modules/transmission/templates/transmission.html:47 msgid "Transmission daemon is running" -msgstr "" +msgstr "Демон Transmission выполняется" #: plinth/modules/transmission/templates/transmission.html:50 msgid "Transmission daemon is not running." -msgstr "" +msgstr "Демон Transmission не выполняется." #: plinth/modules/upgrades/__init__.py:33 msgid "Software Upgrades" -msgstr "" +msgstr "Обновления программного обеспечения" #: plinth/modules/upgrades/forms.py:29 msgid "Enable automatic upgrades" -msgstr "" +msgstr "Включение автоматического обновления" #: plinth/modules/upgrades/forms.py:30 msgid "" "When enabled, the unattended-upgrades program will be run once per day. It " "will attempt to perform any package upgrades that are available." msgstr "" +"При включении автоматического обновления программа будет запускаться один " +"раз в день. Он будет пытаться обновить любой пакет. который будет доступен." #: plinth/modules/upgrades/templates/upgrades.html:37 msgid "" @@ -2657,6 +2860,9 @@ msgid "" "upgrades are enabled, upgrades are automatically run every night. You don't " "normally need to start the upgrade process." msgstr "" +"Обновления устанавливает последнее программное обеспечение и обновления " +"безопасности. Когда включены автоматические обновления, они выполняются " +"каждую ночь. Обычно вам не нужно начать процесс обновления вручную." #: plinth/modules/upgrades/templates/upgrades.html:45 msgid "" @@ -2665,72 +2871,76 @@ msgid "" "other packages. During the upgrade, this web interface may be temporarily " "unavailable and show an error. Refresh the page to continue." msgstr "" +"В зависимости от количества пакетов для установки это может занять " +"продолжительное время до завершения. Во время обновления вы не сможете " +"установить другие пакеты. Во время обновления это веб-интерфейс может быть " +"временно недоступен и показывать ошибку. Обновите страницу, чтобы продолжить." #: plinth/modules/upgrades/templates/upgrades.html:58 msgid "Upgrade now »" -msgstr "" +msgstr "Обновить сейчас »" #: plinth/modules/upgrades/templates/upgrades.html:65 msgid "A package manager is running." -msgstr "" +msgstr "Диспетчер пакетов выполняется." #: plinth/modules/upgrades/templates/upgrades.html:70 msgid "Recent log from upgrades:" -msgstr "" +msgstr "Журнал обновлений:" #: plinth/modules/upgrades/views.py:36 plinth/modules/upgrades/views.py:66 msgid "Automatic Upgrades" -msgstr "" +msgstr "Автоматические обновления" #: plinth/modules/upgrades/views.py:38 msgid "Upgrade Packages" -msgstr "" +msgstr "Обновление пакетов" #: plinth/modules/upgrades/views.py:96 msgid "Upgrade process started." -msgstr "" +msgstr "Начался процесс обновления." #: plinth/modules/upgrades/views.py:99 msgid "Starting upgrade failed." -msgstr "" +msgstr "Сбой при запуске обновления." #: plinth/modules/upgrades/views.py:102 msgid "Package Upgrades" -msgstr "" +msgstr "Обновления Пакета" #: plinth/modules/upgrades/views.py:131 #, python-brace-format msgid "Error when configuring unattended-upgrades: {error}" -msgstr "" +msgstr "Ошибка при настройке автоматического обновления: {error}" #: plinth/modules/upgrades/views.py:136 msgid "Automatic upgrades enabled" -msgstr "" +msgstr "Автоматические обновления включены" #: plinth/modules/upgrades/views.py:138 msgid "Automatic upgrades disabled" -msgstr "" +msgstr "Автоматические обновления отключены" #: plinth/modules/users/__init__.py:36 msgid "Users and Groups" -msgstr "" +msgstr "Пользователи и группы" #: plinth/modules/users/__init__.py:65 #, python-brace-format msgid "Check LDAP entry \"{search_item}\"" -msgstr "" +msgstr "Проверьте запись LDAP \"{search_item}\"" #: plinth/modules/users/forms.py:28 msgid "admin" -msgstr "" +msgstr "admin" #: plinth/modules/users/forms.py:29 msgid "wiki" -msgstr "" +msgstr "Wiki" #: plinth/modules/users/forms.py:41 msgid "Groups" -msgstr "" +msgstr "Группы" #: plinth/modules/users/forms.py:45 msgid "" @@ -2740,15 +2950,20 @@ msgid "" "able to log in to all services. They can also log in to the system through " "SSH and have administrative privileges (sudo)." msgstr "" +"Выберите, какие службы должны быть доступны для нового пользователя. " +"Пользователь сможет войти в службы, которые поддерживают единый входа через " +"LDAP, если они находятся в соответствующих группах.

" +"Пользователи в группе администратора имеют доступ ко всем службам. Они также " +"могут войти в систему через SSH и иметь административные привилегии (sudo)." #: plinth/modules/users/forms.py:80 #, python-brace-format msgid "Failed to add new user to {group} group." -msgstr "" +msgstr "Не удалось добавить нового пользователя в группу {group}." #: plinth/modules/users/forms.py:92 msgid "SSH Keys" -msgstr "" +msgstr "SSH ключи" #: plinth/modules/users/forms.py:96 msgid "" @@ -2756,61 +2971,65 @@ msgid "" "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" +"Установка открытого ключа SSH позволит пользователю безопасно войти в " +"систему, не используя пароль. Вы можете ввести несколько ключей, по одному " +"на каждой строке. Пустые строки и строки, начинающиеся с # будут " +"игнорироваться." #: plinth/modules/users/forms.py:136 msgid "Renaming LDAP user failed." -msgstr "" +msgstr "Переименование пользователя LDAP не удалось." #: plinth/modules/users/forms.py:148 msgid "Failed to remove user from group." -msgstr "" +msgstr "Не удалось удалить пользователя из группы." #: plinth/modules/users/forms.py:159 msgid "Failed to add user to group." -msgstr "" +msgstr "Не удалось добавить пользователя в группу." #: plinth/modules/users/forms.py:188 msgid "Changing LDAP user password failed." -msgstr "" +msgstr "Изменение LDAP пароля пользователя не удалось." #: plinth/modules/users/templates/users_change_password.html:27 #, python-format msgid "Change Password for %(username)s" -msgstr "" +msgstr "Изменение пароля для %(username)s" #: plinth/modules/users/templates/users_change_password.html:40 msgid "Save Password" -msgstr "" +msgstr "Сохранить пароль" #: plinth/modules/users/templates/users_create.html:42 #: plinth/modules/users/views.py:36 plinth/modules/users/views.py:56 msgid "Create User" -msgstr "" +msgstr "Создать пользователя" #: plinth/modules/users/templates/users_delete.html:26 #: plinth/modules/users/views.py:110 msgid "Delete User" -msgstr "" +msgstr "Удаление пользователя" #: plinth/modules/users/templates/users_delete.html:29 #, python-format msgid "Delete user %(username)s permanently?" -msgstr "" +msgstr "Окончательно удалить пользователя %(username)s?" #: plinth/modules/users/templates/users_delete.html:38 #, python-format msgid "Delete %(username)s" -msgstr "" +msgstr "Удаление %(username)s" #: plinth/modules/users/templates/users_list.html:46 #, python-format msgid "Delete user %(username)s" -msgstr "" +msgstr "Удалить пользователя %(username)s" #: plinth/modules/users/templates/users_list.html:53 #, python-format msgid "Edit user %(username)s" -msgstr "" +msgstr "Редактирование пользователя %(username)s" #: plinth/modules/users/templates/users_update.html:39 #, python-format @@ -2818,60 +3037,64 @@ msgid "" "Use the change password form to " "change the password." msgstr "" +"Используйте форму смены пароля для " +"смены пароля." #: plinth/modules/users/templates/users_update.html:53 msgid "Save Changes" -msgstr "" +msgstr "Сохранить изменения" #: plinth/modules/users/views.py:34 plinth/modules/users/views.py:69 msgid "Users" -msgstr "" +msgstr "Пользователи" #: plinth/modules/users/views.py:54 #, python-format msgid "User %(username)s created." -msgstr "" +msgstr "Пользователь %(username)s создан." #: plinth/modules/users/views.py:78 #, python-format msgid "User %(username)s updated." -msgstr "" +msgstr "Пользователь %(username)s обновлен." #: plinth/modules/users/views.py:79 msgid "Edit User" -msgstr "" +msgstr "Редактирование пользователя" #: plinth/modules/users/views.py:120 #, python-brace-format msgid "User {user} deleted." -msgstr "" +msgstr "Пользователь {user} удален." #: plinth/modules/users/views.py:127 msgid "Deleting LDAP user failed." -msgstr "" +msgstr "Сбой при удалении LDAP пользователя." #: plinth/modules/users/views.py:136 msgid "Change Password" -msgstr "" +msgstr "Смена пароля" #: plinth/modules/users/views.py:137 msgid "Password changed successfully." -msgstr "" +msgstr "Пароль успешно изменен." #: plinth/modules/xmpp/__init__.py:41 plinth/modules/xmpp/__init__.py:46 #: plinth/modules/xmpp/templates/xmpp.html:26 plinth/modules/xmpp/views.py:75 msgid "Chat Server (XMPP)" -msgstr "" +msgstr "Чат-сервер (XMPP)" #: plinth/modules/xmpp/forms.py:29 msgid "Enable XMPP" -msgstr "" +msgstr "Включить XMPP" #: plinth/modules/xmpp/templates/xmpp.html:29 msgid "" "XMPP is an open and standardized communication protocol. Here you can run " "and configure your XMPP server, called ejabberd." msgstr "" +"XMPP является открытым и стандартизированным коммуникационным протоколом. " +"Здесь вы можете запустить и настроить сервер XMPP, называемый ejabberd." #: plinth/modules/xmpp/templates/xmpp.html:36 msgid "" @@ -2879,6 +3102,9 @@ msgid "" "any other XMPP client." msgstr "" +"Для общения вы можете использовать веб-клиент или иной " +"XMPP " +"клиент." #: plinth/modules/xmpp/templates/xmpp.html:45 #, python-format @@ -2887,61 +3113,64 @@ msgid "" "like username@%(domainname)s. You can setup your domain on the system " "Configure page." msgstr "" +"Ваш домен сервера XMPP имеет значение %(domainname)s Идентификаторы " +"пользователей будет выглядеть как username@%(domainname)s. Вы можете " +"настроить ваш домен на странице Настройка." #: plinth/modules/xmpp/templates/xmpp.html:55 msgid "Launch web client" -msgstr "" +msgstr "Запустить веб-клиент" #: plinth/modules/xmpp/templates/xmpp.html:63 msgid "ejabberd is running" -msgstr "" +msgstr "ejabberd запущен" #: plinth/modules/xmpp/templates/xmpp.html:66 msgid "ejabberd is not running" -msgstr "" +msgstr "ejabberd не запущен" #: plinth/network.py:39 msgid "PPPoE" -msgstr "" +msgstr "PPPоE" #: plinth/package.py:156 msgid "packages not found" -msgstr "" +msgstr "пакеты не найдены" #: plinth/package.py:263 msgid "Installed and configured packages successfully." -msgstr "" +msgstr "Установка и настройка пакетов завершена." #: plinth/package.py:268 #, python-brace-format msgid "Error installing packages: {string} {details}" -msgstr "" +msgstr "Ошибка при установке пакетов: {string}{details}" #: plinth/service.py:73 msgid "Web Server" -msgstr "" +msgstr "Веб-сервер" #: plinth/service.py:74 msgid "Web Server over Secure Socket Layer" -msgstr "" +msgstr "Веб-сервер через Secure Socket Layer" #: plinth/service.py:76 msgid "Secure Shell (SSH) Server" -msgstr "" +msgstr "Secure Shell (SSH) сервер" #: plinth/service.py:79 #, python-brace-format msgid "{box_name} Web Interface (Plinth)" -msgstr "" +msgstr "{box_name} Веб-интерфейс (Plinth)" #: plinth/templates/404.html:25 msgid "404" -msgstr "" +msgstr "404" #: plinth/templates/404.html:28 #, python-format msgid "Requested page %(request_path)s was not found." -msgstr "" +msgstr "Запрошенная страница %(request_path)s не найдена." #: plinth/templates/404.html:34 msgid "" @@ -2949,10 +3178,13 @@ msgid "" "Plinth project issue " "tracker." msgstr "" +"Если вы считаете, что эта недостающая страница должна существовать, " +"пожалуйста отправите сообщение об ошибке на issue tracker." #: plinth/templates/500.html:25 msgid "500" -msgstr "" +msgstr "500" #: plinth/templates/500.html:28 msgid "" @@ -2960,61 +3192,67 @@ msgid "" "report the error on the bug tracker so we can fix it." msgstr "" +"Это внутренняя ошибка, не Вы были её причиной и вряд ли можете её устранить. " +"Пожалуйста, сообщите об ошибке на bug tracker и мы исправим " +"это." #: plinth/templates/base.html:49 #, python-format msgid "Plinth administrative interface for the %(box_name)s" -msgstr "" +msgstr "Административный интерфейс Plinth для %(box_name)s" #: plinth/templates/base.html:83 msgid "Toggle navigation" -msgstr "" +msgstr "Отображение навигации" #: plinth/templates/base.html:125 plinth/templates/base.html.py:126 msgid "Change password" -msgstr "" +msgstr "Смена пароля" #: plinth/templates/base.html:129 plinth/templates/base.html.py:130 #: plinth/templates/base.html:143 plinth/templates/base.html.py:145 msgid "Log out" -msgstr "" +msgstr "Выход" #: plinth/templates/base.html:135 plinth/templates/base.html.py:137 msgid "Log in" -msgstr "" +msgstr "Войти" #: plinth/templates/login.html:35 msgid "Login" -msgstr "" +msgstr "Логин" #: plinth/templates/package_install.html:35 msgid "Installation" -msgstr "" +msgstr "Установка" #: plinth/templates/package_install.html:40 msgid "" "This feature requires addtional packages to be installed. Do you wish to " "install them?" msgstr "" +"Эта функция требует дополнительные пакеты для установки. Вы хотите их " +"установить?" #: plinth/templates/package_install.html:49 msgid "Package" -msgstr "" +msgstr "Пакет" #: plinth/templates/package_install.html:50 msgid "Summary" -msgstr "" +msgstr "Резюме" #: plinth/templates/package_install.html:67 msgid "Install" -msgstr "" +msgstr "Установка" #: plinth/templates/package_install.html:74 #, python-format msgid "Installing %(package_names)s: %(status)s" -msgstr "" +msgstr "Установка %(package_names)s: %(status)s" #: plinth/templates/package_install.html:84 #, python-format msgid "%(percentage)s%% complete" -msgstr "" +msgstr "%(percentage)s%% завершено" From ec687bcadc634551301858af50c3cccf019ce067 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Mon, 15 Feb 2016 10:35:41 -0500 Subject: [PATCH 118/189] Use docbook2html for html manual. There were some characters that xmlto wasn't handling correctly. --- doc/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/Makefile b/doc/Makefile index a233ab066..de97d8c3a 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -55,7 +55,7 @@ fetch: %.html: %.xml - xmlto html-nochunks $< + docbook2html --nochunks $< %.1: %.xml From 6d28e2220453b324e10bef8cf2146ed1dc6886b3 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Mon, 15 Feb 2016 10:36:27 -0500 Subject: [PATCH 119/189] fetch latest manual --- doc/freedombox-manual.xml | 695 ++++++++++++++++++++++--------- doc/images/cubieboard2_thumb.jpg | Bin 0 -> 6765 bytes 2 files changed, 496 insertions(+), 199 deletions(-) create mode 100644 doc/images/cubieboard2_thumb.jpg diff --git a/doc/freedombox-manual.xml b/doc/freedombox-manual.xml index c210621b2..9856c980d 100644 --- a/doc/freedombox-manual.xml +++ b/doc/freedombox-manual.xml @@ -7,7 +7,7 @@
FreedomBox Introduction - FreedomBox is a personal server that protects your privacy. It is a free software stack, a subset of the Debian universal operating system, that can be installed in many flavors of cheap and power-efficient hardware. The simplicity of setting up and operating a FreedomBox is similar to that of a smart phone. + FreedomBox is a personal server that protects your privacy. It is a free software stack, a subset of the Debian universal operating system, that can be installed in many flavors of inexpensive and power-efficient hardware. The simplicity of setting up and operating a FreedomBox is similar to that of a smart phone.
Smart Router FreedomBox runs in a physical computer and can route your traffic. It can sit between various devices at home such as mobiles, laptops and TVs and the Internet replacing a home wireless router. By routing traffic, FreedomBox can remove tracking advertisements and malicious web bugs before they ever reach your devices. FreedomBox can cloak your location and protect your anonymity by "onion routing" your traffic over Tor. FreedomBox provides a VPN server that you can use while you are away from home to keep your traffic secret on untrusted public wireless networks and to securely access various devices at home. It can also be carried along with your laptop and used to connect to public networks at work, school, or office to avail its services. It could be used in a village to provide communications throughout the village. In future, FreedomBox intends to provide support for alternative ways of connecting to the Internet such as Mesh networks. @@ -41,22 +41,30 @@ On first boot, the FreedomBox will perform initial setup and then reboot. This may take several minutes. - After the FreedomBox has rebooted, you can access Plinth through your web browser. + After the FreedomBox has rebooted, you can access its web interface (called Plinth) through your web browser. If your computer is connected directly to the FreedomBox through a second (LAN) ethernet port, you can browse to: or . - If your computer supports mDNS (GNU/Linux, Mac OSX and Windows with mDNS software installed), you can browse to: . + If your computer supports mDNS (GNU/Linux, Mac OSX and Windows with mDNS software installed), you can browse to: (or ) If neither of these methods are available, then you will need to figure out the IP address of your FreedomBox. You can use the "nmap" program to find its IP address: nmap -p 80 --open -sV 192.168.0.0/24 + Your FreedomBox will show up as an IP address with an open tcp port 80 using Apache httpd service on Debian, such as the example below which would make it accessible at : + Nmap scan report for 192.168.0.165 + Host is up (0.00088s latency). + PORT STATE SERVICE VERSION + 80/tcp open http Apache httpd 2.4.17 ((Debian)) - When you first access Plinth, you will see a welcome page that asks you to provide some basic information for setting up your FreedomBox. + On accessing Plinth your browser will warn you that it communicates securely but that it regards the security certificate for doing so as invalid. This is a fact you need to accept because the certificate is auto generated on the box and therefore "self-signed" (the browser might also use words such as "untrusted", "not private", "privacy error" or "unknown issuer/authority"). Telling your browser that you are aware of this might involve pressing buttons such as "I understand the Risks", "proceed to ... (unsafe)" or "Add exception". + + + On the intial access you will see a welcome page that asks you to provide some basic information for setting up your FreedomBox. After completing the form, you will be logged in to Plinth and able to access apps and configuration through the interface. @@ -95,10 +103,39 @@ Release Notes The following are the release notes for each FreedomBox version.
- Version 0.7 (unreleased) + Version 0.8 (2016-02) - Translations! + Added Quassel, an IRC client that stays connected to IRC networks and can synchronize multiple frontends. + + + Improved first boot user interface. + + + Fixed Transmission RPC whitelist issue. + + + Added translations for Turkish, Chinese, and Russian. Fixed and updated translations in other languages. + + + Added Monkeysphere, which uses PGP web of trust for SSH host key verification. + + + Added Let's Encrypt, to obtain certificates for domains, so that browser certificate warnings can be avoided. + + + Added repro, a SIP server for audio and video calls. + + + Allow users to set their SSH public keys, so they can login over SSH without a password. + + +
+
+ Version 0.7 (2015-12-13) + + + Translations! Full translations of the interface in Danish, Dutch, French, German and Norwegian Bokmål, and partial Telugu. Support for OLinuXino A20 MICRO and LIME2 @@ -298,7 +335,7 @@
Download and Install - You may either use FreedomBox on one of the supported hardware, install it on a Debian machine, or deploy on a virtual machine. + Wellcome to the FreedomBox download page. You may either install FreedomBox on one of the supported inexpensive hardware, on a Linux Debian operating system, or deploy on a virtual machine. Installing on Debian is easy because FreedomBox is available as packages. On hardware, you may need a little bit of technical expertise to setup. What we are requiring is to buy a device and plug in an SD card. In case of trouble, please read and interact with the Questions and Answers page based on Freedombox-discuss mailing list archives.
Downloading on Debian If you are installing on Debian, you don't need to download these images. Instead read instructions on setting up FreedomBox on Debian. @@ -336,7 +373,7 @@ sub 4096R/4C1D4B57 2011-11-12 Finally, verify your downloaded image with its signature file .sig. For example: - $ gpg --verify freedombox-unstable_2015-01-15_beaglebone-armhf-card.tar.bz2.sig freedombox-unstable_2015-01-15_beaglebone-armhf-card.tar.bz2 + $ gpg --verify freedombox-unstable-free_2015-12-13_cubietruck-armhf.img.xz.sig freedombox-unstable-free_2015-12-13_cubietruck-armhf.img.xz gpg: Signature made Thursday 15 January 2015 09:27:50 AM IST using RSA key ID 0C9BC971 gpg: Good signature from "Sunil Mohan Adapa <sunil@medhas.org>" gpg: WARNING: This key is not certified with a trusted signature! @@ -388,15 +425,14 @@ Primary key fingerprint: BCBE BD57 A11F 70B2 3782 BC57 36C3 6144 0C9B C971 Decompress the downloaded image using tar: - $ tar -xjvf freedombox-unstable_2015-08-06_beaglebone-armhf-card.tar.bz2 - The above command is an example for the beaglebone image built on 2015-08-06. Your downloaded file name will be different. + $ xz -d freedombox-unstable-free_2015-12-13_cubietruck-armhf.img.xz + The above command is an example for the cubietruck image built on 2015-12-13. Your downloaded file name will be different. Copy the image to your card. Double check and make sure you don't write to your computer's main storage (such as /dev/sda). Also make sure that you don't run this step as root to avoid potentially overriding data on your hard drive due to a mistake in identifying the device or errors while typing the command. USB disks and SD cards inserted into the system should typically be write accessible to normal users. If you don't have permission to write to your SD card as a user, you may need to run this command as root. In this case triple check everything before you run the command. Another safety precaution is to unplug all external disks except the SD card before running the command. For example, if your SD card is /dev/sdf as noted in the first step above, then to copy the image, run: - $ cd build -$ dd bs=1M if=freedombox-unstable_2015-08-06_beaglebone-armhf-card.img of=/dev/sdf conv=fdatasync - The above command is an example for the beaglebone image built on 2015-08-06. Your image file name will be different. + $ dd bs=1M if=freedombox-unstable-free_2015-12-13_cubietruck-armhf.img of=/dev/sdf conv=fdatasync + The above command is an example for the cubietruck image built on 2015-12-13. Your image file name will be different. When picking a device, use the drive-letter destination, like /dev/sdf, not a numbered destination, like /dev/sdf1. The device without a number refers to the entire device, while the device with a number refers to a specific partition. We want to use the whole device. Downloaded images contain complete information about how many partitions there should be, their sizes and types. You don't have to format your SD card or create partitions. All the data on the SD card will be wiped off during the write process. @@ -414,6 +450,10 @@ $ dd bs=1M if=freedombox-unstable_2015-08-06_beaglebone-armhf-card.img of=/dev/s Apps
Anonymity Network (Tor) +
+ What is Tor? + Tor is a network of server operated by volunteers. It allows users of these servers to improve their privacy and security while surfing on the Internet. You and your friends are able to access to your FreedomBox via Tor network without revealing its IP address. Activating Tor application on your FreedomBox, you will be able to offer remote services (chat, wiki, file sharing, etc...) without showing your location. This application will give you a better protection than a public web server because you will be less exposed to intrusive people on the web. +
Using Tor to browse anonymously Tor Browser is the recommended way to browse the web using Tor. You can download the Tor Browser from and follow the instructions on that site to install and run it. @@ -430,11 +470,36 @@ $ dd bs=1M if=freedombox-unstable_2015-08-06_beaglebone-armhf-card.img of=/dev/s FreedomBox provides a Tor SOCKS port that other applications can connect to, in order to route their traffic over the Tor network. This port is accessible on any interfaces configured in the internal firewall zone. To configure the application, set SOCKS Host to the internal network connection's IP address, and set the SOCKS Port to 9050.
+
+ Deluge +
+ What is Deluge? + Your FreedomBox provides a Deluge application to enable. Deluge is a lightweight Bit Torrent client. Bit Torrent is a communications protocol using peer-to-peer (P2P) file sharing. P2P is a system that aims to interconnect end-user machines. Highly configurable, Deluge offers functionalities in the form of plugins. +
+
+
+ Transmission +
+ What is Transmission ? + In addition to Deluge Bit Torrent, your FreedomBox provides a Transmission application to enable. Transmission is a lightweight Bit Torrent client allowing end-user machine to share files (documents, pictures, sounds, videos and programs). Transmission is well known for its simplicity and a default configuration that "Just Works". +
+
+
+ Shaarli +
+ What is Shaarli? + Shaarli is personal (single-user) bookmarking application to install on your FreedomBox. It can also be used for micro-blogging, pastebin, online notepad and snippet archive. Shaarli is designed as a no-database delicious clone. As such, it provides very fast services, easy backup and import/export links as desktop or mobile browser bookmarks. Links stored can be public or private. Shaarli delivers ATOM and RSS feeds from its minimalist interface. +
+
Chat Server (XMPP) +
+ What is XMPP? + XMPP is a federated protocol for Instant Messaging. This means that users who have accounts on one server, can talk to users that are on another server. +
Setting the Domain Name - XMPP is a federated protocol for Instant Messaging. This means that users who have accounts on one server, can talk to users that are on another server. However, for this to work, your FreedomBox needs to have a Domain Name that can be accessed over the public Internet. You can read more about obtaining a Domain Name in the Dynamic DNS section of this manual. + For XMPP to work, your FreedomBox needs to have a Domain Name that can be accessed over the public Internet. You can read more about obtaining a Domain Name in the Dynamic DNS section of this manual. Once you have a Domain Name, you can tell your FreedomBox to use it by setting the Domain Name in the System Config. Please note that Pagekite does not support the XMPP protocol at this time.
@@ -445,9 +510,12 @@ $ dd bs=1M if=freedombox-unstable_2015-08-06_beaglebone-armhf-card.img of=/dev/s
Dynamic DNS - In order reach a server on the Internet, the server needs to have permanent address also know as the static IP address. Many Internet service providers don't provide home users with a static IP address or they charge more providing a static IP address. Instead they provide the home user with an IP address that changes every time the user connects to the Internet. Clients wishing to contact the server will have difficulty reaching the server. - Dynamic DNS service providers assist in working around a problem. First they provide you with a domain name, such as 'myhost.example.org'. Then they associate your IP address, whenever it changes, with this domain name. Then anyone intending to reach the server will be to contact the server using the domain name 'myhost.example.org' which always points to the latest IP address of the server. - For this to work, every time you connect to the Internet, you will have to tell your Dynamic DNS provider what your current IP address is. Hence you need special software on your server to perform this operation. The Dynamic DNS function in FreedomBox will allow users without a static public IP address to push the current public IP address to a Dynamic DNS Server. This allows you to expose services on FreedomBox, such as ownCloud, to the Internet. +
+ What is Dynamic DNS? + In order to reach a server on the Internet, the server needs to have permanent address also know as the static IP address. Many Internet service providers don't provide home users with a static IP address or they charge more providing a static IP address. Instead they provide the home user with an IP address that changes every time the user connects to the Internet. Clients wishing to contact the server will have difficulty reaching the server. + Dynamic DNS service providers assist in working around a problem. First they provide you with a domain name, such as 'myhost.example.org'. Then they associate your IP address, whenever it changes, with this domain name. Then anyone intending to reach the server will be to contact the server using the domain name 'myhost.example.org' which always points to the latest IP address of the server. + For this to work, every time you connect to the Internet, you will have to tell your Dynamic DNS provider what your current IP address is. Hence you need special software on your server to perform this operation. The Dynamic DNS function in FreedomBox will allow users without a static public IP address to push the current public IP address to a Dynamic DNS Server. This allows you to expose services on FreedomBox, such as ownCloud, to the Internet. +
GnuDIP vs. Update URL There are two main mechanism to notify the Dynamic DNS server of your new IP address; using the GnuDIP protocol and using the Update URL mechanism. @@ -510,51 +578,73 @@ $ dd bs=1M if=freedombox-unstable_2015-08-06_beaglebone-armhf-card.img of=/dev/s
+
+ Roundcube +
+ What is Roundcube? + RoundCube is a browser-based multilingual email client with an application-like user interface. RoundCube is using the Internet Message Access Protocol (IMAP) to access e-mail on a remote mail server. It supports MIME to send files, and provides particularly address book, folder management, message searching and spell checking. +
+
+
+ ownCloud +
+ What is ownCloud? + ownCloud is a self-hosted file sync and share server. It provides access to your data through a platform to view, sync and share across devices. Calendars and Contacts feature will help you keeping google at a nice distance. ownCloud's functionalities are native or available via plugins (Collaborative Editing, Play Music, Watch Movies, Store Passwords, Dashboard, Mozilla Sync...) via +
+
+ Installation + Clicking on the ownCloud application in Plinth will show an installation prompt. Proceed to install. After the installation, visit the /owncloud link provided in the ownCloud page. First time installation wizard will show up asking for administrator username and password to setup (no additional details such as database configuration are requested). After providing the details, you will be logged. You will be able to start using the ownCloud and create more users. +
+ External Storage + ownCloud's external storage plugin allows you to expose the contents of a hard drive or those of an online storage account as a folder. Following are the steps required to setup such storage. + + + Mount your hard drive or external storage to any fixed directory on the system. + + + Install two packages needed via the 'apt-get' on the SSH command line shell (this step will not be needed in future): + + + $ sudo apt-get install php-google-api-php-client php-dropbox + + + + + Goto ownCloud Apps section and enable 'External Storage Support' plugin. + + + Goto 'Admin' section and add your hard drive mount path in the external storage section. This folder will now show up in your folders list to access and sync across devices. + + +
+
+
PageKite - PageKite is free Software solution for tunneling HTTP, HTTPS and SSH servers through firewalls and NAT. - See PageKite website. +
+ What is PageKite? + PageKite makes local websites and services publicly accessible immediately without creating yourself a public IP address. PageKite provides "Kites" and "Services". Kites aims to make accessible in a second a web page (for instance foo.pagekite.me). Services can expose a file or a folder. Technically speaking, PageKite is free Software solution for tunneling HTTP, HTTPS and SSH servers through firewalls and NAT. +
+
+ Use PageKite + See PageKite website. +
Secure Shell - FreedomBox runs openssh-server server by default allowing remote logins from all interfaces. If your hardware device is connected to a monitor and a keyboard, you may login directly as well. Regular operation of FreedomBox does not require you to use the shell. However, some tasks or identifying a problem may require you to login to a shell. +
+ What is Secure Shell? + FreedomBox runs openssh-server server by default allowing remote logins from all interfaces. If your hardware device is connected to a monitor and a keyboard, you may login directly as well. Regular operation of FreedomBox does not require you to use the shell. However, some tasks or identifying a problem may require you to login to a shell. +
Default User Account - FreedomBox is bundled with a preset user account. This user also has superuser privileges via sudo. The default credentials are: - - - - - - - - - Username - - - - - Password - - - - - - fbx - - - frdm - - - - - - - - Change the password - - Soon after you get your FreedomBox working, you must change the default password for the fbx user. If you fail to do this, since the password is public knowledge, anyone will be able to take control of your device. - + The pre-built FreedomBox images have a default user account called "fbx". However the password is not set for this account, so it will not be possible to log in with this account by default. + There is a script included in the freedom-maker program, that will allow you to set the password for this account, if it is needed. To set a password for the "fbx" user: + 1. Decompress the image file. + 2. Get a copy of freedom-maker from . + 3. Run sudo ./bin/passwd-in-image <image-file> fbx. + 4. Copy the image file to SD card and boot device as normal. + The "fbx" user also has superuser privileges via sudo.
Logging In @@ -582,8 +672,26 @@ $ dd bs=1M if=freedombox-unstable_2015-08-06_beaglebone-armhf-card.img of=/dev/s This will ask you for your current password before giving you the opportunity to set a new one.
+
+ Mumble +
+ What is Mumble? + Mumble is a voice chat software. Primarily intended for use while gaming, it is suitable for simple talking with high audio quality, noise suppression, encrypted communication, public/private-key authentication by default, and "wizards" to configure your microphone for instance. A user can be marked as a "priority speaker" within a channel. +
+
+
+ Privoxy +
+ What is Privoxy? + Privoxy is a software for security, privacy, and accurate control over the web. It provides a much more powerful web proxy (anonymity on the web) than what your browser can offer. Privoxy "is a proxy that is primarily focused on privacy enhancement, ad and junk elimination and freeing the user from restrictions placed on his activities" (source: Privoxy FAQ). Learning about networking protocols like HTTP, about HTML, and "Regular Expressions" can help a lot using Privoxy. +
+
Wiki & Blog (Ikiwiki) +
+ What is Ikiwiki? + Ikiwiki converts wiki pages into HTML pages suitable for publishing on a website. It provides particularly blogging, podcasting, calendars and a large selection of plugins. +
Creating a wiki or blog You can create a wiki or blog to be hosted on your FreedomBox through the Wiki & Blog (Ikiwiki) page in Plinth. The first time you visit this page, it will ask to install packages required by Ikiwiki. @@ -602,24 +710,27 @@ $ dd bs=1M if=freedombox-unstable_2015-08-06_beaglebone-armhf-card.img of=/dev/s
- Unhosted - From : - - Also known as "serverless", "client-side", or "static" web apps, unhosted web apps do not send your user data to their server. Either you connect your own server at runtime, or your data stays within the browser. - - Note: This module is not yet part of mainline FreedomBox, but available for testing via . + Unhosted Storage
- Set up remoteStorage - Your FreedomBox contains the restore remoteStorage server, which means that it can serve as your personal backend for Unhosted apps. Make sure the package is installed in your Plinth. - Then create a remoteStorage account at https://<yourdomain>/restore/. - Warning: These user accounts are currently not integrated with Plinth user management, and public sign-up is enabled! + What is Unhosted? + Unhosted is a way to uncouple web applications from data. No matter where a web application is served from, the data can be stored on an Unhosted storage server of user's choice. Unhosted web apps do not send your user data to their server and are hence known as "serverless", "client-side", or "static" web apps. Either you connect your own server at runtime, or your data stays within the browser. Your FreedomBox can become your Unhosted storage server using a remoteStorage server know as reStore. + + This module is currently disabled in FreedomBox as the package required for reStore server is not available in Debian yet. The package is available for testing via + +
+
+ Setup + Your FreedomBox contains a remoteStorage server called reStore, that can serve as your personal storage server for Unhosted web apps. To setup reStore, simply install and enable in FreedomBox web UI. After the setup, create an account by visiting the link provided on the Unhosted app page https://<yourdomain>/restore/. + + User accounts are currently not integrated with Plinth user management, and public sign-up is enabled! +
Try Unhosted apps - Once your FreedomBox is set up, and both PageKite and remoteStorage are running, try one of the following Unhosted apps (more are listed at ): + Once Unhosted is setup on FreedomBox and when FreedomBox is accessible by a domain name (such by using PageKite, Dynamic DNS or Tor Hidden Service), try one of the following Unhosted web apps (more are listed at ): - (a notepad) + (a note taking application) (list your favorite drinks) @@ -628,7 +739,7 @@ $ dd bs=1M if=freedombox-unstable_2015-08-06_beaglebone-armhf-card.img of=/dev/s (a simple todo list) - To connect the Unhosted app to your remoteStorage, click on the remoteStorage icon and type your address <user>@<yourdomain>, e.g.: + To connect the Unhosted app to your FreedomBox's Unhosted storage, click on the remoteStorage icon and type your address <user>@<yourdomain>, e.g.: @@ -639,8 +750,40 @@ $ dd bs=1M if=freedombox-unstable_2015-08-06_beaglebone-armhf-card.img of=/dev/s - If this doesn't work, make sure that both PageKite and remoteStorage are running, and that your FreedomBox SSL certificate is trusted in your current browser session (important when using private browsing). - Finish the OAuth flow by authenticating with your password and authorizing access, then you should get redirected back to the Unhosted app, and you should be able to use it. All data of the Unhosted app is stored on your FreedomBox. + If this doesn't work, make sure that + + + FreedomBox has a domain name using PageKite, Dynamic DNS or Tor Hidden Service. + + + The reStore server is running. + + + You have created the account specified in the reStore server. + + + Your FreedomBox SSL certificate is trusted in your current browser session (important when using private browsing). + + + Finish the OAuth flow by authenticating with your password and authorizing access, then you should get redirected back to the Unhosted app, and be able to use it. All data of the Unhosted web app is now stored on your FreedomBox. +
+
+
+ OpenVPN +
+ What is OpenVPN? + OpenVPN provides to your FreedomBox a virtual private network service. You can use this software for remote access, site-to-site VPNs and Wi-Fi security. OpenVPN includes support for dynamic IP addresses and NAT. +
+
+
+ GnuSocial +
+ What is GNU social? + GNU social is a continuation of the StatusNet project. It is social communication software for both public and private communications. It is widely supported and has a large userbase. It is already used by the Free Software Foundation, and Richard Stallman himself. Think of GNU Social as twitter and beyond. +
+
+ Status of package + GNU Social is still getting packaged for debian and will be available soon for everyone to use. check the progress by tracking the bug #782812.
@@ -746,6 +889,7 @@ nmcli con modify "<connection_name>" connection.zone internal Manual Upgrades In the Plinth web interface, you can initiate a manual upgrade process from Upgrades page of the Settings section. Note that once the upgrades start, it may take a long time to complete and Plinth may seem to wait for the page to load. Under some circumstances, automatic upgrades may fail and require you perform a manual upgrade action. Even upgrades initiated from Plinth may not finish properly. This may be because the upgrade process requires you to make a decision. In these cases, manual upgrade on the terminal may be the only option. + In addition, while the upgrade task is running any application installations will wait until the upgrade task is finished. Depending on the hardware, the upgrade task may take a little time, therefore, giving the impression that the application installation stalled. To perform manual upgrades on the terminal, login into FreedomBox on a terminal or using a remote secure shell (see Secure Shell section). Then run the following commands: $ sudo su - Password: @@ -2192,9 +2336,9 @@ firewall-cmd --permanent --zone=internal --remove-service=xmpp-bosh firewall-cmd --zone=internal --remove-port=<port>/<protocol> firewall-cmd --permanent --zone=internal --remove-port=<port>/<protocol> Example: - firewall-cmd --zone=internal --remove-service=5353/udp + firewall-cmd --zone=internal --remove-port=5353/udp firewall-cmd --permanent --zone=internal --remove-port=5353/udp - To add a port to a zone: + To add a service to a zone: firewall-cmd --zone=<zone> --add-service=<service> firewall-cmd --permanent --zone=<zone> --add-service=<interface> Example: @@ -2204,7 +2348,7 @@ firewall-cmd --permanent --zone=internal --add-service=xmpp-bosh firewall-cmd --zone=internal --add-port=<port>/<protocol> firewall-cmd --permanent --zone=internal --add-port=<port>/<protocol> Example: - firewall-cmd --zone=internal --add-service=5353/udp + firewall-cmd --zone=internal --add-port=5353/udp firewall-cmd --permanent --zone=internal --add-port=5353/udp
@@ -2220,10 +2364,10 @@ firewall-cmd --permanent --zone=<zone> --remove-interface=<interface> firewall-cmd --permanent --zone=external --remove-interface=eth0 To add an interface to a zone: firewall-cmd --zone=<zone> --add-interface=<interface> -firewall-cmd --permanent --zone=<zone> --remove-interface=<interface> +firewall-cmd --permanent --zone=<zone> --add-interface=<interface> Example: firewall-cmd --zone=internal --add-interface=eth0 -firewall-cmd --permanent --zone=internal --remove-interface=eth0 +firewall-cmd --permanent --zone=internal --add-interface=eth0
@@ -2263,6 +2407,23 @@ firewall-cmd --permanent --zone=internal --remove-interface=eth0 (based on Cubietruck) + + + + + + + + + Cubieboard 2 + + + + + + Cubieboard2 + + @@ -2280,6 +2441,8 @@ firewall-cmd --permanent --zone=internal --remove-interface=eth0 BeagleBone Black + + @@ -3076,27 +3239,27 @@ firewall-cmd --permanent --zone=internal --remove-interface=eth0 First and the recommended option is to use the Bridge type of network. This option exposes the guest machine to the same network that host network is connected to. The guest obtains network configuration information from a router or DHCP server on the network. The guest will appear as just another machine in the network. A major advantage of this of setup is that the host and all other machines in the network will be able to access the services provided by guest without requiring any further setup. The only drawback of this approach is that if the host is not connected to any network, the guest's network will remain unconfigured making it inaccessible even from the host. - Second method is Host only type of networking. With a guest's network interface configured in this manner, it will only be accessible from the host machine. The guest will not able access any other machine but the host. It, however, does not require that the host machine be connected to a network. All services all accessible from the host machine without any special configuration such as port forwarding. + Second method is Host only type of networking. With a guest's network interface configured in this manner, it will only be accessible from the host machine. The guest will not able access any other machine but the host, so you do not have internet access on the guest. All services on the guest are available to the host machine without any configuration such as port forwarding. - The final option is to use the NAT type of network. This the networking type that VirtualBox assigns to a freshly created virtual machine. This option works even when host is not connected to any network. The guest is automatically configured and is able to access the Internet and local networks that host is able to connect to. However, the services provided by the guest require port forwarding configuration setup to be available outside. + The third option is to use the NAT type of network. This the networking type that VirtualBox assigns to a freshly created virtual machine. This option works even when host is not connected to any network. The guest is automatically configured and is able to access the Internet and local networks that host is able to connect to. However, the services provided by the guest require port forwarding configuration setup to be available outside. To configure this go to VM settings -> [Network] -> [Adapter] -> [Port Forwarding]. Map a port such as 2222 from host to guest port 22 and you will be able to ssh into FreedomBox from host machine as follows: - - - ssh -p 2222 fbx@localhost - - + ssh -p 2222 fbx@localhost Map 4443 on host to 443 on the guest. This make FreedomBox HTTPS service available on host using the URL You will need to add a mapping for each such services from host to guest. - + + The final option is to create two network interfaces, one host only and one NAT type. This way you can access the guest without any additional configuration, and you have internet access on the guest. The guest will be invisible to any other machines on the network. + + Summary of various network types: - + + @@ -3122,11 +3285,16 @@ firewall-cmd --permanent --zone=internal --remove-interface=eth0 Works without host connected to network + + + Guest has internet access + + - Bridged Adapter + Bridged @@ -3177,6 +3345,18 @@ firewall-cmd --permanent --zone=internal --remove-interface=eth0 + + + + + + + + (./) + + + + @@ -3232,6 +3412,18 @@ firewall-cmd --permanent --zone=internal --remove-interface=eth0 + + + + + + + + {X} + + + + @@ -3287,6 +3479,85 @@ firewall-cmd --permanent --zone=internal --remove-interface=eth0 + + + + + + + + (./) + + + + + + + + + NAT and Host + + + + + + + + + + {X} + + + + + + + + + + + + (./) + + + + + + + + + + + + (./) + + + + + + + + + + + + (./) + + + + + + + + + + + + (./) + + + + @@ -3294,13 +3565,7 @@ firewall-cmd --permanent --zone=internal --remove-interface=eth0
Using - You can log in as the following user: - - - Username: fbx - Password: frdm - - + You can log in as the user created during Plinth setup. After logging in, you can become root with the command sudo su. See the FreedomBox usage page for more details.
@@ -3309,6 +3574,12 @@ firewall-cmd --permanent --zone=internal --remove-interface=eth0
Tips & Troubleshooting +
+ Finding out the IP address of the virtual machine + This depends on the network configuration you chose. With a bridged adapter, your virtual machine gets its IP address from the DHCP server of your network, most likely of your Router. You can try the first couple of IP addresses or check your router web interface for a list of connected devices. + If you chose host-only adapter, the IP address is assigned by the DHCP server of your VirtualBox network. In the VirtualBox Manager, go to File -> Preferences -> Network -> Host-only Networks. You can see and edit the DHCP address range there, typically you get assigned addresses close to the Lower Address Bound. + Another possibility of finding the IP address is to login via the Virtualbox Manager (or similar software). The FreedomBox images do not have any default user accounts, so you need to set an initial user and password using the passwd-in-image script. +
Networking Problems with macchanger The package macchanger can cause network problems with VirtualBox. If you have a valid IP address on your guest's host network adapter (like 192.168.56.101) but are not able to ping or access the host (like 192.168.56.1), try uninstalling macchanger: @@ -3342,6 +3613,10 @@ $ sudo umount /tmp/vbox-root1 Use a fresh Debian installation Installing FreedomBox changes your Debian system in many important ways. This includes installing a firewall and regenerating server certificates. It is hence recommended that you install FreedomBox on a fresh Debian installation instead of an existing setup. + + use "fbx" as the login name + + If you choose to create an initial user account, use "fbx" as the login name. (Once the FreedomBox setup program completes, all user accounts except for the "fbx" account will be locked out via pam_access. This also affects sudo access.)
Installing on Debian @@ -3351,11 +3626,6 @@ $ sudo umount /tmp/vbox-root1 Install Debian Testing (Stretch) or Unstable (Sid) on your hardware. - - - If you choose to create an initial user account, use "fbx" as the login name. (Once the FreedomBox setup program completes, all user accounts except for the "fbx" account will be locked out via pam_access. This also affects sudo access.) - - Update your package list. @@ -3364,6 +3634,11 @@ $ sudo umount /tmp/vbox-root1 Install freedombox-setup package. $ sudo apt-get install freedombox-setup + + + When asked to specify whether Macchanger should be set up to run automatically, please choose "No". + + Run FreedomBox setup program. This installs further packages and sets up basic configuration. @@ -3735,116 +4010,135 @@ wget https://www.thinkpenguin.com/files/ath9k_firmware_free-version/htc_7010.fw< Contributing From code, design and translation to spreading the world and donation, here is a list of possible contributions to develop FreedomBox.
- Welcome to newcomers - As a newcomer, you are more than welcome to introduce yourself to all users and doers on the "FreedomBox-discuss" mailing list or on the #freedombox IRC channel. - In addition to make useful contacts, you can start reporting bugs and translate (see below) the wiki website and the FreedomBox web interface. -
-
- Development priorities - Upcoming priorities have been discussed end of October 2015 by several core developers and the Freedombox Foundation. You'll find on the mailing list archives a Medium Term Roadmap for 2015 and 2016. Please check next progess calls to keep yourself on track and meet members of the release team. A TODO page aggregates the complete list of the items to work on for FreedomBox. + Quick Links + + Progess calls + + + TODO page + + + Donation page +
- Add an Application - If you are a developer and wish to see an application available in FreedomBox, you can contribute by adding the application to FreedomBox. See the FreedomBox Developer Manual. + Welcome to newcomers + As a newcomer, you are more than welcome to introduce yourself to all users and doers on the "FreedomBox-discuss" mailing list or on the #freedombox IRC channel. In addition to make useful contacts, you can start reporting bugs and translate (see below) the wiki website and the FreedomBox web interface.
- Code - If you are a developer, you can contribute code to one of the sub-projects of FreedomBox. Step-by-step process of contributing code to FreedomBox is available. - - - FreedomBox Setup: a Debian package for setting up the FreedomBox. - - - Plinth: a web interface to administer the functions of FreedomBox. - - - Freedom Maker: a script to build FreedomBox disk images for use on various hardware devices or virtual machines. - - - You can pickup a task from one of the TODO lists. The individual page project pages contain information availabily of the code, how to build and TODO lists. + Development priorities + Upcoming priorities have been discussed end of October 2015 by several core developers and the Freedombox Foundation. You'll find on the mailing list archives a Medium Term Roadmap for 2015 and 2016. We want to enjoy soon a version 1.0. We are targeting mid January for a 0.8 release. The main focus of the 0.8 release is going to be integrated in the PGP based SSL Client authentication work. We are planning on a 0.9 polish release for late February with general usability improvements. + Please check next progess calls to keep yourself on track and meet members of the release team. A TODO page aggregates the complete list of the items to work on for FreedomBox.
- Design + Contributions needed +
+ Add an Application + If you are a developer and wish to see an application available in FreedomBox, you can contribute by adding the application to FreedomBox. See the FreedomBox Developer Manual. +
+
+ Bugs + List of bugs listed on Debian universal system. +
- User Experience Design - If you are a user experience designer, you can help FreedomBox with the following items: + Code + If you are a developer, you can contribute code to one of the sub-projects of FreedomBox. Step-by-step process of contributing code to FreedomBox is available. - UI experience for the Plinth web interface + FreedomBox Setup: a Debian package for setting up the FreedomBox. - Web design for freedomboxfoundation.org and FreedomBox wiki pages + Plinth: a web interface to administer the functions of FreedomBox. - Logo and branding (we currently have an identity manual and logos) + Freedom Maker: a script to build FreedomBox disk images for use on various hardware devices or virtual machines. + + You can pickup a task from one of the TODO lists. The individual page project pages contain information availabily of the code, how to build and TODO lists. +
+
+ Design +
+ User Experience Design + If you are a user experience designer, you can help FreedomBox with the following items: + + + UI experience for the Plinth web interface + + + Web design for freedomboxfoundation.org and FreedomBox wiki pages + + + Logo and branding (we currently have an identity manual and logos) + + + Possible designs for custom FreedomBox cases on single board computers + + + + User experience design + + + +
+
+ Technical Design + FreedomBox is still under development any many components are yet to be worked on. You can contribute to the discussion on various technical design and implementation aspects of FreedomBox. See: + + + + Design portal + + + +
+
+
+ Donate + The FreedomBox Foundation is a Delaware non-profit corporation in the process of applying for 501(c)(3) federal nonprofit recognition from the IRS. FreedomBox project is run by volunteers. You can help the project financially by donating via PayPal, Bitcoin or by mailing a check. Please see the donation page for details on how to donate. +
+
+ Document: User Manual, Website and Wiki + FreedomBox needs better documentation for users and contributors. FreedomBox manual is prepared by aggregating various pages on the wiki and exporting to various formats. The manual is then used in Plinth and elsewhere. + If you wish to contribute to the FreedomBox wiki (and consequently the FreedomBox manual), you can create a wiki account and start editing. + For contributing to the website please start a discussion on the FreedomBox mailing list. +
+
+ Quality Assurance + - Possible designs for custom FreedomBox cases on single board computers + FreedomBox already runs on many platforms and it is not possible for developers to test all possible platforms. If you have one of the supported hardware you can help with testing FreedomBox on the platform. - - User experience design - + When an application is made available on FreedomBox, not all of its functionality is tested in the real world by developer doing the work. Deploying the application and testing it will help ensure high quality applications in FreedomBox. + See the quality assurance page for a basic list of test cases to check for and information on reporting bugs.
- Technical Design - FreedomBox is still under development any many components are yet to be worked on. You can contribute to the discussion on various technical design and implementation aspects of FreedomBox. See: + Localization + All text visible to users of FreedomBox needs to be localized to various languages. This translation work includes: - - Design portal - + Plinth web interface for FreedomBox + + + FreedomBox documentation + + + FreedomBox website and wiki + + + Individual applications that FreedomBox exposes to users such as ownCloud, JWChat etc. + Some of the translation work are implemented in user interface (Plinth) since the 0.7 release. Documents for user interface translation are currently available on Transifex localization platform and GitHub. If you wish to see FreedomBox available for one of your languages, please start a discussion on the FreedomBox discuss mailing list or on the #freedombox IRC channel to avoid double translations. + For more information, please visit the FreedomBox translation landing page. +
+
+ Spread the Word + Speak to your family, friends, local community or at global conferences about the importance of FreedomBox. To be a successful project we need many more participants, be it users or contributors. Write about your efforts at the talks page and on the wiki.
-
-
- Donate - The FreedomBox Foundation is a Delaware non-profit corporation in the process of applying for 501(c)(3) federal nonprofit recognition from the IRS. FreedomBox project is run by volunteers. You can help the project financially by donating via PayPal, Bitcoin or by mailing a check. Please see the donation page for details on how to donate. -
-
- Document: User Manual, Website and Wiki - FreedomBox needs better documentation for users and contributors. FreedomBox manual is prepared by aggregating various pages on the wiki and exporting to various formats. The manual is then used in Plinth and elsewhere. - If you wish to contribute to the FreedomBox wiki (and consequently the FreedomBox manual), you can create a wiki account and start editing. - For contributing to the website please start a discussion on the FreedomBox mailing list. -
-
- Quality Assurance - - - FreedomBox already runs on many platforms and it is not possible for developers to test all possible platforms. If you have one of the supported hardware you can help with testing FreedomBox on the platform. - - - When an application is made available on FreedomBox, not all of its functionality is tested in the real world by developer doing the work. Deploying the application and testing it will help ensure high quality applications in FreedomBox. - - - See the quality assurance page for a basic list of test cases to check for and information on reporting bugs. -
-
- Localization - All text visible to users of FreedomBox needs to be localized to various languages. This translation work includes: - - - Plinth web interface for FreedomBox - - - FreedomBox documentation - - - FreedomBox website and wiki - - - Individual applications that FreedomBox exposes to users such as ownCloud, JWChat etc. - - - Some of the translation work are implemented in user interface (Plinth) since the 0.7 release. Documents for user interface translation are currently available on Transifex localization platform and GitHub. If you wish to see FreedomBox available for one of your languages, please start a discussion on the FreedomBox discuss mailing list or on the #freedombox IRC channel to avoid double translations. - For more information, please visit the FreedomBox translation landing page. -
-
- Spread the Word - Speak to your family, friends, local community or at global conferences about the importance of FreedomBox. To be a successful project we need many more participants, be it users or contributors. Write about your efforts at the talks page and on the wiki.
@@ -3879,7 +4173,7 @@ wget https://www.thinkpenguin.com/files/ath9k_firmware_free-version/htc_7010.fw<
Packaging the application Majority of the effort in creating an application for FreedomBox is to package it for Debian and get it uploaded to Debian repositories. Going through the process of packaging itself is outside the scope of this tutorial. It is, however, well documented elsewhere. You should start here. - Debian packaging might seem like an unnecessary process that takes time with its adherence to standards, review process, legal checks, etc. However, upon close examination, one will find that without these steps the goals of the FreedomBox project cannot be met without such a process. Some of the advantages of Debian packaging are listed below: + Debian packaging might seem like an unnecessary process that takes time with its adherence to standards, review process, legal checks, etc. However, upon close examination, one will find that without these steps the goals of the FreedomBox project cannot be met. Some of the advantages of Debian packaging are listed below: Legal check ensures that proprietary licensed code or code with bad licenses does not inadvertently creep in. @@ -3947,12 +4241,13 @@ wget https://www.thinkpenguin.com/files/ath9k_firmware_free-version/htc_7010.fw<
Writing the URLs For a user to visit our application in Plinth, we need to provide a URL. When the user visits this URL, a view is executed and a page is displayed. In urls.py write the following: - from django.conf.urls import patterns, url + from django.conf.urls import url + +from . import views -urlpatterns = patterns( - 'plinth.modules.ttrss.views', - url(r'^apps/ttrss/$', 'index', name='index'), - ) +urlpatterns = [ + url(r'^apps/ttrss/$', views.index, name='index'), +] This routes the /apps/ttrss/ URL to a view called index defined in plinth/modules/ttrss/views.py. This is no different than how routing URLs are written in Django. See Django URL dispatcher for more information.
@@ -4105,9 +4400,9 @@ def _apply_changes(request, old_status, new_status): modified = True if modified: - messages.success(request, _('Configuration updated')) + messages.success(request, 'Configuration updated') else: - messages.info(request, _('Setting unchanged')) + messages.info(request, 'Setting unchanged') We check to make sure that we don't try to disable the application when it is already disabled or try to enable the application when it is already enabled. Although Plinth's operations are idempotent, meaning that running them twice will not be problematic, we still wish avoid unnecessary operations for the sake of speed. We are actually perform the operation using Plinth actions. We will implement the action to be performed a bit later. After we perform the operation, we will show a message on the response page showing that the action was successful or that nothing happened. We use the Django messaging framework to accomplish this. See Django messaging framework for more information. @@ -4246,16 +4541,8 @@ def example_method():
Internationalization - Every string message that is visible to the user must localized to user's native language. For this to happen, our application needs to be internationalized. This requires marking the user visible messages for translation. Plinth applications use the gettext library to make that happen. - from gettext import gettext as _ - -def init(): - """Intialize the module.""" - menu = cfg.main_menu.get('apps:index') - menu.add_urlname(_('News Feed Reader (Tiny Tiny RSS)'), 'glyphicon-envelope', - 'ttrss:index', 600) - Notice that the menu item's display name is wrapped in the _() method call. Let us do that for the title of the application page too. - from gettext import gettext as _ + Every string message that is visible to the user must be localized to user's native language. For this to happen, our application needs to be internationalized. This requires marking the user visible messages for translation. Plinth applications use the Django's localization methods to make that happen. + from django.utils.translation import ugettext as _ def index(request): ... @@ -4263,6 +4550,16 @@ def index(request): {'title': _('News Feed Reader (Tiny Tiny RSS)'), 'status': status, 'form': form}) + Notice that the page's title is wrapped in the _() method call. Let us do that for the menu item of the application too. + from django.utils.translation import ugettext_lazy as _ + +def init(): + """Intialize the module.""" + menu = cfg.main_menu.get('apps:index') + menu.add_urlname(_('News Feed Reader (Tiny Tiny RSS)'), 'glyphicon-envelope', + 'ttrss:index', 600) + Notice that in this case, we have used the ugettext_lazy and in the first case we have used the regular ugettext. This is because in the second case the gettext lookup is made once and reused for every user looking at the interface. These users may each have a different language set for their interface. Lookup made for one language should not be used for other users. The _lazy method provided by Django makes sure that the return value is an object that will actually be converted to string at the final moment when the string is being displayed. In the first case, the looked is made and string is returned immediately. + All of this is the usual way internationalization is done in Django. See Django internationalization and localization documentation for more information.
Coding standards diff --git a/doc/images/cubieboard2_thumb.jpg b/doc/images/cubieboard2_thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5f9eab185f107c91cf00a7bfcc2c8264aeda42f8 GIT binary patch literal 6765 zcmb7obyQSq+xMOsQfh_<1sS?y5F`YK?(TFLNH#~Vo}Ps=+71q<%#~VaIUufNTH;No=Sav zf_n3`vuOxc38EY+uy8P$bI*QNnF0|X?@Q_3*%qZwa7JNuIe8d~V`@TKil}2AJqOcL z@Q)PVaeNZICfyc$fGLMuxxn|9x-7H0t{$~AX`YzMmV}i;^C`xmJQv)2l6umcDKb7; zrVvM5rqJt|;JHovwMLVf-QQ>nI7#bMAO?hDmttdEQ~s6LX`urxY&q<8Mh0)#7&Gfa zRyH~G!ge|P>l#EqDK=iNnk zJG9lfxf?uG^YINHRaF82u4DWVD!v7Uuafz~W~5Gct8ZF`A(N_g>F=*gki+`kL`@}= z2Ku}vn)#cpQ{1+B9aati__ruvAw$SmgpjS5x6&tvz&6f5asb@KnoZ0`DOK-XeR`kI zD&!w2fKNP@!W+7^^FKV+18K#?chnce?@ji-vZ-J2}blSbe}rkj~Y&RvnNCltVc4^*IKX@OSpb zHPjC6t4p&tLo{>tpW<0W7&Nq|neGK~FncJ)EqovBof2ia-_~2@F}F+`Y4kgxEkBBu zjHs#wy{lnq`53|zwCYB5@?@>4mBl#5yK=FEe;s-!{n2*B(&&9Us5V6}eH=M|b4+LF zN7A~>ykjk!j9b&cau=)6UvwucbuC)Xeu#b0Sar?O7y7_N%KQbbI4u@eTiezB7q1&( z@1mL0Ly9}{rnrUa@8@RO>F4|svv(veGU~q?#2Slohqc@QmR8TISzi&lFCO8uHAz|k zVK&w@wzCUMKH-%RenES93^E`};J}&BmJ-ahTi0f1ZH}gB=UQ}HNov;nbxZyr0`&tr z0{>QY?DhfAC+so2CTI?$7!r(H^E@J3cbaiR)X0~c{Hmd%>Zq72Z_Ny8B@mB}EhrE4 z{P>xwxN$N6;`h4=l57mfeko>*-xj={ z&DvR8UgW|=w_w86J%4eFnOH!6Ads9cZk)OS-mdL$-dX*AnsHY$RMik|n(u~D+7N+> z7E~v+wDmW6j23Z}`uw;^D61-Q{G>PiisBK6ou(u%`u)H>T6CP>q)ve8$K0NSeSP{D z%Eu4YJl>TS3H``umQdD3F-=s3HNR0=c4y*^^)(VfCI+=ZH z1B?_O%_|7~&}1w(G3XL6FW{Y6|D}HXLfc$v49VCbdtiD4kYV9|8-~rK`2QY?KMxoH zVnXV;h5SJ{Hq*+0s@~t%(2n`^1#5l>tHr@4)Bi3I0MkLik+Qmf?7@HAzeJE9>Ons< z8Pjl<5!oChH@!}ceo-62f!)uCJzXF$4lV>2o5cTd0)m0zP$5}eawcZ?6bQmv5UCeh zET@AR`}c_9$$;0rr10+*k1xuOPe|<^R8=T>wul+Djkc#RMtYBAT}o65*pz*q57^>5 ziWDl4E2lt&N-+AE71zKT<~cAt7Gf_tg=r55kIfo545f*`bvXRopk43d^1UO>zZLDs zZt**hLikuo&!4tB+uoKwr-r{@@wG{dl~%O_#{U`b%*2R{?c@{OGI4<<;^nnf!`bt0 zWwvo@m5hpk7s`*5f}#zjiDsKNFe#5^w#B?mT@~8Y1`!P6dnUuGm*UiJwgohCvErFO zh2ITaSbySuEUu2Gihm0ekp032eZeMf*27TqG$VR)>s+ERT|-GYVPH+aSp5leLS)Yk z5Gh>nBrVcGmp|701$FqB6rxiO?It)V)X>5}hWqgSGyEoKJ>)7tXS za}Cn;s;tmzKJ+8rcdK?BFvq>$!%q1Ee5NBedaR~nwH$VS*Ur zH5F(^Ri_dw8&?-wzOQ_Kb!wC{kc9|V+nU|>ke@-U^$1)czMJOIm{PQcMgQhH`Ixo# zZP!xOwVE!*LBQy1(Mxpc!btFrG?pt?%$w6y4=DM_DrZ71y4k zN%Oe~mm7zQg}k_eN`hQ(Q{2|+wwGk7VYgn^I}-muEwW`g5TNfTLMXYK zT|)9VLoXt{?1|^O5iM~{b7R%!E}bpJI*Y1BBxZ}tIWX6=Yo6_KgYIE6<=9ZFRR@47 z1N?OyaXVwWbEfhR5e+5rNOjYZ0IED!Kml>)#e@IwFNGX z?Tn91N4DC%n7Wb$E!$u3>)&q=D179Z4OOQ+xdEiecP|4?F^Un zTD|y<&90>X(&5Yc*=6DXDeGLeF6GHNLzj){(X;GRaRINVK;BE`($>EQ_)bUhu0y74 zGvBbVGIot;m8qW;*im-ihpiicJKk8_BPO`(t5MalmBSvpvT^HMqQ43a#4#Y}E!$>u zbmgYLcfX;o;K=>WsTF8#w$?kM&{dwdw7!kUQC1mtNe^GL8=t>i@ad-|E)=yQy>cCN zuF2kof)hGIY;ne(>fjqr{zaM=C0v*E(zxYWwqk6GpppIaLXfz85PN{o6Ew7K+>%@W zjoENAliZ9_Nu{i!yt8(wgcPIOY zXqo8@!B5e#FPb0R&L1C86xk#uf31!OZ;d>K6BhUr%+=;AbZ3Q=e|g~>0%0yFy>nWh zT(vz@Beo?-HTp)?BM^>3N{4Yaz^_&w2W(Y21 ziw*a|dMsmE@IY0U7+ZQaDlNAb5MsF1@Ia$7!4eIkr`n3JzzHfDTZKe`AiU8IV_`m= zonRfDrnw>NjcS?TN>Tje!-=2#wz#KC#dynyj=uKh$8z3-ve5|!qK3N+@7K!?A{naD z3NEAN{r03$J4q*8y5@e}*$!^EAR9XD$||Nx-}ls-^nzQ4jXfS$r>`3eR6;$3`Lm7{ zaxVxEG8*P+J_eN3!R-rV*4S65+Lf*EJ&bb0MYa05+EBk~XGhJO4W&UYqDn#+h#p7ly)_sJpL=pZtH$dxIclwuXN!U@; z)bJTt`o2E*c$(++b@|4|mdz30&i!>s;?68T!NoZ;g>8$T*u7Cf1{(_w~zQLAapHB&NVxOD8F)@nz*N9p@qFttYOZWB4A_ zsH5Y2413J8G?7lWf?wQND-7)ty_!~VLLGXz?i{=sfF=IbBP-1tImHvk2; zeE%7{{HZN;Gu;U$4+vzZ zx&tCfm+E~0h-)P-g?u0$4^{+ltGlb$8V6J*ZMy*Q)s7U(+l*c%0{a>>N;+01mDCU{ z2@r0nDdOM%TZ*08NKzl=QilAY0i0mjlz%AfJ!kqqBmlb=1v2vqAHjfvs@Juje@=+;R98}TRJ^r&=J%igHq29 zC;EN21f)uFzJ=1#iI;?p(iqR3n9-TD60qoz(S6+TJ{TJ&9EJ_>?=ZptUz|`TxDZlM zR#(T`{XdNybl%=C#cj?laX?$70jdgrsguz&_H!+`luelPTrrM@Y|yQ$FkgSe*A+%x z)wYhN3*z0XQEz_JHt?z5(^T&KRAyS@n;LI@OkqT?2fy!^rnkC^HPrCF+~U2~s(uDN za=)^Qv*;OG^xa^>$lQCmh15r$u0*x9A}XK1YbNZpmYI}pKTIXD6J3@Zqd1t_%kfbQ zkYRah_c^0+q*p5I@Q_r!Ms+1W*_Be)YprZ*UMC-SGn$Q`fnL6IVTM4og;4yO;=i>U z2ZWvJ{^>bEFgWn1c88`EW4=R~y2k{OM=SsKn;;qJRds;Sv;7#MuS#E7T2&MxCNG4R zE)mLkc+9WN9*Qv&44gd2slB@gP5!KtE8TPy%_JCQw{S5*XTRy3Z1)zelm2l^dxRy) zoFqK1oD*ifY!-hjMkQC`baUEyvN^&pFF|4ga;$Vq-TU1ebZL>A9LML&q(P_K1#TZQ zV-c~qVugqJ(8LOQ7;PBS{i_ zK>R#$=>|ypF^0&5)M_6kb*kHE#U35fGgGn~&C@K@yJxc+&mG$&ak@B`PD$C|h3;r; zgeMcaD%0)dP$9qW$BGi*rC#P)H{zRVdA)EuwmDNd`ThG12m+<*EWkXHK}avXVs`(k zeDyO5)OiC4It}_rd|L}4@3Bcz0?QMyYX#b(#JqGX2!|#g=*fGfgs2EFf+dt6oOb~% z`gAp^2RDESXL1#p&gZjm%2*@}(@`Is+9+;LsJK^)#sJgydz+UZoU-^olhp#*n@*>` z-PTn6w20rzGwg8YdTsy5#e*O;rK)%R4RBana8FKovDSw>N~c3IV5NK0q96}-+C;!C zwHEN#yWYB%#{zk7)KLX9Hsw5;tW~k7UW}s$)WGztS3s|g%s=oQHpe~32|%-|Qe3K; z;B*tc_Hz%ylnKKLJ?*@91$?&Jvr3Qp;d7BRrm@Q!Nn_j3s^e2>?{>%J(I?JwTe1OX zDU;Kul#LZ8q}kO>`W^O@Z>95(xQprj@#}4bV;>o2}AO_e$K>+7_5{Hqn)n zlQE1=6b!@ws?1YGlF}Yd9hOl6#VEUXQ-8epY>p-FyfQlno24v@(TDG_=txAAMq zYwx;|>P${L<{>{J-`G7zC8jeU+s8Y-F4WPxe!W9Qov7}8p$N1bs^u^~wTO<$wX^4; z$S)`~V(^9ATE|b`0e{r|R$wC(R)wIR`1~8;6z&r|aXDgIgrSFBV@|kRhdIOZgBNvr z6wc*H`dnC3#I34jmC&){MS=`phB~&n7jxne2$$R+A#`U_W#6o4 zD67xLFo`f5DHtp-Gbs@o#`cJh?)NMoMG^`f2!Snp2PQ#@f~rJXepk!o{G*lBoteE2 zM=68~qVk+CNECh!Ds*upQEZuk9e#2|hRX{xd+rnDq8`CXdERu9$Wdq8t80Ani?s75 z##Kwy?d7w|H{=?7sagk5M%2>x0|~C3scb!QVQSyHPU5-98<*JAw%2!)4XerL(IovC zT*_Mr?ZWZjSvc}X{E81*(h0|A2$ESowsVS}_hN`GZB0vOM{14*OUx@dD1591e~Yc0 zjIktVWS;d4sW)T7s)8UiwW1T%&r+CBFg z7%m3C0_+5kglLDyK_pUEQfoVq z3Gxd8N>)%#Q?O|tE53{PwVSl zKAZJ1TG-DXA#5@TGs66W#lE-gGNm@X@mZ988L%;6%aejX!K_<0mMu}w3JvMi3~Kz8 z_U7ru%m@h%LEcz>;P3Y9TpKp9%c~d7JHJ;_Ds=j-8CKlED!O5n$zfU-4_?8ReqLSn zqKI%B+OOUHxx1ISLox>Z1q&T`A}Ix=uD;o+KMgOe^&Q|aQ6UiRV?4?&4=*$&Fv1~B z5)z9y9u;>hM~jXKFG80u}xgdY6gc#W<;H@>ZKJ$s_zh@=2P^Bw}Z=h{KAFu29Fsezf z2Pd3@43Ktza%VWxOh&_akhKW+9VeqlaF3sp`R;{HsbXY|Sg?fc2QIwF9C)6oxHQwP zXGfte-shhbW@oLk-tEFfu43=9BiY1N-d**6+`xgY%>;Qxv{oa9#*O;~mtG0;0V#DD zsT+VrV4^5en<^|UkFe|O?I4j|9=T-BoY0f-Rh=O&%@EDT4;oMvy&>7n*zE|IBmT4C z%5pGlt$*@Brip3rPT|o&P`-0n2>@Ll@yv0nw8 zF66dD(d$`1Q#|%?1RUPQm-_KI=m_RJ5in9*t!yQQ;bR)&J4MxTs1*{sFNPSwX1w1{ z(kO{V5zfyuZCa6@s_(wP_gPa~6<|>THxfO_6Ky}lf?+k;i)&$CKxFq{i~YVB$lK7+PiLeF;21}$q>Z6PDe ziLR8Qy%aOjs~a0-4H<_R|ARf z=1H@@`>_1BEouAQJrqWUcVm!0B=+pn*jC!f2oX+~Od(mrB_}ge;s*xzNPKtkF4EU! z$MCLIEjF}Y>E)U%PGYY+bC9sjE%5uPG|}7mFFN~DlQ)fv2jfkkIkX?5t~(H_RPZ}; zm;uy&v?0gYE`g-5WUuU01KXGAE`01ifttJQr#54|G7Cl=tlG#!51Vy5sveG1tu`?U z!3ZJiPZ{x}o}*8)hano(CTQbMvH2A^wM8VS#VXUI9TTNTELRaOWO Date: Mon, 15 Feb 2016 10:41:26 -0500 Subject: [PATCH 120/189] Release 0.8 --- plinth/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plinth/__init__.py b/plinth/__init__.py index 6aa284458..ff5d4a855 100644 --- a/plinth/__init__.py +++ b/plinth/__init__.py @@ -19,4 +19,4 @@ Plinth package init file """ -__version__ = '0.7.2' +__version__ = '0.8' From 9c8518499ed6470eca63aa2c326ca8ef3240da11 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Mon, 15 Feb 2016 21:59:02 -0500 Subject: [PATCH 121/189] help: Specify encoding when opening manual file - Closes #404. --- plinth/modules/help/help.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plinth/modules/help/help.py b/plinth/modules/help/help.py index 4ffe73e87..0f8aa3f52 100644 --- a/plinth/modules/help/help.py +++ b/plinth/modules/help/help.py @@ -62,8 +62,8 @@ def about(request): def manual(request): """Serve the manual page from the 'doc' directory""" try: - with open(os.path.join(cfg.doc_dir, 'freedombox-manual.part.html'), 'r') \ - as input_file: + with open(os.path.join(cfg.doc_dir, 'freedombox-manual.part.html'), + 'r', encoding='utf-8') as input_file: content = input_file.read() except IOError: raise Http404 From ccc7310bd5ce0827e487795524ebb7e2807d463b Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 15:54:03 +0530 Subject: [PATCH 122/189] monkeysphere: Fix error with no host keys --- actions/monkeysphere | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/actions/monkeysphere b/actions/monkeysphere index 6a8b0fc75..31ad6f937 100755 --- a/actions/monkeysphere +++ b/actions/monkeysphere @@ -53,9 +53,11 @@ def subcommand_host_show_keys(arguments): """Show host key fingerprints.""" try: output = subprocess.check_output( - ['monkeysphere-host', 'show-keys'] + arguments.key_ids) + ['monkeysphere-host', 'show-keys'] + arguments.key_ids, + stderr=subprocess.DEVNULL) except subprocess.CalledProcessError: # no keys available + print(json.dumps({'keys': []})) return # parse output From eaa2a20e23fee8697a47336f1502127854748086 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Mon, 15 Feb 2016 22:55:53 -0500 Subject: [PATCH 123/189] Release 0.8.1 --- plinth/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plinth/__init__.py b/plinth/__init__.py index ff5d4a855..742c96e8a 100644 --- a/plinth/__init__.py +++ b/plinth/__init__.py @@ -19,4 +19,4 @@ Plinth package init file """ -__version__ = '0.8' +__version__ = '0.8.1' From 16de3e1dff72a34601e7bc264034a5cc9999d081 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Wed, 17 Feb 2016 21:18:36 +0530 Subject: [PATCH 124/189] travis: Require a specific version of pgi for fix pgi 0.0.11.1 does not build successfully however 0.0.10.1 works. Reported upstream issue https://github.com/lazka/pgi/issues/31. Meanwile, to fix the builds, depend on older version. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 65cf9d827..469874405 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,7 +18,7 @@ before_install: install: - pip install Django$DJANGO_VERSION - pip install coverage==3.7 - - pip install "pgi>=0.0.10.1" + - pip install "pgi==0.0.10.1" - pip install -r requirements.txt # Command to run tests From b0b67db35ea19ddd0660837c961da6a8820d4c06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sa=C3=BAl=20Ibarra=20Corretg=C3=A9?= Date: Fri, 19 Feb 2016 11:02:40 +0100 Subject: [PATCH 125/189] letsencrypt: Force text mode This avoids letsencrypt trying to launch a dialog interface in case of certain errors. --- actions/letsencrypt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actions/letsencrypt b/actions/letsencrypt index 7461081a8..7dd4a6116 100755 --- a/actions/letsencrypt +++ b/actions/letsencrypt @@ -143,7 +143,7 @@ def subcommand_obtain(arguments): domain = arguments.domain command = [ - 'letsencrypt', 'certonly', '--agree-tos', + 'letsencrypt', 'certonly', '--text', '--agree-tos', '--register-unsafely-without-email', '--domain', arguments.domain, '--authenticator', 'webroot', '--webroot-path', '/var/www/html/', '--renew-by-default'] From cec3ced675126c6eda0d4aebff0dc053130c8182 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sa=C3=BAl=20Ibarra=20Corretg=C3=A9?= Date: Fri, 19 Feb 2016 11:11:30 +0100 Subject: [PATCH 126/189] letsencrypt: Skip hidden service domains on index --- plinth/modules/letsencrypt/views.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plinth/modules/letsencrypt/views.py b/plinth/modules/letsencrypt/views.py index eb8660759..46750c51b 100644 --- a/plinth/modules/letsencrypt/views.py +++ b/plinth/modules/letsencrypt/views.py @@ -85,7 +85,11 @@ def get_status(): status = actions.superuser_run('letsencrypt', ['get-status']) status = json.loads(status) - for domains in names.domains.values(): + for domain_type, domains in names.domains.items(): + # XXX: Remove when Let's Encrypt supports .onion addresses + if domain_type == 'hiddenservice': + continue + for domain in domains: status['domains'].setdefault(domain, {}) From 992d2ea7e12d7bc1aa6a0e642edaf932d594a312 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Fri, 19 Feb 2016 22:52:52 -0500 Subject: [PATCH 127/189] help: Use new setup mechanism --- plinth/modules/help/__init__.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plinth/modules/help/__init__.py b/plinth/modules/help/__init__.py index 27adfedfb..60aa4ebaf 100644 --- a/plinth/modules/help/__init__.py +++ b/plinth/modules/help/__init__.py @@ -23,3 +23,7 @@ from .help import init __all__ = ['help', 'init'] + +version = 1 + +is_essential = 1 From 080c89110304b7ac25fd7da087d8e05347ecd29c Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Fri, 19 Feb 2016 23:24:08 -0500 Subject: [PATCH 128/189] Be consistent with type of is_essential. --- plinth/modules/apps/__init__.py | 2 +- plinth/modules/help/__init__.py | 2 +- plinth/modules/system/__init__.py | 2 +- plinth/modules/upgrades/__init__.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plinth/modules/apps/__init__.py b/plinth/modules/apps/__init__.py index b7edfd994..a242582fb 100644 --- a/plinth/modules/apps/__init__.py +++ b/plinth/modules/apps/__init__.py @@ -26,4 +26,4 @@ version = 1 -is_essential = 1 +is_essential = True diff --git a/plinth/modules/help/__init__.py b/plinth/modules/help/__init__.py index 60aa4ebaf..417cde47d 100644 --- a/plinth/modules/help/__init__.py +++ b/plinth/modules/help/__init__.py @@ -26,4 +26,4 @@ version = 1 -is_essential = 1 +is_essential = True diff --git a/plinth/modules/system/__init__.py b/plinth/modules/system/__init__.py index 7b75d3976..da66fe783 100644 --- a/plinth/modules/system/__init__.py +++ b/plinth/modules/system/__init__.py @@ -27,7 +27,7 @@ version = 1 -is_essential = 1 +is_essential = True title = _('System Configuration') diff --git a/plinth/modules/upgrades/__init__.py b/plinth/modules/upgrades/__init__.py index 795b88e1b..1f58ad821 100644 --- a/plinth/modules/upgrades/__init__.py +++ b/plinth/modules/upgrades/__init__.py @@ -27,7 +27,7 @@ version = 1 -is_essential = 1 +is_essential = True depends = ['system'] From 19d8e2f98f716db0411c4a91801fc5c41843640f Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Wed, 24 Feb 2016 12:08:30 -0500 Subject: [PATCH 129/189] Rename locale zh_CN to zh_hans. --- plinth/locale/{zh_CN => zh_Hans}/LC_MESSAGES/django.po | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename plinth/locale/{zh_CN => zh_Hans}/LC_MESSAGES/django.po (100%) diff --git a/plinth/locale/zh_CN/LC_MESSAGES/django.po b/plinth/locale/zh_Hans/LC_MESSAGES/django.po similarity index 100% rename from plinth/locale/zh_CN/LC_MESSAGES/django.po rename to plinth/locale/zh_Hans/LC_MESSAGES/django.po From 88c649d310d44e12e7c4a4c7582adaddc32c82f1 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Wed, 24 Feb 2016 12:09:31 -0500 Subject: [PATCH 130/189] Handle _ in language codes. --- plinth/__main__.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plinth/__main__.py b/plinth/__main__.py index 6b463d272..0e8db1b73 100644 --- a/plinth/__main__.py +++ b/plinth/__main__.py @@ -231,8 +231,9 @@ def configure_django(): translated_language_codes = next(os.walk(locale_dir))[1] all_languages = dict(django.conf.global_settings.LANGUAGES) for code in translated_language_codes: - if code in all_languages: - languages.append((code, all_languages[code])) + lang_code = code.replace('_', '-') + if lang_code in all_languages: + languages.append((code, all_languages[lang_code])) languages = sorted(languages, key=lambda tup: tup[1]) django.conf.settings.configure( From d72abb85390b2bd3f48df6ed7b5194ee53594c7f Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 26 Feb 2016 00:35:40 +0530 Subject: [PATCH 131/189] config: Don't restrict supported languages - There is no reason to limit the number of languages supported by the application. This is what happens when LANGUAGES is set during Django configuration. Users should be able to set a language using browser preferences and see at least the Django translated messages even if Plinth messages are not translated (example user create/edit form). - If we wish to limit the number of language options shown duing language selection (for quality perception reasons), we should perform the limiting at the time of configuration. - Note that when a new language is requested in translation tool, we create an empty file and that may lead to language being shown but with few strings actually translated. This will have poor impact on user experience. I wonder if we should filter language at all, keeping this in mind. --- plinth/__main__.py | 14 +------------- plinth/modules/config/config.py | 23 +++++++++++++++++++---- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/plinth/__main__.py b/plinth/__main__.py index 0e8db1b73..d23fa1ed1 100644 --- a/plinth/__main__.py +++ b/plinth/__main__.py @@ -21,6 +21,7 @@ from django.contrib.messages import constants as message_constants import django.core.management import django.core.wsgi +from django.utils import translation import importlib import logging import os @@ -224,18 +225,6 @@ def configure_django(): if cfg.secure_proxy_ssl_header: secure_proxy_ssl_header = (cfg.secure_proxy_ssl_header, 'https') - # Read translated languages from the 'locale' directory - languages = [('en', 'English')] - locale_dir = os.path.join(os.path.dirname(__file__), 'locale') - if os.path.isdir(locale_dir): - translated_language_codes = next(os.walk(locale_dir))[1] - all_languages = dict(django.conf.global_settings.LANGUAGES) - for code in translated_language_codes: - lang_code = code.replace('_', '-') - if lang_code in all_languages: - languages.append((code, all_languages[lang_code])) - languages = sorted(languages, key=lambda tup: tup[1]) - django.conf.settings.configure( ALLOWED_HOSTS=['*'], CACHES={'default': @@ -245,7 +234,6 @@ def configure_django(): 'NAME': cfg.store_file}}, DEBUG=cfg.debug, INSTALLED_APPS=applications, - LANGUAGES=languages, LOGGING=logging_configuration, LOGIN_URL='users:login', LOGIN_REDIRECT_URL='apps:index', diff --git a/plinth/modules/config/config.py b/plinth/modules/config/config.py index 54c687c2b..4957589bd 100644 --- a/plinth/modules/config/config.py +++ b/plinth/modules/config/config.py @@ -28,9 +28,11 @@ from django.utils import translation from django.utils.translation import ugettext as _, ugettext_lazy import logging +import os import re import socket +import plinth from plinth import actions from plinth import cfg from plinth.modules import firewall @@ -77,6 +79,7 @@ def clean(self, value): return super(TrimmedCharField, self).clean(value) + def domain_label_validator(domainname): """Validate domain name labels.""" for label in domainname.split('.'): @@ -123,10 +126,22 @@ class ConfigurationForm(forms.Form): language = forms.ChoiceField( label=ugettext_lazy('Language'), - help_text=\ - ugettext_lazy('Language for this web administration interface'), - required=False, - choices=settings.LANGUAGES) + help_text=ugettext_lazy( + 'Language for this web administration interface'), + required=False) + + def __init__(self, *args, **kwargs): + """Set limited language choices.""" + super().__init__(*args, **kwargs) + languages = [] + for language_code, language_name in settings.LANGUAGES: + locale_code = translation.to_locale(language_code) + plinth_dir = os.path.dirname(plinth.__file__) + if language_code == 'en' or os.path.exists( + os.path.join(plinth_dir, 'locale', locale_code)): + languages.append((language_code, language_name)) + + self.fields['language'].choices = languages def init(): From 7a139b7927b52c818a17faba45a4c197ae4c83c6 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Thu, 25 Feb 2016 18:01:09 -0500 Subject: [PATCH 132/189] Release 0.8.2 --- plinth/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plinth/__init__.py b/plinth/__init__.py index 742c96e8a..8c28f2b14 100644 --- a/plinth/__init__.py +++ b/plinth/__init__.py @@ -19,4 +19,4 @@ Plinth package init file """ -__version__ = '0.8.1' +__version__ = '0.8.2' From 363e071bffcb6a05deb08f688d3244218c21c1ab Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Sat, 6 Feb 2016 19:16:40 -0500 Subject: [PATCH 133/189] minetest: New module for minetest server --- actions/minetest | 59 ++++++++++++++ data/etc/plinth/modules-enabled/minetest | 1 + .../firewalld/services/minetest-plinth.xml | 6 ++ plinth/modules/minetest/__init__.py | 61 +++++++++++++++ plinth/modules/minetest/forms.py | 30 +++++++ .../modules/minetest/templates/minetest.html | 64 +++++++++++++++ plinth/modules/minetest/tests/__init__.py | 0 plinth/modules/minetest/urls.py | 29 +++++++ plinth/modules/minetest/views.py | 78 +++++++++++++++++++ 9 files changed, 328 insertions(+) create mode 100755 actions/minetest create mode 100644 data/etc/plinth/modules-enabled/minetest create mode 100644 data/usr/lib/firewalld/services/minetest-plinth.xml create mode 100644 plinth/modules/minetest/__init__.py create mode 100644 plinth/modules/minetest/forms.py create mode 100644 plinth/modules/minetest/templates/minetest.html create mode 100644 plinth/modules/minetest/tests/__init__.py create mode 100644 plinth/modules/minetest/urls.py create mode 100644 plinth/modules/minetest/views.py diff --git a/actions/minetest b/actions/minetest new file mode 100755 index 000000000..67c8f2106 --- /dev/null +++ b/actions/minetest @@ -0,0 +1,59 @@ +#!/usr/bin/python3 +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Configuration helper for Minetest server. +""" + +import argparse + +from plinth import action_utils + + +def parse_arguments(): + """Return parsed command line arguments as dictionary.""" + parser = argparse.ArgumentParser() + subparsers = parser.add_subparsers(dest='subcommand', help='Sub command') + + subparsers.add_parser('enable', help='Enable Minetest server') + subparsers.add_parser('disable', help='Disable Minetest server') + + return parser.parse_args() + + +def subcommand_enable(_): + """Enable and start server.""" + action_utils.service_enable('minetest-server') + + +def subcommand_disable(_): + """Disable and stop server.""" + action_utils.service_disable('minetest-server') + + +def main(): + """Parse arguments and perform all duties.""" + arguments = parse_arguments() + + subcommand = arguments.subcommand.replace('-', '_') + subcommand_method = globals()['subcommand_' + subcommand] + subcommand_method(arguments) + + +if __name__ == '__main__': + main() diff --git a/data/etc/plinth/modules-enabled/minetest b/data/etc/plinth/modules-enabled/minetest new file mode 100644 index 000000000..3f170f34f --- /dev/null +++ b/data/etc/plinth/modules-enabled/minetest @@ -0,0 +1 @@ +plinth.modules.minetest diff --git a/data/usr/lib/firewalld/services/minetest-plinth.xml b/data/usr/lib/firewalld/services/minetest-plinth.xml new file mode 100644 index 000000000..89cbfaae5 --- /dev/null +++ b/data/usr/lib/firewalld/services/minetest-plinth.xml @@ -0,0 +1,6 @@ + + + Minetest Server + Minetest is a multiplayer infinite-world block sandbox. + + diff --git a/plinth/modules/minetest/__init__.py b/plinth/modules/minetest/__init__.py new file mode 100644 index 000000000..202581b53 --- /dev/null +++ b/plinth/modules/minetest/__init__.py @@ -0,0 +1,61 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Plinth module for minetest. +""" + +from django.utils.translation import ugettext_lazy as _ + +from plinth import action_utils +from plinth import cfg +from plinth import service as service_module + +depends = ['plinth.modules.apps'] + +service = None + + +def init(): + """Initialize the minetest module.""" + menu = cfg.main_menu.get('apps:index') + menu.add_urlname(_('Block Sandbox (Minetest)'), 'glyphicon-th-large', + 'minetest:index', 325) + + global service + service = service_module.Service( + 'minetest-plinth', _('Minetest Server'), + is_external=True, enabled=is_enabled()) + + +def is_enabled(): + """Return whether the service is enabled.""" + return action_utils.service_is_enabled('minetest-server') + + +def is_running(): + """Return whether the service is running.""" + return action_utils.service_is_running('minetest-server') + + +def diagnose(): + """Run diagnostics and return the results.""" + results = [] + + results.append(action_utils.diagnose_port_listening(30000, 'udp4')) + + return results diff --git a/plinth/modules/minetest/forms.py b/plinth/modules/minetest/forms.py new file mode 100644 index 000000000..87e1fbaa8 --- /dev/null +++ b/plinth/modules/minetest/forms.py @@ -0,0 +1,30 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Forms for the minetest module. +""" + +from django import forms +from django.utils.translation import ugettext_lazy as _ + + +class MinetestForm(forms.Form): + """Minetest configuration form.""" + enabled = forms.BooleanField( + label=_('Enable Minetest server'), + required=False) diff --git a/plinth/modules/minetest/templates/minetest.html b/plinth/modules/minetest/templates/minetest.html new file mode 100644 index 000000000..d4669149c --- /dev/null +++ b/plinth/modules/minetest/templates/minetest.html @@ -0,0 +1,64 @@ +{% extends "base.html" %} +{% comment %} +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +{% endcomment %} + +{% load bootstrap %} +{% load i18n %} + +{% block content %} + +

{% trans "Block Sandbox (Minetest)" %}

+ +

+ {% blocktrans trimmed %} + Minetest is a multiplayer infinite-world block sandbox. This module + enables the Minetest server to be run on this {{ box_name }}, on the + default port (30000). To connect to the server, a + Minetest client + is needed. + {% endblocktrans %} +

+ +

{% trans "Status" %}

+ +

+ {% if status.is_running %} + + {% trans "Minetest server is running" %} + {% else %} + + {% trans "Minetest server is not running" %} + {% endif %} +

+ + {% include "diagnostics_button.html" with module="minetest" %} + + +

{% trans "Configuration" %}

+ +
+ {% csrf_token %} + + {{ form|bootstrap }} + + +
+ +{% endblock %} diff --git a/plinth/modules/minetest/tests/__init__.py b/plinth/modules/minetest/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/plinth/modules/minetest/urls.py b/plinth/modules/minetest/urls.py new file mode 100644 index 000000000..a297c4c6b --- /dev/null +++ b/plinth/modules/minetest/urls.py @@ -0,0 +1,29 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +URLs for the minetest module. +""" + +from django.conf.urls import url + +from . import views + + +urlpatterns = [ + url(r'^apps/minetest/$', views.index, name='index'), +] diff --git a/plinth/modules/minetest/views.py b/plinth/modules/minetest/views.py new file mode 100644 index 000000000..27ae00da7 --- /dev/null +++ b/plinth/modules/minetest/views.py @@ -0,0 +1,78 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Views for the minetest module. +""" + +from django.contrib import messages +from django.template.response import TemplateResponse +from django.utils.translation import ugettext as _ + +from .forms import MinetestForm +from plinth import actions +from plinth import package +from plinth.modules import minetest + + +def on_install(): + """Notify that the service is now enabled.""" + minetest.service.notify_enabled(None, True) + + +@package.required(['minetest-server'], on_install=on_install) +def index(request): + """Serve configuration page.""" + status = get_status() + + form = None + + if request.method == 'POST': + form = MinetestForm(request.POST, prefix='minetest') + if form.is_valid(): + _apply_changes(request, status, form.cleaned_data) + status = get_status() + form = MinetestForm(initial=status, prefix='minetest') + else: + form = MinetestForm(initial=status, prefix='minetest') + + return TemplateResponse(request, 'minetest.html', + {'title': _('Block Sandbox (Minetest)'), + 'status': status, + 'form': form}) + + +def get_status(): + """Get the current service status.""" + return {'enabled': minetest.is_enabled(), + 'is_running': minetest.is_running()} + + +def _apply_changes(request, old_status, new_status): + """Apply the changes.""" + modified = False + + if old_status['enabled'] != new_status['enabled']: + sub_command = 'enable' if new_status['enabled'] else 'disable' + actions.superuser_run('minetest', [sub_command]) + minetest.service.notify_enabled(None, new_status['enabled']) + modified = True + + if modified: + messages.success(request, _('Configuration updated')) + else: + messages.info(request, _('Setting unchanged')) From 6c67a50e11e8c1f37d843aa1add57d6677d7bbc6 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 26 Feb 2016 15:20:05 +0530 Subject: [PATCH 134/189] minetest: Use new setup mechanism --- plinth/modules/minetest/__init__.py | 31 +++++++++++++++---- .../modules/minetest/templates/minetest.html | 16 ++-------- plinth/modules/minetest/views.py | 10 ++---- 3 files changed, 29 insertions(+), 28 deletions(-) diff --git a/plinth/modules/minetest/__init__.py b/plinth/modules/minetest/__init__.py index 202581b53..cf386bcb8 100644 --- a/plinth/modules/minetest/__init__.py +++ b/plinth/modules/minetest/__init__.py @@ -24,22 +24,41 @@ from plinth import action_utils from plinth import cfg from plinth import service as service_module +from plinth.utils import format_lazy -depends = ['plinth.modules.apps'] + +version = 1 + +depends = ['apps'] + +title = _('Block Sandbox (Minetest)') + +description = [ + format_lazy( + _('Minetest is a multiplayer infinite-world block sandbox. This ' + 'module enables the Minetest server to be run on this ' + '{box_name}, on the default port (30000). To connect to the server, ' + 'a Minetest client ' + 'is needed.'), box_name=_(cfg.box_name)), +] service = None def init(): - """Initialize the minetest module.""" + """Initialize the module.""" menu = cfg.main_menu.get('apps:index') - menu.add_urlname(_('Block Sandbox (Minetest)'), 'glyphicon-th-large', - 'minetest:index', 325) + menu.add_urlname(title, 'glyphicon-th-large', 'minetest:index', 325) global service service = service_module.Service( - 'minetest-plinth', _('Minetest Server'), - is_external=True, enabled=is_enabled()) + 'minetest-plinth', title, is_external=True, enabled=is_enabled()) + + +def setup(helper, old_version=None): + """Install and configure the module.""" + helper.install(['minetest-server']) + helper.call('post', service.notify_enabled, None, True) def is_enabled(): diff --git a/plinth/modules/minetest/templates/minetest.html b/plinth/modules/minetest/templates/minetest.html index d4669149c..327a91434 100644 --- a/plinth/modules/minetest/templates/minetest.html +++ b/plinth/modules/minetest/templates/minetest.html @@ -1,4 +1,4 @@ -{% extends "base.html" %} +{% extends "app.html" %} {% comment %} # # This file is part of Plinth. @@ -21,19 +21,7 @@ {% load bootstrap %} {% load i18n %} -{% block content %} - -

{% trans "Block Sandbox (Minetest)" %}

- -

- {% blocktrans trimmed %} - Minetest is a multiplayer infinite-world block sandbox. This module - enables the Minetest server to be run on this {{ box_name }}, on the - default port (30000). To connect to the server, a - Minetest client - is needed. - {% endblocktrans %} -

+{% block configuration %}

{% trans "Status" %}

diff --git a/plinth/modules/minetest/views.py b/plinth/modules/minetest/views.py index 27ae00da7..5d5f5a3d3 100644 --- a/plinth/modules/minetest/views.py +++ b/plinth/modules/minetest/views.py @@ -25,16 +25,9 @@ from .forms import MinetestForm from plinth import actions -from plinth import package from plinth.modules import minetest -def on_install(): - """Notify that the service is now enabled.""" - minetest.service.notify_enabled(None, True) - - -@package.required(['minetest-server'], on_install=on_install) def index(request): """Serve configuration page.""" status = get_status() @@ -51,7 +44,8 @@ def index(request): form = MinetestForm(initial=status, prefix='minetest') return TemplateResponse(request, 'minetest.html', - {'title': _('Block Sandbox (Minetest)'), + {'title': minetest.title, + 'description': minetest.description, 'status': status, 'form': form}) From 9d85084d8debe2c7a5ac21e8feb2d29eaca3e29b Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Sat, 9 Jan 2016 16:29:40 -0500 Subject: [PATCH 135/189] radicale: New module for a CalDAV/CardDAV server --- actions/radicale | 106 ++++++++++++++++++ .../conf-available/radicale-plinth.conf | 18 +++ data/etc/plinth/modules-enabled/radicale | 1 + plinth/modules/radicale/__init__.py | 62 ++++++++++ plinth/modules/radicale/forms.py | 30 +++++ .../modules/radicale/templates/radicale.html | 65 +++++++++++ plinth/modules/radicale/tests/__init__.py | 0 plinth/modules/radicale/urls.py | 29 +++++ plinth/modules/radicale/views.py | 79 +++++++++++++ 9 files changed, 390 insertions(+) create mode 100755 actions/radicale create mode 100644 data/etc/apache2/conf-available/radicale-plinth.conf create mode 100644 data/etc/plinth/modules-enabled/radicale create mode 100644 plinth/modules/radicale/__init__.py create mode 100644 plinth/modules/radicale/forms.py create mode 100644 plinth/modules/radicale/templates/radicale.html create mode 100644 plinth/modules/radicale/tests/__init__.py create mode 100644 plinth/modules/radicale/urls.py create mode 100644 plinth/modules/radicale/views.py diff --git a/actions/radicale b/actions/radicale new file mode 100755 index 000000000..9f33dd72b --- /dev/null +++ b/actions/radicale @@ -0,0 +1,106 @@ +#!/usr/bin/python3 +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Configuration helper for Radicale. +""" + +import argparse +import augeas +import subprocess + +from plinth import action_utils + +CONFIG_FILE = '/etc/radicale/config' +DEFAULT_FILE = '/etc/default/radicale' + + +def parse_arguments(): + """Return parsed command line arguments as dictionary.""" + parser = argparse.ArgumentParser() + subparsers = parser.add_subparsers(dest='subcommand', help='Sub command') + + subparsers.add_parser('setup', help='Setup Radicale configuration') + subparsers.add_parser('enable', help='Enable Radicale service') + subparsers.add_parser('disable', help='Disable Radicale service') + + return parser.parse_args() + + +def subcommand_setup(_): + """Setup Radicale configuration.""" + aug = load_augeas() + + aug.set('/files' + DEFAULT_FILE + '/ENABLE_RADICALE', 'yes') + + aug.set('/files' + CONFIG_FILE + '/server/hosts', + '0.0.0.0:5232, [::]:5232') + aug.set('/files' + CONFIG_FILE + '/server/base_prefix', '/radicale/') + aug.set('/files' + CONFIG_FILE + '/well-known/caldav', + '/radicale/%(user)s/caldav/') + aug.set('/files' + CONFIG_FILE + '/well-known/carddav', + '/radicale/%(user)s/carddav/') + aug.set('/files' + CONFIG_FILE + '/auth/type', 'remote_user') + aug.set('/files' + CONFIG_FILE + '/rights/type', 'owner_only') + + aug.save() + + action_utils.service_restart('radicale') + action_utils.webserver_enable('radicale-plinth') + + +def subcommand_enable(_): + """Start service.""" + action_utils.service_enable('radicale') + action_utils.webserver_enable('radicale-plinth') + + +def subcommand_disable(_): + """Stop service.""" + action_utils.webserver_disable('radicale-plinth') + action_utils.service_disable('radicale') + + +def load_augeas(): + """Initialize Augeas.""" + aug = augeas.Augeas(flags=augeas.Augeas.NO_LOAD + + augeas.Augeas.NO_MODL_AUTOLOAD) + + # shell-script config file lens + aug.set('/augeas/load/Shellvars/lens', 'Shellvars.lns') + aug.set('/augeas/load/Shellvars/incl[last() + 1]', DEFAULT_FILE) + + # INI file lens + aug.set('/augeas/load/Puppet/lens', 'Puppet.lns') + aug.set('/augeas/load/Puppet/incl[last() + 1]', CONFIG_FILE) + + aug.load() + return aug + + +def main(): + """Parse arguments and perform all duties.""" + arguments = parse_arguments() + + subcommand = arguments.subcommand.replace('-', '_') + subcommand_method = globals()['subcommand_' + subcommand] + subcommand_method(arguments) + + +if __name__ == '__main__': + main() diff --git a/data/etc/apache2/conf-available/radicale-plinth.conf b/data/etc/apache2/conf-available/radicale-plinth.conf new file mode 100644 index 000000000..efa76c8de --- /dev/null +++ b/data/etc/apache2/conf-available/radicale-plinth.conf @@ -0,0 +1,18 @@ +## +## On all sites, provide Radicale on a path: /radicale +## Allow all valid users. +## +Redirect 301 /.well-known/carddav /radicale/.well-known/carddav +Redirect 301 /.well-known/caldav /radicale/.well-known/caldav + + + ProxyPass http://localhost:5232 + + AuthType basic + AuthName "FreedomBox Login" + AuthBasicProvider ldap + AuthLDAPUrl "ldap:///ou=users,dc=thisbox?uid" + AuthLDAPGroupAttribute memberUid + AuthLDAPGroupAttributeIsDN off + Require valid-user + diff --git a/data/etc/plinth/modules-enabled/radicale b/data/etc/plinth/modules-enabled/radicale new file mode 100644 index 000000000..785705bd1 --- /dev/null +++ b/data/etc/plinth/modules-enabled/radicale @@ -0,0 +1 @@ +plinth.modules.radicale diff --git a/plinth/modules/radicale/__init__.py b/plinth/modules/radicale/__init__.py new file mode 100644 index 000000000..0b221ef9d --- /dev/null +++ b/plinth/modules/radicale/__init__.py @@ -0,0 +1,62 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Plinth module for radicale. +""" + +from django.utils.translation import ugettext_lazy as _ + +from plinth import action_utils +from plinth import cfg +from plinth import service as service_module + +depends = ['plinth.modules.apps'] + +service = None + + +def init(): + """Initialize the radicale module.""" + menu = cfg.main_menu.get('apps:index') + menu.add_urlname(_('Calendar and Addressbook (Radicale)'), + 'glyphicon-calendar', 'radicale:index', 375) + + global service + service = service_module.Service( + 'radicale-plinth', _('Radicale CalDAV and CardDAV Server'), + is_external=True, enabled=is_enabled()) + + +def is_enabled(): + """Return whether the service is enabled.""" + return action_utils.service_is_enabled('radicale') + + +def is_running(): + """Return whether the service is running.""" + return action_utils.service_is_running('radicale') + + +def diagnose(): + """Run diagnostics and return the results.""" + results = [] + + results.extend(action_utils.diagnose_url_on_all( + 'https://{host}/radicale', extra_options=['--no-check-certificate'])) + + return results diff --git a/plinth/modules/radicale/forms.py b/plinth/modules/radicale/forms.py new file mode 100644 index 000000000..7ecbeae83 --- /dev/null +++ b/plinth/modules/radicale/forms.py @@ -0,0 +1,30 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Forms for radicale module. +""" + +from django import forms +from django.utils.translation import ugettext_lazy as _ + + +class RadicaleForm(forms.Form): + """Radicale configuration form.""" + enabled = forms.BooleanField( + label=_('Enable Radicale service'), + required=False) diff --git a/plinth/modules/radicale/templates/radicale.html b/plinth/modules/radicale/templates/radicale.html new file mode 100644 index 000000000..07f12fc74 --- /dev/null +++ b/plinth/modules/radicale/templates/radicale.html @@ -0,0 +1,65 @@ +{% extends "base.html" %} +{% comment %} +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +{% endcomment %} + +{% load bootstrap %} +{% load i18n %} + +{% block content %} + +

{% trans "Calendar and Addressbook (Radicale)" %}

+ +

+ {% blocktrans trimmed %} + Radicale is a CalDAV and CardDAV server. It allows synchronization and + sharing of scheduling and contact data. To use Radicale, a + + supported client application is needed. Radicale can be accessed by + any user with a {{ box_name }} login. + {% endblocktrans %} +

+ +

{% trans "Status" %}

+ +

+ {% if status.is_running %} + + {% trans "Radicale service is running" %} + {% else %} + + {% trans "Radicale service is not running" %} + {% endif %} +

+ + {% include "diagnostics_button.html" with module="radicale" %} + + +

{% trans "Configuration" %}

+ +
+ {% csrf_token %} + + {{ form|bootstrap }} + + +
+ +{% endblock %} diff --git a/plinth/modules/radicale/tests/__init__.py b/plinth/modules/radicale/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/plinth/modules/radicale/urls.py b/plinth/modules/radicale/urls.py new file mode 100644 index 000000000..ae7c20084 --- /dev/null +++ b/plinth/modules/radicale/urls.py @@ -0,0 +1,29 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +URLs for the radicale module. +""" + +from django.conf.urls import url + +from . import views + + +urlpatterns = [ + url(r'^apps/radicale/$', views.index, name='index'), +] diff --git a/plinth/modules/radicale/views.py b/plinth/modules/radicale/views.py new file mode 100644 index 000000000..3bfb8fdd7 --- /dev/null +++ b/plinth/modules/radicale/views.py @@ -0,0 +1,79 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Views for radicale module. +""" + +from django.contrib import messages +from django.template.response import TemplateResponse +from django.utils.translation import ugettext as _ + +from .forms import RadicaleForm +from plinth import actions +from plinth import package +from plinth.modules import radicale + + +def on_install(): + """Notify that the service is now enabled.""" + actions.superuser_run('radicale', ['setup']) + radicale.service.notify_enabled(None, True) + + +@package.required(['radicale'], on_install=on_install) +def index(request): + """Serve configuration page.""" + status = get_status() + + form = None + + if request.method == 'POST': + form = RadicaleForm(request.POST, prefix='radicale') + if form.is_valid(): + _apply_changes(request, status, form.cleaned_data) + status = get_status() + form = RadicaleForm(initial=status, prefix='radicale') + else: + form = RadicaleForm(initial=status, prefix='radicale') + + return TemplateResponse(request, 'radicale.html', + {'title': _('Calendar and Addressbook (Radicale)'), + 'status': status, + 'form': form}) + + +def get_status(): + """Get the current service status.""" + return {'enabled': radicale.is_enabled(), + 'is_running': radicale.is_running()} + + +def _apply_changes(request, old_status, new_status): + """Apply the changes.""" + modified = False + + if old_status['enabled'] != new_status['enabled']: + sub_command = 'enable' if new_status['enabled'] else 'disable' + actions.superuser_run('radicale', [sub_command]) + radicale.service.notify_enabled(None, new_status['enabled']) + modified = True + + if modified: + messages.success(request, _('Configuration updated')) + else: + messages.info(request, _('Setting unchanged')) From 34a6bd09ed41ef0d200d17ef039528fb0db08829 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 26 Feb 2016 22:33:12 +0530 Subject: [PATCH 136/189] radicale: Use new setup mechanism - Also fix using non-existant firewall service 'radicale-plinth'. Instead use 'http' and 'https' services. --- plinth/modules/radicale/__init__.py | 35 ++++++++++++++++--- .../modules/radicale/templates/radicale.html | 17 ++------- plinth/modules/radicale/views.py | 11 ++---- 3 files changed, 34 insertions(+), 29 deletions(-) diff --git a/plinth/modules/radicale/__init__.py b/plinth/modules/radicale/__init__.py index 0b221ef9d..026aa18ee 100644 --- a/plinth/modules/radicale/__init__.py +++ b/plinth/modules/radicale/__init__.py @@ -21,11 +21,28 @@ from django.utils.translation import ugettext_lazy as _ +from plinth import actions from plinth import action_utils from plinth import cfg from plinth import service as service_module +from plinth.utils import format_lazy -depends = ['plinth.modules.apps'] + +version = 1 + +depends = ['apps'] + +title = _('Calendar and Addressbook (Radicale)') + +description = [ + format_lazy( + _('Radicale is a CalDAV and CardDAV server. It allows synchronization ' + 'and sharing of scheduling and contact data. To use Radicale, a ' + ' supported client application ' + 'is needed. Radicale can be accessed by any user with a {box_name} ' + 'login.'), box_name=_(cfg.box_name)), +] service = None @@ -33,13 +50,19 @@ def init(): """Initialize the radicale module.""" menu = cfg.main_menu.get('apps:index') - menu.add_urlname(_('Calendar and Addressbook (Radicale)'), - 'glyphicon-calendar', 'radicale:index', 375) + menu.add_urlname(title, 'glyphicon-calendar', 'radicale:index', 375) global service service = service_module.Service( - 'radicale-plinth', _('Radicale CalDAV and CardDAV Server'), - is_external=True, enabled=is_enabled()) + 'radicale', title, ['http', 'https'], is_external=True, + enabled=is_enabled()) + + +def setup(helper, old_version=None): + """Install and configure the module.""" + helper.install(['radicale']) + helper.call('post', actions.superuser_run, 'radicale', ['setup']) + helper.call('post', service.notify_enabled, None, True) def is_enabled(): @@ -56,6 +79,8 @@ def diagnose(): """Run diagnostics and return the results.""" results = [] + results.append(action_utils.diagnose_port_listening(5232, 'tcp4')) + results.append(action_utils.diagnose_port_listening(5232, 'tcp6')) results.extend(action_utils.diagnose_url_on_all( 'https://{host}/radicale', extra_options=['--no-check-certificate'])) diff --git a/plinth/modules/radicale/templates/radicale.html b/plinth/modules/radicale/templates/radicale.html index 07f12fc74..088981c63 100644 --- a/plinth/modules/radicale/templates/radicale.html +++ b/plinth/modules/radicale/templates/radicale.html @@ -1,4 +1,4 @@ -{% extends "base.html" %} +{% extends "app.html" %} {% comment %} # # This file is part of Plinth. @@ -21,20 +21,7 @@ {% load bootstrap %} {% load i18n %} -{% block content %} - -

{% trans "Calendar and Addressbook (Radicale)" %}

- -

- {% blocktrans trimmed %} - Radicale is a CalDAV and CardDAV server. It allows synchronization and - sharing of scheduling and contact data. To use Radicale, a - - supported client application is needed. Radicale can be accessed by - any user with a {{ box_name }} login. - {% endblocktrans %} -

+{% block configuration %}

{% trans "Status" %}

diff --git a/plinth/modules/radicale/views.py b/plinth/modules/radicale/views.py index 3bfb8fdd7..f0d37cc6d 100644 --- a/plinth/modules/radicale/views.py +++ b/plinth/modules/radicale/views.py @@ -25,17 +25,9 @@ from .forms import RadicaleForm from plinth import actions -from plinth import package from plinth.modules import radicale -def on_install(): - """Notify that the service is now enabled.""" - actions.superuser_run('radicale', ['setup']) - radicale.service.notify_enabled(None, True) - - -@package.required(['radicale'], on_install=on_install) def index(request): """Serve configuration page.""" status = get_status() @@ -52,7 +44,8 @@ def index(request): form = RadicaleForm(initial=status, prefix='radicale') return TemplateResponse(request, 'radicale.html', - {'title': _('Calendar and Addressbook (Radicale)'), + {'title': radicale.title, + 'description': radicale.description, 'status': status, 'form': form}) From 7e87f0304ae057d2b72eaeb4fb9802f86b40bb02 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 26 Feb 2016 22:34:25 +0530 Subject: [PATCH 137/189] radicale: Listen only on internal addresses - Since we are trusting the remote user header, it is much safer not listen on external addresses. We don't that since Apache connects on internal address. --- actions/radicale | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actions/radicale b/actions/radicale index 9f33dd72b..bebe730cf 100755 --- a/actions/radicale +++ b/actions/radicale @@ -49,7 +49,7 @@ def subcommand_setup(_): aug.set('/files' + DEFAULT_FILE + '/ENABLE_RADICALE', 'yes') aug.set('/files' + CONFIG_FILE + '/server/hosts', - '0.0.0.0:5232, [::]:5232') + '127.0.0.1:5232, [::1]:5232') aug.set('/files' + CONFIG_FILE + '/server/base_prefix', '/radicale/') aug.set('/files' + CONFIG_FILE + '/well-known/caldav', '/radicale/%(user)s/caldav/') From aba2b03c52d54edd465c1416d1eaae7e2449bcc2 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 26 Feb 2016 22:42:05 +0530 Subject: [PATCH 138/189] transmission: Remove unused import --- actions/transmission | 1 - 1 file changed, 1 deletion(-) diff --git a/actions/transmission b/actions/transmission index 4a80d37c2..a21f0e14e 100755 --- a/actions/transmission +++ b/actions/transmission @@ -23,7 +23,6 @@ Configuration helper for Transmission daemon. import argparse import json -import subprocess import sys from plinth import action_utils From 4f31ad65b9c0a131fb89811de430629288859054 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Thu, 18 Feb 2016 22:06:48 +0530 Subject: [PATCH 139/189] travis: Use trusty and pygobject instead of pgi - Run tests on Ubuntu Trusty (14.04) instead of Ubuntu Precise (12.04). - Use pygobject instead of pgi to test what we actually use in production. - Use a virtualenv trick to make sure that Python actually picks up system packages (python3-gi). https://pygobject.readthedocs.org/en/latest/testing.html#example-travis-ci-configuration - Don't let apt-get hang for user input. Specify -y. --- .travis.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 469874405..877bbe358 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,8 @@ # Travis-CI configuration file for Plinth -language: python -python: - - "3.4" +dist: trusty +sudo: required +language: generic env: - DJANGO_VERSION=">=1.7.0,<1.8.0" @@ -12,13 +12,14 @@ env: # Debian packages required before_install: - sudo apt-get update -qq - - sudo apt-get install augeas-tools gir1.2-packagekitglib-1.0 + - sudo apt-get -y install augeas-tools gir1.2-packagekitglib-1.0 python3-dev python3-gi # Command to install dependencies install: + - virtualenv --python=python3 --system-site-packages _venv + - source _venv/bin/activate - pip install Django$DJANGO_VERSION - pip install coverage==3.7 - - pip install "pgi==0.0.10.1" - pip install -r requirements.txt # Command to run tests From fa8c2cf6ff7f589334096a60cef49430d9d00c3d Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sun, 28 Feb 2016 12:21:29 +0530 Subject: [PATCH 140/189] views: Add a common view for enabling applications - A lot of boiler plate code can be removed from Plinth if enabling and disabling an application can be done using a common base form. - This also allows to define a reusable method in an application for enabling and disabling. - This brings more structure to a application module and paves way for having a different views such as dashboard. --- plinth/forms.py | 30 ++++++++++++++++++ plinth/views.py | 84 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 114 insertions(+) create mode 100644 plinth/forms.py diff --git a/plinth/forms.py b/plinth/forms.py new file mode 100644 index 000000000..f554bcfc8 --- /dev/null +++ b/plinth/forms.py @@ -0,0 +1,30 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Common forms for use by modules. +""" + +from django import forms +from django.utils.translation import ugettext_lazy as _ + + +class ConfigurationForm(forms.Form): + """Generic configuration form for simple modules.""" + enabled = forms.BooleanField( + label=_('Enable application'), + required=False) diff --git a/plinth/views.py b/plinth/views.py index a5b9a7680..47f7518c8 100644 --- a/plinth/views.py +++ b/plinth/views.py @@ -19,17 +19,101 @@ Main Plinth views """ +from django.contrib import messages +from django.core.exceptions import ImproperlyConfigured from django.core.urlresolvers import reverse from django.http.response import HttpResponseRedirect from django.views.generic import TemplateView +from django.views.generic.edit import FormView +from django.utils.translation import ugettext as _ import time +from . import forms +from . import module_loader + def index(request): """Serve the main index page.""" return HttpResponseRedirect(reverse('apps:index')) +class ConfigurationView(FormView): + """A generic view for configuring simple modules.""" + form_class = forms.ConfigurationForm + module_name = None + + def __init__(self, module_name=None, *args, **kwargs): + """Set the module name on which this configuration view operates.""" + self.instance_module_name = module_name + + def get_module_name(self): + """Return the name of the module associated with the view.""" + if not self.instance_module_name and not self.module_name: + raise ImproperlyConfigured( + 'Using ConfigurationView without the "module_name" class ' + 'attribute or intialization attribute is prohibited.') + else: + return self.instance_module_name or self.module_name + + def get_module(self): + """Return the module associated with the view.""" + return module_loader.loaded_modules[self.get_module_name()] + + def get_initial(self): + """Return the status of the module to fill in the form.""" + return self.get_module().get_status() + + def get_prefix(self): + """Return prefix for form used in the view.""" + return self.get_module_name() + + def get_template_names(self): + """Return the list of template names for the view.""" + return [self.get_module_name() + '.html'] + + def get_context_data(self, **kwargs): + """Return the context data for rendering the template view.""" + if 'title' not in kwargs: + kwargs['title'] = getattr(self.get_module(), 'title', None) + + if 'description' not in kwargs: + kwargs['description'] = \ + getattr(self.get_module(), 'description', None) + + context = super().get_context_data(**kwargs) + + if 'status' not in context: + context['status'] = context['form'].initial + + return context + + def form_valid(self, form): + """Perform operation when the form submission is valid.""" + old_status = form.initial + new_status = form.cleaned_data + + modified = self.apply_changes(old_status, new_status) + if not modified: + messages.info(self.request, _('Setting unchanged')) + + context = self.get_context_data() + return self.render_to_response(context) + + def apply_changes(self, old_status, new_status): + """Apply the changes submitted in the form.""" + if old_status['enabled'] == new_status['enabled']: + return False + + should_enable = new_status['enabled'] + self.get_module().enable(should_enable) + if should_enable: + messages.success(self.request, _('Application enabled')) + else: + messages.success(self.request, _('Application disabled')) + + return True + + class SetupView(TemplateView): """View to prompt and setup applications.""" template_name = 'setup.html' From 96ca09d59d29c8102ad4a1b8039582de286cf8ff Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sun, 28 Feb 2016 12:26:27 +0530 Subject: [PATCH 141/189] deluge: Use common view for configuration --- plinth/modules/deluge/__init__.py | 13 ++++++ plinth/modules/deluge/forms.py | 30 ------------- plinth/modules/deluge/urls.py | 5 ++- plinth/modules/deluge/views.py | 75 ------------------------------- 4 files changed, 16 insertions(+), 107 deletions(-) delete mode 100644 plinth/modules/deluge/forms.py delete mode 100644 plinth/modules/deluge/views.py diff --git a/plinth/modules/deluge/__init__.py b/plinth/modules/deluge/__init__.py index f5c1b6f37..794817b36 100644 --- a/plinth/modules/deluge/__init__.py +++ b/plinth/modules/deluge/__init__.py @@ -63,6 +63,12 @@ def setup(helper, old_version=None): helper.call('post', service.notify_enabled, None, True) +def get_status(): + """Get the current settings.""" + return {'enabled': is_enabled(), + 'is_running': is_running()} + + def is_enabled(): """Return whether the module is enabled.""" return (action_utils.webserver_is_enabled('deluge-plinth') and @@ -74,6 +80,13 @@ def is_running(): return action_utils.service_is_running('deluge-web') +def enable(should_enable): + """Enable/disable the module.""" + sub_command = 'enable' if should_enable else 'disable' + actions.superuser_run('deluge', [sub_command]) + service.notify_enabled(None, should_enable) + + def diagnose(): """Run diagnostics and return the results.""" results = [] diff --git a/plinth/modules/deluge/forms.py b/plinth/modules/deluge/forms.py deleted file mode 100644 index 3ae1271d9..000000000 --- a/plinth/modules/deluge/forms.py +++ /dev/null @@ -1,30 +0,0 @@ -# -# This file is part of Plinth. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# - -""" -Forms for configuring Deluge web client. -""" - -from django import forms -from django.utils.translation import ugettext_lazy as _ - - -class DelugeForm(forms.Form): - """Deluge configuration form.""" - enabled = forms.BooleanField( - label=_('Enable Deluge'), - required=False) diff --git a/plinth/modules/deluge/urls.py b/plinth/modules/deluge/urls.py index a36941271..4aa3712fd 100644 --- a/plinth/modules/deluge/urls.py +++ b/plinth/modules/deluge/urls.py @@ -21,9 +21,10 @@ from django.conf.urls import url -from . import views +from plinth.views import ConfigurationView urlpatterns = [ - url(r'^apps/deluge/$', views.index, name='index'), + url(r'^apps/deluge/$', ConfigurationView.as_view(module_name='deluge'), + name='index'), ] diff --git a/plinth/modules/deluge/views.py b/plinth/modules/deluge/views.py deleted file mode 100644 index 0b48b2333..000000000 --- a/plinth/modules/deluge/views.py +++ /dev/null @@ -1,75 +0,0 @@ -# -# This file is part of Plinth. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# - -""" -Plinth module to configure a Deluge web client. -""" - -from django.contrib import messages -from django.template.response import TemplateResponse -from django.utils.translation import ugettext as _ - -from .forms import DelugeForm -from plinth import actions -from plinth.modules import deluge - - -def index(request): - """Serve configuration page.""" - status = get_status() - - form = None - - if request.method == 'POST': - form = DelugeForm(request.POST, prefix='deluge') - # pylint: disable=E1101 - if form.is_valid(): - _apply_changes(request, status, form.cleaned_data) - status = get_status() - form = DelugeForm(initial=status, prefix='deluge') - else: - form = DelugeForm(initial=status, prefix='deluge') - - return TemplateResponse(request, 'deluge.html', - {'title': deluge.title, - 'description': deluge.description, - 'status': status, - 'form': form}) - - -def get_status(): - """Get the current settings.""" - status = {'enabled': deluge.is_enabled(), - 'is_running': deluge.is_running()} - - return status - - -def _apply_changes(request, old_status, new_status): - """Apply the changes.""" - modified = False - - if old_status['enabled'] != new_status['enabled']: - sub_command = 'enable' if new_status['enabled'] else 'disable' - actions.superuser_run('deluge', [sub_command]) - deluge.service.notify_enabled(None, new_status['enabled']) - modified = True - - if modified: - messages.success(request, _('Configuration updated')) - else: - messages.info(request, _('Setting unchanged')) From 9422f43ba58fb0a6f7ed7a372e806f5ae3a9afda Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sun, 28 Feb 2016 12:27:05 +0530 Subject: [PATCH 142/189] minetest: Use common view for configuration --- plinth/modules/minetest/__init__.py | 14 ++++++ plinth/modules/minetest/forms.py | 30 ------------ plinth/modules/minetest/urls.py | 5 +- plinth/modules/minetest/views.py | 72 ----------------------------- 4 files changed, 17 insertions(+), 104 deletions(-) delete mode 100644 plinth/modules/minetest/forms.py delete mode 100644 plinth/modules/minetest/views.py diff --git a/plinth/modules/minetest/__init__.py b/plinth/modules/minetest/__init__.py index cf386bcb8..a8f90b48b 100644 --- a/plinth/modules/minetest/__init__.py +++ b/plinth/modules/minetest/__init__.py @@ -21,6 +21,7 @@ from django.utils.translation import ugettext_lazy as _ +from plinth import actions from plinth import action_utils from plinth import cfg from plinth import service as service_module @@ -61,6 +62,12 @@ def setup(helper, old_version=None): helper.call('post', service.notify_enabled, None, True) +def get_status(): + """Get the current service status.""" + return {'enabled': is_enabled(), + 'is_running': is_running()} + + def is_enabled(): """Return whether the service is enabled.""" return action_utils.service_is_enabled('minetest-server') @@ -71,6 +78,13 @@ def is_running(): return action_utils.service_is_running('minetest-server') +def enable(should_enable): + """Enable/disable the module.""" + sub_command = 'enable' if should_enable else 'disable' + actions.superuser_run('minetest', [sub_command]) + service.notify_enabled(None, should_enable) + + def diagnose(): """Run diagnostics and return the results.""" results = [] diff --git a/plinth/modules/minetest/forms.py b/plinth/modules/minetest/forms.py deleted file mode 100644 index 87e1fbaa8..000000000 --- a/plinth/modules/minetest/forms.py +++ /dev/null @@ -1,30 +0,0 @@ -# -# This file is part of Plinth. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# - -""" -Forms for the minetest module. -""" - -from django import forms -from django.utils.translation import ugettext_lazy as _ - - -class MinetestForm(forms.Form): - """Minetest configuration form.""" - enabled = forms.BooleanField( - label=_('Enable Minetest server'), - required=False) diff --git a/plinth/modules/minetest/urls.py b/plinth/modules/minetest/urls.py index a297c4c6b..a32f5a7c5 100644 --- a/plinth/modules/minetest/urls.py +++ b/plinth/modules/minetest/urls.py @@ -21,9 +21,10 @@ from django.conf.urls import url -from . import views +from plinth.views import ConfigurationView urlpatterns = [ - url(r'^apps/minetest/$', views.index, name='index'), + url(r'^apps/minetest/$', ConfigurationView.as_view(module_name='minetest'), + name='index'), ] diff --git a/plinth/modules/minetest/views.py b/plinth/modules/minetest/views.py deleted file mode 100644 index 5d5f5a3d3..000000000 --- a/plinth/modules/minetest/views.py +++ /dev/null @@ -1,72 +0,0 @@ -# -# This file is part of Plinth. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# - -""" -Views for the minetest module. -""" - -from django.contrib import messages -from django.template.response import TemplateResponse -from django.utils.translation import ugettext as _ - -from .forms import MinetestForm -from plinth import actions -from plinth.modules import minetest - - -def index(request): - """Serve configuration page.""" - status = get_status() - - form = None - - if request.method == 'POST': - form = MinetestForm(request.POST, prefix='minetest') - if form.is_valid(): - _apply_changes(request, status, form.cleaned_data) - status = get_status() - form = MinetestForm(initial=status, prefix='minetest') - else: - form = MinetestForm(initial=status, prefix='minetest') - - return TemplateResponse(request, 'minetest.html', - {'title': minetest.title, - 'description': minetest.description, - 'status': status, - 'form': form}) - - -def get_status(): - """Get the current service status.""" - return {'enabled': minetest.is_enabled(), - 'is_running': minetest.is_running()} - - -def _apply_changes(request, old_status, new_status): - """Apply the changes.""" - modified = False - - if old_status['enabled'] != new_status['enabled']: - sub_command = 'enable' if new_status['enabled'] else 'disable' - actions.superuser_run('minetest', [sub_command]) - minetest.service.notify_enabled(None, new_status['enabled']) - modified = True - - if modified: - messages.success(request, _('Configuration updated')) - else: - messages.info(request, _('Setting unchanged')) From f2056128311b4bfa29c9ddf284f25cd989acc200 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sun, 28 Feb 2016 12:27:28 +0530 Subject: [PATCH 143/189] owncloud: Use common view for configuration --- plinth/modules/owncloud/__init__.py | 15 ++++++ plinth/modules/owncloud/forms.py | 30 ------------ plinth/modules/owncloud/urls.py | 5 +- plinth/modules/owncloud/views.py | 75 ----------------------------- 4 files changed, 18 insertions(+), 107 deletions(-) delete mode 100644 plinth/modules/owncloud/forms.py delete mode 100644 plinth/modules/owncloud/views.py diff --git a/plinth/modules/owncloud/__init__.py b/plinth/modules/owncloud/__init__.py index c5fbdd59a..c5a77b3f4 100644 --- a/plinth/modules/owncloud/__init__.py +++ b/plinth/modules/owncloud/__init__.py @@ -69,12 +69,27 @@ def setup(helper, old_version=None): helper.call('post', service.notify_enabled, None, True) +def get_status(): + """Return the current status""" + return {'enabled': is_enabled()} + + def is_enabled(): """Return whether the module is enabled.""" output = actions.run('owncloud-setup', ['status']) return 'enable' in output.split() +def enable(should_enable): + """Enable/disable the module.""" + option = 'enable' if should_enable else 'noenable' + actions.superuser_run('owncloud-setup', [option]) + + # Send a signal to other modules that the service is + # enabled/disabled + service.notify_enabled(None, should_enable) + + def diagnose(): """Run diagnostics and return the results.""" results = [] diff --git a/plinth/modules/owncloud/forms.py b/plinth/modules/owncloud/forms.py deleted file mode 100644 index 3ea4c6f8c..000000000 --- a/plinth/modules/owncloud/forms.py +++ /dev/null @@ -1,30 +0,0 @@ -# -# This file is part of Plinth. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# - -""" -Forms for configuring ownCloud. -""" - -from django import forms -from django.utils.translation import ugettext_lazy as _ - - -class OwnCloudForm(forms.Form): # pylint: disable-msg=W0232 - """ownCloud configuration form""" - enabled = forms.BooleanField( - label=_('Enable ownCloud'), - required=False) diff --git a/plinth/modules/owncloud/urls.py b/plinth/modules/owncloud/urls.py index 338ad6cc5..7f215357b 100644 --- a/plinth/modules/owncloud/urls.py +++ b/plinth/modules/owncloud/urls.py @@ -21,9 +21,10 @@ from django.conf.urls import url -from . import views +from plinth.views import ConfigurationView urlpatterns = [ - url(r'^apps/owncloud/$', views.index, name='index'), + url(r'^apps/owncloud/$', ConfigurationView.as_view(module_name='owncloud'), + name='index'), ] diff --git a/plinth/modules/owncloud/views.py b/plinth/modules/owncloud/views.py deleted file mode 100644 index b2e77077b..000000000 --- a/plinth/modules/owncloud/views.py +++ /dev/null @@ -1,75 +0,0 @@ -# -# This file is part of Plinth. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# - -""" -Plinth module for configuring ownCloud. -""" - -from django.contrib import messages -from django.template.response import TemplateResponse -from django.utils.translation import ugettext_lazy as _ - -from .forms import OwnCloudForm -from plinth import actions -from plinth.modules import owncloud - - -def index(request): - """Serve the ownCloud configuration page""" - status = get_status() - - form = None - - if request.method == 'POST': - form = OwnCloudForm(request.POST, prefix='owncloud') - # pylint: disable-msg=E1101 - if form.is_valid(): - _apply_changes(request, status, form.cleaned_data) - status = get_status() - form = OwnCloudForm(initial=status, prefix='owncloud') - else: - form = OwnCloudForm(initial=status, prefix='owncloud') - - return TemplateResponse(request, 'owncloud.html', - {'title': owncloud.title, - 'description': owncloud.description, - 'form': form}) - - -def get_status(): - """Return the current status""" - return {'enabled': owncloud.is_enabled()} - - -def _apply_changes(request, old_status, new_status): - """Apply the changes""" - if old_status['enabled'] == new_status['enabled']: - messages.info(request, _('Setting unchanged')) - return - - if new_status['enabled']: - messages.success(request, _('ownCloud enabled')) - option = 'enable' - else: - messages.success(request, _('ownCloud disabled')) - option = 'noenable' - - actions.superuser_run('owncloud-setup', [option]) - - # Send a signal to other modules that the service is - # enabled/disabled - owncloud.service.notify_enabled(None, new_status['enabled']) From 5c7eb69c319766da9e5378ae83c8f750981ebbc5 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sun, 28 Feb 2016 12:27:47 +0530 Subject: [PATCH 144/189] radicale: Use common view for configuration --- plinth/modules/radicale/__init__.py | 13 ++++++ plinth/modules/radicale/forms.py | 30 ------------ plinth/modules/radicale/urls.py | 5 +- plinth/modules/radicale/views.py | 72 ----------------------------- 4 files changed, 16 insertions(+), 104 deletions(-) delete mode 100644 plinth/modules/radicale/forms.py delete mode 100644 plinth/modules/radicale/views.py diff --git a/plinth/modules/radicale/__init__.py b/plinth/modules/radicale/__init__.py index 026aa18ee..b421ce174 100644 --- a/plinth/modules/radicale/__init__.py +++ b/plinth/modules/radicale/__init__.py @@ -65,6 +65,12 @@ def setup(helper, old_version=None): helper.call('post', service.notify_enabled, None, True) +def get_status(): + """Get the current service status.""" + return {'enabled': is_enabled(), + 'is_running': is_running()} + + def is_enabled(): """Return whether the service is enabled.""" return action_utils.service_is_enabled('radicale') @@ -75,6 +81,13 @@ def is_running(): return action_utils.service_is_running('radicale') +def enable(should_enable): + """Enable/disable the module.""" + sub_command = 'enable' if should_enable else 'disable' + actions.superuser_run('radicale', [sub_command]) + service.notify_enabled(None, should_enable) + + def diagnose(): """Run diagnostics and return the results.""" results = [] diff --git a/plinth/modules/radicale/forms.py b/plinth/modules/radicale/forms.py deleted file mode 100644 index 7ecbeae83..000000000 --- a/plinth/modules/radicale/forms.py +++ /dev/null @@ -1,30 +0,0 @@ -# -# This file is part of Plinth. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# - -""" -Forms for radicale module. -""" - -from django import forms -from django.utils.translation import ugettext_lazy as _ - - -class RadicaleForm(forms.Form): - """Radicale configuration form.""" - enabled = forms.BooleanField( - label=_('Enable Radicale service'), - required=False) diff --git a/plinth/modules/radicale/urls.py b/plinth/modules/radicale/urls.py index ae7c20084..55f492662 100644 --- a/plinth/modules/radicale/urls.py +++ b/plinth/modules/radicale/urls.py @@ -21,9 +21,10 @@ from django.conf.urls import url -from . import views +from plinth.views import ConfigurationView urlpatterns = [ - url(r'^apps/radicale/$', views.index, name='index'), + url(r'^apps/radicale/$', ConfigurationView.as_view(module_name='radicale'), + name='index'), ] diff --git a/plinth/modules/radicale/views.py b/plinth/modules/radicale/views.py deleted file mode 100644 index f0d37cc6d..000000000 --- a/plinth/modules/radicale/views.py +++ /dev/null @@ -1,72 +0,0 @@ -# -# This file is part of Plinth. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# - -""" -Views for radicale module. -""" - -from django.contrib import messages -from django.template.response import TemplateResponse -from django.utils.translation import ugettext as _ - -from .forms import RadicaleForm -from plinth import actions -from plinth.modules import radicale - - -def index(request): - """Serve configuration page.""" - status = get_status() - - form = None - - if request.method == 'POST': - form = RadicaleForm(request.POST, prefix='radicale') - if form.is_valid(): - _apply_changes(request, status, form.cleaned_data) - status = get_status() - form = RadicaleForm(initial=status, prefix='radicale') - else: - form = RadicaleForm(initial=status, prefix='radicale') - - return TemplateResponse(request, 'radicale.html', - {'title': radicale.title, - 'description': radicale.description, - 'status': status, - 'form': form}) - - -def get_status(): - """Get the current service status.""" - return {'enabled': radicale.is_enabled(), - 'is_running': radicale.is_running()} - - -def _apply_changes(request, old_status, new_status): - """Apply the changes.""" - modified = False - - if old_status['enabled'] != new_status['enabled']: - sub_command = 'enable' if new_status['enabled'] else 'disable' - actions.superuser_run('radicale', [sub_command]) - radicale.service.notify_enabled(None, new_status['enabled']) - modified = True - - if modified: - messages.success(request, _('Configuration updated')) - else: - messages.info(request, _('Setting unchanged')) From fb19fed6f54f12bf291d345b1ad95a8cd3fc795f Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sun, 28 Feb 2016 12:28:00 +0530 Subject: [PATCH 145/189] shaarli: Use common view for configuration --- plinth/modules/shaarli/__init__.py | 13 ++++++ plinth/modules/shaarli/forms.py | 30 ------------- plinth/modules/shaarli/urls.py | 5 ++- plinth/modules/shaarli/views.py | 72 ------------------------------ 4 files changed, 16 insertions(+), 104 deletions(-) delete mode 100644 plinth/modules/shaarli/forms.py delete mode 100644 plinth/modules/shaarli/views.py diff --git a/plinth/modules/shaarli/__init__.py b/plinth/modules/shaarli/__init__.py index 2210da998..bbb35cc1e 100644 --- a/plinth/modules/shaarli/__init__.py +++ b/plinth/modules/shaarli/__init__.py @@ -21,6 +21,7 @@ from django.utils.translation import ugettext_lazy as _ +from plinth import actions from plinth import action_utils from plinth import cfg from plinth import service as service_module @@ -61,6 +62,18 @@ def setup(helper, old_version=None): helper.call('post', service.notify_enabled, None, True) +def get_status(): + """Get the current settings.""" + return {'enabled': is_enabled()} + + def is_enabled(): """Return whether the module is enabled.""" return action_utils.webserver_is_enabled('shaarli') + + +def enable(should_enable): + """Enable/disable the module.""" + sub_command = 'enable' if should_enable else 'disable' + actions.superuser_run('shaarli', [sub_command]) + service.notify_enabled(None, should_enable) diff --git a/plinth/modules/shaarli/forms.py b/plinth/modules/shaarli/forms.py deleted file mode 100644 index 01c571adb..000000000 --- a/plinth/modules/shaarli/forms.py +++ /dev/null @@ -1,30 +0,0 @@ -# -# This file is part of Plinth. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# - -""" -Forms for configuring Shaarli. -""" - -from django import forms -from django.utils.translation import ugettext_lazy as _ - - -class ShaarliForm(forms.Form): - """Shaarli configuration form.""" - enabled = forms.BooleanField( - label=_('Enable Shaarli'), - required=False) diff --git a/plinth/modules/shaarli/urls.py b/plinth/modules/shaarli/urls.py index 2784905eb..b75250a3d 100644 --- a/plinth/modules/shaarli/urls.py +++ b/plinth/modules/shaarli/urls.py @@ -21,9 +21,10 @@ from django.conf.urls import url -from . import views +from plinth.views import ConfigurationView urlpatterns = [ - url(r'^apps/shaarli/$', views.index, name='index'), + url(r'^apps/shaarli/$', ConfigurationView.as_view(module_name='shaarli'), + name='index'), ] diff --git a/plinth/modules/shaarli/views.py b/plinth/modules/shaarli/views.py deleted file mode 100644 index de174faa7..000000000 --- a/plinth/modules/shaarli/views.py +++ /dev/null @@ -1,72 +0,0 @@ -# -# This file is part of Plinth. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# - -""" -Plinth module to configure Shaarli. -""" - -from django.contrib import messages -from django.template.response import TemplateResponse -from django.utils.translation import ugettext as _ - -from .forms import ShaarliForm -from plinth import actions -from plinth.modules import shaarli - - -def index(request): - """Serve configuration page.""" - status = get_status() - - form = None - - if request.method == 'POST': - form = ShaarliForm(request.POST, prefix='shaarli') - if form.is_valid(): - _apply_changes(request, status, form.cleaned_data) - status = get_status() - form = ShaarliForm(initial=status, prefix='shaarli') - else: - form = ShaarliForm(initial=status, prefix='shaarli') - - return TemplateResponse(request, 'shaarli.html', - {'title': shaarli.title, - 'description': shaarli.description, - 'status': status, - 'form': form}) - - -def get_status(): - """Get the current settings.""" - status = {'enabled': shaarli.is_enabled()} - return status - - -def _apply_changes(request, old_status, new_status): - """Apply the changes.""" - modified = False - - if old_status['enabled'] != new_status['enabled']: - sub_command = 'enable' if new_status['enabled'] else 'disable' - actions.superuser_run('shaarli', [sub_command]) - shaarli.service.notify_enabled(None, new_status['enabled']) - modified = True - - if modified: - messages.success(request, _('Configuration updated')) - else: - messages.info(request, _('Setting unchanged')) From 40a9507aae024b432fc8b581e0d45078381c48cf Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sun, 28 Feb 2016 12:38:52 +0530 Subject: [PATCH 146/189] xmpp: Use common view for configuration --- plinth/modules/xmpp/__init__.py | 14 ++++++ plinth/modules/xmpp/forms.py | 30 ------------- plinth/modules/xmpp/urls.py | 6 ++- plinth/modules/xmpp/views.py | 79 --------------------------------- 4 files changed, 18 insertions(+), 111 deletions(-) delete mode 100644 plinth/modules/xmpp/forms.py delete mode 100644 plinth/modules/xmpp/views.py diff --git a/plinth/modules/xmpp/__init__.py b/plinth/modules/xmpp/__init__.py index 1365f1d98..d823530bd 100644 --- a/plinth/modules/xmpp/__init__.py +++ b/plinth/modules/xmpp/__init__.py @@ -79,6 +79,13 @@ def setup(helper, old_version=None): helper.call('post', service.notify_enabled, None, True) +def get_status(): + """Get the current settings.""" + return {'enabled': is_enabled(), + 'is_running': is_running(), + 'domainname': get_domainname()} + + def is_enabled(): """Return whether the module is enabled.""" return (action_utils.service_is_enabled('ejabberd') and @@ -96,6 +103,13 @@ def get_domainname(): return '.'.join(fqdn.split('.')[1:]) +def enable(should_enable): + """Enable/disable the module.""" + sub_command = 'enable' if should_enable else 'disable' + actions.superuser_run('xmpp', [sub_command]) + service.notify_enabled(None, should_enable) + + def on_pre_hostname_change(sender, old_hostname, new_hostname, **kwargs): """ Backup ejabberd database before hostname is changed. diff --git a/plinth/modules/xmpp/forms.py b/plinth/modules/xmpp/forms.py deleted file mode 100644 index 3d9e5d61d..000000000 --- a/plinth/modules/xmpp/forms.py +++ /dev/null @@ -1,30 +0,0 @@ -# -# This file is part of Plinth. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# - -""" -Forms for configuring XMPP service. -""" - -from django import forms -from django.utils.translation import ugettext_lazy as _ - - -class XmppForm(forms.Form): # pylint: disable=W0232 - """XMPP configuration form.""" - enabled = forms.BooleanField( - label=_('Enable XMPP'), - required=False) diff --git a/plinth/modules/xmpp/urls.py b/plinth/modules/xmpp/urls.py index db022e9cf..36e86a7c3 100644 --- a/plinth/modules/xmpp/urls.py +++ b/plinth/modules/xmpp/urls.py @@ -21,8 +21,10 @@ from django.conf.urls import url -from . import views +from plinth.views import ConfigurationView + urlpatterns = [ - url(r'^apps/xmpp/$', views.index, name='index'), + url(r'^apps/xmpp/$', ConfigurationView.as_view(module_name='xmpp'), + name='index'), ] diff --git a/plinth/modules/xmpp/views.py b/plinth/modules/xmpp/views.py deleted file mode 100644 index ca1841535..000000000 --- a/plinth/modules/xmpp/views.py +++ /dev/null @@ -1,79 +0,0 @@ -# -# This file is part of Plinth. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# - -""" -Plinth module to configure XMPP server -""" - -from django.contrib import messages -from django.template.response import TemplateResponse -from django.utils.translation import ugettext as _ -import logging - -from .forms import XmppForm -from plinth import actions -from plinth.modules import xmpp - - -logger = logging.getLogger(__name__) - - -def index(request): - """Serve configuration page""" - status = get_status() - - form = None - - if request.method == 'POST': - form = XmppForm(request.POST, prefix='xmpp') - if form.is_valid(): - _apply_changes(request, status, form.cleaned_data) - status = get_status() - form = XmppForm(initial=status, prefix='xmpp') - else: - form = XmppForm(initial=status, prefix='xmpp') - - return TemplateResponse(request, 'xmpp.html', - {'title': xmpp.title, - 'description': xmpp.description, - 'status': status, - 'form': form}) - - -def get_status(): - """Get the current settings.""" - status = {'enabled': xmpp.is_enabled(), - 'is_running': xmpp.is_running(), - 'domainname': xmpp.get_domainname()} - - return status - - -def _apply_changes(request, old_status, new_status): - """Apply the changes.""" - modified = False - - if old_status['enabled'] != new_status['enabled']: - sub_command = 'enable' if new_status['enabled'] else 'disable' - actions.superuser_run('xmpp', [sub_command]) - xmpp.service.notify_enabled(None, new_status['enabled']) - modified = True - - if modified: - messages.success(request, _('Configuration updated')) - else: - messages.info(request, _('Setting unchanged')) From 1f6935c30ba5f76c3ffb2c66fe78a3cec62ebfc8 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sun, 28 Feb 2016 12:54:57 +0530 Subject: [PATCH 147/189] roundcube: Use common view for configuration --- plinth/modules/roundcube/__init__.py | 11 +++++ plinth/modules/roundcube/forms.py | 30 ----------- plinth/modules/roundcube/urls.py | 5 +- plinth/modules/roundcube/views.py | 74 ---------------------------- 4 files changed, 14 insertions(+), 106 deletions(-) delete mode 100644 plinth/modules/roundcube/forms.py delete mode 100644 plinth/modules/roundcube/views.py diff --git a/plinth/modules/roundcube/__init__.py b/plinth/modules/roundcube/__init__.py index 1c11596af..a67364707 100644 --- a/plinth/modules/roundcube/__init__.py +++ b/plinth/modules/roundcube/__init__.py @@ -68,11 +68,22 @@ def setup(helper, old_version=None): helper.call('pre', actions.superuser_run, 'roundcube', ['setup']) +def get_status(): + """Get the current status.""" + return {'enabled': is_enabled()} + + def is_enabled(): """Return whether the module is enabled.""" return action_utils.webserver_is_enabled('roundcube') +def enable(should_enable): + """Enable/disable the module.""" + sub_command = 'enable' if should_enable else 'disable' + actions.superuser_run('roundcube', [sub_command]) + + def diagnose(): """Run diagnostics and return the results.""" results = [] diff --git a/plinth/modules/roundcube/forms.py b/plinth/modules/roundcube/forms.py deleted file mode 100644 index ef0014a6c..000000000 --- a/plinth/modules/roundcube/forms.py +++ /dev/null @@ -1,30 +0,0 @@ -# -# This file is part of Plinth. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# - -""" -Forms for configuring Roundcube. -""" - -from django import forms -from django.utils.translation import ugettext_lazy as _ - - -class RoundcubeForm(forms.Form): - """Roundcube configuration form.""" - enabled = forms.BooleanField( - label=_('Enable Roundcube'), - required=False) diff --git a/plinth/modules/roundcube/urls.py b/plinth/modules/roundcube/urls.py index 66be5df69..a307cce07 100644 --- a/plinth/modules/roundcube/urls.py +++ b/plinth/modules/roundcube/urls.py @@ -21,9 +21,10 @@ from django.conf.urls import url -from . import views +from plinth.views import ConfigurationView urlpatterns = [ - url(r'^apps/roundcube/$', views.index, name='index'), + url(r'^apps/roundcube/$', + ConfigurationView.as_view(module_name='roundcube'), name='index'), ] diff --git a/plinth/modules/roundcube/views.py b/plinth/modules/roundcube/views.py deleted file mode 100644 index 610fdb8c0..000000000 --- a/plinth/modules/roundcube/views.py +++ /dev/null @@ -1,74 +0,0 @@ -# -# This file is part of Plinth. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# - -""" -Plinth module for configuring Roundcube. -""" - -from django.contrib import messages -from django.template.response import TemplateResponse -from django.utils.translation import ugettext as _ -import logging - -from .forms import RoundcubeForm -from plinth import actions -from plinth.modules import roundcube - -logger = logging.getLogger(__name__) - - -def index(request): - """Serve configuration page.""" - status = get_status() - - form = None - - if request.method == 'POST': - form = RoundcubeForm(request.POST, prefix='roundcube') - # pylint: disable=E1101 - if form.is_valid(): - _apply_changes(request, status, form.cleaned_data) - status = get_status() - form = RoundcubeForm(initial=status, prefix='roundcube') - else: - form = RoundcubeForm(initial=status, prefix='roundcube') - - return TemplateResponse(request, 'roundcube.html', - {'title': roundcube.title, - 'description': roundcube.description, - 'status': status, - 'form': form}) - - -def get_status(): - """Get the current status.""" - return {'enabled': roundcube.is_enabled()} - - -def _apply_changes(request, old_status, new_status): - """Apply the changes.""" - modified = False - - if old_status['enabled'] != new_status['enabled']: - sub_command = 'enable' if new_status['enabled'] else 'disable' - actions.superuser_run('roundcube', [sub_command]) - modified = True - - if modified: - messages.success(request, _('Configuration updated')) - else: - messages.info(request, _('Setting unchanged')) From 1eae781e647c7856402388a8f10179974e6467f0 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sun, 28 Feb 2016 14:49:34 +0530 Subject: [PATCH 148/189] quassel: Use common view for configuration --- plinth/modules/quassel/__init__.py | 14 ++++++ plinth/modules/quassel/forms.py | 30 ------------- plinth/modules/quassel/urls.py | 5 ++- plinth/modules/quassel/views.py | 72 ------------------------------ 4 files changed, 17 insertions(+), 104 deletions(-) delete mode 100644 plinth/modules/quassel/forms.py delete mode 100644 plinth/modules/quassel/views.py diff --git a/plinth/modules/quassel/__init__.py b/plinth/modules/quassel/__init__.py index c30f0abcc..b2a4bdb37 100644 --- a/plinth/modules/quassel/__init__.py +++ b/plinth/modules/quassel/__init__.py @@ -21,6 +21,7 @@ from django.utils.translation import ugettext_lazy as _ +from plinth import actions from plinth import action_utils from plinth import cfg from plinth import service as service_module @@ -68,6 +69,12 @@ def setup(helper, old_version=None): helper.call('post', service.notify_enabled, None, True) +def get_status(): + """Get the current service status.""" + return {'enabled': is_enabled(), + 'is_running': is_running()} + + def is_enabled(): """Return whether the service is enabled.""" return action_utils.service_is_enabled('quasselcore') @@ -78,6 +85,13 @@ def is_running(): return action_utils.service_is_running('quasselcore') +def enable(should_enable): + """Enable/disable the module.""" + sub_command = 'enable' if should_enable else 'disable' + actions.superuser_run('quassel', [sub_command]) + service.notify_enabled(None, should_enable) + + def diagnose(): """Run diagnostics and return the results.""" results = [] diff --git a/plinth/modules/quassel/forms.py b/plinth/modules/quassel/forms.py deleted file mode 100644 index c8da8c883..000000000 --- a/plinth/modules/quassel/forms.py +++ /dev/null @@ -1,30 +0,0 @@ -# -# This file is part of Plinth. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# - -""" -Forms for Quassel module. -""" - -from django import forms -from django.utils.translation import ugettext_lazy as _ - - -class QuasselForm(forms.Form): - """Quassel configuration form.""" - enabled = forms.BooleanField( - label=_('Enable Quassel core service'), - required=False) diff --git a/plinth/modules/quassel/urls.py b/plinth/modules/quassel/urls.py index 5018ac2f8..3fef76f7f 100644 --- a/plinth/modules/quassel/urls.py +++ b/plinth/modules/quassel/urls.py @@ -21,9 +21,10 @@ from django.conf.urls import url -from . import views +from plinth.views import ConfigurationView urlpatterns = [ - url(r'^apps/quassel/$', views.index, name='index'), + url(r'^apps/quassel/$', ConfigurationView.as_view(module_name='quassel'), + name='index'), ] diff --git a/plinth/modules/quassel/views.py b/plinth/modules/quassel/views.py deleted file mode 100644 index 2adee5260..000000000 --- a/plinth/modules/quassel/views.py +++ /dev/null @@ -1,72 +0,0 @@ -# -# This file is part of Plinth. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# - -""" -Views for Quassel module. -""" - -from django.contrib import messages -from django.template.response import TemplateResponse -from django.utils.translation import ugettext as _ - -from .forms import QuasselForm -from plinth import actions -from plinth.modules import quassel - - -def index(request): - """Serve configuration page.""" - status = get_status() - - form = None - - if request.method == 'POST': - form = QuasselForm(request.POST, prefix='quassel') - if form.is_valid(): - _apply_changes(request, status, form.cleaned_data) - status = get_status() - form = QuasselForm(initial=status, prefix='quassel') - else: - form = QuasselForm(initial=status, prefix='quassel') - - return TemplateResponse(request, 'quassel.html', - {'title': quassel.title, - 'description': quassel.description, - 'status': status, - 'form': form}) - - -def get_status(): - """Get the current service status.""" - return {'enabled': quassel.is_enabled(), - 'is_running': quassel.is_running()} - - -def _apply_changes(request, old_status, new_status): - """Apply the changes.""" - modified = False - - if old_status['enabled'] != new_status['enabled']: - sub_command = 'enable' if new_status['enabled'] else 'disable' - actions.superuser_run('quassel', [sub_command]) - quassel.service.notify_enabled(None, new_status['enabled']) - modified = True - - if modified: - messages.success(request, _('Configuration updated')) - else: - messages.info(request, _('Setting unchanged')) From 07df62854bf2d5a52b3460d2d1e0c6c4b0020d96 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sun, 28 Feb 2016 14:54:06 +0530 Subject: [PATCH 149/189] restore: Use common view for configuration - Rename the template from restore_index.html to restore.html to avoid having to create a custom view. --- plinth/modules/restore/__init__.py | 17 ++++- plinth/modules/restore/forms.py | 30 -------- .../{restore_index.html => restore.html} | 0 plinth/modules/restore/urls.py | 5 +- plinth/modules/restore/views.py | 70 ------------------- 5 files changed, 19 insertions(+), 103 deletions(-) delete mode 100644 plinth/modules/restore/forms.py rename plinth/modules/restore/templates/{restore_index.html => restore.html} (100%) delete mode 100644 plinth/modules/restore/views.py diff --git a/plinth/modules/restore/__init__.py b/plinth/modules/restore/__init__.py index dff18b3d4..532cabd0a 100644 --- a/plinth/modules/restore/__init__.py +++ b/plinth/modules/restore/__init__.py @@ -20,11 +20,12 @@ """ from django.utils.translation import ugettext_lazy as _ + +from plinth import actions from plinth import action_utils, cfg from plinth import service as service_module from plinth.utils import format_lazy -service = None version = 1 @@ -45,6 +46,8 @@ 'reStore web-interface.') ] +service = None + def init(): """Initialize the reStore module.""" @@ -62,6 +65,18 @@ def setup(helper, old_version=None): helper.install(['node-restore']) +def get_status(): + """Get the current settings.""" + return {'enabled': is_enabled()} + + def is_enabled(): """Return whether the module is enabled.""" return action_utils.service_is_enabled('node-restore') + + +def enable(should_enable): + """Enable/disable the module.""" + sub_command = 'enable' if should_enable else 'disable' + actions.superuser_run('restore', [sub_command]) + service.notify_enabled(None, should_enable) diff --git a/plinth/modules/restore/forms.py b/plinth/modules/restore/forms.py deleted file mode 100644 index 4c8c2bf90..000000000 --- a/plinth/modules/restore/forms.py +++ /dev/null @@ -1,30 +0,0 @@ -# -# This file is part of Plinth. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# - -""" -Forms for configuring reStore. -""" - -from django import forms -from django.utils.translation import ugettext_lazy as _ - - -class ReStoreForm(forms.Form): - """reStore configuration form.""" - enabled = forms.BooleanField( - label=_('Enable reStore'), - required=False) diff --git a/plinth/modules/restore/templates/restore_index.html b/plinth/modules/restore/templates/restore.html similarity index 100% rename from plinth/modules/restore/templates/restore_index.html rename to plinth/modules/restore/templates/restore.html diff --git a/plinth/modules/restore/urls.py b/plinth/modules/restore/urls.py index 69cec1a51..c51116f8f 100644 --- a/plinth/modules/restore/urls.py +++ b/plinth/modules/restore/urls.py @@ -21,9 +21,10 @@ from django.conf.urls import url -from . import views +from plinth.views import ConfigurationView urlpatterns = [ - url(r'^apps/restore/$', views.index, name='index'), + url(r'^apps/restore/$', ConfigurationView.as_view(module_name='restore'), + name='index'), ] diff --git a/plinth/modules/restore/views.py b/plinth/modules/restore/views.py deleted file mode 100644 index 0e91904a4..000000000 --- a/plinth/modules/restore/views.py +++ /dev/null @@ -1,70 +0,0 @@ -# -# This file is part of Plinth. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# - -""" -Plinth module for configuring reStore. -""" - -from django.contrib import messages -from django.template.response import TemplateResponse -from django.utils.translation import ugettext as _ - -from .forms import ReStoreForm -from plinth import actions -from plinth.modules import restore - - -def index(request): - """Serve configuration page.""" - status = get_status() - - if request.method == 'POST': - form = ReStoreForm(request.POST, prefix='restore') - if form.is_valid(): - _apply_changes(request, status, form.cleaned_data) - status = get_status() - form = ReStoreForm(initial=status, prefix='restore') - else: - form = ReStoreForm(initial=status, prefix='restore') - - return TemplateResponse(request, 'restore_index.html', - {'title': restore.title, - 'description': restore.description, - 'status': status, - 'form': form}) - - -def get_status(): - """Get the current settings.""" - status = {'enabled': restore.is_enabled()} - return status - - -def _apply_changes(request, old_status, new_status): - """Apply the changes.""" - modified = False - - if old_status['enabled'] != new_status['enabled']: - sub_command = 'enable' if new_status['enabled'] else 'disable' - actions.superuser_run('restore', [sub_command]) - restore.service.notify_enabled(None, new_status['enabled']) - modified = True - - if modified: - messages.success(request, _('Configuration updated')) - else: - messages.info(request, _('Setting unchanged')) From 75d35b3d6046e2ae680c9e0bc3aca529470e4bd0 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sun, 28 Feb 2016 15:06:11 +0530 Subject: [PATCH 150/189] mumble: Use common view for configuration --- plinth/modules/mumble/__init__.py | 14 ++++++ plinth/modules/mumble/forms.py | 30 ------------ plinth/modules/mumble/urls.py | 5 +- plinth/modules/mumble/views.py | 76 ------------------------------- 4 files changed, 17 insertions(+), 108 deletions(-) delete mode 100644 plinth/modules/mumble/forms.py delete mode 100644 plinth/modules/mumble/views.py diff --git a/plinth/modules/mumble/__init__.py b/plinth/modules/mumble/__init__.py index b7f772494..a5ccd5902 100644 --- a/plinth/modules/mumble/__init__.py +++ b/plinth/modules/mumble/__init__.py @@ -21,6 +21,7 @@ from django.utils.translation import ugettext_lazy as _ +from plinth import actions from plinth import action_utils from plinth import cfg from plinth import service as service_module @@ -60,6 +61,12 @@ def setup(helper, old_version=None): helper.call('post', service.notify_enabled, None, True) +def get_status(): + """Get the current settings from server.""" + return {'enabled': is_enabled(), + 'is_running': is_running()} + + def is_enabled(): """Return whether the module is enabled.""" return action_utils.service_is_enabled('mumble-server') @@ -70,6 +77,13 @@ def is_running(): return action_utils.service_is_running('mumble-server') +def enable(should_enable): + """Enable/disable the module.""" + sub_command = 'enable' if should_enable else 'disable' + actions.superuser_run('mumble', [sub_command]) + service.notify_enabled(None, should_enable) + + def diagnose(): """Run diagnostics and return the results.""" results = [] diff --git a/plinth/modules/mumble/forms.py b/plinth/modules/mumble/forms.py deleted file mode 100644 index 88568e19b..000000000 --- a/plinth/modules/mumble/forms.py +++ /dev/null @@ -1,30 +0,0 @@ -# -# This file is part of Plinth. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# - -""" -Forms for configuring Mumble -""" - -from django import forms -from django.utils.translation import ugettext_lazy as _ - - -class MumbleForm(forms.Form): - """Mumble configuration form.""" - enabled = forms.BooleanField( - label=_('Enable Mumble daemon'), - required=False) diff --git a/plinth/modules/mumble/urls.py b/plinth/modules/mumble/urls.py index 87f27aa88..77aa97da5 100644 --- a/plinth/modules/mumble/urls.py +++ b/plinth/modules/mumble/urls.py @@ -21,9 +21,10 @@ from django.conf.urls import url -from . import views +from plinth.views import ConfigurationView urlpatterns = [ - url(r'^apps/mumble/$', views.index, name='index'), + url(r'^apps/mumble/$', ConfigurationView.as_view(module_name='mumble'), + name='index'), ] diff --git a/plinth/modules/mumble/views.py b/plinth/modules/mumble/views.py deleted file mode 100644 index 4d67f6458..000000000 --- a/plinth/modules/mumble/views.py +++ /dev/null @@ -1,76 +0,0 @@ -# -# This file is part of Plinth. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# - -""" -Plinth module for configuring Mumble Server -""" - -from django.contrib import messages -from django.template.response import TemplateResponse -from django.utils.translation import ugettext as _ -import logging - -from .forms import MumbleForm -from plinth import actions -from plinth.modules import mumble - -logger = logging.getLogger(__name__) - - -def index(request): - """Serve configuration page.""" - status = get_status() - - form = None - - if request.method == 'POST': - form = MumbleForm(request.POST, prefix='mumble') - # pylint: disable=E1101 - if form.is_valid(): - _apply_changes(request, status, form.cleaned_data) - status = get_status() - form = MumbleForm(initial=status, prefix='mumble') - else: - form = MumbleForm(initial=status, prefix='mumble') - - return TemplateResponse(request, 'mumble.html', - {'title': mumble.title, - 'description': mumble.description, - 'status': status, - 'form': form}) - - -def get_status(): - """Get the current settings from server.""" - return {'enabled': mumble.is_enabled(), - 'is_running': mumble.is_running()} - - -def _apply_changes(request, old_status, new_status): - """Apply the changes.""" - modified = False - - if old_status['enabled'] != new_status['enabled']: - sub_command = 'enable' if new_status['enabled'] else 'disable' - actions.superuser_run('mumble', [sub_command]) - mumble.service.notify_enabled(None, new_status['enabled']) - modified = True - - if modified: - messages.success(request, _('Configuration updated')) - else: - messages.info(request, _('Setting unchanged')) From 6a462cecc8b83d2afb9c96730e99e476576c1f88 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sun, 28 Feb 2016 15:11:48 +0530 Subject: [PATCH 151/189] privoxy: Use common view for configuration --- plinth/modules/privoxy/__init__.py | 13 +++++ plinth/modules/privoxy/forms.py | 30 ------------ plinth/modules/privoxy/urls.py | 5 +- plinth/modules/privoxy/views.py | 78 ------------------------------ 4 files changed, 16 insertions(+), 110 deletions(-) delete mode 100644 plinth/modules/privoxy/forms.py delete mode 100644 plinth/modules/privoxy/views.py diff --git a/plinth/modules/privoxy/__init__.py b/plinth/modules/privoxy/__init__.py index eaf0d20d1..4416d8f53 100644 --- a/plinth/modules/privoxy/__init__.py +++ b/plinth/modules/privoxy/__init__.py @@ -71,6 +71,12 @@ def setup(helper, old_version=None): helper.call('post', service.notify_enabled, None, True) +def get_status(): + """Get the current settings from server.""" + return {'enabled': is_enabled(), + 'is_running': is_running()} + + def is_enabled(): """Return whether the module is enabled.""" return action_utils.service_is_enabled('privoxy') @@ -81,6 +87,13 @@ def is_running(): return action_utils.service_is_running('privoxy') +def enable(should_enable): + """Enable/disable the module.""" + sub_command = 'enable' if should_enable else 'disable' + actions.superuser_run('privoxy', [sub_command]) + service.notify_enabled(None, should_enable) + + def diagnose(): """Run diagnostics and return the results.""" results = [] diff --git a/plinth/modules/privoxy/forms.py b/plinth/modules/privoxy/forms.py deleted file mode 100644 index e22b99d27..000000000 --- a/plinth/modules/privoxy/forms.py +++ /dev/null @@ -1,30 +0,0 @@ -# -# This file is part of Plinth. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# - -""" -Forms for configuring Privoxy. -""" - -from django import forms -from django.utils.translation import ugettext_lazy as _ - - -class PrivoxyForm(forms.Form): - """Privoxy configuration form.""" - enabled = forms.BooleanField( - label=_('Enable Privoxy'), - required=False) diff --git a/plinth/modules/privoxy/urls.py b/plinth/modules/privoxy/urls.py index 3ca303381..a4a60ca39 100644 --- a/plinth/modules/privoxy/urls.py +++ b/plinth/modules/privoxy/urls.py @@ -21,9 +21,10 @@ from django.conf.urls import url -from . import views +from plinth.views import ConfigurationView urlpatterns = [ - url(r'^apps/privoxy/$', views.index, name='index'), + url(r'^apps/privoxy/$', ConfigurationView.as_view(module_name='privoxy'), + name='index'), ] diff --git a/plinth/modules/privoxy/views.py b/plinth/modules/privoxy/views.py deleted file mode 100644 index 853f8709f..000000000 --- a/plinth/modules/privoxy/views.py +++ /dev/null @@ -1,78 +0,0 @@ -# -# This file is part of Plinth. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# - -""" -Plinth module for configuring Privoxy Server. -""" - -from django.contrib import messages -from django.template.response import TemplateResponse -from django.utils.translation import ugettext as _ -import logging - -from .forms import PrivoxyForm -from plinth import actions -from plinth.modules import privoxy - -logger = logging.getLogger(__name__) - - -def index(request): - """Serve configuration page.""" - status = get_status() - - form = None - - if request.method == 'POST': - form = PrivoxyForm(request.POST, prefix='privoxy') - # pylint: disable=E1101 - if form.is_valid(): - _apply_changes(request, status, form.cleaned_data) - status = get_status() - form = PrivoxyForm(initial=status, prefix='privoxy') - else: - form = PrivoxyForm(initial=status, prefix='privoxy') - - return TemplateResponse(request, 'privoxy.html', - {'title': privoxy.title, - 'description': privoxy.description, - 'status': status, - 'form': form}) - - -def get_status(): - """Get the current settings from server.""" - status = {'enabled': privoxy.is_enabled(), - 'is_running': privoxy.is_running()} - - return status - - -def _apply_changes(request, old_status, new_status): - """Apply the changes.""" - modified = False - - if old_status['enabled'] != new_status['enabled']: - sub_command = 'enable' if new_status['enabled'] else 'disable' - actions.superuser_run('privoxy', [sub_command]) - privoxy.service.notify_enabled(None, new_status['enabled']) - modified = True - - if modified: - messages.success(request, _('Configuration updated')) - else: - messages.info(request, _('Setting unchanged')) From ab96bc7068e157e79a41b98c479a0489fd244940 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sun, 28 Feb 2016 15:18:19 +0530 Subject: [PATCH 152/189] repro: Use common view for configuration --- plinth/modules/repro/__init__.py | 13 ++++++ plinth/modules/repro/forms.py | 30 ------------- plinth/modules/repro/urls.py | 5 ++- plinth/modules/repro/views.py | 72 -------------------------------- 4 files changed, 16 insertions(+), 104 deletions(-) delete mode 100644 plinth/modules/repro/forms.py delete mode 100644 plinth/modules/repro/views.py diff --git a/plinth/modules/repro/__init__.py b/plinth/modules/repro/__init__.py index 0a72adcf8..586923be8 100644 --- a/plinth/modules/repro/__init__.py +++ b/plinth/modules/repro/__init__.py @@ -74,6 +74,12 @@ def setup(helper, old_version=None): helper.call('post', service.notify_enabled, None, True) +def get_status(): + """Get the current service status.""" + return {'enabled': is_enabled(), + 'is_running': is_running()} + + def is_enabled(): """Return whether the service is enabled.""" return action_utils.service_is_enabled('repro') @@ -84,6 +90,13 @@ def is_running(): return action_utils.service_is_running('repro') +def enable(should_enable): + """Enable/disable the module.""" + sub_command = 'enable' if should_enable else 'disable' + actions.superuser_run('repro', [sub_command]) + service.notify_enabled(None, should_enable) + + def diagnose(): """Run diagnostics and return the results.""" results = [] diff --git a/plinth/modules/repro/forms.py b/plinth/modules/repro/forms.py deleted file mode 100644 index b584701cd..000000000 --- a/plinth/modules/repro/forms.py +++ /dev/null @@ -1,30 +0,0 @@ -# -# This file is part of Plinth. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# - -""" -Forms for repro module. -""" - -from django import forms -from django.utils.translation import ugettext_lazy as _ - - -class ReproForm(forms.Form): - """Configuration form.""" - enabled = forms.BooleanField( - label=_('Enable repro service'), - required=False) diff --git a/plinth/modules/repro/urls.py b/plinth/modules/repro/urls.py index d87f8136b..aeff7f51a 100644 --- a/plinth/modules/repro/urls.py +++ b/plinth/modules/repro/urls.py @@ -21,9 +21,10 @@ from django.conf.urls import url -from . import views +from plinth.views import ConfigurationView urlpatterns = [ - url(r'^apps/repro/$', views.index, name='index'), + url(r'^apps/repro/$', ConfigurationView.as_view(module_name='repro'), + name='index'), ] diff --git a/plinth/modules/repro/views.py b/plinth/modules/repro/views.py deleted file mode 100644 index 407a96b0c..000000000 --- a/plinth/modules/repro/views.py +++ /dev/null @@ -1,72 +0,0 @@ -# -# This file is part of Plinth. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# - -""" -Views for repro module. -""" - -from django.contrib import messages -from django.template.response import TemplateResponse -from django.utils.translation import ugettext as _ - -from .forms import ReproForm -from plinth import actions -from plinth.modules import repro - - -def index(request): - """Serve configuration page.""" - status = get_status() - - form = None - - if request.method == 'POST': - form = ReproForm(request.POST, prefix='repro') - if form.is_valid(): - _apply_changes(request, status, form.cleaned_data) - status = get_status() - form = ReproForm(initial=status, prefix='repro') - else: - form = ReproForm(initial=status, prefix='repro') - - return TemplateResponse(request, 'repro.html', - {'title': repro.title, - 'description': repro.description, - 'status': status, - 'form': form}) - - -def get_status(): - """Get the current service status.""" - return {'enabled': repro.is_enabled(), - 'is_running': repro.is_running()} - - -def _apply_changes(request, old_status, new_status): - """Apply the changes.""" - modified = False - - if old_status['enabled'] != new_status['enabled']: - sub_command = 'enable' if new_status['enabled'] else 'disable' - actions.superuser_run('repro', [sub_command]) - repro.service.notify_enabled(None, new_status['enabled']) - modified = True - - if modified: - messages.success(request, _('Configuration updated')) - else: - messages.info(request, _('Setting unchanged')) From 73c7d8e89e2ea99c1addbfc3c711c6a3403d5ee9 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sun, 28 Feb 2016 16:20:43 +0530 Subject: [PATCH 153/189] avahi: Use common view for configuration --- plinth/modules/avahi/__init__.py | 14 ++++++ plinth/modules/avahi/forms.py | 30 ------------- plinth/modules/avahi/urls.py | 5 ++- plinth/modules/avahi/views.py | 75 -------------------------------- 4 files changed, 17 insertions(+), 107 deletions(-) delete mode 100644 plinth/modules/avahi/forms.py delete mode 100644 plinth/modules/avahi/views.py diff --git a/plinth/modules/avahi/__init__.py b/plinth/modules/avahi/__init__.py index c4c0970bc..f53ce9566 100644 --- a/plinth/modules/avahi/__init__.py +++ b/plinth/modules/avahi/__init__.py @@ -21,6 +21,7 @@ from django.utils.translation import ugettext_lazy as _ +from plinth import actions from plinth import action_utils from plinth import cfg from plinth import service as service_module @@ -65,6 +66,12 @@ def setup(helper, old_version=False): helper.install(['avahi-daemon']) +def get_status(): + """Get the current settings from server.""" + return {'enabled': is_enabled(), + 'is_running': is_running()} + + def is_enabled(): """Return whether the module is enabled.""" return action_utils.service_is_enabled('avahi-daemon') @@ -73,3 +80,10 @@ def is_enabled(): def is_running(): """Return whether the service is running.""" return action_utils.service_is_running('avahi-daemon') + + +def enable(should_enable): + """Enable/disable the module.""" + sub_command = 'enable' if should_enable else 'disable' + actions.superuser_run('avahi', [sub_command]) + service.notify_enabled(None, should_enable) diff --git a/plinth/modules/avahi/forms.py b/plinth/modules/avahi/forms.py deleted file mode 100644 index 66776d0c0..000000000 --- a/plinth/modules/avahi/forms.py +++ /dev/null @@ -1,30 +0,0 @@ -# -# This file is part of Plinth. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# - -""" -Plinth module for service discovery forms. -""" - -from django import forms -from django.utils.translation import ugettext_lazy as _ - - -class ServiceDiscoveryForm(forms.Form): - """Service discovery form.""" - enabled = forms.BooleanField( - label=_('Enable service discovery'), - required=False) diff --git a/plinth/modules/avahi/urls.py b/plinth/modules/avahi/urls.py index d9f84d89d..9a86c45f6 100644 --- a/plinth/modules/avahi/urls.py +++ b/plinth/modules/avahi/urls.py @@ -21,9 +21,10 @@ from django.conf.urls import url -from . import views +from plinth.views import ConfigurationView urlpatterns = [ - url(r'^sys/avahi/$', views.index, name='index'), + url(r'^sys/avahi/$', ConfigurationView.as_view(module_name='avahi'), + name='index'), ] diff --git a/plinth/modules/avahi/views.py b/plinth/modules/avahi/views.py deleted file mode 100644 index 77751abca..000000000 --- a/plinth/modules/avahi/views.py +++ /dev/null @@ -1,75 +0,0 @@ -# -# This file is part of Plinth. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# - -""" -Plinth module for service discovery views. -""" - -from django.contrib import messages -from django.template.response import TemplateResponse -from django.utils.translation import ugettext as _ -import logging - -from .forms import ServiceDiscoveryForm -from plinth import actions -from plinth.modules import avahi - - -logger = logging.getLogger(__name__) # pylint: disable=C0103 - - -def index(request): - """Serve configuration page.""" - status = get_status() - - form = None - - if request.method == 'POST': - form = ServiceDiscoveryForm(request.POST, prefix='avahi') - if form.is_valid(): - _apply_changes(request, status, form.cleaned_data) - status = get_status() - form = ServiceDiscoveryForm(initial=status, prefix='avahi') - else: - form = ServiceDiscoveryForm(initial=status, prefix='avahi') - - return TemplateResponse(request, 'avahi.html', - {'title': avahi.title, - 'description': avahi.description, - 'status': status, - 'form': form}) - - -def get_status(): - """Get the current settings from server.""" - return {'enabled': avahi.is_enabled(), - 'is_running': avahi.is_running()} - - -def _apply_changes(request, old_status, new_status): - """Apply the changes.""" - modified = False - - if old_status['enabled'] != new_status['enabled']: - sub_command = 'enable' if new_status['enabled'] else 'disable' - modified = True - actions.superuser_run('avahi', [sub_command]) - avahi.service.notify_enabled(None, new_status['enabled']) - messages.success(request, _('Configuration updated')) - - if not modified: - messages.info(request, _('Setting unchanged')) From 7385bebb89810bad2c157630091b35a203121547 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sun, 28 Feb 2016 17:18:34 +0530 Subject: [PATCH 154/189] transmission: Use common view for configuration --- plinth/modules/transmission/__init__.py | 23 +++++++ plinth/modules/transmission/forms.py | 8 +-- plinth/modules/transmission/urls.py | 5 +- plinth/modules/transmission/views.py | 90 +++++++------------------ 4 files changed, 52 insertions(+), 74 deletions(-) diff --git a/plinth/modules/transmission/__init__.py b/plinth/modules/transmission/__init__.py index aed1380ed..c11c2821e 100644 --- a/plinth/modules/transmission/__init__.py +++ b/plinth/modules/transmission/__init__.py @@ -21,6 +21,7 @@ from django.utils.translation import ugettext_lazy as _ import json +import socket from plinth import actions from plinth import action_utils @@ -42,6 +43,8 @@ service = None +TRANSMISSION_CONFIG = '/etc/transmission-daemon/settings.json' + def init(): """Intialize the Transmission module.""" @@ -67,6 +70,19 @@ def setup(helper, old_version=None): helper.call('post', service.notify_enabled, None, True) +def get_status(): + """Get the current settings from Transmission server.""" + configuration = open(TRANSMISSION_CONFIG, 'r').read() + status = json.loads(configuration) + status = {key.translate(str.maketrans({'-': '_'})): value + for key, value in status.items()} + status['enabled'] = is_enabled() + status['is_running'] = is_running() + status['hostname'] = socket.gethostname() + + return status + + def is_enabled(): """Return whether the module is enabled.""" return (action_utils.service_is_enabled('transmission-daemon') and @@ -78,6 +94,13 @@ def is_running(): return action_utils.service_is_running('transmission-daemon') +def enable(should_enable): + """Enable/disable the module.""" + sub_command = 'enable' if should_enable else 'disable' + actions.superuser_run('transmission', [sub_command]) + service.notify_enabled(None, should_enable) + + def diagnose(): """Run diagnostics and return the results.""" results = [] diff --git a/plinth/modules/transmission/forms.py b/plinth/modules/transmission/forms.py index 0960e8342..6eaa42928 100644 --- a/plinth/modules/transmission/forms.py +++ b/plinth/modules/transmission/forms.py @@ -22,13 +22,11 @@ from django import forms from django.utils.translation import ugettext_lazy as _ +from plinth.forms import ConfigurationForm -class TransmissionForm(forms.Form): # pylint: disable=W0232 - """Transmission configuration form""" - enabled = forms.BooleanField( - label=_('Enable Transmission daemon'), - required=False) +class TransmissionForm(ConfigurationForm): # pylint: disable=W0232 + """Transmission configuration form""" download_dir = forms.CharField( label=_('Download directory'), help_text=_('Directory where downloads are saved. If you change the \ diff --git a/plinth/modules/transmission/urls.py b/plinth/modules/transmission/urls.py index e3ff718f3..3ab28942f 100644 --- a/plinth/modules/transmission/urls.py +++ b/plinth/modules/transmission/urls.py @@ -21,9 +21,10 @@ from django.conf.urls import url -from . import views +from .views import ConfigurationView urlpatterns = [ - url(r'^apps/transmission/$', views.index, name='index'), + url(r'^apps/transmission/$', + ConfigurationView.as_view(module_name='transmission'), name='index'), ] diff --git a/plinth/modules/transmission/views.py b/plinth/modules/transmission/views.py index c65c81013..72e520b91 100644 --- a/plinth/modules/transmission/views.py +++ b/plinth/modules/transmission/views.py @@ -20,81 +20,37 @@ """ from django.contrib import messages -from django.template.response import TemplateResponse from django.utils.translation import ugettext as _ import json import logging -import socket from .forms import TransmissionForm from plinth import actions -from plinth.modules import transmission +from plinth import views logger = logging.getLogger(__name__) -TRANSMISSION_CONFIG = '/etc/transmission-daemon/settings.json' - -def index(request): +class ConfigurationView(views.ConfigurationView): """Serve configuration page.""" - status = get_status() - - form = None - - if request.method == 'POST': - form = TransmissionForm(request.POST, prefix='transmission') - # pylint: disable=E1101 - if form.is_valid(): - _apply_changes(request, status, form.cleaned_data) - status = get_status() - form = TransmissionForm(initial=status, prefix='transmission') - else: - form = TransmissionForm(initial=status, prefix='transmission') - - return TemplateResponse(request, 'transmission.html', - {'title': transmission.title, - 'description': transmission.description, - 'status': status, - 'form': form}) - - -def get_status(): - """Get the current settings from Transmission server.""" - configuration = open(TRANSMISSION_CONFIG, 'r').read() - status = json.loads(configuration) - status = {key.translate(str.maketrans({'-': '_'})): value - for key, value in status.items()} - status['enabled'] = transmission.is_enabled() - status['is_running'] = transmission.is_running() - status['hostname'] = socket.gethostname() - - return status - - -def _apply_changes(request, old_status, new_status): - """Apply the changes""" - modified = False - - if old_status['enabled'] != new_status['enabled']: - sub_command = 'enable' if new_status['enabled'] else 'disable' - actions.superuser_run('transmission', [sub_command]) - transmission.service.notify_enabled(None, new_status['enabled']) - modified = True - - if old_status['download_dir'] != new_status['download_dir'] or \ - old_status['rpc_username'] != new_status['rpc_username'] or \ - old_status['rpc_password'] != new_status['rpc_password']: - new_configuration = { - 'download-dir': new_status['download_dir'], - 'rpc-username': new_status['rpc_username'], - 'rpc-password': new_status['rpc_password'], - } - - actions.superuser_run('transmission', ['merge-configuration'], - input=json.dumps(new_configuration).encode()) - modified = True - - if modified: - messages.success(request, _('Configuration updated')) - else: - messages.info(request, _('Setting unchanged')) + form_class = TransmissionForm + + def apply_changes(self, old_status, new_status): + """Apply the changes submitted in the form.""" + modified = super().apply_changes(old_status, new_status) + + if old_status['download_dir'] != new_status['download_dir'] or \ + old_status['rpc_username'] != new_status['rpc_username'] or \ + old_status['rpc_password'] != new_status['rpc_password']: + new_configuration = { + 'download-dir': new_status['download_dir'], + 'rpc-username': new_status['rpc_username'], + 'rpc-password': new_status['rpc_password'], + } + + actions.superuser_run('transmission', ['merge-configuration'], + input=json.dumps(new_configuration).encode()) + messages.success(self.request, _('Configuration updated')) + return True + + return modified From d31de69d36353e45e4b79e54256f8337971286f0 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sun, 28 Feb 2016 18:51:11 +0530 Subject: [PATCH 155/189] datetime: Use common view for configuration --- plinth/modules/datetime/__init__.py | 13 +++++ plinth/modules/datetime/urls.py | 6 +- plinth/modules/datetime/views.py | 89 ++++++++++------------------- 3 files changed, 46 insertions(+), 62 deletions(-) diff --git a/plinth/modules/datetime/__init__.py b/plinth/modules/datetime/__init__.py index 0c200169a..b82a92169 100644 --- a/plinth/modules/datetime/__init__.py +++ b/plinth/modules/datetime/__init__.py @@ -59,6 +59,19 @@ def setup(helper, old_version=None): helper.call('post', service.notify_enabled, None, True) +def get_status(): + """Get the current settings from server.""" + return {'enabled': is_enabled(), + 'is_running': is_running(), + 'time_zone': get_current_time_zone()} + + +def get_current_time_zone(): + """Get current time zone.""" + time_zone = open('/etc/timezone').read().rstrip() + return time_zone or 'none' + + def is_enabled(): """Return whether the module is enabled.""" return action_utils.service_is_enabled('ntp') diff --git a/plinth/modules/datetime/urls.py b/plinth/modules/datetime/urls.py index 080e3e103..8840eb403 100644 --- a/plinth/modules/datetime/urls.py +++ b/plinth/modules/datetime/urls.py @@ -21,8 +21,10 @@ from django.conf.urls import url -from . import views +from .views import ConfigurationView + urlpatterns = [ - url(r'^sys/datetime/$', views.index, name='index'), + url(r'^sys/datetime/$', ConfigurationView.as_view(module_name='datetime'), + name='index'), ] diff --git a/plinth/modules/datetime/views.py b/plinth/modules/datetime/views.py index f687e1506..cb2ac9a90 100644 --- a/plinth/modules/datetime/views.py +++ b/plinth/modules/datetime/views.py @@ -20,74 +20,43 @@ """ from django.contrib import messages -from django.template.response import TemplateResponse from django.utils.translation import ugettext as _ import logging from .forms import DateTimeForm from plinth import actions +from plinth import views from plinth.modules import datetime logger = logging.getLogger(__name__) -def index(request): +class ConfigurationView(views.ConfigurationView): """Serve configuration page.""" - status = get_status() - - form = None - - if request.method == 'POST': - form = DateTimeForm(request.POST, prefix='datetime') - # pylint: disable=E1101 - if form.is_valid(): - _apply_changes(request, status, form.cleaned_data) - status = get_status() - form = DateTimeForm(initial=status, prefix='datetime') - else: - form = DateTimeForm(initial=status, prefix='datetime') - - return TemplateResponse(request, 'datetime.html', - {'title': datetime.title, - 'description': datetime.description, - 'status': status, - 'form': form}) - - -def get_status(): - """Get the current settings from server.""" - return {'enabled': datetime.is_enabled(), - 'is_running': datetime.is_running(), - 'time_zone': get_current_time_zone()} - - -def get_current_time_zone(): - """Get current time zone.""" - time_zone = open('/etc/timezone').read().rstrip() - return time_zone or 'none' - - -def _apply_changes(request, old_status, new_status): - """Apply the changes.""" - modified = False - - if old_status['enabled'] != new_status['enabled']: - sub_command = 'enable' if new_status['enabled'] else 'disable' - modified = True - actions.superuser_run('datetime', [sub_command]) - datetime.service.notify_enabled(None, new_status['enabled']) - messages.success(request, _('Configuration updated')) - - if old_status['time_zone'] != new_status['time_zone'] and \ - new_status['time_zone'] != 'none': - modified = True - try: - actions.superuser_run('timezone-change', [new_status['time_zone']]) - except Exception as exception: - messages.error(request, _('Error setting time zone: {exception}') - .format(exception=exception)) - else: - messages.success(request, _('Time zone set')) - - if not modified: - messages.info(request, _('Setting unchanged')) + form_class = DateTimeForm + + def apply_changes(self, old_status, new_status): + """Apply the changes.""" + modified = False + + if old_status['enabled'] != new_status['enabled']: + sub_command = 'enable' if new_status['enabled'] else 'disable' + modified = True + actions.superuser_run('datetime', [sub_command]) + datetime.service.notify_enabled(None, new_status['enabled']) + messages.success(self.request, _('Configuration updated')) + + if old_status['time_zone'] != new_status['time_zone'] and \ + new_status['time_zone'] != 'none': + modified = True + try: + actions.superuser_run( + 'timezone-change', [new_status['time_zone']]) + except Exception as exception: + messages.error( + self.request, _('Error setting time zone: {exception}') + .format(exception=exception)) + else: + messages.success(self.request, _('Time zone set')) + + return modified From a0e676c51cb209b7d8f92ef3ed7c9aa898b05721 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sun, 28 Feb 2016 18:58:58 +0530 Subject: [PATCH 156/189] ikiwiki: Use common view for configuration --- plinth/modules/ikiwiki/__init__.py | 12 +++++++ plinth/modules/ikiwiki/forms.py | 7 ----- plinth/modules/ikiwiki/urls.py | 3 +- plinth/modules/ikiwiki/views.py | 50 +++++------------------------- 4 files changed, 22 insertions(+), 50 deletions(-) diff --git a/plinth/modules/ikiwiki/__init__.py b/plinth/modules/ikiwiki/__init__.py index 05f105743..f6bc67ce3 100644 --- a/plinth/modules/ikiwiki/__init__.py +++ b/plinth/modules/ikiwiki/__init__.py @@ -65,11 +65,23 @@ def setup(helper, old_version=None): helper.call('post', service.notify_enabled, None, True) +def get_status(): + """Get the current setting.""" + return {'enabled': is_enabled()} + + def is_enabled(): """Return whether the module is enabled.""" return action_utils.webserver_is_enabled('ikiwiki-plinth') +def enable(should_enable): + """Enable/disable the module.""" + sub_command = 'enable' if should_enable else 'disable' + actions.superuser_run('ikiwiki', [sub_command]) + service.notify_enabled(None, should_enable) + + def diagnose(): """Run diagnostics and return the results.""" results = [] diff --git a/plinth/modules/ikiwiki/forms.py b/plinth/modules/ikiwiki/forms.py index 11d3c8020..a5c4a7f27 100644 --- a/plinth/modules/ikiwiki/forms.py +++ b/plinth/modules/ikiwiki/forms.py @@ -23,13 +23,6 @@ from django.utils.translation import ugettext_lazy as _ -class IkiwikiForm(forms.Form): - """ikiwiki configuration form.""" - enabled = forms.BooleanField( - label=_('Enable ikiwiki'), - required=False) - - class IkiwikiCreateForm(forms.Form): """Form to create a wiki or blog.""" site_type = forms.ChoiceField( diff --git a/plinth/modules/ikiwiki/urls.py b/plinth/modules/ikiwiki/urls.py index 59bf30236..65854ae88 100644 --- a/plinth/modules/ikiwiki/urls.py +++ b/plinth/modules/ikiwiki/urls.py @@ -25,7 +25,8 @@ urlpatterns = [ - url(r'^apps/ikiwiki/$', views.index, name='index'), + url(r'^apps/ikiwiki/$', + views.ConfigurationView.as_view(module_name='ikiwiki'), name='index'), url(r'^apps/ikiwiki/manage/$', views.manage, name='manage'), url(r'^apps/ikiwiki/(?P[\w.@+-]+)/delete/$', views.delete, name='delete'), diff --git a/plinth/modules/ikiwiki/views.py b/plinth/modules/ikiwiki/views.py index 27c1a855a..df806bdb6 100644 --- a/plinth/modules/ikiwiki/views.py +++ b/plinth/modules/ikiwiki/views.py @@ -25,9 +25,9 @@ from django.template.response import TemplateResponse from django.utils.translation import ugettext as _, ugettext_lazy -from .forms import IkiwikiForm, IkiwikiCreateForm +from .forms import IkiwikiCreateForm from plinth import actions -from plinth.modules import ikiwiki +from plinth import views subsubmenu = [{'url': reverse_lazy('ikiwiki:index'), @@ -38,48 +38,14 @@ 'text': ugettext_lazy('Create')}] -def index(request): +class ConfigurationView(views.ConfigurationView): """Serve configuration page.""" - status = get_status() + def get_context_data(self, **kwargs): + """Return the context data for rendering the template view.""" + if 'subsubmenu' not in kwargs: + kwargs['subsubmenu'] = subsubmenu - form = None - - if request.method == 'POST': - form = IkiwikiForm(request.POST, prefix='ikiwiki') - if form.is_valid(): - _apply_changes(request, status, form.cleaned_data) - status = get_status() - form = IkiwikiForm(initial=status, prefix='ikiwiki') - else: - form = IkiwikiForm(initial=status, prefix='ikiwiki') - - return TemplateResponse(request, 'ikiwiki.html', - {'title': ikiwiki.title, - 'description': ikiwiki.description, - 'status': status, - 'form': form, - 'subsubmenu': subsubmenu}) - - -def get_status(): - """Get the current setting.""" - return {'enabled': ikiwiki.is_enabled()} - - -def _apply_changes(request, old_status, new_status): - """Apply the changes.""" - modified = False - - if old_status['enabled'] != new_status['enabled']: - sub_command = 'enable' if new_status['enabled'] else 'disable' - actions.superuser_run('ikiwiki', [sub_command]) - ikiwiki.service.notify_enabled(None, new_status['enabled']) - modified = True - - if modified: - messages.success(request, _('Configuration updated')) - else: - messages.info(request, _('Setting unchanged')) + return super().get_context_data(**kwargs) def manage(request): From 711892486e6625b043dc485e49b39c3263d49433 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sun, 28 Feb 2016 19:17:26 +0530 Subject: [PATCH 157/189] upgrades: Use common view for configuration --- plinth/modules/upgrades/__init__.py | 17 ++++++ plinth/modules/upgrades/urls.py | 3 +- plinth/modules/upgrades/views.py | 87 ++++++++++++----------------- 3 files changed, 55 insertions(+), 52 deletions(-) diff --git a/plinth/modules/upgrades/__init__.py b/plinth/modules/upgrades/__init__.py index 1f58ad821..e8e84ac38 100644 --- a/plinth/modules/upgrades/__init__.py +++ b/plinth/modules/upgrades/__init__.py @@ -50,3 +50,20 @@ def setup(helper, old_version=None): """Install and configure the module.""" helper.install(['unattended-upgrades']) helper.call('post', actions.superuser_run, 'upgrades', ['enable-auto']) + + +def get_status(): + """Return the current status.""" + return {'auto_upgrades_enabled': 'is_enabled'} + + +def is_enabled(): + """Return whether the module is enabled.""" + output = actions.run('upgrades', ['check-auto']) + return 'True' in output.split() + + +def enable(should_enable): + """Enable/disable the module.""" + option = 'enable-auto' if should_enable else 'disable-auto' + actions.superuser_run('upgrades', [option]) diff --git a/plinth/modules/upgrades/urls.py b/plinth/modules/upgrades/urls.py index 9457c17dc..eba0e70b8 100644 --- a/plinth/modules/upgrades/urls.py +++ b/plinth/modules/upgrades/urls.py @@ -25,6 +25,7 @@ urlpatterns = [ - url(r'^sys/upgrades/$', views.index, name='index'), + url(r'^sys/upgrades/$', + views.ConfigurationView.as_view(module_name='upgrades'), name='index'), url(r'^sys/upgrades/upgrade/$', views.upgrade, name='upgrade'), ] diff --git a/plinth/modules/upgrades/views.py b/plinth/modules/upgrades/views.py index 81b0a4ba3..37b63bc82 100644 --- a/plinth/modules/upgrades/views.py +++ b/plinth/modules/upgrades/views.py @@ -27,6 +27,7 @@ from .forms import ConfigureForm from plinth import actions +from plinth import views from plinth.errors import ActionError from plinth.modules import upgrades @@ -39,26 +40,43 @@ LOCK_FILE = '/var/log/dpkg/lock' -def index(request): - """Serve the configuration form.""" - status = get_status() +class ConfigurationView(views.ConfigurationView): + """Serve configuration page.""" + form_class = ConfigureForm - form = None + def get_context_data(self, **kwargs): + """Return the context data for rendering the template view.""" + if 'subsubmenu' not in kwargs: + kwargs['subsubmenu'] = subsubmenu - if request.method == 'POST': - form = ConfigureForm(request.POST, prefix='upgrades') - if form.is_valid(): - _apply_changes(request, status, form.cleaned_data) - status = get_status() - form = ConfigureForm(initial=status, prefix='upgrades') - else: - form = ConfigureForm(initial=status, prefix='upgrades') - - return TemplateResponse(request, 'upgrades_configure.html', - {'title': upgrades.title, - 'description': upgrades.description, - 'form': form, - 'subsubmenu': subsubmenu}) + return super().get_context_data(**kwargs) + + def get_template_names(self): + """Return the list of template names for the view.""" + return ['upgrades_configure.html'] + + def apply_changes(self, old_status, new_status): + """Apply the form changes.""" + if old_status['auto_upgrades_enabled'] \ + == new_status['auto_upgrades_enabled']: + return False + + try: + upgrades.enable(new_status['auto_upgrades_enabled']) + except ActionError as exception: + error = exception.args[2] + messages.error( + self.request, + _('Error when configuring unattended-upgrades: {error}') + .format(error=error)) + return True + + if new_status['auto_upgrades_enabled']: + messages.success(self.request, _('Automatic upgrades enabled')) + else: + messages.success(self.request, _('Automatic upgrades disabled')) + + return True def is_package_manager_busy(): @@ -97,36 +115,3 @@ def upgrade(request): 'subsubmenu': subsubmenu, 'is_busy': is_busy, 'log': get_log()}) - - -def get_status(): - """Return the current status.""" - output = actions.run('upgrades', ['check-auto']) - return {'auto_upgrades_enabled': 'True' in output.split()} - - -def _apply_changes(request, old_status, new_status): - """Apply the form changes.""" - if old_status['auto_upgrades_enabled'] \ - == new_status['auto_upgrades_enabled']: - messages.info(request, _('Setting unchanged')) - return - - if new_status['auto_upgrades_enabled']: - option = 'enable-auto' - else: - option = 'disable-auto' - - try: - actions.superuser_run('upgrades', [option]) - except ActionError as exception: - error = exception.args[2] - messages.error( - request, _('Error when configuring unattended-upgrades: {error}') - .format(error=error)) - return - - if option == 'enable-auto': - messages.success(request, _('Automatic upgrades enabled')) - else: - messages.success(request, _('Automatic upgrades disabled')) From f04e1c1657ef22aa9cb203cae66e531fafc41013 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sun, 28 Feb 2016 19:27:49 +0530 Subject: [PATCH 158/189] Minor PEP8 & spelling fixes in various modules --- plinth/modules/apps/apps.py | 4 ++-- plinth/modules/config/config.py | 2 +- plinth/modules/firewall/views.py | 2 +- plinth/modules/help/help.py | 1 - plinth/modules/openvpn/views.py | 2 +- plinth/modules/tor/views.py | 2 +- plinth/modules/users/__init__.py | 2 -- 7 files changed, 6 insertions(+), 9 deletions(-) diff --git a/plinth/modules/apps/apps.py b/plinth/modules/apps/apps.py index 39c77c43f..9d90af549 100644 --- a/plinth/modules/apps/apps.py +++ b/plinth/modules/apps/apps.py @@ -23,8 +23,8 @@ def init(): """Initailize the apps module""" - cfg.main_menu.add_urlname(_('Apps'), 'glyphicon-download-alt', 'apps:index', - 80) + cfg.main_menu.add_urlname(_('Apps'), 'glyphicon-download-alt', + 'apps:index', 80) def index(request): diff --git a/plinth/modules/config/config.py b/plinth/modules/config/config.py index 4957589bd..8f75bca2a 100644 --- a/plinth/modules/config/config.py +++ b/plinth/modules/config/config.py @@ -226,7 +226,7 @@ def _apply_changes(request, old_status, new_status): request.session[translation.LANGUAGE_SESSION_KEY] = language except Exception as exception: messages.error(request, _('Error setting language: {exception}') - .format(exception=exception)) + .format(exception=exception)) else: messages.success(request, _('Language changed')) diff --git a/plinth/modules/firewall/views.py b/plinth/modules/firewall/views.py index 3dab988ab..8ed984741 100644 --- a/plinth/modules/firewall/views.py +++ b/plinth/modules/firewall/views.py @@ -26,7 +26,7 @@ def index(request): - """Serve introcution page""" + """Serve introduction page""" if not firewall.get_enabled_status(): return TemplateResponse(request, 'firewall.html', {'title': firewall.title, diff --git a/plinth/modules/help/help.py b/plinth/modules/help/help.py index 0f8aa3f52..1db714089 100644 --- a/plinth/modules/help/help.py +++ b/plinth/modules/help/help.py @@ -20,7 +20,6 @@ """ import os -from gettext import gettext as _ from django.http import Http404 from django.template.response import TemplateResponse from django.utils.translation import ugettext as _, ugettext_lazy diff --git a/plinth/modules/openvpn/views.py b/plinth/modules/openvpn/views.py index ea1c6aefa..ea460589c 100644 --- a/plinth/modules/openvpn/views.py +++ b/plinth/modules/openvpn/views.py @@ -116,7 +116,7 @@ def _collect_setup_result(request): return_code = setup_process.poll() # Setup process is not complete yet - if return_code == None: + if return_code is None: return if not return_code: diff --git a/plinth/modules/tor/views.py b/plinth/modules/tor/views.py index 58e513a1f..d041c7155 100644 --- a/plinth/modules/tor/views.py +++ b/plinth/modules/tor/views.py @@ -108,7 +108,7 @@ def _collect_config_result(request): return_code = config_process.poll() # Config process is not complete yet - if return_code == None: + if return_code is None: return status = tor.get_status() diff --git a/plinth/modules/users/__init__.py b/plinth/modules/users/__init__.py index b7c6c8ca1..62bb174bc 100644 --- a/plinth/modules/users/__init__.py +++ b/plinth/modules/users/__init__.py @@ -67,5 +67,3 @@ def _diagnose_ldap_entry(search_item): return [_('Check LDAP entry "{search_item}"') .format(search_item=search_item), result] - - From 2078e209d111c2c68682a61e911cdb02a2af4548 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sun, 28 Feb 2016 19:54:24 +0530 Subject: [PATCH 159/189] views: Minor adjustment to module load order --- plinth/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plinth/views.py b/plinth/views.py index 47f7518c8..669506d0c 100644 --- a/plinth/views.py +++ b/plinth/views.py @@ -29,7 +29,7 @@ import time from . import forms -from . import module_loader +import plinth def index(request): @@ -57,7 +57,7 @@ def get_module_name(self): def get_module(self): """Return the module associated with the view.""" - return module_loader.loaded_modules[self.get_module_name()] + return plinth.module_loader.loaded_modules[self.get_module_name()] def get_initial(self): """Return the status of the module to fill in the form.""" From 49e59ce83dcec4e7f60e530241cd0586e5987bbb Mon Sep 17 00:00:00 2001 From: "Luis A. Arizmendi" Date: Wed, 2 Mar 2016 20:06:09 +0100 Subject: [PATCH 160/189] Translated using Weblate (Spanish) Currently translated at 16.8% (96 of 569 strings) --- plinth/locale/es/LC_MESSAGES/django.po | 266 ++++++++++++++++--------- 1 file changed, 176 insertions(+), 90 deletions(-) diff --git a/plinth/locale/es/LC_MESSAGES/django.po b/plinth/locale/es/LC_MESSAGES/django.po index 05cb7ca73..8f8e0a930 100644 --- a/plinth/locale/es/LC_MESSAGES/django.po +++ b/plinth/locale/es/LC_MESSAGES/django.po @@ -3,30 +3,31 @@ # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # -#, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-01-31 22:19+0530\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" +"PO-Revision-Date: 2016-03-02 20:06+0000\n" +"Last-Translator: Luis A. Arizmendi \n" +"Language-Team: Spanish " +"\n" +"Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 2.5-dev\n" #: plinth/action_utils.py:203 #, python-brace-format msgid "Listening on {kind} port {listen_address}:{port}" -msgstr "" +msgstr "Escuchando en puerto {listen_address}:{port} {kind}" #: plinth/action_utils.py:206 #, python-brace-format msgid "Listening on {kind} port {port}" -msgstr "" +msgstr "Escuchando en el puerto {port} {kind}" #: plinth/action_utils.py:287 #, python-brace-format @@ -41,28 +42,30 @@ msgstr "" #: plinth/action_utils.py:321 #, python-brace-format msgid "Connect to {host}:{port}" -msgstr "" +msgstr "Conectar a {host}:{port}" #: plinth/action_utils.py:324 -#, python-brace-format +#, fuzzy, python-brace-format msgid "Cannot connect to {host}:{port}" -msgstr "" +msgstr "No se pudo conectar a {host}:{port}" #: plinth/context_processors.py:36 +#, fuzzy msgid "FreedomBox" -msgstr "" +msgstr "FreedomBox" #: plinth/modules/apps/apps.py:26 +#, fuzzy msgid "Apps" -msgstr "" +msgstr "Apps" #: plinth/modules/apps/apps.py:32 plinth/templates/base.html.py:93 msgid "Applications" -msgstr "" +msgstr "Aplicaciones" #: plinth/modules/apps/templates/apps.html:25 msgid "Services and Applications" -msgstr "" +msgstr "Servicios y aplicaciones" #: plinth/modules/apps/templates/apps.html:28 #, python-format @@ -71,24 +74,33 @@ msgid "" "%(box_name)s. Click on any app page link on the left to read a description " "of the application and choose to install it." msgstr "" +"Puede instalar y ejecutar distintos servicios en su %(box_name)s. Haga clic " +"en los enlaces del panel izquierdo para obtener una descripción de la " +"aplicación y decidir si la instala." #: plinth/modules/apps/templates/apps.html:36 +#, fuzzy msgid "" "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!" msgstr "" +"Puede usar FreedomBox para compartir sus fotos, como su servicio de " +"mensajería instantánea o su propia red social o servicio de noticias. ¿" +"Recuerda los portales web? También puede disponer de uno propio. Muchos de " +"los servicios que hoy usa en Internet puede tenerlos ¡en su propio " +"dispositivo y bajo su control!" #: plinth/modules/avahi/__init__.py:40 plinth/modules/avahi/__init__.py:45 #: plinth/modules/avahi/templates/avahi.html:26 #: plinth/modules/avahi/views.py:53 msgid "Service Discovery" -msgstr "" +msgstr "Detección de servicios" #: plinth/modules/avahi/forms.py:29 msgid "Enable service discovery" -msgstr "" +msgstr "Activar detección de servicios" #: plinth/modules/avahi/templates/avahi.html:29 #, python-format @@ -100,6 +112,12 @@ msgid "" "disabled to improve security especially when connecting to a hostile local " "network." msgstr "" +"La detección de servicios permite a otros dispositivos de la red detectar su " +"%(box_name)s y los servicios que ejecuta, al tiempo que permite a su " +"%(box_name)s detectar otros dispositivos y servicios en su red local. " +"Funciona solo en la red local y no es un servicio indispensable, puede ser " +"desactivado para incrementar la seguridad especialmente cuando se conecta a " +"redes locales inseguras o de poca confianza." #: plinth/modules/avahi/templates/avahi.html:40 #: plinth/modules/datetime/templates/datetime.html:35 @@ -116,15 +134,15 @@ msgstr "" #: plinth/modules/transmission/templates/transmission.html:42 #: plinth/modules/xmpp/templates/xmpp.html:58 msgid "Status" -msgstr "" +msgstr "Estatus" #: plinth/modules/avahi/templates/avahi.html:45 msgid "Service discovery server is running" -msgstr "" +msgstr "El servidor de detección de servicios se está ejecutando" #: plinth/modules/avahi/templates/avahi.html:48 msgid "Service discovery server is not running" -msgstr "" +msgstr "El servidor de detección de servicios no se está ejecutando" #: plinth/modules/avahi/templates/avahi.html:52 #: plinth/modules/datetime/templates/datetime.html:48 @@ -142,7 +160,7 @@ msgstr "" #: plinth/modules/transmission/templates/transmission.html:56 #: plinth/modules/xmpp/templates/xmpp.html:72 msgid "Configuration" -msgstr "" +msgstr "Configuración" #: plinth/modules/avahi/templates/avahi.html:60 #: plinth/modules/datetime/templates/datetime.html:56 @@ -175,7 +193,7 @@ msgstr "" #: plinth/modules/shaarli/views.py:74 plinth/modules/transmission/views.py:109 #: plinth/modules/xmpp/views.py:100 msgid "Configuration updated" -msgstr "" +msgstr "Configuración actualizada" #: plinth/modules/avahi/views.py:76 plinth/modules/datetime/views.py:99 #: plinth/modules/deluge/views.py:82 plinth/modules/ikiwiki/views.py:97 @@ -192,11 +210,11 @@ msgstr "" #: plinth/modules/config/config.py:84 plinth/modules/config/config.py:121 #: plinth/modules/dynamicdns/dynamicdns.py:148 msgid "Invalid domain name" -msgstr "" +msgstr "Nombre de dominio no válido" #: plinth/modules/config/config.py:95 msgid "Hostname" -msgstr "" +msgstr "Hostname" #: plinth/modules/config/config.py:97 #, python-brace-format @@ -206,6 +224,10 @@ msgid "" "and have as interior characters only alphabets, digits and hyphens. Total " "length must be 63 characters or less." msgstr "" +"Hostname es el nombre por el que su {box_name} puede ser identificado en la " +"red local. Debe empezar y terminar por una letra o un número y solo puede " +"contener letras, números y guiones. Su longitud puede ser de hasta 63 " +"caracteres." #: plinth/modules/config/config.py:105 msgid "Invalid hostname" @@ -215,7 +237,7 @@ msgstr "" #: plinth/modules/config/config.py:265 #: plinth/modules/dynamicdns/dynamicdns.py:143 msgid "Domain Name" -msgstr "" +msgstr "Nombre de dominio" #: plinth/modules/config/config.py:110 #, python-brace-format @@ -227,114 +249,126 @@ msgid "" "63 characters or less. Total length of domain name must be 253 characters " "or less." msgstr "" +"El nombre de dominio el el nombre global por el que otros dispositivos " +"pueden identificar su {box_name} en Internet. Se compone de varias palabras " +"separadas por puntos de forma que cada palabra debe empezar y terminar por " +"una letra o un número y puede contener solo letras, números o guiones. La " +"longitud de cada palabra puede ser de hasta 63 caracteres y la del nombre de " +"dominio de hasta 253." #: plinth/modules/config/config.py:125 msgid "Language" -msgstr "" +msgstr "Idioma" #: plinth/modules/config/config.py:127 msgid "Language for this web administration interface" -msgstr "" +msgstr "Idioma para la interfaz de administración web" #: plinth/modules/config/config.py:135 #: plinth/modules/dynamicdns/dynamicdns.py:37 #: plinth/modules/ikiwiki/views.py:36 msgid "Configure" -msgstr "" +msgstr "Configurar" #: plinth/modules/config/config.py:176 msgid "General Configuration" -msgstr "" +msgstr "Configuración general" #: plinth/modules/config/config.py:193 -#, python-brace-format +#, fuzzy, python-brace-format msgid "Error setting hostname: {exception}" -msgstr "" +msgstr "Error al definir el hostname: {exception}" #: plinth/modules/config/config.py:196 +#, fuzzy msgid "Hostname set" -msgstr "" +msgstr "Asignar hostname" #: plinth/modules/config/config.py:202 #, python-brace-format msgid "Error setting domain name: {exception}" -msgstr "" +msgstr "Error al establecer nombre de dominio: {exception}" #: plinth/modules/config/config.py:205 msgid "Domain name set" -msgstr "" +msgstr "Asignar nombre de dominio" #: plinth/modules/config/config.py:213 #, python-brace-format msgid "Error setting language: {exception}" -msgstr "" +msgstr "Error al establecer idioma: {exception}" #: plinth/modules/config/config.py:216 msgid "Language changed" -msgstr "" +msgstr "Idioma cambiado" #: plinth/modules/config/templates/config.html:32 msgid "Submit" -msgstr "" +msgstr "Enviar" #: plinth/modules/datetime/__init__.py:39 #: plinth/modules/datetime/templates/datetime.html:26 #: plinth/modules/datetime/views.py:58 msgid "Date & Time" -msgstr "" +msgstr "Fecha y hora" #: plinth/modules/datetime/__init__.py:44 msgid "Network Time Server" -msgstr "" +msgstr "Servidor NTP" #: plinth/modules/datetime/__init__.py:76 msgid "NTP client in contact with servers" -msgstr "" +msgstr "Cliente NTP conectado con servidores" #: plinth/modules/datetime/forms.py:31 msgid "Enable network time" -msgstr "" +msgstr "Activar NTP" #: plinth/modules/datetime/forms.py:35 msgid "Time Zone" -msgstr "" +msgstr "Zona horaria" #: plinth/modules/datetime/forms.py:36 msgid "" "Set your time zone to get accurate timestamps. This will set the systemwide " "time zone." msgstr "" +"Defina su zona horaria para obtener marcas de tiempo correctas. Se " +"establecerá la zona horaria en todo el sistema." #: plinth/modules/datetime/forms.py:47 msgid "-- no time zone set --" -msgstr "" +msgstr "-- Zona horaria no definida --" #: plinth/modules/datetime/templates/datetime.html:29 msgid "" "Network time server is a program that maintians the system time in " "synchronization with servers on the Internet." msgstr "" +"El servicio NTP mantiene el sistema en hora sincronizándolo con servidores " +"de Internet." #: plinth/modules/datetime/templates/datetime.html:40 msgid "Network time server is running" -msgstr "" +msgstr "El servicio NTP se está ejecutando" #: plinth/modules/datetime/templates/datetime.html:43 msgid "Network time server is not running" -msgstr "" +msgstr "El servicio NTP no se está ejecutando" #: plinth/modules/datetime/views.py:93 #, python-brace-format msgid "Error setting time zone: {exception}" -msgstr "" +msgstr "Error al definir zona horaria: {exception}" #: plinth/modules/datetime/views.py:96 msgid "Time zone set" -msgstr "" +msgstr "Zona horaria asignada" #: plinth/modules/deluge/__init__.py:38 plinth/modules/deluge/views.py:56 +#, fuzzy msgid "BitTorrent (Deluge)" -msgstr "" +msgstr "BitTorrent (Deluge)" #: plinth/modules/deluge/__init__.py:43 msgid "Deluge BitTorrent" @@ -342,11 +376,11 @@ msgstr "" #: plinth/modules/deluge/forms.py:29 msgid "Enable Deluge" -msgstr "" +msgstr "Activar Deluge" #: plinth/modules/deluge/templates/deluge.html:26 msgid "BitTorrent Web Client (Deluge)" -msgstr "" +msgstr "Cliente web de BitTorren (Deluge)" #: plinth/modules/deluge/templates/deluge.html:28 msgid "Deluge is a BitTorrent client that features a Web UI." @@ -358,80 +392,87 @@ msgid "" "\">/deluge path on the web server. The default password is 'deluge', but " "you should log in and change it immediately after enabling this service." msgstr "" +"Cuando se activa, el cliente web Deluge está disponible en la dirección /deluge de su servidor web. La clave de acceso por " +"defecto es 'deluge' pero es muy recomendable que nada más activar el " +"servicio acceda al mismo y la cambie." #: plinth/modules/deluge/templates/deluge.html:44 msgid "deluge-web is running" -msgstr "" +msgstr "deluge-web se está ejecutando" #: plinth/modules/deluge/templates/deluge.html:47 msgid "deluge-web is not running" -msgstr "" +msgstr "deluge-web no se está ejecutando" #: plinth/modules/diagnostics/diagnostics.py:45 msgid "Diagnostics" -msgstr "" +msgstr "Diagnósticos" #: plinth/modules/diagnostics/diagnostics.py:55 msgid "System Diagnostics" -msgstr "" +msgstr "Diagnósticos del sistema" #: plinth/modules/diagnostics/diagnostics.py:78 msgid "Diagnostic Test" -msgstr "" +msgstr "Test de diagnóstico" #: plinth/modules/diagnostics/templates/diagnostics.html:37 msgid "" "The system diagnostic test will run a number of checks on your system to " "confirm that applications and services are working as expected." msgstr "" +"El test de diagnóstico del sistema ejecuta una serie de comprobaciones para " +"confirmar que las aplicaciones y servicios están funcionando como se espera." #: plinth/modules/diagnostics/templates/diagnostics.html:50 #: plinth/modules/diagnostics/templates/diagnostics_button.html:27 msgid "Run Diagnostics" -msgstr "" +msgstr "Ejecutar diagnósticos" #: plinth/modules/diagnostics/templates/diagnostics.html:53 msgid "Diagnotics test is currently running" -msgstr "" +msgstr "El test de diagnósticos está ejecutándose" #: plinth/modules/diagnostics/templates/diagnostics.html:66 msgid "Results" -msgstr "" +msgstr "Resultados" #: plinth/modules/diagnostics/templates/diagnostics.html:74 #, python-format msgid "Module: %(module)s" -msgstr "" +msgstr "Módulo: %(module)s" #: plinth/modules/diagnostics/templates/diagnostics_module.html:25 msgid "Diagnostic Results" -msgstr "" +msgstr "Resultado del diagnóstico" #: plinth/modules/diagnostics/templates/diagnostics_module.html:27 #, python-format msgid "Module: %(module_name)s" -msgstr "" +msgstr "Módulo: %(module_name)s" #: plinth/modules/diagnostics/templates/diagnostics_module.html:32 msgid "This module does not support diagnostics" -msgstr "" +msgstr "Este módulo no soporta diagnósticos" #: plinth/modules/diagnostics/templates/diagnostics_results.html:27 +#, fuzzy msgid "Test" -msgstr "" +msgstr "Test" #: plinth/modules/diagnostics/templates/diagnostics_results.html:28 msgid "Result" -msgstr "" +msgstr "Resultado" #: plinth/modules/dynamicdns/dynamicdns.py:35 plinth/modules/help/help.py:40 msgid "About" -msgstr "" +msgstr "Acerca de" #: plinth/modules/dynamicdns/dynamicdns.py:45 #: plinth/modules/dynamicdns/dynamicdns.py:54 msgid "Dynamic DNS" -msgstr "" +msgstr "DNS dinámico" #: plinth/modules/dynamicdns/dynamicdns.py:71 msgid "" @@ -439,6 +480,9 @@ msgid "" "used within the URL. For details see the update URL templates of the example " "providers." msgstr "" +"Las variables <User>, <Pass>, <lp>, <Domain> se " +"pueden usar en la URL. Para más información consulte las plantillas para " +"actualizar URL de los ejemplos incluidos." #: plinth/modules/dynamicdns/dynamicdns.py:75 msgid "" @@ -446,32 +490,40 @@ msgid "" "provider does not support the GnudIP protocol or your provider is not listed " "you may use the update URL of your provider." msgstr "" +"Por favor elija un protocolo según su proveedor. Si su proveedor no soporta " +"el protocolo GnudIP o no aparece en el listado deberá usar la URL de " +"actualización de su proveedor." #: plinth/modules/dynamicdns/dynamicdns.py:80 msgid "" "Please do not enter a URL here (like \"https://example.com/\") but only the " "hostname of the GnuDIP server (like \"example.com\")." msgstr "" +"Por favor no introduzca una URL (\"https://ejemplo.com/\"), solo el nombre " +"de su servidor GnudIP (\"ejemplo.com\")." #: plinth/modules/dynamicdns/dynamicdns.py:84 #, python-brace-format msgid "The public domain name you want use to reach your {box_name}." -msgstr "" +msgstr "Nombre de dominio público para identificar su {box_name}." #: plinth/modules/dynamicdns/dynamicdns.py:87 msgid "Use this option if your provider uses self signed certificates." -msgstr "" +msgstr "Elija esta opción si su proveedor usa certificados autofirmados." #: plinth/modules/dynamicdns/dynamicdns.py:90 msgid "" "If this option is selected, your username and password will be used for HTTP " "basic authentication." msgstr "" +"Si selecciona esta opción su nombre de usuario y clave se emplearán en la " +"autenticación básica de HTTP." #: plinth/modules/dynamicdns/dynamicdns.py:93 msgid "" "Leave this field empty if you want to keep your previous configured password." msgstr "" +"Deje vacío este campo si quiere conservar su clave anteriormente configurada." #: plinth/modules/dynamicdns/dynamicdns.py:96 #, python-brace-format @@ -481,55 +533,61 @@ msgid "" "Internet IP. The URL should simply return the IP where the client comes from " "(example: http://myip.datasystems24.de)." msgstr "" +"Valor opcional. Si su {box_name} no está conectado directamente a Internet (" +"p.e. está conectado a un router NAT), esta URL se usará para averiguar su " +"número IP en Internet. La URL debería devolver simplemente el número IP del " +"cliente (p.e. http://myip.datasystems24.de)." #: plinth/modules/dynamicdns/dynamicdns.py:104 msgid "" "You should have been requested to select a username when you created the " "account." msgstr "" +"Se le debería haber solicitado seleccionar un nombre de usuario al crear la " +"cuenta." #: plinth/modules/dynamicdns/dynamicdns.py:115 msgid "Enable Dynamic DNS" -msgstr "" +msgstr "Activar DNS dinámico" #: plinth/modules/dynamicdns/dynamicdns.py:118 msgid "Service type" -msgstr "" +msgstr "Tipo de servicio" #: plinth/modules/dynamicdns/dynamicdns.py:123 msgid "GnudIP Server Address" -msgstr "" +msgstr "Dirección del servidor GnudIP" #: plinth/modules/dynamicdns/dynamicdns.py:128 msgid "Invalid server name" -msgstr "" +msgstr "Nombre de servidor no válido" #: plinth/modules/dynamicdns/dynamicdns.py:131 msgid "Update URL" -msgstr "" +msgstr "URL de actualización" #: plinth/modules/dynamicdns/dynamicdns.py:135 msgid "Accept all SSL certificates" -msgstr "" +msgstr "Aceptar todos los certificados SSL" #: plinth/modules/dynamicdns/dynamicdns.py:139 msgid "Use HTTP basic authentication" -msgstr "" +msgstr "Usar autenticación básica de HTTP" #: plinth/modules/dynamicdns/dynamicdns.py:151 #: plinth/modules/networks/forms.py:146 plinth/modules/transmission/forms.py:39 msgid "Username" -msgstr "" +msgstr "Nombre de usuario" #: plinth/modules/dynamicdns/dynamicdns.py:154 #: plinth/modules/networks/forms.py:147 plinth/modules/transmission/forms.py:43 msgid "Password" -msgstr "" +msgstr "Clave" #: plinth/modules/dynamicdns/dynamicdns.py:157 #: plinth/modules/networks/forms.py:149 msgid "Show password" -msgstr "" +msgstr "Mostrar clave" #: plinth/modules/dynamicdns/dynamicdns.py:161 msgid "IP check URL" @@ -537,31 +595,31 @@ msgstr "" #: plinth/modules/dynamicdns/dynamicdns.py:187 msgid "Please provide update URL or a GnuDIP Server" -msgstr "" +msgstr "Por favor indique una URL de actualización o un servidor GnudIP" #: plinth/modules/dynamicdns/dynamicdns.py:190 msgid "Please provide GnuDIP username" -msgstr "" +msgstr "Por favor indique un nombre de usuario GnudIP" #: plinth/modules/dynamicdns/dynamicdns.py:193 msgid "Please provide GnuDIP domain" -msgstr "" +msgstr "Por favor indique un dominio GnudIP" #: plinth/modules/dynamicdns/dynamicdns.py:198 msgid "Please provide a password" -msgstr "" +msgstr "Por favor indique una clave" #: plinth/modules/dynamicdns/dynamicdns.py:217 msgid "Configure Dynamic DNS" -msgstr "" +msgstr "Configurar DNS dinámico" #: plinth/modules/dynamicdns/dynamicdns.py:239 msgid "Status of Dynamic DNS" -msgstr "" +msgstr "Estatus del DNS dinámico" #: plinth/modules/dynamicdns/templates/dynamicdns.html:25 msgid "Dynamic DNS Client" -msgstr "" +msgstr "Cliente de DNS dinámico" #: plinth/modules/dynamicdns/templates/dynamicdns.html:28 #, python-format @@ -570,6 +628,9 @@ msgid "" "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 %(box_name)s, such as ownCloud." msgstr "" +"Si su proveedor de Internet cambia su dirección IP periódicamente (p.e. cada " +"24h) será muy difícil para los demás encontrarle en la web y que no les sea " +"posible usar servicios disponibles en su %(box_name)s como ownCloud." #: plinth/modules/dynamicdns/templates/dynamicdns.html:37 msgid "" @@ -580,6 +641,12 @@ msgid "" "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." msgstr "" +"La solución es asignar un nombre DNS a su dirección IP y actualizarlo cada " +"vez que su proveedor de Internet cambie esa dirección. Un DNS dinámico " +"permite enviar su dirección IP a un servidor GnudIP. A " +"continuación el servidor asigna su nombre DNS a esta nueva IP de forma que " +"cualquiera que pida su nombre DNS obtendrá la dirección IP actualizada." #: plinth/modules/dynamicdns/templates/dynamicdns.html:50 msgid "" @@ -589,6 +656,11 @@ msgid "" "based services on " "freedns.afraid.org." msgstr "" +"Si necesita una cuenta libre de DNS dinámico, puede encontrar un servicio " +"GnudIP gratuito en gnudip.datasystems24.net o un servicio basado en URL de " +"actualización en freedns.afraid.org." #: plinth/modules/dynamicdns/templates/dynamicdns.html:61 #, python-format @@ -596,16 +668,22 @@ msgid "" "If your %(box_name)s is connected behind some NAT router, don't forget to " "add port forwarding (i.e. forward some standard ports like 80 and 443)." msgstr "" +"Si su %(box_name)s está conectada a través de un router NAT, no el " +"redireccionamiento (p. e. redireccionar algunos puertos estándar como el 80 " +"y el 443)." #: plinth/modules/dynamicdns/templates/dynamicdns_configure.html:30 msgid "" "You have disabled Javascript. Dynamic form mode is disabled and some helper " "functions may not work (but the main functionality should work)." msgstr "" +"Ha desactivado Javascript. El modo de formulario dinámico está desactivado y " +"algunas funciones de ayuda podrían no funcionar (pero la funcionalidad " +"principal sí debería responder)." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:25 msgid "NAT type" -msgstr "" +msgstr "Tipo NAT" #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:29 msgid "" @@ -615,7 +693,7 @@ msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:35 msgid "Direct connection to the Internet." -msgstr "" +msgstr "Conexión directa a Internet" #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:37 #, python-format @@ -628,13 +706,14 @@ msgstr "" #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:48 msgid "Last update" -msgstr "" +msgstr "Última actualización" #: plinth/modules/firewall/firewall.py:39 #: plinth/modules/firewall/firewall.py:49 #: plinth/modules/firewall/firewall.py:57 +#, fuzzy msgid "Firewall" -msgstr "" +msgstr "Firewall" #: plinth/modules/firewall/templates/firewall.html:28 #, python-format @@ -643,10 +722,13 @@ msgid "" "network traffic on your %(box_name)s. Keeping a firewall enabled and " "properly configured reduces risk of security threat from the Internet." msgstr "" +"Un firewall es un sistema que controla el tráfico de red entrante y saliente " +"de su %(box_name)s. Mantenerlo activado y correctamente configurado reduce " +"el riesgo de amenazas de seguridad desde Internet." #: plinth/modules/firewall/templates/firewall.html:36 msgid "Current status:" -msgstr "" +msgstr "Estado actual:" #: plinth/modules/firewall/templates/firewall.html:41 #, python-format @@ -656,6 +738,10 @@ msgid "" "you may run it using the command 'service firewalld start' or in case of a " "system with systemd 'systemctl start firewalld'." msgstr "" +"El servicio Fireweall no se está ejecutando. Por favor actívelo. El firewall " +"viene activado por defecto en su %(box_name)s. En cualquier sistema basado " +"en Debian (como %(box_name)s) puede activarlo con 'service firewalld start' " +"o si su sistema emplea systemd 'systemctl start firewalld'." #: plinth/modules/firewall/templates/firewall.html:56 msgid "Service/Port" From 22ca61e4c4071bab3a97e91f9d27639756405d79 Mon Sep 17 00:00:00 2001 From: ultrapeer Date: Fri, 4 Mar 2016 22:19:26 +0100 Subject: [PATCH 161/189] Translated using Weblate (French) Currently translated at 82.9% (472 of 569 strings) --- plinth/locale/fr/LC_MESSAGES/django.po | 415 +++++++++++++------------ 1 file changed, 219 insertions(+), 196 deletions(-) diff --git a/plinth/locale/fr/LC_MESSAGES/django.po b/plinth/locale/fr/LC_MESSAGES/django.po index b5a06c429..a16984f90 100644 --- a/plinth/locale/fr/LC_MESSAGES/django.po +++ b/plinth/locale/fr/LC_MESSAGES/django.po @@ -1,7 +1,6 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. -# # Translators: # Philippe Baret , 2015 msgid "" @@ -9,16 +8,16 @@ msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-01-31 22:19+0530\n" -"PO-Revision-Date: 2016-01-15 21:18+0000\n" +"PO-Revision-Date: 2016-03-04 20:33+0100\n" "Last-Translator: Caly \n" -"Language-Team: French \n" +"Language-Team: French " +"\n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 2.5-dev\n" +"X-Generator: Poedit 1.8.6\n" #: plinth/action_utils.py:203 #, python-brace-format @@ -99,7 +98,7 @@ msgid "Enable service discovery" msgstr "Activer la découverte de services" #: plinth/modules/avahi/templates/avahi.html:29 -#, fuzzy, python-format +#, python-format, python-format #| msgid "" #| "Service discovery allows other machines on the network to discover your " #| "FreedomBox and services running on it. It also allows FreedomBox to " @@ -116,11 +115,11 @@ msgid "" "network." msgstr "" "Le service Découverte permet aux autres machines du réseau de découvrir " -"votre FreedomBox et les services qu'il propose. Il permet aussi de découvrir " -"d'autres machines et services opérant sur votre réseau local. Le service " -"Découverte n'est pas essentiel et fonctionne seulement sur les réseaux " -"internes. Il peut être désactiver pour améliorer la sécurité " -"particulièrement lors d'une connexion à un réseau local hostile." +"votre %(box_name)s et les services qu'il propose. Il permet aussi à " +"%(box_name)s de découvrir d'autres machines et services opérant sur votre " +"réseau local. Le service Découverte n'est pas essentiel et fonctionne " +"seulement sur les réseaux internes. Il peut être désactiver pour améliorer " +"la sécurité particulièrement lors d'une connexion à un réseau local hostile." #: plinth/modules/avahi/templates/avahi.html:40 #: plinth/modules/datetime/templates/datetime.html:35 @@ -220,7 +219,7 @@ msgid "Hostname" msgstr "Nom de Machine" #: plinth/modules/config/config.py:97 -#, fuzzy, python-brace-format +#, python-brace-format, python-brace-format #| msgid "" #| "Hostname is the local name by which other machines on the local network " #| "reach your machine. It must start and end with an alphabet or a digit " @@ -233,10 +232,10 @@ msgid "" "length must be 63 characters or less." msgstr "" "Le Nom de Machine est le nom local par lequel les autres machines sur le " -"réseau local atteindront votre machine. Le nom doit débuter et finir par une " -"lettre de l'alphabet ou un chiffre. Il doit contenir entre le début et la " -"fin seulement des lettres de l'alphabet, des chiffres ou des traits d’union " -"« - ». Sa longueur maximum est de 63 signes." +"réseau local atteindront votre {box_name}. Le nom doit débuter et finir par " +"une lettre de l'alphabet ou un chiffre. Il doit contenir entre le début et " +"la fin seulement des lettres de l'alphabet, des chiffres ou des traits d’" +"union « - ». Sa longueur maximum est de 63 signes." #: plinth/modules/config/config.py:105 msgid "Invalid hostname" @@ -249,7 +248,7 @@ msgid "Domain Name" msgstr "Nom de Domaine" #: plinth/modules/config/config.py:110 -#, fuzzy, python-brace-format +#, python-brace-format, python-brace-format #| msgid "" #| "Domain name is the global name by which other machines on the Internet " #| "can reach you. It must consist of labels separated by dots. Each label " @@ -266,7 +265,7 @@ msgid "" "or less." msgstr "" "Le Nom de Domaine est le nom global par lequel les autres machines sur " -"Internet peuvent atteindre votre machine. Le nom ne doit contenir que des " +"Internet peuvent atteindre votre {box_name}. Le nom ne doit contenir que des " "mots ou labels séparés par des points. Chaque label doit débuter et se " "terminer par une lettre de l'alphabet ou un chiffre. Chaque label doit " "contenir entre le début et la fin seulement des lettres de l'alphabet, des " @@ -279,10 +278,9 @@ msgid "Language" msgstr "Langue" #: plinth/modules/config/config.py:127 -#, fuzzy #| msgid "Language for this FreedomBox web administration interface" msgid "Language for this web administration interface" -msgstr "Langue de l'interface Web de votre FreedomBox" +msgstr "Langue de cette interface web d'administration" #: plinth/modules/config/config.py:135 #: plinth/modules/dynamicdns/dynamicdns.py:37 @@ -514,7 +512,6 @@ msgstr "" "de votre fournisseur." #: plinth/modules/dynamicdns/dynamicdns.py:80 -#, fuzzy #| msgid "" #| "Please do not enter a URL here (like \"https://example.com/\") but only " #| "the hostname of the GnuDIP server (like \"example.pcom\")." @@ -522,16 +519,16 @@ msgid "" "Please do not enter a URL here (like \"https://example.com/\") but only the " "hostname of the GnuDIP server (like \"example.com\")." msgstr "" -"Ne saisissez pas une URL (comme \"https://example.com/\"), seulement le nom " -"de machine du serveur GnuDIP (comme \"example.com\")." +"Veuillez ne pas entrer une URL (comme \"https://example.com/\"), mais " +"seulement le nom de machine du serveur GnuDIP (comme \"example.com\")." #: plinth/modules/dynamicdns/dynamicdns.py:84 -#, fuzzy, python-brace-format +#, python-brace-format, python-brace-format #| msgid "The public domain name you want use to reach your box." msgid "The public domain name you want use to reach your {box_name}." msgstr "" "Le nom de domaine public que vous désirez utiliser pour atteindre votre " -"FreedomBox." +"{box_name}." #: plinth/modules/dynamicdns/dynamicdns.py:87 msgid "Use this option if your provider uses self signed certificates." @@ -554,7 +551,7 @@ msgstr "" "votre mot de passe." #: plinth/modules/dynamicdns/dynamicdns.py:96 -#, fuzzy, python-brace-format +#, python-brace-format, python-brace-format #| msgid "" #| "Optional Value. If your FreedomBox is not connected directly to the " #| "Internet (i.e. connected to a NAT router) this URL is used to figure out " @@ -566,8 +563,8 @@ msgid "" "Internet IP. The URL should simply return the IP where the client comes from " "(example: http://myip.datasystems24.de)." msgstr "" -"Valeur Optionnelle. Si votre FreedomBox n'est pas connectée directement à " -"l'Internet (si par exemple votre routeur fait du \"NAT\" Network Address " +"Valeur Optionnelle. Si votre {box_name} n'est pas connectée directement à " +"l'Internet (si par exemple votre routeur fait du « NAT » Network Address " "Translation), cette URL est utilisée pour trouver l'IP Internet réelle. " "L'URL doit retourner l'IP correspondante à l'endroit où le client se trouve. " "Exemple : http://myip.datasystems24.de" @@ -601,16 +598,14 @@ msgid "Update URL" msgstr "Actualiser l'URL" #: plinth/modules/dynamicdns/dynamicdns.py:135 -#, fuzzy #| msgid "accept all SSL certificates" msgid "Accept all SSL certificates" -msgstr "accepte tous les certificats SSL" +msgstr "Accepte tous les certificats SSL" #: plinth/modules/dynamicdns/dynamicdns.py:139 -#, fuzzy #| msgid "use HTTP basic authentication" msgid "Use HTTP basic authentication" -msgstr "utilise une authentification HTTP basique" +msgstr "Utiliser une authentification HTTP basique" #: plinth/modules/dynamicdns/dynamicdns.py:151 #: plinth/modules/networks/forms.py:146 plinth/modules/transmission/forms.py:39 @@ -656,13 +651,12 @@ msgid "Status of Dynamic DNS" msgstr "État du DNS Dynamique" #: plinth/modules/dynamicdns/templates/dynamicdns.html:25 -#, fuzzy #| msgid "DynamicDNS client" msgid "Dynamic DNS Client" -msgstr "Client DynamicDNS" +msgstr "Client DNS dynamique" #: plinth/modules/dynamicdns/templates/dynamicdns.html:28 -#, fuzzy, python-format +#, python-format, python-format #| msgid "" #| "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 " @@ -676,10 +670,9 @@ msgstr "" "Si votre fournisseur d'accès change régulièrement votre adresse IP (par ex. " "toutes les 24h), il peut être difficile pour les autres de vous trouver sur " "le Web. C'est sans doute la raison pour laquelle personne ne peut trouver " -"les services fournis par FreedomBox (comme ownCloud)." +"les services fournis par %(box_name)s (comme ownCloud)." #: plinth/modules/dynamicdns/templates/dynamicdns.html:37 -#, fuzzy #| msgid "" #| "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 " @@ -698,10 +691,11 @@ msgid "" msgstr "" "La solution est d'assigner un nom DNS à votre adresse IP et d'actualiser le " "nom DNS à chaque fois que votre IP est modifiée par votre fournisseur " -"d'accès. Dynamic DNS vous permet de publier votre adresse IP actuelle vers " -"un serveur " -"gnudip. Ensuite, le serveur assignera une nouvelle IP. Si quelqu'un sur " -"Internet demande votre nom DNS, il obtiendra votre IP actuelle." +"d'accès. Le DNS dynamique vous permet de publier votre adresse IP actuelle " +"vers un serveur " +"gnudip. Ensuite, le serveur assignera votre nom DNS avec la nouvelle IP. " +"Si quelqu'un sur Internet demande votre nom DNS, il obtiendra votre IP " +"actuelle." #: plinth/modules/dynamicdns/templates/dynamicdns.html:50 msgid "" @@ -718,7 +712,7 @@ msgstr "" "org." #: plinth/modules/dynamicdns/templates/dynamicdns.html:61 -#, fuzzy, python-format +#, python-format, python-format #| msgid "" #| "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 " @@ -727,10 +721,10 @@ msgid "" "If your %(box_name)s is connected behind some NAT router, don't forget to " "add port forwarding (i.e. forward some standard ports like 80 and 443)." msgstr "" -"Si votre FreedomBox est connectée derrière un routeur réalisant du NAT, " +"Si votre %(box_name)s est connectée derrière un routeur réalisant du NAT, " "n'oubliez pas d'ajouter la redirection de port (« portforwarding », par " "exemple un réacheminement sur des ports standards comme 80 ou 443) à votre " -"FreedomBox." +"%(box_name)s." #: plinth/modules/dynamicdns/templates/dynamicdns_configure.html:30 msgid "" @@ -755,13 +749,12 @@ msgstr "" "de NAT." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:35 -#, fuzzy #| msgid "Direct connection to the internet." msgid "Direct connection to the Internet." -msgstr "Connexion directe à l'Internet." +msgstr "Connexion directe à Internet." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:37 -#, fuzzy, python-format +#, python-format, python-format #| msgid "" #| "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 - " @@ -773,12 +766,12 @@ msgid "" "changes will not be detected). In case the WAN IP changes, it may take up " "to %(timer)s minutes until your DNS entry is updated." msgstr "" -"Derrière le NAT, un service DNS dynamique sondera la résolution IP/URL ou " -"\"IP check URL\" pour vérifier des modifications (nous avons besoin de la " -"résolution \"IP check URL\" pour cette raison - sinon, nous ne détecterons " -"pas les modifications de l'IP). Cela pourrait prendre jusque %(timer)s " -"minutes avant de mettre à jour votre entrée DNS en cas de modification de " -"l'IP WAN." +"Derrière un NAT. Cela signifie qu'un service de DNS dynamique sondera « l'IP " +"de vérification d'URL » pour vérifier les modifications (nous avons besoin " +"de l'élément « l'IP de vérification d'URL » pour cette raison - sinon, nous " +"ne détecterons pas les modifications de l'IP). Cela pourrait prendre jusque " +"%(timer)s minutes avant de mettre à jour votre entrée DNS en cas de " +"modification de l'IP WAN." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:48 msgid "Last update" @@ -791,7 +784,7 @@ msgid "Firewall" msgstr "Pare-feu" #: plinth/modules/firewall/templates/firewall.html:28 -#, fuzzy, python-format +#, python-format, python-format #| msgid "" #| "Firewall is a network security system that controls the incoming and " #| "outgoing network traffic on your %(box_name)s. Keeping a firewall enabled " @@ -801,14 +794,14 @@ msgid "" "network traffic on your %(box_name)s. Keeping a firewall enabled and " "properly configured reduces risk of security threat from the Internet." msgstr "" -"Un Pare-feu ou « Firewall » est un système de sécurité réseau permettant de " -"contrôler le trafic entrant et sortant sur %(box_name)s. Garder un pare-feu " -"activé et correctement configuré réduit le risque de failles sécurité sur " +"Un pare-feu ou « firewall » est un système de sécurité permettant de " +"contrôler le trafic réseau entrant et sortant sur %(box_name)s. Garder un " +"pare-feu activé et correctement configuré réduit le risque de menaces depuis " "Internet." #: plinth/modules/firewall/templates/firewall.html:36 msgid "Current status:" -msgstr "" +msgstr "État actuel :" #: plinth/modules/firewall/templates/firewall.html:41 #, python-format @@ -857,7 +850,6 @@ msgid "Blocked" msgstr "Bloqué" #: plinth/modules/firewall/templates/firewall.html:103 -#, fuzzy #| msgid "" #| "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 " @@ -890,10 +882,9 @@ msgid "Help" msgstr "Aide" #: plinth/modules/first_boot/templates/firstboot_state0.html:45 -#, fuzzy #| msgid "Start setup" msgid "Start Setup" -msgstr "Démarrer l'Installation" +msgstr "Démarrer la configuration" #: plinth/modules/first_boot/templates/firstboot_state0.html:49 #, python-format @@ -901,6 +892,8 @@ msgid "" "To complete the setup of your %(box_name)s, please provide some basic " "information." msgstr "" +"Pour terminer la configuration de votre %(box_name)s, veuillez fournir des " +"informations de base." #: plinth/modules/first_boot/templates/firstboot_state1.html:41 msgid "Administrator Account" @@ -926,7 +919,7 @@ msgid "Setup Complete!" msgstr "Configuration terminée !" #: plinth/modules/first_boot/templates/firstboot_state10.html:32 -#, fuzzy, python-format +#, python-format, python-format #| msgid "" #| "To make your FreedomBox functional, you need some applications. " #| "Applications will be installed the first time you access them." @@ -935,22 +928,20 @@ msgid "" "you need some applications. They will be installed the first time you " "access them." msgstr "" -"Pour faire fonctionner votre FreedomBox, vous avez besoin d'applications. " -"Les applications seront installées lorsque vous y accéderez pour la première " -"fois." +"La configuration de %(box_name)s est terminée. Pour faire fonctionner votre " +"%(box_name)s, vous avez besoin d'applications. Elles seront installées " +"lorsque vous y accéderez pour la première fois." #: plinth/modules/first_boot/templates/firstboot_state10.html:41 msgid "Go to Apps" msgstr "Aller aux Applis" #: plinth/modules/first_boot/templates/firstboot_state10.html:44 -#, fuzzy #| msgid "Network Configuration" msgid "Current Network Configuration" -msgstr "Configuration Réseau" +msgstr "Configuration réseau actuelle" #: plinth/modules/first_boot/templates/firstboot_state10.html:47 -#, fuzzy #| msgid "" #| "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-" @@ -959,9 +950,8 @@ msgid "" "You should check the network setup and modify it if necessary. Do not forget " "to change the default Wi-Fi passwords!" msgstr "" -"La configuration de la FreedomBox est achevée. Toutefois, vous devriez " -"vérifier la configuration réseau et la modifier si nécessaire. N'oubliez pas " -"de modifier les mots de passe Wi-Fi par défaut." +"Vous devriez vérifier la configuration réseau et la modifier si nécessaire. " +"N'oubliez pas de modifier les mots de passe Wi-Fi par défaut !" #: plinth/modules/first_boot/templates/firstboot_state10.html:57 msgid "Go to Networks" @@ -981,7 +971,7 @@ msgstr "Où Obtenir de l'Aide" #: plinth/modules/help/help.py:38 msgid "Manual" -msgstr "" +msgstr "Manuel" #: plinth/modules/help/help.py:48 msgid "Documentation and FAQ" @@ -993,13 +983,13 @@ msgid "About {box_name}" msgstr "À Propos de {box_name}" #: plinth/modules/help/help.py:73 -#, fuzzy, python-brace-format +#, python-brace-format, python-brace-format #| msgid "About {box_name}" msgid "{box_name} Manual" -msgstr "À Propos de {box_name}" +msgstr "Manuel {box_name}" #: plinth/modules/help/templates/help_about.html:30 -#, fuzzy, python-format +#, python-format, python-format #| msgid "" #| "FreedomBox is a community project to develop, design and promote personal " #| "servers running free software for private, personal communications. It " @@ -1017,14 +1007,15 @@ msgid "" "and a Tor relay, on a device that can replace your Wi-Fi router, so that " "your data stays with you." msgstr "" -"FreedomBox est un projet communautaire consacré au développement, au design " -"et à la promotion de serveurs personnels utilisant des logiciels libres pour " -"les communications privées. Il s'agit d'un programme réseau conçu comme une " -"interface entre vous et le reste de l'Internet afin de protéger votre vie " -"privée et vos données. FreedomBox intègre des applications permettant " -"notamment de publier un blog, un wiki, un site Internet, un réseau social, " -"de gérer des emails, un proxy Web et un relais Tor sur une machine pouvant " -"remplacer votre routeur Wi-Fi. Vos données restent donc avec vous." +"%(box_name)s est un projet communautaire consacré au développement, à la " +"conception et à la promotion de serveurs personnels utilisant des logiciels " +"libres pour les communications privées. Il s'agit d'un programme réseau " +"conçu comme une interface entre vous et le reste de l'Internet afin de " +"protéger votre vie privée et vos données. %(box_name)s intègre des " +"applications permettant notamment de publier un blog, un wiki, un site " +"Internet, un réseau social, de gérer des emails, un serveur mandataire Web " +"et un relais Tor sur une machine pouvant remplacer votre routeur Wi-Fi. Vos " +"données restent donc avec vous." #: plinth/modules/help/templates/help_about.html:43 msgid "" @@ -1044,7 +1035,7 @@ msgstr "" "à l'architecture pair-à-pair qui a présidé à sa conception." #: plinth/modules/help/templates/help_about.html:56 -#, fuzzy, python-format +#, python-format, python-format #| msgid "" #| "There are a number of projects working to realize a future of distributed " #| "services; FreedomBox aims to bring them all together in a convenient " @@ -1055,11 +1046,11 @@ msgid "" "package." msgstr "" "Il existe de nombreux projets dont le but est de développer une architecture " -"distribuée de l'Internet. FreedomBox vise à les réunir sur des serveurs " +"distribuée de l'Internet. %(box_name)s vise à les réunir sur des serveurs " "personnels." #: plinth/modules/help/templates/help_about.html:64 -#, fuzzy, python-format +#, python-format, python-format #| msgid "" #| "For more information about the FreedomBox project, see the FreedomBox Wiki." @@ -1067,8 +1058,8 @@ msgid "" "For more information about the %(box_name)s project, see the %(box_name)s Wiki." msgstr "" -"Pour plus d'informations sur le projet FreedomBox, visiter le site Wiki FreedomBox." +"Pour plus d'informations sur le projet %(box_name)s, visitez le Wiki %(box_name)s." #: plinth/modules/help/templates/help_about.html:73 msgid "Learn more »" @@ -1082,10 +1073,10 @@ msgstr "Vous utilisez Plinth, version %(version)s." #: plinth/modules/help/templates/help_base.html:36 #, python-format msgid "%(box_name)s Setup" -msgstr "" +msgstr "Configuration de %(box_name)s" #: plinth/modules/help/templates/help_index.html:29 -#, fuzzy, python-format +#, python-format, python-format #| msgid "" #| "The FreedomBox Manual is the best place to " #| "start for information regarding %(box_name)s." @@ -1093,11 +1084,11 @@ msgid "" "The %(box_name)s Manual is the best place to " "start for information regarding %(box_name)s." msgstr "" -"Le Manuel FreedomBox propose des informations " -"de base sur %(box_name)s." +"Le Manuel %(box_name)s propose des " +"informations de base sur %(box_name)s." #: plinth/modules/help/templates/help_index.html:36 -#, fuzzy, python-format +#, python-format, python-format #| msgid "" #| " " #| "FreedomBox project wiki contains further information." @@ -1105,12 +1096,11 @@ msgid "" " " "%(box_name)s project wiki contains further information." msgstr "" -"Vous trouverez sur le site wiki FreedomBox des instructions supplémentaires en " -"plusieurs langues." +"Le wiki " +"du projet %(box_name)scontient davantage d'informations." #: plinth/modules/help/templates/help_index.html:43 -#, fuzzy, python-format +#, python-format, python-format #| msgid "" #| "To seek help from FreedomBox community, queries may be posted on the mailing list. The list archives also contain information about " "problems faced by other users and possible solutions." msgstr "" -"Si vous avez besoin d'une aide supplémentaire, vous pouvez poser vos " -"questions en anglais sur la liste de discussion du projet. " -"Les archives de la liste contiennent aussi des informations sur les " -"problèmes rencontrés par les utilisateurs ainsi que les solutions " -"probablement apportées." +"Pour obtenir de l'aide de la communauté %(box_name)s, vous pouvez poser vos " +"questions en anglais sur la liste " +"de discussion du projet. Les archives de la liste contiennent aussi des " +"informations sur les problèmes rencontrés par les utilisateurs ainsi que les " +"solutions probablement apportées." #: plinth/modules/help/templates/help_index.html:53 #, python-format @@ -1137,24 +1127,25 @@ msgid "" "oftc.net/?randomnick=1&channels=freedombox&prompt=1\"> #freedombox " "channel using the IRC web interface." msgstr "" +"De nombreux contributeurs et utilisateurs de %(box_name)s sont également " +"disponibles sur le réseau IRC irc.oftc.net. Rejoignez le canal " +"#freedombox et demandez de l'aide en utilisant l'interface web pour IRC." #: plinth/modules/ikiwiki/__init__.py:38 -#, fuzzy #| msgid "Wiki & Blog (Ikiwiki)" msgid "Wiki and Blog (ikiwiki)" -msgstr "Wiki et Blogue (Ikiwiki)" +msgstr "Wiki et blogue (ikiwiki)" #: plinth/modules/ikiwiki/__init__.py:43 -#, fuzzy #| msgid "Ikiwiki wikis and blogs" msgid "ikiwiki wikis and blogs" -msgstr "Wikis et blogues Ikiwiki" +msgstr "Wikis et blogues ikiwiki" #: plinth/modules/ikiwiki/forms.py:29 -#, fuzzy #| msgid "Enable Ikiwiki" msgid "Enable ikiwiki" -msgstr "Activer Ikiwiki" +msgstr "Activer ikiwiki" #: plinth/modules/ikiwiki/forms.py:36 #: plinth/modules/networks/templates/connection_show.html:98 @@ -1183,13 +1174,12 @@ msgstr "" "ikiwiki\">/ikiwiki." #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:27 -#, fuzzy, python-format +#, python-format, python-format #| msgid "Delete Wiki/Blog %(name)s" msgid "Delete Wiki or Blog %(name)s" -msgstr "Supprimer le Wiki/Blogue %(name)s" +msgstr "Supprimer le wki ou blogue %(name)s" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:33 -#, fuzzy #| msgid "" #| "This action will remove all the posts, pages and comments including " #| "revision history. Delete this wiki/blog permanently?" @@ -1197,9 +1187,9 @@ msgid "" "This action will remove all the posts, pages and comments including revision " "history. Delete this wiki or blog permanently?" msgstr "" -"Cette action aura pour effet de supprimer tous les posts, les pages et les " -"commentaires, tout comme l'historique des révisions. Voulez-vous supprimer " -"ce Wiki/Blogue de façon permanente ?" +"Cette action aura pour effet de supprimer tous les messages, pages et " +"commentaires, ainsi que l'historique des révisions. Voulez-vous supprimer ce " +"wiki ou blogue de façon permanente ?" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:44 #, python-format @@ -1240,7 +1230,6 @@ msgid "Create" msgstr "Créer" #: plinth/modules/ikiwiki/views.py:73 -#, fuzzy #| msgid "Wiki & Blog" msgid "Wiki and Blog" msgstr "Wiki et Blogue" @@ -1250,7 +1239,6 @@ msgid "Manage Wikis and Blogs" msgstr "Gestion Wikis et Blogues" #: plinth/modules/ikiwiki/views.py:132 -#, fuzzy #| msgid "Create a Wiki or Blog" msgid "Create Wiki or Blog" msgstr "Créer un Wiki ou un Blogue" @@ -1286,16 +1274,15 @@ msgid "Could not delete {name}: {error}" msgstr "La suppression de {name} n'a pas abouti : {error}" #: plinth/modules/ikiwiki/views.py:182 -#, fuzzy #| msgid "Delete Wiki/Blog" msgid "Delete Wiki or Blog" -msgstr "Supprimer Wiki/Blogue" +msgstr "Supprimer le Wiki ou le Blogue" #: plinth/modules/letsencrypt/__init__.py:43 #: plinth/modules/letsencrypt/templates/letsencrypt.html:38 #: plinth/modules/letsencrypt/views.py:45 msgid "Certificates (Let's Encrypt)" -msgstr "" +msgstr "Certificats (Let's Encrypt)" #: plinth/modules/letsencrypt/templates/letsencrypt.html:41 #, python-format @@ -1306,6 +1293,12 @@ msgid "" "domain. It does so by proving itself to be the owner of a domain to Let's " "Encrypt, a certficate authority (CA)." msgstr "" +"Un certificat numérique permet aux utilisateurs d'un service web de vérifier " +"l'identité du service et de communiquer de façon sécurisée avec le service " +"en question. %(box_name)s peut automatiquement obtenir et configurer des " +"certificats pour chaque domaine disponible. Il le fait en prouvant qu'il est " +"le propriétaire du domaine auprès de Let's Encrypt, une autorité de " +"certification (CA)." #: plinth/modules/letsencrypt/templates/letsencrypt.html:52 msgid "" @@ -1314,77 +1307,79 @@ msgid "" "read and agree with the Let's Encrypt Subscriber Agreement before using this service." msgstr "" +"Lets Encrypt est une autorité de certification automatique, gratuite et " +"ouverte, offerte pour le bien du public par Internet Security Research Group " +"(ISRG). Veuillez lire et accepter les conditions d'utilisation de Let's " +"Encrypt avant d'utiliser ce service." #: plinth/modules/letsencrypt/templates/letsencrypt.html:66 #: plinth/modules/monkeysphere/templates/monkeysphere.html:70 -#, fuzzy #| msgid "Domain Name" msgid "Domain" -msgstr "Nom de Domaine" +msgstr "Domaine" #: plinth/modules/letsencrypt/templates/letsencrypt.html:67 msgid "Certificate Status" -msgstr "" +msgstr "État du certificat" #: plinth/modules/letsencrypt/templates/letsencrypt.html:68 -#, fuzzy #| msgid "Security" msgid "Website Security" -msgstr "Sécurité" +msgstr "Sécurité du site web" #: plinth/modules/letsencrypt/templates/letsencrypt.html:69 #: plinth/modules/monkeysphere/templates/monkeysphere.html:72 -#, fuzzy #| msgid "Applications" msgid "Actions" -msgstr "Applications" +msgstr "Actions" #: plinth/modules/letsencrypt/templates/letsencrypt.html:79 #, python-format msgid "Expires on %(expiry_date)s" -msgstr "" +msgstr "Expire le %(expiry_date)s" #: plinth/modules/letsencrypt/templates/letsencrypt.html:85 msgid "No certficate" -msgstr "" +msgstr "Aucun certificat" #: plinth/modules/letsencrypt/templates/letsencrypt.html:102 msgid "Revoke" -msgstr "" +msgstr "Révoquer" #: plinth/modules/letsencrypt/templates/letsencrypt.html:108 msgid "Re-obtain" -msgstr "" +msgstr "Obtenir à nouveau" #: plinth/modules/letsencrypt/templates/letsencrypt.html:115 msgid "Obtain" -msgstr "" +msgstr "Obtenir" #: plinth/modules/letsencrypt/views.py:55 #, python-brace-format msgid "Certificate successfully revoked for domain {domain}" -msgstr "" +msgstr "Certificat révoqué avec succès pour le domaine {domain}" #: plinth/modules/letsencrypt/views.py:60 #, python-brace-format msgid "Failed to revoke certificate for domain {domain}: {error}" -msgstr "" +msgstr "Échec de la révocation du certificat pour le domaine {domain} : {error}" #: plinth/modules/letsencrypt/views.py:72 #, python-brace-format msgid "Certificate successfully obtained for domain {domain}" -msgstr "" +msgstr "Certificat obtenu avec succès pour le domaine {domain}" #: plinth/modules/letsencrypt/views.py:77 #, python-brace-format msgid "Failed to obtain certificate for domain {domain}: {error}" -msgstr "" +msgstr "Échec de l'obtention du certificat pour le domaine {domain} : {error}" #: plinth/modules/monkeysphere/__init__.py:32 #: plinth/modules/monkeysphere/templates/monkeysphere.html:35 #: plinth/modules/monkeysphere/views.py:44 msgid "Monkeysphere" -msgstr "" +msgstr "Monkeysphere" #: plinth/modules/monkeysphere/templates/monkeysphere.html:38 msgid "" @@ -1396,14 +1391,23 @@ msgid "" "key signing process. See the Monkeysphere SSH documentation for more details." msgstr "" +"Avec Monkeysphere, une clef PGP peut être générée pour chaque domaine " +"configuré servant SSH. La clef publique PGP peut alors être téléversé sur " +"les serveurs de clefs PGP. Les utilisateurs se connectant à cette machine " +"via SSH peuvent vérifier qu'ils se connectent au bon hôte. Pour que les " +"utilisateurs puissent faire confiance à la clef, au moins une personne (" +"d'habitude le propriétaire de la machine) doit la signer en utilisant le " +"processus habituel de signature de clef PGP. Pour plus de détails, voyez la <" +"a href=\"http://web.monkeysphere.info/getting-started-ssh/\"> documentation " +"SSH de Monkeysphere." #: plinth/modules/monkeysphere/templates/monkeysphere.html:53 msgid "Publishing key to keyserver..." -msgstr "" +msgstr "Publication de la clef à un serveur de clefs" #: plinth/modules/monkeysphere/templates/monkeysphere.html:71 msgid "GPG Fingerprint" -msgstr "" +msgstr "Empreinte digitale GPG" #: plinth/modules/monkeysphere/templates/monkeysphere.html:83 #: plinth/modules/names/views.py:45 @@ -1412,27 +1416,27 @@ msgstr "Indisponible" #: plinth/modules/monkeysphere/templates/monkeysphere.html:93 msgid "Generate PGP Key" -msgstr "" +msgstr "Générer une clef PGP" #: plinth/modules/monkeysphere/templates/monkeysphere.html:101 msgid "Publish Key" -msgstr "" +msgstr "Publier la clef" #: plinth/modules/monkeysphere/views.py:58 msgid "Generated PGP key." -msgstr "" +msgstr "Clef PGP générée." #: plinth/modules/monkeysphere/views.py:83 msgid "Cancelled key publishing." -msgstr "" +msgstr "Publication de la clef annulée." #: plinth/modules/monkeysphere/views.py:120 msgid "Published key to keyserver." -msgstr "" +msgstr "Clef publiée sur le serveur de clefs." #: plinth/modules/monkeysphere/views.py:122 msgid "Error occurred while publishing key." -msgstr "" +msgstr "Une erreur est survenue lors de la publication de la clef." #: plinth/modules/mumble/__init__.py:38 #: plinth/modules/mumble/templates/mumble.html:26 @@ -1866,7 +1870,6 @@ msgid "Firewall zone" msgstr "Zone pare-feu" #: plinth/modules/networks/templates/connection_show.html:280 -#, fuzzy #| msgid "" #| "This interface should be connected to local network/machine. If you " #| "connect this interface to a public network, services meant to be " @@ -1877,13 +1880,12 @@ msgid "" "connect this interface to a public network, services meant to be available " "only internally will become available externally. This is a security risk." msgstr "" -"L'interface doit être connectée à la machine ou au réseau local. Si vous " +"L'interface doit être connectée à une machine ou réseau locaux. Si vous " "connectez cette interface au réseau public, les services destinés à une " "accessibilité en interne deviendront accessible depuis l'extérieur. C'est " "une faille de sécurité." #: plinth/modules/networks/templates/connection_show.html:300 -#, fuzzy #| msgid "" #| "This interface should receive your Internet connection. If you connect it " #| "your a local network/machine, many services meant to available only " @@ -1894,11 +1896,11 @@ msgid "" "will not be available." msgstr "" "Cette interface doit recevoir votre connexion internet. Si vous la connectez " -"à une machine ou un réseau local, beaucoup de services conçus pour un usage " +"à une machine ou un réseau locaux, beaucoup de services conçus pour un usage " "interne ne seront pas disponibles." #: plinth/modules/networks/templates/connection_show.html:319 -#, fuzzy, python-format +#, python-format, python-format #| msgid "" #| "This interface is not maintained by FreedomBox. Its security status is " #| "unknown to FreedomBox. Many FreedomBox services may not be available on " @@ -1910,8 +1912,8 @@ msgid "" "this interface. It is recommended that you deactivate or delete this " "connection and re-configure it." msgstr "" -"Cette interface n'est pas maintenue par FreedomBox. L'état de sa sécurité " -"est inconnu aux yeux de FreedomBox. Beaucoup de services FreedomBox ne " +"Cette interface n'est pas maintenue par %(box_name)s. L'état de sa sécurité " +"est inconnu aux yeux de %(box_name)s. Beaucoup de services %(box_name)s ne " "seront pas disponibles sur cette interface. Il est recommandé de désactiver/" "supprimer cette connexion et de la reconfigurer." @@ -2000,7 +2002,7 @@ msgid "Enable OpenVPN server" msgstr "Activer le serveur OpenVPN" #: plinth/modules/openvpn/templates/openvpn.html:38 -#, fuzzy, python-format +#, python-format, python-format #| msgid "" #| "Virtual Private Network (VPN) is a technique for securely connecting two " #| "machines in order to access resources of a private network. While you " @@ -2028,7 +2030,7 @@ msgid "Profile" msgstr "Profil" #: plinth/modules/openvpn/templates/openvpn.html:54 -#, fuzzy, python-format +#, python-format, python-format #| msgid "" #| "To connect to %(box_name)s's VPN, you need to download a profile and feed " #| "it to an OpenVPN client on your mobile or desktop machine. OpenVPN " @@ -2047,8 +2049,8 @@ msgstr "" "Pour vous connecter au réseau VPN %(box_name)s, vous devez télécharger un " "profil et l'accoler à un client VPN sur votre mobile ou sur votre " "ordinateur. Les clients OpenVPN sont disponibles pour de nombreuses plate-" -"formes. Voir la documentation wiki consacrée " +"formes. Voir la documentation wiki consacrée " "aux clients recommandés et aux instructions liées à leur configuration." #: plinth/modules/openvpn/templates/openvpn.html:66 @@ -2601,22 +2603,19 @@ msgstr "Quassel core n'est pas actif" #: plinth/modules/repro/__init__.py:36 #: plinth/modules/repro/templates/repro.html:26 #: plinth/modules/repro/views.py:55 -#, fuzzy #| msgid "Server port" msgid "SIP Server (repro)" -msgstr "Port serveur" +msgstr "Serveur SIP (repro)" #: plinth/modules/repro/__init__.py:41 -#, fuzzy #| msgid "Second DNS Server" msgid "repro SIP Server" -msgstr "Second Serveur DNS" +msgstr "Serveur SIP repro" #: plinth/modules/repro/forms.py:29 -#, fuzzy #| msgid "Enable Quassel core service" msgid "Enable repro service" -msgstr "Activer le cœur Quassel" +msgstr "Activer le service repro" #: plinth/modules/repro/templates/repro.html:29 msgid "" @@ -2626,6 +2625,13 @@ msgid "" "their presence known. It also acts as a proxy to federate SIP " "communications to other servers on the Internet similar to email." msgstr "" +"repro fournit divers services SIP qu'un téléphone logiciel SIP peut utiliser " +"pour passer des appels audio et vidéo tout comme assurer des services de " +"présence et de messagerie instantanée. repro fournit un serveur et des " +"comptes utilisateurs que les clients peuvent utiliser pour faire connaître " +"leur présence. Il remplit également la fonction de serveur mandataire pour " +"fédérer les communications SIP avec d'autres serveurs sur Internet de " +"manière comparable avec le courrier électronique." #: plinth/modules/repro/templates/repro.html:39 msgid "" @@ -2634,6 +2640,11 @@ msgid "" "\"https://f-droid.org/repository/browse/?fdid=com.csipsimple\"> CSipSimple (for Android phones)." msgstr "" +"Pour passer des appels SIP, une application cliente est nécessaire. Les " +"clients disponibles comprennent Jitsi (" +"pour les ordinateurs) et CSipSimple " +"(pour les téléphones Android)." #: plinth/modules/repro/templates/repro.html:48 msgid "" @@ -2643,18 +2654,23 @@ msgid "" "log in to the repro configuration panel. After setting the domain, it is " "required to restart the repro service. Disable the service and re-enable it." msgstr "" +"Note : avant d'utiliser repro, les domaines et les " +"utilisateurs doivent être configurés au moyen du panneau de configuration basée sur une interface web. Les " +"utilisateurs du groupe admin auront la possibilité de se connecter " +"au panneau de configuration de repro. Après avoir configuré le domaine, il " +"est nécessaire de redémarrer le service repro. Désactivez le service et " +"réactivez-le." #: plinth/modules/repro/templates/repro.html:63 -#, fuzzy #| msgid "Quassel core service is running" msgid "repro service is running" -msgstr "Quassel core est actif" +msgstr "Le service repro est actif" #: plinth/modules/repro/templates/repro.html:66 -#, fuzzy #| msgid "Quassel core service is not running" msgid "repro service is not running" -msgstr "Quassel core n'est pas actif" +msgstr "Le service repro n'est pas actif" #: plinth/modules/restore/__init__.py:36 #: plinth/modules/restore/templates/restore_index.html:26 @@ -2671,7 +2687,7 @@ msgid "Enable reStore" msgstr "Activer reStore" #: plinth/modules/restore/templates/restore_index.html:29 -#, fuzzy, python-format +#, python-format, python-format #| msgid "" #| "reStore is a server for unhosted web " #| "applications. The idea is to uncouple web applications from data. No " @@ -2685,13 +2701,13 @@ msgid "" "unhosted storage server of user's choice. With reStore, your %(box_name)s " "becomes your unhosted storage server." msgstr "" -"reStore est un serveur pour applications Web non hébergées. L'idée est de découpler les applications Web des " -"données qu'elles gèrent. Le serveur sur lequel se trouve l'application Web " -"n'a alors plus d'importance. Les données peuvent être stockées sur le " -"serveur de stockage non hébergé découlant du choix de l'utilisateur. En " -"utilisant reStore, votre machine %(cfg.box_name)s devient votre serveur de " -"stockage non hébergé." +"reStore est un serveur pour applications Web " +"non hébergées. L'idée est de découpler les applications Web des données " +"qu'elles gèrent. Le serveur sur lequel se trouve l'application Web n'a alors " +"plus d'importance. Les données peuvent être stockées sur le serveur de " +"stockage non hébergé découlant du choix de l'utilisateur. En utilisant " +"reStore, votre machine %(box_name)s devient votre serveur de stockage non " +"hébergé." #: plinth/modules/restore/templates/restore_index.html:40 msgid "" @@ -2815,14 +2831,13 @@ msgid "Anonymity Network (Tor)" msgstr "Réseau Anonyme (Tor)" #: plinth/modules/tor/__init__.py:53 -#, fuzzy #| msgid "Anonymity Network (Tor)" msgid "Tor Anonymity Network" -msgstr "Réseau Anonyme (Tor)" +msgstr "Réseau d'anonymat Tor" #: plinth/modules/tor/__init__.py:58 msgid "Tor Bridge Relay" -msgstr "" +msgstr "Relais pont Tor" #: plinth/modules/tor/__init__.py:76 plinth/modules/tor/views.py:144 msgid "Tor Hidden Service" @@ -2859,7 +2874,7 @@ msgid "Enable Tor Hidden Service" msgstr "Activer les Services Cachés Tor" #: plinth/modules/tor/forms.py:38 -#, fuzzy, python-brace-format +#, python-brace-format, python-brace-format #| msgid "" #| "A hidden service will allow FreedomBox to provide selected services (such " #| "as ownCloud or Chat) without revealing its location." @@ -2867,7 +2882,7 @@ msgid "" "A hidden service will allow {box_name} to provide selected services (such as " "ownCloud or chat) without revealing its location." msgstr "" -"Un service caché permettra à FreedomBox de proposer les services " +"Un service caché permettra à {box_name} de proposer les services " "sélectionnés (comme ownCloud ou Chat) sans révéler votre emplacement." #: plinth/modules/tor/forms.py:42 @@ -2899,10 +2914,9 @@ msgstr "" "download-easy.html.en\">Navigateur Tor." #: plinth/modules/tor/templates/tor.html:54 -#, fuzzy #| msgid "Configuration updated" msgid "Tor configuration is being updated" -msgstr "Configuration actualisée" +msgstr "La configuration de Tor est en cours d'actualisation" #: plinth/modules/tor/templates/tor.html:62 msgid "Tor is running" @@ -2962,14 +2976,13 @@ msgid "Action error: {0} [{1}] [{2}]" msgstr "Erreur sur action : {0} [{1}] [{2}]" #: plinth/modules/tor/views.py:148 -#, fuzzy #| msgid "Configuration updated" msgid "Configuration updated." -msgstr "Configuration actualisée" +msgstr "Configuration actualisée." #: plinth/modules/tor/views.py:150 msgid "An error occurred during configuration." -msgstr "" +msgstr "Une erreur est survenue pendant la configuration." #: plinth/modules/transmission/__init__.py:38 #: plinth/modules/transmission/templates/transmission.html:26 @@ -3057,6 +3070,10 @@ msgid "" "upgrades are enabled, upgrades are automatically run every night. You don't " "normally need to start the upgrade process." msgstr "" +"Les mises à niveau installent les dernières mises à jour de logiciels et de " +"sécurité. Lorsque les mises à niveau automatiques sont activées, la mise à " +"niveau se fait automatiquement chaque nuit. Vous n'avez normalement pas " +"besoin de démarrer le processus de mise à niveau." #: plinth/modules/upgrades/templates/upgrades.html:45 msgid "" @@ -3065,20 +3082,24 @@ msgid "" "other packages. During the upgrade, this web interface may be temporarily " "unavailable and show an error. Refresh the page to continue." msgstr "" +"En fonction du nombre de paquets à installer, cette opération peut prendre " +"du temps. Pendant que les mises à niveau seront en cours d'installation, " +"vous ne pourrez pas installer d'autres paquets. Durant la mise à niveau, " +"cette interface web peut être temporairement indisponible et afficher une " +"erreur. Rafraîchissez la page pour continuer." #: plinth/modules/upgrades/templates/upgrades.html:58 msgid "Upgrade now »" msgstr "Mettre à niveau »" #: plinth/modules/upgrades/templates/upgrades.html:65 -#, fuzzy #| msgid "ejabberd is running" msgid "A package manager is running." -msgstr "ejabberd est actif" +msgstr "Un gestionnaire de paquets est en train de fonctionner." #: plinth/modules/upgrades/templates/upgrades.html:70 msgid "Recent log from upgrades:" -msgstr "" +msgstr "Journalisation récente des mises à niveau :" #: plinth/modules/upgrades/views.py:36 plinth/modules/upgrades/views.py:66 msgid "Automatic Upgrades" @@ -3089,16 +3110,14 @@ msgid "Upgrade Packages" msgstr "Mise à Niveau Paquets" #: plinth/modules/upgrades/views.py:96 -#, fuzzy #| msgid "Upgrade completed." msgid "Upgrade process started." -msgstr "Mise à niveau terminée." +msgstr "Mise à niveau démarrée." #: plinth/modules/upgrades/views.py:99 -#, fuzzy #| msgid "Upgrade failed." msgid "Starting upgrade failed." -msgstr "Échec de la mise à niveau." +msgstr "Échec du démarrage de la mise à niveau." #: plinth/modules/upgrades/views.py:102 msgid "Package Upgrades" @@ -3160,7 +3179,7 @@ msgstr "Échec de l'ajout d'un nouvel utilisateur au groupe {group}." #: plinth/modules/users/forms.py:92 msgid "SSH Keys" -msgstr "" +msgstr "Clefs SSH" #: plinth/modules/users/forms.py:96 msgid "" @@ -3168,6 +3187,10 @@ msgid "" "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" +"La définition d'une clef publique SSH permettra à cet utilisateur d'ouvrir " +"une session sécurisée sans utiliser de mot de passe. Vous pouvez entrer des " +"clefs multiples, une sur chaque ligne. Les lignes vides et celles commençant " +"par # seront ignorées." #: plinth/modules/users/forms.py:136 msgid "Renaming LDAP user failed." @@ -3353,10 +3376,10 @@ msgid "Secure Shell (SSH) Server" msgstr "Serveur Secure Shell (SSH)" #: plinth/service.py:79 -#, fuzzy, python-brace-format +#, python-brace-format, python-brace-format #| msgid "FreedomBox Web Interface (Plinth)" msgid "{box_name} Web Interface (Plinth)" -msgstr "Interface web Freedombox (Plinth)" +msgstr "Interface web de {box_name} (Plinth)" #: plinth/templates/404.html:25 msgid "404" @@ -3393,10 +3416,10 @@ msgstr "" "traitement et réparation." #: plinth/templates/base.html:49 -#, fuzzy, python-format +#, python-format, python-format #| msgid "Plinth administrative interface for the FreedomBox" msgid "Plinth administrative interface for the %(box_name)s" -msgstr "Interface d'administration Plinth pour FreedomBox" +msgstr "Interface d'administration Plinth pour %(box_name)s" #: plinth/templates/base.html:83 msgid "Toggle navigation" From 176f0320c3ef901f8aa8171296a685b8c6fb2da9 Mon Sep 17 00:00:00 2001 From: Joel Valleroy Date: Sat, 5 Mar 2016 16:51:24 +0000 Subject: [PATCH 162/189] Avahi should now display {box_name}. Fixes #414 --- plinth/modules/avahi/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plinth/modules/avahi/__init__.py b/plinth/modules/avahi/__init__.py index c4c0970bc..d3da6fc45 100644 --- a/plinth/modules/avahi/__init__.py +++ b/plinth/modules/avahi/__init__.py @@ -39,8 +39,8 @@ description = [ format_lazy( _('Service discovery allows other devices on the network to ' - 'discover your {{ box_name }} and services running on it. It ' - 'also allows {{ box_name }} to discover other devices and ' + 'discover your {box_name} and services running on it. It ' + 'also allows {box_name} to discover other devices 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 ' From 84c752d7c793754f46beb252e161f3f62377a21a Mon Sep 17 00:00:00 2001 From: ultrapeer Date: Fri, 4 Mar 2016 22:55:43 +0100 Subject: [PATCH 163/189] Translated using Weblate (French) Currently translated at 100.0% (569 of 569 strings) --- plinth/locale/fr/LC_MESSAGES/django.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plinth/locale/fr/LC_MESSAGES/django.po b/plinth/locale/fr/LC_MESSAGES/django.po index a16984f90..4d17fbdd9 100644 --- a/plinth/locale/fr/LC_MESSAGES/django.po +++ b/plinth/locale/fr/LC_MESSAGES/django.po @@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-01-31 22:19+0530\n" -"PO-Revision-Date: 2016-03-04 20:33+0100\n" -"Last-Translator: Caly \n" +"PO-Revision-Date: 2016-03-04 22:55+0000\n" +"Last-Translator: ultrapeer \n" "Language-Team: French " "\n" "Language: fr\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Poedit 1.8.6\n" +"X-Generator: Weblate 2.5-dev\n" #: plinth/action_utils.py:203 #, python-brace-format @@ -1403,7 +1403,7 @@ msgstr "" #: plinth/modules/monkeysphere/templates/monkeysphere.html:53 msgid "Publishing key to keyserver..." -msgstr "Publication de la clef à un serveur de clefs" +msgstr "Publication de la clef sur un serveur de clefs..." #: plinth/modules/monkeysphere/templates/monkeysphere.html:71 msgid "GPG Fingerprint" From 3b7b7881b1f25620d264572048c64a49f169f8d6 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Tue, 1 Mar 2016 21:54:25 +0530 Subject: [PATCH 164/189] networks: Fix issue when looking up AP details As reported by Jan Costermans, it is possible that for an access point scanned by a Wi-Fi device, get_ssid() returns None. The reported as follows: if access_point.get_ssid().get_data() == ssid: AttributeError: 'NoneType' object has no attribute 'get_data' --- plinth/network.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plinth/network.py b/plinth/network.py index 6350ceb51..13d96d839 100644 --- a/plinth/network.py +++ b/plinth/network.py @@ -172,7 +172,8 @@ def get_status_from_wifi_access_point(device, ssid): return status for access_point in device.get_access_points(): - if access_point.get_ssid().get_data() == ssid: + if access_point and access_point.get_ssid() and \ + access_point.get_ssid().get_data() == ssid: status['strength'] = access_point.get_strength() frequency = access_point.get_frequency() status['channel'] = _get_wifi_channel_from_frequency(frequency) From fbbd70a642f5cbf69201e7cf31394879999c0dd6 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Sat, 5 Mar 2016 16:14:47 -0500 Subject: [PATCH 165/189] Remove #! sequence from ikiwiki setup automators. These files are not executed directly, but through ikiwiki's setup command. --- data/etc/ikiwiki/plinth-blog.setup | 2 +- data/etc/ikiwiki/plinth-wiki.setup | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/etc/ikiwiki/plinth-blog.setup b/data/etc/ikiwiki/plinth-blog.setup index 795c3334b..cde81794d 100644 --- a/data/etc/ikiwiki/plinth-blog.setup +++ b/data/etc/ikiwiki/plinth-blog.setup @@ -1,4 +1,4 @@ -#!/usr/bin/perl +# -*- mode: perl -*- # Ikiwiki setup automator for Plinth (blog version). require IkiWiki::Setup::Automator; diff --git a/data/etc/ikiwiki/plinth-wiki.setup b/data/etc/ikiwiki/plinth-wiki.setup index 889b6c93c..9b7b51998 100644 --- a/data/etc/ikiwiki/plinth-wiki.setup +++ b/data/etc/ikiwiki/plinth-wiki.setup @@ -1,4 +1,4 @@ -#!/usr/bin/perl +# -*- mode: perl -*- # Ikiwiki setup automator for Plinth. require IkiWiki::Setup::Automator; From 18db38002bfb266e9c21ac929bb08d01a9b1149d Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Sun, 14 Feb 2016 13:35:48 -0500 Subject: [PATCH 166/189] monkeysphere: Consistently use the term OpenPGP In user visible strings, instead of PGP or GPG. --- plinth/modules/monkeysphere/__init__.py | 12 ++++++------ .../modules/monkeysphere/templates/monkeysphere.html | 4 ++-- plinth/modules/monkeysphere/views.py | 6 +++--- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/plinth/modules/monkeysphere/__init__.py b/plinth/modules/monkeysphere/__init__.py index 09be4a195..d9c526f82 100644 --- a/plinth/modules/monkeysphere/__init__.py +++ b/plinth/modules/monkeysphere/__init__.py @@ -30,12 +30,12 @@ title = _('Monkeysphere') description = [ - _('With Monkeysphere, a PGP key can be generated for each configured ' - 'domain serving SSH. The PGP public key can then be uploaded to the PGP ' - 'keyservers. Users connecting to this machine through SSH can verify ' - 'that they are connecting to the correct host. For users to trust the ' - 'key, at least one person (usually the machine owner) must sign the key ' - 'using the regular PGP key signing process. See the ' + _('With Monkeysphere, an OpenPGP key can be generated for each configured ' + 'domain serving SSH. The OpenPGP public key can then be uploaded to the ' + 'OpenPGP keyservers. Users connecting to this machine through SSH can ' + 'verify that they are connecting to the correct host. For users to ' + 'trust the key, at least one person (usually the machine owner) must ' + 'sign the key using the regular OpenPGP key signing process. See the ' ' ' 'Monkeysphere SSH documentation for more details.') ] diff --git a/plinth/modules/monkeysphere/templates/monkeysphere.html b/plinth/modules/monkeysphere/templates/monkeysphere.html index ebe048590..58258c6c0 100644 --- a/plinth/modules/monkeysphere/templates/monkeysphere.html +++ b/plinth/modules/monkeysphere/templates/monkeysphere.html @@ -53,7 +53,7 @@ {% trans "Domain" %} - {% trans "GPG Fingerprint" %} + {% trans "OpenPGP Fingerprint" %} {% trans "Actions" %} @@ -75,7 +75,7 @@ {% csrf_token %} + {% trans "Generate OpenPGP Key" %} {% elif not running %}
Date: Sun, 14 Feb 2016 15:45:30 -0500 Subject: [PATCH 167/189] monkeysphere: Add key detail view --- .../monkeysphere/templates/monkeysphere.html | 5 +- .../templates/monkeysphere_details.html | 76 +++++++++++++++++++ plinth/modules/monkeysphere/urls.py | 2 + plinth/modules/monkeysphere/views.py | 18 +++++ 4 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 plinth/modules/monkeysphere/templates/monkeysphere_details.html diff --git a/plinth/modules/monkeysphere/templates/monkeysphere.html b/plinth/modules/monkeysphere/templates/monkeysphere.html index 58258c6c0..2244096f6 100644 --- a/plinth/modules/monkeysphere/templates/monkeysphere.html +++ b/plinth/modules/monkeysphere/templates/monkeysphere.html @@ -63,7 +63,10 @@ {{ domain.name }} {% if domain.key %} - {{ domain.key.pgp_fingerprint }} + + {{ domain.key.pgp_fingerprint }} + {% else %} {% trans "Not Available" %} {% endif %} diff --git a/plinth/modules/monkeysphere/templates/monkeysphere_details.html b/plinth/modules/monkeysphere/templates/monkeysphere_details.html new file mode 100644 index 000000000..6d0c2e197 --- /dev/null +++ b/plinth/modules/monkeysphere/templates/monkeysphere_details.html @@ -0,0 +1,76 @@ +{% extends "base.html" %} +{% comment %} +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +{% endcomment %} + +{% load bootstrap %} +{% load i18n %} + +{% block content %} + +

{% trans "Monkeysphere" %}

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{% trans "OpenPGP Fingerprint" %}{{ key.pgp_fingerprint }}
{% trans "OpenPGP Key ID" %}{{ key.pub }}
{% trans "OpenPGP User ID" %}{{ key.uid }}
{% trans "Key Generation Date" %}{{ key.date }}
{% trans "SSH Key Type" %}{{ key.ssh_key_type }}
{% trans "SSH Key Size" %}{{ key.ssh_key_size }}
{% trans "SSH Fingerprint" %}{{ key.ssh_fingerprint }}
+ +

+ {% blocktrans trimmed %} + After this key is published to the keyservers, it can be signed using + GnuPG with the following commands: + {% endblocktrans %} +

+
+    {% trans "# download the key" %}
+    gpg --recv-key {{ key.pgp_fingerprint }}
+    {% trans "# sign the key" %}
+    gpg --sign-key {{ key.pgp_fingerprint }}
+    {% trans "# send the key back to the keyservers" %}
+    gpg --send-key {{ key.pgp_fingerprint }}
+  
+ +{% endblock %} diff --git a/plinth/modules/monkeysphere/urls.py b/plinth/modules/monkeysphere/urls.py index 5d5e20dea..c80f16714 100644 --- a/plinth/modules/monkeysphere/urls.py +++ b/plinth/modules/monkeysphere/urls.py @@ -28,6 +28,8 @@ url(r'^sys/monkeysphere/$', views.index, name='index'), url(r'^sys/monkeysphere/(?P[^/]+)/generate/$', views.generate, name='generate'), + url(r'^sys/monkeysphere/(?P[0-9A-Fa-f]+)/details/$', + views.details, name='details'), url(r'^sys/monkeysphere/(?P[0-9A-Fa-f]+)/publish/$', views.publish, name='publish'), url(r'^sys/monkeysphere/cancel/$', views.cancel, name='cancel'), diff --git a/plinth/modules/monkeysphere/views.py b/plinth/modules/monkeysphere/views.py index 012a198de..30160c54a 100644 --- a/plinth/modules/monkeysphere/views.py +++ b/plinth/modules/monkeysphere/views.py @@ -62,6 +62,13 @@ def generate(request, domain): return redirect(reverse_lazy('monkeysphere:index')) +def details(request, fingerprint): + """Get details for an OpenPGP key.""" + key = get_key(fingerprint) + return TemplateResponse(request, 'monkeysphere_details.html', + {'title': _('Monkeysphere'), 'key': key}) + + @require_POST def publish(request, fingerprint): """Publish OpenPGP key for SSH service.""" @@ -104,6 +111,17 @@ def get_status(): return {'domains': domains} +def get_key(fingerprint): + """Get key by fingerprint.""" + output = actions.superuser_run('monkeysphere', + ['host-show-keys', fingerprint]) + if output: + keys = json.loads(output)['keys'] + return keys[0] + + return None + + def _collect_publish_result(request): """Handle publish process completion.""" global publish_process From 79edbd6195dd2b8ff8a6bafacf0933ccb0224069 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Tue, 16 Feb 2016 19:11:56 -0500 Subject: [PATCH 168/189] monkeysphere: Add self-signed certificate section --- actions/monkeysphere | 13 ++++ .../monkeysphere/templates/monkeysphere.html | 69 +++++++++++++++++++ plinth/modules/monkeysphere/urls.py | 2 + plinth/modules/monkeysphere/views.py | 35 +++++++++- 4 files changed, 116 insertions(+), 3 deletions(-) diff --git a/actions/monkeysphere b/actions/monkeysphere index 31ad6f937..f2e403d6d 100755 --- a/actions/monkeysphere +++ b/actions/monkeysphere @@ -41,6 +41,11 @@ def parse_arguments(): host_import_ssh_key.add_argument( 'hostname', help='Fully-qualified hostname') + host_import_https_key = subparsers.add_parser( + 'host-import-https-key', help='Import host HTTPS key') + host_import_https_key.add_argument( + 'hostname', help='Fully-qualified hostname') + host_publish_key = subparsers.add_parser( 'host-publish-key', help='Push host key to keyserver') host_publish_key.add_argument( @@ -91,6 +96,14 @@ def subcommand_host_import_ssh_key(arguments): print(output.decode()) +def subcommand_host_import_https_key(arguments): + """Import host HTTPS key.""" + output = subprocess.check_output( + ['monkeysphere-host', 'import-key', + '/etc/ssl/private/ssl-cert-snakeoil.key', arguments.hostname]) + print(output.decode()) + + def subcommand_host_publish_key(arguments): """Push host key to keyserver.""" # setting TMPDIR as workaround for Debian bug #656750 diff --git a/plinth/modules/monkeysphere/templates/monkeysphere.html b/plinth/modules/monkeysphere/templates/monkeysphere.html index 2244096f6..c28bea719 100644 --- a/plinth/modules/monkeysphere/templates/monkeysphere.html +++ b/plinth/modules/monkeysphere/templates/monkeysphere.html @@ -47,6 +47,8 @@

{% endif %} +

{% trans "Secure Shell (SSH)" %}

+
@@ -97,4 +99,71 @@ +

{% trans "Secure Web Server (HTTPS)" %}

+ +

+ {% blocktrans trimmed %} + Monkeysphere can also generate an OpenPGP key for each Secure Web Server + (HTTPS) certificate installed on this machine. The OpenPGP public key can + then be uploaded to the OpenPGP keyservers. Users accessing the web + server through HTTPS can verify that they are connecting to the correct + host. To validate the certificate, the user will need to install some + software that is available on the + + Monkeysphere website. + {% endblocktrans %} +

+ +

{% trans "Self-signed Certificate" %}

+ +
+
+
+ + + + + + + + + {% for domain in status.https_domains %} + + + + + + {% endfor %} + +
{% trans "Domain" %}{% trans "OpenPGP Fingerprint" %}{% trans "Actions" %}
{{ domain.name }} + {% if domain.key %} + + {{ domain.key.pgp_fingerprint }} + + {% else %} + {% trans "Not Available" %} + {% endif %} + + {% if not domain.key %} + + {% csrf_token %} + + + + {% elif not running %} +
+ {% csrf_token %} + + +
+ {% endif %} +
+
+
+ {% endblock %} diff --git a/plinth/modules/monkeysphere/urls.py b/plinth/modules/monkeysphere/urls.py index c80f16714..c4a61ed78 100644 --- a/plinth/modules/monkeysphere/urls.py +++ b/plinth/modules/monkeysphere/urls.py @@ -28,6 +28,8 @@ url(r'^sys/monkeysphere/$', views.index, name='index'), url(r'^sys/monkeysphere/(?P[^/]+)/generate/$', views.generate, name='generate'), + url(r'^sys/monkeysphere/(?P[^/]+)/generate_https/$', + views.generate_https, name='generate_https'), url(r'^sys/monkeysphere/(?P[0-9A-Fa-f]+)/details/$', views.details, name='details'), url(r'^sys/monkeysphere/(?P[0-9A-Fa-f]+)/publish/$', diff --git a/plinth/modules/monkeysphere/views.py b/plinth/modules/monkeysphere/views.py index 30160c54a..81ac9edcd 100644 --- a/plinth/modules/monkeysphere/views.py +++ b/plinth/modules/monkeysphere/views.py @@ -62,6 +62,22 @@ def generate(request, domain): return redirect(reverse_lazy('monkeysphere:index')) +@require_POST +def generate_https(request, domain): + """Generate OpenPGP key for HTTPS service.""" + valid_domain = any((domain in domains + for domains in names.domains.values())) + if valid_domain: + try: + actions.superuser_run( + 'monkeysphere', ['host-import-https-key', 'https://' + domain]) + messages.success(request, _('Generated OpenPGP key.')) + except actions.ActionError as exception: + messages.error(request, str(exception)) + + return redirect(reverse_lazy('monkeysphere:index')) + + def details(request, fingerprint): """Get details for an OpenPGP key.""" key = get_key(fingerprint) @@ -96,9 +112,14 @@ def get_status(): """Get the current status.""" output = actions.superuser_run('monkeysphere', ['host-show-keys']) keys = {} + https_keys = {} for key in json.loads(output)['keys']: - key['name'] = key['uid'].replace('ssh://', '') - keys[key['name']] = key + if key['uid'].startswith('ssh'): + key['name'] = key['uid'].replace('ssh://', '') + keys[key['name']] = key + elif key['uid'].startswith('https'): + key['name'] = key['uid'].replace('https://', '') + https_keys[key['name']] = key domains = [] for domains_of_a_type in names.domains.values(): @@ -108,7 +129,15 @@ def get_status(): 'key': keys.get(domain), }) - return {'domains': domains} + https_domains = [] + for domains_of_a_type in names.domains.values(): + for domain in domains_of_a_type: + https_domains.append({ + 'name': domain, + 'key': https_keys.get(domain), + }) + + return {'domains': domains, 'https_domains': https_domains} def get_key(fingerprint): From cc6f44d87ecb7c807a27e779fcfab542ef3c458c Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Tue, 16 Feb 2016 19:16:01 -0500 Subject: [PATCH 169/189] monkeysphere: Clarify arguments for import actions --- actions/monkeysphere | 9 +++++---- plinth/modules/monkeysphere/views.py | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/actions/monkeysphere b/actions/monkeysphere index f2e403d6d..89924a611 100755 --- a/actions/monkeysphere +++ b/actions/monkeysphere @@ -39,12 +39,12 @@ def parse_arguments(): host_import_ssh_key = subparsers.add_parser( 'host-import-ssh-key', help='Import host SSH key') host_import_ssh_key.add_argument( - 'hostname', help='Fully-qualified hostname') + 'domain', help='Fully-qualified domain name') host_import_https_key = subparsers.add_parser( 'host-import-https-key', help='Import host HTTPS key') host_import_https_key.add_argument( - 'hostname', help='Fully-qualified hostname') + 'domain', help='Fully-qualified domain name') host_publish_key = subparsers.add_parser( 'host-publish-key', help='Push host key to keyserver') @@ -92,7 +92,7 @@ def subcommand_host_import_ssh_key(arguments): """Import host SSH key.""" output = subprocess.check_output( ['monkeysphere-host', 'import-key', - '/etc/ssh/ssh_host_rsa_key', arguments.hostname]) + '/etc/ssh/ssh_host_rsa_key', 'ssh://' + arguments.domain]) print(output.decode()) @@ -100,7 +100,8 @@ def subcommand_host_import_https_key(arguments): """Import host HTTPS key.""" output = subprocess.check_output( ['monkeysphere-host', 'import-key', - '/etc/ssl/private/ssl-cert-snakeoil.key', arguments.hostname]) + '/etc/ssl/private/ssl-cert-snakeoil.key', + 'https://' + arguments.domain]) print(output.decode()) diff --git a/plinth/modules/monkeysphere/views.py b/plinth/modules/monkeysphere/views.py index 81ac9edcd..cc82a35fe 100644 --- a/plinth/modules/monkeysphere/views.py +++ b/plinth/modules/monkeysphere/views.py @@ -54,7 +54,7 @@ def generate(request, domain): if valid_domain: try: actions.superuser_run( - 'monkeysphere', ['host-import-ssh-key', 'ssh://' + domain]) + 'monkeysphere', ['host-import-ssh-key', domain]) messages.success(request, _('Generated OpenPGP key.')) except actions.ActionError as exception: messages.error(request, str(exception)) @@ -70,7 +70,7 @@ def generate_https(request, domain): if valid_domain: try: actions.superuser_run( - 'monkeysphere', ['host-import-https-key', 'https://' + domain]) + 'monkeysphere', ['host-import-https-key', domain]) messages.success(request, _('Generated OpenPGP key.')) except actions.ActionError as exception: messages.error(request, str(exception)) From 5c810ed87faa8a110007ba984ea2a26d5d8188ab Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Thu, 18 Feb 2016 18:05:48 -0500 Subject: [PATCH 170/189] monkeysphere: Add Let's Encrypt certificates Filter letsencrypt domains from snakeoil list. Rename views for snakeoil and letsencrypt. --- actions/monkeysphere | 49 +++++++++++++--- .../monkeysphere/templates/monkeysphere.html | 56 ++++++++++++++++++- plinth/modules/monkeysphere/urls.py | 6 +- plinth/modules/monkeysphere/views.py | 52 +++++++++++++---- 4 files changed, 141 insertions(+), 22 deletions(-) diff --git a/actions/monkeysphere b/actions/monkeysphere index 89924a611..ef37de3f7 100755 --- a/actions/monkeysphere +++ b/actions/monkeysphere @@ -41,9 +41,14 @@ def parse_arguments(): host_import_ssh_key.add_argument( 'domain', help='Fully-qualified domain name') - host_import_https_key = subparsers.add_parser( - 'host-import-https-key', help='Import host HTTPS key') - host_import_https_key.add_argument( + host_import_snakeoil_key = subparsers.add_parser( + 'host-import-snakeoil-key', help='Import host snakeoil key') + host_import_snakeoil_key.add_argument( + 'domain', help='Fully-qualified domain name') + + host_import_letsencrypt_key = subparsers.add_parser( + 'host-import-letsencrypt-key', help="Import Let's Encrypt key") + host_import_letsencrypt_key.add_argument( 'domain', help='Fully-qualified domain name') host_publish_key = subparsers.add_parser( @@ -96,13 +101,41 @@ def subcommand_host_import_ssh_key(arguments): print(output.decode()) -def subcommand_host_import_https_key(arguments): - """Import host HTTPS key.""" - output = subprocess.check_output( +def subcommand_host_import_snakeoil_key(arguments): + """Import host snakeoil key.""" + proc = subprocess.Popen( ['monkeysphere-host', 'import-key', '/etc/ssl/private/ssl-cert-snakeoil.key', - 'https://' + arguments.domain]) - print(output.decode()) + 'https://' + arguments.domain], + stdout=subprocess.PIPE, stderr=subprocess.PIPE, + env=dict( + os.environ, + MONKEYSPHERE_PROMPT='false')) + output, error = proc.communicate() + output, error = output.decode(), error.decode() + if proc.returncode != 0: + raise Exception(output, error) + + print(output) + + +def subcommand_host_import_letsencrypt_key(arguments): + """Import Let's Encrypt key.""" + proc = subprocess.Popen( + ['monkeysphere-host', 'import-key', + os.path.join('/etc/letsencrypt/live', + arguments.domain, 'privkey.pem'), + 'https://' + arguments.domain], + stdout=subprocess.PIPE, stderr=subprocess.PIPE, + env=dict( + os.environ, + MONKEYSPHERE_PROMPT='false')) + output, error = proc.communicate() + output, error = output.decode(), error.decode() + if proc.returncode != 0: + raise Exception(output, error) + + print(output) def subcommand_host_publish_key(arguments): diff --git a/plinth/modules/monkeysphere/templates/monkeysphere.html b/plinth/modules/monkeysphere/templates/monkeysphere.html index c28bea719..1eaf2a94b 100644 --- a/plinth/modules/monkeysphere/templates/monkeysphere.html +++ b/plinth/modules/monkeysphere/templates/monkeysphere.html @@ -127,7 +127,7 @@

{% trans "Self-signed Certificate" %}

- {% for domain in status.https_domains %} + {% for domain in status.snakeoil_domains %} {{ domain.name }} @@ -143,7 +143,59 @@

{% trans "Self-signed Certificate" %}

{% if not domain.key %}
+ action="{% url 'monkeysphere:generate_snakeoil' domain.name %}"> + {% csrf_token %} + + +
+ {% elif not running %} +
+ {% csrf_token %} + + +
+ {% endif %} + + + {% endfor %} + + +
+
+ +

{% trans "Let's Encrypt Certificates" %}

+ +
+
+ + + + + + + + + + {% for domain in status.letsencrypt_domains %} + + + + - - - - From bb1580709d9e7bb33b3ffeda375e471f495b077e Mon Sep 17 00:00:00 2001 From: the29a Date: Mon, 7 Mar 2016 06:03:40 +0100 Subject: [PATCH 175/189] Translated using Weblate (Russian) Currently translated at 99.2% (564 of 568 strings) --- plinth/locale/ru/LC_MESSAGES/django.po | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/plinth/locale/ru/LC_MESSAGES/django.po b/plinth/locale/ru/LC_MESSAGES/django.po index 425280d4f..7ccd60232 100644 --- a/plinth/locale/ru/LC_MESSAGES/django.po +++ b/plinth/locale/ru/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-02-06 14:44+0530\n" -"PO-Revision-Date: 2016-02-14 08:36+0000\n" +"PO-Revision-Date: 2016-03-07 06:03+0000\n" "Last-Translator: the29a \n" "Language-Team: Russian " "\n" @@ -468,7 +468,6 @@ msgid "Dynamic DNS" msgstr "Динамический DNS" #: plinth/modules/dynamicdns/dynamicdns.py:71 -#, fuzzy msgid "" "The Variables <User>, <Pass>, <Ip>, <Domain> may be " "used within the URL. For details see the update URL templates of the example " @@ -498,10 +497,10 @@ msgstr "" "хоста сервера GnuDIP (как \"example.com\")." #: plinth/modules/dynamicdns/dynamicdns.py:84 -#, fuzzy, python-brace-format +#, python-brace-format msgid "The public domain name you want use to reach your {box_name}." msgstr "" -"Общее доменное имя вы хотите использовать для достижения ваших {box_name}" +"Общее доменное имя вы хотите использовать для подключения к вашим {box_name}." #: plinth/modules/dynamicdns/dynamicdns.py:87 msgid "Use this option if your provider uses self signed certificates." @@ -525,7 +524,7 @@ msgstr "" "настроенный пароль." #: plinth/modules/dynamicdns/dynamicdns.py:96 -#, fuzzy, python-brace-format +#, python-brace-format msgid "" "Optional Value. If your {box_name} is not connected directly to the Internet " "(i.e. connected to a NAT router) this URL is used to figure out the real " @@ -535,7 +534,7 @@ msgstr "" "Необязательное значение. Если ваш {box_name} не подключен непосредственно к " "Интернету, (т.е. подключенный к маршрутизатору) этот URL-адрес используется " "для получения \"белого\" IP. URL-адрес должен просто вернуть IP (пример: " -"http://myip.datasystems24.de)" +"http://myip.datasystems24.de)." #: plinth/modules/dynamicdns/dynamicdns.py:104 msgid "" @@ -646,7 +645,6 @@ msgstr "" "Интернет запрашивает DNS-имя, он получит ваш текущий IP." #: plinth/modules/dynamicdns/templates/dynamicdns.html:50 -#, fuzzy msgid "" "If you are looking for a free dynamic DNS account, you may find a free " "GnuDIP service at gnudip.datasystems24.net или вы можете найти беслатную " "службу обновления URL-адреса на freedns.afraid.org" +"target='_blank'>freedns.afraid.org." #: plinth/modules/dynamicdns/templates/dynamicdns.html:61 #, python-format @@ -683,13 +681,12 @@ msgid "NAT type" msgstr "Тип NAT" #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:29 -#, fuzzy msgid "" "NAT type not detected yet, if you do not provide a \"IP check URL\" we will " "not detect a NAT type." msgstr "" "Тип NAT не обнаружен, если вы не предоставляете «IP проверить URL» мы не " -"можем определить тип NAT." +"можем определить тип NAT." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:35 msgid "Direct connection to the Internet." @@ -1160,7 +1157,7 @@ msgid "Certificates (Let's Encrypt)" msgstr "Сертификаты (Let's Encrypt)" #: plinth/modules/letsencrypt/templates/letsencrypt.html:41 -#, fuzzy, python-format +#, python-format msgid "" "A digital certficate allows users of a web service to verify the identity of " "the service and to securely communicate with it. %(box_name)s can " @@ -2436,7 +2433,6 @@ msgid "Enable repro service" msgstr "Включить службу repro" #: plinth/modules/repro/templates/repro.html:29 -#, fuzzy msgid "" "repro provides various SIP services that a SIP softphone can utilize to " "provide audio and video calls as well as presence and instant messaging. " From 2f3deb1b705a9d7d56499f593715c85fad130f13 Mon Sep 17 00:00:00 2001 From: "Luis A. Arizmendi" Date: Thu, 10 Mar 2016 01:29:05 +0100 Subject: [PATCH 176/189] Translated using Weblate (Spanish) Currently translated at 35.1% (200 of 569 strings) --- plinth/locale/es/LC_MESSAGES/django.po | 253 ++++++++++++++++--------- 1 file changed, 162 insertions(+), 91 deletions(-) diff --git a/plinth/locale/es/LC_MESSAGES/django.po b/plinth/locale/es/LC_MESSAGES/django.po index 8f8e0a930..f97903053 100644 --- a/plinth/locale/es/LC_MESSAGES/django.po +++ b/plinth/locale/es/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-01-31 22:19+0530\n" -"PO-Revision-Date: 2016-03-02 20:06+0000\n" +"PO-Revision-Date: 2016-03-10 01:29+0000\n" "Last-Translator: Luis A. Arizmendi \n" "Language-Team: Spanish " "\n" @@ -45,7 +45,7 @@ msgid "Connect to {host}:{port}" msgstr "Conectar a {host}:{port}" #: plinth/action_utils.py:324 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Cannot connect to {host}:{port}" msgstr "No se pudo conectar a {host}:{port}" @@ -55,9 +55,8 @@ msgid "FreedomBox" msgstr "FreedomBox" #: plinth/modules/apps/apps.py:26 -#, fuzzy msgid "Apps" -msgstr "Apps" +msgstr "Aplicaciones" #: plinth/modules/apps/apps.py:32 plinth/templates/base.html.py:93 msgid "Applications" @@ -79,7 +78,6 @@ msgstr "" "aplicación y decidir si la instala." #: plinth/modules/apps/templates/apps.html:36 -#, fuzzy msgid "" "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 " @@ -231,7 +229,7 @@ msgstr "" #: plinth/modules/config/config.py:105 msgid "Invalid hostname" -msgstr "" +msgstr "Nombre de equipo no válido" #: plinth/modules/config/config.py:108 plinth/modules/config/config.py:153 #: plinth/modules/config/config.py:265 @@ -275,14 +273,13 @@ msgid "General Configuration" msgstr "Configuración general" #: plinth/modules/config/config.py:193 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Error setting hostname: {exception}" -msgstr "Error al definir el hostname: {exception}" +msgstr "Error al definir el nombre del equipo: {exception}" #: plinth/modules/config/config.py:196 -#, fuzzy msgid "Hostname set" -msgstr "Asignar hostname" +msgstr "Asignar nombre de equipo" #: plinth/modules/config/config.py:202 #, python-brace-format @@ -371,8 +368,9 @@ msgid "BitTorrent (Deluge)" msgstr "BitTorrent (Deluge)" #: plinth/modules/deluge/__init__.py:43 +#, fuzzy msgid "Deluge BitTorrent" -msgstr "" +msgstr "Deluge BitTorrent" #: plinth/modules/deluge/forms.py:29 msgid "Enable Deluge" @@ -384,7 +382,7 @@ msgstr "Cliente web de BitTorren (Deluge)" #: plinth/modules/deluge/templates/deluge.html:28 msgid "Deluge is a BitTorrent client that features a Web UI." -msgstr "" +msgstr "Deluge es un cliente BitTorrent con interfaz web." #: plinth/modules/deluge/templates/deluge.html:31 msgid "" @@ -457,9 +455,8 @@ msgid "This module does not support diagnostics" msgstr "Este módulo no soporta diagnósticos" #: plinth/modules/diagnostics/templates/diagnostics_results.html:27 -#, fuzzy msgid "Test" -msgstr "Test" +msgstr "Prueba" #: plinth/modules/diagnostics/templates/diagnostics_results.html:28 msgid "Result" @@ -591,7 +588,7 @@ msgstr "Mostrar clave" #: plinth/modules/dynamicdns/dynamicdns.py:161 msgid "IP check URL" -msgstr "" +msgstr "URL para comprobación de IP" #: plinth/modules/dynamicdns/dynamicdns.py:187 msgid "Please provide update URL or a GnuDIP Server" @@ -690,6 +687,8 @@ msgid "" "NAT type not detected yet, if you do not provide a \"IP check URL\" we will " "not detect a NAT type." msgstr "" +"Tipo de NAT no detectado aún. Si no ha facilitado una \"URL para " +"comprobación de IP\" no se detectará el tipo de NAT." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:35 msgid "Direct connection to the Internet." @@ -703,6 +702,11 @@ msgid "" "changes will not be detected). In case the WAN IP changes, it may take up " "to %(timer)s minutes until your DNS entry is updated." msgstr "" +"Detrás del NAT. El servicio de DNS dinámico consultará los cambios a través " +"de la \"URL para comprobación de IP\" (se necesita el valor de \"URL para " +"comprobación de IP\", de otro modo no se detectarán los cambios de IP). En " +"caso de que cambie la IP WAN, se necesitarán %(timer)s minutos para " +"actualizar su DNS." #: plinth/modules/dynamicdns/templates/dynamicdns_status.html:48 msgid "Last update" @@ -745,35 +749,35 @@ msgstr "" #: plinth/modules/firewall/templates/firewall.html:56 msgid "Service/Port" -msgstr "" +msgstr "Servicio/Puerto" #: plinth/modules/firewall/templates/firewall.html:67 #: plinth/modules/letsencrypt/templates/letsencrypt.html:91 #: plinth/modules/names/templates/names.html:51 msgid "Enabled" -msgstr "" +msgstr "Activado" #: plinth/modules/firewall/templates/firewall.html:70 #: plinth/modules/letsencrypt/templates/letsencrypt.html:93 #: plinth/modules/names/templates/names.html:53 msgid "Disabled" -msgstr "" +msgstr "Desactivado" #: plinth/modules/firewall/templates/firewall.html:81 msgid "Permitted" -msgstr "" +msgstr "Permitido" #: plinth/modules/firewall/templates/firewall.html:84 msgid "Permitted (internal only)" -msgstr "" +msgstr "Permitido (solo interno)" #: plinth/modules/firewall/templates/firewall.html:87 msgid "Permitted (external only)" -msgstr "" +msgstr "Permitido (solo externo)" #: plinth/modules/firewall/templates/firewall.html:90 msgid "Blocked" -msgstr "" +msgstr "Bloqueado" #: plinth/modules/firewall/templates/firewall.html:103 msgid "" @@ -781,28 +785,31 @@ msgid "" "also permitted in the firewall and when you disable a service it is also " "disabled in the firewall." msgstr "" +"La funcionamiento del firewall es automático. Cuando usted activa un " +"servicio este se autoriza en el firewall, y cuando lo desactiva también se " +"desactiva en el firewall." #: plinth/modules/first_boot/forms.py:48 plinth/modules/users/forms.py:70 msgid "Creating LDAP user failed." -msgstr "" +msgstr "Falló la creación de usuario LDAP." #: plinth/modules/first_boot/forms.py:56 msgid "Failed to add new user to admin group." -msgstr "" +msgstr "Falló al añadir usuario nuevo al grupo admin." #: plinth/modules/first_boot/forms.py:78 msgid "User account created, you are now logged in" -msgstr "" +msgstr "Creada cuenta de usuario, ya está usted conectado" #: plinth/modules/first_boot/templates/firstboot_navbar.html:23 #: plinth/modules/help/templates/help_index.html:25 #: plinth/templates/base.html:102 msgid "Help" -msgstr "" +msgstr "Ayuda" #: plinth/modules/first_boot/templates/firstboot_state0.html:45 msgid "Start Setup" -msgstr "" +msgstr "Iniciar configuración" #: plinth/modules/first_boot/templates/firstboot_state0.html:49 #, python-format @@ -810,10 +817,12 @@ msgid "" "To complete the setup of your %(box_name)s, please provide some basic " "information." msgstr "" +"Para completar la configuración de su %(box_name)s, por favor facilite " +"alguna información básica." #: plinth/modules/first_boot/templates/firstboot_state1.html:41 msgid "Administrator Account" -msgstr "" +msgstr "Cuenta de Administrador" #: plinth/modules/first_boot/templates/firstboot_state1.html:44 msgid "" @@ -821,6 +830,9 @@ msgid "" "can be changed later. This user will be granted administrative privileges. " "Other users can be added later." msgstr "" +"Elija un nombre de usuario y una clave para acceder. La clave puede " +"cambiarla más adelante. El usuario disfrutará de privilegios " +"administrativos. Más adelante se pueden añadir otros usuarios." #: plinth/modules/first_boot/templates/firstboot_state1.html:57 msgid "Box it up!" @@ -828,7 +840,7 @@ msgstr "" #: plinth/modules/first_boot/templates/firstboot_state10.html:29 msgid "Setup Complete!" -msgstr "" +msgstr "¡Configuración completada!" #: plinth/modules/first_boot/templates/firstboot_state10.html:32 #, python-format @@ -837,54 +849,59 @@ msgid "" "you need some applications. They will be installed the first time you " "access them." msgstr "" +"La configuración de su %(box_name)s ya está completa. Para que su %(box_name)" +"s sea funcional necesitará algunas aplicaciones, que serán instaladas la " +"primera vez que acceda a ellas." #: plinth/modules/first_boot/templates/firstboot_state10.html:41 msgid "Go to Apps" -msgstr "" +msgstr "Ir a Aplicaciones" #: plinth/modules/first_boot/templates/firstboot_state10.html:44 msgid "Current Network Configuration" -msgstr "" +msgstr "Configuración actual de la red" #: plinth/modules/first_boot/templates/firstboot_state10.html:47 msgid "" "You should check the network setup and modify it if necessary. Do not forget " "to change the default Wi-Fi passwords!" msgstr "" +"Debería comprobar la configuración de la red y modificarla si hace falta. ¡" +"No olvide cambiar la clave Wi-Fi!" #: plinth/modules/first_boot/templates/firstboot_state10.html:57 msgid "Go to Networks" -msgstr "" +msgstr "Ir a redes" #: plinth/modules/first_boot/views.py:60 msgid "Setup Complete" -msgstr "" +msgstr "Configuración completada" #: plinth/modules/help/help.py:34 msgid "Documentation" -msgstr "" +msgstr "Documentación" #: plinth/modules/help/help.py:36 msgid "Where to Get Help" -msgstr "" +msgstr "Dónde obtener ayuda" #: plinth/modules/help/help.py:38 msgid "Manual" -msgstr "" +msgstr "Manual" #: plinth/modules/help/help.py:48 msgid "Documentation and FAQ" -msgstr "" +msgstr "Documentación y Preguntas frecuentes" #: plinth/modules/help/help.py:55 #, python-brace-format msgid "About {box_name}" -msgstr "" +msgstr "Acerca de {box_name}" #: plinth/modules/help/help.py:73 #, python-brace-format msgid "{box_name} Manual" -msgstr "" +msgstr "Manual de {box_name}" #: plinth/modules/help/templates/help_about.html:30 #, python-format @@ -897,6 +914,13 @@ msgid "" "and a Tor relay, on a device that can replace your Wi-Fi router, so that " "your data stays with you." msgstr "" +"%(box_name)s es un proyecto comunitario para diseñar, desarrollar y promover " +"el uso de servidores personales basados en software libre para la " +"comunicación privada personal. Es un dispositivo de red diseñado para " +"conectarse a Internet bajo condiciones de protección de la privacidad y " +"seguridad. Dispone de aplicaciones como blog, wiki, red social, email, web, " +"proxy y servidor Tor, todo ello sobre un equipo que puede reemplazar su " +"router Wi-Fi de forma que sus datos permanezcan con usted." #: plinth/modules/help/templates/help_about.html:43 msgid "" @@ -907,6 +931,13 @@ msgid "" "giving back power to the users over their networks and machines, we are " "returning the Internet to its intended peer-to-peer architecture." msgstr "" +"Estamos en un mundo en el que el uso que hacemos de la red está mediado por " +"aquellos que no siempre tienen las mejores intenciones. Con software que no " +"requiere de un servicio central podemos recuperar el control y la " +"privacidad. Conservando nuestros datos en casa conseguimos protección legal " +"sobre ellos. Al devolverle a los usuarios el control sobre sus redes y " +"equipos tratamos de que Internet vuelva a su arquitectura peer-to-peer " +"original." #: plinth/modules/help/templates/help_about.html:56 #, python-format @@ -915,6 +946,9 @@ msgid "" "services; %(box_name)s aims to bring them all together in a convenient " "package." msgstr "" +"Hay una serie de distintos proyectos trabajando en un futuro de servicios " +"distribuidos. %(box_name)s trata de ofrecerlos juntos y convenientemente " +"empaquetados." #: plinth/modules/help/templates/help_about.html:64 #, python-format @@ -922,20 +956,22 @@ msgid "" "For more information about the %(box_name)s project, see the %(box_name)s Wiki." msgstr "" +"Para ampliar información sobre el proyecto %(box_name)s, consulte la Wiki de %(box_name)s." #: plinth/modules/help/templates/help_about.html:73 msgid "Learn more »" -msgstr "" +msgstr "Aprenda más»" #: plinth/modules/help/templates/help_about.html:76 #, python-format msgid "You are running Plinth version %(version)s." -msgstr "" +msgstr "Está ejecutando Plinth versión %(version)s." #: plinth/modules/help/templates/help_base.html:36 #, python-format msgid "%(box_name)s Setup" -msgstr "" +msgstr "Configuración de %(box_name)s" #: plinth/modules/help/templates/help_index.html:29 #, python-format @@ -943,6 +979,8 @@ msgid "" "The %(box_name)s Manual is the best place to " "start for information regarding %(box_name)s." msgstr "" +"El Manual de %(box_name)s es el mejor punto " +"de partida para conocer su %(box_name)s." #: plinth/modules/help/templates/help_index.html:36 #, python-format @@ -950,6 +988,8 @@ msgid "" " " "%(box_name)s project wiki contains further information." msgstr "" +"La Wiki del " +"proyecto %(box_name)s contiene información adicional." #: plinth/modules/help/templates/help_index.html:43 #, python-format @@ -959,6 +999,10 @@ msgid "" "\"> mailing list. The list archives also contain information about " "problems faced by other users and possible solutions." msgstr "" +"Para obtener ayuda de la comunidad %(box_name)s, las preguntas deben " +"enviarse a la Lista de correo. Esta lista también archiva " +"información sobre problemas y posibles soluciones de otros usuarios." #: plinth/modules/help/templates/help_index.html:53 #, python-format @@ -968,143 +1012,151 @@ msgid "" "oftc.net/?randomnick=1&channels=freedombox&prompt=1\"> #freedombox " "channel using the IRC web interface." msgstr "" +"Muchos de los participantes y usuarios del proyecto %(box_name)s están " +"disponibles en la red IRC irc.oftc.net. Únase y solicite ayuda en el canal " +"#freedombox con la interfaz IRC web." #: plinth/modules/ikiwiki/__init__.py:38 msgid "Wiki and Blog (ikiwiki)" -msgstr "" +msgstr "Wiki y Blog (ikiwiki)" #: plinth/modules/ikiwiki/__init__.py:43 msgid "ikiwiki wikis and blogs" -msgstr "" +msgstr "ikiwiki wikis y blogs" #: plinth/modules/ikiwiki/forms.py:29 msgid "Enable ikiwiki" -msgstr "" +msgstr "Activar ikiwiki" #: plinth/modules/ikiwiki/forms.py:36 #: plinth/modules/networks/templates/connection_show.html:98 msgid "Type" -msgstr "" +msgstr "Tipo" #: plinth/modules/ikiwiki/forms.py:39 #: plinth/modules/networks/templates/connection_show.html:78 msgid "Name" -msgstr "" +msgstr "Nombre" #: plinth/modules/ikiwiki/forms.py:41 msgid "Admin Account Name" -msgstr "" +msgstr "Nombre de la cuenta de administrador" #: plinth/modules/ikiwiki/forms.py:44 msgid "Admin Account Password" -msgstr "" +msgstr "Clave de la cuenta de administrador" #: plinth/modules/ikiwiki/templates/ikiwiki.html:27 msgid "" "When enabled, the blogs and wikis will be available from /ikiwiki." msgstr "" +"Cuando está activada los blogs y wikis están disponibles en /ikiwiki." #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:27 #, python-format msgid "Delete Wiki or Blog %(name)s" -msgstr "" +msgstr "Borrar Wiki o Blog %(name)s" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:33 msgid "" "This action will remove all the posts, pages and comments including revision " "history. Delete this wiki or blog permanently?" msgstr "" +"Esta acción eliminará todas las entradas, páginas y comentarios incluido el " +"historial. ¿Borrar este wiki o blog definitivamente?" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:44 #, python-format msgid "Delete %(name)s" -msgstr "" +msgstr "Borrar %(name)s" #: plinth/modules/ikiwiki/templates/ikiwiki_delete.html:47 #: plinth/modules/monkeysphere/templates/monkeysphere.html:60 #: plinth/modules/networks/templates/connections_delete.html:41 #: plinth/modules/users/templates/users_delete.html:41 msgid "Cancel" -msgstr "" +msgstr "Cancelar" #: plinth/modules/ikiwiki/templates/ikiwiki_manage.html:41 msgid "No wikis or blogs available." -msgstr "" +msgstr "No hay wikis o blogs disponibles." #: plinth/modules/ikiwiki/templates/ikiwiki_manage.html:45 msgid "Create a Wiki or Blog" -msgstr "" +msgstr "Crear un Wiki o Blog" #: plinth/modules/ikiwiki/templates/ikiwiki_manage.html:55 #, python-format msgid "Delete site %(site)s" -msgstr "" +msgstr "Borrar sitio %(site)s" #: plinth/modules/ikiwiki/templates/ikiwiki_manage.html:61 #, python-format msgid "Go to site %(site)s" -msgstr "" +msgstr "Ir al sitio %(site)s" #: plinth/modules/ikiwiki/views.py:38 msgid "Manage" -msgstr "" +msgstr "Gestionar" #: plinth/modules/ikiwiki/views.py:40 msgid "Create" -msgstr "" +msgstr "Crear" #: plinth/modules/ikiwiki/views.py:73 msgid "Wiki and Blog" -msgstr "" +msgstr "Wiki y Blog" #: plinth/modules/ikiwiki/views.py:106 msgid "Manage Wikis and Blogs" -msgstr "" +msgstr "Gestionar Wikis y Blogs" #: plinth/modules/ikiwiki/views.py:132 msgid "Create Wiki or Blog" -msgstr "" +msgstr "Crear Wiki o Blog" #: plinth/modules/ikiwiki/views.py:145 #, python-brace-format msgid "Created wiki {name}." -msgstr "" +msgstr "Wiki {name} creado." #: plinth/modules/ikiwiki/views.py:147 #, python-brace-format msgid "Could not create wiki: {error}" -msgstr "" +msgstr "No se pudo crear el wiki: {error}" #: plinth/modules/ikiwiki/views.py:159 #, python-brace-format msgid "Created blog {name}." -msgstr "" +msgstr "Blog {name} creado." #: plinth/modules/ikiwiki/views.py:161 #, python-brace-format msgid "Could not create blog: {error}" -msgstr "" +msgstr "No se pudo crear el blog: {error}" #: plinth/modules/ikiwiki/views.py:174 #, python-brace-format msgid "{name} deleted." -msgstr "" +msgstr "{name} borrado." #: plinth/modules/ikiwiki/views.py:176 #, python-brace-format msgid "Could not delete {name}: {error}" -msgstr "" +msgstr "No se pudo borrar {name}: {error}" #: plinth/modules/ikiwiki/views.py:182 msgid "Delete Wiki or Blog" -msgstr "" +msgstr "Borrar Wiki o Blog" #: plinth/modules/letsencrypt/__init__.py:43 #: plinth/modules/letsencrypt/templates/letsencrypt.html:38 #: plinth/modules/letsencrypt/views.py:45 msgid "Certificates (Let's Encrypt)" -msgstr "" +msgstr "Certificados (Let's Encrypt)" #: plinth/modules/letsencrypt/templates/letsencrypt.html:41 #, python-format @@ -1115,6 +1167,11 @@ msgid "" "domain. It does so by proving itself to be the owner of a domain to Let's " "Encrypt, a certficate authority (CA)." msgstr "" +"Un certificado digital permite a los usuarios de un servicio web verificar " +"la identidad del servicio y comunicar con él de forma segura. %(box_name)s " +"puede obtener y configurar automáticamente un certificado digital para cada " +"dominio disponible. Lo hace mostrándose a sí mismo como propietario de un " +"dominio a Let's Encrypt, autoridad de certificación (CA)." #: plinth/modules/letsencrypt/templates/letsencrypt.html:52 msgid "" @@ -1123,71 +1180,77 @@ msgid "" "read and agree with the Let's Encrypt Subscriber Agreement before using this service." msgstr "" +"Let's Encrypt es una autoridad de certificación libre, automatizada y " +"abierta, puesta a disposición y por el beneficio público por el ISRG (" +"Internet Security Research Group). Por favor lea y acepte el Acuerdo del suscriptor de Let's " +"Encrypt antes de usar este servicio." #: plinth/modules/letsencrypt/templates/letsencrypt.html:66 #: plinth/modules/monkeysphere/templates/monkeysphere.html:70 msgid "Domain" -msgstr "" +msgstr "Dominio" #: plinth/modules/letsencrypt/templates/letsencrypt.html:67 msgid "Certificate Status" -msgstr "" +msgstr "Estado del certificado" #: plinth/modules/letsencrypt/templates/letsencrypt.html:68 msgid "Website Security" -msgstr "" +msgstr "Seguridad del sitio" #: plinth/modules/letsencrypt/templates/letsencrypt.html:69 #: plinth/modules/monkeysphere/templates/monkeysphere.html:72 msgid "Actions" -msgstr "" +msgstr "Acciones" #: plinth/modules/letsencrypt/templates/letsencrypt.html:79 #, python-format msgid "Expires on %(expiry_date)s" -msgstr "" +msgstr "Expira el %(expiry_date)s" #: plinth/modules/letsencrypt/templates/letsencrypt.html:85 msgid "No certficate" -msgstr "" +msgstr "No certificado" #: plinth/modules/letsencrypt/templates/letsencrypt.html:102 msgid "Revoke" -msgstr "" +msgstr "Revocar" #: plinth/modules/letsencrypt/templates/letsencrypt.html:108 msgid "Re-obtain" -msgstr "" +msgstr "Volver a obtener" #: plinth/modules/letsencrypt/templates/letsencrypt.html:115 msgid "Obtain" -msgstr "" +msgstr "Obtener" #: plinth/modules/letsencrypt/views.py:55 #, python-brace-format msgid "Certificate successfully revoked for domain {domain}" -msgstr "" +msgstr "El certificado para el dominio {domain} ha sido revocado con éxito" #: plinth/modules/letsencrypt/views.py:60 #, python-brace-format msgid "Failed to revoke certificate for domain {domain}: {error}" -msgstr "" +msgstr "Falló la revocación del certificado para el dominio {domain}: {error}" #: plinth/modules/letsencrypt/views.py:72 #, python-brace-format msgid "Certificate successfully obtained for domain {domain}" -msgstr "" +msgstr "Se ha obtenido con éxito el certificado para el dominio {domain}" #: plinth/modules/letsencrypt/views.py:77 #, python-brace-format msgid "Failed to obtain certificate for domain {domain}: {error}" -msgstr "" +msgstr "Falló al obtener el certificado para el dominio {domain}: {error}" #: plinth/modules/monkeysphere/__init__.py:32 #: plinth/modules/monkeysphere/templates/monkeysphere.html:35 #: plinth/modules/monkeysphere/views.py:44 +#, fuzzy msgid "Monkeysphere" -msgstr "" +msgstr "Monkeysphere" #: plinth/modules/monkeysphere/templates/monkeysphere.html:38 msgid "" @@ -1199,39 +1262,47 @@ msgid "" "key signing process. See the Monkeysphere SSH documentation for more details." msgstr "" +"Con Monkeysphere puede crear una clave PGP para cada dominio con acceso SSH " +"configurado. Puede subir la clave PGP pública a un servidor de claves PGP, " +"de esta forma los usuarios que accedan por SSH a su servidor podrán " +"verificar la conexión. Para que los usuarios confíen en la clave, al menos " +"una persona (generalmente el propietario de la máquina) debe firmarla usando " +"el proceso de firmado habitual de PGP. Consulte Documentación de " +"Monkeysphere SSH para más detalles." #: plinth/modules/monkeysphere/templates/monkeysphere.html:53 msgid "Publishing key to keyserver..." -msgstr "" +msgstr "Publicando la clave en el servidor de claves..." #: plinth/modules/monkeysphere/templates/monkeysphere.html:71 msgid "GPG Fingerprint" -msgstr "" +msgstr "Huella digital GPG" #: plinth/modules/monkeysphere/templates/monkeysphere.html:83 #: plinth/modules/names/views.py:45 msgid "Not Available" -msgstr "" +msgstr "No disponible" #: plinth/modules/monkeysphere/templates/monkeysphere.html:93 msgid "Generate PGP Key" -msgstr "" +msgstr "Generar clave PGP" #: plinth/modules/monkeysphere/templates/monkeysphere.html:101 msgid "Publish Key" -msgstr "" +msgstr "Publicar clave" #: plinth/modules/monkeysphere/views.py:58 msgid "Generated PGP key." -msgstr "" +msgstr "Clave PGP generada." #: plinth/modules/monkeysphere/views.py:83 msgid "Cancelled key publishing." -msgstr "" +msgstr "Publicación de clave cancelada." #: plinth/modules/monkeysphere/views.py:120 msgid "Published key to keyserver." -msgstr "" +msgstr "Publicada la clave en el servidor de claves." #: plinth/modules/monkeysphere/views.py:122 msgid "Error occurred while publishing key." From 80bab090bfab458e981d90eecd6a18721da461f1 Mon Sep 17 00:00:00 2001 From: Jallepalli Ashok Kumar Date: Wed, 23 Sep 2015 15:30:31 +0530 Subject: [PATCH 177/189] ttrss: New module for Tiny Tiny RSS feed reader --- actions/ttrss | 59 +++++++++++++++++ data/etc/plinth/modules-enabled/ttrss | 1 + plinth/modules/ttrss/__init__.py | 46 ++++++++++++++ plinth/modules/ttrss/forms.py | 28 +++++++++ plinth/modules/ttrss/templates/ttrss.html | 44 +++++++++++++ plinth/modules/ttrss/tests/__init__.py | 0 plinth/modules/ttrss/urls.py | 28 +++++++++ plinth/modules/ttrss/views.py | 77 +++++++++++++++++++++++ 8 files changed, 283 insertions(+) create mode 100755 actions/ttrss create mode 100644 data/etc/plinth/modules-enabled/ttrss create mode 100644 plinth/modules/ttrss/__init__.py create mode 100644 plinth/modules/ttrss/forms.py create mode 100644 plinth/modules/ttrss/templates/ttrss.html create mode 100644 plinth/modules/ttrss/tests/__init__.py create mode 100644 plinth/modules/ttrss/urls.py create mode 100644 plinth/modules/ttrss/views.py diff --git a/actions/ttrss b/actions/ttrss new file mode 100755 index 000000000..070b9cdcc --- /dev/null +++ b/actions/ttrss @@ -0,0 +1,59 @@ +#!/usr/bin/python3 +# -*- mode: python -*- +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Configuration helper for News Feed Reader (Tiny Tiny RSS) +""" +import argparse + +from plinth import action_utils + + +def parse_arguments(): + """Return parsed command line arguments as dictionary.""" + parser = argparse.ArgumentParser() + subparsers = parser.add_subparsers(dest='subcommand', help='Sub command') + + subparsers.add_parser('enable', help='Enable Tiny Tiny RSS') + subparsers.add_parser('disable', help='Disable Tiny Tiny RSS') + + return parser.parse_args() + + +def subcommand_enable(_): + """Enable web configuration and reload.""" + action_utils.webserver_enable('50-tt-rss') + + +def subcommand_disable(_): + """Disable web configuration and reload.""" + action_utils.webserver_disable('50-tt-rss') + + +def main(): + """Parse arguments and perform all duties.""" + arguments = parse_arguments() + + subcommand = arguments.subcommand.replace('-', '_') + subcommand_method = globals()['subcommand_' + subcommand] + subcommand_method(arguments) + + +if __name__ == '__main__': + main() diff --git a/data/etc/plinth/modules-enabled/ttrss b/data/etc/plinth/modules-enabled/ttrss new file mode 100644 index 000000000..0c9a11e5e --- /dev/null +++ b/data/etc/plinth/modules-enabled/ttrss @@ -0,0 +1 @@ +plinth.modules.ttrss diff --git a/plinth/modules/ttrss/__init__.py b/plinth/modules/ttrss/__init__.py new file mode 100644 index 000000000..b9b8f289e --- /dev/null +++ b/plinth/modules/ttrss/__init__.py @@ -0,0 +1,46 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Plinth module to configure Tiny Tiny RSS +""" + +from gettext import gettext as _ + +from plinth import cfg +from plinth import action_utils + +def init(): + """Intialize Tiny Tiny RSS module.""" + menu = cfg.main_menu.get('apps:index') + menu.add_urlname(_('News Feed Reader (Tiny Tiny RSS)'), 'glyphicon-envelope', + 'ttrss:index', 600) + +depends = ['plinth.modules.apps'] + +def is_enabled(): + """Return whether the module is enabled.""" + return action_utils.webserver_is_enabled('50-tt-rss') + +def diagnose(): + """Run diagnostics and return the results.""" + results = [] + + results.extend(action_utils.diagnose_url_on_all( + 'https://{host}/ttrss', extra_options=['--no-check-certificate'])) + + return results diff --git a/plinth/modules/ttrss/forms.py b/plinth/modules/ttrss/forms.py new file mode 100644 index 000000000..07439c429 --- /dev/null +++ b/plinth/modules/ttrss/forms.py @@ -0,0 +1,28 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Forms for configuring Tiny Tiny RSS +""" + +from django import forms + +class TtrssForm(forms.Form): + """Tiny Tiny RSS configuration form.""" + enabled = forms.BooleanField( + label='Enable Tiny Tiny RSS', + required=False) diff --git a/plinth/modules/ttrss/templates/ttrss.html b/plinth/modules/ttrss/templates/ttrss.html new file mode 100644 index 000000000..b036e9eb9 --- /dev/null +++ b/plinth/modules/ttrss/templates/ttrss.html @@ -0,0 +1,44 @@ +{% extends "base.html" %} + +{% load bootstrap %} + +{% comment %} +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +{% endcomment %} + +{% block content %} + +

News Feed Reader (Tiny Tiny RSS)

+ +

Tiny Tiny RSS is a news feed (RSS/Atom) reader and aggregator, + designed to allow you to read news from any location, while feeling + as close to a real desktop application as possible.

+ +{% include "diagnostics_button.html" with module="ttrss" %} + +

Configuration

+ +
+ {% csrf_token %} + + {{ form|bootstrap }} + + + + +{% endblock %} diff --git a/plinth/modules/ttrss/tests/__init__.py b/plinth/modules/ttrss/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/plinth/modules/ttrss/urls.py b/plinth/modules/ttrss/urls.py new file mode 100644 index 000000000..aca8b1b9d --- /dev/null +++ b/plinth/modules/ttrss/urls.py @@ -0,0 +1,28 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +URLs for the ttrss module +""" + +from django.conf.urls import patterns, url + + +urlpatterns = patterns( + 'plinth.modules.ttrss.views', + url(r'^apps/ttrss/$', 'index', name='index'), + ) diff --git a/plinth/modules/ttrss/views.py b/plinth/modules/ttrss/views.py new file mode 100644 index 000000000..696a7fc51 --- /dev/null +++ b/plinth/modules/ttrss/views.py @@ -0,0 +1,77 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Plinth module for configuring News Feed Reader (Tiny Tiny RSS) +""" + +from django.contrib import messages +from django.template.response import TemplateResponse +from gettext import gettext as _ +import logging + +from plinth import actions +from plinth import package +from plinth.modules import ttrss +from .forms import TtrssForm + +logger = logging.getLogger(__name__) + + +@package.required(['tt-rss']) +def index(request): + """Serve configuration page.""" + status = get_status() + + form = None + + if request.method == 'POST': + form = TtrssForm(request.POST, prefix='ttrss') + if form.is_valid(): + _apply_changes(request, status, form.cleaned_data) + status = get_status() + form = TtrssForm(initial=status, prefix='ttrss') + else: + form = TtrssForm(initial=status, prefix='ttrss') + + return TemplateResponse(request, 'ttrss.html', + {'title': _('News Feed Reader (Tiny Tiny RSS)'), + 'status': status, + 'form': form}) + +def get_status(): + """Get the current status.""" + return {'enabled': ttrss.is_enabled()} + + +def _apply_changes(request, old_status, new_status): + """Apply the changes.""" + modified = False + + if old_status['enabled'] != new_status['enabled']: + sub_command = 'enable' if new_status['enabled'] else 'disable' + actions.superuser_run('ttrss', [sub_command]) + modified = True + + if modified: + messages.success(request, _('Configuration updated')) + else: + messages.info(request, _('Setting unchanged')) + + + + From 15591b79caf411363b4caabd0880068377c288ec Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Wed, 9 Mar 2016 21:23:14 -0500 Subject: [PATCH 178/189] ttrss: Update to use ConfigurationView --- actions/ttrss | 7 ++- plinth/modules/ttrss/__init__.py | 57 ++++++++++++++--- plinth/modules/ttrss/forms.py | 28 --------- plinth/modules/ttrss/templates/ttrss.html | 28 ++++----- plinth/modules/ttrss/urls.py | 14 +++-- plinth/modules/ttrss/views.py | 77 ----------------------- 6 files changed, 74 insertions(+), 137 deletions(-) delete mode 100644 plinth/modules/ttrss/forms.py delete mode 100644 plinth/modules/ttrss/views.py diff --git a/actions/ttrss b/actions/ttrss index 070b9cdcc..43daa2d15 100755 --- a/actions/ttrss +++ b/actions/ttrss @@ -18,8 +18,9 @@ # """ -Configuration helper for News Feed Reader (Tiny Tiny RSS) +Configuration helper for Tiny Tiny RSS. """ + import argparse from plinth import action_utils @@ -30,8 +31,8 @@ def parse_arguments(): parser = argparse.ArgumentParser() subparsers = parser.add_subparsers(dest='subcommand', help='Sub command') - subparsers.add_parser('enable', help='Enable Tiny Tiny RSS') - subparsers.add_parser('disable', help='Disable Tiny Tiny RSS') + subparsers.add_parser('enable', help='Enable Tiny Tiny RSS site') + subparsers.add_parser('disable', help='Disable Tiny Tiny RSS site') return parser.parse_args() diff --git a/plinth/modules/ttrss/__init__.py b/plinth/modules/ttrss/__init__.py index b9b8f289e..920975705 100644 --- a/plinth/modules/ttrss/__init__.py +++ b/plinth/modules/ttrss/__init__.py @@ -16,26 +16,69 @@ # """ -Plinth module to configure Tiny Tiny RSS +Plinth module to configure Tiny Tiny RSS. """ -from gettext import gettext as _ +from django.utils.translation import ugettext_lazy as _ -from plinth import cfg +from plinth import actions from plinth import action_utils +from plinth import cfg +from plinth import service as service_module + + +version = 1 + +depends = ['apps'] + +title = _('News Feed Reader (Tiny Tiny RSS)') + +description = [ + _('Tiny Tiny RSS is a news feed (RSS/Atom) reader and aggregator, ' + 'designed to allow reading news from any location, while feeling as ' + 'close to a real desktop application as possible.'), + + _('When enabled, Tiny Tiny RSS will be available from ' + '/tt-rss path on the web server.'), +] + +service = None + def init(): - """Intialize Tiny Tiny RSS module.""" + """Intialize the module.""" menu = cfg.main_menu.get('apps:index') - menu.add_urlname(_('News Feed Reader (Tiny Tiny RSS)'), 'glyphicon-envelope', - 'ttrss:index', 600) + menu.add_urlname(title, 'glyphicon-envelope', 'ttrss:index', 780) + + global service + service = service_module.Service( + 'tt-rss', title, ['http', 'https'], is_external=True, + enabled=is_enabled()) + + +def setup(helper, old_version=None): + """Install and configure the module.""" + helper.install(['tt-rss']) + helper.call('post', service.notify_enabled, None, True) + + +def get_status(): + """Get the current settings.""" + return {'enabled': is_enabled()} -depends = ['plinth.modules.apps'] def is_enabled(): """Return whether the module is enabled.""" return action_utils.webserver_is_enabled('50-tt-rss') + +def enable(should_enable): + """Enable/disable the module.""" + sub_command = 'enable' if should_enable else 'disable' + actions.superuser_run('ttrss', [sub_command]) + service.notify_enabled(None, should_enable) + + def diagnose(): """Run diagnostics and return the results.""" results = [] diff --git a/plinth/modules/ttrss/forms.py b/plinth/modules/ttrss/forms.py deleted file mode 100644 index 07439c429..000000000 --- a/plinth/modules/ttrss/forms.py +++ /dev/null @@ -1,28 +0,0 @@ -# -# This file is part of Plinth. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# - -""" -Forms for configuring Tiny Tiny RSS -""" - -from django import forms - -class TtrssForm(forms.Form): - """Tiny Tiny RSS configuration form.""" - enabled = forms.BooleanField( - label='Enable Tiny Tiny RSS', - required=False) diff --git a/plinth/modules/ttrss/templates/ttrss.html b/plinth/modules/ttrss/templates/ttrss.html index b036e9eb9..0144ad4dd 100644 --- a/plinth/modules/ttrss/templates/ttrss.html +++ b/plinth/modules/ttrss/templates/ttrss.html @@ -1,7 +1,4 @@ -{% extends "base.html" %} - -{% load bootstrap %} - +{% extends "app.html" %} {% comment %} # # This file is part of Plinth. @@ -21,24 +18,23 @@ # {% endcomment %} -{% block content %} +{% load bootstrap %} +{% load i18n %} -

News Feed Reader (Tiny Tiny RSS)

+{% block configuration %} -

Tiny Tiny RSS is a news feed (RSS/Atom) reader and aggregator, - designed to allow you to read news from any location, while feeling - as close to a real desktop application as possible.

+ {% include "diagnostics_button.html" with module="ttrss" %} -{% include "diagnostics_button.html" with module="ttrss" %} -

Configuration

+

{% trans "Configuration" %}

-
- {% csrf_token %} + + {% csrf_token %} - {{ form|bootstrap }} + {{ form|bootstrap }} - - + + {% endblock %} diff --git a/plinth/modules/ttrss/urls.py b/plinth/modules/ttrss/urls.py index aca8b1b9d..271321841 100644 --- a/plinth/modules/ttrss/urls.py +++ b/plinth/modules/ttrss/urls.py @@ -16,13 +16,15 @@ # """ -URLs for the ttrss module +URLs for the ttrss module. """ -from django.conf.urls import patterns, url +from django.conf.urls import url +from plinth.views import ConfigurationView -urlpatterns = patterns( - 'plinth.modules.ttrss.views', - url(r'^apps/ttrss/$', 'index', name='index'), - ) + +urlpatterns = [ + url(r'^apps/ttrss/$', ConfigurationView.as_view(module_name='ttrss'), + name='index'), +] diff --git a/plinth/modules/ttrss/views.py b/plinth/modules/ttrss/views.py deleted file mode 100644 index 696a7fc51..000000000 --- a/plinth/modules/ttrss/views.py +++ /dev/null @@ -1,77 +0,0 @@ -# -# This file is part of Plinth. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# - -""" -Plinth module for configuring News Feed Reader (Tiny Tiny RSS) -""" - -from django.contrib import messages -from django.template.response import TemplateResponse -from gettext import gettext as _ -import logging - -from plinth import actions -from plinth import package -from plinth.modules import ttrss -from .forms import TtrssForm - -logger = logging.getLogger(__name__) - - -@package.required(['tt-rss']) -def index(request): - """Serve configuration page.""" - status = get_status() - - form = None - - if request.method == 'POST': - form = TtrssForm(request.POST, prefix='ttrss') - if form.is_valid(): - _apply_changes(request, status, form.cleaned_data) - status = get_status() - form = TtrssForm(initial=status, prefix='ttrss') - else: - form = TtrssForm(initial=status, prefix='ttrss') - - return TemplateResponse(request, 'ttrss.html', - {'title': _('News Feed Reader (Tiny Tiny RSS)'), - 'status': status, - 'form': form}) - -def get_status(): - """Get the current status.""" - return {'enabled': ttrss.is_enabled()} - - -def _apply_changes(request, old_status, new_status): - """Apply the changes.""" - modified = False - - if old_status['enabled'] != new_status['enabled']: - sub_command = 'enable' if new_status['enabled'] else 'disable' - actions.superuser_run('ttrss', [sub_command]) - modified = True - - if modified: - messages.success(request, _('Configuration updated')) - else: - messages.info(request, _('Setting unchanged')) - - - - From 47a54fadd1e27bfcc31f1c530fe3479c9fca2ec8 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Thu, 10 Mar 2016 17:04:14 -0500 Subject: [PATCH 179/189] ttrss: Add basic configuration --- actions/ttrss | 35 +++++++++++++++++++++++ plinth/modules/ttrss/__init__.py | 11 +++++-- plinth/modules/ttrss/templates/ttrss.html | 12 ++++++++ 3 files changed, 56 insertions(+), 2 deletions(-) diff --git a/actions/ttrss b/actions/ttrss index 43daa2d15..e20c59c18 100755 --- a/actions/ttrss +++ b/actions/ttrss @@ -22,29 +22,64 @@ Configuration helper for Tiny Tiny RSS. """ import argparse +import augeas from plinth import action_utils +CONFIG_FILE = '/etc/tt-rss/config.php' +DEFAULT_FILE = '/etc/default/tt-rss' + def parse_arguments(): """Return parsed command line arguments as dictionary.""" parser = argparse.ArgumentParser() subparsers = parser.add_subparsers(dest='subcommand', help='Sub command') + subparsers.add_parser('setup', help='Setup Tiny Tiny RSS configuration') subparsers.add_parser('enable', help='Enable Tiny Tiny RSS site') subparsers.add_parser('disable', help='Disable Tiny Tiny RSS site') return parser.parse_args() +def subcommand_setup(_): + """Setup Tiny Tiny RSS configuration.""" + aug = load_augeas() + + aug.set('/files' + DEFAULT_FILE + '/DISABLED', '0') + + for match in aug.match('/files' + CONFIG_FILE + '/define'): + if aug.get(match) == 'SELF_URL_PATH': + aug.set(match + '/value', "'http://localhost/tt-rss/'") + + aug.save() + + action_utils.service_restart('tt-rss') + action_utils.webserver_enable('50-tt-rss') + + def subcommand_enable(_): """Enable web configuration and reload.""" + action_utils.service_enable('tt-rss') action_utils.webserver_enable('50-tt-rss') def subcommand_disable(_): """Disable web configuration and reload.""" action_utils.webserver_disable('50-tt-rss') + action_utils.service_disable('tt-rss') + + +def load_augeas(): + """Initialize Augeas.""" + aug = augeas.Augeas(flags=augeas.Augeas.NO_LOAD + + augeas.Augeas.NO_MODL_AUTOLOAD) + aug.set('/augeas/load/Shellvars/lens', 'Shellvars.lns') + aug.set('/augeas/load/Shellvars/incl[last() + 1]', DEFAULT_FILE) + aug.set('/augeas/load/Phpvars/lens', 'Phpvars.lns') + aug.set('/augeas/load/Phpvars/incl[last() + 1]', CONFIG_FILE) + aug.load() + return aug def main(): diff --git a/plinth/modules/ttrss/__init__.py b/plinth/modules/ttrss/__init__.py index 920975705..e2a29ab8f 100644 --- a/plinth/modules/ttrss/__init__.py +++ b/plinth/modules/ttrss/__init__.py @@ -58,13 +58,15 @@ def init(): def setup(helper, old_version=None): """Install and configure the module.""" - helper.install(['tt-rss']) + helper.install(['tt-rss', 'postgresql', 'dbconfig-pgsql', 'php5-pgsql']) + helper.call('post', actions.superuser_run, 'ttrss', ['setup']) helper.call('post', service.notify_enabled, None, True) def get_status(): """Get the current settings.""" - return {'enabled': is_enabled()} + return {'enabled': is_enabled(), + 'is_running': is_running()} def is_enabled(): @@ -72,6 +74,11 @@ def is_enabled(): return action_utils.webserver_is_enabled('50-tt-rss') +def is_running(): + """Return whether the service is running.""" + return action_utils.service_is_running('tt-rss') + + def enable(should_enable): """Enable/disable the module.""" sub_command = 'enable' if should_enable else 'disable' diff --git a/plinth/modules/ttrss/templates/ttrss.html b/plinth/modules/ttrss/templates/ttrss.html index 0144ad4dd..4cd57ebac 100644 --- a/plinth/modules/ttrss/templates/ttrss.html +++ b/plinth/modules/ttrss/templates/ttrss.html @@ -23,6 +23,18 @@ {% block configuration %} +

{% trans "Status" %}

+ +

+ {% if status.is_running %} + + {% trans "Tiny Tiny RSS feed update service is running" %} + {% else %} + + {% trans "Tiny Tiny RSS feed update service is not running" %} + {% endif %} +

+ {% include "diagnostics_button.html" with module="ttrss" %} From 368e64c5ca9a863bcb4211a9016db57cfdbfa688 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Fri, 11 Mar 2016 17:02:55 -0500 Subject: [PATCH 180/189] ttrss: Use LDAP authentication --- actions/ttrss | 8 +++++--- .../etc/apache2/conf-available/tt-rss-plinth.conf | 15 +++++++++++++++ plinth/modules/ttrss/__init__.py | 7 ++++--- 3 files changed, 24 insertions(+), 6 deletions(-) create mode 100644 data/etc/apache2/conf-available/tt-rss-plinth.conf diff --git a/actions/ttrss b/actions/ttrss index e20c59c18..9622548b8 100755 --- a/actions/ttrss +++ b/actions/ttrss @@ -51,22 +51,24 @@ def subcommand_setup(_): for match in aug.match('/files' + CONFIG_FILE + '/define'): if aug.get(match) == 'SELF_URL_PATH': aug.set(match + '/value', "'http://localhost/tt-rss/'") + elif aug.get(match) == 'PLUGINS': + aug.set(match + '/value', "'auth_remote, note'") aug.save() action_utils.service_restart('tt-rss') - action_utils.webserver_enable('50-tt-rss') + action_utils.webserver_enable('tt-rss-plinth') def subcommand_enable(_): """Enable web configuration and reload.""" action_utils.service_enable('tt-rss') - action_utils.webserver_enable('50-tt-rss') + action_utils.webserver_enable('tt-rss-plinth') def subcommand_disable(_): """Disable web configuration and reload.""" - action_utils.webserver_disable('50-tt-rss') + action_utils.webserver_disable('tt-rss-plinth') action_utils.service_disable('tt-rss') diff --git a/data/etc/apache2/conf-available/tt-rss-plinth.conf b/data/etc/apache2/conf-available/tt-rss-plinth.conf new file mode 100644 index 000000000..41e55d71d --- /dev/null +++ b/data/etc/apache2/conf-available/tt-rss-plinth.conf @@ -0,0 +1,15 @@ +## +## On all sites, provide Tiny Tiny RSS on a default path: /tt-rss +## Allow all valid LDAP users. +## +Alias /tt-rss /usr/share/tt-rss/www + + + AuthType basic + AuthName "FreedomBox Login" + AuthBasicProvider ldap + AuthLDAPUrl "ldap:///ou=users,dc=thisbox?uid" + AuthLDAPGroupAttribute memberUid + AuthLDAPGroupAttributeIsDN off + Require valid-user + diff --git a/plinth/modules/ttrss/__init__.py b/plinth/modules/ttrss/__init__.py index e2a29ab8f..3520f4bee 100644 --- a/plinth/modules/ttrss/__init__.py +++ b/plinth/modules/ttrss/__init__.py @@ -58,7 +58,7 @@ def init(): def setup(helper, old_version=None): """Install and configure the module.""" - helper.install(['tt-rss', 'postgresql', 'dbconfig-pgsql', 'php5-pgsql']) + helper.install(['tt-rss', 'postgresql', 'dbconfig-pgsql', 'php-pgsql']) helper.call('post', actions.superuser_run, 'ttrss', ['setup']) helper.call('post', service.notify_enabled, None, True) @@ -71,7 +71,8 @@ def get_status(): def is_enabled(): """Return whether the module is enabled.""" - return action_utils.webserver_is_enabled('50-tt-rss') + return (action_utils.service_is_enabled('tt-rss') and + action_utils.webserver_is_enabled('tt-rss-plinth')) def is_running(): @@ -91,6 +92,6 @@ def diagnose(): results = [] results.extend(action_utils.diagnose_url_on_all( - 'https://{host}/ttrss', extra_options=['--no-check-certificate'])) + 'https://{host}/tt-rss', extra_options=['--no-check-certificate'])) return results From 4c6d572e6707bf8bb497e47439752501c6c57043 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sat, 12 Mar 2016 17:17:50 +0530 Subject: [PATCH 181/189] ttrss: Ensure database used is PostgreSQL - Installing dbcommon-pgsql and not install dbcommon-mysql does not ensure that PostgreSQL is selected as the database for the application. Set a debconf value to force selection of PostgreSQL. - Minor styling fixes. --- actions/ttrss | 9 +++++++++ plinth/modules/ttrss/__init__.py | 3 ++- plinth/modules/ttrss/urls.py | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/actions/ttrss b/actions/ttrss index 9622548b8..40578cec9 100755 --- a/actions/ttrss +++ b/actions/ttrss @@ -23,6 +23,7 @@ Configuration helper for Tiny Tiny RSS. import argparse import augeas +import subprocess from plinth import action_utils @@ -35,6 +36,7 @@ def parse_arguments(): parser = argparse.ArgumentParser() subparsers = parser.add_subparsers(dest='subcommand', help='Sub command') + subparsers.add_parser('pre-setup', help='Perform pre-setup operations') subparsers.add_parser('setup', help='Setup Tiny Tiny RSS configuration') subparsers.add_parser('enable', help='Enable Tiny Tiny RSS site') subparsers.add_parser('disable', help='Disable Tiny Tiny RSS site') @@ -42,6 +44,13 @@ def parse_arguments(): return parser.parse_args() +def subcommand_pre_setup(_): + """Preseed debconf values before packages are installed.""" + subprocess.check_output( + ['debconf-set-selections'], + input=b'tt-rss tt-rss/database-type string pgsql') + + def subcommand_setup(_): """Setup Tiny Tiny RSS configuration.""" aug = load_augeas() diff --git a/plinth/modules/ttrss/__init__.py b/plinth/modules/ttrss/__init__.py index 3520f4bee..9cb4a6f0c 100644 --- a/plinth/modules/ttrss/__init__.py +++ b/plinth/modules/ttrss/__init__.py @@ -58,6 +58,7 @@ def init(): def setup(helper, old_version=None): """Install and configure the module.""" + helper.call('pre', actions.superuser_run, 'ttrss', ['pre-setup']) helper.install(['tt-rss', 'postgresql', 'dbconfig-pgsql', 'php-pgsql']) helper.call('post', actions.superuser_run, 'ttrss', ['setup']) helper.call('post', service.notify_enabled, None, True) @@ -72,7 +73,7 @@ def get_status(): def is_enabled(): """Return whether the module is enabled.""" return (action_utils.service_is_enabled('tt-rss') and - action_utils.webserver_is_enabled('tt-rss-plinth')) + action_utils.webserver_is_enabled('tt-rss-plinth')) def is_running(): diff --git a/plinth/modules/ttrss/urls.py b/plinth/modules/ttrss/urls.py index 271321841..d758af068 100644 --- a/plinth/modules/ttrss/urls.py +++ b/plinth/modules/ttrss/urls.py @@ -16,7 +16,7 @@ # """ -URLs for the ttrss module. +URLs for the Tiny Tiny RSS module. """ from django.conf.urls import url From 529e6ae05b9162b29cc0303d33c0a53d3e90917b Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sat, 12 Mar 2016 18:36:15 +0530 Subject: [PATCH 182/189] Run Plinth setup during FreedomBox setup Start DBus daemon to ensure PackageKit can use it. Only start if it is not already running. Stop after setup. Stop only if we have started it. --- data/usr/lib/freedombox/setup.d/86_plinth | 34 +++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/data/usr/lib/freedombox/setup.d/86_plinth b/data/usr/lib/freedombox/setup.d/86_plinth index 58f5badcc..2a95237dc 100755 --- a/data/usr/lib/freedombox/setup.d/86_plinth +++ b/data/usr/lib/freedombox/setup.d/86_plinth @@ -16,6 +16,26 @@ # along with this program. If not, see . # +DBUS_STARTED_FOR_PLINTH=false + +start_dbus() { + local return_code + + service dbus status > /dev/null + return_code=$? + + if [ "$return_code" != "0" ]; then + service dbus start + DBUS_STARTED_FOR_PLINTH=true + fi +} + +stop_dbus() { + if [ "$DBUS_STARTED_FOR_PLINTH" = "true" ]; then + service dbus stop + fi +} + # Enable Apache modules required for Plinth. echo "Configuring Apache for Plinth..." @@ -31,3 +51,17 @@ a2ensite plinth.conf a2ensite plinth-ssl.conf echo "Done configuring Apache for Plinth." + +echo "Running Plinth setup..." + +# Ensure that DBus daemon is running so that Plinth can install +# various packages via PackgeKit. +start_dbus + +# Run plinth setup to install various necessary program +plinth --setup + +# Stop DBus daemon if we have not started it +stop_dbus + +echo "Done running Plinth setup." From 767e3c4757f2444489a5ce86750a0f925a2d98ba Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Sat, 12 Mar 2016 16:11:55 -0500 Subject: [PATCH 183/189] dynamicdns: Make corrections to source strings. --- plinth/modules/dynamicdns/__init__.py | 18 ++++++------- plinth/modules/dynamicdns/dynamicdns.py | 26 +++++++++---------- .../dynamicdns/templates/dynamicdns.html | 8 +++--- .../templates/dynamicdns_status.html | 12 ++++----- plinth/modules/networks/networks.py | 2 +- 5 files changed, 33 insertions(+), 33 deletions(-) diff --git a/plinth/modules/dynamicdns/__init__.py b/plinth/modules/dynamicdns/__init__.py index c47942f6e..2c6308614 100644 --- a/plinth/modules/dynamicdns/__init__.py +++ b/plinth/modules/dynamicdns/__init__.py @@ -32,20 +32,20 @@ description = [ format_lazy( - _('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 {box_name}, such as ownCloud.'), + _('If your internet provider changes your IP address periodically ' + '(i.e. every 24h), it may be hard for others to find you on the ' + 'internet. This will prevent others from finding services which are ' + 'provided by this {box_name}.'), box_name=_(cfg.box_name)), _('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 ' + 'internet provider. Dynamic DNS allows you to push your current ' + 'public IP address to a ' ' ' - 'gnudip 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.') + 'GnuDIP server. Afterwards, the server will assign your DNS name ' + 'to the new IP, and if someone from the Internet asks for your DNS ' + 'name, they will get a response with your current IP address.') ] diff --git a/plinth/modules/dynamicdns/dynamicdns.py b/plinth/modules/dynamicdns/dynamicdns.py index b15e49b59..620d0711a 100644 --- a/plinth/modules/dynamicdns/dynamicdns.py +++ b/plinth/modules/dynamicdns/dynamicdns.py @@ -65,7 +65,7 @@ class ConfigureForm(forms.Form): 'see the update URL templates of the example providers.') help_services = \ ugettext_lazy('Please choose an update protocol according to your ' - 'provider. If your provider does not support the GnudIP ' + 'provider. If your provider does not support the GnuDIP ' 'protocol or your provider is not listed you may use the ' 'update URL of your provider.') help_server = \ @@ -73,7 +73,7 @@ class ConfigureForm(forms.Form): '"https://example.com/") but only the hostname of the ' 'GnuDIP server (like "example.com").') help_domain = format_lazy( - ugettext_lazy('The public domain name you want use to reach your ' + ugettext_lazy('The public domain name you want to use to reach your ' '{box_name}.'), box_name=ugettext_lazy(cfg.box_name)) help_disable_ssl = \ ugettext_lazy('Use this option if your provider uses self signed ' @@ -83,18 +83,18 @@ class ConfigureForm(forms.Form): 'will be used for HTTP basic authentication.') help_secret = \ ugettext_lazy('Leave this field empty if you want to keep your ' - 'previous configured password.') + 'current password.') help_ip_url = format_lazy( ugettext_lazy('Optional Value. If your {box_name} is not connected ' 'directly to the Internet (i.e. connected to a NAT ' - 'router) this URL is used to figure out the real ' - 'Internet IP. The URL should simply return the IP where ' + 'router) this URL is used to determine the real ' + 'IP address. The URL should simply return the IP where ' 'the client comes from (example: ' 'http://myip.datasystems24.de).'), box_name=ugettext_lazy(cfg.box_name)) help_user = \ - ugettext_lazy('You should have been requested to select a username ' - 'when you created the account.') + ugettext_lazy('The username that was used when the account was ' + 'created.') """ToDo: sync this list with the html template file""" provider_choices = ( @@ -107,12 +107,12 @@ class ConfigureForm(forms.Form): enabled = forms.BooleanField(label=ugettext_lazy('Enable Dynamic DNS'), required=False) - service_type = forms.ChoiceField(label=ugettext_lazy('Service type'), + service_type = forms.ChoiceField(label=ugettext_lazy('Service Type'), help_text=help_services, choices=provider_choices) dynamicdns_server = TrimmedCharField( - label=ugettext_lazy('GnudIP Server Address'), + label=ugettext_lazy('GnuDIP Server Address'), required=False, help_text=help_server, validators=[ @@ -150,7 +150,7 @@ class ConfigureForm(forms.Form): required=False) dynamicdns_ipurl = TrimmedCharField( - label=ugettext_lazy('IP check URL'), + label=ugettext_lazy('IP Check URL'), required=False, help_text=help_ip_url, validators=[ @@ -176,7 +176,7 @@ def clean(self): # Check if gnudip server or update URL is filled if not dynamicdns_update_url and not dynamicdns_server: raise forms.ValidationError( - _('Please provide update URL or a GnuDIP Server')) + _('Please provide update URL or a GnuDIP server')) if dynamicdns_server and not dynamicdns_user: raise forms.ValidationError(_('Please provide GnuDIP username')) @@ -223,10 +223,10 @@ def statuspage(request): logger.info('Not behind a NAT') if nat_unchecked: - logger.info('Did not check if we are behind a NAT') + logger.info('Did not check if behind a NAT') return TemplateResponse(request, 'dynamicdns_status.html', - {'title': _('Status of Dynamic DNS'), + {'title': _('Dynamic DNS Status'), 'no_nat': no_nat, 'nat_unchecked': nat_unchecked, 'timer': timer, diff --git a/plinth/modules/dynamicdns/templates/dynamicdns.html b/plinth/modules/dynamicdns/templates/dynamicdns.html index 1b3d1bfa7..2e2455394 100644 --- a/plinth/modules/dynamicdns/templates/dynamicdns.html +++ b/plinth/modules/dynamicdns/templates/dynamicdns.html @@ -26,7 +26,7 @@ If you are looking for a free dynamic DNS account, you may find a free GnuDIP service at gnudip.datasystems24.net or you may find - free update URL based services on + free update URL based services at freedns.afraid.org. {% endblocktrans %} @@ -34,9 +34,9 @@

{% blocktrans trimmed %} - If your {{ box_name }} is connected behind some NAT router, don't forget - to add port forwarding (i.e. forward some standard ports like 80 and - 443). + If your {{ box_name }} is connected behind a NAT router, don't forget + to add port forwarding for standard ports, including TCP port 80 (HTTP) + and TCP port 443 (HTTPS). {% endblocktrans %}

{% endblock %} diff --git a/plinth/modules/dynamicdns/templates/dynamicdns_status.html b/plinth/modules/dynamicdns/templates/dynamicdns_status.html index 74ad2d0b1..c0db9296e 100644 --- a/plinth/modules/dynamicdns/templates/dynamicdns_status.html +++ b/plinth/modules/dynamicdns/templates/dynamicdns_status.html @@ -27,18 +27,18 @@

{% trans "NAT type" %}

{% 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. + NAT type was not detected yet. If you do not provide an "IP Check + URL", we will not detect a NAT type. {% endblocktrans %} {% else %} {% if no_nat %} - {% trans "Direct connection to the Internet." %} + {% 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 (the "IP check URL" entry is - needed for this - otherwise IP changes will not be - detected). In case the WAN IP changes, it may take up to + the "IP Check URL" for changes (the "IP Check URL" entry is + needed for this, otherwise IP changes will not be + detected). In case the WAN IP changes, it may take up to {{ timer }} minutes until your DNS entry is updated. {% endblocktrans %} {% endif %} diff --git a/plinth/modules/networks/networks.py b/plinth/modules/networks/networks.py index 522b08aa1..6f354253d 100644 --- a/plinth/modules/networks/networks.py +++ b/plinth/modules/networks/networks.py @@ -87,7 +87,7 @@ def show(request, uuid): device, connection_status['wireless']['ssid']) return TemplateResponse(request, 'connection_show.html', - {'title': _('Show Connection information'), + {'title': _('Show Connection Information'), 'subsubmenu': subsubmenu, 'connection': connection_status, 'active_connection': active_connection_status, From c9b942ed7ae586008f6d49347ecd6b85222cc156 Mon Sep 17 00:00:00 2001 From: cat-git Date: Sun, 17 Jan 2016 13:49:07 +0000 Subject: [PATCH 184/189] get a page up in preparation to display snapper things --- actions/snapper | 60 +++++++++++ data/etc/plinth/modules-enabled/snapper | 1 + plinth/modules/snapper/__init__.py | 76 ++++++++++++++ plinth/modules/snapper/forms.py | 32 ++++++ plinth/modules/snapper/templates/snapper.html | 58 +++++++++++ plinth/modules/snapper/tests/__init__.py | 0 plinth/modules/snapper/urls.py | 28 ++++++ plinth/modules/snapper/views.py | 99 +++++++++++++++++++ 8 files changed, 354 insertions(+) create mode 100644 actions/snapper create mode 100644 data/etc/plinth/modules-enabled/snapper create mode 100644 plinth/modules/snapper/__init__.py create mode 100644 plinth/modules/snapper/forms.py create mode 100644 plinth/modules/snapper/templates/snapper.html create mode 100644 plinth/modules/snapper/tests/__init__.py create mode 100644 plinth/modules/snapper/urls.py create mode 100644 plinth/modules/snapper/views.py diff --git a/actions/snapper b/actions/snapper new file mode 100644 index 000000000..c3bd44d7a --- /dev/null +++ b/actions/snapper @@ -0,0 +1,60 @@ +#!/usr/bin/python3 +# -*- mode: python -*- +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Configuration helper for Snapper. +""" + +import argparse + +from plinth import action_utils + + +def parse_arguments(): + """Return parsed command line arguments as dictionary.""" + parser = argparse.ArgumentParser() + subparsers = parser.add_subparsers(dest='subcommand', help='Sub command') + + subparsers.add_parser('enable', help='Enable Snapper') + subparsers.add_parser('disable', help='Disable Snapper') + + return parser.parse_args() + + +def subcommand_enable(_): + """Start service.""" + action_utils.service_enable('snapper') + + +def subcommand_disable(_): + """Stop service.""" + action_utils.service_disable('snapper') + + +def main(): + """Parse arguments and perform all duties.""" + arguments = parse_arguments() + + subcommand = arguments.subcommand.replace('-', '_') + subcommand_method = globals()['subcommand_' + subcommand] + subcommand_method(arguments) + + +if __name__ == '__main__': + main() diff --git a/data/etc/plinth/modules-enabled/snapper b/data/etc/plinth/modules-enabled/snapper new file mode 100644 index 000000000..77371c54b --- /dev/null +++ b/data/etc/plinth/modules-enabled/snapper @@ -0,0 +1 @@ +plinth.modules.snapper diff --git a/plinth/modules/snapper/__init__.py b/plinth/modules/snapper/__init__.py new file mode 100644 index 000000000..fe06a9103 --- /dev/null +++ b/plinth/modules/snapper/__init__.py @@ -0,0 +1,76 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Plinth module to configure snapper backups +""" + +from django.utils.translation import ugettext_lazy as _ +import subprocess + +from plinth import actions +from plinth import action_utils +from plinth import cfg +from plinth import service as service_module + + +depends = ['plinth.modules.system'] + +service = None + + +def init(): + """Intialize the Snapper module.""" + menu = cfg.main_menu.get('system:index') + menu.add_urlname(_('Backup Freedombox'), 'glyphicon-save', + 'snapper:index', 1000) + + global service + service = service_module.Service( + 'snapper', _('Freedombox Backups'), + is_external=False, enabled=is_enabled()) + + +def is_enabled(): + """Return whether the module is enabled.""" + return action_utils.service_is_enabled('snapper') + + +def is_running(): + """Return whether the service is running.""" + return action_utils.service_is_running('snapper') + + +#def diagnose(): +# """Run diagnostics and return the results.""" +# results = [] +# results.append(_diagnose_ntp_server_count()) +# +# return results +# +# +#def _diagnose_ntp_server_count(): +# """Diagnose minimum NTP server count.""" +# result = 'failed' +# try: +# output = subprocess.check_output(['ntpq', '-n', '-c', 'lpeers']) +# if len(output.decode().splitlines()[2:]): +# result = 'passed' +# except subprocess.CalledProcessError: +# pass +# +# return [_('NTP client in contact with servers'), result] diff --git a/plinth/modules/snapper/forms.py b/plinth/modules/snapper/forms.py new file mode 100644 index 000000000..f0d17d5d5 --- /dev/null +++ b/plinth/modules/snapper/forms.py @@ -0,0 +1,32 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Forms for configuring snapper backups +""" + +from django import forms +from django.utils.translation import ugettext_lazy as _ +import glob +import re + + +class SnapperForm(forms.Form): + """Snapper configuration form.""" + enabled = forms.BooleanField( + label=_('Enable Snapper Backups'), + required=False) diff --git a/plinth/modules/snapper/templates/snapper.html b/plinth/modules/snapper/templates/snapper.html new file mode 100644 index 000000000..7e52a687a --- /dev/null +++ b/plinth/modules/snapper/templates/snapper.html @@ -0,0 +1,58 @@ +{% extends "base.html" %} +{% comment %} +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +{% endcomment %} + +{% load bootstrap %} +{% load i18n %} + +{% block content %} + +

{% trans "Snapper" %}

+ +

+ {% blocktrans trimmed %} + Something about snapper + {% endblocktrans %} +

+ +

{% trans "Status" %}

+ +

+ {% if status.is_running %} + + {% trans "Snapper is running" %} + {% else %} + + {% trans "Snapper is not running" %} + {% endif %} +

+ {% include "diagnostics_button.html" with module="datetime" %} + +

{% trans "Configuration" %}

+ +
+ {% csrf_token %} + + {{ form|bootstrap }} + + + + +{% endblock %} diff --git a/plinth/modules/snapper/tests/__init__.py b/plinth/modules/snapper/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/plinth/modules/snapper/urls.py b/plinth/modules/snapper/urls.py new file mode 100644 index 000000000..07bc27847 --- /dev/null +++ b/plinth/modules/snapper/urls.py @@ -0,0 +1,28 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +URLs for the snapper module +""" + +from django.conf.urls import url + +from . import views + +urlpatterns = [ + url(r'^sys/snapper/$', views.index, name='index'), +] diff --git a/plinth/modules/snapper/views.py b/plinth/modules/snapper/views.py new file mode 100644 index 000000000..d30af23e1 --- /dev/null +++ b/plinth/modules/snapper/views.py @@ -0,0 +1,99 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Plinth module for configuring date and time +""" + +from django.contrib import messages +from django.template.response import TemplateResponse +from django.utils.translation import ugettext as _ +import logging + +from .forms import SnapperForm +from plinth import actions +from plinth import package +from plinth.modules import snapper + +logger = logging.getLogger(__name__) + + +def on_install(): + """Notify that the service is now enabled.""" + snapper.service.notify_enabled(None, True) + + +@package.required(['snapper'], on_install=on_install) +def index(request): + """Serve configuration page.""" + status = get_status() + + form = None + + if request.method == 'POST': + form = SnapperForm(request.POST, prefix='snapper') + # pylint: disable=E1101 + if form.is_valid(): + _apply_changes(request, status, form.cleaned_data) + status = get_status() + form = SnapperForm(initial=status, prefix='snapper') + else: + form = SnapperForm(initial=status, prefix='snapper') + + return TemplateResponse(request, 'snapper.html', + {'title': _('Backup Freedombox'), + 'status': status, + 'form': form}) + + +def get_status(): + """Get the current settings from server.""" + return {'enabled': snapper.is_enabled(), + 'is_running': snapper.is_running(), + 'time_zone': get_current_time_zone()} + + +def get_current_time_zone(): + """Get current time zone.""" + time_zone = open('/etc/timezone').read().rstrip() + return time_zone or 'none' + + +def _apply_changes(request, old_status, new_status): + """Apply the changes.""" + modified = False + + if old_status['enabled'] != new_status['enabled']: + sub_command = 'enable' if new_status['enabled'] else 'disable' + modified = True + actions.superuser_run('snapper', [sub_command]) + snapper.service.notify_enabled(None, new_status['enabled']) + messages.success(request, _('Configuration updated')) + + if old_status['time_zone'] != new_status['time_zone'] and \ + new_status['time_zone'] != 'none': + modified = True + try: + actions.superuser_run('timezone-change', [new_status['time_zone']]) + except Exception as exception: + messages.error(request, _('Error setting time zone: {exception}') + .format(exception=exception)) + else: + messages.success(request, _('Time zone set')) + + if not modified: + messages.info(request, _('Setting unchanged')) From 4bf5dbeb9daf2585937cb00ac498abf2a93d32a6 Mon Sep 17 00:00:00 2001 From: cat-git Date: Sun, 17 Jan 2016 17:35:20 +0000 Subject: [PATCH 185/189] some backups listed on a page, with much spurious code --- actions/snapper | 4 ++++ plinth/action_utils.py | 13 +++++++++++++ plinth/modules/snapper/templates/snapper.html | 12 +++++++++++- plinth/modules/snapper/views.py | 17 +++++++++++++++-- 4 files changed, 43 insertions(+), 3 deletions(-) diff --git a/actions/snapper b/actions/snapper index c3bd44d7a..65dfcb754 100644 --- a/actions/snapper +++ b/actions/snapper @@ -46,6 +46,10 @@ def subcommand_disable(_): """Stop service.""" action_utils.service_disable('snapper') +def subcommand_ls(_): + """List Snapshots.""" + action_utils.get_snapshot_ls() + def main(): """Parse arguments and perform all duties.""" diff --git a/plinth/action_utils.py b/plinth/action_utils.py index c102311a5..eb0cea6c8 100644 --- a/plinth/action_utils.py +++ b/plinth/action_utils.py @@ -351,6 +351,19 @@ def get_ip_addresses(): return addresses +def get_snapper_ls(): + """Return a list of snapshots made by snapper.""" + snapshots = [] + + output = subprocess.check_output(['snapper', '-q', '--iso', 'ls', '-t', 'single']) + for line in output.decode().splitlines(): + parts = line.split('|') + if not parts[0].startswith('-') and not parts[0].startswith('#'): + snapshots.append({'number': parts[0], 'date': parts[1]}) + + return snapshots + + def get_hostname(): """Return the current hostname.""" diff --git a/plinth/modules/snapper/templates/snapper.html b/plinth/modules/snapper/templates/snapper.html index 7e52a687a..cae7c46ee 100644 --- a/plinth/modules/snapper/templates/snapper.html +++ b/plinth/modules/snapper/templates/snapper.html @@ -42,7 +42,7 @@

{% trans "Status" %}

{% trans "Snapper is not running" %} {% endif %}

- {% include "diagnostics_button.html" with module="datetime" %} + {% include "diagnostics_button.html" with module="snapper" %}

{% trans "Configuration" %}

@@ -55,4 +55,14 @@

{% trans "Configuration" %}

value="{% trans "Update setup" %}"/> +

{% trans "Backups" %}

+ +

+ Something about backups + {% for backup in backups %} +

{{ backup.number }}:{{ backup.date }}

+ {% endfor %} +

+ {% endblock %} diff --git a/plinth/modules/snapper/views.py b/plinth/modules/snapper/views.py index d30af23e1..828213ffa 100644 --- a/plinth/modules/snapper/views.py +++ b/plinth/modules/snapper/views.py @@ -23,6 +23,7 @@ from django.template.response import TemplateResponse from django.utils.translation import ugettext as _ import logging +import subprocess from .forms import SnapperForm from plinth import actions @@ -41,6 +42,7 @@ def on_install(): def index(request): """Serve configuration page.""" status = get_status() + backups = get_backups() form = None @@ -57,15 +59,26 @@ def index(request): return TemplateResponse(request, 'snapper.html', {'title': _('Backup Freedombox'), 'status': status, + 'backups': backups, 'form': form}) def get_status(): """Get the current settings from server.""" return {'enabled': snapper.is_enabled(), - 'is_running': snapper.is_running(), - 'time_zone': get_current_time_zone()} + 'is_running': snapper.is_running()} +def get_backups(): + """Get the list of backups from snapper.""" + snapshots = [] + + output = subprocess.check_output(['snapper', '-q', '--iso', 'ls', '-t', 'single']) + for line in output.decode().splitlines(): + parts = line.split('|') + if not parts[0].startswith('-') and not parts[0].startswith('#'): + snapshots.append({'number': parts[0], 'date': parts[1]}) + + return snapshots def get_current_time_zone(): """Get current time zone.""" From 15fa5382900b5a8375dc88a25a6274692370efbb Mon Sep 17 00:00:00 2001 From: cat-git Date: Mon, 25 Jan 2016 22:03:21 +0000 Subject: [PATCH 186/189] action utils is not what we need to list backups --- plinth/action_utils.py | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/plinth/action_utils.py b/plinth/action_utils.py index eb0cea6c8..c102311a5 100644 --- a/plinth/action_utils.py +++ b/plinth/action_utils.py @@ -351,19 +351,6 @@ def get_ip_addresses(): return addresses -def get_snapper_ls(): - """Return a list of snapshots made by snapper.""" - snapshots = [] - - output = subprocess.check_output(['snapper', '-q', '--iso', 'ls', '-t', 'single']) - for line in output.decode().splitlines(): - parts = line.split('|') - if not parts[0].startswith('-') and not parts[0].startswith('#'): - snapshots.append({'number': parts[0], 'date': parts[1]}) - - return snapshots - - def get_hostname(): """Return the current hostname.""" From 5df78ee0050bc9c0afc46b5a2b7faa2d0c9c5951 Mon Sep 17 00:00:00 2001 From: cat-git Date: Mon, 25 Jan 2016 22:04:27 +0000 Subject: [PATCH 187/189] better table layout, more accurate description texts and placeholders for pre-backup situation --- plinth/modules/snapper/templates/snapper.html | 36 ++++++++++++++++--- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/plinth/modules/snapper/templates/snapper.html b/plinth/modules/snapper/templates/snapper.html index cae7c46ee..5b2397ca0 100644 --- a/plinth/modules/snapper/templates/snapper.html +++ b/plinth/modules/snapper/templates/snapper.html @@ -27,7 +27,7 @@

{% trans "Snapper" %}

{% blocktrans trimmed %} - Something about snapper + Snapper creates 'snapshots' or backups of the FreedomBox filesystem on an hourly basis. It enables the option to revert to an earlier configuration. Snapper is not essential. {% endblocktrans %}

@@ -57,12 +57,38 @@

{% trans "Configuration" %}

{% trans "Backups" %}

-

- Something about backups + {% if not backups %} + Backups will be available here once created. + {% endif %} + {% if backups %} +

+
+
{% trans "Domain" %}{% trans "OpenPGP Fingerprint" %}{% trans "Actions" %}
{{ domain.name }} + {% if domain.key %} + + {{ domain.key.pgp_fingerprint }} + + {% else %} + {% trans "Not Available" %} + {% endif %} + + {% if not domain.key %} +
{% csrf_token %}
{% trans "OpenPGP Fingerprint" %} {{ key.openpgp_fingerprint }}
{% trans "OpenPGP Key ID" %}{{ key.pub }}
{% trans "OpenPGP User IDs" %} {{ key.uids|join:', ' }}
+ + + + + + {% for backup in backups %} -

{{ backup.number }}:{{ backup.date }}

+ + + + + {% endfor %} + +
{% trans "Backup number" %}{% trans "Date" %}{% trans "Restore" %}
+
{{ backup.number }}
+
+
{{ backup.date }}
+
+
+
+
+
+ {% endif %}

{% endblock %} From e23c6bd680e0670724225b02c3e7b9610af03647 Mon Sep 17 00:00:00 2001 From: cat-git Date: Mon, 25 Jan 2016 22:05:13 +0000 Subject: [PATCH 188/189] handle the condition where there are no backups --- plinth/modules/snapper/views.py | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/plinth/modules/snapper/views.py b/plinth/modules/snapper/views.py index 828213ffa..389b7c826 100644 --- a/plinth/modules/snapper/views.py +++ b/plinth/modules/snapper/views.py @@ -16,7 +16,7 @@ # """ -Plinth module for configuring date and time +Plinth module for configuring Snapper """ from django.contrib import messages @@ -72,13 +72,17 @@ def get_backups(): """Get the list of backups from snapper.""" snapshots = [] - output = subprocess.check_output(['snapper', '-q', '--iso', 'ls', '-t', 'single']) - for line in output.decode().splitlines(): - parts = line.split('|') - if not parts[0].startswith('-') and not parts[0].startswith('#'): - snapshots.append({'number': parts[0], 'date': parts[1]}) + try: + output = subprocess.check_output(['snapper', '-q', '--iso', 'ls', '-t', 'single']) + for line in output.decode().splitlines(): + parts = line.split('|') + if not parts[0].startswith('-') and not parts[0].startswith('#'): + snapshots.append({'number': parts[0], 'date': parts[1]}) - return snapshots + return snapshots + except subprocess.CalledProcessError: + return False + def get_current_time_zone(): """Get current time zone.""" @@ -97,16 +101,16 @@ def _apply_changes(request, old_status, new_status): snapper.service.notify_enabled(None, new_status['enabled']) messages.success(request, _('Configuration updated')) - if old_status['time_zone'] != new_status['time_zone'] and \ - new_status['time_zone'] != 'none': + if old_status['snapper'] != new_status['snapper'] and \ + new_status['snapper'] != 'none': modified = True try: - actions.superuser_run('timezone-change', [new_status['time_zone']]) + actions.superuser_run('snapper', [new_status['snapper']]) except Exception as exception: - messages.error(request, _('Error setting time zone: {exception}') + messages.error(request, _('Error setting Snapper status: {exception}') .format(exception=exception)) else: - messages.success(request, _('Time zone set')) + messages.success(request, _('Snapper status set')) if not modified: messages.info(request, _('Setting unchanged')) From cba91d9de902e05646b351cda6e2d1de6883fdc6 Mon Sep 17 00:00:00 2001 From: cat-git Date: Sun, 13 Mar 2016 16:30:36 +0000 Subject: [PATCH 189/189] part of converting to new install mech, nothing works --- plinth/modules/snapper/__init__.py | 59 ++++++---- plinth/modules/snapper/forms.py | 12 +- plinth/modules/snapper/templates/snapper.html | 12 ++ plinth/modules/snapper/urls.py | 5 +- plinth/modules/snapper/views.py | 111 +++++------------- plinth/modules/snapper/views.py.old | 105 +++++++++++++++++ 6 files changed, 193 insertions(+), 111 deletions(-) create mode 100644 plinth/modules/snapper/views.py.old diff --git a/plinth/modules/snapper/__init__.py b/plinth/modules/snapper/__init__.py index fe06a9103..0069fadb0 100644 --- a/plinth/modules/snapper/__init__.py +++ b/plinth/modules/snapper/__init__.py @@ -20,15 +20,20 @@ """ from django.utils.translation import ugettext_lazy as _ -import subprocess -from plinth import actions from plinth import action_utils from plinth import cfg from plinth import service as service_module +version = 1 -depends = ['plinth.modules.system'] +depends = ['system'] + +title = _('System Snapshots') + +description = [ + _('Things about snapper and that') +] service = None @@ -36,13 +41,26 @@ def init(): """Intialize the Snapper module.""" menu = cfg.main_menu.get('system:index') - menu.add_urlname(_('Backup Freedombox'), 'glyphicon-save', - 'snapper:index', 1000) + menu.add_urlname(_('System Snapshots'), 'glyphicon-save', + 'snapper:index', 980) global service service = service_module.Service( - 'snapper', _('Freedombox Backups'), - is_external=False, enabled=is_enabled()) + 'snapper', title, is_external=False, enabled=is_enabled()) + + +def setup(helper, old_version=None): + """Install and configure the module.""" + helper.install(['snapper']) + helper.call('post', serice.notify_enabled, None, True) + + +def get_status(): + """Get the current settings from server.""" + return { + 'enabled': is_enabled(), + 'is_running': is_running() + } def is_enabled(): @@ -54,23 +72,12 @@ def is_running(): """Return whether the service is running.""" return action_utils.service_is_running('snapper') +def diagnose(): + """Run diagnostics and return the results.""" + results = [] + results.append(_diagnose_volumes()) -#def diagnose(): -# """Run diagnostics and return the results.""" -# results = [] -# results.append(_diagnose_ntp_server_count()) -# -# return results -# -# -#def _diagnose_ntp_server_count(): -# """Diagnose minimum NTP server count.""" -# result = 'failed' -# try: -# output = subprocess.check_output(['ntpq', '-n', '-c', 'lpeers']) -# if len(output.decode().splitlines()[2:]): -# result = 'passed' -# except subprocess.CalledProcessError: -# pass -# -# return [_('NTP client in contact with servers'), result] + return results + +def _diagnose_volumes(): + return['not implemented'] diff --git a/plinth/modules/snapper/forms.py b/plinth/modules/snapper/forms.py index f0d17d5d5..c8d77ab08 100644 --- a/plinth/modules/snapper/forms.py +++ b/plinth/modules/snapper/forms.py @@ -28,5 +28,15 @@ class SnapperForm(forms.Form): """Snapper configuration form.""" enabled = forms.BooleanField( - label=_('Enable Snapper Backups'), + label=_('Enable System Snapshots'), required=False) + + volume = forms.ChoiceField( + label=_('Volumes'), + help_text=_('Choose a volume to backup.')) + + def __init__(self, *args, **kwargs): + """Initialize the snapper form.""" + forms.Form.__init__(self, *args, **kwargs) + + self.fields['volume'].choices = [('/', 'root'), ('/home', 'home')] diff --git a/plinth/modules/snapper/templates/snapper.html b/plinth/modules/snapper/templates/snapper.html index 5b2397ca0..50083b19b 100644 --- a/plinth/modules/snapper/templates/snapper.html +++ b/plinth/modules/snapper/templates/snapper.html @@ -68,6 +68,7 @@

{% trans "Backups" %}

{% trans "Backup number" %} {% trans "Date" %} {% trans "Restore" %} + {% trans "Delete" %} {% for backup in backups %} @@ -82,6 +83,17 @@

{% trans "Backups" %}

+ +
+ + + + + {% endfor %} diff --git a/plinth/modules/snapper/urls.py b/plinth/modules/snapper/urls.py index 07bc27847..93e5a0550 100644 --- a/plinth/modules/snapper/urls.py +++ b/plinth/modules/snapper/urls.py @@ -21,8 +21,9 @@ from django.conf.urls import url -from . import views +from .views import ConfigurationView urlpatterns = [ - url(r'^sys/snapper/$', views.index, name='index'), + url(r'^sys/snapper/$', ConfigurationView.as_view(module_name='snapper'), + name='index'), ] diff --git a/plinth/modules/snapper/views.py b/plinth/modules/snapper/views.py index 389b7c826..9a099a18b 100644 --- a/plinth/modules/snapper/views.py +++ b/plinth/modules/snapper/views.py @@ -27,90 +27,37 @@ from .forms import SnapperForm from plinth import actions +from plinth import views from plinth import package from plinth.modules import snapper logger = logging.getLogger(__name__) - -def on_install(): - """Notify that the service is now enabled.""" - snapper.service.notify_enabled(None, True) - - -@package.required(['snapper'], on_install=on_install) -def index(request): - """Serve configuration page.""" - status = get_status() - backups = get_backups() - - form = None - - if request.method == 'POST': - form = SnapperForm(request.POST, prefix='snapper') - # pylint: disable=E1101 - if form.is_valid(): - _apply_changes(request, status, form.cleaned_data) - status = get_status() - form = SnapperForm(initial=status, prefix='snapper') - else: - form = SnapperForm(initial=status, prefix='snapper') - - return TemplateResponse(request, 'snapper.html', - {'title': _('Backup Freedombox'), - 'status': status, - 'backups': backups, - 'form': form}) - - -def get_status(): - """Get the current settings from server.""" - return {'enabled': snapper.is_enabled(), - 'is_running': snapper.is_running()} - -def get_backups(): - """Get the list of backups from snapper.""" - snapshots = [] - - try: - output = subprocess.check_output(['snapper', '-q', '--iso', 'ls', '-t', 'single']) - for line in output.decode().splitlines(): - parts = line.split('|') - if not parts[0].startswith('-') and not parts[0].startswith('#'): - snapshots.append({'number': parts[0], 'date': parts[1]}) - - return snapshots - except subprocess.CalledProcessError: - return False - - -def get_current_time_zone(): - """Get current time zone.""" - time_zone = open('/etc/timezone').read().rstrip() - return time_zone or 'none' - - -def _apply_changes(request, old_status, new_status): - """Apply the changes.""" - modified = False - - if old_status['enabled'] != new_status['enabled']: - sub_command = 'enable' if new_status['enabled'] else 'disable' - modified = True - actions.superuser_run('snapper', [sub_command]) - snapper.service.notify_enabled(None, new_status['enabled']) - messages.success(request, _('Configuration updated')) - - if old_status['snapper'] != new_status['snapper'] and \ - new_status['snapper'] != 'none': - modified = True - try: - actions.superuser_run('snapper', [new_status['snapper']]) - except Exception as exception: - messages.error(request, _('Error setting Snapper status: {exception}') - .format(exception=exception)) - else: - messages.success(request, _('Snapper status set')) - - if not modified: - messages.info(request, _('Setting unchanged')) +class ConfigurationView(views.ConfigurationView): + """Serve configuration page.""" + form_class = SnapperForm + + def _apply_changes(request, old_status, new_status): + """Apply the changes.""" + modified = False + + if old_status['enabled'] != new_status['enabled']: + sub_command = 'enable' if new_status['enabled'] else 'disable' + modified = True + actions.superuser_run('snapper', [sub_command]) + snapper.service.notify_enabled(None, new_status['enabled']) + messages.success(request, _('Configuration updated')) + + if old_status['snapper'] != new_status['snapper'] and \ + new_status['snapper'] != 'none': + modified = True + try: + actions.superuser_run('snapper', [new_status['snapper']]) + except Exception as exception: + messages.error(request, _('Error setting Snapper status: {exception}') + .format(exception=exception)) + else: + messages.success(request, _('Snapper status set')) + + if not modified: + messages.info(request, _('Setting unchanged')) \ No newline at end of file diff --git a/plinth/modules/snapper/views.py.old b/plinth/modules/snapper/views.py.old new file mode 100644 index 000000000..28401beb1 --- /dev/null +++ b/plinth/modules/snapper/views.py.old @@ -0,0 +1,105 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Plinth module for configuring Snapper +""" + +from django.contrib import messages +from django.template.response import TemplateResponse +from django.utils.translation import ugettext as _ +import logging +import subprocess + +from .forms import SnapperForm +from plinth import actions +from plinth import package +from plinth.modules import snapper + +logger = logging.getLogger(__name__) + + +def on_install(): + """Notify that the service is now enabled.""" + snapper.service.notify_enabled(None, True) + + +def index(request): + """Serve configuration page.""" + status = snapper.get_status() + backups = get_backups() + + form = None + + if request.method == 'POST': + form = SnapperForm(request.POST, prefix='snapper') + # pylint: disable=E1101 + if form.is_valid(): + _apply_changes(request, status, form.cleaned_data) + status = snapper.get_status() + form = SnapperForm(initial=status, prefix='snapper') + else: + form = SnapperForm(initial=status, prefix='snapper') + + return TemplateResponse(request, 'snapper.html', + {'title': snapper.title, + 'description': snapper.description, + 'status': status, + 'backups': backups, + 'form': form}) + + +def get_backups(): + """Get the list of backups from snapper.""" + snapshots = [] + + try: + output = subprocess.check_output(['snapper', '-q', '--iso', 'ls', '-t', 'single']) + for line in output.decode().splitlines(): + parts = line.split('|') + if not parts[0].startswith('-') and not parts[0].startswith('#'): + snapshots.append({'number': parts[0], 'date': parts[1]}) + + return snapshots + except subprocess.CalledProcessError: + return False + + +def _apply_changes(request, old_status, new_status): + """Apply the changes.""" + modified = False + + if old_status['enabled'] != new_status['enabled']: + sub_command = 'enable' if new_status['enabled'] else 'disable' + modified = True + actions.superuser_run('snapper', [sub_command]) + snapper.service.notify_enabled(None, new_status['enabled']) + messages.success(request, _('Configuration updated')) + + if old_status['snapper'] != new_status['snapper'] and \ + new_status['snapper'] != 'none': + modified = True + try: + actions.superuser_run('snapper', [new_status['snapper']]) + except Exception as exception: + messages.error(request, _('Error setting Snapper status: {exception}') + .format(exception=exception)) + else: + messages.success(request, _('Snapper status set')) + + if not modified: + messages.info(request, _('Setting unchanged'))