From f6130c2335367863f59f6696fb1396af7106bbe7 Mon Sep 17 00:00:00 2001 From: Laouen Fernet <laouen.fernet@supelec.fr> Date: Sun, 5 Aug 2018 18:57:36 +0200 Subject: [PATCH] Translation of logs/ (front) --- logs/acl.py | 5 +- logs/locale/fr/LC_MESSAGES/django.mo | Bin 0 -> 5018 bytes logs/locale/fr/LC_MESSAGES/django.po | 338 +++++++++++++++++++++ logs/templates/logs/aff_stats_general.html | 17 +- logs/templates/logs/aff_stats_logs.html | 60 ++-- logs/templates/logs/aff_stats_models.html | 33 +- logs/templates/logs/aff_stats_users.html | 43 +-- logs/templates/logs/aff_summary.html | 87 +++--- logs/templates/logs/delete.html | 15 +- logs/templates/logs/index.html | 16 +- logs/templates/logs/sidebar.html | 14 +- logs/templates/logs/stats_general.html | 16 +- logs/templates/logs/stats_logs.html | 16 +- logs/templates/logs/stats_models.html | 16 +- logs/templates/logs/stats_users.html | 16 +- logs/views.py | 165 +++++----- 16 files changed, 619 insertions(+), 238 deletions(-) create mode 100644 logs/locale/fr/LC_MESSAGES/django.mo create mode 100644 logs/locale/fr/LC_MESSAGES/django.po diff --git a/logs/acl.py b/logs/acl.py index 1ec227d3..ee9a7b1b 100644 --- a/logs/acl.py +++ b/logs/acl.py @@ -25,6 +25,7 @@ Here are defined some functions to check acl on the application. """ +from django.utils.translation import ugettext as _ def can_view(user): @@ -38,4 +39,6 @@ def can_view(user): viewing is granted and msg is a message (can be None). """ can = user.has_module_perms('admin') - return can, None if can else "Vous ne pouvez pas voir cette application." + return can, None if can else _("You don't have the right to view this" + " application.") + diff --git a/logs/locale/fr/LC_MESSAGES/django.mo b/logs/locale/fr/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..030b0cac0059428ce6aeedd0cde9e2a0d4404c1b GIT binary patch literal 5018 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 literal 0 HcmV?d00001 diff --git a/logs/locale/fr/LC_MESSAGES/django.po b/logs/locale/fr/LC_MESSAGES/django.po new file mode 100644 index 00000000..70c58073 --- /dev/null +++ b/logs/locale/fr/LC_MESSAGES/django.po @@ -0,0 +1,338 @@ +# Re2o est un logiciel d'administration développé initiallement au rezometz. Il +# se veut agnostique au réseau considéré, de manière à être installable en +# quelques clics. +# +# Copyright © 2018 Maël Kervella +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +msgid "" +msgstr "" +"Project-Id-Version: 2.5\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-08-15 20:12+0200\n" +"PO-Revision-Date: 2018-06-23 16:01+0200\n" +"Last-Translator: Laouen Fernet <laouen.fernet@supelec.fr>\n" +"Language-Team: \n" +"Language: fr_FR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: acl.py:42 +msgid "You don't have the right to view this application." +msgstr "Vous n'avez pas le droit de voir cette application." + +#: templates/logs/aff_stats_logs.html:36 +msgid "Edited object" +msgstr "Objet modifié" + +#: templates/logs/aff_stats_logs.html:37 +#: templates/logs/aff_stats_models.html:32 +msgid "Object type" +msgstr "Type d'objet" + +#: templates/logs/aff_stats_logs.html:38 +msgid "Edited by" +msgstr "Modifié par" + +#: templates/logs/aff_stats_logs.html:40 +msgid "Date of editing" +msgstr "Date de modification" + +#: templates/logs/aff_stats_logs.html:42 +msgid "Comment" +msgstr "Commentaire" + +#: templates/logs/aff_stats_logs.html:58 templates/logs/aff_summary.html:62 +#: templates/logs/aff_summary.html:85 templates/logs/aff_summary.html:104 +#: templates/logs/aff_summary.html:123 templates/logs/aff_summary.html:142 +msgid "Cancel" +msgstr "Annuler" + +#: templates/logs/aff_stats_models.html:29 +#, python-format +msgid "Statistics of the set %(key)s" +msgstr "Statistiques de l'ensemble %(key)s" + +#: templates/logs/aff_stats_models.html:33 +msgid "Number of stored entries" +msgstr "Nombre d'entrées enregistrées" + +#: templates/logs/aff_stats_users.html:31 +#, python-format +msgid "Statistics per %(key_dict)s of %(key)s" +msgstr "Statistiques par %(key_dict)s de %(key)s" + +#: templates/logs/aff_stats_users.html:34 +#, python-format +msgid "Number of %(key)s per %(key_dict)s" +msgstr "Nombre de %(key)s par %(key_dict)s" + +#: templates/logs/aff_stats_users.html:35 +msgid "Rank" +msgstr "Rang" + +#: templates/logs/aff_summary.html:37 +msgid "Date" +msgstr "Date" + +#: templates/logs/aff_summary.html:39 +msgid "Editing" +msgstr "Modification" + +#: templates/logs/aff_summary.html:48 +#, python-format +msgid "%(username)s has banned" +msgstr "%(username)s a banni" + +#: templates/logs/aff_summary.html:52 templates/logs/aff_summary.html:75 +msgid "No reason" +msgstr "Aucun motif" + +#: templates/logs/aff_summary.html:71 +#, python-format +msgid "%(username)s has graciously authorised" +msgstr "%(username)s a autorisé gracieusement" + +#: templates/logs/aff_summary.html:94 +#, python-format +msgid "%(username)s has updated" +msgstr "%(username)s a mis à jour" + +#: templates/logs/aff_summary.html:113 +#, python-format +msgid "%(username)s has sold %(number)sx %(name)s to" +msgstr "%(username)s a vendu %(number)sx %(name)s à" + +#: templates/logs/aff_summary.html:116 +#, python-format +msgid "+%(duration)s months" +msgstr "+%(duration)s mois" + +#: templates/logs/aff_summary.html:132 +#, python-format +msgid "%(username)s has edited an interface of" +msgstr "%(username)s a modifié une interface de" + +#: templates/logs/delete.html:29 +msgid "Deletion of actions" +msgstr "Suppression d'actions" + +#: templates/logs/delete.html:35 +#, python-format +msgid "" +"Warning: are you sure you want to delete this action %(objet_name)s " +"( %(objet)s )?" +msgstr "" +"Attention: voulez-vous vraiment supprimer cette action %(objet_name)s " +"( %(objet)s ) ?" + +#: templates/logs/delete.html:36 +msgid "Confirm" +msgstr "Confirmer" + +#: templates/logs/index.html:29 templates/logs/stats_general.html:29 +#: templates/logs/stats_logs.html:29 templates/logs/stats_models.html:29 +#: templates/logs/stats_users.html:29 +msgid "Statistics" +msgstr "Statistiques" + +#: templates/logs/index.html:32 templates/logs/stats_logs.html:32 views.py:403 +msgid "Actions performed" +msgstr "Actions effectuées" + +#: templates/logs/sidebar.html:33 +msgid "Summary" +msgstr "Résumé" + +#: templates/logs/sidebar.html:37 +msgid "Events" +msgstr "Évènements" + +#: templates/logs/sidebar.html:41 +msgid "General" +msgstr "Général" + +#: templates/logs/sidebar.html:45 +msgid "Database" +msgstr "Base de données" + +#: templates/logs/sidebar.html:49 +msgid "Wiring actions" +msgstr "Actions de câblage" + +#: templates/logs/sidebar.html:53 views.py:325 +msgid "Users" +msgstr "Utilisateurs" + +#: templates/logs/stats_general.html:32 +msgid "General statistics" +msgstr "Statistiques générales" + +#: templates/logs/stats_models.html:32 +msgid "Database statistics" +msgstr "Statistiques sur la base de données" + +#: templates/logs/stats_users.html:32 +msgid "Statistics about users" +msgstr "Statistiques sur les utilisateurs" + +#: views.py:191 +msgid "Nonexistent revision." +msgstr "Révision inexistante." + +#: views.py:194 +msgid "The action was deleted." +msgstr "L'action a été supprimée." + +#: views.py:227 +msgid "Category" +msgstr "Catégorie" + +#: views.py:228 +msgid "Number of users (members and clubs)" +msgstr "Nombre d'utilisateurs (adhérents et clubs)" + +#: views.py:229 +msgid "Number of members" +msgstr "Nombre d'adhérents" + +#: views.py:230 +msgid "Number of clubs" +msgstr "Nombre de clubs" + +#: views.py:234 +msgid "Activated users" +msgstr "Utilisateurs activés" + +#: views.py:242 +msgid "Disabled users" +msgstr "Utilisateurs désactivés" + +#: views.py:250 +msgid "Archived users" +msgstr "Utilisateurs archivés" + +#: views.py:258 +msgid "Contributing members" +msgstr "Adhérents cotisants" + +#: views.py:264 +msgid "Users benefiting from a connection" +msgstr "Utilisateurs bénéficiant d'une connexion" + +#: views.py:270 +msgid "Banned users" +msgstr "Utilisateurs bannis" + +#: views.py:276 +msgid "Users benefiting from a free connection" +msgstr "Utilisateurs bénéficiant d'une connexion gratuite" + +#: views.py:282 +msgid "Active interfaces (with access to the network)" +msgstr "Interfaces actives (ayant accès au réseau)" + +#: views.py:292 +msgid "Active interfaces assigned IPv4" +msgstr "Interfaces actives assignées IPv4" + +#: views.py:305 +msgid "IP range" +msgstr "Plage d'IP" + +#: views.py:306 +msgid "VLAN" +msgstr "VLAN" + +#: views.py:307 +msgid "Total number of IP addresses" +msgstr "Nombre total d'adresses IP" + +#: views.py:308 +msgid "Number of assigned IP addresses" +msgstr "Nombre d'adresses IP non assignées" + +#: views.py:309 +msgid "Number of IP address assigned to an activated machine" +msgstr "Nombre d'adresses IP assignées à une machine activée" + +#: views.py:310 +msgid "Number of nonassigned IP addresses" +msgstr "Nombre d'adresses IP non assignées" + +#: views.py:337 +msgid "Subscriptions" +msgstr "Cotisations" + +#: views.py:359 views.py:420 +msgid "Machines" +msgstr "Machines" + +#: views.py:386 +msgid "Topology" +msgstr "Topologie" + +#: views.py:405 +msgid "Number of actions" +msgstr "Nombre d'actions" + +#: views.py:419 views.py:437 views.py:442 views.py:447 views.py:462 +msgid "User" +msgstr "Utilisateur" + +#: views.py:423 +msgid "Invoice" +msgstr "Facture" + +#: views.py:426 +msgid "Ban" +msgstr "Bannissement" + +#: views.py:429 +msgid "Whitelist" +msgstr "Accès gracieux" + +#: views.py:432 +msgid "Rights" +msgstr "Droits" + +#: views.py:436 +msgid "School" +msgstr "Établissement" + +#: views.py:441 +msgid "Payment method" +msgstr "Moyen de paiement" + +#: views.py:446 +msgid "Bank" +msgstr "Banque" + +#: views.py:463 +msgid "Action" +msgstr "Action" + +#: views.py:494 +msgid "No model found." +msgstr "Aucun modèle trouvé." + +#: views.py:500 +msgid "Nonexistent entry." +msgstr "Entrée inexistante." + +#: views.py:507 +msgid "You don't have the right to access this menu." +msgstr "Vous n'avez pas le droit d'accéder à ce menu." diff --git a/logs/templates/logs/aff_stats_general.html b/logs/templates/logs/aff_stats_general.html index 49d067d0..662efa54 100644 --- a/logs/templates/logs/aff_stats_general.html +++ b/logs/templates/logs/aff_stats_general.html @@ -22,7 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. {% endcomment %} - {% for stats in stats_list %} +{% for stats in stats_list %} <table class="table table-striped"> <thead> <tr> @@ -32,11 +32,12 @@ with this program; if not, write to the Free Software Foundation, Inc., </tr> </thead> {% for key, stat in stats.1.items %} - <tr> - {% for item in stat %} - <td>{{ item }}</td> - {% endfor %} - </tr> - {% endfor %} + <tr> + {% for item in stat %} + <td>{{ item }}</td> + {% endfor %} + </tr> + {% endfor %} </table> - {% endfor %} +{% endfor %} + diff --git a/logs/templates/logs/aff_stats_logs.html b/logs/templates/logs/aff_stats_logs.html index 77e9e9b4..1ca79df9 100644 --- a/logs/templates/logs/aff_stats_logs.html +++ b/logs/templates/logs/aff_stats_logs.html @@ -28,39 +28,43 @@ with this program; if not, write to the Free Software Foundation, Inc., {% load logs_extra %} {% load acl %} +{% load i18n %} - <table class="table table-striped"> - <thead> +<table class="table table-striped"> + <thead> + <tr> + <th>{% trans "Edited object" %}</th> + <th>{% trans "Object type" %}</th> + {% trans "Edited by" as tr_edited_by %} + <th>{% include "buttons/sort.html" with prefix='logs' col='author' text=tr_edited_by %}</th> + {% trans "Date of editing" as tr_date_of_editing %} + <th>{% include "buttons/sort.html" with prefix='logs' col='date' text=tr_date_of_editing %}</th> + <th>{% trans "Comment" %}</th> + <th></th> + </tr> + </thead> + {% for revision in revisions_list %} + {% for reversion in revision.version_set.all %} <tr> - <th>Objet modifié</th> - <th>Type de l'objet</th> - <th>{% include "buttons/sort.html" with prefix='logs' col='author' text='Modification par' %}</th> - <th>{% include "buttons/sort.html" with prefix='logs' col='date' text='Date de modification' %}</th> - <th>Commentaire</th> - <th></th> + <td>{{ reversion.object|truncatechars:20 }}</td> + <td>{{ reversion.object|classname }}</td> + <td>{{ revision.user }}</td> + <td>{{ revision.date_created }}</td> + <td>{{ revision.comment }}</td> + {% can_edit_history %} + <td> + <a class="btn btn-danger btn-sm" role="button" href="{% url 'logs:revert-action' revision.id %}"> + <i class="fa fa-times"></i> + {% trans "Cancel" %} + </a> + </td> + {% acl_end %} </tr> - </thead> - {% for revision in revisions_list %} - {% for reversion in revision.version_set.all %} - <tr> - <td>{{ reversion.object|truncatechars:20 }}</td> - <td>{{ reversion.object|classname }}</td> - <td>{{ revision.user }}</td> - <td>{{ revision.date_created }}</td> - <td>{{ revision.comment }}</td> - {% can_edit_history %} - <td> - <a class="btn btn-danger btn-sm" role="button" href="{% url 'logs:revert-action' revision.id %}"> - <i class="fa fa-times"></i> - Annuler - </a> - </td> - {% acl_end %} - </tr> - {% endfor %} {% endfor %} - </table> + {% endfor %} +</table> {% if revisions_list.paginator %} {% include "pagination.html" with list=revisions_list %} {% endif %} + diff --git a/logs/templates/logs/aff_stats_models.html b/logs/templates/logs/aff_stats_models.html index bd035f82..7809dfdf 100644 --- a/logs/templates/logs/aff_stats_models.html +++ b/logs/templates/logs/aff_stats_models.html @@ -22,20 +22,23 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. {% endcomment %} - {% for key, stats in stats_list.items %} +{% load i18n %} + +{% for key, stats in stats_list.items %} <table class="table table-striped"> - <h4>Statistiques de l'ensemble {{ key }}</h4> - <thead> - <tr> - <th>Type d'objet</th> - <th>Nombre d'entrée stockées</th> - </tr> - </thead> - {% for key, stat in stats.items %} - <tr> - <td>{{ stat.0 }}</td> - <td>{{ stat.1 }}</td> - </tr> - {% endfor %} + <h4>{% blocktrans %}Statistics of the set {{ key }}{% endblocktrans %}</h4> + <thead> + <tr> + <th>{% trans "Object type" %}</th> + <th>{% trans "Number of stored entries" %}</th> + </tr> + </thead> + {% for key, stat in stats.items %} + <tr> + <td>{{ stat.0 }}</td> + <td>{{ stat.1 }}</td> + </tr> + {% endfor %} </table> - {% endfor %} +{% endfor %} + diff --git a/logs/templates/logs/aff_stats_users.html b/logs/templates/logs/aff_stats_users.html index f5b21c7e..0ea6a426 100644 --- a/logs/templates/logs/aff_stats_users.html +++ b/logs/templates/logs/aff_stats_users.html @@ -22,24 +22,27 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. {% endcomment %} - {% for key_dict, stats_dict in stats_list.items %} +{% load i18n %} + +{% for key_dict, stats_dict in stats_list.items %} {% for key, stats in stats_dict.items %} - <table class="table table-striped"> - <thead> - <h4>Statistiques par {{ key_dict }} de {{ key }}</h4> - <tr> - <th>{{ key_dict }}</th> - <th>Nombre de {{ key }} par {{ key_dict }}</th> - <th>Rang</th> - </tr> - </thead> - {% for stat in stats %} - <tr> - <td>{{ stat|truncatechars:25 }}</td> - <td>{{ stat.num }}</td> - <td>{{ forloop.counter }}</td> - </tr> - {% endfor %} - </table> - {% endfor %} - {% endfor %} + <table class="table table-striped"> + <thead> + <h4>{% blocktrans %}Statistics per {{ key_dict }} of {{ key }}{% endblocktrans %}</h4> + <tr> + <th>{{ key_dict }}</th> + <th>{% blocktrans %}Number of {{ key }} per {{ key_dict }}{% endblocktrans %}</th> + <th>{% trans "Rank" %}</th> + </tr> + </thead> + {% for stat in stats %} + <tr> + <td>{{ stat|truncatechars:25 }}</td> + <td>{{ stat.num }}</td> + <td>{{ forloop.counter }}</td> + </tr> + {% endfor %} + </table> + {% endfor %} +{% endfor %} + diff --git a/logs/templates/logs/aff_summary.html b/logs/templates/logs/aff_summary.html index f743d637..c9ebfe55 100644 --- a/logs/templates/logs/aff_summary.html +++ b/logs/templates/logs/aff_summary.html @@ -28,122 +28,127 @@ with this program; if not, write to the Free Software Foundation, Inc., {% load logs_extra %} {% load acl %} - <table class="table table-striped"> - <thead> - <tr> - <th>{% include "buttons/sort.html" with prefix='sum' col='date' text='Date' %}</th> - <th>Modification</th> - <th></th> - </tr> - </thead> + +{% load i18n %} + +<table class="table table-striped"> + <thead> + <tr> + {% trans "Date" as tr_date %} + <th>{% include "buttons/sort.html" with prefix='sum' col='date' text=tr_date %}</th> + <th>{% trans "Editing" %}</th> + <th></th> + </tr> + </thead> {% for v in versions_list %} {% if v.version.content_type.model == 'ban' %} <tr class="danger"> <td>{{ v.datetime }}</td> <td> - {{ v.username }} a banni + {% blocktrans with username=v.username %}{{ username }} has banned{% endblocktrans %} <a href="{% url 'users:profil' v.version.object.user_id %}">{{ v.version.object.user.get_username }}</a> - (<i> + (<i> {% if v.version.object.raison == '' %} - Aucune raison + {% trans "No reason" %} {% else %} {{ v.version.object.raison }} {% endif %} </i>) </td> - {% can_edit_history %} + {% can_edit_history %} <td> <a class="btn btn-danger btn-sm" role="button" href="{% url 'logs:revert-action' v.rev_id %}"> <i class="fa fa-times"></i> - Annuler + {% trans "Cancel" %} </a> </td> - {% acl_end %} + {% acl_end %} </tr> {% elif v.version.content_type.model == 'whitelist' %} <tr class="success"> <td>{{ v.datetime }}</td> <td> - {{ v.username }} a autorisé gracieusement + {% blocktrans with username=v.username %}{{ username }} has graciously authorised{% endblocktrans %} <a href="{% url 'users:profil' v.version.object.user_id %}">{{ v.version.object.user.get_username }}</a> (<i> {% if v.version.object.raison == '' %} - Aucune raison + {% trans "No reason" %} {% else %} {{ v.version.object.raison }} {% endif %} </i>) </td> - {% can_edit_history%} + {% can_edit_history%} <td> <a class="btn btn-danger btn-sm" role="button" href="{% url 'logs:revert-action' v.rev_id %}"> <i class="fa fa-times"></i> - Annuler + {% trans "Cancel" %} </a> </td> - {% acl_end %} + {% acl_end %} </tr> {% elif v.version.content_type.model == 'user' %} <tr> <td>{{ v.datetime }}</td> <td> - {{ v.username }} a mis à jour + {% blocktrans with username=v.username %}{{ username }} has updated{% endblocktrans %} <a href="{% url 'users:profil' v.version.object.id %}">{{ v.version.object.get_username }}</a> - {% if v.comment != '' %} - (<i>{{ v.comment }}</i>) - {% endif %} + {% if v.comment != '' %} + (<i>{{ v.comment }}</i>) + {% endif %} </td> - {% can_edit_history %} + {% can_edit_history %} <td> <a class="btn btn-danger btn-sm" role="button" href="{% url 'logs:revert-action' v.rev_id %}"> <i class="fa fa-times"></i> - Annuler + {% trans "Cancel" %} </a> </td> - {% acl_end %} + {% acl_end %} </tr> {% elif v.version.content_type.model == 'vente' %} <tr> <td>{{ v.datetime }}</td> <td> - {{ v.username }} a vendu {{ v.version.object.number }}x {{ v.version.object.name }} à + {% blocktrans with username=v.username number=v.version.object.number name=v.version.object.name %}{{ username }} has sold {{ number }}x {{ name }} to{% endblocktrans %} <a href="{% url 'users:profil' v.version.object.facture.user_id %}">{{ v.version.object.facture.user.get_username }}</a> - {% if v.version.object.iscotisation %} - (<i>+{{ v.version.object.duration }} mois</i>) - {% endif %} + {% if v.version.object.iscotisation %} + (<i>{% blocktrans with duration=v.version.object.duration %}+{{ duration }} months{% endblocktrans %}</i>) + {% endif %} </td> - {% can_edit_history %} + {% can_edit_history %} <td> <a class="btn btn-danger btn-sm" role="button" href="{% url 'logs:revert-action' v.rev_id %}"> <i class="fa fa-times"></i> - Annuler + {% trans "Cancel" %} </a> </td> - {% acl_end %} + {% acl_end %} </tr> {% elif v.version.content_type.model == 'interface' %} <tr> <td>{{ v.datetime }}</td> <td> - {{ v.username }} a modifié une interface de + {% blocktrans with username=v.username %}{{ username }} has edited an interface of{% endblocktrans %} <a href="{% url 'users:profil' v.version.object.machine.user_id %}">{{ v.version.object.machine.user.get_username }}</a> - {% if v.comment != '' %} - (<i>{{ v.comment }}</i>) - {% endif %} + {% if v.comment != '' %} + (<i>{{ v.comment }}</i>) + {% endif %} </td> - {% can_edit_history %} + {% can_edit_history %} <td> <a class="btn btn-danger btn-sm" role="button" href="{% url 'logs:revert-action' v.rev_id %}"> <i class="fa fa-times"></i> - Annuler + {% trans "Cancel" %} </a> </td> - {% acl_end %} + {% acl_end %} </tr> {% endif %} {% endfor %} - </table> +</table> {% if versions_list.paginator %} {% include "pagination.html" with list=versions_list %} {% endif %} + diff --git a/logs/templates/logs/delete.html b/logs/templates/logs/delete.html index 8bda7cb6..6ad11195 100644 --- a/logs/templates/logs/delete.html +++ b/logs/templates/logs/delete.html @@ -24,17 +24,20 @@ with this program; if not, write to the Free Software Foundation, Inc., {% endcomment %} {% load bootstrap3 %} +{% load i18n %} -{% block title %}Supression d'action{% endblock %} +{% block title %}{% trans "Deletion of actions" %}{% endblock %} {% block content %} <form class="form" method="post"> {% csrf_token %} - <h4>Attention, voulez-vous vraiment annuler cette action {{ objet_name }} ( {{ objet }} ) ?</h4> - {% bootstrap_button "Confirmer" button_type="submit" icon="trash" %} + <h4>{% blocktrans %}Warning: are you sure you want to delete this action {{ objet_name }} ( {{ objet }} )?{% endblocktrans %}</h4> + {% trans "Confirm" as tr_confirm %} + {% bootstrap_button tr_confirm button_type="submit" icon="trash" %} </form> - <br /> - <br /> - <br /> + <br /> + <br /> + <br /> {% endblock %} + diff --git a/logs/templates/logs/index.html b/logs/templates/logs/index.html index a120a531..dde47c7d 100644 --- a/logs/templates/logs/index.html +++ b/logs/templates/logs/index.html @@ -24,13 +24,15 @@ with this program; if not, write to the Free Software Foundation, Inc., {% endcomment %} {% load bootstrap3 %} +{% load i18n %} -{% block title %}Statistiques{% endblock %} +{% block title %}{%trans "Statistics" %}{% endblock %} {% block content %} - <h2>Actions effectuées</h2> - {% include "logs/aff_summary.html" with versions_list=versions_list %} - <br /> - <br /> - <br /> - {% endblock %} +<h2>{% trans "Actions performed" %}</h2> + {% include "logs/aff_summary.html" with versions_list=versions_list %} + <br /> + <br /> + <br /> +{% endblock %} + diff --git a/logs/templates/logs/sidebar.html b/logs/templates/logs/sidebar.html index 0e3048e3..87011cfc 100644 --- a/logs/templates/logs/sidebar.html +++ b/logs/templates/logs/sidebar.html @@ -24,32 +24,34 @@ with this program; if not, write to the Free Software Foundation, Inc., {% endcomment %} {% load acl %} +{% load i18n %} {% block sidebar %} {% can_view_app logs %} <a class="list-group-item list-group-item-info" href="{% url "logs:index" %}"> <i class="fa fa-clipboard-list"></i> - Résumé + {% trans "Summary" %} </a> <a class="list-group-item list-group-item-info" href="{% url "logs:stats-logs" %}"> <i class="fa fa-calendar-alt"></i> - Évènements + {% trans "Events" %} </a> <a class="list-group-item list-group-item-info" href="{% url "logs:stats-general" %}"> <i class="fa fa-chart-area"></i> - Général + {% trans "General" %} </a> <a class="list-group-item list-group-item-info" href="{% url "logs:stats-models" %}"> <i class="fa fa-database"></i> - Base de données + {% trans "Database" %} </a> <a class="list-group-item list-group-item-info" href="{% url "logs:stats-actions" %}"> <i class="fa fa-plug"></i> - Actions de cablage + {% trans "Wiring actions" %} </a> <a class="list-group-item list-group-item-info" href="{% url "logs:stats-users" %}"> <i class="fa fa-users"></i> - Utilisateurs + {% trans "Users" %} </a> {% acl_end %} {% endblock %} + diff --git a/logs/templates/logs/stats_general.html b/logs/templates/logs/stats_general.html index b8590df1..07e3ec26 100644 --- a/logs/templates/logs/stats_general.html +++ b/logs/templates/logs/stats_general.html @@ -24,13 +24,15 @@ with this program; if not, write to the Free Software Foundation, Inc., {% endcomment %} {% load bootstrap3 %} +{% load i18n %} -{% block title %}Statistiques générales{% endblock %} +{% block title %}{% trans "Statistics" %}{% endblock %} {% block content %} - <h2>Statistiques générales</h2> - {% include "logs/aff_stats_general.html" with stats_list=stats_list %} - <br /> - <br /> - <br /> - {% endblock %} +<h2>{% trans "General statistics" %}</h2> + {% include "logs/aff_stats_general.html" with stats_list=stats_list %} + <br /> + <br /> + <br /> +{% endblock %} + diff --git a/logs/templates/logs/stats_logs.html b/logs/templates/logs/stats_logs.html index 4db77c68..4f547cc3 100644 --- a/logs/templates/logs/stats_logs.html +++ b/logs/templates/logs/stats_logs.html @@ -24,13 +24,15 @@ with this program; if not, write to the Free Software Foundation, Inc., {% endcomment %} {% load bootstrap3 %} +{% load i18n %} -{% block title %}Statistiques{% endblock %} +{% block title %}{% trans "Statistics" %}{% endblock %} {% block content %} - <h2>Actions effectuées</h2> - {% include "logs/aff_stats_logs.html" with revisions_list=revisions_list %} - <br /> - <br /> - <br /> - {% endblock %} +<h2>{% trans "Actions performed" %}</h2> + {% include "logs/aff_stats_logs.html" with revisions_list=revisions_list %} + <br /> + <br /> + <br /> +{% endblock %} + diff --git a/logs/templates/logs/stats_models.html b/logs/templates/logs/stats_models.html index 0ed28525..9b912da2 100644 --- a/logs/templates/logs/stats_models.html +++ b/logs/templates/logs/stats_models.html @@ -24,13 +24,15 @@ with this program; if not, write to the Free Software Foundation, Inc., {% endcomment %} {% load bootstrap3 %} +{% load i18n %} -{% block title %}Statistiques des objets base de données{% endblock %} +{% block title %}{% trans "Statistics" %}{% endblock %} {% block content %} - <h2>Statistiques bdd</h2> - {% include "logs/aff_stats_models.html" with stats_list=stats_list %} - <br /> - <br /> - <br /> - {% endblock %} +<h2>{% trans "Database statistics" %}</h2> + {% include "logs/aff_stats_models.html" with stats_list=stats_list %} + <br /> + <br /> + <br /> +{% endblock %} + diff --git a/logs/templates/logs/stats_users.html b/logs/templates/logs/stats_users.html index fa0843ec..8cc645ab 100644 --- a/logs/templates/logs/stats_users.html +++ b/logs/templates/logs/stats_users.html @@ -24,13 +24,15 @@ with this program; if not, write to the Free Software Foundation, Inc., {% endcomment %} {% load bootstrap3 %} +{% load i18n %} -{% block title %}Statistiques par utilisateur{% endblock %} +{% block title %}{% trans "Statistics" %}{% endblock %} {% block content %} - <h2>Statistiques par utilisateur</h2> - {% include "logs/aff_stats_users.html" with stats_list=stats_list %} - <br /> - <br /> - <br /> - {% endblock %} +<h2>{% trans "Statistics about users" %}</h2> + {% include "logs/aff_stats_users.html" with stats_list=stats_list %} + <br /> + <br /> + <br /> +{% endblock %} + diff --git a/logs/views.py b/logs/views.py index d7ba59f3..a9fe5418 100644 --- a/logs/views.py +++ b/logs/views.py @@ -188,10 +188,10 @@ def revert_action(request, revision_id): try: revision = Revision.objects.get(id=revision_id) except Revision.DoesNotExist: - messages.error(request, u"Revision inexistante") + messages.error(request, _("Nonexistent revision.")) if request.method == "POST": revision.revert() - messages.success(request, "L'action a été supprimée") + messages.success(request, _("The action was deleted.")) return redirect(reverse('logs:index')) return form({ 'objet': revision, @@ -224,14 +224,14 @@ def stats_general(request): stats = [ [ # First set of data (about users) [ # Headers - "Categorie", - "Nombre d'utilisateurs (total club et adhérents)", - "Nombre d'adhérents", - "Nombre de clubs" + _("Category"), + _("Number of users (members and clubs)"), + _("Number of members"), + _("Number of clubs") ], { # Data 'active_users': [ - "Users actifs", + _("Activated users"), User.objects.filter(state=User.STATE_ACTIVE).count(), (Adherent.objects .filter(state=Adherent.STATE_ACTIVE) @@ -239,7 +239,7 @@ def stats_general(request): Club.objects.filter(state=Club.STATE_ACTIVE).count() ], 'inactive_users': [ - "Users désactivés", + _("Disabled users"), User.objects.filter(state=User.STATE_DISABLED).count(), (Adherent.objects .filter(state=Adherent.STATE_DISABLED) @@ -247,7 +247,7 @@ def stats_general(request): Club.objects.filter(state=Club.STATE_DISABLED).count() ], 'archive_users': [ - "Users archivés", + _("Archived users"), User.objects.filter(state=User.STATE_ARCHIVE).count(), (Adherent.objects .filter(state=Adherent.STATE_ARCHIVE) @@ -255,31 +255,31 @@ def stats_general(request): Club.objects.filter(state=Club.STATE_ARCHIVE).count() ], 'adherent_users': [ - "Cotisant à l'association", + _("Contributing members"), _all_adherent.count(), _all_adherent.exclude(adherent__isnull=True).count(), _all_adherent.exclude(club__isnull=True).count() ], 'connexion_users': [ - "Utilisateurs bénéficiant d'une connexion", + _("Users benefiting from a connection"), _all_has_access.count(), _all_has_access.exclude(adherent__isnull=True).count(), _all_has_access.exclude(club__isnull=True).count() ], 'ban_users': [ - "Utilisateurs bannis", + _("Banned users"), _all_baned.count(), _all_baned.exclude(adherent__isnull=True).count(), _all_baned.exclude(club__isnull=True).count() ], 'whitelisted_user': [ - "Utilisateurs bénéficiant d'une connexion gracieuse", + _("Users benefiting from a free connection"), _all_whitelisted.count(), _all_whitelisted.exclude(adherent__isnull=True).count(), _all_whitelisted.exclude(club__isnull=True).count() ], 'actives_interfaces': [ - "Interfaces actives (ayant accès au reseau)", + _("Active interfaces (with access to the network)"), _all_active_interfaces_count.count(), (_all_active_interfaces_count .exclude(machine__user__adherent__isnull=True) @@ -289,7 +289,7 @@ def stats_general(request): .count()) ], 'actives_assigned_interfaces': [ - "Interfaces actives et assignées ipv4", + _("Active interfaces assigned IPv4"), _all_active_assigned_interfaces_count.count(), (_all_active_assigned_interfaces_count .exclude(machine__user__adherent__isnull=True) @@ -302,12 +302,12 @@ def stats_general(request): ], [ # Second set of data (about ip adresses) [ # Headers - "Range d'ip", - "Vlan", - "Nombre d'ip totales", - "Ip assignées", - "Ip assignées à une machine active", - "Ip non assignées" + _("IP range"), + _("VLAN"), + _("Total number of IP addresses"), + _("Number of assigned IP addresses"), + _("Number of IP address assigned to an activated machine"), + _("Number of nonassigned IP addresses") ], ip_dict # Data already prepared ] @@ -322,79 +322,87 @@ def stats_models(request): nombre d'users, d'écoles, de droits, de bannissements, de factures, de ventes, de banque, de machines, etc""" stats = { - 'Users': { - 'users': [User.PRETTY_NAME, User.objects.count()], - 'adherents': [Adherent.PRETTY_NAME, Adherent.objects.count()], - 'clubs': [Club.PRETTY_NAME, Club.objects.count()], - 'serviceuser': [ServiceUser.PRETTY_NAME, + _("Users"): { + 'users': [User._meta.verbose_name, User.objects.count()], + 'adherents': [Adherent._meta.verbose_name, Adherent.objects.count()], + 'clubs': [Club._meta.verbose_name, Club.objects.count()], + 'serviceuser': [ServiceUser._meta.verbose_name, ServiceUser.objects.count()], - 'school': [School.PRETTY_NAME, School.objects.count()], - 'listright': [ListRight.PRETTY_NAME, ListRight.objects.count()], - 'listshell': [ListShell.PRETTY_NAME, ListShell.objects.count()], - 'ban': [Ban.PRETTY_NAME, Ban.objects.count()], - 'whitelist': [Whitelist.PRETTY_NAME, Whitelist.objects.count()] + 'school': [School._meta.verbose_name, School.objects.count()], + 'listright': [ListRight._meta.verbose_name, ListRight.objects.count()], + 'listshell': [ListShell._meta.verbose_name, ListShell.objects.count()], + 'ban': [Ban._meta.verbose_name, Ban.objects.count()], + 'whitelist': [Whitelist._meta.verbose_name, Whitelist.objects.count()] }, - 'Cotisations': { + _("Subscriptions"): { 'factures': [ - Facture._meta.verbose_name.title(), + Facture._meta.verbose_name, Facture.objects.count() ], 'vente': [ - Vente._meta.verbose_name.title(), + Vente._meta.verbose_name, Vente.objects.count() ], 'cotisation': [ - Cotisation._meta.verbose_name.title(), + Cotisation._meta.verbose_name, Cotisation.objects.count() ], 'article': [ - Article._meta.verbose_name.title(), + Article._meta.verbose_name, Article.objects.count() ], 'banque': [ - Banque._meta.verbose_name.title(), + Banque._meta.verbose_name, Banque.objects.count() ], }, - 'Machines': { - 'machine': [Machine.PRETTY_NAME, Machine.objects.count()], - 'typemachine': [MachineType.PRETTY_NAME, + _("Machines"): { + 'machine': [Machine._meta.verbose_name, + Machine.objects.count()], + 'typemachine': [MachineType._meta.verbose_name, MachineType.objects.count()], - 'typeip': [IpType.PRETTY_NAME, IpType.objects.count()], - 'extension': [Extension.PRETTY_NAME, Extension.objects.count()], - 'interface': [Interface.PRETTY_NAME, Interface.objects.count()], - 'alias': [Domain.PRETTY_NAME, + 'typeip': [IpType._meta.verbose_name, + IpType.objects.count()], + 'extension': [Extension._meta.verbose_name, + Extension.objects.count()], + 'interface': [Interface._meta.verbose_name, + Interface.objects.count()], + 'alias': [Domain._meta.verbose_name, Domain.objects.exclude(cname=None).count()], - 'iplist': [IpList.PRETTY_NAME, IpList.objects.count()], - 'service': [Service.PRETTY_NAME, Service.objects.count()], + 'iplist': [IpList._meta.verbose_name, + IpList.objects.count()], + 'service': [Service._meta.verbose_name, + Service.objects.count()], 'ouvertureportlist': [ - OuverturePortList.PRETTY_NAME, + OuverturePortList._meta.verbose_name, OuverturePortList.objects.count() ], - 'vlan': [Vlan.PRETTY_NAME, Vlan.objects.count()], - 'SOA': [SOA.PRETTY_NAME, SOA.objects.count()], - 'Mx': [Mx.PRETTY_NAME, Mx.objects.count()], - 'Ns': [Ns.PRETTY_NAME, Ns.objects.count()], - 'nas': [Nas.PRETTY_NAME, Nas.objects.count()], + 'vlan': [Vlan._meta.verbose_name, Vlan.objects.count()], + 'SOA': [SOA._meta.verbose_name, SOA.objects.count()], + 'Mx': [Mx._meta.verbose_name, Mx.objects.count()], + 'Ns': [Ns._meta.verbose_name, Ns.objects.count()], + 'nas': [Nas._meta.verbose_name, Nas.objects.count()], }, - 'Topologie': { - 'switch': [Switch.PRETTY_NAME, Switch.objects.count()], - 'bornes': [AccessPoint.PRETTY_NAME, AccessPoint.objects.count()], - 'port': [Port.PRETTY_NAME, Port.objects.count()], - 'chambre': [Room.PRETTY_NAME, Room.objects.count()], - 'stack': [Stack.PRETTY_NAME, Stack.objects.count()], + _("Topology"): { + 'switch': [Switch._meta.verbose_name, + Switch.objects.count()], + 'bornes': [AccessPoint._meta.verbose_name, + AccessPoint.objects.count()], + 'port': [Port._meta.verbose_name, Port.objects.count()], + 'chambre': [Room._meta.verbose_name, Room.objects.count()], + 'stack': [Stack._meta.verbose_name, Stack.objects.count()], 'modelswitch': [ - ModelSwitch.PRETTY_NAME, + ModelSwitch._meta.verbose_name, ModelSwitch.objects.count() ], 'constructorswitch': [ - ConstructorSwitch.PRETTY_NAME, + ConstructorSwitch._meta.verbose_name, ConstructorSwitch.objects.count() ], }, - 'Actions effectuées sur la base': + _("Actions performed"): { - 'revision': ["Nombre d'actions", Revision.objects.count()], + 'revision': [_("Number of actions"), Revision.objects.count()], }, } return render(request, 'logs/stats_models.html', {'stats_list': stats}) @@ -408,35 +416,35 @@ def stats_users(request): de moyens de paiements par user, de banque par user, de bannissement par user, etc""" stats = { - 'Utilisateur': { - 'Machines': User.objects.annotate( + _("User"): { + _("Machines"): User.objects.annotate( num=Count('machine') ).order_by('-num')[:10], - 'Facture': User.objects.annotate( + _("Invoice"): User.objects.annotate( num=Count('facture') ).order_by('-num')[:10], - 'Bannissement': User.objects.annotate( + _("Ban"): User.objects.annotate( num=Count('ban') ).order_by('-num')[:10], - 'Accès gracieux': User.objects.annotate( + _("Whitelist"): User.objects.annotate( num=Count('whitelist') ).order_by('-num')[:10], - 'Droits': User.objects.annotate( + _("Rights"): User.objects.annotate( num=Count('groups') ).order_by('-num')[:10], }, - 'Etablissement': { - 'Utilisateur': School.objects.annotate( + _("School"): { + _("User"): School.objects.annotate( num=Count('user') ).order_by('-num')[:10], }, - 'Moyen de paiement': { - 'Utilisateur': Paiement.objects.annotate( + _("Payment method"): { + _("User"): Paiement.objects.annotate( num=Count('facture') ).order_by('-num')[:10], }, - 'Banque': { - 'Utilisateur': Banque.objects.annotate( + _("Bank"): { + _("User"): Banque.objects.annotate( num=Count('facture') ).order_by('-num')[:10], }, @@ -451,8 +459,8 @@ def stats_actions(request): utilisateurs. Affiche le nombre de modifications aggrégées par utilisateurs""" stats = { - 'Utilisateur': { - 'Action': User.objects.annotate( + _("User"): { + _("Action"): User.objects.annotate( num=Count('revision') ).order_by('-num')[:40], }, @@ -489,14 +497,14 @@ def history(request, application, object_name, object_id): try: instance = model.get_instance(**kwargs) except model.DoesNotExist: - messages.error(request, _("No entry found.")) + messages.error(request, _("Nonexistent entry.")) return redirect(reverse( 'users:profil', kwargs={'userid': str(request.user.id)} )) can, msg = instance.can_view(request.user) if not can: - messages.error(request, msg or _("You cannot acces to this menu")) + messages.error(request, msg or _("You don't have the right to access this menu.")) return redirect(reverse( 'users:profil', kwargs={'userid': str(request.user.id)} @@ -513,3 +521,4 @@ def history(request, application, object_name, object_id): 're2o/history.html', {'reversions': reversions, 'object': instance} ) +