diff --git a/cotisations/acl.py b/cotisations/acl.py index aa98c32a..06c62fb8 100644 --- a/cotisations/acl.py +++ b/cotisations/acl.py @@ -42,4 +42,5 @@ def can_view(user): if can: return can, None else: - return can, _("You don't have the rights to see this application.") + return can, _("You don't have the right to view this application.") + diff --git a/cotisations/forms.py b/cotisations/forms.py index 244b1c13..341ccc4c 100644 --- a/cotisations/forms.py +++ b/cotisations/forms.py @@ -40,8 +40,8 @@ from django import forms from django.db.models import Q from django.forms import ModelForm, Form from django.core.validators import MinValueValidator -from django.utils.translation import ugettext as _ -from django.utils.translation import ugettext_lazy as _l + +from django.utils.translation import ugettext_lazy as _ from django.shortcuts import get_object_or_404 from re2o.field_permissions import FieldPermissionFormMixin @@ -93,11 +93,11 @@ class SelectUserArticleForm(FormRevMixin, Form): queryset=Article.objects.filter( Q(type_user='All') | Q(type_user='Adherent') ), - label=_l("Article"), + label=_("Article"), required=True ) quantity = forms.IntegerField( - label=_l("Quantity"), + label=_("Quantity"), validators=[MinValueValidator(1)], required=True ) @@ -117,11 +117,11 @@ class SelectClubArticleForm(Form): queryset=Article.objects.filter( Q(type_user='All') | Q(type_user='Club') ), - label=_l("Article"), + label=_("Article"), required=True ) quantity = forms.IntegerField( - label=_l("Quantity"), + label=_("Quantity"), validators=[MinValueValidator(1)], required=True ) @@ -161,7 +161,7 @@ class DelArticleForm(FormRevMixin, Form): """ articles = forms.ModelMultipleChoiceField( queryset=Article.objects.none(), - label=_l("Existing articles"), + label=_("Available articles"), widget=forms.CheckboxSelectMultiple ) @@ -201,7 +201,7 @@ class DelPaiementForm(FormRevMixin, Form): # TODO : change paiement to payment paiements = forms.ModelMultipleChoiceField( queryset=Paiement.objects.none(), - label=_l("Existing payment method"), + label=_("Available payment methods"), widget=forms.CheckboxSelectMultiple ) @@ -239,7 +239,7 @@ class DelBanqueForm(FormRevMixin, Form): # TODO : change banque to bank banques = forms.ModelMultipleChoiceField( queryset=Banque.objects.none(), - label=_l("Existing banks"), + label=_("Available banks"), widget=forms.CheckboxSelectMultiple ) @@ -258,13 +258,13 @@ class RechargeForm(FormRevMixin, Form): Form used to refill a user's balance """ value = forms.FloatField( - label=_l("Amount"), + label=_("Amount"), min_value=0.01, validators=[] ) payment = forms.ModelChoiceField( queryset=Paiement.objects.none(), - label=_l("Payment method") + label=_("Payment method") ) def __init__(self, *args, user=None, **kwargs): @@ -290,3 +290,4 @@ class RechargeForm(FormRevMixin, Form): } ) return self.cleaned_data + diff --git a/cotisations/locale/fr/LC_MESSAGES/django.mo b/cotisations/locale/fr/LC_MESSAGES/django.mo index 046a9b9b..b5a65357 100644 Binary files a/cotisations/locale/fr/LC_MESSAGES/django.mo and b/cotisations/locale/fr/LC_MESSAGES/django.mo differ diff --git a/cotisations/locale/fr/LC_MESSAGES/django.po b/cotisations/locale/fr/LC_MESSAGES/django.po index f9aee64d..129d4d72 100644 --- a/cotisations/locale/fr/LC_MESSAGES/django.po +++ b/cotisations/locale/fr/LC_MESSAGES/django.po @@ -21,24 +21,23 @@ msgid "" msgstr "" "Project-Id-Version: 2.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-07-25 23:22+0200\n" +"POT-Creation-Date: 2018-08-18 13:17+0200\n" "PO-Revision-Date: 2018-03-31 16:09+0002\n" -"Last-Translator: Hugo Levy-Falk \n" -"Language-Team: \n" +"Last-Translator: Laouen Fernet \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:45 -msgid "You don't have the rights to see this application." -msgstr "Vous n'avez pas les droits de voir cette application." +msgid "You don't have the right to view this application." +msgstr "Vous n'avez pas le droit de voir cette application." #: forms.py:63 forms.py:274 msgid "Select a payment method" msgstr "Sélectionnez un moyen de paiement" -#: forms.py:66 +#: forms.py:66 models.py:510 msgid "Member" msgstr "Adhérent" @@ -54,230 +53,523 @@ msgstr "Facture validée" msgid "A payment method must be specified." msgstr "Un moyen de paiement doit être renseigné." +#: forms.py:96 forms.py:120 templates/cotisations/aff_article.html:33 +#: templates/cotisations/facture.html:61 +msgid "Article" +msgstr "Article" + +#: forms.py:100 forms.py:124 templates/cotisations/edit_facture.html:46 +msgid "Quantity" +msgstr "Quantité" + #: forms.py:154 msgid "Article name" msgstr "Nom de l'article" +#: forms.py:164 templates/cotisations/sidebar.html:50 +msgid "Available articles" +msgstr "Articles disponibles" + #: forms.py:192 msgid "Payment method name" msgstr "Nom du moyen de paiement" +#: forms.py:204 +msgid "Available payment methods" +msgstr "Moyens de paiement disponibles" + #: forms.py:230 msgid "Bank name" msgstr "Nom de la banque" +#: forms.py:242 +msgid "Available banks" +msgstr "Banques disponibles" + +#: forms.py:261 +msgid "Amount" +msgstr "Montant" + +#: forms.py:267 templates/cotisations/aff_cotisations.html:44 +#: templates/cotisations/aff_custom_invoice.html:42 +#: templates/cotisations/control.html:66 +msgid "Payment method" +msgstr "Moyen de paiement" + #: forms.py:287 #, python-format msgid "" "Requested amount is too high. Your balance can't exceed " "%(max_online_balance)s €." msgstr "" -"Montant demandé trop grand. Votre solde ne peut excéder " -"%(max_online_balance)s €" +"Le montant demandé trop grand. Votre solde ne peut excéder " +"%(max_online_balance)s €." -#: models.py:175 models.py:223 +#: models.py:60 templates/cotisations/aff_cotisations.html:48 +#: templates/cotisations/aff_custom_invoice.html:46 +#: templates/cotisations/control.html:70 +msgid "Date" +msgstr "Date" + +#: models.py:136 +msgid "cheque number" +msgstr "numéro de chèque" + +#: models.py:141 +msgid "validated" +msgstr "validée" + +#: models.py:146 +msgid "controlled" +msgstr "contrôlée" + +#: models.py:154 +msgid "Can edit the \"controlled\" state" +msgstr "Peut modifier l'état \"contrôlé\"" + +#: models.py:156 +msgid "Can view an invoice object" +msgstr "Peut voir un objet facture" + +#: models.py:158 +msgid "Can edit all the previous invoices" +msgstr "Peut modifier toutes les factures existantes" + +#: models.py:160 models.py:305 +msgid "invoice" +msgstr "facture" + +#: models.py:161 +msgid "invoices" +msgstr "factures" + +#: models.py:170 msgid "You don't have the right to edit an invoice." msgstr "Vous n'avez pas le droit de modifier une facture." -#: models.py:178 +#: models.py:173 msgid "You don't have the right to edit this user's invoices." -msgstr "Vous n'avez pas le droit de modifier les facture de cette utilisateur." +msgstr "Vous n'avez pas le droit de modifier les factures de cet utilisateur." -#: models.py:182 +#: models.py:177 msgid "" "You don't have the right to edit an invoice already controlled or " "invalidated." msgstr "" -"Vous n'avez pas le droit de modifier une facture précedement controllée ou " +"Vous n'avez pas le droit de modifier une facture précedemment contrôlée ou " "invalidée." -#: models.py:189 +#: models.py:184 msgid "You don't have the right to delete an invoice." msgstr "Vous n'avez pas le droit de supprimer une facture." -#: models.py:191 +#: models.py:186 msgid "You don't have the right to delete this user's invoices." msgstr "Vous n'avez pas le droit de supprimer les factures de cet utilisateur." -#: models.py:194 +#: models.py:189 msgid "" "You don't have the right to delete an invoice already controlled or " "invalidated." msgstr "" -"Vous n'avez pas le droit de supprimer une facture précedement controllée ou " +"Vous n'avez pas le droit de supprimer une facture précedement contrôlée ou " "invalidée." -#: models.py:202 -msgid "You don't have the right to see someone else's invoices history." +#: models.py:197 +msgid "You don't have the right to view someone else's invoices history." msgstr "" -"Vous n'avez pas le droit de voir l'historique de la facture de quelqu'un " -"d'autre." +"Vous n'avez pas le droit de voir l'historique des factures d'un autre " +"utilisateur." -#: models.py:205 +#: models.py:200 msgid "The invoice has been invalidated." msgstr "La facture a été invalidée." -#: models.py:215 +#: models.py:210 msgid "You don't have the right to edit the \"controlled\" state." -msgstr "Vous n'avez pas le droit de modifier l'état \"controllé\"." +msgstr "Vous n'avez pas le droit de modifier le statut \"contrôlé\"." -#: models.py:237 -msgid "There are no payment types which you can use." -msgstr "Il n'y a pas de type de paiement que vous puissiez utiliser." +#: models.py:224 +msgid "There are no payment method which you can use." +msgstr "Il n'y a pas de moyen de paiement que vous puissiez utiliser." -#: models.py:239 +#: models.py:226 msgid "There are no article that you can buy." -msgstr "Il n'y a pas d'article qui vous soit autorisé." +msgstr "Il n'y a pas d'article que vous puissiez acheter." -#: models.py:424 -msgid "A cotisation should always have a duration." -msgstr "Une cotisation devrait toujours avoir une durée." +#: models.py:261 +msgid "Can view a custom invoice object" +msgstr "Peut voir un objet facture personnalisée" -#: models.py:431 +#: models.py:265 templates/cotisations/aff_custom_invoice.html:36 +msgid "Recipient" +msgstr "Destinataire" + +#: models.py:269 templates/cotisations/aff_paiement.html:33 +msgid "Payment type" +msgstr "Type de paiement" + +#: models.py:273 +msgid "Address" +msgstr "Adresse" + +#: models.py:276 templates/cotisations/aff_custom_invoice.html:54 +msgid "Paid" +msgstr "Payé" + +#: models.py:296 models.py:516 models.py:764 +msgid "Connection" +msgstr "Connexion" + +#: models.py:297 models.py:517 models.py:765 +msgid "Membership" +msgstr "Adhésion" + +#: models.py:298 models.py:512 models.py:518 models.py:766 +msgid "Both of them" +msgstr "Les deux" + +#: models.py:310 +msgid "amount" +msgstr "montant" + +#: models.py:315 +msgid "article" +msgstr "article" + +#: models.py:322 +msgid "price" +msgstr "prix" + +#: models.py:327 models.py:535 +msgid "duration (in months)" +msgstr "durée (en mois)" + +#: models.py:335 models.py:549 models.py:780 +msgid "subscription type" +msgstr "type de cotisation" + +#: models.py:340 +msgid "Can view a purchase object" +msgstr "Peut voir un objet achat" + +#: models.py:341 +msgid "Can edit all the previous purchases" +msgstr "Peut modifier tous les achats précédents" + +#: models.py:343 models.py:774 +msgid "purchase" +msgstr "achat" + +#: models.py:344 +msgid "purchases" +msgstr "achats" + +#: models.py:411 models.py:573 +msgid "Duration must be specified for a subscription." +msgstr "La durée de la cotisation doit être indiquée." + +#: models.py:418 msgid "You don't have the right to edit the purchases." msgstr "Vous n'avez pas le droit de modifier les achats." -#: models.py:436 +#: models.py:423 msgid "You don't have the right to edit this user's purchases." msgstr "Vous n'avez pas le droit de modifier les achats de cet utilisateur." -#: models.py:440 +#: models.py:427 msgid "" "You don't have the right to edit a purchase already controlled or " "invalidated." msgstr "" -"Vous n'avez pas le droit de modifier un achat précédement controllé ou " +"Vous n'avez pas le droit de modifier un achat précédemment contrôlé ou " "invalidé." -#: models.py:447 +#: models.py:434 msgid "You don't have the right to delete a purchase." msgstr "Vous n'avez pas le droit de supprimer un achat." -#: models.py:449 +#: models.py:436 msgid "You don't have the right to delete this user's purchases." msgstr "Vous n'avez pas le droit de supprimer les achats de cet utilisateur." -#: models.py:452 +#: models.py:439 msgid "" "You don't have the right to delete a purchase already controlled or " "invalidated." msgstr "" -"Vous n'avez pas le droit de supprimer un achat précédement controllé ou " +"Vous n'avez pas le droit de supprimer un achat précédement contrôlé ou " "invalidé." -#: models.py:460 -msgid "You don't have the right to see someone else's purchase history." +#: models.py:447 +msgid "You don't have the right to view someone else's purchase history." msgstr "" -"Vous n'avez pas le droit de voir l'historique d'un achat de quelqu'un " -"d'autre." +"Vous n'avez pas le droit de voir l'historique des achats d'un autre " +"utilisateur." -#: models.py:582 -msgid "Solde is a reserved article name" -msgstr "Solde est un nom d'article réservé" +#: models.py:511 +msgid "Club" +msgstr "Club" -#: models.py:586 -msgid "Duration must be specified for a cotisation" -msgstr "La durée doit être spécifiée pour une cotisation" +#: models.py:523 +msgid "designation" +msgstr "désignation" -#: models.py:607 -msgid "You cannot buy this Article." +#: models.py:529 +msgid "unit price" +msgstr "prix unitaire" + +#: models.py:541 +msgid "type of users concerned" +msgstr "type d'utilisateurs concernés" + +#: models.py:553 models.py:649 +msgid "is available for every user" +msgstr "est disponible pour chaque utilisateur" + +#: models.py:560 +msgid "Can view an article object" +msgstr "Peut voir un objet article" + +#: models.py:561 +msgid "Can buy every article" +msgstr "Peut acheter chaque article" + +#: models.py:569 +msgid "Balance is a reserved article name." +msgstr "Solde est un nom d'article réservé." + +#: models.py:594 +msgid "You can't buy this article." msgstr "Vous ne pouvez pas acheter cet article." -#: models.py:713 payment_methods/comnpay/views.py:63 -msgid "" -"The cotisation of %(member_name)s has been extended to %(end_date)s." -msgstr "La cotisation de %(member_name)s a été étendu jusqu'à %(end_date)s." +#: models.py:624 +msgid "Can view a bank object" +msgstr "Peut voir un objet banque" -#: models.py:723 -msgid "The invoice has been created." +#: models.py:626 +msgid "bank" +msgstr "banque" + +#: models.py:627 +msgid "banks" +msgstr "banques" + +#: models.py:645 +msgid "method" +msgstr "moyen" + +#: models.py:654 +msgid "is user balance" +msgstr "est solde utilisateur" + +#: models.py:655 +msgid "There should be only one balance payment method." +msgstr "Il ne devrait y avoir qu'un moyen de paiement solde." + +#: models.py:661 +msgid "Can view a payment method object" +msgstr "Peut voir un objet moyen de paiement" + +#: models.py:662 +msgid "Can use every payment method" +msgstr "Peut utiliser chaque moyen de paiement" + +#: models.py:664 +msgid "payment method" +msgstr "moyen de paiement" + +#: models.py:665 +msgid "payment methods" +msgstr "moyens de paiement" + +#: models.py:699 payment_methods/comnpay/views.py:63 +#, python-format +msgid "The subscription of %(member_name)s was extended to %(end_date)s." +msgstr "La cotisation de %(member_name)s a été étendue au %(end_date)s." + +#: models.py:709 +msgid "The invoice was created." msgstr "La facture a été créée." -#: models.py:744 -msgid "You cannot use this Payment." -msgstr "Vous ne pouvez pas utiliser ce Paiement." +#: models.py:730 +msgid "You can't use this payment method." +msgstr "Vous ne pouvez pas utiliser ce moyen de paiement." -#: models.py:762 -msgid "No custom payment method" -msgstr "Pas de méthode de paiement personnalisée" +#: models.py:748 +msgid "No custom payment method." +msgstr "Pas de moyen de paiement personnalisé." -#: models.py:811 -msgid "You don't have the right to edit a cotisation." +#: models.py:783 +msgid "start date" +msgstr "date de début" + +#: models.py:786 +msgid "end date" +msgstr "date de fin" + +#: models.py:791 +msgid "Can view a subscription object" +msgstr "Peut voir un objet cotisation" + +#: models.py:792 +msgid "Can edit the previous subscriptions" +msgstr "Peut modifier les cotisations précédentes" + +#: models.py:794 +msgid "subscription" +msgstr "cotisation" + +#: models.py:795 +msgid "subscriptions" +msgstr "cotisations" + +#: models.py:799 +msgid "You don't have the right to edit a subscription." msgstr "Vous n'avez pas le droit de modifier une cotisation." -#: models.py:815 +#: models.py:803 msgid "" -"You don't have the right to edit a cotisation already controlled or " +"You don't have the right to edit a subscription already controlled or " "invalidated." msgstr "" -"Vous n'avez pas le droit de modifier une cotisaiton précédement controllée " +"Vous n'avez pas le droit de modifier une cotisation précédemment contrôlée " "ou invalidée." -#: models.py:822 -msgid "You don't have the right to delete a cotisation." +#: models.py:810 +msgid "You don't have the right to delete a subscription." msgstr "Vous n'avez pas le droit de supprimer une cotisation." -#: models.py:825 +#: models.py:813 msgid "" -"You don't have the right to delete a cotisation already controlled or " +"You don't have the right to delete a subscription already controlled or " "invalidated." msgstr "" -"Vous n'avez pas le droit de supprimer une cotisation précédement controllée " +"Vous n'avez pas le droit de supprimer une cotisation précédemment contrôlée " "ou invalidée." -#: models.py:833 -msgid "You don't have the right to see someone else's cotisation history." +#: models.py:821 +msgid "You don't have the right to view someone else's subscription history." msgstr "" -"Vous n'avez pas le droit de voir l'historique d'une cotisation de quelqu'un " -"d'autre." +"Vous n'avez pas le droit de voir l'historique des cotisations d'un autre " +"utilisateur." -#: payment_methods/balance/models.py:82 payment_methods/balance/models.py:113 +#: payment_methods/balance/models.py:38 +msgid "user balance" +msgstr "solde utilisateur" + +#: payment_methods/balance/models.py:47 +msgid "Minimum balance" +msgstr "Solde minimum" + +#: payment_methods/balance/models.py:48 +msgid "" +"The minimal amount of money allowed for the balance at the end of a payment. " +"You can specify negative amount." +msgstr "" +"Le montant minimal d'argent autorisé pour le solde à la fin d'un paiement. " +"Vous pouvez renseigner un montant négatif." + +#: payment_methods/balance/models.py:57 +msgid "Maximum balance" +msgstr "Solde maximum" + +#: payment_methods/balance/models.py:58 +msgid "The maximal amount of money allowed for the balance." +msgstr "Le montant maximal d'argent autorisé pour le solde." + +#: payment_methods/balance/models.py:66 +msgid "Allow user to credit their balance" +msgstr "Autorise l'utilisateur à créditer son solde" + +#: payment_methods/balance/models.py:81 payment_methods/balance/models.py:112 msgid "Your balance is too low for this operation." -msgstr "Votre solde est trop faible pour cette opération." +msgstr "Votre solde est trop bas pour cette opération." -#: payment_methods/balance/models.py:100 -msgid "There is already a payment type for user balance" -msgstr "Il y a déjà un type de paiement pour le solde utilisateur" +#: payment_methods/balance/models.py:99 validators.py:20 +msgid "There is already a payment method for user balance." +msgstr "Il y a déjà un moyen de paiement pour le solde utilisateur." + +#: payment_methods/cheque/models.py:36 +msgid "Cheque" +msgstr "Chèque" #: payment_methods/cheque/views.py:47 -msgid "You cannot pay this invoice with a cheque." +msgid "You can't pay this invoice with a cheque." msgstr "Vous ne pouvez pas payer cette facture avec un chèque." -#: payment_methods/comnpay/models.py:94 -msgid "Pay invoice no : " -msgstr "Payer la facture numéro : " +#: payment_methods/comnpay/models.py:39 +msgid "ComNpay" +msgstr "ComNpay" -#: payment_methods/comnpay/models.py:106 -msgid "" -"In order to pay your invoice with ComNpay, the price must be grater than {} €" +#: payment_methods/comnpay/models.py:51 +msgid "ComNpay VAT Number" +msgstr "Numéro de TVA de ComNpay" + +#: payment_methods/comnpay/models.py:57 +msgid "ComNpay secret key" +msgstr "Clé secrète de ComNpay" + +#: payment_methods/comnpay/models.py:60 +msgid "Minimum payment" +msgstr "Paiement minimum" + +#: payment_methods/comnpay/models.py:61 +msgid "The minimal amount of money you have to use when paying with ComNpay" msgstr "" -"Pour pouvoir payer votre facture avec ComNpay, le prix doit être plus grand " -"que {} €" +"Le montant minimal d'agent que vous devez utiliser en payant avec ComNpay" + +#: payment_methods/comnpay/models.py:69 +msgid "Production mode enabled (production URL, instead of homologation)" +msgstr "Mode production activé (URL de production, au lieu d'homologation)" + +#: payment_methods/comnpay/models.py:104 +msgid "Pay invoice number " +msgstr "Payer la facture numéro " + +#: payment_methods/comnpay/models.py:116 +msgid "" +"In order to pay your invoice with ComNpay, the price must be greater than {} " +"€." +msgstr "" +"Pour payer votre facture avec ComNpay, le prix doit être plus grand que {} €." #: payment_methods/comnpay/views.py:53 #, python-format -msgid "The payment of %(amount)s € has been accepted." +msgid "The payment of %(amount)s € was accepted." msgstr "Le paiement de %(amount)s € a été accepté." #: payment_methods/comnpay/views.py:84 -msgid "The payment has been refused." +msgid "The payment was refused." msgstr "Le paiment a été refusé." -#: templates/cotisations/aff_article.html:33 -#: templates/cotisations/facture.html:60 -msgid "Article" -msgstr "Article" +#: payment_methods/forms.py:60 +msgid "Special payment method" +msgstr "Moyen de paiement spécial" + +#: payment_methods/forms.py:61 +msgid "" +"Warning: you will not be able to change the payment method later. But you " +"will be allowed to edit the other options." +msgstr "" +"Attention : vous ne pourrez pas changer le moyen de paiement plus tard. Mais " +"vous pourrez modifier les autres options." + +#: payment_methods/forms.py:72 +msgid "no" +msgstr "non" #: templates/cotisations/aff_article.html:34 msgid "Price" msgstr "Prix" #: templates/cotisations/aff_article.html:35 -msgid "Cotisation type" +msgid "Subscription type" msgstr "Type de cotisation" #: templates/cotisations/aff_article.html:36 -msgid "Duration (month)" -msgstr "Durée (mois)" +msgid "Duration (in months)" +msgstr "Durée (en mois)" #: templates/cotisations/aff_article.html:37 msgid "Concerned users" @@ -285,17 +577,12 @@ msgstr "Utilisateurs concernés" #: templates/cotisations/aff_article.html:38 msgid "Available for everyone" -msgstr "Articles disponibles" +msgstr "Disponible pour tous" #: templates/cotisations/aff_article.html:52 -#: templates/cotisations/aff_banque.html:41 -#: templates/cotisations/aff_cotisations.html:70 -#: templates/cotisations/aff_cotisations.html:76 -#: templates/cotisations/aff_custom_invoice.html:73 -#: templates/cotisations/aff_custom_invoice.html:79 #: templates/cotisations/aff_paiement.html:48 -#: templates/cotisations/control.html:104 views.py:480 views.py:568 -#: views.py:649 +#: templates/cotisations/control.html:107 views.py:483 views.py:570 +#: views.py:650 msgid "Edit" msgstr "Modifier" @@ -308,179 +595,137 @@ msgid "User" msgstr "Utilisateur" #: templates/cotisations/aff_cotisations.html:41 -#: templates/cotisations/aff_custom_invoice.html:42 -#: templates/cotisations/control.html:60 +#: templates/cotisations/aff_custom_invoice.html:39 +#: templates/cotisations/control.html:63 #: templates/cotisations/edit_facture.html:45 msgid "Designation" msgstr "Désignation" #: templates/cotisations/aff_cotisations.html:42 -#: templates/cotisations/aff_custom_invoice.html:43 -#: templates/cotisations/control.html:61 +#: templates/cotisations/aff_custom_invoice.html:40 +#: templates/cotisations/control.html:64 msgid "Total price" msgstr "Prix total" -#: templates/cotisations/aff_cotisations.html:44 -#: templates/cotisations/aff_custom_invoice.html:45 -#: templates/cotisations/control.html:63 -msgid "Payment method" -msgstr "Moyen de paiement" - -#: templates/cotisations/aff_cotisations.html:48 -#: templates/cotisations/aff_custom_invoice.html:49 -#: templates/cotisations/control.html:67 -msgid "Date" -msgstr "Date" - #: templates/cotisations/aff_cotisations.html:52 -#: templates/cotisations/aff_custom_invoice.html:53 -#: templates/cotisations/control.html:53 -msgid "Invoice id" -msgstr "Id facture" +#: templates/cotisations/aff_custom_invoice.html:50 +#: templates/cotisations/control.html:56 +msgid "Invoice ID" +msgstr "ID facture" -#: templates/cotisations/aff_cotisations.html:80 +#: templates/cotisations/aff_cotisations.html:71 msgid "Controlled invoice" -msgstr "Facture controllé" +msgstr "Facture contrôlée" -#: templates/cotisations/aff_cotisations.html:85 -#: templates/cotisations/aff_custom_invoice.html:86 views.py:502 views.py:604 -#: views.py:685 -msgid "Delete" -msgstr "Supprimer" - -#: templates/cotisations/aff_cotisations.html:98 -#: templates/cotisations/aff_custom_invoice.html:98 +#: templates/cotisations/aff_cotisations.html:81 +#: templates/cotisations/aff_custom_invoice.html:79 msgid "PDF" msgstr "PDF" -#: templates/cotisations/aff_cotisations.html:101 +#: templates/cotisations/aff_cotisations.html:84 msgid "Invalidated invoice" msgstr "Facture invalidée" -#: templates/cotisations/aff_custom_invoice.html:39 -msgid "Recipient" -msgstr "Destinataire" - -#: templates/cotisations/aff_custom_invoice.html:56 -msgid "Paid" -msgstr "Payé" - -#: templates/cotisations/aff_paiement.html:33 -msgid "Payment type" -msgstr "Type de paiement" - #: templates/cotisations/aff_paiement.html:34 msgid "Is available for everyone" -msgstr "Est disponible pour tout le monde" +msgstr "Est disponible pour tous" #: templates/cotisations/aff_paiement.html:35 msgid "Custom payment method" -msgstr "Méthode de paiement personnalisée" +msgstr "Moyen de paiement personnalisé" #: templates/cotisations/control.html:30 msgid "Invoice control" msgstr "Contrôle des factures" -#: templates/cotisations/control.html:33 +#: templates/cotisations/control.html:34 msgid "Invoice control and validation" msgstr "Contrôle et validation des factures" -#: templates/cotisations/control.html:43 -msgid "Profil" +#: templates/cotisations/control.html:46 +msgid "Profile" msgstr "Profil" -#: templates/cotisations/control.html:45 +#: templates/cotisations/control.html:48 msgid "Last name" msgstr "Nom" -#: templates/cotisations/control.html:49 +#: templates/cotisations/control.html:52 msgid "First name" msgstr "Prénom" -#: templates/cotisations/control.html:57 -msgid "User id" -msgstr "Id utilisateur" +#: templates/cotisations/control.html:60 +msgid "User ID" +msgstr "ID utilisateur" -#: templates/cotisations/control.html:71 +#: templates/cotisations/control.html:74 msgid "Validated" msgstr "Validé" -#: templates/cotisations/control.html:75 +#: templates/cotisations/control.html:78 msgid "Controlled" -msgstr "Controllé" +msgstr "Contrôlé" #: templates/cotisations/delete.html:29 -msgid "Deletion of cotisations" -msgstr "Supprimer des cotisations" +msgid "Deletion of subscriptions" +msgstr "Suppression de cotisations" #: templates/cotisations/delete.html:36 #, python-format msgid "" -"\n" -" Warning. Are you sure you really want te delete this %(object_name)s " -"object ( %(objet)s ) ?\n" -" " +"Warning: are you sure you really want to delete this %(object_name)s object " +"( %(objet)s )?" msgstr "" -"\n" -" Attention. Êtes-vous vraiment sûr de vouloir supprimer cet objet " -"%(object_name)s ( %(objet)s ) ?\n" -" " +"\tAttention: voulez-vous vraiment supprimer cet objet %(object_name)s " +"( %(objet)s ) ?" -#: templates/cotisations/delete.html:40 +#: templates/cotisations/delete.html:38 #: templates/cotisations/edit_facture.html:60 msgid "Confirm" msgstr "Confirmer" #: templates/cotisations/edit_facture.html:31 #: templates/cotisations/facture.html:30 -msgid "Invoices creation and edition" +msgid "Creation and editing of invoices" msgstr "Création et modification de factures" #: templates/cotisations/edit_facture.html:38 msgid "Edit the invoice" -msgstr "Edition de factures" +msgstr "Modifier la facture" #: templates/cotisations/edit_facture.html:41 -#: templates/cotisations/facture.html:55 +#: templates/cotisations/facture.html:56 msgid "Invoice's articles" msgstr "Articles de la facture" -#: templates/cotisations/edit_facture.html:46 -msgid "Quantity" -msgstr "Quantité" - -#: templates/cotisations/facture.html:36 +#: templates/cotisations/facture.html:37 msgid "New invoice" msgstr "Nouvelle facture" -#: templates/cotisations/facture.html:39 -msgid "Maximum allowed balance : " -msgstr "Solde maximum autorisé : " +#: templates/cotisations/facture.html:40 +#, python-format +msgid "Maximum allowed balance: %(max_balance)s €" +msgstr "Solde maximum autorisé : %(max_balance)s €" -#: templates/cotisations/facture.html:43 -msgid "Current balance :" -msgstr "Solde actuel :" +#: templates/cotisations/facture.html:44 +#, python-format +msgid "Current balance: %(balance)s €" +msgstr "Solde actuel : %(balance)s €" -#: templates/cotisations/facture.html:69 +#: templates/cotisations/facture.html:70 msgid "Add an article" msgstr "Ajouter un article" -#: templates/cotisations/facture.html:71 -msgid "" -"\n" -" Total price : 0,00 €\n" -" " -msgstr "" -"\n" -" Prix total : 0,00 €\n" -" " +#: templates/cotisations/facture.html:72 +msgid "Total price: 0,00 €" +msgstr "Prix total : 0,00 €" #: templates/cotisations/index.html:29 templates/cotisations/sidebar.html:40 msgid "Invoices" msgstr "Factures" #: templates/cotisations/index.html:32 -msgid "Cotisations" +msgid "Subscriptions" msgstr "Cotisations" #: templates/cotisations/index_article.html:30 @@ -489,15 +734,15 @@ msgstr "Articles" #: templates/cotisations/index_article.html:33 msgid "Article types list" -msgstr "Liste des types d'articles" +msgstr "Liste des types d'article" #: templates/cotisations/index_article.html:36 msgid "Add an article type" msgstr "Ajouter un type d'article" #: templates/cotisations/index_article.html:40 -msgid "Delete article types" -msgstr "Supprimer des types d'articles" +msgid "Delete one or several article types" +msgstr "Supprimer un ou plusieurs types d'article" #: templates/cotisations/index_banque.html:30 #: templates/cotisations/sidebar.html:55 @@ -513,8 +758,8 @@ msgid "Add a bank" msgstr "Ajouter une banque" #: templates/cotisations/index_banque.html:40 -msgid "Delete banks" -msgstr "Supprimer des banques" +msgid "Delete one or several banks" +msgstr "Supprimer une ou plusieurs banques" #: templates/cotisations/index_custom_invoice.html:28 #: templates/cotisations/sidebar.html:45 @@ -526,36 +771,32 @@ msgid "Custom invoices list" msgstr "Liste des factures personalisées" #: templates/cotisations/index_paiement.html:30 -msgid "Payments" -msgstr "Paiement" +#: templates/cotisations/sidebar.html:60 +msgid "Payment methods" +msgstr "Moyens de paiement" #: templates/cotisations/index_paiement.html:33 -msgid "Payment types list" -msgstr "Liste des types de paiement" +msgid "List of payment methods" +msgstr "Liste des moyens de paiement" #: templates/cotisations/index_paiement.html:36 -msgid "Add a payment type" -msgstr "Ajouter un type de paiement" +msgid "Add a payment method" +msgstr "Ajouter un moyen de paiement" #: templates/cotisations/index_paiement.html:40 -msgid "Delete payment types" -msgstr "Supprimer un type de paiement" +msgid "Delete one or several payment methods" +msgstr "Supprimer un ou plusieurs moyens de paiement" #: templates/cotisations/payment.html:30 msgid "Balance refill" msgstr "Rechargement de solde" #: templates/cotisations/payment.html:34 -msgid "" -"\n" -" Pay %(amount)s €\n" -" " -msgstr "" -"\n" -" Recharger de %(amount)s €\n" -" " +#, python-format +msgid "Pay %(amount)s €" +msgstr "Recharger de %(amount)s €" -#: templates/cotisations/payment.html:44 views.py:867 +#: templates/cotisations/payment.html:42 views.py:870 msgid "Pay" msgstr "Payer" @@ -567,127 +808,116 @@ msgstr "Créer une facture" msgid "Control the invoices" msgstr "Contrôler les factures" -#: templates/cotisations/sidebar.html:50 -msgid "Available articles" -msgstr "Articles disponibles" - -#: templates/cotisations/sidebar.html:60 -msgid "Payment methods" -msgstr "Moyens de paiement" - -#: validators.py:20 -msgid "There are already payment method(s) for user balance" -msgstr "Il y a déjà une méthode de paiement pour le solde utilisateur" - -#: views.py:165 +#: views.py:167 msgid "You need to choose at least one article." msgstr "Vous devez choisir au moins un article." -#: views.py:178 views.py:232 +#: views.py:181 views.py:235 msgid "Create" msgstr "Créer" -#: views.py:225 -msgid "The custom invoice was successfully created." -msgstr "La facture a été créée avec succès." +#: views.py:228 +msgid "The custom invoice was created." +msgstr "La facture personnalisée a été créée." -#: views.py:313 views.py:367 -msgid "The invoice has been successfully edited." -msgstr "La facture a été crée avec succès." +#: views.py:316 views.py:370 +msgid "The invoice was edited." +msgstr "La facture a été modifiée." -#: views.py:333 views.py:427 -msgid "The invoice has been successfully deleted." -msgstr "La facture a été supprimée avec succès." +#: views.py:336 views.py:430 +msgid "The invoice was deleted." +msgstr "La facture a été supprimée." -#: views.py:338 views.py:432 +#: views.py:341 views.py:435 msgid "Invoice" msgstr "Facture" -#: views.py:453 -msgid "The article has been successfully created." -msgstr "L'article a été créé avec succès." +#: views.py:456 +msgid "The article was created." +msgstr "L'article a été créé." -#: views.py:458 views.py:531 views.py:626 -msgid "Address" -msgstr "Adresse" +#: views.py:461 views.py:534 views.py:627 +msgid "Add" +msgstr "Ajouter" -#: views.py:459 +#: views.py:462 msgid "New article" msgstr "Nouvel article" -#: views.py:475 -msgid "The article has been successfully edited." -msgstr "L'article a été modifié avec succès." +#: views.py:478 +msgid "The article was edited." +msgstr "L'article a été modifié." -#: views.py:481 +#: views.py:484 msgid "Edit article" -msgstr "Éditer l'article" +msgstr "Modifier l'article" -#: views.py:497 -msgid "The article(s) have been successfully deleted." -msgstr "L'(es) article(s) a(ont) été supprimé(s) avec succès. " +#: views.py:500 +msgid "The articles were deleted." +msgstr "Les articles ont été supprimés." -#: views.py:503 +#: views.py:505 views.py:605 views.py:685 +msgid "Delete" +msgstr "Supprimer" + +#: views.py:506 msgid "Delete article" msgstr "Supprimer l'article" -#: views.py:525 -msgid "The payment method has been successfully created." -msgstr "Le moyen de paiement a été créé avec succès." +#: views.py:528 +msgid "The payment method was created." +msgstr "Le moyen de paiment a été créé." -#: views.py:532 +#: views.py:535 msgid "New payment method" msgstr "Nouveau moyen de paiement" -#: views.py:562 -msgid "The payement method has been successfully edited." -msgstr "Le moyen de paiement a été modifié avec succès." +#: views.py:564 +msgid "The payment method was edited." +msgstr "Le moyen de paiment a été modifié." -#: views.py:569 +#: views.py:571 msgid "Edit payment method" -msgstr "Éditer le moyen de paiement" +msgstr "Modifier le moyen de paiement" -#: views.py:588 +#: views.py:590 #, python-format -msgid "" -"The payment method %(method_name)s has been successfully " -"deleted." -msgstr "Le moyen de paiement %(method_name)s a été supprimé avec succès." +msgid "The payment method %(method_name)s was deleted." +msgstr "Le moyen de paiement %(method_name)s a été supprimé." -#: views.py:596 +#: views.py:597 #, python-format msgid "" "The payment method %(method_name)s can't be deleted " "because there are invoices using it." msgstr "" -"Le moyen de paiement %(method_name)s ne peut pas être mis à jour car il y a " -"des factures l'utilisant." +"Le moyen de paiement %(method_name)s ne peut pas être supprimé car il y a " +"des factures qui l'utilisent." -#: views.py:605 +#: views.py:606 msgid "Delete payment method" msgstr "Supprimer le moyen de paiement" -#: views.py:621 -msgid "The bank has been successfully created." -msgstr "La banque a été crée avec succès." +#: views.py:622 +msgid "The bank was created." +msgstr "La banque a été créée." -#: views.py:627 +#: views.py:628 msgid "New bank" -msgstr "Créer la banque" +msgstr "Nouvelle banque" -#: views.py:644 -msgid "The bank has been successfully edited" -msgstr "La banque a été modifée avec succès." +#: views.py:645 +msgid "The bank was edited." +msgstr "La banque a été modifiée." -#: views.py:650 +#: views.py:651 msgid "Edit bank" -msgstr "Éditer la banque" +msgstr "Modifier la banque" -#: views.py:669 +#: views.py:670 #, python-format -msgid "" -"The bank %(bank_name)s has been successfully deleted." -msgstr "La banque %(bank_name)s a été supprimée avec succès." +msgid "The bank %(bank_name)s was deleted." +msgstr "La banque %(bank_name)s a été supprimée." #: views.py:677 #, python-format @@ -708,121 +938,8 @@ msgstr "Vos modifications ont correctement été prises en compte." #: views.py:834 msgid "You are not allowed to credit your balance." -msgstr "Vous n'êtes pas autorisé à créditer votre solde." +msgstr "Vous n'êtes pas autorisés à créditer votre solde." -#: views.py:866 +#: views.py:869 msgid "Refill your balance" -msgstr "Créditer votre solde" - -#: models.py:137 -msgid "Cheque number" -msgstr "Numéro de chèque" - -msgid "Not specified" -msgstr "Non renseigné" - -msgid "A cheque number and a bank must be specified." -msgstr "Un numéro de chèqe et une banque doivent être renseignés." - -#: models.py:155 -msgid "Can change the \"controlled\" state" -msgstr "Peut modifier l'état \"controllé\"" - -#: models.py:157 -msgid "Can see an invoice's details" -msgstr "Peut voir les détails d'une facture" - -#: models.py:159 -msgid "Can edit all the previous invoices" -msgstr "Peut modifier toutes les factures existantes" - -#: models.py:297 -msgid "Connexion" -msgstr "Connexion" - -#: models.py:336 -msgid "Membership" -msgstr "Adhésion" - -#: models.py:299 -msgid "Both of them" -msgstr "Les deux" - -#: models.py:328 -msgid "Duration (in whole month)" -msgstr "Durée (en mois entiers)" - -#: models.py:336 -msgid "Type of cotisation" -msgstr "Type de cotisation" - -#: models.py:341 -msgid "Can see a purchase's details" -msgstr "Peut voir les détails d'un achat" - -#: models.py:342 -msgid "Can edit all the previous purchases" -msgstr "Peut voir les achats existants" - -#: models.py:344 -msgid "Purchase" -msgstr "Achat" - -#: models.py:345 -msgid "Purchases" -msgstr "Achat" - -#: models.py:512 -msgid "Club" -msgstr "Club" - -#: models.py:530 -msgid "Unitary price" -msgstr "Prix unitaire" - -#: models.py:538 -msgid "Type of users concerned" -msgstr "Type d'utilisateurs concernés" - -#: models.py:561 -msgid "Can see an article's details" -msgstr "Peut voir les détails d'un article" - -#: models.py:621 -msgid "Name" -msgstr "Nom" - -#: models.py:626 -msgid "Can see a bank's details" -msgstr "Peut voir les détails d'une banque" - -#: models.py:344 -msgid "Standard" -msgstr "Standard" - -msgid "Cheque" -msgstr "Chèque" - -#: models.py:647 -msgid "Method" -msgstr "Moyen" - -#: models.py:663 -msgid "Can see a payement's details" -msgstr "Peut voir les détails d'un paiement" - -#: models.py:785 -msgid "Starting date" -msgstr "Date de début" - -#: models.py:788 -msgid "Ending date" -msgstr "Date de fin" - -#: models.py:793 -msgid "Can see a cotisation's details" -msgstr "Peut voir les détails d'une cotisation" - -#: models.py:794 -msgid "Can edit the previous cotisations" -msgstr "Peut voir les cotisations existantes" +msgstr "Recharger votre solde" diff --git a/cotisations/migrations/0033_auto_20180818_1319.py b/cotisations/migrations/0033_auto_20180818_1319.py new file mode 100644 index 00000000..2e61fbb6 --- /dev/null +++ b/cotisations/migrations/0033_auto_20180818_1319.py @@ -0,0 +1,181 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.7 on 2018-08-18 11:19 +from __future__ import unicode_literals + +import cotisations.validators +import django.core.validators +from django.db import migrations, models +import django.db.models.deletion +import re2o.aes_field + + +class Migration(migrations.Migration): + + dependencies = [ + ('cotisations', '0032_custom_invoice'), + ] + + operations = [ + migrations.AlterModelOptions( + name='article', + options={'permissions': (('view_article', 'Can view an article object'), ('buy_every_article', 'Can buy every article')), 'verbose_name': 'article', 'verbose_name_plural': 'articles'}, + ), + migrations.AlterModelOptions( + name='balancepayment', + options={'verbose_name': 'user balance'}, + ), + migrations.AlterModelOptions( + name='banque', + options={'permissions': (('view_banque', 'Can view a bank object'),), 'verbose_name': 'bank', 'verbose_name_plural': 'banks'}, + ), + migrations.AlterModelOptions( + name='cotisation', + options={'permissions': (('view_cotisation', 'Can view a subscription object'), ('change_all_cotisation', 'Can edit the previous subscriptions')), 'verbose_name': 'subscription', 'verbose_name_plural': 'subscriptions'}, + ), + migrations.AlterModelOptions( + name='custominvoice', + options={'permissions': (('view_custominvoice', 'Can view a custom invoice object'),)}, + ), + migrations.AlterModelOptions( + name='facture', + options={'permissions': (('change_facture_control', 'Can edit the "controlled" state'), ('view_facture', 'Can view an invoice object'), ('change_all_facture', 'Can edit all the previous invoices')), 'verbose_name': 'invoice', 'verbose_name_plural': 'invoices'}, + ), + migrations.AlterModelOptions( + name='paiement', + options={'permissions': (('view_paiement', 'Can view a payment method object'), ('use_every_payment', 'Can use every payment method')), 'verbose_name': 'payment method', 'verbose_name_plural': 'payment methods'}, + ), + migrations.AlterModelOptions( + name='vente', + options={'permissions': (('view_vente', 'Can view a purchase object'), ('change_all_vente', 'Can edit all the previous purchases')), 'verbose_name': 'purchase', 'verbose_name_plural': 'purchases'}, + ), + migrations.AlterField( + model_name='article', + name='available_for_everyone', + field=models.BooleanField(default=False, verbose_name='is available for every user'), + ), + migrations.AlterField( + model_name='article', + name='duration', + field=models.PositiveIntegerField(blank=True, null=True, validators=[django.core.validators.MinValueValidator(0)], verbose_name='duration (in months)'), + ), + migrations.AlterField( + model_name='article', + name='name', + field=models.CharField(max_length=255, verbose_name='designation'), + ), + migrations.AlterField( + model_name='article', + name='prix', + field=models.DecimalField(decimal_places=2, max_digits=5, verbose_name='unit price'), + ), + migrations.AlterField( + model_name='article', + name='type_cotisation', + field=models.CharField(blank=True, choices=[('Connexion', 'Connection'), ('Adhesion', 'Membership'), ('All', 'Both of them')], default=None, max_length=255, null=True, verbose_name='subscription type'), + ), + migrations.AlterField( + model_name='article', + name='type_user', + field=models.CharField(choices=[('Adherent', 'Member'), ('Club', 'Club'), ('All', 'Both of them')], default='All', max_length=255, verbose_name='type of users concerned'), + ), + migrations.AlterField( + model_name='banque', + name='name', + field=models.CharField(max_length=255), + ), + migrations.AlterField( + model_name='comnpaypayment', + name='payment_credential', + field=models.CharField(blank=True, default='', max_length=255, verbose_name='ComNpay VAT Number'), + ), + migrations.AlterField( + model_name='comnpaypayment', + name='payment_pass', + field=re2o.aes_field.AESEncryptedField(blank=True, max_length=255, null=True, verbose_name='ComNpay secret key'), + ), + migrations.AlterField( + model_name='comnpaypayment', + name='production', + field=models.BooleanField(default=True, verbose_name='Production mode enabled (production URL, instead of homologation)'), + ), + migrations.AlterField( + model_name='cotisation', + name='date_end', + field=models.DateTimeField(verbose_name='end date'), + ), + migrations.AlterField( + model_name='cotisation', + name='date_start', + field=models.DateTimeField(verbose_name='start date'), + ), + migrations.AlterField( + model_name='cotisation', + name='type_cotisation', + field=models.CharField(choices=[('Connexion', 'Connection'), ('Adhesion', 'Membership'), ('All', 'Both of them')], default='All', max_length=255, verbose_name='subscription type'), + ), + migrations.AlterField( + model_name='cotisation', + name='vente', + field=models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, to='cotisations.Vente', verbose_name='purchase'), + ), + migrations.AlterField( + model_name='facture', + name='cheque', + field=models.CharField(blank=True, max_length=255, verbose_name='cheque number'), + ), + migrations.AlterField( + model_name='facture', + name='control', + field=models.BooleanField(default=False, verbose_name='controlled'), + ), + migrations.AlterField( + model_name='facture', + name='valid', + field=models.BooleanField(default=True, verbose_name='validated'), + ), + migrations.AlterField( + model_name='paiement', + name='available_for_everyone', + field=models.BooleanField(default=False, verbose_name='is available for every user'), + ), + migrations.AlterField( + model_name='paiement', + name='is_balance', + field=models.BooleanField(default=False, editable=False, help_text='There should be only one balance payment method.', validators=[cotisations.validators.check_no_balance], verbose_name='is user balance'), + ), + migrations.AlterField( + model_name='paiement', + name='moyen', + field=models.CharField(max_length=255, verbose_name='method'), + ), + migrations.AlterField( + model_name='vente', + name='duration', + field=models.PositiveIntegerField(blank=True, null=True, verbose_name='duration (in months)'), + ), + migrations.AlterField( + model_name='vente', + name='facture', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='cotisations.BaseInvoice', verbose_name='invoice'), + ), + migrations.AlterField( + model_name='vente', + name='name', + field=models.CharField(max_length=255, verbose_name='article'), + ), + migrations.AlterField( + model_name='vente', + name='number', + field=models.IntegerField(validators=[django.core.validators.MinValueValidator(1)], verbose_name='amount'), + ), + migrations.AlterField( + model_name='vente', + name='prix', + field=models.DecimalField(decimal_places=2, max_digits=5, verbose_name='price'), + ), + migrations.AlterField( + model_name='vente', + name='type_cotisation', + field=models.CharField(blank=True, choices=[('Connexion', 'Connection'), ('Adhesion', 'Membership'), ('All', 'Both of them')], max_length=255, null=True, verbose_name='subscription type'), + ), + ] diff --git a/cotisations/models.py b/cotisations/models.py index 7ca157eb..ac601665 100644 --- a/cotisations/models.py +++ b/cotisations/models.py @@ -41,8 +41,7 @@ from django.dispatch import receiver from django.forms import ValidationError from django.core.validators import MinValueValidator from django.utils import timezone -from django.utils.translation import ugettext as _ -from django.utils.translation import ugettext_lazy as _l +from django.utils.translation import ugettext_lazy as _ from django.urls import reverse from django.shortcuts import redirect from django.contrib import messages @@ -58,7 +57,7 @@ from cotisations.validators import check_no_balance class BaseInvoice(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model): date = models.DateTimeField( auto_now_add=True, - verbose_name=_l("Date") + verbose_name=_("Date") ) # TODO : change prix to price @@ -134,17 +133,17 @@ class Facture(BaseInvoice): cheque = models.CharField( max_length=255, blank=True, - verbose_name=_l("Cheque number") + verbose_name=_("cheque number") ) # TODO : change name to validity for clarity valid = models.BooleanField( default=True, - verbose_name=_l("Validated") + verbose_name=_("validated") ) # TODO : changed name to controlled for clarity control = models.BooleanField( default=False, - verbose_name=_l("Controlled") + verbose_name=_("controlled") ) class Meta: @@ -152,14 +151,14 @@ class Facture(BaseInvoice): permissions = ( # TODO : change facture to invoice ('change_facture_control', - _l("Can change the \"controlled\" state")), + _("Can edit the \"controlled\" state")), ('view_facture', - _l("Can see an invoice's details")), + _("Can view an invoice object")), ('change_all_facture', - _l("Can edit all the previous invoices")), + _("Can edit all the previous invoices")), ) - verbose_name = _l("Invoice") - verbose_name_plural = _l("Invoices") + verbose_name = _("invoice") + verbose_name_plural = _("invoices") def linked_objects(self): """Return linked objects : machine and domain. @@ -195,7 +194,7 @@ class Facture(BaseInvoice): def can_view(self, user_request, *_args, **_kwargs): if not user_request.has_perm('cotisations.view_facture') and \ self.user != user_request: - return False, _("You don't have the right to see someone else's " + return False, _("You don't have the right to view someone else's " "invoices history.") elif not self.valid: return False, _("The invoice has been invalidated.") @@ -222,7 +221,7 @@ class Facture(BaseInvoice): if user_request.has_perm('cotisations.add_facture'): return True, None if len(Paiement.find_allowed_payments(user_request)) <= 0: - return False, _("There are no payment types which you can use.") + return False, _("There are no payment method which you can use.") if len(Article.find_allowed_articles(user_request)) <= 0: return False, _("There are no article that you can buy.") return True, None @@ -259,22 +258,22 @@ def facture_post_delete(**kwargs): class CustomInvoice(BaseInvoice): class Meta: permissions = ( - ('view_custominvoice', _l("Can view a custom invoice")), + ('view_custominvoice', _("Can view a custom invoice object")), ) recipient = models.CharField( max_length=255, - verbose_name=_l("Recipient") + verbose_name=_("Recipient") ) payment = models.CharField( max_length=255, - verbose_name=_l("Payment type") + verbose_name=_("Payment type") ) address = models.CharField( max_length=255, - verbose_name=_l("Address") + verbose_name=_("Address") ) paid = models.BooleanField( - verbose_name="Paid" + verbose_name=_("Paid") ) @@ -294,38 +293,38 @@ class Vente(RevMixin, AclMixin, models.Model): # TODO : change this to English COTISATION_TYPE = ( - ('Connexion', _l("Connexion")), - ('Adhesion', _l("Membership")), - ('All', _l("Both of them")), + ('Connexion', _("Connection")), + ('Adhesion', _("Membership")), + ('All', _("Both of them")), ) # TODO : change facture to invoice facture = models.ForeignKey( 'BaseInvoice', on_delete=models.CASCADE, - verbose_name=_l("Invoice") + verbose_name=_("invoice") ) # TODO : change number to amount for clarity number = models.IntegerField( validators=[MinValueValidator(1)], - verbose_name=_l("Amount") + verbose_name=_("amount") ) # TODO : change this field for a ForeinKey to Article name = models.CharField( max_length=255, - verbose_name=_l("Article") + verbose_name=_("article") ) # TODO : change prix to price # TODO : this field is not needed if you use Article ForeignKey prix = models.DecimalField( max_digits=5, decimal_places=2, - verbose_name=_l("Price")) + verbose_name=_("price")) # TODO : this field is not needed if you use Article ForeignKey duration = models.PositiveIntegerField( blank=True, null=True, - verbose_name=_l("Duration (in whole month)") + verbose_name=_("duration (in months)") ) # TODO : this field is not needed if you use Article ForeignKey type_cotisation = models.CharField( @@ -333,16 +332,16 @@ class Vente(RevMixin, AclMixin, models.Model): blank=True, null=True, max_length=255, - verbose_name=_l("Type of cotisation") + verbose_name=_("subscription type") ) class Meta: permissions = ( - ('view_vente', _l("Can see a purchase's details")), - ('change_all_vente', _l("Can edit all the previous purchases")), + ('view_vente', _("Can view a purchase object")), + ('change_all_vente', _("Can edit all the previous purchases")), ) - verbose_name = _l("Purchase") - verbose_name_plural = _l("Purchases") + verbose_name = _("purchase") + verbose_name_plural = _("purchases") # TODO : change prix_total to total_price def prix_total(self): @@ -409,7 +408,7 @@ class Vente(RevMixin, AclMixin, models.Model): # Checking that if a cotisation is specified, there is also a duration if self.type_cotisation and not self.duration: raise ValidationError( - _("A cotisation should always have a duration.") + _("Duration must be specified for a subscription.") ) self.update_cotisation() super(Vente, self).save(*args, **kwargs) @@ -445,7 +444,7 @@ class Vente(RevMixin, AclMixin, models.Model): def can_view(self, user_request, *_args, **_kwargs): if (not user_request.has_perm('cotisations.view_vente') and self.facture.user != user_request): - return False, _("You don't have the right to see someone " + return False, _("You don't have the right to view someone " "else's purchase history.") else: return True, None @@ -508,38 +507,38 @@ class Article(RevMixin, AclMixin, models.Model): # TODO : Either use TYPE or TYPES in both choices but not both USER_TYPES = ( - ('Adherent', _l("Member")), - ('Club', _l("Club")), - ('All', _l("Both of them")), + ('Adherent', _("Member")), + ('Club', _("Club")), + ('All', _("Both of them")), ) COTISATION_TYPE = ( - ('Connexion', _l("Connexion")), - ('Adhesion', _l("Membership")), - ('All', _l("Both of them")), + ('Connexion', _("Connection")), + ('Adhesion', _("Membership")), + ('All', _("Both of them")), ) name = models.CharField( max_length=255, - verbose_name=_l("Designation") + verbose_name=_("designation") ) # TODO : change prix to price prix = models.DecimalField( max_digits=5, decimal_places=2, - verbose_name=_l("Unitary price") + verbose_name=_("unit price") ) duration = models.PositiveIntegerField( blank=True, null=True, validators=[MinValueValidator(0)], - verbose_name=_l("Duration (in whole month)") + verbose_name=_("duration (in months)") ) type_user = models.CharField( choices=USER_TYPES, default='All', max_length=255, - verbose_name=_l("Type of users concerned") + verbose_name=_("type of users concerned") ) type_cotisation = models.CharField( choices=COTISATION_TYPE, @@ -547,31 +546,31 @@ class Article(RevMixin, AclMixin, models.Model): blank=True, null=True, max_length=255, - verbose_name=_l("Type of cotisation") + verbose_name=_("subscription type") ) available_for_everyone = models.BooleanField( default=False, - verbose_name=_l("Is available for every user") + verbose_name=_("is available for every user") ) unique_together = ('name', 'type_user') class Meta: permissions = ( - ('view_article', _l("Can see an article's details")), - ('buy_every_article', _l("Can buy every_article")) + ('view_article', _("Can view an article object")), + ('buy_every_article', _("Can buy every article")) ) - verbose_name = "Article" - verbose_name_plural = "Articles" + verbose_name = "article" + verbose_name_plural = "articles" def clean(self): if self.name.lower() == 'solde': raise ValidationError( - _("Solde is a reserved article name") + _("Balance is a reserved article name.") ) if self.type_cotisation and not self.duration: raise ValidationError( - _("Duration must be specified for a cotisation") + _("Duration must be specified for a subscription.") ) def __str__(self): @@ -592,7 +591,7 @@ class Article(RevMixin, AclMixin, models.Model): self.available_for_everyone or user.has_perm('cotisations.buy_every_article') or user.has_perm('cotisations.add_facture'), - _("You cannot buy this Article.") + _("You can't buy this article.") ) @classmethod @@ -618,15 +617,14 @@ class Banque(RevMixin, AclMixin, models.Model): name = models.CharField( max_length=255, - verbose_name=_l("Name") ) class Meta: permissions = ( - ('view_banque', _l("Can see a bank's details")), + ('view_banque', _("Can view a bank object")), ) - verbose_name = _l("Bank") - verbose_name_plural = _l("Banks") + verbose_name = _("bank") + verbose_name_plural = _("banks") def __str__(self): return self.name @@ -644,33 +642,33 @@ class Paiement(RevMixin, AclMixin, models.Model): # TODO : change moyen to method moyen = models.CharField( max_length=255, - verbose_name=_l("Method") + verbose_name=_("method") ) available_for_everyone = models.BooleanField( default=False, - verbose_name=_l("Is available for every user") + verbose_name=_("is available for every user") ) is_balance = models.BooleanField( default=False, editable=False, - verbose_name=_l("Is user balance"), - help_text=_l("There should be only one balance payment method."), + verbose_name=_("is user balance"), + help_text=_("There should be only one balance payment method."), validators=[check_no_balance] ) class Meta: permissions = ( - ('view_paiement', _l("Can see a payement's details")), - ('use_every_payment', _l("Can use every payement")), + ('view_paiement', _("Can view a payment method object")), + ('use_every_payment', _("Can use every payment method")), ) - verbose_name = _l("Payment method") - verbose_name_plural = _l("Payment methods") + verbose_name = _("payment method") + verbose_name_plural = _("payment methods") def __str__(self): return self.moyen def clean(self): - """ + """l Override of the herited clean function to get a correct name """ self.moyen = self.moyen.title() @@ -698,8 +696,8 @@ class Paiement(RevMixin, AclMixin, models.Model): if any(sell.type_cotisation for sell in invoice.vente_set.all()): messages.success( request, - _("The cotisation of %(member_name)s has been \ - extended to %(end_date)s.") % { + _("The subscription of %(member_name)s was extended to" + " %(end_date)s.") % { 'member_name': invoice.user.pseudo, 'end_date': invoice.user.end_adhesion() } @@ -708,7 +706,7 @@ class Paiement(RevMixin, AclMixin, models.Model): else: messages.success( request, - _("The invoice has been created.") + _("The invoice was created.") ) return redirect(reverse( 'users:profil', @@ -729,7 +727,7 @@ class Paiement(RevMixin, AclMixin, models.Model): self.available_for_everyone or user.has_perm('cotisations.use_every_payment') or user.has_perm('cotisations.add_facture'), - _("You cannot use this Payment.") + _("You can't use this payment method.") ) @classmethod @@ -747,7 +745,7 @@ class Paiement(RevMixin, AclMixin, models.Model): p = find_payment_method(self) if p is not None: return p._meta.verbose_name - return _("No custom payment method") + return _("No custom payment method.") class Cotisation(RevMixin, AclMixin, models.Model): @@ -763,9 +761,9 @@ class Cotisation(RevMixin, AclMixin, models.Model): """ COTISATION_TYPE = ( - ('Connexion', _l("Connexion")), - ('Adhesion', _l("Membership")), - ('All', _l("Both of them")), + ('Connexion', _("Connection")), + ('Adhesion', _("Membership")), + ('All', _("Both of them")), ) # TODO : change vente to purchase @@ -773,34 +771,36 @@ class Cotisation(RevMixin, AclMixin, models.Model): 'Vente', on_delete=models.CASCADE, null=True, - verbose_name=_l("Purchase") + verbose_name=_("purchase") ) type_cotisation = models.CharField( choices=COTISATION_TYPE, max_length=255, default='All', - verbose_name=_l("Type of cotisation") + verbose_name=_("subscription type") ) date_start = models.DateTimeField( - verbose_name=_l("Starting date") + verbose_name=_("start date") ) date_end = models.DateTimeField( - verbose_name=_l("Ending date") + verbose_name=_("end date") ) class Meta: permissions = ( - ('view_cotisation', _l("Can see a cotisation's details")), - ('change_all_cotisation', _l("Can edit the previous cotisations")), + ('view_cotisation', _("Can view a subscription object")), + ('change_all_cotisation', _("Can edit the previous subscriptions")), ) + verbose_name = _("subscription") + verbose_name_plural = _("subscriptions") def can_edit(self, user_request, *_args, **_kwargs): if not user_request.has_perm('cotisations.change_cotisation'): - return False, _("You don't have the right to edit a cotisation.") + return False, _("You don't have the right to edit a subscription.") elif not user_request.has_perm('cotisations.change_all_cotisation') \ and (self.vente.facture.control or not self.vente.facture.valid): - return False, _("You don't have the right to edit a cotisation " + return False, _("You don't have the right to edit a subscription " "already controlled or invalidated.") else: return True, None @@ -808,9 +808,9 @@ class Cotisation(RevMixin, AclMixin, models.Model): def can_delete(self, user_request, *_args, **_kwargs): if not user_request.has_perm('cotisations.delete_cotisation'): return False, _("You don't have the right to delete a " - "cotisation.") + "subscription.") if self.vente.facture.control or not self.vente.facture.valid: - return False, _("You don't have the right to delete a cotisation " + return False, _("You don't have the right to delete a subscription " "already controlled or invalidated.") else: return True, None @@ -818,8 +818,8 @@ class Cotisation(RevMixin, AclMixin, models.Model): def can_view(self, user_request, *_args, **_kwargs): if not user_request.has_perm('cotisations.view_cotisation') and\ self.vente.facture.user != user_request: - return False, _("You don't have the right to see someone else's " - "cotisation history.") + return False, _("You don't have the right to view someone else's " + "subscription history.") else: return True, None @@ -847,3 +847,4 @@ def cotisation_post_delete(**_kwargs): """ regen('mac_ip_list') regen('mailing') + diff --git a/cotisations/payment_methods/balance/models.py b/cotisations/payment_methods/balance/models.py index 4e488405..250e6949 100644 --- a/cotisations/payment_methods/balance/models.py +++ b/cotisations/payment_methods/balance/models.py @@ -21,8 +21,7 @@ from django.db import models from django.shortcuts import redirect from django.urls import reverse -from django.utils.translation import ugettext as _ -from django.utils.translation import ugettext_lazy as _l +from django.utils.translation import ugettext_lazy as _ from django.contrib import messages @@ -36,7 +35,7 @@ class BalancePayment(PaymentMethodMixin, models.Model): """ class Meta: - verbose_name = _l("User Balance") + verbose_name = _("user balance") payment = models.OneToOneField( Paiement, @@ -45,8 +44,8 @@ class BalancePayment(PaymentMethodMixin, models.Model): editable=False ) minimum_balance = models.DecimalField( - verbose_name=_l("Minimum balance"), - help_text=_l("The minimal amount of money allowed for the balance" + verbose_name=_("Minimum balance"), + help_text=_("The minimal amount of money allowed for the balance" " at the end of a payment. You can specify negative " "amount." ), @@ -55,8 +54,8 @@ class BalancePayment(PaymentMethodMixin, models.Model): default=0, ) maximum_balance = models.DecimalField( - verbose_name=_l("Maximum balance"), - help_text=_l("The maximal amount of money allowed for the balance."), + verbose_name=_("Maximum balance"), + help_text=_("The maximal amount of money allowed for the balance."), max_digits=5, decimal_places=2, default=50, @@ -64,7 +63,7 @@ class BalancePayment(PaymentMethodMixin, models.Model): null=True, ) credit_balance_allowed = models.BooleanField( - verbose_name=_l("Allow user to credit their balance"), + verbose_name=_("Allow user to credit their balance"), default=False, ) @@ -97,7 +96,7 @@ class BalancePayment(PaymentMethodMixin, models.Model): if len(p) > 0: form.add_error( 'payment_method', - _("There is already a payment type for user balance") + _("There is already a payment method for user balance.") ) def alter_payment(self, payment): @@ -118,3 +117,4 @@ class BalancePayment(PaymentMethodMixin, models.Model): len(Paiement.find_allowed_payments(user_request) .exclude(is_balance=True)) > 0 ) and self.credit_balance_allowed + diff --git a/cotisations/payment_methods/cheque/models.py b/cotisations/payment_methods/cheque/models.py index c2680e7a..cd6d2920 100644 --- a/cotisations/payment_methods/cheque/models.py +++ b/cotisations/payment_methods/cheque/models.py @@ -21,7 +21,7 @@ from django.db import models from django.shortcuts import redirect from django.urls import reverse -from django.utils.translation import ugettext_lazy as _l +from django.utils.translation import ugettext_lazy as _ from cotisations.models import Paiement from cotisations.payment_methods.mixins import PaymentMethodMixin @@ -33,7 +33,7 @@ class ChequePayment(PaymentMethodMixin, models.Model): """ class Meta: - verbose_name = _l("Cheque") + verbose_name = _("Cheque") payment = models.OneToOneField( Paiement, @@ -52,3 +52,4 @@ class ChequePayment(PaymentMethodMixin, models.Model): 'cotisations:cheque:validate', kwargs={'invoice_pk': invoice.pk} )) + diff --git a/cotisations/payment_methods/cheque/views.py b/cotisations/payment_methods/cheque/views.py index 4d164a79..3cce3e5c 100644 --- a/cotisations/payment_methods/cheque/views.py +++ b/cotisations/payment_methods/cheque/views.py @@ -44,7 +44,7 @@ def cheque(request, invoice_pk): if invoice.valid or not isinstance(payment_method, ChequePayment): messages.error( request, - _("You cannot pay this invoice with a cheque.") + _("You can't pay this invoice with a cheque.") ) return redirect(reverse( 'users:profil', @@ -67,3 +67,4 @@ def cheque(request, invoice_pk): 'amount': invoice.prix_total() } ) + diff --git a/cotisations/payment_methods/comnpay/models.py b/cotisations/payment_methods/comnpay/models.py index dbc2f4ba..af389cf8 100644 --- a/cotisations/payment_methods/comnpay/models.py +++ b/cotisations/payment_methods/comnpay/models.py @@ -21,8 +21,7 @@ from django.db import models from django.shortcuts import render from django.urls import reverse -from django.utils.translation import ugettext as _ -from django.utils.translation import ugettext_lazy as _l +from django.utils.translation import ugettext_lazy as _ from cotisations.models import Paiement from cotisations.payment_methods.mixins import PaymentMethodMixin @@ -37,7 +36,7 @@ class ComnpayPayment(PaymentMethodMixin, models.Model): """ class Meta: - verbose_name = "ComNpay" + verbose_name = _("ComNpay") payment = models.OneToOneField( Paiement, @@ -49,17 +48,17 @@ class ComnpayPayment(PaymentMethodMixin, models.Model): max_length=255, default='', blank=True, - verbose_name=_l("ComNpay VAD Number"), + verbose_name=_("ComNpay VAT Number"), ) payment_pass = AESEncryptedField( max_length=255, null=True, blank=True, - verbose_name=_l("ComNpay Secret Key"), + verbose_name=_("ComNpay secret key"), ) minimum_payment = models.DecimalField( - verbose_name=_l("Minimum payment"), - help_text=_l("The minimal amount of money you have to use when paying" + verbose_name=_("Minimum payment"), + help_text=_("The minimal amount of money you have to use when paying" " with ComNpay"), max_digits=5, decimal_places=2, @@ -67,7 +66,7 @@ class ComnpayPayment(PaymentMethodMixin, models.Model): ) production = models.BooleanField( default=True, - verbose_name=_l("Production mode enabled (production url, instead of homologation)"), + verbose_name=_("Production mode enabled (production URL, instead of homologation)"), ) def return_url_comnpay(self): @@ -102,7 +101,7 @@ class ComnpayPayment(PaymentMethodMixin, models.Model): 'action': self.return_url_comnpay(), 'method': 'POST', 'content': p.buildSecretHTML( - _("Pay invoice no : ")+str(invoice.id), + _("Pay invoice number ")+str(invoice.id), invoice.prix_total(), idTransaction=str(invoice.id) ), @@ -114,6 +113,6 @@ class ComnpayPayment(PaymentMethodMixin, models.Model): """Checks that the price meets the requirement to be paid with ComNpay. """ return ((price >= self.minimum_payment), - _('In order to pay your invoice with ComNpay' - ', the price must be grater than {} €') - .format(self.minimum_payment)) + _("In order to pay your invoice with ComNpay, the price must" + " be greater than {} €.").format(self.minimum_payment)) + diff --git a/cotisations/payment_methods/comnpay/views.py b/cotisations/payment_methods/comnpay/views.py index 89966b48..2383f1e9 100644 --- a/cotisations/payment_methods/comnpay/views.py +++ b/cotisations/payment_methods/comnpay/views.py @@ -50,7 +50,7 @@ def accept_payment(request, factureid): if invoice.valid: messages.success( request, - _("The payment of %(amount)s € has been accepted.") % { + _("The payment of %(amount)s € was accepted.") % { 'amount': invoice.prix_total() } ) @@ -60,8 +60,8 @@ def accept_payment(request, factureid): for purchase in invoice.vente_set.all()): messages.success( request, - _("The cotisation of %(member_name)s has been \ - extended to %(end_date)s.") % { + _("The subscription of %(member_name)s was extended to" + " %(end_date)s.") % { 'member_name': request.user.pseudo, 'end_date': request.user.end_adhesion() } @@ -81,7 +81,7 @@ def refuse_payment(request): """ messages.error( request, - _("The payment has been refused.") + _("The payment was refused.") ) return redirect(reverse( 'users:profil', @@ -136,3 +136,4 @@ def ipn(request): # Everything worked we send a reponse to Comnpay indicating that # it's ok for them to proceed return HttpResponse("HTTP/1.0 200 OK") + diff --git a/cotisations/payment_methods/forms.py b/cotisations/payment_methods/forms.py index d4d55a74..daa65118 100644 --- a/cotisations/payment_methods/forms.py +++ b/cotisations/payment_methods/forms.py @@ -19,8 +19,7 @@ # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from django import forms -from django.utils.translation import ugettext as _ -from django.utils.translation import ugettext_lazy as _l +from django.utils.translation import ugettext_lazy as _ from . import PAYMENT_METHODS from cotisations.utils import find_payment_method @@ -58,8 +57,8 @@ class PaymentMethodForm(forms.Form): """ payment_method = forms.ChoiceField( - label=_l("Special payment method"), - help_text=_l("Warning : You will not be able to change the payment " + label=_("Special payment method"), + help_text=_("Warning: you will not be able to change the payment " "method later. But you will be allowed to edit the other " "options." ), @@ -70,7 +69,7 @@ class PaymentMethodForm(forms.Form): super(PaymentMethodForm, self).__init__(*args, **kwargs) prefix = kwargs.get('prefix', None) self.fields['payment_method'].choices = [(i,p.NAME) for (i,p) in enumerate(PAYMENT_METHODS)] - self.fields['payment_method'].choices.insert(0, ('', _l('no'))) + self.fields['payment_method'].choices.insert(0, ('', _('no'))) self.fields['payment_method'].widget.attrs = { 'id': 'paymentMethodSelect' } diff --git a/cotisations/templates/cotisations/aff_article.html b/cotisations/templates/cotisations/aff_article.html index f547bcf0..b07035da 100644 --- a/cotisations/templates/cotisations/aff_article.html +++ b/cotisations/templates/cotisations/aff_article.html @@ -32,8 +32,8 @@ with this program; if not, write to the Free Software Foundation, Inc., {% trans "Article" %} {% trans "Price" %} - {% trans "Cotisation type" %} - {% trans "Duration (month)" %} + {% trans "Subscription type" %} + {% trans "Duration (in months)" %} {% trans "Concerned users" %} {% trans "Available for everyone" %} diff --git a/cotisations/templates/cotisations/aff_banque.html b/cotisations/templates/cotisations/aff_banque.html index b5074c6c..057c6995 100644 --- a/cotisations/templates/cotisations/aff_banque.html +++ b/cotisations/templates/cotisations/aff_banque.html @@ -26,25 +26,23 @@ with this program; if not, write to the Free Software Foundation, Inc., {% load i18n %} {% load logs_extra %} - - - - - - - - {% for banque in banque_list %} +
{% trans "Bank" %}
+ - - + + - {% endfor %} -
{{ banque.name }} - {% can_edit banque %} - - - - {% acl_end %} - {% history_button banque %} - {% trans "Bank" %}
+ + {% for banque in banque_list %} + + {{ banque.name }} + + {% can_edit banque %} + {% include 'buttons/edit.html' with href='cotisations:edit-banque' id=banque.id %} + {% acl_end %} + {% history_button banque %} + + + {% endfor %} + diff --git a/cotisations/templates/cotisations/aff_cotisations.html b/cotisations/templates/cotisations/aff_cotisations.html index 6b5fa8fa..b7fe993b 100644 --- a/cotisations/templates/cotisations/aff_cotisations.html +++ b/cotisations/templates/cotisations/aff_cotisations.html @@ -49,7 +49,7 @@ with this program; if not, write to the Free Software Foundation, Inc., {% include 'buttons/sort.html' with prefix='cotis' col='date' text=tr_date %} - {% trans "Invoice id" as tr_invoice_id %} + {% trans "Invoice ID" as tr_invoice_id %} {% include 'buttons/sort.html' with prefix='cotis' col='id' text=tr_invoice_id %} @@ -65,32 +65,15 @@ with this program; if not, write to the Free Software Foundation, Inc., {{ facture.date }} {{ facture.id }} - + {% can_edit facture %} + {% include 'buttons/edit.html' with href='cotisations:edit-facture' id=facture.id %} + {% acl_else %} + {% trans "Controlled invoice" %} + {% acl_end %} + {% can_delete facture %} + {% include 'buttons/suppr.html' with href='cotisations:del-facture' id=facture.id %} + {% acl_end %} + {% history_button facture text=True html_class=False %} {% if facture.valid %} @@ -109,3 +92,4 @@ with this program; if not, write to the Free Software Foundation, Inc., {% include 'pagination.html' with list=facture_list %} {% endif %} + diff --git a/cotisations/templates/cotisations/aff_custom_invoice.html b/cotisations/templates/cotisations/aff_custom_invoice.html index 1d182178..41984c2c 100644 --- a/cotisations/templates/cotisations/aff_custom_invoice.html +++ b/cotisations/templates/cotisations/aff_custom_invoice.html @@ -47,7 +47,7 @@ with this program; if not, write to the Free Software Foundation, Inc., {% include 'buttons/sort.html' with prefix='invoice' col='date' text=tr_date %} - {% trans "Invoice id" as tr_invoice_id %} + {% trans "Invoice ID" as tr_invoice_id %} {% include 'buttons/sort.html' with prefix='invoice' col='id' text=tr_invoice_id %} diff --git a/cotisations/templates/cotisations/aff_paiement.html b/cotisations/templates/cotisations/aff_paiement.html index 46523928..633eb456 100644 --- a/cotisations/templates/cotisations/aff_paiement.html +++ b/cotisations/templates/cotisations/aff_paiement.html @@ -41,7 +41,7 @@ with this program; if not, write to the Free Software Foundation, Inc., {{ paiement.moyen }} {{ paiement.available_for_everyone|tick }} - {{paiement.get_payment_method_name}} + {{ paiement.get_payment_method_name }} {% can_edit paiement %} diff --git a/cotisations/templates/cotisations/control.html b/cotisations/templates/cotisations/control.html index bb3a06b6..6a4a5cca 100644 --- a/cotisations/templates/cotisations/control.html +++ b/cotisations/templates/cotisations/control.html @@ -30,17 +30,20 @@ with this program; if not, write to the Free Software Foundation, Inc., {% block title %}{% trans "Invoice control" %}{% endblock %} {% block content %} +

{% trans "Invoice control and validation" %}

+ {% if facture_list.paginator %} {% include 'pagination.html' with list=facture_list %} {% endif %} +
{% csrf_token %} {{ controlform.management_form }} - + @@ -65,7 +68,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% trans "Profil" %}{% trans "Profile" %} {% trans "Last name" as tr_last_name %} {% include 'buttons/sort.html' with prefix='control' col='name' text=tr_last_name %} @@ -50,11 +53,11 @@ with this program; if not, write to the Free Software Foundation, Inc., {% include 'buttons/sort.html' with prefix='control' col='surname' text=tr_first_name %} - {% trans "Invoice id" as tr_invoice_id %} + {% trans "Invoice ID" as tr_invoice_id %} {% include 'buttons/sort.html' with prefix='control' col='id' text=tr_invoice_id %} - {% trans "User id" as tr_user_id %} + {% trans "User ID" as tr_user_id %} {% include 'buttons/sort.html' with prefix='control' col='user-id' text=tr_user_id %} {% trans "Designation" %} {% trans "Date" as tr_date %} - {% include 'buttons/sort.html' with prefix='control' col='date' text=tr_date %}i + {% include 'buttons/sort.html' with prefix='control' col='date' text=tr_date %} {% trans "Validated" as tr_validated %} @@ -109,3 +112,4 @@ with this program; if not, write to the Free Software Foundation, Inc., {% if facture_list.paginator %} {% include 'pagination.html' with list=facture_list %} {% endif %} + diff --git a/cotisations/templates/cotisations/delete.html b/cotisations/templates/cotisations/delete.html index a1c95d7a..dc06e5a5 100644 --- a/cotisations/templates/cotisations/delete.html +++ b/cotisations/templates/cotisations/delete.html @@ -26,18 +26,17 @@ with this program; if not, write to the Free Software Foundation, Inc., {% load bootstrap3 %} {% load i18n %} -{% block title %}{% trans "Deletion of cotisations" %}{% endblock %} +{% block title %}{% trans "Deletion of subscriptions" %}{% endblock %} {% block content %} {% csrf_token %}

- {% blocktrans %} - Warning. Are you sure you really want te delete this {{ object_name }} object ( {{ objet }} ) ? - {% endblocktrans %} + {% blocktrans %}Warning: are you sure you really want to delete this {{ object_name }} object ( {{ objet }} )?{% endblocktrans %}

{% trans "Confirm" as tr_confirm %} {% bootstrap_button tr_confirm button_type='submit' icon='trash' %} {% endblock %} + diff --git a/cotisations/templates/cotisations/edit_facture.html b/cotisations/templates/cotisations/edit_facture.html index d28f8511..9ddcac8c 100644 --- a/cotisations/templates/cotisations/edit_facture.html +++ b/cotisations/templates/cotisations/edit_facture.html @@ -28,7 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc., {% load massive_bootstrap_form %} {% load i18n %} -{% block title %}{% trans "Invoices creation and edition" %}{% endblock %} +{% block title %}{% trans "Creation and editing of invoices" %}{% endblock %} {% block content %} {% bootstrap_form_errors factureform %} @@ -62,3 +62,4 @@ with this program; if not, write to the Free Software Foundation, Inc., {% endblock %} + diff --git a/cotisations/templates/cotisations/facture.html b/cotisations/templates/cotisations/facture.html index 4ec05ec1..4f905160 100644 --- a/cotisations/templates/cotisations/facture.html +++ b/cotisations/templates/cotisations/facture.html @@ -27,20 +27,21 @@ with this program; if not, write to the Free Software Foundation, Inc., {% load staticfiles%} {% load i18n %} -{% block title %}{% trans "Invoices creation and edition" %}{% endblock %} +{% block title %}{% trans "Creation and editing of invoices" %}{% endblock %} {% block content %} + {% if title %} -

{{title}}

+

{{ title }}

{% else %}

{% trans "New invoice" %}

{% endif %} {% if max_balance %} -

{% trans "Maximum allowed balance : "%}{{max_balance}} €

+

{% blocktrans %}Maximum allowed balance: {{ max_balance }} €{% endblocktrans %}

{% endif %} {% if balance is not None %}

- {% trans "Current balance :" %} {{ balance }} € +{% blocktrans %}Current balance: {{ balance }} €{% endblocktrans %}

{% endif %} @@ -68,9 +69,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,

- {% blocktrans %} - Total price : 0,00 € - {% endblocktrans %} + {% blocktrans %}Total price: 0,00 €{% endblocktrans %}

{% endif %} {% bootstrap_button action_name button_type='submit' icon='star' %} @@ -183,3 +182,4 @@ with this program; if not, write to the Free Software Foundation, Inc., {% endif %} {% endblock %} + diff --git a/cotisations/templates/cotisations/index.html b/cotisations/templates/cotisations/index.html index 9482cb5a..ca9cde5b 100644 --- a/cotisations/templates/cotisations/index.html +++ b/cotisations/templates/cotisations/index.html @@ -29,7 +29,7 @@ with this program; if not, write to the Free Software Foundation, Inc., {% block title %}{% trans "Invoices" %}{% endblock %} {% block content %} -

{% trans "Cotisations" %}

+

{% trans "Subscriptions" %}

{% include 'cotisations/aff_cotisations.html' with facture_list=facture_list %} {% endblock %} diff --git a/cotisations/templates/cotisations/index_article.html b/cotisations/templates/cotisations/index_article.html index 5e6c3967..41ffb62e 100644 --- a/cotisations/templates/cotisations/index_article.html +++ b/cotisations/templates/cotisations/index_article.html @@ -37,7 +37,7 @@ with this program; if not, write to the Free Software Foundation, Inc., {% acl_end %} - {% trans "Delete article types" %} + {% trans "Delete one or several article types" %} {% include 'cotisations/aff_article.html' with article_list=article_list %} {% endblock %} diff --git a/cotisations/templates/cotisations/index_banque.html b/cotisations/templates/cotisations/index_banque.html index e9118d75..f4dea1b1 100644 --- a/cotisations/templates/cotisations/index_banque.html +++ b/cotisations/templates/cotisations/index_banque.html @@ -37,7 +37,7 @@ with this program; if not, write to the Free Software Foundation, Inc., {% acl_end %} - {% trans "Delete banks" %} + {% trans "Delete one or several banks" %} {% include 'cotisations/aff_banque.html' with banque_list=banque_list %} {% endblock %} diff --git a/cotisations/templates/cotisations/index_paiement.html b/cotisations/templates/cotisations/index_paiement.html index d84c72eb..f4908d02 100644 --- a/cotisations/templates/cotisations/index_paiement.html +++ b/cotisations/templates/cotisations/index_paiement.html @@ -27,17 +27,17 @@ with this program; if not, write to the Free Software Foundation, Inc., {% load acl %} {% load i18n %} -{% block title %}{% trans "Payments" %}{% endblock %} +{% block title %}{% trans "Payment methods" %}{% endblock %} {% block content %} -

{% trans "Payment types list" %}

+

{% trans "List of payment methods" %}

{% can_create Paiement %} - {% trans "Add a payment type" %} + {% trans "Add a payment method" %} {% acl_end %} - {% trans "Delete payment types" %} + {% trans "Delete one or several payment methods" %} {% include 'cotisations/aff_paiement.html' with paiement_list=paiement_list %} {% endblock %} diff --git a/cotisations/templates/cotisations/payment.html b/cotisations/templates/cotisations/payment.html index e1c8b0d0..997168fd 100644 --- a/cotisations/templates/cotisations/payment.html +++ b/cotisations/templates/cotisations/payment.html @@ -31,11 +31,9 @@ with this program; if not, write to the Free Software Foundation, Inc., {% block content %}

- {% blocktrans %} - Pay {{ amount }} € - {% endblocktrans %} + {% blocktrans %}Pay {{ amount }} €{% endblocktrans %}

-
+ {{ content | safe }} {% if form %} {% csrf_token %} @@ -45,3 +43,4 @@ with this program; if not, write to the Free Software Foundation, Inc., {% bootstrap_button tr_pay button_type='submit' icon='piggy-bank' %}
{% endblock %} + diff --git a/cotisations/templates/cotisations/sidebar.html b/cotisations/templates/cotisations/sidebar.html index 7be91b1c..4f077fad 100644 --- a/cotisations/templates/cotisations/sidebar.html +++ b/cotisations/templates/cotisations/sidebar.html @@ -61,3 +61,4 @@ with this program; if not, write to the Free Software Foundation, Inc., {% acl_end %} {% endblock %} + diff --git a/cotisations/validators.py b/cotisations/validators.py index fa8ea2cf..b1683e82 100644 --- a/cotisations/validators.py +++ b/cotisations/validators.py @@ -17,5 +17,6 @@ def check_no_balance(is_balance): p = Paiement.objects.filter(is_balance=True) if len(p) > 0: raise ValidationError( - _("There are already payment method(s) for user balance") + _("There is already a payment method for user balance.") ) + diff --git a/cotisations/views.py b/cotisations/views.py index 90bc3632..193f4321 100644 --- a/cotisations/views.py +++ b/cotisations/views.py @@ -225,7 +225,7 @@ def new_custom_invoice(request): ) messages.success( request, - _('The custom invoice was successfully created.') + _("The custom invoice was created.") ) return redirect(reverse('cotisations:index-custom-invoice')) @@ -313,7 +313,7 @@ def edit_facture(request, facture, **_kwargs): purchase_form.save() messages.success( request, - _("The invoice has been successfully edited.") + _("The invoice was edited.") ) return redirect(reverse('cotisations:index')) return form({ @@ -333,7 +333,7 @@ def del_facture(request, facture, **_kwargs): facture.delete() messages.success( request, - _("The invoice has been successfully deleted.") + _("The invoice was deleted.") ) return redirect(reverse('cotisations:index')) return form({ @@ -367,7 +367,7 @@ def edit_custom_invoice(request, invoice, **kwargs): purchase_form.save() messages.success( request, - _("The invoice has been successfully edited.") + _("The invoice was edited.") ) return redirect(reverse('cotisations:index-custom-invoice')) @@ -427,7 +427,7 @@ def del_custom_invoice(request, invoice, **_kwargs): invoice.delete() messages.success( request, - _("The invoice has been successfully deleted.") + _("The invoice was deleted.") ) return redirect(reverse('cotisations:index-custom-invoice')) return form({ @@ -453,7 +453,7 @@ def add_article(request): article.save() messages.success( request, - _("The article has been successfully created.") + _("The article was created.") ) return redirect(reverse('cotisations:index-article')) return form({ @@ -475,7 +475,7 @@ def edit_article(request, article_instance, **_kwargs): article.save() messages.success( request, - _("The article has been successfully edited.") + _("The article was edited.") ) return redirect(reverse('cotisations:index-article')) return form({ @@ -497,7 +497,7 @@ def del_article(request, instances): article_del.delete() messages.success( request, - _("The article(s) have been successfully deleted.") + _("The articles were deleted.") ) return redirect(reverse('cotisations:index-article')) return form({ @@ -525,7 +525,7 @@ def add_paiement(request): payment_method.save(payment) messages.success( request, - _("The payment method has been successfully created.") + _("The payment method was created.") ) return redirect(reverse('cotisations:index-paiement')) return form({ @@ -561,8 +561,7 @@ def edit_paiement(request, paiement_instance, **_kwargs): if payment_method is not None: payment_method.save() messages.success( - request, - _("The payement method has been successfully edited.") + request,_("The payment method was edited.") ) return redirect(reverse('cotisations:index-paiement')) return form({ @@ -588,8 +587,7 @@ def del_paiement(request, instances): payment_del.delete() messages.success( request, - _("The payment method %(method_name)s has been \ - successfully deleted.") % { + _("The payment method %(method_name)s was deleted.") % { 'method_name': payment_del } ) @@ -621,7 +619,7 @@ def add_banque(request): bank.save() messages.success( request, - _("The bank has been successfully created.") + _("The bank was created.") ) return redirect(reverse('cotisations:index-banque')) return form({ @@ -644,7 +642,7 @@ def edit_banque(request, banque_instance, **_kwargs): bank.save() messages.success( request, - _("The bank has been successfully edited") + _("The bank was edited.") ) return redirect(reverse('cotisations:index-banque')) return form({ @@ -669,8 +667,7 @@ def del_banque(request, instances): bank_del.delete() messages.success( request, - _("The bank %(bank_name)s has been successfully \ - deleted.") % { + _("The bank %(bank_name)s was deleted.") % { 'bank_name': bank_del } ) @@ -873,3 +870,4 @@ def credit_solde(request, user, **_kwargs): 'action_name': _("Pay"), 'max_balance': p.payment_method.maximum_balance, }, 'cotisations/facture.html', request) + 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 00000000..030b0cac Binary files /dev/null and b/logs/locale/fr/LC_MESSAGES/django.mo differ 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 \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 %} @@ -32,11 +32,12 @@ with this program; if not, write to the Free Software Foundation, Inc., {% for key, stat in stats.1.items %} - - {% for item in stat %} - - {% endfor %} - - {% endfor %} + + {% for item in stat %} + + {% endfor %} + + {% endfor %}
{{ item }}
{{ item }}
- {% 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 %} - - +
+ + + + + {% trans "Edited by" as tr_edited_by %} + + {% trans "Date of editing" as tr_date_of_editing %} + + + + + + {% for revision in revisions_list %} + {% for reversion in revision.version_set.all %} - - - - - - + + + + + + {% can_edit_history %} + + {% acl_end %} - - {% for revision in revisions_list %} - {% for reversion in revision.version_set.all %} - - - - - - - {% can_edit_history %} - - {% acl_end %} - - {% endfor %} {% endfor %} -
{% trans "Edited object" %}{% trans "Object type" %}{% include "buttons/sort.html" with prefix='logs' col='author' text=tr_edited_by %}{% include "buttons/sort.html" with prefix='logs' col='date' text=tr_date_of_editing %}{% trans "Comment" %}
Objet modifiéType de l'objet{% include "buttons/sort.html" with prefix='logs' col='author' text='Modification par' %}{% include "buttons/sort.html" with prefix='logs' col='date' text='Date de modification' %}Commentaire{{ reversion.object|truncatechars:20 }}{{ reversion.object|classname }}{{ revision.user }}{{ revision.date_created }}{{ revision.comment }} + + + {% trans "Cancel" %} + +
{{ reversion.object|truncatechars:20 }}{{ reversion.object|classname }}{{ revision.user }}{{ revision.date_created }}{{ revision.comment }} - - - Annuler - -
+ {% endfor %} +
{% 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 %} -

Statistiques de l'ensemble {{ key }}

- - - - - - - {% for key, stat in stats.items %} - - - - - {% endfor %} +

{% blocktrans %}Statistics of the set {{ key }}{% endblocktrans %}

+ + + + + + + {% for key, stat in stats.items %} + + + + + {% endfor %}
Type d'objetNombre d'entrée stockées
{{ stat.0 }}{{ stat.1 }}
{% trans "Object type" %}{% trans "Number of stored entries" %}
{{ stat.0 }}{{ stat.1 }}
- {% 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 %} - - -

Statistiques par {{ key_dict }} de {{ key }}

- - - - - - - {% for stat in stats %} - - - - - - {% endfor %} -
{{ key_dict }}Nombre de {{ key }} par {{ key_dict }}Rang
{{ stat|truncatechars:25 }}{{ stat.num }}{{ forloop.counter }}
- {% endfor %} - {% endfor %} + + +

{% blocktrans %}Statistics per {{ key_dict }} of {{ key }}{% endblocktrans %}

+ + + + + + + {% for stat in stats %} + + + + + + {% endfor %} +
{{ key_dict }}{% blocktrans %}Number of {{ key }} per {{ key_dict }}{% endblocktrans %}{% trans "Rank" %}
{{ stat|truncatechars:25 }}{{ stat.num }}{{ forloop.counter }}
+ {% 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 %} - - - - - - - - + +{% load i18n %} + +
{% include "buttons/sort.html" with prefix='sum' col='date' text='Date' %}Modification
+ + + {% trans "Date" as tr_date %} + + + + + {% for v in versions_list %} {% if v.version.content_type.model == 'ban' %} - {% can_edit_history %} + {% can_edit_history %} - {% acl_end %} + {% acl_end %} {% elif v.version.content_type.model == 'whitelist' %} - {% can_edit_history%} + {% can_edit_history%} - {% acl_end %} + {% acl_end %} {% elif v.version.content_type.model == 'user' %} - {% can_edit_history %} + {% can_edit_history %} - {% acl_end %} + {% acl_end %} {% elif v.version.content_type.model == 'vente' %} - {% can_edit_history %} + {% can_edit_history %} - {% acl_end %} + {% acl_end %} {% elif v.version.content_type.model == 'interface' %} - {% can_edit_history %} + {% can_edit_history %} - {% acl_end %} + {% acl_end %} {% endif %} {% endfor %} -
{% include "buttons/sort.html" with prefix='sum' col='date' text=tr_date %}{% trans "Editing" %}
{{ v.datetime }} - {{ v.username }} a banni + {% blocktrans with username=v.username %}{{ username }} has banned{% endblocktrans %} {{ v.version.object.user.get_username }} - ( + ( {% if v.version.object.raison == '' %} - Aucune raison + {% trans "No reason" %} {% else %} {{ v.version.object.raison }} {% endif %} ) - Annuler + {% trans "Cancel" %}
{{ v.datetime }} - {{ v.username }} a autorisé gracieusement + {% blocktrans with username=v.username %}{{ username }} has graciously authorised{% endblocktrans %} {{ v.version.object.user.get_username }} ( {% if v.version.object.raison == '' %} - Aucune raison + {% trans "No reason" %} {% else %} {{ v.version.object.raison }} {% endif %} ) - Annuler + {% trans "Cancel" %}
{{ v.datetime }} - {{ v.username }} a mis à jour + {% blocktrans with username=v.username %}{{ username }} has updated{% endblocktrans %} {{ v.version.object.get_username }} - {% if v.comment != '' %} - ({{ v.comment }}) - {% endif %} + {% if v.comment != '' %} + ({{ v.comment }}) + {% endif %} - Annuler + {% trans "Cancel" %}
{{ v.datetime }} - {{ 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 %} {{ v.version.object.facture.user.get_username }} - {% if v.version.object.iscotisation %} - (+{{ v.version.object.duration }} mois) - {% endif %} + {% if v.version.object.iscotisation %} + ({% blocktrans with duration=v.version.object.duration %}+{{ duration }} months{% endblocktrans %}) + {% endif %} - Annuler + {% trans "Cancel" %}
{{ v.datetime }} - {{ v.username }} a modifié une interface de + {% blocktrans with username=v.username %}{{ username }} has edited an interface of{% endblocktrans %} {{ v.version.object.machine.user.get_username }} - {% if v.comment != '' %} - ({{ v.comment }}) - {% endif %} + {% if v.comment != '' %} + ({{ v.comment }}) + {% endif %} - Annuler + {% trans "Cancel" %}
+ {% 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 %}
{% csrf_token %} -

Attention, voulez-vous vraiment annuler cette action {{ objet_name }} ( {{ objet }} ) ?

- {% bootstrap_button "Confirmer" button_type="submit" icon="trash" %} +

{% blocktrans %}Warning: are you sure you want to delete this action {{ objet_name }} ( {{ objet }} )?{% endblocktrans %}

+ {% trans "Confirm" as tr_confirm %} + {% bootstrap_button tr_confirm button_type="submit" icon="trash" %}
-
-
-
+
+
+
{% 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 %} -

Actions effectuées

- {% include "logs/aff_summary.html" with versions_list=versions_list %} -
-
-
- {% endblock %} +

{% trans "Actions performed" %}

+ {% include "logs/aff_summary.html" with versions_list=versions_list %} +
+
+
+{% 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 %} - Résumé + {% trans "Summary" %} - Évènements + {% trans "Events" %} - Général + {% trans "General" %} - Base de données + {% trans "Database" %} - Actions de cablage + {% trans "Wiring actions" %} - Utilisateurs + {% trans "Users" %} {% 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 %} -

Statistiques générales

- {% include "logs/aff_stats_general.html" with stats_list=stats_list %} -
-
-
- {% endblock %} +

{% trans "General statistics" %}

+ {% include "logs/aff_stats_general.html" with stats_list=stats_list %} +
+
+
+{% 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 %} -

Actions effectuées

- {% include "logs/aff_stats_logs.html" with revisions_list=revisions_list %} -
-
-
- {% endblock %} +

{% trans "Actions performed" %}

+ {% include "logs/aff_stats_logs.html" with revisions_list=revisions_list %} +
+
+
+{% 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 %} -

Statistiques bdd

- {% include "logs/aff_stats_models.html" with stats_list=stats_list %} -
-
-
- {% endblock %} +

{% trans "Database statistics" %}

+ {% include "logs/aff_stats_models.html" with stats_list=stats_list %} +
+
+
+{% 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 %} -

Statistiques par utilisateur

- {% include "logs/aff_stats_users.html" with stats_list=stats_list %} -
-
-
- {% endblock %} +

{% trans "Statistics about users" %}

+ {% include "logs/aff_stats_users.html" with stats_list=stats_list %} +
+
+
+{% 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} ) + diff --git a/machines/acl.py b/machines/acl.py index 1b74760c..45cb6ec2 100644 --- a/machines/acl.py +++ b/machines/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('machines') - 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/machines/forms.py b/machines/forms.py index b68cb203..4af060d3 100644 --- a/machines/forms.py +++ b/machines/forms.py @@ -37,7 +37,7 @@ from __future__ import unicode_literals from django.forms import ModelForm, Form from django import forms -from django.utils.translation import ugettext_lazy as _l +from django.utils.translation import ugettext_lazy as _ from re2o.field_permissions import FieldPermissionFormMixin from re2o.mixins import FormRevMixin @@ -75,7 +75,7 @@ class EditMachineForm(FormRevMixin, FieldPermissionFormMixin, ModelForm): def __init__(self, *args, **kwargs): prefix = kwargs.pop('prefix', self.Meta.model.__name__) super(EditMachineForm, self).__init__(*args, prefix=prefix, **kwargs) - self.fields['name'].label = 'Nom de la machine' + self.fields['name'].label = _("Machine name") class NewMachineForm(EditMachineForm): @@ -94,12 +94,11 @@ class EditInterfaceForm(FormRevMixin, FieldPermissionFormMixin, ModelForm): prefix = kwargs.pop('prefix', self.Meta.model.__name__) user = kwargs.get('user') super(EditInterfaceForm, self).__init__(*args, prefix=prefix, **kwargs) - self.fields['mac_address'].label = 'Adresse mac' - self.fields['type'].label = 'Type de machine' - self.fields['type'].empty_label = "Séléctionner un type de machine" + self.fields['mac_address'].label = _("MAC address") + self.fields['type'].label = _("Machine type") + self.fields['type'].empty_label = _("Select a machine type") if "ipv4" in self.fields: - self.fields['ipv4'].empty_label = ("Assignation automatique de " - "l'ipv4") + self.fields['ipv4'].empty_label = _("Automatic IPv4 assignment") self.fields['ipv4'].queryset = IpList.objects.filter( interface__isnull=True ) @@ -170,7 +169,7 @@ class DelAliasForm(FormRevMixin, Form): """Suppression d'un ou plusieurs objets alias""" alias = forms.ModelMultipleChoiceField( queryset=Domain.objects.all(), - label="Alias actuels", + label=_("Current aliases"), widget=forms.CheckboxSelectMultiple ) @@ -191,15 +190,15 @@ class MachineTypeForm(FormRevMixin, ModelForm): def __init__(self, *args, **kwargs): prefix = kwargs.pop('prefix', self.Meta.model.__name__) super(MachineTypeForm, self).__init__(*args, prefix=prefix, **kwargs) - self.fields['type'].label = 'Type de machine à ajouter' - self.fields['ip_type'].label = "Type d'ip relié" + self.fields['type'].label = _("Machine type to add") + self.fields['ip_type'].label = _("Related IP type") class DelMachineTypeForm(FormRevMixin, Form): """Suppression d'un ou plusieurs machinetype""" machinetypes = forms.ModelMultipleChoiceField( queryset=MachineType.objects.none(), - label="Types de machines actuelles", + label=_("Current machine types"), widget=forms.CheckboxSelectMultiple ) @@ -222,7 +221,7 @@ class IpTypeForm(FormRevMixin, ModelForm): def __init__(self, *args, **kwargs): prefix = kwargs.pop('prefix', self.Meta.model.__name__) super(IpTypeForm, self).__init__(*args, prefix=prefix, **kwargs) - self.fields['type'].label = 'Type ip à ajouter' + self.fields['type'].label = _("IP type to add") class EditIpTypeForm(IpTypeForm): @@ -239,7 +238,7 @@ class DelIpTypeForm(FormRevMixin, Form): """Suppression d'un ou plusieurs iptype""" iptypes = forms.ModelMultipleChoiceField( queryset=IpType.objects.none(), - label="Types d'ip actuelles", + label=_("Current IP types"), widget=forms.CheckboxSelectMultiple ) @@ -261,17 +260,17 @@ class ExtensionForm(FormRevMixin, ModelForm): def __init__(self, *args, **kwargs): prefix = kwargs.pop('prefix', self.Meta.model.__name__) super(ExtensionForm, self).__init__(*args, prefix=prefix, **kwargs) - self.fields['name'].label = 'Extension à ajouter' - self.fields['origin'].label = 'Enregistrement A origin' - self.fields['origin_v6'].label = 'Enregistrement AAAA origin' - self.fields['soa'].label = 'En-tête SOA à utiliser' + self.fields['name'].label = _("Extension to add") + self.fields['origin'].label = _("A record origin") + self.fields['origin_v6'].label = _("AAAA record origin") + self.fields['soa'].label = _("SOA record to use") class DelExtensionForm(FormRevMixin, Form): """Suppression d'une ou plusieurs extensions""" extensions = forms.ModelMultipleChoiceField( queryset=Extension.objects.none(), - label="Extensions actuelles", + label=_("Current extensions"), widget=forms.CheckboxSelectMultiple ) @@ -310,7 +309,7 @@ class DelSOAForm(FormRevMixin, Form): """Suppression d'un ou plusieurs SOA""" soa = forms.ModelMultipleChoiceField( queryset=SOA.objects.none(), - label="SOA actuels", + label=_("Current SOA records"), widget=forms.CheckboxSelectMultiple ) @@ -341,7 +340,7 @@ class DelMxForm(FormRevMixin, Form): """Suppression d'un ou plusieurs MX""" mx = forms.ModelMultipleChoiceField( queryset=Mx.objects.none(), - label="MX actuels", + label=_("Current MX records"), widget=forms.CheckboxSelectMultiple ) @@ -374,7 +373,7 @@ class DelNsForm(FormRevMixin, Form): """Suppresion d'un ou plusieurs NS""" ns = forms.ModelMultipleChoiceField( queryset=Ns.objects.none(), - label="Enregistrements NS actuels", + label=_("Current NS records"), widget=forms.CheckboxSelectMultiple ) @@ -402,7 +401,7 @@ class DelTxtForm(FormRevMixin, Form): """Suppression d'un ou plusieurs TXT""" txt = forms.ModelMultipleChoiceField( queryset=Txt.objects.none(), - label="Enregistrements Txt actuels", + label=_("Current TXT records"), widget=forms.CheckboxSelectMultiple ) @@ -430,7 +429,7 @@ class DelDNameForm(FormRevMixin, Form): """Delete a set of DNAME entries""" dnames = forms.ModelMultipleChoiceField( queryset=Txt.objects.none(), - label="Existing DNAME entries", + label=_("Current DNAME records"), widget=forms.CheckboxSelectMultiple ) @@ -458,7 +457,7 @@ class DelSrvForm(FormRevMixin, Form): """Suppression d'un ou plusieurs Srv""" srv = forms.ModelMultipleChoiceField( queryset=Srv.objects.none(), - label="Enregistrements Srv actuels", + label=_("Current SRV records"), widget=forms.CheckboxSelectMultiple ) @@ -487,7 +486,7 @@ class DelNasForm(FormRevMixin, Form): """Suppression d'un ou plusieurs nas""" nas = forms.ModelMultipleChoiceField( queryset=Nas.objects.none(), - label="Enregistrements Nas actuels", + label=_("Current NAS devices"), widget=forms.CheckboxSelectMultiple ) @@ -519,7 +518,7 @@ class DelRoleForm(FormRevMixin, Form): """Deletion of one or several roles.""" role = forms.ModelMultipleChoiceField( queryset=Role.objects.none(), - label=_l("Current roles"), + label=_("Current roles"), widget=forms.CheckboxSelectMultiple ) @@ -560,7 +559,7 @@ class DelServiceForm(FormRevMixin, Form): """Suppression d'un ou plusieurs service""" service = forms.ModelMultipleChoiceField( queryset=Service.objects.none(), - label="Services actuels", + label=_("Current services"), widget=forms.CheckboxSelectMultiple ) @@ -588,7 +587,7 @@ class DelVlanForm(FormRevMixin, Form): """Suppression d'un ou plusieurs vlans""" vlan = forms.ModelMultipleChoiceField( queryset=Vlan.objects.none(), - label="Vlan actuels", + label=_("Current VLANs"), widget=forms.CheckboxSelectMultiple ) @@ -646,3 +645,4 @@ class SshFpForm(FormRevMixin, ModelForm): prefix=prefix, **kwargs ) + diff --git a/machines/locale/fr/LC_MESSAGES/django.mo b/machines/locale/fr/LC_MESSAGES/django.mo new file mode 100644 index 00000000..c9696d92 Binary files /dev/null and b/machines/locale/fr/LC_MESSAGES/django.mo differ diff --git a/machines/locale/fr/LC_MESSAGES/django.po b/machines/locale/fr/LC_MESSAGES/django.po new file mode 100644 index 00000000..50ab03a8 --- /dev/null +++ b/machines/locale/fr/LC_MESSAGES/django.po @@ -0,0 +1,1748 @@ +# 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 18:10+0200\n" +"PO-Revision-Date: 2018-06-23 16:35+0200\n" +"Last-Translator: Laouen Fernet \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." + +#: forms.py:78 +msgid "Machine name" +msgstr "Nom de la machine" + +#: forms.py:97 templates/machines/aff_machines.html:46 +msgid "MAC address" +msgstr "Adresse MAC" + +#: forms.py:98 templates/machines/aff_machinetype.html:32 +#: templates/machines/machine.html:112 +msgid "Machine type" +msgstr "Type de machine" + +#: forms.py:99 +msgid "Select a machine type" +msgstr "Sélectionnez un type de machine" + +#: forms.py:101 +msgid "Automatic IPv4 assignment" +msgstr "Assignation automatique IPv4" + +#: forms.py:172 +msgid "Current aliases" +msgstr "Alias actuels" + +#: forms.py:193 +msgid "Machine type to add" +msgstr "Type de machine à ajouter" + +#: forms.py:194 +msgid "Related IP type" +msgstr "Type d'IP relié" + +#: forms.py:201 +msgid "Current machine types" +msgstr "Types de machines actuels" + +#: forms.py:224 +msgid "IP type to add" +msgstr "Type d'IP à ajouter" + +#: forms.py:241 +msgid "Current IP types" +msgstr "Types d'IP actuels" + +#: forms.py:263 +msgid "Extension to add" +msgstr "Extension à ajouter" + +#: forms.py:264 templates/machines/aff_extension.html:37 +msgid "A record origin" +msgstr "Enregistrement A origin" + +#: forms.py:265 templates/machines/aff_extension.html:39 +msgid "AAAA record origin" +msgstr "Enregistrement AAAA origin" + +#: forms.py:266 +msgid "SOA record to use" +msgstr "Enregistrement SOA à utiliser" + +#: forms.py:273 +msgid "Current extensions" +msgstr "Extensions actuelles" + +#: forms.py:312 +msgid "Current SOA records" +msgstr "Enregistrements SOA actuels" + +#: forms.py:343 +msgid "Current MX records" +msgstr "Enregistrements MX actuels" + +#: forms.py:376 +msgid "Current NS records" +msgstr "Enregistrements NS actuels" + +#: forms.py:404 +msgid "Current TXT records" +msgstr "Enregistrements TXT actuels" + +#: forms.py:432 +msgid "Current DNAME records" +msgstr "Enregistrements DNAME actuels" + +#: forms.py:460 +msgid "Current SRV records" +msgstr "Enregistrements SRV actuels" + +#: forms.py:489 +msgid "Current NAS devices" +msgstr "Dispositifs NAS actuels" + +#: forms.py:521 +msgid "Current roles" +msgstr "Rôles actuels" + +#: forms.py:562 +msgid "Current services" +msgstr "Services actuels" + +#: forms.py:590 +msgid "Current VLANs" +msgstr "VLANs actuels" + +#: models.py:63 +msgid "Optional" +msgstr "Optionnel" + +#: models.py:71 +msgid "Can view a machine object" +msgstr "Peut voir un objet machine" + +#: models.py:73 +msgid "Can change the user of a machine" +msgstr "Peut changer l'utilisateur d'une machine" + +#: models.py:75 +msgid "machine" +msgstr "machine" + +#: models.py:76 +msgid "machines" +msgstr "machines" + +#: models.py:109 +msgid "You don't have the right to change the machine's user." +msgstr "Vous n'avez pas le droit de changer l'utilisateur de la machine." + +#: models.py:118 +msgid "You don't have the right to view all the machines." +msgstr "Vous n'avez pas le droit de voir toutes les machines." + +#: models.py:132 +msgid "Nonexistent user." +msgstr "Utilisateur inexistant." + +#: models.py:140 +msgid "You don't have the right to add a machine." +msgstr "Vous n'avez pas le droit d'ajouter une machine." + +#: models.py:142 +msgid "You don't have the right to add a machine to another user." +msgstr "Vous n'avez pas le droit d'ajouter une machine à un autre utilisateur." + +#: models.py:145 models.py:1152 +#, python-format +msgid "" +"You reached the maximum number of interfaces that you are allowed to create " +"yourself (%s)." +msgstr "" +"Vous avez atteint le nombre maximal d'interfaces que vous pouvez créer vous-" +"mêmes (%s)." + +#: models.py:164 models.py:1177 models.py:1194 models.py:1296 models.py:1313 +msgid "You don't have the right to edit a machine of another user." +msgstr "" +"Vous n'avez pas le droit de modifier une machine d'un autre utilisateur." + +#: models.py:182 +msgid "You don't have the right to delete a machine of another user." +msgstr "" +"Vous n'avez pas le droit de supprimer une machine d'une autre utilisateur." + +#: models.py:194 +msgid "You don't have the right to view other machines than yours." +msgstr "Vous n'avez pas le droit de voir d'autres machines que les vôtres." + +#: models.py:241 +msgid "Can view a machine type object" +msgstr "Peut voir un objet type de machine" + +#: models.py:242 +msgid "Can use all machine types" +msgstr "Peut utiliser tous les types de machine" + +#: models.py:244 +msgid "machine type" +msgstr "type de machine" + +#: models.py:245 +msgid "machine types" +msgstr "types de machine" + +#: models.py:263 +msgid "You don't have the right to use all machine types." +msgstr "Vous n'avez pas le droit d'utiliser tous les types de machine." + +#: models.py:282 +msgid "Network containing the domain's IPv4 range (optional)" +msgstr "Réseau contenant la plage IPv4 du domaine (optionnel)" + +#: models.py:290 +msgid "Netmask for the domain's IPv4 range" +msgstr "Masque de sous-réseau pour la plage IPv4 du domaine" + +#: models.py:294 +msgid "Enable reverse DNS for IPv4" +msgstr "Activer DNS inverse pour IPv4" + +#: models.py:310 +msgid "Enable reverse DNS for IPv6" +msgstr "Activer DNS inverser pour IPv6" + +#: models.py:326 +msgid "Can view an IP type object" +msgstr "Peut voir un objet type d'IP" + +#: models.py:327 +msgid "Can use all IP types" +msgstr "Peut utiliser tous les types d'IP" + +#: models.py:329 templates/machines/aff_iptype.html:35 +#: templates/machines/machine.html:108 +msgid "IP type" +msgstr "type d'IP" + +#: models.py:433 +msgid "" +"One or several IP addresses from the range are affected, impossible to " +"delete the range." +msgstr "" +"Une ou plusieurs adresses IP de la plage sont affectées, impossible de " +"supprimer la plage." + +#: models.py:475 +msgid "Range end must be after range start..." +msgstr "La fin de la plage doit être après le début..." + +#: models.py:478 +msgid "The range is too large, you can't create a larger one than a /16." +msgstr "" +"La plage est trop grande, vous ne pouvez pas en créer une plus grande " +"qu'un /16." + +#: models.py:483 +msgid "The specified range is not disjoint from existing ranges." +msgstr "La plage renseignée n'est pas disjointe des plages existantes." + +#: models.py:491 +msgid "" +"If you specify a domain network or netmask, it must contain the domain's IP " +"range." +msgstr "" +"Si vous renseignez un réseau ou masque de sous-réseau, il doit contenir" +" la plage IP du domaine." + +#: models.py:521 +msgid "Can view a VLAN object" +msgstr "Peut voir un objet VLAN" + +#: models.py:523 templates/machines/machine.html:160 +msgid "VLAN" +msgstr "VLAN" + +#: models.py:524 templates/machines/sidebar.html:57 +msgid "VLANs" +msgstr "VLANs" + +#: models.py:560 +msgid "Can view a NAS device object" +msgstr "Peut voir un objet dispositif NAS" + +#: models.py:562 templates/machines/machine.html:164 +msgid "NAS device" +msgstr "dispositif NAS" + +#: models.py:563 templates/machines/sidebar.html:63 +msgid "NAS devices" +msgstr "dispositifs NAS" + +#: models.py:577 +msgid "Contact email address for the zone" +msgstr "Adresse mail de contact pour la zone" + +#: models.py:581 +msgid "" +"Seconds before the secondary DNS have to ask the primary DNS serial to " +"detect a modification" +msgstr "" +"Secondes avant que le DNS secondaire demande au DNS primaire le serial pour " +"détecter une modification" + +#: models.py:586 +msgid "" +"Seconds before the secondary DNS ask the serial again in case of a primary " +"DNS timeout" +msgstr "" +"Secondes avant que le DNS secondaire demande le serial de nouveau dans le " +"cas d'un délai d'attente du DNS primaire" + +#: models.py:591 +msgid "" +"Seconds before the secondary DNS stop answering requests in case of primary " +"DNS timeout" +msgstr "" +"Secondes avant que le DNS secondaire arrête de répondre aux requêtes dans le " +"cas d'un délai d'attente du DNS primaire" + +#: models.py:596 models.py:846 +msgid "Time to Live" +msgstr "Temps de vie" + +#: models.py:601 +msgid "Can view an SOA record object" +msgstr "Peut voir un objet enregistrement SOA" + +#: models.py:603 templates/machines/aff_extension.html:36 +#: templates/machines/machine.html:120 +msgid "SOA record" +msgstr "enregistrement SOA" + +#: models.py:604 +msgid "SOA records" +msgstr "enregistrements SOA" + +#: models.py:643 +msgid "SOA to edit" +msgstr "SOA à modifier" + +#: models.py:654 +msgid "Zone name, must begin with a dot (.example.org)" +msgstr "Nom de zone, doit commencer par un point (.example.org)" + +#: models.py:662 +msgid "A record associated with the zone" +msgstr "Enregistrement A associé à la zone" + +#: models.py:668 +msgid "AAAA record associated with the zone" +msgstr "Enregristrement AAAA associé avec la zone" + +#: models.py:677 +msgid "Can view an extension object" +msgstr "Peut voir un objet extension" + +#: models.py:678 +msgid "Can use all extensions" +msgstr "Peut utiliser toutes les extensions" + +#: models.py:680 +msgid "DNS extension" +msgstr "extension DNS" + +#: models.py:681 +msgid "DNS extensions" +msgstr "extensions DNS" + +#: models.py:732 +msgid "An extension must begin with a dot." +msgstr "Une extension doit commencer par un point." + +#: models.py:746 +msgid "Can view an MX record object" +msgstr "Peut voir un objet enregistrement MX" + +#: models.py:748 templates/machines/machine.html:124 +msgid "MX record" +msgstr "enregistrement MX" + +#: models.py:749 +msgid "MX records" +msgstr "enregistrements MX" + +#: models.py:771 +msgid "Can view an NS record object" +msgstr "Peut voir un objet enregistrement NS" + +#: models.py:773 templates/machines/machine.html:128 +msgid "NS record" +msgstr "enregistrement NS" + +#: models.py:774 +msgid "NS records" +msgstr "enregistrements NS" + +#: models.py:793 +msgid "Can view a TXT record object" +msgstr "Peut voir un objet enregistrement TXT" + +#: models.py:795 templates/machines/machine.html:132 +msgid "TXT record" +msgstr "enregistrement TXT" + +#: models.py:796 +msgid "TXT records" +msgstr "enregistrements TXT" + +#: models.py:815 +msgid "Can view a DNAME record object" +msgstr "Peut voir un objet enregistrement DNAME" + +#: models.py:817 templates/machines/machine.html:136 +msgid "DNAME record" +msgstr "enregistrement DNAME" + +#: models.py:818 +msgid "DNAME records" +msgstr "enregistrements DNAME" + +#: models.py:851 +msgid "" +"Priority of the target server (positive integer value, the lower it is, the " +"more the server will be used if available)" +msgstr "" +"Priorité du serveur cible (entier positif, plus il est bas, plus le serveur " +"sera utilisé si disponible)" + +#: models.py:858 +msgid "" +"Relative weight for records with the same priority (integer value between 0 " +"and 65535)" +msgstr "" +"Poids relatif des enregistrements avec la même priorité (entier entre 0 et " +"65535)" + +#: models.py:863 +msgid "TCP/UDP port" +msgstr "Port TCP/UDP" + +#: models.py:868 +msgid "Target server" +msgstr "Serveur cible" + +#: models.py:873 +msgid "Can view an SRV record object" +msgstr "Peut voir un objet enregistrement SRV" + +#: models.py:875 templates/machines/machine.html:140 +msgid "SRV record" +msgstr "enregistrement SRV" + +#: models.py:876 +msgid "SRV records" +msgstr "enregistrements SRV" + +#: models.py:940 +msgid "Can view an SSHFP record object" +msgstr "Peut voir un objet enregistrement SSHFP" + +#: models.py:942 templates/machines/machine.html:144 +msgid "SSHFP record" +msgstr "enregistrement SSHFP" + +#: models.py:943 +msgid "SSHFP records" +msgstr "enregistrements SSHFP" + +#: models.py:981 +msgid "Can view an interface object" +msgstr "Peut voir un objet interface" + +#: models.py:983 +msgid "Can change the owner of an interface" +msgstr "Peut changer l'utilisateur d'une interface" + +#: models.py:985 +msgid "interface" +msgstr "interface" + +#: models.py:986 +msgid "interfaces" +msgstr "interfaces" + +#: models.py:1080 +msgid "The given MAC address is invalid." +msgstr "L'adresse MAC indiquée est invalide." + +#: models.py:1093 +msgid "The selected IP type is invalid." +msgstr "Le type d'IP sélectionné est invalide." + +#: models.py:1106 +msgid "There is no IP address available in the slash." +msgstr "Il n'y a pas d'adresse IP disponible dans le slash." + +#: models.py:1124 +msgid "The IPv4 address and the machine type don't match." +msgstr "L'adresse IPv4 et le type de machine ne correspondent pas." + +#: models.py:1138 +msgid "Nonexistent machine." +msgstr "Machine inexistante." + +#: models.py:1142 +msgid "You can't add a machine." +msgstr "Vous ne pouvez pas ajouter une machine." + +#: models.py:1148 +msgid "" +"You don't have the right to add an interface to a machine of another user." +msgstr "" +"Vous n'avez pas le droit d'ajouter une interface à une machine d'un autre " +"utilisateur." + +#: models.py:1162 +msgid "Permission required to edit the machine." +msgstr "Permission requise pour modifier la machine." + +#: models.py:1206 models.py:1325 models.py:1532 +msgid "You don't have the right to view machines other than yours." +msgstr "Vous n'avez pas le droit de voir d'autres machines que les vôtres." + +#: models.py:1252 +msgid "Can view an IPv6 addresses list object" +msgstr "Peut voir un objet list d'adresses IPv6" + +#: models.py:1253 +msgid "Can change the SLAAC value of an IPv6 addresses list" +msgstr "Peut modifier la valeur SLAAC d'une liste d'adresses IPv6" + +#: models.py:1256 +msgid "IPv6 addresses list" +msgstr "Liste d'adresses IPv6" + +#: models.py:1257 +msgid "IPv6 addresses lists" +msgstr "Listes d'adresses IPv6" + +#: models.py:1269 models.py:1480 +msgid "Nonexistent interface." +msgstr "Interface inexistante." + +#: models.py:1272 models.py:1487 +msgid "You don't have the right to add an alias to a machine of another user." +msgstr "" +"Vous n'avez pas le droit d'ajouter un alias à une machine d'un autre " +"utilisateur." + +#: models.py:1280 +msgid "Permission required to change the SLAAC value of an IPv6 address" +msgstr "Permission requise pour changer la valeur SLAAC d'une adresse IPv6." + +#: models.py:1352 +msgid "A SLAAC IP address is already registered." +msgstr "Une adresse IP SLAAC est déjà enregistrée." + +#: models.py:1357 +msgid "" +"The v6 prefix is incorrect and doesn't match the type associated with the " +"machine." +msgstr "" +"Le préfixe v6 est incorrect et ne correspond pas au type associé à la " +"machine." + +#: models.py:1383 +msgid "Mandatory and unique, must not contain dots." +msgstr "Obligatoire et unique, ne doit pas contenir de points." + +#: models.py:1397 +msgid "Can view a domain object" +msgstr "Peut voir un objet domaine" + +#: models.py:1399 +msgid "domain" +msgstr "domaine" + +#: models.py:1400 +msgid "domains" +msgstr "domaines" + +#: models.py:1422 +msgid "You can't create a both A and CNAME record." +msgstr "Vous ne pouvez pas créer un enregistrement à la fois A et CNAME." + +#: models.py:1425 +msgid "You can't create a CNAME record pointing to itself." +msgstr "Vous ne pouvez pas créer un enregistrement CNAME vers lui-même." + +#: models.py:1433 +#, python-format +msgid "The domain name %s is too long (over 63 characters)." +msgstr "Le nom de domaine %s est trop long (plus de 63 caractères)." + +#: models.py:1436 +#, python-format +msgid "The domain name %s contains forbidden characters." +msgstr "Le nom de domaine %s contient des caractères interdits." + +#: models.py:1454 +msgid "Invalid extension." +msgstr "Extension invalide." + +#: models.py:1495 +#, python-format +msgid "" +"You reached the maximum number of alias that you are allowed to create " +"yourself (%s). " +msgstr "" +"Vous avez atteint le nombre maximal d'alias que vous pouvez créer vous-mêmes " +"(%s)." + +#: models.py:1508 +msgid "You don't have the right to edit an alias of a machine of another user." +msgstr "" +"Vous n'avez pas le droit de modifier un alias d'une machine d'un autre " +"utilisateur." + +#: models.py:1520 +msgid "" +"You don't have the right to delete an alias of a machine of another user." +msgstr "" +"Vous n'avez pas le droit de supprimer un alias d'une machine d'un autre " +"utilisateur." + +#: models.py:1548 +msgid "Can view an IPv4 addresses list object" +msgstr "Peut voir un object liste d'adresses IPv4" + +#: models.py:1550 +msgid "IPv4 addresses list" +msgstr "Liste d'adresses IPv4" + +#: models.py:1551 +msgid "IPv4 addresses lists" +msgstr "Listes d'adresses IPv4" + +#: models.py:1562 +msgid "The IPv4 address and the range of the IP type don't match." +msgstr "L'adresse IPv4 et la plage du type d'IP ne correspondent pas." + +#: models.py:1580 +msgid "DHCP server" +msgstr "Serveur DHCP" + +#: models.py:1581 +msgid "Switches configuration server" +msgstr "Serveur de configuration des commutateurs réseau" + +#: models.py:1582 +msgid "Recursive DNS server" +msgstr "Serveur DNS récursif" + +#: models.py:1583 +msgid "NTP server" +msgstr "Serveur NTP" + +#: models.py:1584 +msgid "RADIUS server" +msgstr "Serveur RADIUS" + +#: models.py:1585 +msgid "Log server" +msgstr "Serveur log" + +#: models.py:1586 +msgid "LDAP master server" +msgstr "Serveur LDAP maître" + +#: models.py:1587 +msgid "LDAP backup server" +msgstr "Serveur LDAP de secours" + +#: models.py:1588 +msgid "SMTP server" +msgstr "Serveur SMTP" + +#: models.py:1589 +msgid "postgreSQL server" +msgstr "Serveur postgreSQL" + +#: models.py:1590 +msgid "mySQL server" +msgstr "Serveur mySQL" + +#: models.py:1591 +msgid "SQL client" +msgstr "Client SQL" + +#: models.py:1592 +msgid "Gateway" +msgstr "Passerelle" + +#: models.py:1606 +msgid "Can view a role object" +msgstr "Peut voir un objet rôle" + +#: models.py:1608 +msgid "server role" +msgstr "rôle de serveur" + +#: models.py:1609 +msgid "server roles" +msgstr "rôles de serveur" + +#: models.py:1650 +msgid "Minimal time before regeneration of the service." +msgstr "Temps minimal avant régénération du service." + +#: models.py:1654 +msgid "Maximal time before regeneration of the service." +msgstr "Temps maximal avant régénération du service." + +#: models.py:1660 +msgid "Can view a service object" +msgstr "Peut voir un objet service" + +#: models.py:1662 +msgid "service to generate (DHCP, DNS, ...)" +msgstr "service à générer (DHCP, DNS, ...)" + +#: models.py:1663 +msgid "services to generate (DHCP, DNS, ...)" +msgstr "services à générer (DHCP, DNS, ...)" + +#: models.py:1709 +msgid "Can view a service server link object" +msgstr "Peut voir un objet lien service serveur" + +#: models.py:1711 +msgid "link between service and server" +msgstr "lien entre service et serveur" + +#: models.py:1712 +msgid "links between service and server" +msgstr "liens entre service et serveur" + +#: models.py:1754 +msgid "Name of the ports configuration" +msgstr "Nom de la configuration de ports" + +#: models.py:1760 +msgid "Can view a ports opening list object" +msgstr "Peut voir un objet liste d'ouverture de ports" + +#: models.py:1763 +msgid "ports opening list" +msgstr "liste d'ouverture de ports" + +#: models.py:1764 +msgid "ports opening lists" +msgstr "listes d'ouverture de ports" + +#: models.py:1773 +msgid "You don't have the right to delete a ports opening list." +msgstr "Vous n'avez pas le droit de supprimer une liste d'ouverture de ports." + +#: models.py:1776 +msgid "This ports opening list is used." +msgstr "Cette liste d'ouverture de ports est utilisée." + +#: models.py:1849 +msgid "ports opening" +msgstr "ouverture de ports" + +#: models.py:1850 +msgid "ports openings" +msgstr "ouvertures de ports" + +#: templates/machines/aff_alias.html:32 +msgid "Aliases" +msgstr "Alias" + +#: templates/machines/aff_dname.html:30 +msgid "Target zone" +msgstr "Cible" + +#: templates/machines/aff_dname.html:31 templates/machines/aff_mx.html:34 +#: templates/machines/aff_txt.html:33 +msgid "Record" +msgstr "Enregistrement" + +#: templates/machines/aff_extension.html:34 +#: templates/machines/aff_iptype.html:36 templates/machines/aff_srv.html:34 +#: templates/machines/machine.html:116 +msgid "Extension" +msgstr "Extension" + +#: templates/machines/aff_extension.html:35 +#: templates/machines/aff_iptype.html:37 +msgid "'infra' right required" +msgstr "droit 'infra' requis" + +#: templates/machines/aff_iptype.html:38 +msgid "IPv4 range" +msgstr "Plage IPv4" + +#: templates/machines/aff_iptype.html:39 +msgid "v6 prefix" +msgstr "Préfixe v6" + +#: templates/machines/aff_iptype.html:40 +msgid "DNSSEC reverse v4/v6" +msgstr "DNSSEC inverse v4/v6" + +#: templates/machines/aff_iptype.html:41 +msgid "On VLAN(s)" +msgstr "Sur VLAN(s)" + +#: templates/machines/aff_iptype.html:42 +msgid "Default ports opening" +msgstr "Ouverture de ports par défaut" + +#: templates/machines/aff_ipv6.html:32 +msgid "IPv6 addresses" +msgstr "Adresses IPv6" + +#: templates/machines/aff_ipv6.html:33 +msgid "SLAAC" +msgstr "SLAAC" + +#: templates/machines/aff_machines.html:43 +msgid "DNS name" +msgstr "Nom DNS" + +#: templates/machines/aff_machines.html:45 +msgid "Type" +msgstr "Type" + +#: templates/machines/aff_machines.html:47 +msgid "IP address" +msgstr "Adresse IP" + +#: templates/machines/aff_machines.html:48 +msgid "Actions" +msgstr "Actions" + +#: templates/machines/aff_machines.html:53 +msgid "No name" +msgstr "Sans nom" + +#: templates/machines/aff_machines.html:54 +msgid "View the profile" +msgstr "Voir le profil" + +#: templates/machines/aff_machines.html:62 views.py:375 +msgid "Create an interface" +msgstr "Créer une interface" + +#: templates/machines/aff_machines.html:77 +msgid "Display the aliases" +msgstr "Afficher les alias" + +#: templates/machines/aff_machines.html:95 +msgid "Display the IPv6 address" +msgstr "Afficher les adresses IPv6" + +#: templates/machines/aff_machines.html:110 +msgid " Edit" +msgstr " Modifier" + +#: templates/machines/aff_machines.html:118 +msgid " Manage the aliases" +msgstr " Gérer les alias" + +#: templates/machines/aff_machines.html:126 +msgid " Manage the IPv6 addresses" +msgstr " Gérer les adresses IPv6" + +#: templates/machines/aff_machines.html:134 +msgid " Manage the SSH fingerprints" +msgstr " Gérer les empreintes SSH" + +#: templates/machines/aff_machines.html:142 +msgid " Manage the ports configuration" +msgstr " Gérer les configuration de ports" + +#: templates/machines/aff_machinetype.html:33 +msgid "Matching IP type" +msgstr "Type d'IP correspondant" + +#: templates/machines/aff_mx.html:32 templates/machines/aff_ns.html:32 +#: templates/machines/aff_txt.html:32 +msgid "Concerned zone" +msgstr "Zone concernée" + +#: templates/machines/aff_mx.html:33 templates/machines/aff_srv.html:36 +msgid "Priority" +msgstr "Priorité" + +#: templates/machines/aff_nas.html:33 templates/machines/aff_soa.html:32 +#: templates/machines/aff_vlan.html:34 +#: templates/machines/index_portlist.html:18 +msgid "Name" +msgstr "Nom" + +#: templates/machines/aff_nas.html:34 +msgid "NAS device type" +msgstr "Type de dispositif NAS" + +#: templates/machines/aff_nas.html:35 +msgid "Machine type linked to the NAS device" +msgstr "Type de machine lié au dispositif NAS" + +#: templates/machines/aff_nas.html:36 +msgid "Access mode" +msgstr "Mode d'accès" + +#: templates/machines/aff_nas.html:37 +msgid "MAC address auto capture" +msgstr "Capture automatique de l'adresse MAC" + +#: templates/machines/aff_ns.html:33 +msgid "Authoritarian interface for the concerned zone" +msgstr "Interface authoritaire pour la zone concernée" + +#: templates/machines/aff_role.html:33 +msgid "Role name" +msgstr "Nom du rôle" + +#: templates/machines/aff_role.html:34 +msgid "Specific role" +msgstr "Rôle spécifique" + +#: templates/machines/aff_role.html:35 +msgid "Servers" +msgstr "Serveurs" + +#: templates/machines/aff_servers.html:31 +#: templates/machines/aff_service.html:32 +msgid "Service name" +msgstr "Nom du service" + +#: templates/machines/aff_servers.html:32 +msgid "Server" +msgstr "Serveur" + +#: templates/machines/aff_servers.html:33 +msgid "Last regeneration" +msgstr "Dernière régénération" + +#: templates/machines/aff_servers.html:34 +msgid "Regeneration required" +msgstr "Régénération requise" + +#: templates/machines/aff_servers.html:35 +msgid "Regeneration activated" +msgstr "Régénération activée" + +#: templates/machines/aff_service.html:33 +msgid "Minimal time before regeneration" +msgstr "Temps minimal avant régénération" + +#: templates/machines/aff_service.html:34 +msgid "Maximal time before regeneration" +msgstr "Temps maximal avant régénération" + +#: templates/machines/aff_service.html:35 +msgid "Included servers" +msgstr "Serveurs inclus" + +#: templates/machines/aff_service.html:36 +msgid "Ask for regeneration" +msgstr "Demander la régénération" + +#: templates/machines/aff_soa.html:33 +msgid "Mail" +msgstr "Mail" + +#: templates/machines/aff_soa.html:34 +msgid "Refresh" +msgstr "Rafraichissement" + +#: templates/machines/aff_soa.html:35 +msgid "Retry" +msgstr "Relance" + +#: templates/machines/aff_soa.html:36 +msgid "Expire" +msgstr "Expiration" + +#: templates/machines/aff_soa.html:37 templates/machines/aff_srv.html:35 +msgid "TTL" +msgstr "Temps de vie" + +#: templates/machines/aff_srv.html:32 templates/machines/machine.html:152 +msgid "Service" +msgstr "Service" + +#: templates/machines/aff_srv.html:33 +msgid "Protocol" +msgstr "Protocole" + +#: templates/machines/aff_srv.html:37 +msgid "Weight" +msgstr "Poids" + +#: templates/machines/aff_srv.html:38 +msgid "Port" +msgstr "Port" + +#: templates/machines/aff_srv.html:39 +msgid "Target" +msgstr "Cible" + +#: templates/machines/aff_sshfp.html:31 +msgid "SSH public key" +msgstr "Clé publique SSH" + +#: templates/machines/aff_sshfp.html:32 +msgid "Algorithm used" +msgstr "Algorithme utilisé" + +#: templates/machines/aff_sshfp.html:33 templates/machines/aff_vlan.html:35 +msgid "Comment" +msgstr "Commentaire" + +#: templates/machines/aff_vlan.html:33 +msgid "ID" +msgstr "ID" + +#: templates/machines/aff_vlan.html:36 templates/machines/sidebar.html:51 +msgid "IP ranges" +msgstr "Plages d'IP" + +#: templates/machines/delete.html:29 +msgid "Creation and editing of machines" +msgstr "Création et modification de machines" + +#: templates/machines/delete.html:35 +#, python-format +msgid "" +"Warning: are you sure you want to delete this object %(objet_name)s " +"( %(objet)s )?" +msgstr "" +"Attention : voulez-vous vraiment supprimer cet objet %(objet_name)s " +"( %(objet)s ) ?" + +#: templates/machines/delete.html:36 +msgid "Confirm" +msgstr "Confirmer" + +#: templates/machines/edit_portlist.html:29 templates/machines/index.html:29 +#: templates/machines/index.html:32 templates/machines/index_alias.html:29 +#: templates/machines/index_extension.html:31 +#: templates/machines/index_iptype.html:31 +#: templates/machines/index_ipv6.html:30 +#: templates/machines/index_machinetype.html:31 +#: templates/machines/index_nas.html:31 +#: templates/machines/index_portlist.html:8 +#: templates/machines/index_portlist.html:23 +#: templates/machines/index_role.html:30 +#: templates/machines/index_service.html:30 +#: templates/machines/index_sshfp.html:28 templates/machines/index_vlan.html:31 +#: templates/machines/machine.html:31 templates/machines/sidebar.html:33 +msgid "Machines" +msgstr "Machines" + +#: templates/machines/edit_portlist.html:50 +msgid "Add a port" +msgstr "Ajouter un port" + +#: templates/machines/edit_portlist.html:53 +msgid "Create or edit" +msgstr "Créer ou modifier" + +#: templates/machines/index_alias.html:32 +msgid "List of the aliases of the interface" +msgstr "Liste des alias de l'interface" + +#: templates/machines/index_alias.html:33 +msgid " Add an alias" +msgstr " Ajouter un alias" + +#: templates/machines/index_alias.html:34 +msgid " Delete one or several aliases" +msgstr " Supprimer un ou plusieurs alias" + +#: templates/machines/index_extension.html:34 +msgid "List of extensions" +msgstr "Liste des extensions" + +#: templates/machines/index_extension.html:36 +msgid " Add an extension" +msgstr " Ajouter une extension" + +#: templates/machines/index_extension.html:38 +msgid " Delete one or several extensions" +msgstr " Supprimer une ou plusieurs extensions" + +#: templates/machines/index_extension.html:41 +msgid "List of SOA records" +msgstr "Liste des enregistrements SOA" + +#: templates/machines/index_extension.html:43 +msgid " Add an SOA record" +msgstr " Ajouter un enregistrement SOA" + +#: templates/machines/index_extension.html:45 +msgid " Delete one or several SOA records" +msgstr " Supprimer un ou plusieurs enregistrements SOA" + +#: templates/machines/index_extension.html:48 +msgid "List of MX records" +msgstr "Liste des enregistrements MX" + +#: templates/machines/index_extension.html:50 +msgid " Add an MX record" +msgstr " Ajouter un enregistrement MX" + +#: templates/machines/index_extension.html:52 +msgid " Delete one or several MX records" +msgstr " Supprimer un ou plusieurs enregistrements MX" + +#: templates/machines/index_extension.html:55 +msgid "List of NS records" +msgstr "Liste des enregistrements NS" + +#: templates/machines/index_extension.html:57 +msgid " Add an NS record" +msgstr " Ajouter un enregistrement NS" + +#: templates/machines/index_extension.html:59 +msgid " Delete one or several NS records" +msgstr " Supprimer un ou plusieurs enregistrements NS" + +#: templates/machines/index_extension.html:62 +msgid "List of TXT records" +msgstr "Liste des enregistrements TXT" + +#: templates/machines/index_extension.html:64 +msgid " Add a TXT record" +msgstr " Ajouter un enregistrement TXT" + +#: templates/machines/index_extension.html:66 +msgid " Delete one or several TXT records" +msgstr " Supprimer un ou plusieurs enregistrements TXT" + +#: templates/machines/index_extension.html:69 +msgid "List of DNAME records" +msgstr "Liste des enregistrements DNAME" + +#: templates/machines/index_extension.html:72 +msgid " Add a DNAME record" +msgstr " Ajouter un enregistrement DNAME" + +#: templates/machines/index_extension.html:76 +msgid " Delete one or several DNAME records" +msgstr " Supprimer un ou plusieurs enregistrements DNAME" + +#: templates/machines/index_extension.html:80 +msgid "List of SRV records" +msgstr "Liste des enregistrements SRV" + +#: templates/machines/index_extension.html:82 +msgid " Add an SRV record" +msgstr " Ajouter un enregistrement SRV" + +#: templates/machines/index_extension.html:84 +msgid " Delete one or several SRV records" +msgstr " Supprimer un ou plusieurs enregistrements SRV" + +#: templates/machines/index_iptype.html:34 +msgid "List of IP types" +msgstr "Liste des types d'IP" + +#: templates/machines/index_iptype.html:36 +msgid " Add an IP type" +msgstr " Ajouter un type d'IP" + +#: templates/machines/index_iptype.html:38 +msgid " Delete one or several IP types" +msgstr " Supprimer un ou plusieurs types d'IP" + +#: templates/machines/index_ipv6.html:33 +msgid "List of the IPv6 addresses of the interface" +msgstr "Liste des adresses IPv6 de l'interface" + +#: templates/machines/index_ipv6.html:35 +msgid " Add an IPv6 address" +msgstr " Ajouter une adresse IPv6" + +#: templates/machines/index_machinetype.html:34 +msgid "List of machine types" +msgstr "Liste des types de machine" + +#: templates/machines/index_machinetype.html:36 +msgid " Add a machine type" +msgstr " Ajouter un type de machine" + +#: templates/machines/index_machinetype.html:38 +msgid " Delete one or several machine types" +msgstr " Supprimer un ou plusieurs types de machine" + +#: templates/machines/index_nas.html:34 +msgid "List of NAS devices" +msgstr "Liste des dispositifs NAS" + +#: templates/machines/index_nas.html:35 +msgid "" +"The NAS device type and machine type are linked. It is useful for MAC " +"address auto capture by RADIUS, and allows to choose the machine type to " +"assign to the machines according to the NAS device type." +msgstr "" +"Le type de dispositif NAS et le type de machine sont liés. C'est utile pour " +"la capture automatique de l'adresse MAC par RADIUS, et permet de choisir le " +"type de machine à assigner aux machines en fonction du type de dispositif " +"NAS." + +#: templates/machines/index_nas.html:37 +msgid " Add a NAS device type" +msgstr " Ajouter un type de dispositif NAS" + +#: templates/machines/index_nas.html:39 +msgid " Delete one or several NAS device types" +msgstr " Supprimer un ou plusieurs types de dispositif NAS" + +#: templates/machines/index_portlist.html:11 +msgid "List of ports configurations" +msgstr "Liste des configurations de ports" + +#: templates/machines/index_portlist.html:13 +msgid " Add a configuration" +msgstr " Ajouter une configuration" + +#: templates/machines/index_portlist.html:19 +msgid "TCP (input)" +msgstr "TCP (entrée)" + +#: templates/machines/index_portlist.html:20 +msgid "TCP (output)" +msgstr "TCP (sortie)" + +#: templates/machines/index_portlist.html:21 +msgid "UDP (input)" +msgstr "UDP (entrée)" + +#: templates/machines/index_portlist.html:22 +msgid "UDP (output)" +msgstr "UDP (sortie)" + +#: templates/machines/index_role.html:33 +msgid "List of roles" +msgstr "Liste des rôles" + +#: templates/machines/index_role.html:35 +msgid " Add a role" +msgstr " Ajouter un rôle" + +#: templates/machines/index_role.html:37 +msgid " Delete one or several roles" +msgstr " Supprimer un ou plusieurs rôles" + +#: templates/machines/index_service.html:33 +msgid "List of services" +msgstr "Liste des services" + +#: templates/machines/index_service.html:35 +msgid " Add a service" +msgstr " Ajouter un service" + +#: templates/machines/index_service.html:37 +msgid " Delete one or several services" +msgstr " Supprimer un ou plusieurs services" + +#: templates/machines/index_service.html:39 +msgid "States of servers" +msgstr "États des serveurs" + +#: templates/machines/index_sshfp.html:31 +msgid "SSH fingerprints" +msgstr "Empreintes SSH" + +#: templates/machines/index_sshfp.html:34 +msgid " Add an SSH fingerprint" +msgstr " Ajouter une empreinte SSH" + +#: templates/machines/index_vlan.html:34 +msgid "List of VLANs" +msgstr "Liste des VLANs" + +#: templates/machines/index_vlan.html:36 +msgid " Add a VLAN" +msgstr " Ajouter un VLAN" + +#: templates/machines/index_vlan.html:38 +msgid " Delete one or several VLANs" +msgstr " Supprimer un ou plusieurs VLANs" + +#: templates/machines/machine.html:92 +msgid "Machine" +msgstr "Machine" + +#: templates/machines/machine.html:96 +msgid "Interface" +msgstr "Interface" + +#: templates/machines/machine.html:104 +msgid "Domain" +msgstr "Domaine" + +#: templates/machines/machine.html:148 +msgid "Alias" +msgstr "Alias" + +#: templates/machines/machine.html:168 +msgid "IPv6 address" +msgstr "Adresse IPv6" + +#: templates/machines/sidebar.html:39 +msgid "Machine types" +msgstr "Types de machine" + +#: templates/machines/sidebar.html:45 +msgid "Extensions and zones" +msgstr "Extensions et zones" + +#: templates/machines/sidebar.html:69 +msgid "Services (DHCP, DNS, ...)" +msgstr "Services (DHCP, DNS, ...)" + +#: templates/machines/sidebar.html:75 +msgid "Server roles" +msgstr "Rôles de serveur" + +#: templates/machines/sidebar.html:81 +msgid "Ports openings" +msgstr "Ouvertures de ports" + +#: views.py:156 +msgid "Select a machine type first.}," +msgstr "Sélectionnez un type de machine d'abord.}," + +#: views.py:258 +msgid "The machine was created." +msgstr "La machine a été créée." + +#: views.py:270 +msgid "Create a machine" +msgstr "Créer une machine" + +#: views.py:310 +msgid "The machine was edited." +msgstr "La machine a été modifiée." + +#: views.py:322 views.py:446 views.py:512 views.py:568 views.py:630 +#: views.py:691 views.py:749 views.py:806 views.py:863 views.py:919 +#: views.py:977 views.py:1034 views.py:1106 views.py:1169 views.py:1226 +#: views.py:1292 views.py:1349 +msgid "Edit" +msgstr "Modifier" + +#: views.py:335 +msgid "The machine was deleted." +msgstr "La machine a été supprimée." + +#: views.py:364 +msgid "The interface was created." +msgstr "L'interface a été créée." + +#: views.py:391 +msgid "The interface was deleted." +msgstr "L'interface a été supprimée." + +#: views.py:416 +msgid "The IPv6 addresses list was created." +msgstr "La liste d'adresses IPv6 a été créée." + +#: views.py:422 +msgid "Create an IPv6 addresses list" +msgstr "Créer une liste d'adresses IPv6" + +#: views.py:440 +msgid "The IPv6 addresses list was edited." +msgstr "La liste d'adresses IPv6 a été modifiée." + +#: views.py:459 +msgid "The IPv6 addresses list was deleted." +msgstr "La liste d'adresses IPv6 a été supprimée." + +#: views.py:483 +msgid "The SSHFP record was created." +msgstr "L'enregistrement SSHFP a été créé." + +#: views.py:489 +msgid "Create a SSHFP record" +msgstr "Créer un enregistrement SSHFP" + +#: views.py:506 +msgid "The SSHFP record was edited." +msgstr "L'enregistrement SSHFP a été modifié." + +#: views.py:525 +msgid "The SSHFP record was deleted." +msgstr "L'enregistrement SSHFP a été supprimé." + +#: views.py:546 +msgid "The IP type was created." +msgstr "Le type d'IP a été créé." + +#: views.py:549 +msgid "Create an IP type" +msgstr "Créer un type d'IP" + +#: views.py:565 +msgid "The IP type was edited." +msgstr "Le type d'IP a été modifié." + +#: views.py:584 +msgid "The IP type was deleted." +msgstr "Le type d'IP a été supprimé." + +#: views.py:588 +#, python-format +msgid "" +"The IP type %s is assigned to at least one machine, you can't delete it." +msgstr "" +"Le type d'IP %s est assigné à au moins une machine, vous ne pouvez pas le " +"supprimer." + +#: views.py:593 views.py:655 views.py:716 views.py:773 views.py:830 +#: views.py:887 views.py:944 views.py:1001 views.py:1058 views.py:1136 +#: views.py:1193 views.py:1250 views.py:1316 views.py:1373 +msgid "Delete" +msgstr "Supprimer" + +#: views.py:606 +msgid "The machine type was created." +msgstr "Le type de machine a été créé." + +#: views.py:609 +msgid "Create a machine type" +msgstr "Créer un type de machine" + +#: views.py:627 +msgid "The machine type was edited." +msgstr "Le type de machine a été modifié." + +#: views.py:646 +msgid "The machine type was deleted." +msgstr "Le type de machine a été supprimé." + +#: views.py:650 +#, python-format +msgid "" +"The machine type %s is assigned to at least one machine, you can't delete it." +msgstr "" +"Le type de machine %s est assigné à au moins un machine, vous ne pouvez pas " +"le supprimer." + +#: views.py:668 +msgid "The extension was created." +msgstr "L'extension a été créée." + +#: views.py:671 +msgid "Create an extension" +msgstr "Créer une extension" + +#: views.py:688 +msgid "The extension was edited." +msgstr "L'extension a été modifiée." + +#: views.py:707 +msgid "The extension was deleted." +msgstr "L'extension a été supprimée." + +#: views.py:711 +#, python-format +msgid "" +"The extension %s is assigned to at least one machine type, you can't delete " +"it." +msgstr "" +"L'extension %s est assignée à au moins un type de machine, vous ne pouvez " +"pas le supprimer." + +#: views.py:729 +msgid "The SOA record was created." +msgstr "L'enregistrement SOA a été créé." + +#: views.py:732 +msgid "Create an SOA record" +msgstr "Créer un enregistrement SOA" + +#: views.py:746 +msgid "The SOA record was edited." +msgstr "L'enregistrement SOA a été modifié." + +#: views.py:765 +msgid "The SOA record was deleted." +msgstr "L'enregistrement SOA a été supprimé." + +#: views.py:769 +#, python-format +msgid "Error: the SOA record %s can't be deleted." +msgstr "Erreur : l'enregistrement SOA %s ne peut pas être supprimé." + +#: views.py:786 +msgid "The MX record was created." +msgstr "L'enregistrement MX a été créé." + +#: views.py:789 +msgid "Create an MX record" +msgstr "Créer un enregistrement MX" + +#: views.py:803 +msgid "The MX record was edited." +msgstr "L'enregistrement MX a été modifié." + +#: views.py:822 +msgid "The MX record was deleted." +msgstr "L'enregistrement MX a été supprimé." + +#: views.py:826 +#, python-format +msgid "Error: the MX record %s can't be deleted." +msgstr "Erreur : l'enregistrement MX %s ne peut pas être supprimé." + +#: views.py:843 +msgid "The NS record was created." +msgstr "L'enregistrement NS a été créé." + +#: views.py:846 +msgid "Create an NS record" +msgstr "Créer un enregistrement NS" + +#: views.py:860 +msgid "The NS record was edited." +msgstr "L'enregistrement NS a été modifié." + +#: views.py:879 +msgid "The NS record was deleted." +msgstr "L'enregistrement NS a été supprimé." + +#: views.py:883 +#, python-format +msgid "Error: the NS record %s can't be deleted." +msgstr "Erreur : l'enregistrement NS %s ne peut pas être supprimé." + +#: views.py:899 +msgid "The DNAME record was created." +msgstr "L'enregistrement DNAME a été créé." + +#: views.py:902 +msgid "Create a DNAME record" +msgstr "Créer un enregistrement DNAME" + +#: views.py:916 +msgid "The DNAME record was edited." +msgstr "L'enregistrement DNAME a été modifié." + +#: views.py:935 +msgid "The DNAME record was deleted." +msgstr "L'enregistrement DNAME a été supprimé." + +#: views.py:939 +#, python-format +msgid "Error: the DNAME record %s can't be deleted." +msgstr "Erreur : l'enregistrement DNAME %s ne peut pas être supprimé." + +#: views.py:957 +msgid "The TXT record was created." +msgstr "L'enregistrement TXT a été créé." + +#: views.py:960 +msgid "Create a TXT record" +msgstr "Créer un enregistrement TXT" + +#: views.py:974 +msgid "The TXT record was edited." +msgstr "L'enregistrement TXT a été modifié." + +#: views.py:993 +msgid "The TXT record was deleted." +msgstr "L'enregistrement TXT a été supprimé." + +#: views.py:997 +#, python-format +msgid "Error: the TXT record %s can't be deleted." +msgstr "Erreur : l'enregistrement %s ne peut pas être supprimé." + +#: views.py:1014 +msgid "The SRV record was created." +msgstr "L'enregistrement SRV a été créé." + +#: views.py:1017 +msgid "Create an SRV record" +msgstr "Créer un enregistrement SRV" + +#: views.py:1031 +msgid "The SRV record was edited." +msgstr "L'enregistrement SRV a été modifié." + +#: views.py:1050 +msgid "The SRV record was deleted." +msgstr "L'enregistrement SRV a été supprimé." + +#: views.py:1054 +#, python-format +msgid "Error: the SRV record %s can't be deleted." +msgstr "Erreur : l'enregistrement SRV %s ne peut pas être supprimé." + +#: views.py:1074 +msgid "The alias was created." +msgstr "L'alias a été créé." + +#: views.py:1080 +msgid "Create an alias" +msgstr "Créer un alias" + +#: views.py:1098 +msgid "The alias was edited." +msgstr "L'alias a été modifié." + +#: views.py:1124 +#, python-format +msgid "The alias %s was deleted." +msgstr "L'alias %s a été supprimé." + +#: views.py:1129 +#, python-format +msgid "Error: the alias %s can't be deleted." +msgstr "Erreur : l'alias %s ne peut pas être supprimé." + +#: views.py:1149 +msgid "The role was created." +msgstr "Le rôle a été créé." + +#: views.py:1152 +msgid "Create a role" +msgstr "Créer un rôle" + +#: views.py:1166 +msgid "The role was edited." +msgstr "Le rôle a été modifié." + +#: views.py:1185 +msgid "The role was deleted." +msgstr "Le rôle a été supprimé." + +#: views.py:1189 +#, python-format +msgid "Error: the role %s can't be deleted." +msgstr "Erreur : le rôle %s ne peut pas être supprimé." + +#: views.py:1206 +msgid "The service was created." +msgstr "Le service a été créé." + +#: views.py:1209 +msgid "Create a service" +msgstr "Créer un service" + +#: views.py:1223 +msgid "The service was edited." +msgstr "Le service a été modifié." + +#: views.py:1242 +msgid "The service was deleted." +msgstr "Le service a été supprimé." + +#: views.py:1246 +#, python-format +msgid "Error: the service %s can't be deleted." +msgstr "Erreur : le service %s ne peut pas être supprimé." + +#: views.py:1272 +msgid "The VLAN was created." +msgstr "Le VLAN a été créé." + +#: views.py:1275 +msgid "Create a VLAN" +msgstr "Créer un VLAN" + +#: views.py:1289 +msgid "The VLAN was edited." +msgstr "Le VLAN a été modifié." + +#: views.py:1308 +msgid "The VLAN was deleted." +msgstr "Le VLAN a été supprimé." + +#: views.py:1312 +#, python-format +msgid "Error: the VLAN %s can't be deleted." +msgstr "Erreur : le VLAN %s ne peut pas être supprimé." + +#: views.py:1329 +msgid "The NAS device was created." +msgstr "Le dispositif NAS a été créé." + +#: views.py:1332 +msgid "Create a NAS device" +msgstr "Créer un dispositif NAS" + +#: views.py:1346 +msgid "The NAS device was edited." +msgstr "Le dispositif NAS a été modifié." + +#: views.py:1365 +msgid "The NAS device was deleted." +msgstr "Le dispositif NAS a été supprimé." + +#: views.py:1369 +#, python-format +msgid "Error: the NAS device %s can't be deleted." +msgstr "Erreur : le dispositif NAS %s ne peut pas être supprimé." + +#: views.py:1625 +msgid "The ports list was edited." +msgstr "La liste de ports a été modifiée." + +#: views.py:1639 +msgid "The ports list was deleted." +msgstr "La liste de ports a été supprimée." + +#: views.py:1664 +msgid "The ports list was created." +msgstr "La liste de ports a été créée." + +#: views.py:1682 +msgid "Warning: the IPv4 isn't public, the opening won't have effect in v4." +msgstr "" +"Attention : l'adresse IPv4 n'est pas publique, l'ouverture n'aura pas " +"d'effet en v4." + +#: views.py:1692 +msgid "The ports configuration was edited." +msgstr "La configuration de ports a été modifiée." + +#: views.py:1695 +msgid "Edit the configuration" +msgstr "Modifier la configuration" diff --git a/machines/migrations/0094_auto_20180815_1918.py b/machines/migrations/0094_auto_20180815_1918.py new file mode 100644 index 00000000..775ac2c7 --- /dev/null +++ b/machines/migrations/0094_auto_20180815_1918.py @@ -0,0 +1,221 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.7 on 2018-08-15 17:18 +from __future__ import unicode_literals + +import datetime +import django.core.validators +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('machines', '0093_auto_20180807_1115'), + ] + + operations = [ + migrations.AlterModelOptions( + name='dname', + options={'permissions': (('view_dname', 'Can view a DNAME record object'),), 'verbose_name': 'DNAME record', 'verbose_name_plural': 'DNAME records'}, + ), + migrations.AlterModelOptions( + name='domain', + options={'permissions': (('view_domain', 'Can view a domain object'),), 'verbose_name': 'domain', 'verbose_name_plural': 'domains'}, + ), + migrations.AlterModelOptions( + name='extension', + options={'permissions': (('view_extension', 'Can view an extension object'), ('use_all_extension', 'Can use all extensions')), 'verbose_name': 'DNS extension', 'verbose_name_plural': 'DNS extensions'}, + ), + migrations.AlterModelOptions( + name='interface', + options={'permissions': (('view_interface', 'Can view an interface object'), ('change_interface_machine', 'Can change the owner of an interface')), 'verbose_name': 'interface', 'verbose_name_plural': 'interfaces'}, + ), + migrations.AlterModelOptions( + name='iplist', + options={'permissions': (('view_iplist', 'Can view an IPv4 addresses list object'),), 'verbose_name': 'IPv4 addresses list', 'verbose_name_plural': 'IPv4 addresses lists'}, + ), + migrations.AlterModelOptions( + name='iptype', + options={'permissions': (('view_iptype', 'Can view an IP type object'), ('use_all_iptype', 'Can use all IP types')), 'verbose_name': 'IP type', 'verbose_name_plural': 'IP types'}, + ), + migrations.AlterModelOptions( + name='ipv6list', + options={'permissions': (('view_ipv6list', 'Can view an IPv6 addresses list object'), ('change_ipv6list_slaac_ip', 'Can change the SLAAC value of an IPv6 addresses list')), 'verbose_name': 'IPv6 addresses list', 'verbose_name_plural': 'IPv6 addresses lists'}, + ), + migrations.AlterModelOptions( + name='machine', + options={'permissions': (('view_machine', 'Can view a machine object'), ('change_machine_user', 'Can change the user of a machine')), 'verbose_name': 'machine', 'verbose_name_plural': 'machines'}, + ), + migrations.AlterModelOptions( + name='machinetype', + options={'permissions': (('view_machinetype', 'Can view a machine type object'), ('use_all_machinetype', 'Can use all machine types')), 'verbose_name': 'machine type', 'verbose_name_plural': 'machine types'}, + ), + migrations.AlterModelOptions( + name='mx', + options={'permissions': (('view_mx', 'Can view an MX record object'),), 'verbose_name': 'MX record', 'verbose_name_plural': 'MX records'}, + ), + migrations.AlterModelOptions( + name='nas', + options={'permissions': (('view_nas', 'Can view a NAS device object'),), 'verbose_name': 'NAS device', 'verbose_name_plural': 'NAS devices'}, + ), + migrations.AlterModelOptions( + name='ns', + options={'permissions': (('view_ns', 'Can view an NS record object'),), 'verbose_name': 'NS record', 'verbose_name_plural': 'NS records'}, + ), + migrations.AlterModelOptions( + name='ouvertureport', + options={'verbose_name': 'ports openings'}, + ), + migrations.AlterModelOptions( + name='ouvertureportlist', + options={'permissions': (('view_ouvertureportlist', 'Can view a ports opening list object'),), 'verbose_name': 'ports opening list', 'verbose_name_plural': 'ports opening lists'}, + ), + migrations.AlterModelOptions( + name='role', + options={'permissions': (('view_role', 'Can view a role object'),), 'verbose_name': 'server role', 'verbose_name_plural': 'server roles'}, + ), + migrations.AlterModelOptions( + name='service', + options={'permissions': (('view_service', 'Can view a service object'),), 'verbose_name': 'service to generate (DHCP, DNS, ...)', 'verbose_name_plural': 'services to generate (DHCP, DNS, ...)'}, + ), + migrations.AlterModelOptions( + name='service_link', + options={'permissions': (('view_service_link', 'Can view a service server link object'),), 'verbose_name': 'link between service and server', 'verbose_name_plural': 'links between service and server'}, + ), + migrations.AlterModelOptions( + name='soa', + options={'permissions': (('view_soa', 'Can view an SOA record object'),), 'verbose_name': 'SOA record', 'verbose_name_plural': 'SOA records'}, + ), + migrations.AlterModelOptions( + name='srv', + options={'permissions': (('view_srv', 'Can view an SRV record object'),), 'verbose_name': 'SRV record', 'verbose_name_plural': 'SRV records'}, + ), + migrations.AlterModelOptions( + name='sshfp', + options={'permissions': (('view_sshfp', 'Can view an SSHFP record object'),), 'verbose_name': 'SSHFP record', 'verbose_name_plural': 'SSHFP records'}, + ), + migrations.AlterModelOptions( + name='txt', + options={'permissions': (('view_txt', 'Can view a TXT record object'),), 'verbose_name': 'TXT record', 'verbose_name_plural': 'TXT records'}, + ), + migrations.AlterModelOptions( + name='vlan', + options={'permissions': (('view_vlan', 'Can view a VLAN object'),), 'verbose_name': 'VLAN', 'verbose_name_plural': 'VLANs'}, + ), + migrations.AlterField( + model_name='domain', + name='name', + field=models.CharField(help_text='Mandatory and unique, must not contain dots.', max_length=255), + ), + migrations.AlterField( + model_name='extension', + name='name', + field=models.CharField(help_text='Zone name, must begin with a dot (.example.org)', max_length=255, unique=True), + ), + migrations.AlterField( + model_name='extension', + name='origin', + field=models.ForeignKey(blank=True, help_text='A record associated with the zone', null=True, on_delete=django.db.models.deletion.PROTECT, to='machines.IpList'), + ), + migrations.AlterField( + model_name='extension', + name='origin_v6', + field=models.GenericIPAddressField(blank=True, help_text='AAAA record associated with the zone', null=True, protocol='IPv6'), + ), + migrations.AlterField( + model_name='iptype', + name='domaine_ip_netmask', + field=models.IntegerField(default=24, help_text="Netmask for the domain's IPv4 range", validators=[django.core.validators.MaxValueValidator(31), django.core.validators.MinValueValidator(8)]), + ), + migrations.AlterField( + model_name='iptype', + name='domaine_ip_network', + field=models.GenericIPAddressField(blank=True, help_text="Network containing the domain's IPv4 range (optional)", null=True, protocol='IPv4'), + ), + migrations.AlterField( + model_name='iptype', + name='reverse_v4', + field=models.BooleanField(default=False, help_text='Enable reverse DNS for IPv4'), + ), + migrations.AlterField( + model_name='iptype', + name='reverse_v6', + field=models.BooleanField(default=False, help_text='Enable reverse DNS for IPv6'), + ), + migrations.AlterField( + model_name='machine', + name='name', + field=models.CharField(blank=True, help_text='Optional', max_length=255, null=True), + ), + migrations.AlterField( + model_name='ouvertureportlist', + name='name', + field=models.CharField(help_text='Name of the ports configuration', max_length=255), + ), + migrations.AlterField( + model_name='role', + name='specific_role', + field=models.CharField(blank=True, choices=[('dhcp-server', 'DHCP server'), ('switch-conf-server', 'Switches configuration server'), ('dns-recursif-server', 'Recursive DNS server'), ('ntp-server', 'NTP server'), ('radius-server', 'RADIUS server'), ('log-server', 'Log server'), ('ldap-master-server', 'LDAP master server'), ('ldap-backup-server', 'LDAP backup server'), ('smtp-server', 'SMTP server'), ('postgresql-server', 'postgreSQL server'), ('mysql-server', 'mySQL server'), ('sql-client', 'SQL client'), ('gateway', 'Gateway')], max_length=32, null=True), + ), + migrations.AlterField( + model_name='service', + name='min_time_regen', + field=models.DurationField(default=datetime.timedelta(0, 60), help_text='Minimal time before regeneration of the service.'), + ), + migrations.AlterField( + model_name='service', + name='regular_time_regen', + field=models.DurationField(default=datetime.timedelta(0, 3600), help_text='Maximal time before regeneration of the service.'), + ), + migrations.AlterField( + model_name='soa', + name='expire', + field=models.PositiveIntegerField(default=3600000, help_text='Seconds before the secondary DNS stop answering requests in case of primary DNS timeout'), + ), + migrations.AlterField( + model_name='soa', + name='mail', + field=models.EmailField(help_text='Contact email address for the zone', max_length=254), + ), + migrations.AlterField( + model_name='soa', + name='refresh', + field=models.PositiveIntegerField(default=86400, help_text='Seconds before the secondary DNS have to ask the primary DNS serial to detect a modification'), + ), + migrations.AlterField( + model_name='soa', + name='retry', + field=models.PositiveIntegerField(default=7200, help_text='Seconds before the secondary DNS ask the serial again in case of a primary DNS timeout'), + ), + migrations.AlterField( + model_name='soa', + name='ttl', + field=models.PositiveIntegerField(default=172800, help_text='Time to Live'), + ), + migrations.AlterField( + model_name='srv', + name='port', + field=models.PositiveIntegerField(help_text='TCP/UDP port', validators=[django.core.validators.MaxValueValidator(65535)]), + ), + migrations.AlterField( + model_name='srv', + name='priority', + field=models.PositiveIntegerField(default=0, help_text='Priority of the target server (positive integer value, the lower it is, the more the server will be used if available)', validators=[django.core.validators.MaxValueValidator(65535)]), + ), + migrations.AlterField( + model_name='srv', + name='target', + field=models.ForeignKey(help_text='Target server', on_delete=django.db.models.deletion.PROTECT, to='machines.Domain'), + ), + migrations.AlterField( + model_name='srv', + name='ttl', + field=models.PositiveIntegerField(default=172800, help_text='Time to Live'), + ), + migrations.AlterField( + model_name='srv', + name='weight', + field=models.PositiveIntegerField(default=0, help_text='Relative weight for records with the same priority (integer value between 0 and 65535)', validators=[django.core.validators.MaxValueValidator(65535)]), + ), + ] diff --git a/machines/models.py b/machines/models.py index f201f667..4de0b012 100644 --- a/machines/models.py +++ b/machines/models.py @@ -42,8 +42,8 @@ from django.dispatch import receiver from django.forms import ValidationError from django.utils.functional import cached_property from django.utils import timezone -from django.utils.translation import ugettext_lazy as _l from django.core.validators import MaxValueValidator, MinValueValidator +from django.utils.translation import ugettext_lazy as _ from macaddress.fields import MACAddressField @@ -57,12 +57,10 @@ import preferences.models class Machine(RevMixin, FieldPermissionModelMixin, models.Model): """ Class définissant une machine, object parent user, objets fils interfaces""" - PRETTY_NAME = "Machine" - user = models.ForeignKey('users.User', on_delete=models.PROTECT) name = models.CharField( max_length=255, - help_text="Optionnel", + help_text=_("Optional"), blank=True, null=True ) @@ -70,10 +68,12 @@ class Machine(RevMixin, FieldPermissionModelMixin, models.Model): class Meta: permissions = ( - ("view_machine", "Peut voir un objet machine quelquonque"), + ("view_machine", _("Can view a machine object")), ("change_machine_user", - "Peut changer le propriétaire d'une machine"), + _("Can change the user of a machine")), ) + verbose_name = _("machine") + verbose_name_plural = _("machines") @classmethod def get_instance(cls, machineid, *_args, **_kwargs): @@ -106,7 +106,7 @@ class Machine(RevMixin, FieldPermissionModelMixin, models.Model): explanation message. """ return (user_request.has_perm('machines.change_machine_user'), - "Vous ne pouvez pas modifier l'utilisateur de la machine.") + _("You don't have the right to change the machine's user.")) @staticmethod def can_view_all(user_request, *_args, **_kwargs): @@ -115,8 +115,8 @@ class Machine(RevMixin, FieldPermissionModelMixin, models.Model): :param user_request: instance user qui fait l'edition :return: True ou False avec la raison de l'échec le cas échéant""" if not user_request.has_perm('machines.view_machine'): - return False, (u"Vous ne pouvez pas afficher l'ensemble des " - "machines sans permission") + return False, _("You don't have the right to view all the" + " machines.") return True, None @staticmethod @@ -129,7 +129,7 @@ class Machine(RevMixin, FieldPermissionModelMixin, models.Model): try: user = users.models.User.objects.get(pk=userid) except users.models.User.DoesNotExist: - return False, u"Utilisateur inexistant" + return False, _("Nonexistent user.") max_lambdauser_interfaces = (preferences.models.OptionalMachine .get_cached_value( 'max_lambdauser_interfaces' @@ -137,14 +137,14 @@ class Machine(RevMixin, FieldPermissionModelMixin, models.Model): if not user_request.has_perm('machines.add_machine'): if not (preferences.models.OptionalMachine .get_cached_value('create_machine')): - return False, u"Vous ne pouvez pas ajouter une machine" + return False, (_("You don't have the right to add a machine.")) if user != user_request: - return False, (u"Vous ne pouvez pas ajouter une machine à un " - "autre user que vous sans droit") + return False, (_("You don't have the right to add a machine" + " to another user.")) if user.user_interfaces().count() >= max_lambdauser_interfaces: - return False, (u"Vous avez atteint le maximum d'interfaces " - "autorisées que vous pouvez créer vous même " - "(%s) " % max_lambdauser_interfaces) + return False, (_("You reached the maximum number of interfaces" + " that you are allowed to create yourself" + " (%s)." % max_lambdauser_interfaces)) return True, None def can_edit(self, user_request, *args, **kwargs): @@ -160,9 +160,9 @@ class Machine(RevMixin, FieldPermissionModelMixin, models.Model): user_request, *args, **kwargs - )[0]): - return False, (u"Vous ne pouvez pas éditer une machine " - "d'un autre user que vous sans droit") + )[0]): + return False, (_("You don't have the right to edit a machine" + " of another user.")) return True, None def can_delete(self, user_request, *args, **kwargs): @@ -178,9 +178,9 @@ class Machine(RevMixin, FieldPermissionModelMixin, models.Model): user_request, *args, **kwargs - )[0]): - return False, (u"Vous ne pouvez pas éditer une machine " - "d'un autre user que vous sans droit") + )[0]): + return False, _("You don't have the right to delete a machine" + " of another user.") return True, None def can_view(self, user_request, *_args, **_kwargs): @@ -191,8 +191,8 @@ class Machine(RevMixin, FieldPermissionModelMixin, models.Model): :return: True ou False avec la raison de l'échec le cas échéant""" if (not user_request.has_perm('machines.view_machine') and self.user != user_request): - return False, (u"Vous n'avez pas droit de voir les machines autre " - "que les vôtres") + return False, _("You don't have the right to view other machines" + " than yours.") return True, None @cached_property @@ -228,8 +228,6 @@ class Machine(RevMixin, FieldPermissionModelMixin, models.Model): class MachineType(RevMixin, AclMixin, models.Model): """ Type de machine, relié à un type d'ip, affecté aux interfaces""" - PRETTY_NAME = "Type de machine" - type = models.CharField(max_length=255) ip_type = models.ForeignKey( 'IpType', @@ -240,10 +238,11 @@ class MachineType(RevMixin, AclMixin, models.Model): class Meta: permissions = ( - ("view_machinetype", "Peut voir un objet machinetype"), - ("use_all_machinetype", - "Peut utiliser n'importe quel type de machine"), + ("view_machinetype", _("Can view a machine type object")), + ("use_all_machinetype", _("Can use all machine types")), ) + verbose_name = _("machine type") + verbose_name_plural = _("machine types") def all_interfaces(self): """ Renvoie toutes les interfaces (cartes réseaux) de type @@ -261,8 +260,8 @@ class MachineType(RevMixin, AclMixin, models.Model): message is acces is not allowed. """ if not user_request.has_perm('machines.use_all_machinetype'): - return False, (u"Vous n'avez pas le droit d'utiliser tout types " - "de machines") + return False, (_("You don't have the right to use all machine" + " types.")) return True, None def __str__(self): @@ -271,8 +270,6 @@ class MachineType(RevMixin, AclMixin, models.Model): class IpType(RevMixin, AclMixin, models.Model): """ Type d'ip, définissant un range d'ip, affecté aux machine types""" - PRETTY_NAME = "Type d'ip" - type = models.CharField(max_length=255) extension = models.ForeignKey('Extension', on_delete=models.PROTECT) need_infra = models.BooleanField(default=False) @@ -282,7 +279,7 @@ class IpType(RevMixin, AclMixin, models.Model): protocol='IPv4', null=True, blank=True, - help_text="Network containing the ipv4 range domain ip start/stop. Optional" + help_text=_("Network containing the domain's IPv4 range (optional)") ) domaine_ip_netmask = models.IntegerField( default=24, @@ -290,11 +287,11 @@ class IpType(RevMixin, AclMixin, models.Model): MaxValueValidator(31), MinValueValidator(8) ], - help_text="Netmask for the ipv4 range domain" + help_text=_("Netmask for the domain's IPv4 range") ) reverse_v4 = models.BooleanField( default=False, - help_text="Enable reverse DNS for IPv4", + help_text=_("Enable reverse DNS for IPv4"), ) prefix_v6 = models.GenericIPAddressField( protocol='IPv6', @@ -310,7 +307,7 @@ class IpType(RevMixin, AclMixin, models.Model): ) reverse_v6 = models.BooleanField( default=False, - help_text="Enable reverse DNS for IPv6", + help_text=_("Enable reverse DNS for IPv6"), ) vlan = models.ForeignKey( 'Vlan', @@ -326,9 +323,11 @@ class IpType(RevMixin, AclMixin, models.Model): class Meta: permissions = ( - ("view_iptype", "Peut voir un objet iptype"), - ("use_all_iptype", "Peut utiliser tous les iptype"), + ("view_iptype", _("Can view an IP type object")), + ("use_all_iptype", _("Can use all IP types")), ) + verbose_name = _("IP type") + verbose_name_plural = ("IP types") @cached_property def ip_range(self): @@ -431,8 +430,9 @@ class IpType(RevMixin, AclMixin, models.Model): """ Methode dépréciée, IpList est en mode cascade et supprimé automatiquement""" if Interface.objects.filter(ipv4__in=self.ip_objects()): - raise ValidationError("Une ou plusieurs ip du range sont\ - affectées, impossible de supprimer le range") + raise ValidationError(_("One or several IP addresses from the" + " range are affected, impossible to delete" + " the range.")) for ip in self.ip_objects(): ip.delete() @@ -472,24 +472,25 @@ class IpType(RevMixin, AclMixin, models.Model): - Que le range crée ne recoupe pas un range existant - Formate l'ipv6 donnée en /64""" if IPAddress(self.domaine_ip_start) > IPAddress(self.domaine_ip_stop): - raise ValidationError("Domaine end doit être après start...") + raise ValidationError(_("Range end must be after range start...")) # On ne crée pas plus grand qu'un /16 if self.ip_range.size > 65536: - raise ValidationError("Le range est trop gros, vous ne devez\ - pas créer plus grand qu'un /16") + raise ValidationError(_("The range is too large, you can't create" + " a larger one than a /16.")) # On check que les / ne se recoupent pas for element in IpType.objects.all().exclude(pk=self.pk): if not self.ip_set.isdisjoint(element.ip_set): - raise ValidationError("Le range indiqué n'est pas disjoint\ - des ranges existants") + raise ValidationError(_("The specified range is not disjoint" + " from existing ranges.")) # On formate le prefix v6 if self.prefix_v6: self.prefix_v6 = str(IPNetwork(self.prefix_v6 + '/64').network) # On vérifie qu'un domaine network/netmask contiens bien le domaine ip start-stop if self.domaine_ip_network: if not self.domaine_ip_start in self.ip_network or not self.domaine_ip_stop in self.ip_network: - raise ValidationError("If you specify a domaine ip network/netmask, it\ - must contain domaine ipstart-stop range") + raise ValidationError(_("If you specify a domain network or" + " netmask, it must contain the" + " domain's IP range.")) return def save(self, *args, **kwargs): @@ -511,16 +512,16 @@ class IpType(RevMixin, AclMixin, models.Model): class Vlan(RevMixin, AclMixin, models.Model): """ Un vlan : vlan_id et nom On limite le vlan id entre 0 et 4096, comme défini par la norme""" - PRETTY_NAME = "Vlans" - vlan_id = models.PositiveIntegerField(validators=[MaxValueValidator(4095)]) name = models.CharField(max_length=256) comment = models.CharField(max_length=256, blank=True) class Meta: permissions = ( - ("view_vlan", "Peut voir un objet vlan"), + ("view_vlan", _("Can view a VLAN object")), ) + verbose_name = _("VLAN") + verbose_name_plural = _("VLANs") def __str__(self): return self.name @@ -530,8 +531,6 @@ class Nas(RevMixin, AclMixin, models.Model): """ Les nas. Associé à un machine_type. Permet aussi de régler le port_access_mode (802.1X ou mac-address) pour le radius. Champ autocapture de la mac à true ou false""" - PRETTY_NAME = "Correspondance entre les nas et les machines connectées" - default_mode = '802.1X' AUTH = ( ('802.1X', '802.1X'), @@ -558,8 +557,10 @@ class Nas(RevMixin, AclMixin, models.Model): class Meta: permissions = ( - ("view_nas", "Peut voir un objet Nas"), + ("view_nas", _("Can view a NAS device object")), ) + verbose_name = _("NAS device") + verbose_name_plural = _("NAS devices") def __str__(self): return self.name @@ -571,36 +572,36 @@ class SOA(RevMixin, AclMixin, models.Model): Les valeurs par défault viennent des recommandations RIPE : https://www.ripe.net/publications/docs/ripe-203 """ - PRETTY_NAME = "Enregistrement SOA" - name = models.CharField(max_length=255) mail = models.EmailField( - help_text='Email du contact pour la zone' + help_text=_("Contact email address for the zone") ) refresh = models.PositiveIntegerField( default=86400, # 24 hours - help_text='Secondes avant que les DNS secondaires doivent demander le\ - serial du DNS primaire pour détecter une modification' + help_text=_("Seconds before the secondary DNS have to ask the primary" + " DNS serial to detect a modification") ) retry = models.PositiveIntegerField( default=7200, # 2 hours - help_text='Secondes avant que les DNS secondaires fassent une nouvelle\ - demande de serial en cas de timeout du DNS primaire' + help_text=_("Seconds before the secondary DNS ask the serial again in" + " case of a primary DNS timeout") ) expire = models.PositiveIntegerField( default=3600000, # 1000 hours - help_text='Secondes après lesquelles les DNS secondaires arrêtent de\ - de répondre aux requêtes en cas de timeout du DNS primaire' + help_text=_("Seconds before the secondary DNS stop answering requests" + " in case of primary DNS timeout") ) ttl = models.PositiveIntegerField( default=172800, # 2 days - help_text='Time To Live' + help_text=_("Time to Live") ) class Meta: permissions = ( - ("view_soa", "Peut voir un objet soa"), + ("view_soa", _("Can view an SOA record object")), ) + verbose_name = _("SOA record") + verbose_name_plural = _("SOA records") def __str__(self): return str(self.name) @@ -639,7 +640,7 @@ class SOA(RevMixin, AclMixin, models.Model): /!\ Ne jamais supprimer ou renommer cette fonction car elle est utilisée dans les migrations de la BDD. """ return cls.objects.get_or_create( - name="SOA to edit", + name=_("SOA to edit"), mail="postmaser@example.com" )[0].pk @@ -647,12 +648,10 @@ class SOA(RevMixin, AclMixin, models.Model): class Extension(RevMixin, AclMixin, models.Model): """ Extension dns type example.org. Précise si tout le monde peut l'utiliser, associé à un origin (ip d'origine)""" - PRETTY_NAME = "Extensions dns" - name = models.CharField( max_length=255, unique=True, - help_text="Nom de la zone, doit commencer par un point (.example.org)" + help_text=_("Zone name, must begin with a dot (.example.org)") ) need_infra = models.BooleanField(default=False) origin = models.ForeignKey( @@ -660,13 +659,13 @@ class Extension(RevMixin, AclMixin, models.Model): on_delete=models.PROTECT, blank=True, null=True, - help_text="Enregistrement A associé à la zone" + help_text=_("A record associated with the zone") ) origin_v6 = models.GenericIPAddressField( protocol='IPv6', null=True, blank=True, - help_text="Enregistrement AAAA associé à la zone" + help_text=_("AAAA record associated with the zone") ) soa = models.ForeignKey( 'SOA', @@ -675,9 +674,11 @@ class Extension(RevMixin, AclMixin, models.Model): class Meta: permissions = ( - ("view_extension", "Peut voir un objet extension"), - ("use_all_extension", "Peut utiliser toutes les extension"), + ("view_extension", _("Can view an extension object")), + ("use_all_extension", _("Can use all extensions")), ) + verbose_name = _("DNS extension") + verbose_name_plural = _("DNS extensions") @cached_property def dns_entry(self): @@ -728,7 +729,7 @@ class Extension(RevMixin, AclMixin, models.Model): def clean(self, *args, **kwargs): if self.name and self.name[0] != '.': - raise ValidationError("Une extension doit commencer par un point") + raise ValidationError(_("An extension must begin with a dot.")) super(Extension, self).clean(*args, **kwargs) @@ -736,16 +737,16 @@ class Mx(RevMixin, AclMixin, models.Model): """ Entrées des MX. Enregistre la zone (extension) associée et la priorité Todo : pouvoir associer un MX à une interface """ - PRETTY_NAME = "Enregistrements MX" - zone = models.ForeignKey('Extension', on_delete=models.PROTECT) priority = models.PositiveIntegerField() name = models.ForeignKey('Domain', on_delete=models.PROTECT) class Meta: permissions = ( - ("view_mx", "Peut voir un objet mx"), + ("view_mx", _("Can view an MX record object")), ) + verbose_name = _("MX record") + verbose_name_plural = _("MX records") @cached_property def dns_entry(self): @@ -762,15 +763,15 @@ class Mx(RevMixin, AclMixin, models.Model): class Ns(RevMixin, AclMixin, models.Model): """Liste des enregistrements name servers par zone considéérée""" - PRETTY_NAME = "Enregistrements NS" - zone = models.ForeignKey('Extension', on_delete=models.PROTECT) ns = models.ForeignKey('Domain', on_delete=models.PROTECT) class Meta: permissions = ( - ("view_ns", "Peut voir un objet ns"), + ("view_ns", _("Can view an NS record object")), ) + verbose_name = _("NS record") + verbose_name_plural = _("NS records") @cached_property def dns_entry(self): @@ -783,16 +784,16 @@ class Ns(RevMixin, AclMixin, models.Model): class Txt(RevMixin, AclMixin, models.Model): """ Un enregistrement TXT associé à une extension""" - PRETTY_NAME = "Enregistrement TXT" - zone = models.ForeignKey('Extension', on_delete=models.PROTECT) field1 = models.CharField(max_length=255) field2 = models.TextField(max_length=2047) class Meta: permissions = ( - ("view_txt", "Peut voir un objet txt"), + ("view_txt", _("Can view a TXT record object")), ) + verbose_name = _("TXT record") + verbose_name_plural = _("TXT records") def __str__(self): return str(self.zone) + " : " + str(self.field1) + " " +\ @@ -811,10 +812,10 @@ class DName(RevMixin, AclMixin, models.Model): class Meta: permissions = ( - ("view_dname", "Can see a dname object"), + ("view_dname", _("Can view a DNAME record object")), ) - verbose_name = "DNAME entry" - verbose_name_plural = "DNAME entries" + verbose_name = _("DNAME record") + verbose_name_plural = _("DNAME records") def __str__(self): return str(self.zone) + " : " + str(self.alias) @@ -827,8 +828,6 @@ class DName(RevMixin, AclMixin, models.Model): class Srv(RevMixin, AclMixin, models.Model): """ A SRV record """ - PRETTY_NAME = "Enregistrement Srv" - TCP = 'TCP' UDP = 'UDP' @@ -844,35 +843,37 @@ class Srv(RevMixin, AclMixin, models.Model): extension = models.ForeignKey('Extension', on_delete=models.PROTECT) ttl = models.PositiveIntegerField( default=172800, # 2 days - help_text='Time To Live' + help_text=_("Time to Live") ) priority = models.PositiveIntegerField( default=0, validators=[MaxValueValidator(65535)], - help_text=("La priorité du serveur cible (valeur entière non " - "négative, plus elle est faible, plus ce serveur sera " - "utilisé s'il est disponible)") + help_text=_("Priority of the target server (positive integer value," + " the lower it is, the more the server will be used if" + " available)") ) weight = models.PositiveIntegerField( default=0, validators=[MaxValueValidator(65535)], - help_text="Poids relatif pour les enregistrements de même priorité\ - (valeur entière de 0 à 65535)" + help_text=_("Relative weight for records with the same priority" + " (integer value between 0 and 65535)") ) port = models.PositiveIntegerField( validators=[MaxValueValidator(65535)], - help_text="Port (tcp/udp)" + help_text=_("TCP/UDP port") ) target = models.ForeignKey( 'Domain', on_delete=models.PROTECT, - help_text="Serveur cible" + help_text=_("Target server") ) class Meta: permissions = ( - ("view_srv", "Peut voir un objet srv"), + ("view_srv", _("Can view an SRV record object")), ) + verbose_name = _("SRV record") + verbose_name_plural = _("SRV records") def __str__(self): return str(self.service) + ' ' + str(self.protocole) + ' ' +\ @@ -936,10 +937,10 @@ class SshFp(RevMixin, AclMixin, models.Model): class Meta: permissions = ( - ("view_sshfp", "Can see an SSHFP record"), + ("view_sshfp", _("Can view an SSHFP record object")), ) - verbose_name = "SSHFP record" - verbose_name_plural = "SSHFP records" + verbose_name = _("SSHFP record") + verbose_name_plural = _("SSHFP records") def can_view(self, user_request, *_args, **_kwargs): return self.machine.can_view(user_request, *_args, **_kwargs) @@ -963,8 +964,6 @@ class Interface(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model): - le type parent associé au range ip et à l'extension - un objet domain associé contenant son nom - la liste des ports oiuvert""" - PRETTY_NAME = "Interface" - ipv4 = models.OneToOneField( 'IpList', on_delete=models.PROTECT, @@ -979,10 +978,12 @@ class Interface(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model): class Meta: permissions = ( - ("view_interface", "Peut voir un objet interface"), + ("view_interface", _("Can view an interface object")), ("change_interface_machine", - "Peut changer le propriétaire d'une interface"), + _("Can change the owner of an interface")), ) + verbose_name = _("interface") + verbose_name_plural = _("interfaces") @cached_property def is_active(self): @@ -1076,7 +1077,7 @@ class Interface(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model): try: self.mac_address = str(EUI(self.mac_address)) except: - raise ValidationError("La mac donnée est invalide") + raise ValidationError(_("The given MAC address is invalid.")) def clean(self, *args, **kwargs): """ Formate l'addresse mac en mac_bare (fonction filter_mac) @@ -1089,7 +1090,7 @@ class Interface(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model): # But in our case, it's impossible to create a type value so we raise # the error. if not hasattr(self, 'type'): - raise ValidationError("Le type d'ip choisi n'est pas valide") + raise ValidationError(_("The selected IP type is invalid.")) self.filter_macaddress() self.mac_address = str(EUI(self.mac_address)) or None if not self.ipv4 or self.type.ip_type != self.ipv4.ip_type: @@ -1102,8 +1103,8 @@ class Interface(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model): if free_ips: self.ipv4 = free_ips[0] else: - raise ValidationError("Il n'y a plus d'ip disponibles\ - dans le slash") + raise ValidationError(_("There is no IP address available in the" + " slash.")) return def unassign_ipv4(self): @@ -1120,8 +1121,8 @@ class Interface(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model): # On verifie la cohérence en forçant l'extension par la méthode if self.ipv4: if self.type.ip_type != self.ipv4.ip_type: - raise ValidationError("L'ipv4 et le type de la machine ne\ - correspondent pas") + raise ValidationError(_("The IPv4 address and the machine type" + " don't match.")) super(Interface, self).save(*args, **kwargs) @staticmethod @@ -1134,23 +1135,23 @@ class Interface(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model): try: machine = Machine.objects.get(pk=machineid) except Machine.DoesNotExist: - return False, u"Machine inexistante" + return False, _("Nonexistent machine.") if not user_request.has_perm('machines.add_interface'): if not (preferences.models.OptionalMachine .get_cached_value('create_machine')): - return False, u"Vous ne pouvez pas ajouter une machine" + return False, _("You can't add a machine.") max_lambdauser_interfaces = (preferences.models.OptionalMachine .get_cached_value( 'max_lambdauser_interfaces' )) if machine.user != user_request: - return False, u"Vous ne pouvez pas ajouter une interface à une\ - machine d'un autre user que vous sans droit" + return False, _("You don't have the right to add an interface" + " to a machine of another user.") if (machine.user.user_interfaces().count() >= max_lambdauser_interfaces): - return False, u"Vous avez atteint le maximum d'interfaces\ - autorisées que vous pouvez créer vous même (%s) "\ - % max_lambdauser_interfaces + return False, (_("You reached the maximum number of interfaces" + " that you are allowed to create yourself" + " (%s)." % max_lambdauser_interfaces)) return True, None @staticmethod @@ -1158,7 +1159,7 @@ class Interface(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model): """Check if a user can change the machine associated with an Interface object """ return (user_request.has_perm('machines.change_interface_machine'), - "Droit requis pour changer la machine") + _("Permission required to edit the machine.")) def can_edit(self, user_request, *args, **kwargs): """Verifie que l'user a les bons droits infra pour editer @@ -1172,9 +1173,9 @@ class Interface(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model): user_request, *args, **kwargs - )[0]): - return False, (u"Vous ne pouvez pas éditer une machine " - "d'un autre user que vous sans droit") + )[0]): + return False, _("You don't have the right to edit a machine of" + " another user.") return True, None def can_delete(self, user_request, *args, **kwargs): @@ -1189,9 +1190,9 @@ class Interface(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model): user_request, *args, **kwargs - )[0]): - return False, (u"Vous ne pouvez pas éditer une machine " - "d'un autre user que vous sans droit") + )[0]): + return False, _("You don't have the right to edit a machine of" + " another user.") return True, None def can_view(self, user_request, *_args, **_kwargs): @@ -1202,8 +1203,8 @@ class Interface(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model): :return: True ou False avec la raison de l'échec le cas échéant""" if (not user_request.has_perm('machines.view_interface') and self.machine.user != user_request): - return False, (u"Vous n'avez pas le droit de voir des machines " - "autre que les vôtres") + return False, _("You don't have the right to view machines other" + " than yours.") return True, None def __init__(self, *args, **kwargs): @@ -1235,7 +1236,6 @@ class Interface(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model): class Ipv6List(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model): """ A list of IPv6 """ - PRETTY_NAME = 'Enregistrements Ipv6 des machines' ipv6 = models.GenericIPAddressField( protocol='IPv6', @@ -1249,10 +1249,12 @@ class Ipv6List(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model): class Meta: permissions = ( - ("view_ipv6list", "Peut voir un objet ipv6"), - ("change_ipv6list_slaac_ip", - "Peut changer la valeur slaac sur une ipv6"), + ("view_ipv6list", _("Can view an IPv6 addresses list object")), + ("change_ipv6list_slaac_ip", _("Can change the SLAAC value of an" + " IPv6 addresses list")), ) + verbose_name = _("IPv6 addresses list") + verbose_name_plural = _("IPv6 addresses lists") @staticmethod def can_create(user_request, interfaceid, *_args, **_kwargs): @@ -1264,18 +1266,19 @@ class Ipv6List(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model): try: interface = Interface.objects.get(pk=interfaceid) except Interface.DoesNotExist: - return False, u"Interface inexistante" + return False, _("Nonexistent interface.") if not user_request.has_perm('machines.add_ipv6list'): if interface.machine.user != user_request: - return False, u"Vous ne pouvez pas ajouter un alias à une\ - machine d'un autre user que vous sans droit" + return False, _("You don't have the right to add an alias to a" + " machine of another user.") return True, None @staticmethod def can_change_slaac_ip(user_request, *_args, **_kwargs): """ Check if a user can change the slaac value """ return (user_request.has_perm('machines.change_ipv6list_slaac_ip'), - "Droit requis pour changer la valeur slaac ip") + _("Permission required to change the SLAAC value of an IPv6" + " address")) def can_edit(self, user_request, *args, **kwargs): """Verifie que l'user a les bons droits infra pour editer @@ -1289,9 +1292,9 @@ class Ipv6List(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model): user_request, *args, **kwargs - )[0]): - return False, (u"Vous ne pouvez pas éditer une machine " - "d'un autre user que vous sans droit") + )[0]): + return False, _("You don't have the right to edit a machine of" + " another user.") return True, None def can_delete(self, user_request, *args, **kwargs): @@ -1306,9 +1309,9 @@ class Ipv6List(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model): user_request, *args, **kwargs - )[0]): - return False, (u"Vous ne pouvez pas éditer une machine " - "d'un autre user que vous sans droit") + )[0]): + return False, _("You don't have the right to edit a machine of" + " another user.") return True, None def can_view(self, user_request, *_args, **_kwargs): @@ -1319,8 +1322,8 @@ class Ipv6List(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model): :return: True ou False avec la raison de l'échec le cas échéant""" if (not user_request.has_perm('machines.view_ipv6list') and self.interface.machine.user != user_request): - return False, (u"Vous n'avez pas le droit de voir des machines " - "autre que les vôtres") + return False, _("You don't have the right to view machines other" + " than yours.") return True, None def __init__(self, *args, **kwargs): @@ -1346,15 +1349,14 @@ class Ipv6List(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model): if self.slaac_ip and (Ipv6List.objects .filter(interface=self.interface, slaac_ip=True) .exclude(id=self.id)): - raise ValidationError("Une ip slaac est déjà enregistrée") + raise ValidationError(_("A SLAAC IP address is already registered.")) prefix_v6 = self.interface.type.ip_type.prefix_v6.encode().decode('utf-8') if prefix_v6: if (IPv6Address(self.ipv6.encode().decode('utf-8')).exploded[:20] != IPv6Address(prefix_v6).exploded[:20]): - raise ValidationError( - "Le prefixv6 est incorrect et ne correspond pas au type " - "associé à la machine" - ) + raise ValidationError(_("The v6 prefix is incorrect and" + " doesn't match the type associated" + " with the machine.")) super(Ipv6List, self).clean(*args, **kwargs) def save(self, *args, **kwargs): @@ -1370,7 +1372,6 @@ class Domain(RevMixin, AclMixin, models.Model): """ Objet domain. Enregistrement A et CNAME en même temps : permet de stocker les alias et les nom de machines, suivant si interface_parent ou cname sont remplis""" - PRETTY_NAME = "Domaine dns" interface_parent = models.OneToOneField( 'Interface', @@ -1379,7 +1380,7 @@ class Domain(RevMixin, AclMixin, models.Model): null=True ) name = models.CharField( - help_text="Obligatoire et unique, ne doit pas comporter de points", + help_text=_("Mandatory and unique, must not contain dots."), max_length=255 ) extension = models.ForeignKey('Extension', on_delete=models.PROTECT) @@ -1393,8 +1394,10 @@ class Domain(RevMixin, AclMixin, models.Model): class Meta: unique_together = (("name", "extension"),) permissions = ( - ("view_domain", "Peut voir un objet domain"), + ("view_domain", _("Can view a domain object")), ) + verbose_name = _("domain") + verbose_name_plural = _("domains") def get_extension(self): """ Retourne l'extension de l'interface parente si c'est un A @@ -1416,20 +1419,22 @@ class Domain(RevMixin, AclMixin, models.Model): if self.get_extension(): self.extension = self.get_extension() if self.interface_parent and self.cname: - raise ValidationError("On ne peut créer à la fois A et CNAME") + raise ValidationError(_("You can't create a both A and CNAME" + " record.")) if self.cname == self: - raise ValidationError("On ne peut créer un cname sur lui même") + raise ValidationError(_("You can't create a CNAME record pointing" + " to itself.")) HOSTNAME_LABEL_PATTERN = re.compile( r"(?!-)[A-Z\d-]+(? 63: - raise ValidationError("Le nom de domaine %s est trop long\ - (maximum de 63 caractères)." % dns) + raise ValidationError(_("The domain name %s is too long (over 63" + " characters).") % dns) if not HOSTNAME_LABEL_PATTERN.match(dns): - raise ValidationError("Ce nom de domaine %s contient des\ - carractères interdits." % dns) + raise ValidationError(_("The domain name %s contains forbidden" + " characters.") % dns) self.validate_unique() super(Domain, self).clean() @@ -1446,7 +1451,7 @@ class Domain(RevMixin, AclMixin, models.Model): """ Empèche le save sans extension valide. Force à avoir appellé clean avant""" if not self.get_extension(): - raise ValidationError("Extension invalide") + raise ValidationError(_("Invalid extension.")) self.full_clean() super(Domain, self).save(*args, **kwargs) @@ -1472,24 +1477,24 @@ class Domain(RevMixin, AclMixin, models.Model): try: interface = Interface.objects.get(pk=interfaceid) except Interface.DoesNotExist: - return False, u"Interface inexistante" + return False, _("Nonexistent interface.") if not user_request.has_perm('machines.add_domain'): max_lambdauser_aliases = (preferences.models.OptionalMachine .get_cached_value( 'max_lambdauser_aliases' )) if interface.machine.user != user_request: - return False, (u"Vous ne pouvez pas ajouter un alias à une " - "machine d'un autre user que vous sans droit") + return False, _("You don't have the right to add an alias to a" + " machine of another user.") if Domain.objects.filter( - cname__in=Domain.objects.filter( - interface_parent__in=(interface.machine.user - .user_interfaces()) - ) - ).count() >= max_lambdauser_aliases: - return False, (u"Vous avez atteint le maximum d'alias " - "autorisés que vous pouvez créer vous même " - "(%s) " % max_lambdauser_aliases) + cname__in=Domain.objects.filter( + interface_parent__in=(interface.machine.user + .user_interfaces()) + ) + ).count() >= max_lambdauser_aliases: + return False, _("You reached the maximum number of alias that" + " you are allowed to create yourself (%s). " + % max_lambdauser_aliases) return True, None def can_edit(self, user_request, *_args, **_kwargs): @@ -1500,8 +1505,8 @@ class Domain(RevMixin, AclMixin, models.Model): :return: soit True, soit False avec la raison de l'échec""" if (not user_request.has_perm('machines.change_domain') and self.get_source_interface.machine.user != user_request): - return False, (u"Vous ne pouvez pas editer un alias à une machine " - "d'un autre user que vous sans droit") + return False, _("You don't have the right to edit an alias of a" + " machine of another user.") return True, None def can_delete(self, user_request, *_args, **_kwargs): @@ -1512,8 +1517,8 @@ class Domain(RevMixin, AclMixin, models.Model): :return: soit True, soit False avec la raison de l'échec""" if (not user_request.has_perm('machines.delete_domain') and self.get_source_interface.machine.user != user_request): - return False, (u"Vous ne pouvez pas supprimer un alias à une " - "machine d'un autre user que vous sans droit") + return False, _("You don't have the right to delete an alias of a" + " machine of another user.") return True, None def can_view(self, user_request, *_args, **_kwargs): @@ -1524,8 +1529,8 @@ class Domain(RevMixin, AclMixin, models.Model): :return: True ou False avec la raison de l'échec le cas échéant""" if (not user_request.has_perm('machines.view_domain') and self.get_source_interface.machine.user != user_request): - return False, (u"Vous n'avez pas le droit de voir des machines " - "autre que les vôtres") + return False, _("You don't have the right to view machines other" + " than yours.") return True, None def __str__(self): @@ -1534,15 +1539,16 @@ class Domain(RevMixin, AclMixin, models.Model): class IpList(RevMixin, AclMixin, models.Model): """ A list of IPv4 """ - PRETTY_NAME = "Addresses ipv4" ipv4 = models.GenericIPAddressField(protocol='IPv4', unique=True) ip_type = models.ForeignKey('IpType', on_delete=models.CASCADE) class Meta: permissions = ( - ("view_iplist", "Peut voir un objet iplist"), + ("view_iplist", _("Can view an IPv4 addresses list object")), ) + verbose_name = _("IPv4 addresses list") + verbose_name_plural = _("IPv4 addresses lists") @cached_property def need_infra(self): @@ -1553,8 +1559,8 @@ class IpList(RevMixin, AclMixin, models.Model): def clean(self): """ Erreur si l'ip_type est incorrect""" if not str(self.ipv4) in self.ip_type.ip_set_as_str: - raise ValidationError("L'ipv4 et le range de l'iptype ne\ - correspondent pas!") + raise ValidationError(_("The IPv4 address and the range of the IP" + " type don't match.")) return def save(self, *args, **kwargs): @@ -1571,19 +1577,19 @@ class Role(RevMixin, AclMixin, models.Model): """ ROLE = ( - ('dhcp-server', _l('DHCP server')), - ('switch-conf-server', _l('Switches configuration server')), - ('dns-recursif-server', _l('Recursive DNS server')), - ('ntp-server', _l('NTP server')), - ('radius-server', _l('Radius server')), - ('log-server', _l('Log server')), - ('ldap-master-server', _l('LDAP master server')), - ('ldap-backup-server', _l('LDAP backup server')), - ('smtp-server', _l('SMTP server')), - ('postgresql-server', _l('postgreSQL server')), - ('mysql-server', _l('mySQL server')), - ('sql-client', _l('SQL client')), - ('gateway', _l('Gatewaw')), + ('dhcp-server', _("DHCP server")), + ('switch-conf-server', _("Switches configuration server")), + ('dns-recursif-server', _("Recursive DNS server")), + ('ntp-server', _("NTP server")), + ('radius-server', _("RADIUS server")), + ('log-server', _("Log server")), + ('ldap-master-server', _("LDAP master server")), + ('ldap-backup-server', _("LDAP backup server")), + ('smtp-server', _("SMTP server")), + ('postgresql-server', _("postgreSQL server")), + ('mysql-server', _("mySQL server")), + ('sql-client', _("SQL client")), + ('gateway', _("Gateway")), ) role_type = models.CharField(max_length=255, unique=True) @@ -1597,9 +1603,10 @@ class Role(RevMixin, AclMixin, models.Model): class Meta: permissions = ( - ("view_role", _l("Can view a role.")), + ("view_role", _("Can view a role object")), ) - verbose_name = _l("Server role") + verbose_name = _("server role") + verbose_name_plural = _("server roles") @classmethod def get_instance(cls, roleid, *_args, **_kwargs): @@ -1636,23 +1643,24 @@ class Role(RevMixin, AclMixin, models.Model): class Service(RevMixin, AclMixin, models.Model): """ Definition d'un service (dhcp, dns, etc)""" - PRETTY_NAME = "Services à générer (dhcp, dns, etc)" service_type = models.CharField(max_length=255, blank=True, unique=True) min_time_regen = models.DurationField( default=timedelta(minutes=1), - help_text="Temps minimal avant nouvelle génération du service" + help_text=_("Minimal time before regeneration of the service.") ) regular_time_regen = models.DurationField( default=timedelta(hours=1), - help_text="Temps maximal avant nouvelle génération du service" + help_text=_("Maximal time before regeneration of the service.") ) servers = models.ManyToManyField('Interface', through='Service_link') class Meta: permissions = ( - ("view_service", "Peut voir un objet service"), + ("view_service", _("Can view a service object")), ) + verbose_name = _("service to generate (DHCP, DNS, ...)") + verbose_name_plural = _("services to generate (DHCP, DNS, ...)") def ask_regen(self): """ Marque à True la demande de régénération pour un service x """ @@ -1690,7 +1698,6 @@ def regen(service): class Service_link(RevMixin, AclMixin, models.Model): """ Definition du lien entre serveurs et services""" - PRETTY_NAME = "Relation entre service et serveur" service = models.ForeignKey('Service', on_delete=models.CASCADE) server = models.ForeignKey('Interface', on_delete=models.CASCADE) @@ -1699,8 +1706,10 @@ class Service_link(RevMixin, AclMixin, models.Model): class Meta: permissions = ( - ("view_service_link", "Peut voir un objet service_link"), + ("view_service_link", _("Can view a service server link object")), ) + verbose_name = _("link between service and server") + verbose_name_plural = _("links between service and server") def done_regen(self): """ Appellé lorsqu'un serveur a regénéré son service""" @@ -1740,17 +1749,19 @@ class Service_link(RevMixin, AclMixin, models.Model): class OuverturePortList(RevMixin, AclMixin, models.Model): """Liste des ports ouverts sur une interface.""" - PRETTY_NAME = "Profil d'ouverture de ports" name = models.CharField( - help_text="Nom de la configuration des ports.", + help_text=_("Name of the ports configuration"), max_length=255 ) class Meta: permissions = ( - ("view_ouvertureportlist", "Peut voir un objet ouvertureport"), + ("view_ouvertureportlist", _("Can view a ports opening list" + " object")), ) + verbose_name = _("ports opening list") + verbose_name_plural = _("ports opening lists") def can_delete(self, user_request, *_args, **_kwargs): """Verifie que l'user a les bons droits bureau pour delete @@ -1759,10 +1770,10 @@ class OuverturePortList(RevMixin, AclMixin, models.Model): :param user_request: Utilisateur qui fait la requête :return: soit True, soit False avec la raison de l'échec""" if not user_request.has_perm('machines.delete_ouvertureportlist'): - return False, (u"Vous n'avez pas le droit de supprimer une " - "ouverture de port") + return False, _("You don't have the right to delete a ports" + " opening list.") if self.interface_set.all(): - return False, u"Cette liste de ports est utilisée" + return False, _("This ports opening list is used.") return True, None def __str__(self): @@ -1806,7 +1817,6 @@ class OuverturePort(RevMixin, AclMixin, models.Model): On limite les ports entre 0 et 65535, tels que défini par la RFC """ - PRETTY_NAME = "Plage de port ouverte" TCP = 'T' UDP = 'U' @@ -1834,6 +1844,10 @@ class OuverturePort(RevMixin, AclMixin, models.Model): ), default=OUT, ) + + class Meta: + verbose_name = _("ports opening") + verbose_name = _("ports openings") def __str__(self): if self.begin == self.end: @@ -1999,3 +2013,4 @@ def srv_post_save(**_kwargs): def srv_post_delete(**_kwargs): """Regeneration dns après modification d'un SRV""" regen('dns') + diff --git a/machines/templates/machines/aff_alias.html b/machines/templates/machines/aff_alias.html index 184db6f4..17266a6e 100644 --- a/machines/templates/machines/aff_alias.html +++ b/machines/templates/machines/aff_alias.html @@ -23,25 +23,26 @@ with this program; if not, write to the Free Software Foundation, Inc., {% endcomment %} {% load acl %} +{% load i18n %} {% load logs_extra %} - + {% for alias in alias_list %} - - - - + + + + {% endfor %}
Alias{% trans "Aliases" %}
{{ alias }} - {% can_edit alias %} - {% include 'buttons/edit.html' with href='machines:edit-alias' id=alias.id %} - {% acl_end %} - {% history_button alias %} -
{{ alias }} + {% can_edit alias %} + {% include 'buttons/edit.html' with href='machines:edit-alias' id=alias.id %} + {% acl_end %} + {% history_button alias %} +
diff --git a/machines/templates/machines/aff_dname.html b/machines/templates/machines/aff_dname.html index 8797be72..7e043d7c 100644 --- a/machines/templates/machines/aff_dname.html +++ b/machines/templates/machines/aff_dname.html @@ -22,16 +22,17 @@ with this program; if not, write to the Free Software Foundation, Inc., {% load acl %} {% load logs_extra %} +{% load i18n %} - - - - - - - - - {% for dname in dname_list %} +
Target zoneRecord
+ + + + + + + + {% for dname in dname_list %} @@ -39,10 +40,9 @@ with this program; if not, write to the Free Software Foundation, Inc., {% can_edit dname %} {% include 'buttons/edit.html' with href='machines:edit-dname' id=dname.id %} {% acl_end %} - {% history_button dname %} + {% history_button dname %} - {% endfor %} -
{% trans "Target zone" %}{% trans "Record" %}
{{ dname.zone }} {{ dname.dns_entry }}
- + {% endfor %} + diff --git a/machines/templates/machines/aff_extension.html b/machines/templates/machines/aff_extension.html index ba444eca..43bb9e39 100644 --- a/machines/templates/machines/aff_extension.html +++ b/machines/templates/machines/aff_extension.html @@ -25,17 +25,18 @@ with this program; if not, write to the Free Software Foundation, Inc., {% load acl %} {% load logs_extra %} {% load design %} +{% load i18n %}
- - - - + + + + {% if ipv6_enabled %} - + {% endif %} @@ -44,7 +45,7 @@ with this program; if not, write to the Free Software Foundation, Inc., - + {% if ipv6_enabled %} @@ -59,3 +60,4 @@ with this program; if not, write to the Free Software Foundation, Inc., {% endfor %}
ExtensionDroit infra pour utiliser ?Enregistrement SOAEnregistrement A origin{% trans "Extension" %}{% trans "'infra' right required" %}{% trans "SOA record" %}{% trans "A record origin" %}Enregistrement AAAA origin{% trans "AAAA record origin" %}
{{ extension.name }} {{ extension.need_infra|tick }}{{ extension.soa}}{{ extension.soa }} {{ extension.origin }}{{ extension.origin_v6 }}
+ diff --git a/machines/templates/machines/aff_iptype.html b/machines/templates/machines/aff_iptype.html index afd35d1b..b8ed5293 100644 --- a/machines/templates/machines/aff_iptype.html +++ b/machines/templates/machines/aff_iptype.html @@ -26,18 +26,20 @@ with this program; if not, write to the Free Software Foundation, Inc., {% load acl %} {% load logs_extra %} +{% load i18n %} +
- - - - - - - - + + + + + + + + @@ -61,3 +63,4 @@ with this program; if not, write to the Free Software Foundation, Inc., {% endfor %}
Type d'ipExtensionNécessite l'autorisation infraPlage ipv4Préfixe v6DNSSEC reverse v4/v6Sur vlanOuverture ports par défault{% trans "IP type" %}{% trans "Extension" %}{% trans "'infra' right required" %}{% trans "IPv4 range" %}{% trans "v6 prefix" %}{% trans "DNSSEC reverse v4/v6" %}{% trans "On VLAN(s)" %}{% trans "Default ports opening" %}
+ diff --git a/machines/templates/machines/aff_ipv6.html b/machines/templates/machines/aff_ipv6.html index d5323f61..a98c0327 100644 --- a/machines/templates/machines/aff_ipv6.html +++ b/machines/templates/machines/aff_ipv6.html @@ -24,29 +24,30 @@ with this program; if not, write to the Free Software Foundation, Inc., {% load acl %} {% load logs_extra %} +{% load i18n %} - - + + - + {% for ipv6 in ipv6_list %} - - - - - + + + + + {% endfor %}
Ipv6Slaac{% trans "IPv6 addresses" %}{% trans "SLAAC" %}
{{ ipv6.ipv6 }}{{ ipv6.slaac_ip }} - {% can_edit ipv6 %} - {% include 'buttons/edit.html' with href='machines:edit-ipv6list' id=ipv6.id %} - {% acl_end %} - {% can_delete ipv6 %} - {% include 'buttons/suppr.html' with href='machines:del-ipv6list' id=ipv6.id %} - {% acl_end %} - {% history_button ipv6 %} -
{{ ipv6.ipv6 }}{{ ipv6.slaac_ip }} + {% can_edit ipv6 %} + {% include 'buttons/edit.html' with href='machines:edit-ipv6list' id=ipv6.id %} + {% acl_end %} + {% can_delete ipv6 %} + {% include 'buttons/suppr.html' with href='machines:del-ipv6list' id=ipv6.id %} + {% acl_end %} + {% history_button ipv6 %} +
diff --git a/machines/templates/machines/aff_machines.html b/machines/templates/machines/aff_machines.html index ba736f10..e3404036 100644 --- a/machines/templates/machines/aff_machines.html +++ b/machines/templates/machines/aff_machines.html @@ -24,6 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc., {% load acl %} {% load logs_extra %} +{% load i18n %}
{% if machines_list.paginator %} @@ -39,23 +40,27 @@ with this program; if not, write to the Free Software Foundation, Inc., - {% include "buttons/sort.html" with prefix='machine' col='name' text='Nom DNS' %} - Type - MAC - IP - Actions + {% trans "DNS name" as tr_dns_name %} + {% include "buttons/sort.html" with prefix='machine' col='name' text=tr_dns_name %} + {% trans "Type" %} + {% trans "MAC address" %} + {% trans "IP address" %} + {% trans "Actions" %} - {% for machine in machines_list %} + {% for machine in machines_list %} - {{ machine.name|default:'Pas de nom' }} - + {% trans "No name" as tr_no_name %} + {% trans "View the profile" as tr_view_the_profile %} + {{ machine.name|default:'tr_no_name' }} + {{ machine.user }} {% can_create Interface machine.id %} - {% include 'buttons/add.html' with href='machines:new-interface' id=machine.id desc='Ajouter une interface' %} + {% trans "Create an interface" as tr_create_an_interface %} + {% include 'buttons/add.html' with href='machines:new-interface' id=machine.id desc=tr_create_an_interface %} {% acl_end %} {% history_button machine %} {% can_delete machine %} @@ -68,8 +73,8 @@ with this program; if not, write to the Free Software Foundation, Inc., {% if interface.domain.related_domain.all %} {{ interface.domain }} - {% else %} {{ interface.domain }} @@ -77,7 +82,7 @@ with this program; if not, write to the Free Software Foundation, Inc., {{ interface.type }} - + {{ interface.mac_address }} @@ -86,8 +91,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% if ipv6_enabled and interface.ipv6 != 'None'%} IPv6 - {% endif %} @@ -97,39 +102,44 @@ with this program; if not, write to the Free Software Foundation, Inc., -
- {% if ipv6_enabled and interface.ipv6 != 'None'%}
    - {% for ipv6 in interface.ipv6.all %} + {% for ipv6 in interface.ipv6.all %}
  • - {{ipv6}} + {{ ipv6 }}
  • - {% endfor %} + {% endfor %}
- - {% endif %} - - - {% if interface.domain.related_domain.all %} - - -
-
    - {% for al in interface.domain.related_domain.all %} -
  • - - {{ al }} - - -
  • - {% endfor %} -
-
- - - {% endif %} - {% endfor %} - - - - {% endfor %} + + {% endif %} + {% if interface.domain.related_domain.all %} + + +
+
    + {% for al in interface.domain.related_domain.all %} +
  • + + {{ al }} + + +
  • + {% endfor %} +
+
+ + + {% endif %} + {% endfor %} + + + + {% endfor %} + - - {% endblock %} + diff --git a/machines/templates/machines/index.html b/machines/templates/machines/index.html index 3d85dd59..509334a0 100644 --- a/machines/templates/machines/index.html +++ b/machines/templates/machines/index.html @@ -24,11 +24,12 @@ with this program; if not, write to the Free Software Foundation, Inc., {% endcomment %} {% load bootstrap3 %} +{% load i18n %} -{% block title %}Machines{% endblock %} +{% block title %}{% trans "Machines" %}{% endblock %} {% block content %} -

Machines

+

{% trans "Machines" %}

{% include "machines/aff_machines.html" with machines_list=machines_list %}

diff --git a/machines/templates/machines/index_alias.html b/machines/templates/machines/index_alias.html index 07750754..2d33177f 100644 --- a/machines/templates/machines/index_alias.html +++ b/machines/templates/machines/index_alias.html @@ -24,16 +24,17 @@ with this program; if not, write to the Free Software Foundation, Inc., {% endcomment %} {% load bootstrap3 %} +{% load i18n %} -{% block title %}Machines{% endblock %} +{% block title %}{% trans "Machines" %}{% endblock %} {% block content %} -

Liste des alias de l'interface

- Ajouter un alias - Supprimer un ou plusieurs alias - {% include "machines/aff_alias.html" with alias_list=alias_list %} -
-
-
+

{% trans "List of the aliases of the interface" %}

+ {% trans " Add an alias" %} + {% trans " Delete one or several aliases" %} + {% include "machines/aff_alias.html" with alias_list=alias_list %} +
+
+
{% endblock %} diff --git a/machines/templates/machines/index_extension.html b/machines/templates/machines/index_extension.html index 29c5a0bd..6669d197 100644 --- a/machines/templates/machines/index_extension.html +++ b/machines/templates/machines/index_extension.html @@ -28,57 +28,60 @@ with this program; if not, write to the Free Software Foundation, Inc., {% load acl %} {% load i18n %} -{% block title %}Machines{% endblock %} +{% block title %}{% trans "Machines" %}{% endblock %} {% block content %} -

Liste des extensions

+

{% trans "List of extensions" %}

{% can_create Extension %} - Ajouter une extension + {% trans " Add an extension" %} {% acl_end %} - Supprimer une ou plusieurs extensions + {% trans " Delete one or several extensions" %} {% include "machines/aff_extension.html" with extension_list=extension_list %} -

Liste des enregistrements SOA

+

{% trans "List of SOA records" %}

{% can_create SOA %} - Ajouter un enregistrement SOA + {% trans " Add an SOA record" %} {% acl_end %} - Supprimer un enregistrement SOA + {% trans " Delete one or several SOA records" %} {% include "machines/aff_soa.html" with soa_list=soa_list %} -

Liste des enregistrements MX

+ +

{% trans "List of MX records" %}

{% can_create Mx %} - Ajouter un enregistrement MX + {% trans " Add an MX record" %} {% acl_end %} - Supprimer un enregistrement MX + {% trans " Delete one or several MX records" %} {% include "machines/aff_mx.html" with mx_list=mx_list %} -

Liste des enregistrements NS

+ +

{% trans "List of NS records" %}

{% can_create Ns %} - Ajouter un enregistrement NS + {% trans " Add an NS record" %} {% acl_end %} - Supprimer un enregistrement NS + {% trans " Delete one or several NS records" %} {% include "machines/aff_ns.html" with ns_list=ns_list %} -

Liste des enregistrements TXT

+ +

{% trans "List of TXT records" %}

{% can_create Txt %} - Ajouter un enregistrement TXT + {% trans " Add a TXT record" %} {% acl_end %} - Supprimer un enregistrement TXT + {% trans " Delete one or several TXT records" %} {% include "machines/aff_txt.html" with txt_list=txt_list %} -

DNAME records

+

{% trans "List of DNAME records" %}

{% can_create DName %} - {% trans "Add a DNAME record" %} + {% trans " Add a DNAME record" %} {% acl_end %} - {% trans "Delete DNAME records" %} + {% trans " Delete one or several DNAME records" %} {% include "machines/aff_dname.html" with dname_list=dname_list %} -

Liste des enregistrements SRV

+

{% trans "List of SRV records" %}

{% can_create Srv %} - Ajouter un enregistrement SRV + {% trans " Add an SRV record" %} {% acl_end %} - Supprimer un enregistrement SRV + {% trans " Delete one or several SRV records" %} {% include "machines/aff_srv.html" with srv_list=srv_list %}

diff --git a/machines/templates/machines/index_iptype.html b/machines/templates/machines/index_iptype.html index 4dacf96e..5be4561d 100644 --- a/machines/templates/machines/index_iptype.html +++ b/machines/templates/machines/index_iptype.html @@ -26,15 +26,16 @@ with this program; if not, write to the Free Software Foundation, Inc., {% load bootstrap3 %} {% load acl %} +{% load i18n %} -{% block title %}Ip{% endblock %} +{% block title %}{% trans "Machines" %}{% endblock %} {% block content %} -

Liste des types d'ip

+

{% trans "List of IP types" %}

{% can_create IpType %} - Ajouter un type d'ip + {% trans " Add an IP type" %} {% acl_end %} - Supprimer un ou plusieurs types d'ip + {% trans " Delete one or several IP types" %} {% include "machines/aff_iptype.html" with iptype_list=iptype_list %}

diff --git a/machines/templates/machines/index_ipv6.html b/machines/templates/machines/index_ipv6.html index 584dc00a..06e287e2 100644 --- a/machines/templates/machines/index_ipv6.html +++ b/machines/templates/machines/index_ipv6.html @@ -25,13 +25,14 @@ with this program; if not, write to the Free Software Foundation, Inc., {% load bootstrap3 %} {% load acl %} +{% load i18n %} -{% block title %}Machines{% endblock %} +{% block title %}{% trans "Machines" %}{% endblock %} {% block content %} -

Liste des ipv6 de l'interface

+

{% trans "List of the IPv6 addresses of the interface" %}

{% can_create Ipv6List interface_id %} - Ajouter une ipv6 + {% trans " Add an IPv6 address" %} {% acl_end %} {% include "machines/aff_ipv6.html" with ipv6_list=ipv6_list %}
diff --git a/machines/templates/machines/index_machinetype.html b/machines/templates/machines/index_machinetype.html index a0bfd7e5..de1e2f58 100644 --- a/machines/templates/machines/index_machinetype.html +++ b/machines/templates/machines/index_machinetype.html @@ -26,15 +26,16 @@ with this program; if not, write to the Free Software Foundation, Inc., {% load bootstrap3 %} {% load acl %} +{% load i18n %} -{% block title %}Machines{% endblock %} +{% block title %}{% trans "Machines" %}{% endblock %} {% block content %} -

Liste des types de machines

+

{% trans "List of machine types" %}

{% can_create MachineType %} - Ajouter un type de machine + {% trans " Add a machine type" %} {% acl_end %} - Supprimer un ou plusieurs types de machines + {% trans " Delete one or several machine types" %} {% include "machines/aff_machinetype.html" with machinetype_list=machinetype_list %}

diff --git a/machines/templates/machines/index_nas.html b/machines/templates/machines/index_nas.html index 3f1cb90f..88f68213 100644 --- a/machines/templates/machines/index_nas.html +++ b/machines/templates/machines/index_nas.html @@ -26,17 +26,17 @@ with this program; if not, write to the Free Software Foundation, Inc., {% load bootstrap3 %} {% load acl %} +{% load i18n %} -{% block title %}Machines{% endblock %} +{% block title %}{% trans "Machines" %}{% endblock %} {% block content %} -

Liste des nas

-
La correpondance nas-machinetype relie le type de nas à un type de machine. - Elle est utile pour l'autoenregistrement des macs par radius, et permet de choisir le type de machine à affecter aux machines en fonction du type de nas
+

{% trans "List of NAS devices" %}

+
{% trans "The NAS device type and machine type are linked. It is useful for MAC address auto capture by RADIUS, and allows to choose the machine type to assign to the machines according to the NAS device type." %}
{% can_create Nas %} - Ajouter un type de nas + {% trans " Add a NAS device type" %} {% acl_end %} - Supprimer un ou plusieurs types nas + {% trans " Delete one or several NAS device types" %} {% include "machines/aff_nas.html" with nas_list=nas_list %}

diff --git a/machines/templates/machines/index_portlist.html b/machines/templates/machines/index_portlist.html index e505ad43..0d3d0741 100644 --- a/machines/templates/machines/index_portlist.html +++ b/machines/templates/machines/index_portlist.html @@ -3,23 +3,24 @@ {% load bootstrap3 %} {% load acl %} +{% load i18n %} -{% block title %}Configuration de ports{% endblock %} +{% block title %}{% trans "Machines" %}{% endblock %} {% block content %} -

Liste des configurations de ports

+

{% trans "List of ports configurations" %}

{% can_create OuverturePortList %} - Ajouter une configuration + {% trans " Add a configuration" %} {% acl_end %} - - - - - - + + + + + + @@ -48,13 +49,13 @@ {% endif %} + {% can_delete pl %} + {% include 'buttons/suppr.html' with href='machines:del-portlist' id=pl.id %} + {% acl_end %} + {%endfor%}
NomTCP (entrée)TCP (sortie)UDP (entrée)UDP (sortie)Machines{% trans "Name" %}{% trans "TCP (input)" %}{% trans "TCP (output)" %}{% trans "UDP (input)" %}{% trans "UDP (output)" %}{% trans "Machines" %}
- {% can_delete pl %} - {% include 'buttons/suppr.html' with href='machines:del-portlist' id=pl.id %} - {% acl_end %} {% can_edit pl %} {% include 'buttons/edit.html' with href='machines:edit-portlist' id=pl.id %} {% acl_end %} -
@@ -63,3 +64,4 @@
{% endblock %} + diff --git a/machines/templates/machines/index_role.html b/machines/templates/machines/index_role.html index 86c36a09..ddc2ea8b 100644 --- a/machines/templates/machines/index_role.html +++ b/machines/templates/machines/index_role.html @@ -27,14 +27,14 @@ with this program; if not, write to the Free Software Foundation, Inc., {% load acl %} {% load i18n %} -{% block title %}Machines{% endblock %} +{% block title %}{% trans "Machines" %}{% endblock %} {% block content %} -

{% trans "Roles list" %}

+

{% trans "List of roles" %}

{% can_create Role %} - {% trans "Add role"%} + {% trans " Add a role"%} {% acl_end %} - {% trans "Delete one or several roles" %} + {% trans " Delete one or several roles" %} {% include "machines/aff_role.html" with role_list=role_list %}

diff --git a/machines/templates/machines/index_service.html b/machines/templates/machines/index_service.html index 3bc88189..9dec7032 100644 --- a/machines/templates/machines/index_service.html +++ b/machines/templates/machines/index_service.html @@ -25,17 +25,18 @@ with this program; if not, write to the Free Software Foundation, Inc., {% load bootstrap3 %} {% load acl %} +{% load i18n %} -{% block title %}Machines{% endblock %} +{% block title %}{% trans "Machines" %}{% endblock %} {% block content %} -

Liste des services

+

{% trans "List of services" %}

{% can_create machines.Service %} - Ajouter un service + {% trans " Add a service" %} {% acl_end %} - Supprimer un ou plusieurs service + {% trans " Delete one or several services" %} {% include "machines/aff_service.html" with service_list=service_list %} -

Etat des serveurs

+

{% trans "States of servers" %}

{% include "machines/aff_servers.html" with servers_list=servers_list %}

diff --git a/machines/templates/machines/index_sshfp.html b/machines/templates/machines/index_sshfp.html index 2c8d1581..ce16d621 100644 --- a/machines/templates/machines/index_sshfp.html +++ b/machines/templates/machines/index_sshfp.html @@ -23,16 +23,17 @@ with this program; if not, write to the Free Software Foundation, Inc., {% load bootstrap3 %} {% load acl %} +{% load i18n %} -{% block title %}Machines{% endblock %} +{% block title %}{% trans "Machines" %}{% endblock %} {% block content %} -

SSH fingerprints

-{% can_create SshFp machine_id %} - - Add an SSH fingerprint - -{% acl_end %} -{% include "machines/aff_sshfp.html" with sshfp_list=sshfp_list %} +

{% trans "SSH fingerprints" %}

+ {% can_create SshFp machine_id %} + + {% trans " Add an SSH fingerprint" %} + + {% acl_end %} + {% include "machines/aff_sshfp.html" with sshfp_list=sshfp_list %} {% endblock %} diff --git a/machines/templates/machines/index_vlan.html b/machines/templates/machines/index_vlan.html index beb6c80e..7af31fd5 100644 --- a/machines/templates/machines/index_vlan.html +++ b/machines/templates/machines/index_vlan.html @@ -26,15 +26,16 @@ with this program; if not, write to the Free Software Foundation, Inc., {% load bootstrap3 %} {% load acl %} +{% load i18n %} -{% block title %}Machines{% endblock %} +{% block title %}{% trans "Machines" %}{% endblock %} {% block content %} -

Liste des vlans

+

{% trans "List of VLANs" %}

{% can_create Vlan %} - Ajouter un vlan + {% trans " Add a VLAN" %} {% acl_end %} - Supprimer un ou plusieurs vlan + {% trans " Delete one or several VLANs" %} {% include "machines/aff_vlan.html" with vlan_list=vlan_list %}

diff --git a/machines/templates/machines/machine.html b/machines/templates/machines/machine.html index d6c0f522..432d11f8 100644 --- a/machines/templates/machines/machine.html +++ b/machines/templates/machines/machine.html @@ -26,8 +26,9 @@ with this program; if not, write to the Free Software Foundation, Inc., {% load bootstrap3 %} {% load massive_bootstrap_form %} +{% load i18n %} -{% block title %}Création et modification de machines{% endblock %} +{% block title %}{% trans "Machines" %}{% endblock %} {% block content %} {% if machineform %} @@ -88,11 +89,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% csrf_token %} {% if machineform %} -

Machine

+

{% trans "Machine" %}

{% massive_bootstrap_form machineform 'user' %} {% endif %} {% if interfaceform %} -

Interface

+

{% trans "Interface" %}

{% if i_mbf_param %} {% massive_bootstrap_form interfaceform 'ipv4,machine' mbf_param=i_mbf_param %} {% else %} @@ -100,55 +101,55 @@ with this program; if not, write to the Free Software Foundation, Inc., {% endif %} {% endif %} {% if domainform %} -

Domaine

+

{% trans "Domain" %}

{% bootstrap_form domainform %} {% endif %} {% if iptypeform %} -

Type d'IP

+

{% trans "IP type" %}

{% bootstrap_form iptypeform %} {% endif %} {% if machinetypeform %} -

Type de machine

+

{% trans "Machine type" %}

{% bootstrap_form machinetypeform %} {% endif %} {% if extensionform %} -

Extension

+

{% trans "Extension" %}

{% massive_bootstrap_form extensionform 'origin' %} {% endif %} {% if soaform %} -

Enregistrement SOA

+

{% trans "SOA record" %}

{% bootstrap_form soaform %} {% endif %} {% if mxform %} -

Enregistrement MX

+

{% trans "MX record" %}

{% massive_bootstrap_form mxform 'name' %} {% endif %} {% if nsform %} -

Enregistrement NS

+

{% trans "NS record" %}

{% massive_bootstrap_form nsform 'ns' %} {% endif %} {% if txtform %} -

Enregistrement TXT

+

{% trans "TXT record" %}

{% bootstrap_form txtform %} {% endif %} {% if dnameform %} -

DNAME record

+

{% trans "DNAME record" %}

{% bootstrap_form dnameform %} {% endif %} {% if srvform %} -

Enregistrement SRV

+

{% trans "SRV record" %}

{% massive_bootstrap_form srvform 'target' %} {% endif %} {% if sshfpform %} -

SSHFP record

+

{% trans "SSHFP record" %}

{% bootstrap_form sshfpform %} {% endif %} {% if aliasform %} -

Alias

+

{% trans "Alias" %}

{% bootstrap_form aliasform %} {% endif %} {% if serviceform %} -

Service

+

{% trans "Service" %}

{% massive_bootstrap_form serviceform 'servers' %} {% endif %} {% if roleform %} @@ -156,15 +157,15 @@ with this program; if not, write to the Free Software Foundation, Inc., {% massive_bootstrap_form roleform 'servers' %} {% endif %} {% if vlanform %} -

Vlan

+

{% trans "VLAN" %}

{% bootstrap_form vlanform %} {% endif %} {% if nasform %} -

NAS

+

{% trans "NAS device" %}

{% bootstrap_form nasform %} {% endif %} {% if ipv6form %} -

Ipv6

+

{% trans "IPv6 address" %}

{% bootstrap_form ipv6form %} {% endif %} {% bootstrap_button action_name button_type="submit" icon="star" %} @@ -173,3 +174,4 @@ with this program; if not, write to the Free Software Foundation, Inc.,

{% endblock %} + diff --git a/machines/templates/machines/sidebar.html b/machines/templates/machines/sidebar.html index 75badb6b..68e14ae0 100644 --- a/machines/templates/machines/sidebar.html +++ b/machines/templates/machines/sidebar.html @@ -30,43 +30,43 @@ with this program; if not, write to the Free Software Foundation, Inc., {% can_view_all Machine %} - Machines + {% trans "Machines" %} {% acl_end %} {% can_view_all MachineType %} - Types de machines + {% trans "Machine types" %} {% acl_end %} {% can_view_all Extension %} - Extensions et zones + {% trans "Extensions and zones" %} {% acl_end %} {% can_view_all IpType %} - Plages d'IP + {% trans "IP ranges" %} {% acl_end %} {% can_view_all Vlan %} - Vlans + {% trans "VLANs" %} {% acl_end %} {% can_view_all Nas %} - Gestion des nas + {% trans "NAS devices" %} {% acl_end %} {% can_view_all machines.Service %} - Services (dhcp, dns...) + {% trans "Services (DHCP, DNS, ...)" %} {% acl_end %} {% can_view_all Role %} @@ -78,7 +78,8 @@ with this program; if not, write to the Free Software Foundation, Inc., {% can_view_all OuverturePortList %} - Ouverture de ports + {% trans "Ports openings" %} {% acl_end %} {% endblock %} + diff --git a/machines/views.py b/machines/views.py index f7d138be..3d71acab 100644 --- a/machines/views.py +++ b/machines/views.py @@ -153,7 +153,7 @@ def generate_ipv4_choices(form_obj): """ f_ipv4 = form_obj.fields['ipv4'] used_mtype_id = [] - choices = '{"":[{key:"",value:"Choisissez d\'abord un type de machine"},' + choices = '{"":[{key:"",value:'+_("Select a machine type first.},") mtype_id = -1 for ip in (f_ipv4.queryset @@ -255,7 +255,7 @@ def new_machine(request, user, **_kwargs): new_interface_obj.save() new_domain.interface_parent = new_interface_obj new_domain.save() - messages.success(request, "La machine a été créée") + messages.success(request, _("The machine was created.")) return redirect(reverse( 'users:profil', kwargs={'userid': str(user.id)} @@ -267,7 +267,7 @@ def new_machine(request, user, **_kwargs): 'interfaceform': interface, 'domainform': domain, 'i_mbf_param': i_mbf_param, - 'action_name': 'Créer une machine' + 'action_name': _("Create a machine") }, 'machines/machine.html', request @@ -307,7 +307,7 @@ def edit_interface(request, interface_instance, **_kwargs): new_interface_obj.save() if domain_form.changed_data: new_domain_obj.save() - messages.success(request, "La machine a été modifiée") + messages.success(request, _("The machine was edited.")) return redirect(reverse( 'users:profil', kwargs={'userid': str(interface_instance.machine.user.id)} @@ -319,7 +319,7 @@ def edit_interface(request, interface_instance, **_kwargs): 'interfaceform': interface_form, 'domainform': domain_form, 'i_mbf_param': i_mbf_param, - 'action_name': 'Editer une interface' + 'action_name': _("Edit") }, 'machines/machine.html', request @@ -332,7 +332,7 @@ def del_machine(request, machine, **_kwargs): """ Supprime une machine, interfaces en mode cascade""" if request.method == "POST": machine.delete() - messages.success(request, "La machine a été détruite") + messages.success(request, _("The machine was deleted.")) return redirect(reverse( 'users:profil', kwargs={'userid': str(machine.user.id)} @@ -361,7 +361,7 @@ def new_interface(request, machine, **_kwargs): new_interface_obj.save() new_domain_obj.interface_parent = new_interface_obj new_domain_obj.save() - messages.success(request, "L'interface a été ajoutée") + messages.success(request, _("The interface was created.")) return redirect(reverse( 'users:profil', kwargs={'userid': str(machine.user.id)} @@ -372,7 +372,7 @@ def new_interface(request, machine, **_kwargs): 'interfaceform': interface_form, 'domainform': domain_form, 'i_mbf_param': i_mbf_param, - 'action_name': 'Créer une interface' + 'action_name': _("Create an interface") }, 'machines/machine.html', request @@ -388,7 +388,7 @@ def del_interface(request, interface, **_kwargs): interface.delete() if not machine.interface_set.all(): machine.delete() - messages.success(request, "L'interface a été détruite") + messages.success(request, _("The interface was deleted.")) return redirect(reverse( 'users:profil', kwargs={'userid': str(request.user.id)} @@ -413,13 +413,13 @@ def new_ipv6list(request, interface, **_kwargs): ) if ipv6.is_valid(): ipv6.save() - messages.success(request, "Ipv6 ajoutée") + messages.success(request, _("The IPv6 addresses list was created.")) return redirect(reverse( 'machines:index-ipv6', kwargs={'interfaceid': str(interface.id)} )) return form( - {'ipv6form': ipv6, 'action_name': 'Créer'}, + {'ipv6form': ipv6, 'action_name': _("Create an IPv6 addresses list")}, 'machines/machine.html', request ) @@ -437,13 +437,13 @@ def edit_ipv6list(request, ipv6list_instance, **_kwargs): if ipv6.is_valid(): if ipv6.changed_data: ipv6.save() - messages.success(request, "Ipv6 modifiée") + messages.success(request, _("The IPv6 addresses list was edited.")) return redirect(reverse( 'machines:index-ipv6', kwargs={'interfaceid': str(ipv6list_instance.interface.id)} )) return form( - {'ipv6form': ipv6, 'action_name': 'Editer'}, + {'ipv6form': ipv6, 'action_name': _("Edit")}, 'machines/machine.html', request ) @@ -456,7 +456,7 @@ def del_ipv6list(request, ipv6list, **_kwargs): if request.method == "POST": interfaceid = ipv6list.interface.id ipv6list.delete() - messages.success(request, "L'ipv6 a été détruite") + messages.success(request, _("The IPv6 addresses list was deleted.")) return redirect(reverse( 'machines:index-ipv6', kwargs={'interfaceid': str(interfaceid)} @@ -480,13 +480,13 @@ def new_sshfp(request, machine, **_kwargs): ) if sshfp.is_valid(): sshfp.save() - messages.success(request, "The SSHFP record was added") + messages.success(request, _("The SSHFP record was created.")) return redirect(reverse( 'machines:index-sshfp', kwargs={'machineid': str(machine.id)} )) return form( - {'sshfpform': sshfp, 'action_name': 'Create'}, + {'sshfpform': sshfp, 'action_name': _("Create a SSHFP record")}, 'machines/machine.html', request ) @@ -503,13 +503,13 @@ def edit_sshfp(request, sshfp_instance, **_kwargs): if sshfp.is_valid(): if sshfp.changed_data: sshfp.save() - messages.success(request, "The SSHFP record was edited") + messages.success(request, _("The SSHFP record was edited.")) return redirect(reverse( 'machines:index-sshfp', kwargs={'machineid': str(sshfp_instance.machine.id)} )) return form( - {'sshfpform': sshfp, 'action_name': 'Edit'}, + {'sshfpform': sshfp, 'action_name': _("Edit")}, 'machines/machine.html', request ) @@ -522,7 +522,7 @@ def del_sshfp(request, sshfp, **_kwargs): if request.method == "POST": machineid = sshfp.machine.id sshfp.delete() - messages.success(request, "The SSHFP record was deleted") + messages.success(request, _("The SSHFP record was deleted.")) return redirect(reverse( 'machines:index-sshfp', kwargs={'machineid': str(machineid)} @@ -543,10 +543,10 @@ def add_iptype(request): iptype = IpTypeForm(request.POST or None) if iptype.is_valid(): iptype.save() - messages.success(request, "Ce type d'ip a été ajouté") + messages.success(request, _("The IP type was created.")) return redirect(reverse('machines:index-iptype')) return form( - {'iptypeform': iptype, 'action_name': 'Créer'}, + {'iptypeform': iptype, 'action_name': _("Create an IP type")}, 'machines/machine.html', request ) @@ -562,10 +562,10 @@ def edit_iptype(request, iptype_instance, **_kwargs): if iptype.is_valid(): if iptype.changed_data: iptype.save() - messages.success(request, "Type d'ip modifié") + messages.success(request, _("The IP type was edited.")) return redirect(reverse('machines:index-iptype')) return form( - {'iptypeform': iptype, 'action_name': 'Editer'}, + {'iptypeform': iptype, 'action_name': _("Edit")}, 'machines/machine.html', request ) @@ -581,16 +581,16 @@ def del_iptype(request, instances): for iptype_del in iptype_dels: try: iptype_del.delete() - messages.success(request, "Le type d'ip a été supprimé") + messages.success(request, _("The IP type was deleted.")) except ProtectedError: messages.error( request, - ("Le type d'ip %s est affectée à au moins une machine, " - "vous ne pouvez pas le supprimer" % iptype_del) + (_("The IP type %s is assigned to at least one machine," + " you can't delete it.") % iptype_del) ) return redirect(reverse('machines:index-iptype')) return form( - {'iptypeform': iptype, 'action_name': 'Supprimer'}, + {'iptypeform': iptype, 'action_name': _("Delete")}, 'machines/machine.html', request ) @@ -603,10 +603,11 @@ def add_machinetype(request): machinetype = MachineTypeForm(request.POST or None) if machinetype.is_valid(): machinetype.save() - messages.success(request, "Ce type de machine a été ajouté") + messages.success(request, _("The machine type was created.")) return redirect(reverse('machines:index-machinetype')) return form( - {'machinetypeform': machinetype, 'action_name': 'Créer'}, + {'machinetypeform': machinetype, 'action_name': _("Create a machine" + " type")}, 'machines/machine.html', request ) @@ -623,10 +624,10 @@ def edit_machinetype(request, machinetype_instance, **_kwargs): if machinetype.is_valid(): if machinetype.changed_data: machinetype.save() - messages.success(request, "Type de machine modifié") + messages.success(request, _("The machine type was edited.")) return redirect(reverse('machines:index-machinetype')) return form( - {'machinetypeform': machinetype, 'action_name': 'Editer'}, + {'machinetypeform': machinetype, 'action_name': _("Edit")}, 'machines/machine.html', request ) @@ -642,17 +643,16 @@ def del_machinetype(request, instances): for machinetype_del in machinetype_dels: try: machinetype_del.delete() - messages.success(request, "Le type de machine a été supprimé") + messages.success(request, _("The machine type was deleted.")) except ProtectedError: messages.error( request, - ("Le type de machine %s est affectée à au moins une " - "machine, vous ne pouvez pas le supprimer" - % machinetype_del) + (_("The machine type %s is assigned to at least one" + " machine, you can't delete it.") % machinetype_del) ) return redirect(reverse('machines:index-machinetype')) return form( - {'machinetypeform': machinetype, 'action_name': 'Supprimer'}, + {'machinetypeform': machinetype, 'action_name': _("Delete")}, 'machines/machine.html', request ) @@ -665,10 +665,10 @@ def add_extension(request): extension = ExtensionForm(request.POST or None) if extension.is_valid(): extension.save() - messages.success(request, "Cette extension a été ajoutée") + messages.success(request, _("The extension was created.")) return redirect(reverse('machines:index-extension')) return form( - {'extensionform': extension, 'action_name': 'Créer'}, + {'extensionform': extension, 'action_name': _("Create an extension")}, 'machines/machine.html', request ) @@ -685,10 +685,10 @@ def edit_extension(request, extension_instance, **_kwargs): if extension.is_valid(): if extension.changed_data: extension.save() - messages.success(request, "Extension modifiée") + messages.success(request, _("The extension was edited.")) return redirect(reverse('machines:index-extension')) return form( - {'extensionform': extension, 'action_name': 'Editer'}, + {'extensionform': extension, 'action_name': _("Edit")}, 'machines/machine.html', request ) @@ -704,17 +704,16 @@ def del_extension(request, instances): for extension_del in extension_dels: try: extension_del.delete() - messages.success(request, "L'extension a été supprimée") + messages.success(request, _("The extension was deleted.")) except ProtectedError: messages.error( request, - ("L'extension %s est affectée à au moins un type de " - "machine, vous ne pouvez pas la supprimer" - % extension_del) + (_("The extension %s is assigned to at least one machine" + " type, you can't delete it." % extension_del)) ) return redirect(reverse('machines:index-extension')) return form( - {'extensionform': extension, 'action_name': 'Supprimer'}, + {'extensionform': extension, 'action_name': _("Delete")}, 'machines/machine.html', request ) @@ -727,10 +726,10 @@ def add_soa(request): soa = SOAForm(request.POST or None) if soa.is_valid(): soa.save() - messages.success(request, "Cet enregistrement SOA a été ajouté") + messages.success(request, _("The SOA record was created.")) return redirect(reverse('machines:index-extension')) return form( - {'soaform': soa, 'action_name': 'Créer'}, + {'soaform': soa, 'action_name': _("Create an SOA record")}, 'machines/machine.html', request ) @@ -744,10 +743,10 @@ def edit_soa(request, soa_instance, **_kwargs): if soa.is_valid(): if soa.changed_data: soa.save() - messages.success(request, "SOA modifié") + messages.success(request, _("The SOA record was edited.")) return redirect(reverse('machines:index-extension')) return form( - {'soaform': soa, 'action_name': 'Editer'}, + {'soaform': soa, 'action_name': _("Edit")}, 'machines/machine.html', request ) @@ -763,16 +762,15 @@ def del_soa(request, instances): for soa_del in soa_dels: try: soa_del.delete() - messages.success(request, "Le SOA a été supprimée") + messages.success(request, _("The SOA record was deleted.")) except ProtectedError: messages.error( request, - ("Erreur le SOA suivant %s ne peut être supprimé" - % soa_del) + (_("Error: the SOA record %s can't be deleted.") % soa_del) ) return redirect(reverse('machines:index-extension')) return form( - {'soaform': soa, 'action_name': 'Supprimer'}, + {'soaform': soa, 'action_name': _("Delete")}, 'machines/machine.html', request ) @@ -785,10 +783,10 @@ def add_mx(request): mx = MxForm(request.POST or None) if mx.is_valid(): mx.save() - messages.success(request, "Cet enregistrement mx a été ajouté") + messages.success(request, _("The MX record was created.")) return redirect(reverse('machines:index-extension')) return form( - {'mxform': mx, 'action_name': 'Créer'}, + {'mxform': mx, 'action_name': _("Create an MX record")}, 'machines/machine.html', request ) @@ -802,10 +800,10 @@ def edit_mx(request, mx_instance, **_kwargs): if mx.is_valid(): if mx.changed_data: mx.save() - messages.success(request, "Mx modifié") + messages.success(request, _("The MX record was edited.")) return redirect(reverse('machines:index-extension')) return form( - {'mxform': mx, 'action_name': 'Editer'}, + {'mxform': mx, 'action_name': _("Edit")}, 'machines/machine.html', request ) @@ -821,16 +819,15 @@ def del_mx(request, instances): for mx_del in mx_dels: try: mx_del.delete() - messages.success(request, "L'mx a été supprimée") + messages.success(request, _("The MX record was deleted.")) except ProtectedError: messages.error( request, - ("Erreur le Mx suivant %s ne peut être supprimé" - % mx_del) + (_("Error: the MX record %s can't be deleted.") % mx_del) ) return redirect(reverse('machines:index-extension')) return form( - {'mxform': mx, 'action_name': 'Supprimer'}, + {'mxform': mx, 'action_name': _("Delete")}, 'machines/machine.html', request ) @@ -843,10 +840,10 @@ def add_ns(request): ns = NsForm(request.POST or None) if ns.is_valid(): ns.save() - messages.success(request, "Cet enregistrement ns a été ajouté") + messages.success(request, _("The NS record was created.")) return redirect(reverse('machines:index-extension')) return form( - {'nsform': ns, 'action_name': 'Créer'}, + {'nsform': ns, 'action_name': _("Create an NS record")}, 'machines/machine.html', request ) @@ -860,10 +857,10 @@ def edit_ns(request, ns_instance, **_kwargs): if ns.is_valid(): if ns.changed_data: ns.save() - messages.success(request, "Ns modifié") + messages.success(request, _("The NS record was edited.")) return redirect(reverse('machines:index-extension')) return form( - {'nsform': ns, 'action_name': 'Editer'}, + {'nsform': ns, 'action_name': _("Edit")}, 'machines/machine.html', request ) @@ -879,16 +876,15 @@ def del_ns(request, instances): for ns_del in ns_dels: try: ns_del.delete() - messages.success(request, "Le ns a été supprimée") + messages.success(request, _("The NS record was deleted.")) except ProtectedError: messages.error( request, - ("Erreur le Ns suivant %s ne peut être supprimé" - % ns_del) + (_("Error: the NS record %s can't be deleted.") % ns_del) ) return redirect(reverse('machines:index-extension')) return form( - {'nsform': ns, 'action_name': 'Supprimer'}, + {'nsform': ns, 'action_name': _("Delete")}, 'machines/machine.html', request ) @@ -900,10 +896,10 @@ def add_dname(request): dname = DNameForm(request.POST or None) if dname.is_valid(): dname.save() - messages.success(request, "This DNAME record has been added") + messages.success(request, _("The DNAME record was created.")) return redirect(reverse('machines:index-extension')) return form( - {'dnameform': dname, 'action_name': "Create"}, + {'dnameform': dname, 'action_name': _("Create a DNAME record")}, 'machines/machine.html', request ) @@ -917,10 +913,10 @@ def edit_dname(request, dname_instance, **_kwargs): if dname.is_valid(): if dname.changed_data: dname.save() - messages.success(request, "DName successfully edited") + messages.success(request, _("The DNAME record was edited.")) return redirect(reverse('machines:index-extension')) return form( - {'dnameform': dname, 'action_name': "Edit"}, + {'dnameform': dname, 'action_name': _("Edit")}, 'machines/machine.html', request ) @@ -936,16 +932,16 @@ def del_dname(request, instances): for dname_del in dname_dels: try: dname_del.delete() - messages.success(request, - "The DNAME %s has been deleted" % dname_del) + messages.success(request, _("The DNAME record was deleted.")) except ProtectedError: messages.error( - request, - "The DNAME %s can not be deleted" % dname_del + request, + _("Error: the DNAME record %s can't be deleted.") + % dname_del ) return redirect(reverse('machines:index-extension')) return form( - {'dnameform': dname, 'action_name': 'Delete'}, + {'dnameform': dname, 'action_name': _("Delete")}, 'machines/machine.html', request ) @@ -958,10 +954,10 @@ def add_txt(request): txt = TxtForm(request.POST or None) if txt.is_valid(): txt.save() - messages.success(request, "Cet enregistrement text a été ajouté") + messages.success(request, _("The TXT record was created.")) return redirect(reverse('machines:index-extension')) return form( - {'txtform': txt, 'action_name': 'Créer'}, + {'txtform': txt, 'action_name': _("Create a TXT record")}, 'machines/machine.html', request ) @@ -975,10 +971,10 @@ def edit_txt(request, txt_instance, **_kwargs): if txt.is_valid(): if txt.changed_data: txt.save() - messages.success(request, "Txt modifié") + messages.success(request, _("The TXT record was edited.")) return redirect(reverse('machines:index-extension')) return form( - {'txtform': txt, 'action_name': 'Editer'}, + {'txtform': txt, 'action_name': _("Edit")}, 'machines/machine.html', request ) @@ -994,16 +990,15 @@ def del_txt(request, instances): for txt_del in txt_dels: try: txt_del.delete() - messages.success(request, "Le txt a été supprimé") + messages.success(request, _("The TXT record was deleted.")) except ProtectedError: messages.error( request, - ("Erreur le Txt suivant %s ne peut être supprimé" - % txt_del) + (_("Error: the TXT record %s can't be deleted.") % txt_del) ) return redirect(reverse('machines:index-extension')) return form( - {'txtform': txt, 'action_name': 'Supprimer'}, + {'txtform': txt, 'action_name': _("Delete")}, 'machines/machine.html', request ) @@ -1016,10 +1011,10 @@ def add_srv(request): srv = SrvForm(request.POST or None) if srv.is_valid(): srv.save() - messages.success(request, "Cet enregistrement srv a été ajouté") + messages.success(request, _("The SRV record was created.")) return redirect(reverse('machines:index-extension')) return form( - {'srvform': srv, 'action_name': 'Créer'}, + {'srvform': srv, 'action_name': _("Create an SRV record")}, 'machines/machine.html', request ) @@ -1033,10 +1028,10 @@ def edit_srv(request, srv_instance, **_kwargs): if srv.is_valid(): if srv.changed_data: srv.save() - messages.success(request, "Srv modifié") - return redirect(reverse('machines:index-extension')) + messages.success(request, _("The SRV record was edited.")) + return redirect(reverse('machines:1index-extension')) return form( - {'srvform': srv, 'action_name': 'Editer'}, + {'srvform': srv, 'action_name': _("Edit")}, 'machines/machine.html', request ) @@ -1052,16 +1047,15 @@ def del_srv(request, instances): for srv_del in srv_dels: try: srv_del.delete() - messages.success(request, "L'srv a été supprimée") + messages.success(request, _("The SRV record was deleted.")) except ProtectedError: messages.error( request, - ("Erreur le Srv suivant %s ne peut être supprimé" - % srv_del) + (_("Error: the SRV record %s can't be deleted.") % srv_del) ) return redirect(reverse('machines:index-extension')) return form( - {'srvform': srv, 'action_name': 'Supprimer'}, + {'srvform': srv, 'action_name': _("Delete")}, 'machines/machine.html', request ) @@ -1077,13 +1071,13 @@ def add_alias(request, interface, interfaceid): alias = alias.save(commit=False) alias.cname = interface.domain alias.save() - messages.success(request, "Cet alias a été ajouté") + messages.success(request, _("The alias was created.")) return redirect(reverse( 'machines:index-alias', kwargs={'interfaceid': str(interfaceid)} )) return form( - {'aliasform': alias, 'action_name': 'Créer'}, + {'aliasform': alias, 'action_name': _("Create an alias")}, 'machines/machine.html', request ) @@ -1101,7 +1095,7 @@ def edit_alias(request, domain_instance, **_kwargs): if alias.is_valid(): if alias.changed_data: domain_instance = alias.save() - messages.success(request, "Alias modifié") + messages.success(request, _("The alias was edited.")) return redirect(reverse( 'machines:index-alias', kwargs={ @@ -1109,7 +1103,7 @@ def edit_alias(request, domain_instance, **_kwargs): } )) return form( - {'aliasform': alias, 'action_name': 'Editer'}, + {'aliasform': alias, 'action_name': _("Edit")}, 'machines/machine.html', request ) @@ -1127,20 +1121,19 @@ def del_alias(request, interface, interfaceid): alias_del.delete() messages.success( request, - "L'alias %s a été supprimé" % alias_del + _("The alias %s was deleted.") % alias_del ) except ProtectedError: messages.error( request, - ("Erreur l'alias suivant %s ne peut être supprimé" - % alias_del) + (_("Error: the alias %s can't be deleted.") % alias_del) ) return redirect(reverse( 'machines:index-alias', kwargs={'interfaceid': str(interfaceid)} )) return form( - {'aliasform': alias, 'action_name': 'Supprimer'}, + {'aliasform': alias, 'action_name': _("Delete")}, 'machines/machine.html', request ) @@ -1153,10 +1146,10 @@ def add_role(request): role = RoleForm(request.POST or None) if role.is_valid(): role.save() - messages.success(request, "Cet enregistrement role a été ajouté") + messages.success(request, _("The role was created.")) return redirect(reverse('machines:index-role')) return form( - {'roleform': role, 'action_name': 'Créer'}, + {'roleform': role, 'action_name': _("Create a role")}, 'machines/machine.html', request ) @@ -1170,10 +1163,10 @@ def edit_role(request, role_instance, **_kwargs): if role.is_valid(): if role.changed_data: role.save() - messages.success(request, _("Role updated")) + messages.success(request, _("The role was edited.")) return redirect(reverse('machines:index-role')) return form( - {'roleform': role, 'action_name': _('Edit')}, + {'roleform': role, 'action_name': _("Edit")}, 'machines/machine.html', request ) @@ -1189,17 +1182,15 @@ def del_role(request, instances): for role_del in role_dels: try: role_del.delete() - messages.success(request, _("The role has been deleted.")) + messages.success(request, _("The role was deleted.")) except ProtectedError: messages.error( request, - (_("Error: The following role cannot be deleted: %(role)") - % {'role': role_del} - ) + (_("Error: the role %s can't be deleted.") % role_del) ) return redirect(reverse('machines:index-role')) return form( - {'roleform': role, 'action_name': _('Delete')}, + {'roleform': role, 'action_name': _("Delete")}, 'machines/machine.html', request ) @@ -1212,10 +1203,10 @@ def add_service(request): service = ServiceForm(request.POST or None) if service.is_valid(): service.save() - messages.success(request, "Cet enregistrement service a été ajouté") + messages.success(request, _("The service was created.")) return redirect(reverse('machines:index-service')) return form( - {'serviceform': service, 'action_name': 'Créer'}, + {'serviceform': service, 'action_name': _("Create a service")}, 'machines/machine.html', request ) @@ -1229,10 +1220,10 @@ def edit_service(request, service_instance, **_kwargs): if service.is_valid(): if service.changed_data: service.save() - messages.success(request, "Service modifié") + messages.success(request, _("The service was edited.")) return redirect(reverse('machines:index-service')) return form( - {'serviceform': service, 'action_name': 'Editer'}, + {'serviceform': service, 'action_name': _("Edit")}, 'machines/machine.html', request ) @@ -1248,16 +1239,15 @@ def del_service(request, instances): for service_del in service_dels: try: service_del.delete() - messages.success(request, "Le service a été supprimée") + messages.success(request, _("The service was deleted.")) except ProtectedError: messages.error( request, - ("Erreur le service suivant %s ne peut être supprimé" - % service_del) + (_("Error: the service %s can't be deleted.") % service_del) ) return redirect(reverse('machines:index-service')) return form( - {'serviceform': service, 'action_name': 'Supprimer'}, + {'serviceform': service, 'action_name': _("Delete")}, 'machines/machine.html', request ) @@ -1279,10 +1269,10 @@ def add_vlan(request): vlan = VlanForm(request.POST or None) if vlan.is_valid(): vlan.save() - messages.success(request, "Cet enregistrement vlan a été ajouté") + messages.success(request, _("The VLAN was created.")) return redirect(reverse('machines:index-vlan')) return form( - {'vlanform': vlan, 'action_name': 'Créer'}, + {'vlanform': vlan, 'action_name': _("Create a VLAN")}, 'machines/machine.html', request ) @@ -1296,10 +1286,10 @@ def edit_vlan(request, vlan_instance, **_kwargs): if vlan.is_valid(): if vlan.changed_data: vlan.save() - messages.success(request, "Vlan modifié") + messages.success(request, _("The VLAN was edited.")) return redirect(reverse('machines:index-vlan')) return form( - {'vlanform': vlan, 'action_name': 'Editer'}, + {'vlanform': vlan, 'action_name': _("Edit")}, 'machines/machine.html', request ) @@ -1315,16 +1305,15 @@ def del_vlan(request, instances): for vlan_del in vlan_dels: try: vlan_del.delete() - messages.success(request, "Le vlan a été supprimée") + messages.success(request, _("The VLAN was deleted.")) except ProtectedError: messages.error( request, - ("Erreur le Vlan suivant %s ne peut être supprimé" - % vlan_del) + (_("Error: the VLAN %s can't be deleted.") % vlan_del) ) return redirect(reverse('machines:index-vlan')) return form( - {'vlanform': vlan, 'action_name': 'Supprimer'}, + {'vlanform': vlan, 'action_name': _("Delete")}, 'machines/machine.html', request ) @@ -1337,10 +1326,10 @@ def add_nas(request): nas = NasForm(request.POST or None) if nas.is_valid(): nas.save() - messages.success(request, "Cet enregistrement nas a été ajouté") + messages.success(request, _("The NAS device was created.")) return redirect(reverse('machines:index-nas')) return form( - {'nasform': nas, 'action_name': 'Créer'}, + {'nasform': nas, 'action_name': _("Create a NAS device")}, 'machines/machine.html', request ) @@ -1354,10 +1343,10 @@ def edit_nas(request, nas_instance, **_kwargs): if nas.is_valid(): if nas.changed_data: nas.save() - messages.success(request, "Nas modifié") + messages.success(request, _("The NAS device was edited.")) return redirect(reverse('machines:index-nas')) return form( - {'nasform': nas, 'action_name': 'Editer'}, + {'nasform': nas, 'action_name': _("Edit")}, 'machines/machine.html', request ) @@ -1373,16 +1362,15 @@ def del_nas(request, instances): for nas_del in nas_dels: try: nas_del.delete() - messages.success(request, "Le nas a été supprimé") + messages.success(request, _("The NAS device was deleted.")) except ProtectedError: messages.error( request, - ("Erreur le Nas suivant %s ne peut être supprimé" - % nas_del) + (_("Error: the NAS device %s can't be deleted.") % nas_del) ) return redirect(reverse('machines:index-nas')) return form( - {'nasform': nas, 'action_name': 'Supprimer'}, + {'nasform': nas, 'action_name': _("Delete")}, 'machines/machine.html', request ) @@ -1634,7 +1622,7 @@ def edit_portlist(request, ouvertureportlist_instance, **_kwargs): for port in instances: port.port_list = pl port.save() - messages.success(request, "Liste de ports modifiée") + messages.success(request, _("The ports list was edited.")) return redirect(reverse('machines:index-portlist')) return form( {'port_list': port_list, 'ports': port_formset}, @@ -1648,7 +1636,7 @@ def edit_portlist(request, ouvertureportlist_instance, **_kwargs): def del_portlist(request, port_list_instance, **_kwargs): """ View used to delete a port policy """ port_list_instance.delete() - messages.success(request, "La liste de ports a été supprimée") + messages.success(request, _("The ports list was deleted.")) return redirect(reverse('machines:index-portlist')) @@ -1673,7 +1661,7 @@ def add_portlist(request): for port in instances: port.port_list = pl port.save() - messages.success(request, "Liste de ports créée") + messages.success(request, _("The ports list was created.")) return redirect(reverse('machines:index-portlist')) return form( {'port_list': port_list, 'ports': port_formset}, @@ -1691,8 +1679,8 @@ def configure_ports(request, interface_instance, **_kwargs): if not interface_instance.may_have_port_open(): messages.error( request, - ("Attention, l'ipv4 n'est pas publique, l'ouverture n'aura pas " - "d'effet en v4") + (_("Warning: the IPv4 isn't public, the opening won't have effect" + " in v4.")) ) interface = EditOuverturePortConfigForm( request.POST or None, @@ -1701,10 +1689,11 @@ def configure_ports(request, interface_instance, **_kwargs): if interface.is_valid(): if interface.changed_data: interface.save() - messages.success(request, "Configuration des ports mise à jour.") + messages.success(request, _("The ports configuration was edited.")) return redirect(reverse('machines:index')) return form( - {'interfaceform': interface, 'action_name': 'Editer la configuration'}, + {'interfaceform': interface, 'action_name': _("Edit the" + " configuration")}, 'machines/machine.html', request ) @@ -1950,3 +1939,4 @@ def regen_achieved(request): if obj: obj.first().done_regen() return HttpResponse("Ok") + diff --git a/preferences/acl.py b/preferences/acl.py index 1f3f666e..d4b22cfe 100644 --- a/preferences/acl.py +++ b/preferences/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('preferences') - 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/preferences/forms.py b/preferences/forms.py index 02463103..7da8b545 100644 --- a/preferences/forms.py +++ b/preferences/forms.py @@ -27,7 +27,7 @@ from __future__ import unicode_literals from django.forms import ModelForm, Form from django import forms - +from django.utils.translation import ugettext_lazy as _ from re2o.mixins import FormRevMixin from .models import ( OptionalUser, @@ -56,9 +56,13 @@ class EditOptionalUserForm(ModelForm): **kwargs ) self.fields['is_tel_mandatory'].label = ( - 'Exiger un numéro de téléphone' + _("Telephone number required") ) - self.fields['self_adhesion'].label = 'Auto inscription' + self.fields['gpg_fingerprint'].label = _("GPG fingerprint") + self.fields['all_can_create_club'].label = _("All can create a club") + self.fields['all_can_create_adherent'].label = _("All can create a member") + self.fields['self_adhesion'].label = _("Self registration") + self.fields['shell_default'].label = _("Default shell") class EditOptionalMachineForm(ModelForm): @@ -74,12 +78,17 @@ class EditOptionalMachineForm(ModelForm): prefix=prefix, **kwargs ) - self.fields['password_machine'].label = "Possibilité d'attribuer\ - un mot de passe par interface" - self.fields['max_lambdauser_interfaces'].label = "Maximum\ - d'interfaces autorisées pour un user normal" - self.fields['max_lambdauser_aliases'].label = "Maximum d'alias\ - dns autorisés pour un user normal" + self.fields['password_machine'].label = _("Possibility to set a" + " password per machine") + self.fields['max_lambdauser_interfaces'].label = _("Maximum number of" + " interfaces" + " allowed for a" + " standard user") + self.fields['max_lambdauser_aliases'].label = _("Maximum number of DNS" + " aliases allowed for" + " a standard user") + self.fields['ipv6_mode'].label = _("IPv6 mode") + self.fields['create_machine'].label = _("Can create a machine") class EditOptionalTopologieForm(ModelForm): @@ -95,10 +104,11 @@ class EditOptionalTopologieForm(ModelForm): prefix=prefix, **kwargs ) - self.fields['vlan_decision_ok'].label = "Vlan où placer les\ - machines après acceptation RADIUS" - self.fields['vlan_decision_nok'].label = "Vlan où placer les\ - machines après rejet RADIUS" + self.fields['radius_general_policy'].label = _("RADIUS general policy") + self.fields['vlan_decision_ok'].label = _("VLAN for machines accepted" + " by RADIUS") + self.fields['vlan_decision_nok'].label = _("VLAN for machines rejected" + " by RADIUS") class EditGeneralOptionForm(ModelForm): @@ -114,18 +124,25 @@ class EditGeneralOptionForm(ModelForm): prefix=prefix, **kwargs ) - self.fields['search_display_page'].label = 'Resultats\ - affichés dans une recherche' - self.fields['pagination_number'].label = 'Items par page,\ - taille normale (ex users)' - self.fields['pagination_large_number'].label = 'Items par page,\ - taille élevée (machines)' - self.fields['req_expire_hrs'].label = 'Temps avant expiration du lien\ - de reinitialisation de mot de passe (en heures)' - self.fields['site_name'].label = 'Nom du site web' - self.fields['email_from'].label = "Adresse mail d\ - 'expedition automatique" - self.fields['GTU_sum_up'].label = "Résumé des CGU" + self.fields['general_message'].label = _("General message") + self.fields['search_display_page'].label = _("Number of results" + " displayed when" + " searching") + self.fields['pagination_number'].label = _("Number of items per page," + " standard size (e.g." + " users)") + self.fields['pagination_large_number'].label = _("Number of items per" + " page, large size" + " (e.g. machines)") + self.fields['req_expire_hrs'].label = _("Time before expiration of the" + " reset password link (in" + " hours)") + self.fields['site_name'].label = _("Website name") + self.fields['email_from'].label = _("Email address for automatic" + " emailing") + self.fields['GTU_sum_up'].label = _("Summary of the General Terms of" + " Use") + self.fields['GTU'].label = _("General Terms of Use") class EditAssoOptionForm(ModelForm): @@ -141,15 +158,19 @@ class EditAssoOptionForm(ModelForm): prefix=prefix, **kwargs ) - self.fields['name'].label = 'Nom de l\'asso' - self.fields['siret'].label = 'SIRET' - self.fields['adresse1'].label = 'Adresse (ligne 1)' - self.fields['adresse2'].label = 'Adresse (ligne 2)' - self.fields['contact'].label = 'Email de contact' - self.fields['telephone'].label = 'Numéro de téléphone' - self.fields['pseudo'].label = 'Pseudo d\'usage' - self.fields['utilisateur_asso'].label = 'Compte utilisé pour\ - faire les modifications depuis /admin' + self.fields['name'].label = _("Organisation name") + self.fields['siret'].label = _("SIRET number") + self.fields['adresse1'].label = _("Address (line 1)") + self.fields['adresse2'].label = _("Address (line 2)") + self.fields['contact'].label = _("Contact email address") + self.fields['telephone'].label = _("Telephone number") + self.fields['pseudo'].label = _("Usual name") + self.fields['utilisateur_asso'].label = _("Account used for editing" + " from /admin") + self.fields['payment'].label = _("Payment") + self.fields['payment_id'].label = _("Payment ID") + self.fields['payment_pass'].label = _("Payment password") + self.fields['description'].label = _("Description") class EditMailMessageOptionForm(ModelForm): @@ -165,10 +186,10 @@ class EditMailMessageOptionForm(ModelForm): prefix=prefix, **kwargs ) - self.fields['welcome_mail_fr'].label = 'Message dans le\ - mail de bienvenue en français' - self.fields['welcome_mail_en'].label = 'Message dans le\ - mail de bienvenue en anglais' + self.fields['welcome_mail_fr'].label = _("Message for the French" + " welcome email") + self.fields['welcome_mail_en'].label = _("Message for the English" + " welcome email") class EditHomeOptionForm(ModelForm): @@ -184,6 +205,9 @@ class EditHomeOptionForm(ModelForm): prefix=prefix, **kwargs ) + self.fields['facebook_url'].label = _("Facebook URL") + self.fields['twitter_url'].label = _("Twitter URL") + self.fields['twitter_account_name'].label = _("Twitter account name") class ServiceForm(ModelForm): @@ -195,13 +219,17 @@ class ServiceForm(ModelForm): def __init__(self, *args, **kwargs): prefix = kwargs.pop('prefix', self.Meta.model.__name__) super(ServiceForm, self).__init__(*args, prefix=prefix, **kwargs) + self.fields['name'].label = _("Name") + self.fields['url'].label = _("URL") + self.fields['description'].label = _("Description") + self.fields['image'].label = _("Image") class DelServiceForm(Form): """Suppression de services sur la page d'accueil""" services = forms.ModelMultipleChoiceField( queryset=Service.objects.none(), - label="Enregistrements service actuels", + label=_("Current services"), widget=forms.CheckboxSelectMultiple ) @@ -239,3 +267,4 @@ class DelMailContactForm(Form): self.fields['mailcontacts'].queryset = instances else: self.fields['mailcontacts'].queryset = MailContact.objects.all() + diff --git a/preferences/locale/fr/LC_MESSAGES/django.mo b/preferences/locale/fr/LC_MESSAGES/django.mo index 21ed01a4..657adab3 100644 Binary files a/preferences/locale/fr/LC_MESSAGES/django.mo and b/preferences/locale/fr/LC_MESSAGES/django.mo differ diff --git a/preferences/locale/fr/LC_MESSAGES/django.po b/preferences/locale/fr/LC_MESSAGES/django.po index 8a4ce095..3535b8d7 100644 --- a/preferences/locale/fr/LC_MESSAGES/django.po +++ b/preferences/locale/fr/LC_MESSAGES/django.po @@ -1,70 +1,609 @@ -# 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. +# 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. # -#, fuzzy +# 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: PACKAGE VERSION\n" +"Project-Id-Version: 2.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-07-26 21:49+0200\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language: \n" +"POT-Creation-Date: 2018-08-18 13:26+0200\n" +"PO-Revision-Date: 2018-06-24 15:54+0200\n" +"Last-Translator: Laouen Fernet \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" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: models.py:256 -msgid "Contact email adress" -msgstr "Adresse email de contact" +#: 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." -#: models.py:263 -msgid "Description of the associated email adress." +#: forms.py:59 templates/preferences/display_preferences.html:41 +msgid "Telephone number required" +msgstr "Numéro de téléphone requis" + +#: forms.py:61 +msgid "GPG fingerprint" +msgstr "Empreinte GPG" + +#: forms.py:62 +msgid "All can create a club" +msgstr "Tous peuvent créer un club" + +#: forms.py:63 +msgid "All can create a member" +msgstr "Tous peuvent créer un adhérent" + +#: forms.py:64 templates/preferences/display_preferences.html:43 +msgid "Self registration" +msgstr "Autoinscription" + +#: forms.py:65 +msgid "Default shell" +msgstr "Interface système par défaut" + +#: forms.py:81 +msgid "Possibility to set a password per machine" +msgstr "Possibilité de mettre un mot de passe par machine" + +#: forms.py:83 templates/preferences/display_preferences.html:87 +msgid "Maximum number of interfaces allowed for a standard user" +msgstr "Nombre maximum d'interfaces autorisé pour un utilisateur standard" + +#: forms.py:87 templates/preferences/display_preferences.html:91 +msgid "Maximum number of DNS aliases allowed for a standard user" +msgstr "Nombre maximum d'alias DNS autorisé pour un utilisateur standard" + +#: forms.py:90 +msgid "IPv6 mode" +msgstr "Mode IPv6" + +#: forms.py:91 +msgid "Can create a machine" +msgstr "Peut créer une machine" + +#: forms.py:107 +msgid "RADIUS general policy" +msgstr "Politique générale de RADIUS" + +#: forms.py:108 templates/preferences/display_preferences.html:116 +msgid "VLAN for machines accepted by RADIUS" +msgstr "VLAN pour les machines acceptées par RADIUS" + +#: forms.py:110 templates/preferences/display_preferences.html:118 +msgid "VLAN for machines rejected by RADIUS" +msgstr "VLAN pour les machines rejetées par RADIUS" + +#: forms.py:127 +msgid "General message" +msgstr "Message général" + +#: forms.py:128 templates/preferences/display_preferences.html:137 +msgid "Number of results displayed when searching" +msgstr "Nombre de résultats affichés lors de la recherche" + +#: forms.py:131 +msgid "Number of items per page, standard size (e.g. users)" +msgstr "Nombre d'éléments par page, taille standard (ex : utilisateurs)" + +#: forms.py:134 +msgid "Number of items per page, large size (e.g. machines)" +msgstr "Nombre d'éléments par page, taille importante (ex : machines)" + +#: forms.py:137 templates/preferences/display_preferences.html:145 +msgid "Time before expiration of the reset password link (in hours)" +msgstr "" +"Temps avant expiration du lien de réinitialisation de mot de passe (en " +"heures)" + +#: forms.py:140 templates/preferences/display_preferences.html:131 +msgid "Website name" +msgstr "Nom du site" + +#: forms.py:141 templates/preferences/display_preferences.html:133 +msgid "Email address for automatic emailing" +msgstr "Adresse mail pour les mails automatiques" + +#: forms.py:143 templates/preferences/display_preferences.html:151 +msgid "Summary of the General Terms of Use" +msgstr "Résumé des Conditions Générales d'Utilisation" + +#: forms.py:145 templates/preferences/display_preferences.html:155 +msgid "General Terms of Use" +msgstr "Conditions Générales d'Utilisation" + +#: forms.py:161 +msgid "Organisation name" +msgstr "Nom de l'association" + +#: forms.py:162 templates/preferences/display_preferences.html:170 +msgid "SIRET number" +msgstr "Numéro SIRET" + +#: forms.py:163 +msgid "Address (line 1)" +msgstr "Adresse (ligne 1)" + +#: forms.py:164 +msgid "Address (line 2)" +msgstr "Adresse (ligne 2)" + +#: forms.py:165 models.py:288 +#: templates/preferences/display_preferences.html:178 +msgid "Contact email address" +msgstr "Adresse mail de contact" + +#: forms.py:166 templates/preferences/display_preferences.html:182 +msgid "Telephone number" +msgstr "Numéro de téléphone" + +#: forms.py:167 templates/preferences/display_preferences.html:184 +msgid "Usual name" +msgstr "Nom d'usage" + +#: forms.py:168 +msgid "Account used for editing from /admin" +msgstr "Compte utilisé pour les modifications depuis /admin" + +#: forms.py:170 +msgid "Payment" +msgstr "Paiement" + +#: forms.py:171 +msgid "Payment ID" +msgstr "ID de paiement" + +#: forms.py:172 +msgid "Payment password" +msgstr "Mot de passe de paiement" + +#: forms.py:173 forms.py:224 templates/preferences/aff_service.html:33 +msgid "Description" +msgstr "Description" + +#: forms.py:189 +msgid "Message for the French welcome email" +msgstr "Message pour le mail de bienvenue en français" + +#: forms.py:191 +msgid "Message for the English welcome email" +msgstr "Message pour le mail de bienvenue en anglais" + +#: forms.py:208 +msgid "Facebook URL" +msgstr "URL du compte Facebook" + +#: forms.py:209 +msgid "Twitter URL" +msgstr "URL du compte Twitter" + +#: forms.py:210 templates/preferences/display_preferences.html:233 +msgid "Twitter account name" +msgstr "Nom du compte Twitter" + +#: forms.py:222 templates/preferences/aff_service.html:31 +#: templates/preferences/display_preferences.html:168 +msgid "Name" +msgstr "Nom" + +#: forms.py:223 templates/preferences/aff_service.html:32 +msgid "URL" +msgstr "URL" + +#: forms.py:225 templates/preferences/aff_service.html:34 +msgid "Image" +msgstr "Image" + +#: forms.py:232 +msgid "Current services" +msgstr "Services actuels" + +#: models.py:71 +msgid "Users can create a club" +msgstr "Les utilisateurs peuvent créer un club" + +#: models.py:75 +msgid "Users can create a member" +msgstr "Les utilisateurs peuvent créer un adhérent" + +#: models.py:79 +msgid "A new user can create their account on Re2o" +msgstr "Un nouvel utilisateur peut créer son compte sur Re2o" + +#: models.py:89 templates/preferences/display_preferences.html:49 +msgid "Users can edit their shell" +msgstr "Les utilisateurs peuvent modifier leur interface système" + +#: models.py:93 +msgid "Enable local email accounts for users" +msgstr "Active les comptes mail locaux pour les utilisateurs" + +#: models.py:98 +msgid "Domain to use for local email accounts" +msgstr "Domaine à utiliser pour les comptes mail locaux" + +#: models.py:102 +msgid "Maximum number of local email addresses for a standard user" +msgstr "" +"Nombre maximum d'adresses mail locales autorisé pour un utilisateur standard" + +#: models.py:108 +msgid "Can view the user options" +msgstr "Peut voir les options d'utilisateur" + +#: models.py:110 +msgid "user options" +msgstr "options d'utilisateur" + +#: models.py:117 +msgid "Email domain must begin with @" +msgstr "Un domaine mail doit commencer par @" + +#: models.py:135 +msgid "Autoconfiguration by RA" +msgstr "Configuration automatique par RA" + +#: models.py:136 +msgid "IP addresses assigning by DHCPv6" +msgstr "Attribution d'adresses IP par DHCPv6" + +#: models.py:137 +msgid "Disabled" +msgstr "Désactivé" + +#: models.py:159 +msgid "Can view the machine options" +msgstr "Peut voir les options de machine" + +#: models.py:161 +msgid "machine options" +msgstr "options de machine" + +#: models.py:180 +msgid "On the IP range's VLAN of the machine" +msgstr "Sur le VLAN de la plage d'IP de la machine" + +#: models.py:181 +msgid "Preset in 'VLAN for machines accepted by RADIUS'" +msgstr "Prédéfinie dans 'VLAN pour les machines acceptées par RADIUS'" + +#: models.py:206 +msgid "Can view the topology options" +msgstr "Peut voir les options de topologie" + +#: models.py:208 +msgid "topology options" +msgstr "options de topologie" + +#: models.py:225 +msgid "" +"General message displayed on the French version of the website (e.g. in case " +"of maintenance)" +msgstr "" +"Message général affiché sur la version française du site (ex : en cas de " +"maintenance)" + +#: models.py:231 +msgid "" +"General message displayed on the English version of the website (e.g. in " +"case of maintenance)" +msgstr "" +"Message général affiché sur la version anglaise du site (ex : en cas de " +"maintenance)" + +#: models.py:253 +msgid "Can view the general options" +msgstr "Peut voir les options générales" + +#: models.py:255 +msgid "general options" +msgstr "options générales" + +#: models.py:275 +msgid "Can view the service options" +msgstr "Peut voir les options de service" + +#: models.py:277 +msgid "service" +msgstr "service" + +#: models.py:278 +msgid "services" +msgstr "services" + +#: models.py:295 +msgid "Description of the associated email address." msgstr "Description de l'adresse mail associée." -#: models.py:273 -msgid "Can see contact email" -msgstr "Peut voir un mail de contact" +#: models.py:305 +msgid "Can view a contact email address object" +msgstr "Peut voir un objet adresse mail de contact" -#: templates/preferences/aff_mailcontact.html:30 -msgid "Adress" -msgstr "Adresse" +#: models.py:307 +msgid "contact email address" +msgstr "adresse mail de contact" + +#: models.py:308 +msgid "contact email addresses" +msgstr "adresses mail de contact" + +#: models.py:318 +msgid "Networking organisation school Something" +msgstr "Association de réseau de l'école Machin" + +#: models.py:322 +msgid "Threadneedle Street" +msgstr "1 rue de la Vrillière" + +#: models.py:323 +msgid "London EC2R 8AH" +msgstr "75001 Paris" + +#: models.py:326 +msgid "Organisation" +msgstr "Association" + +#: models.py:340 +msgid "Can view the organisation options" +msgstr "Peut voir les options d'association" + +#: models.py:342 +msgid "organisation options" +msgstr "options d'association" + +#: models.py:371 +msgid "Can view the homepage options" +msgstr "Peut voir les options de page d'accueil" + +#: models.py:373 +msgid "homepage options" +msgstr "options de page d'accueil" + +#: models.py:391 +msgid "Can view the email message options" +msgstr "Peut voir les options de message pour les mails" + +#: models.py:394 +msgid "email message options" +msgstr "options de messages pour les mails" #: templates/preferences/aff_mailcontact.html:31 -msgid "Remark" +#: templates/preferences/display_preferences.html:174 +msgid "Address" +msgstr "Adresse" + +#: templates/preferences/aff_mailcontact.html:32 +msgid "Comment" msgstr "Commentaire" -#: templates/preferences/display_preferences.html:205 -msgid "Contact email adresses list" -msgstr "Liste des adresses email de contact" +#: templates/preferences/display_preferences.html:31 +#: templates/preferences/edit_preferences.html:30 +#: templates/preferences/preferences.html:29 +msgid "Preferences" +msgstr "Préférences" + +#: templates/preferences/display_preferences.html:34 +msgid "User preferences" +msgstr "Préférences d'utilisateur" + +#: templates/preferences/display_preferences.html:37 +#: templates/preferences/display_preferences.html:79 +#: templates/preferences/display_preferences.html:104 +#: templates/preferences/display_preferences.html:125 +#: templates/preferences/display_preferences.html:162 +#: templates/preferences/display_preferences.html:197 +#: templates/preferences/display_preferences.html:219 +#: templates/preferences/edit_preferences.html:40 views.py:170 views.py:234 +msgid "Edit" +msgstr "Modifier" + +#: templates/preferences/display_preferences.html:47 +msgid "Default shell for users" +msgstr "Interface système par défaut pour les utilisateurs" + +#: templates/preferences/display_preferences.html:53 +msgid "Creation of members by everyone" +msgstr "Création d'adhérents par tous" + +#: templates/preferences/display_preferences.html:55 +msgid "Creation of clubs by everyone" +msgstr "Création de clubs par tous" + +#: templates/preferences/display_preferences.html:59 +msgid "GPG fingerprint field" +msgstr "Champ empreinte GPG" + +#: templates/preferences/display_preferences.html:63 +msgid "Email accounts preferences" +msgstr "Préférences de comptes mail" + +#: templates/preferences/display_preferences.html:66 +msgid "Local email accounts enabled" +msgstr "Comptes mail locaux activés" + +#: templates/preferences/display_preferences.html:68 +msgid "Local email domain" +msgstr "Domaine de mail local" + +#: templates/preferences/display_preferences.html:72 +msgid "Maximum number of email aliases allowed" +msgstr "Nombre maximum d'alias mail autorisé pour un utilisateur standard" + +#: templates/preferences/display_preferences.html:76 +msgid "Machines preferences" +msgstr "Préférences de machines" + +#: templates/preferences/display_preferences.html:85 +msgid "Password per machine" +msgstr "Mot de passe par machine" + +#: templates/preferences/display_preferences.html:93 +msgid "IPv6 support" +msgstr "Support de l'IPv6" + +#: templates/preferences/display_preferences.html:97 +msgid "Creation of machines" +msgstr "Création de machines" + +#: templates/preferences/display_preferences.html:101 +msgid "Topology preferences" +msgstr "Préférences de topologie" + +#: templates/preferences/display_preferences.html:110 +msgid "General policy for VLAN setting" +msgstr "Politique générale pour le placement sur un VLAN" + +#: templates/preferences/display_preferences.html:112 +msgid "" +"This setting defines the VLAN policy after acceptance by RADIUS: either on " +"the IP range's VLAN of the machine, or a VLAN preset in 'VLAN for machines " +"accepted by RADIUS'" +msgstr "" +"Ce réglage définit la politique de placement sur un VLAN après acceptation " +"par RADIUS: soit sur le VLAN de la plage d'IP de la machine, soit sur le " +"VLAN prédéfini dans 'VLAN pour les machines acceptées par RADIUS'" + +#: templates/preferences/display_preferences.html:122 +msgid "General preferences" +msgstr "Préférences générales" + +#: templates/preferences/display_preferences.html:139 +msgid "Number of items per page (standard size)" +msgstr "Nombre d'éléments par page (taille standard)" + +#: templates/preferences/display_preferences.html:143 +msgid "Number of items per page (large size)" +msgstr "Nombre d'éléments par page (taille importante)" + +#: templates/preferences/display_preferences.html:149 +msgid "General message displayed on the website" +msgstr "Message général affiché sur le site" + +#: templates/preferences/display_preferences.html:159 +msgid "Information about the organisation" +msgstr "Informations sur l'association" + +#: templates/preferences/display_preferences.html:188 +msgid "User object of the organisation" +msgstr "Objet utilisateur de l'association" + +#: templates/preferences/display_preferences.html:190 +msgid "Description of the organisation" +msgstr "Description de l'association" + +#: templates/preferences/display_preferences.html:194 +msgid "Custom email message" +msgstr "Message personnalisé pour les mails" + +#: templates/preferences/display_preferences.html:203 +msgid "Welcome email (in French)" +msgstr "Mail de bienvenue (en français)" #: templates/preferences/display_preferences.html:207 -msgid "Add an adress" +msgid "Welcome email (in English)" +msgstr "Mail de bienvenue (en anglais)" + +#: templates/preferences/display_preferences.html:211 +msgid "List of services and homepage preferences" +msgstr "Liste des services et préférences de page d'accueil" + +#: templates/preferences/display_preferences.html:213 +msgid " Add a service" +msgstr " Ajouter un service" + +#: templates/preferences/display_preferences.html:215 +msgid " Delete one or several services" +msgstr " Supprimer un ou plusieurs services" + +#: templates/preferences/display_preferences.html:221 +msgid "List of contact email addresses" +msgstr "Liste des adresses mail de contact" + +#: templates/preferences/display_preferences.html:223 +msgid "Add an address" msgstr "Ajouter une adresse" -#: templates/preferences/display_preferences.html:209 -msgid "Delete one or multiple adresses" -msgstr "Supprimer une ou plusieurs adresses" +#: templates/preferences/display_preferences.html:225 +msgid "Delete one or several addresses" +msgstr " Supprimer une ou plusieurs adresses" -#: views.py:210 -msgid "The adress was created." -msgstr "L'adresse a été créée." +#: templates/preferences/display_preferences.html:231 +msgid "Twitter account URL" +msgstr "URL du compte Twitter" -#: views.py:230 -msgid "Email adress updated." -msgstr "L'adresse email a été mise à jour." +#: templates/preferences/display_preferences.html:237 +msgid "Facebook account URL" +msgstr "URL du compte Facebook" -#: views.py:233 -msgid "Edit" -msgstr "Éditer" +#: templates/preferences/edit_preferences.html:35 +msgid "Editing of preferences" +msgstr "Modification des préférences" -#: views.py:251 -msgid "The email adress was deleted." -msgstr "L'adresse email a été supprimée." +#: views.py:98 +msgid "Unknown object" +msgstr "Objet inconnu" -#: views.py:254 +#: views.py:104 +msgid "You don't have the right to edit this option." +msgstr "Vous n'avez pas le droit de modifier cette option." + +#: views.py:121 +msgid "The preferences were edited." +msgstr "Les préférences ont été modifiées." + +#: views.py:140 +msgid "The service was added." +msgstr "Le service a été ajouté." + +#: views.py:143 +msgid "Add a service" +msgstr " Ajouter un service" + +#: views.py:167 +msgid "The service was edited." +msgstr "Le service a été modifié." + +#: views.py:188 +msgid "The service was deleted." +msgstr "Le service a été supprimé." + +#: views.py:190 +#, python-format +msgid "Error: the service %s can't be deleted." +msgstr "Erreur : le service %s ne peut pas être supprimé." + +#: views.py:194 views.py:256 msgid "Delete" msgstr "Supprimer" + +#: views.py:210 +msgid "The contact email address was created." +msgstr "L'adresse mail de contact a été supprimée." + +#: views.py:214 +msgid "Add a contact email address" +msgstr "Ajouter une adresse mail de contact" + +#: views.py:231 +msgid "The contact email address was edited." +msgstr "L'adresse mail de contact a été modifiée." + +#: views.py:253 +msgid "The contact email adress was deleted." +msgstr "L'adresse mail de contact a été supprimée." diff --git a/preferences/migrations/0050_auto_20180818_1329.py b/preferences/migrations/0050_auto_20180818_1329.py new file mode 100644 index 00000000..1cd4a269 --- /dev/null +++ b/preferences/migrations/0050_auto_20180818_1329.py @@ -0,0 +1,146 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.7 on 2018-08-18 11:29 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('preferences', '0049_optionaluser_self_change_shell'), + ] + + operations = [ + migrations.AlterModelOptions( + name='assooption', + options={'permissions': (('view_assooption', 'Can view the organisation options'),), 'verbose_name': 'organisation options'}, + ), + migrations.AlterModelOptions( + name='generaloption', + options={'permissions': (('view_generaloption', 'Can view the general options'),), 'verbose_name': 'general options'}, + ), + migrations.AlterModelOptions( + name='homeoption', + options={'permissions': (('view_homeoption', 'Can view the homepage options'),), 'verbose_name': 'homepage options'}, + ), + migrations.AlterModelOptions( + name='mailcontact', + options={'permissions': (('view_mailcontact', 'Can view a contact email address object'),), 'verbose_name': 'contact email address', 'verbose_name_plural': 'contact email addresses'}, + ), + migrations.AlterModelOptions( + name='mailmessageoption', + options={'permissions': (('view_mailmessageoption', 'Can view the email message options'),), 'verbose_name': 'email message options'}, + ), + migrations.AlterModelOptions( + name='optionalmachine', + options={'permissions': (('view_optionalmachine', 'Can view the machine options'),), 'verbose_name': 'machine options'}, + ), + migrations.AlterModelOptions( + name='optionaltopologie', + options={'permissions': (('view_optionaltopologie', 'Can view the topology options'),), 'verbose_name': 'topology options'}, + ), + migrations.AlterModelOptions( + name='optionaluser', + options={'permissions': (('view_optionaluser', 'Can view the user options'),), 'verbose_name': 'user options'}, + ), + migrations.AlterModelOptions( + name='service', + options={'permissions': (('view_service', 'Can view the service options'),), 'verbose_name': 'service', 'verbose_name_plural': 'services'}, + ), + migrations.AlterField( + model_name='assooption', + name='adresse1', + field=models.CharField(default='Threadneedle Street', max_length=128), + ), + migrations.AlterField( + model_name='assooption', + name='adresse2', + field=models.CharField(default='London EC2R 8AH', max_length=128), + ), + migrations.AlterField( + model_name='assooption', + name='name', + field=models.CharField(default='Networking organisation school Something', max_length=256), + ), + migrations.AlterField( + model_name='assooption', + name='pseudo', + field=models.CharField(default='Organisation', max_length=32), + ), + migrations.AlterField( + model_name='generaloption', + name='general_message_en', + field=models.TextField(blank=True, default='', help_text='General message displayed on the English version of the website (e.g. in case of maintenance)'), + ), + migrations.AlterField( + model_name='generaloption', + name='general_message_fr', + field=models.TextField(blank=True, default='', help_text='General message displayed on the French version of the website (e.g. in case of maintenance)'), + ), + migrations.AlterField( + model_name='homeoption', + name='facebook_url', + field=models.URLField(blank=True, null=True), + ), + migrations.AlterField( + model_name='homeoption', + name='twitter_account_name', + field=models.CharField(blank=True, max_length=32, null=True), + ), + migrations.AlterField( + model_name='homeoption', + name='twitter_url', + field=models.URLField(blank=True, null=True), + ), + migrations.AlterField( + model_name='mailcontact', + name='address', + field=models.EmailField(default='contact@example.org', help_text='Contact email address', max_length=254), + ), + migrations.AlterField( + model_name='mailcontact', + name='commentary', + field=models.CharField(blank=True, help_text='Description of the associated email address.', max_length=256, null=True), + ), + migrations.AlterField( + model_name='optionalmachine', + name='create_machine', + field=models.BooleanField(default=True), + ), + migrations.AlterField( + model_name='optionalmachine', + name='ipv6_mode', + field=models.CharField(choices=[('SLAAC', 'Autoconfiguration by RA'), ('DHCPV6', 'IP addresses assigning by DHCPv6'), ('DISABLED', 'Disabled')], default='DISABLED', max_length=32), + ), + migrations.AlterField( + model_name='optionaltopologie', + name='radius_general_policy', + field=models.CharField(choices=[('MACHINE', "On the IP range's VLAN of the machine"), ('DEFINED', "Preset in 'VLAN for machines accepted by RADIUS'")], default='DEFINED', max_length=32), + ), + migrations.AlterField( + model_name='optionaluser', + name='all_can_create_adherent', + field=models.BooleanField(default=False, help_text='Users can create a member'), + ), + migrations.AlterField( + model_name='optionaluser', + name='all_can_create_club', + field=models.BooleanField(default=False, help_text='Users can create a club'), + ), + migrations.AlterField( + model_name='optionaluser', + name='max_email_address', + field=models.IntegerField(default=15, help_text='Maximum number of local email addresses for a standard user'), + ), + migrations.AlterField( + model_name='optionaluser', + name='self_adhesion', + field=models.BooleanField(default=False, help_text='A new user can create their account on Re2o'), + ), + migrations.AlterField( + model_name='optionaluser', + name='self_change_shell', + field=models.BooleanField(default=False, help_text='Users can edit their shell'), + ), + ] diff --git a/preferences/models.py b/preferences/models.py index 0ebb2fec..3199dd6c 100644 --- a/preferences/models.py +++ b/preferences/models.py @@ -63,21 +63,20 @@ class PreferencesModel(models.Model): class OptionalUser(AclMixin, PreferencesModel): """Options pour l'user : obligation ou nom du telephone, activation ou non du solde, autorisation du negatif, fingerprint etc""" - PRETTY_NAME = "Options utilisateur" is_tel_mandatory = models.BooleanField(default=True) gpg_fingerprint = models.BooleanField(default=True) all_can_create_club = models.BooleanField( default=False, - help_text="Les users peuvent créer un club" + help_text=_("Users can create a club") ) all_can_create_adherent = models.BooleanField( default=False, - help_text="Les users peuvent créer d'autres adhérents", + help_text=_("Users can create a member"), ) self_adhesion = models.BooleanField( default=False, - help_text="Un nouvel utilisateur peut se créer son compte sur re2o" + help_text=_("A new user can create their account on Re2o") ) shell_default = models.OneToOneField( 'users.ListShell', @@ -87,33 +86,35 @@ class OptionalUser(AclMixin, PreferencesModel): ) self_change_shell = models.BooleanField( default=False, - help_text="Users can change their shell" + help_text=_("Users can edit their shell") ) local_email_accounts_enabled = models.BooleanField( default=False, - help_text="Enable local email accounts for users" + help_text=_("Enable local email accounts for users") ) local_email_domain = models.CharField( - max_length = 32, - default = "@example.org", - help_text="Domain to use for local email accounts", + max_length=32, + default="@example.org", + help_text=_("Domain to use for local email accounts") ) max_email_address = models.IntegerField( - default = 15, - help_text = "Maximum number of local email address for a standard user" + default=15, + help_text=_("Maximum number of local email addresses for a standard" + " user") ) class Meta: permissions = ( - ("view_optionaluser", "Peut voir les options de l'user"), + ("view_optionaluser", _("Can view the user options")), ) + verbose_name = _("user options") def clean(self): """Clean model: Check the mail_extension """ if self.local_email_domain[0] != "@": - raise ValidationError("Mail domain must begin with @") + raise ValidationError(_("Email domain must begin with @")) @receiver(post_save, sender=OptionalUser) @@ -126,15 +127,14 @@ def optionaluser_post_save(**kwargs): class OptionalMachine(AclMixin, PreferencesModel): """Options pour les machines : maximum de machines ou d'alias par user sans droit, activation de l'ipv6""" - PRETTY_NAME = "Options machines" SLAAC = 'SLAAC' DHCPV6 = 'DHCPV6' DISABLED = 'DISABLED' CHOICE_IPV6 = ( - (SLAAC, 'Autoconfiguration par RA'), - (DHCPV6, 'Attribution des ip par dhcpv6'), - (DISABLED, 'Désactivé'), + (SLAAC, _("Autoconfiguration by RA")), + (DHCPV6, _("IP addresses assigning by DHCPv6")), + (DISABLED, _("Disabled")), ) password_machine = models.BooleanField(default=False) @@ -146,8 +146,7 @@ class OptionalMachine(AclMixin, PreferencesModel): default='DISABLED' ) create_machine = models.BooleanField( - default=True, - help_text="Permet à l'user de créer une machine" + default=True ) @cached_property @@ -157,8 +156,9 @@ class OptionalMachine(AclMixin, PreferencesModel): class Meta: permissions = ( - ("view_optionalmachine", "Peut voir les options de machine"), + ("view_optionalmachine", _("Can view the machine options")), ) + verbose_name = _("machine options") @receiver(post_save, sender=OptionalMachine) @@ -174,13 +174,11 @@ def optionalmachine_post_save(**kwargs): class OptionalTopologie(AclMixin, PreferencesModel): """Reglages pour la topologie : mode d'accès radius, vlan où placer les machines en accept ou reject""" - PRETTY_NAME = "Options topologie" MACHINE = 'MACHINE' DEFINED = 'DEFINED' CHOICE_RADIUS = ( - (MACHINE, 'Sur le vlan de la plage ip machine'), - (DEFINED, 'Prédéfini dans "Vlan où placer les machines\ - après acceptation RADIUS"'), + (MACHINE, _("On the IP range's VLAN of the machine")), + (DEFINED, _("Preset in 'VLAN for machines accepted by RADIUS'")), ) radius_general_policy = models.CharField( @@ -205,8 +203,9 @@ class OptionalTopologie(AclMixin, PreferencesModel): class Meta: permissions = ( - ("view_optionaltopologie", "Peut voir les options de topologie"), + ("view_optionaltopologie", _("Can view the topology options")), ) + verbose_name = _("topology options") @receiver(post_save, sender=OptionalTopologie) @@ -219,17 +218,18 @@ def optionaltopologie_post_save(**kwargs): class GeneralOption(AclMixin, PreferencesModel): """Options générales : nombre de resultats par page, nom du site, temps où les liens sont valides""" - PRETTY_NAME = "Options générales" general_message_fr = models.TextField( default="", blank=True, - help_text="Message général affiché sur le site (maintenance, etc)" + help_text=_("General message displayed on the French version of the" + " website (e.g. in case of maintenance)") ) general_message_en = models.TextField( default="", blank=True, - help_text="General message displayed on the English version of the website." + help_text=_("General message displayed on the English version of the" + " website (e.g. in case of maintenance)") ) search_display_page = models.IntegerField(default=15) pagination_number = models.IntegerField(default=25) @@ -250,8 +250,9 @@ class GeneralOption(AclMixin, PreferencesModel): class Meta: permissions = ( - ("view_generaloption", "Peut voir les options générales"), + ("view_generaloption", _("Can view the general options")), ) + verbose_name = _("general options") @receiver(post_save, sender=GeneralOption) @@ -271,8 +272,10 @@ class Service(AclMixin, models.Model): class Meta: permissions = ( - ("view_service", "Peut voir les options de service"), + ("view_service", _("Can view the service options")), ) + verbose_name = _("service") + verbose_name_plural =_("services") def __str__(self): return str(self.name) @@ -282,14 +285,14 @@ class MailContact(AclMixin, models.Model): address = models.EmailField( default = "contact@example.org", - help_text = _("Contact email adress") + help_text = _("Contact email address") ) commentary = models.CharField( blank = True, null = True, help_text = _( - "Description of the associated email adress."), + "Description of the associated email address."), max_length = 256 ) @@ -299,8 +302,10 @@ class MailContact(AclMixin, models.Model): class Meta: permissions = ( - ("view_mailcontact", _("Can see contact email")), + ("view_mailcontact", _("Can view a contact email address object")), ) + verbose_name = _("contact email address") + verbose_name_plural = _("contact email addresses") def __str__(self): return(self.address) @@ -308,18 +313,17 @@ class MailContact(AclMixin, models.Model): class AssoOption(AclMixin, PreferencesModel): """Options générales de l'asso : siret, addresse, nom, etc""" - PRETTY_NAME = "Options de l'association" name = models.CharField( - default="Association réseau école machin", + default=_("Networking organisation school Something"), max_length=256 ) siret = models.CharField(default="00000000000000", max_length=32) - adresse1 = models.CharField(default="1 Rue de exemple", max_length=128) - adresse2 = models.CharField(default="94230 Cachan", max_length=128) + adresse1 = models.CharField(default=_("Threadneedle Street"), max_length=128) + adresse2 = models.CharField(default=_("London EC2R 8AH"), max_length=128) contact = models.EmailField(default="contact@example.org") telephone = models.CharField(max_length=15, default="0000000000") - pseudo = models.CharField(default="Asso", max_length=32) + pseudo = models.CharField(default=_("Organisation"), max_length=32) utilisateur_asso = models.OneToOneField( 'users.User', on_delete=models.PROTECT, @@ -333,8 +337,9 @@ class AssoOption(AclMixin, PreferencesModel): class Meta: permissions = ( - ("view_assooption", "Peut voir les options de l'asso"), + ("view_assooption", _("Can view the organisation options")), ) + verbose_name = _("organisation options") @receiver(post_save, sender=AssoOption) @@ -346,29 +351,26 @@ def assooption_post_save(**kwargs): class HomeOption(AclMixin, PreferencesModel): """Settings of the home page (facebook/twitter etc)""" - PRETTY_NAME = "Options de la page d'accueil" facebook_url = models.URLField( null=True, - blank=True, - help_text="Url du compte facebook" + blank=True ) twitter_url = models.URLField( null=True, - blank=True, - help_text="Url du compte twitter" + blank=True ) twitter_account_name = models.CharField( max_length=32, null=True, - blank=True, - help_text="Nom du compte à afficher" + blank=True ) class Meta: permissions = ( - ("view_homeoption", "Peut voir les options de l'accueil"), + ("view_homeoption", _("Can view the homepage options")), ) + verbose_name = _("homepage options") @receiver(post_save, sender=HomeOption) @@ -380,12 +382,14 @@ def homeoption_post_save(**kwargs): class MailMessageOption(AclMixin, models.Model): """Reglages, mail de bienvenue et autre""" - PRETTY_NAME = "Options de corps de mail" welcome_mail_fr = models.TextField(default="") welcome_mail_en = models.TextField(default="") class Meta: permissions = ( - ("view_mailmessageoption", "Peut voir les options de mail"), + ("view_mailmessageoption", _("Can view the email message" + " options")), ) + verbose_name = _("email message options") + diff --git a/preferences/templates/preferences/aff_mailcontact.html b/preferences/templates/preferences/aff_mailcontact.html index a87e03bb..98ee8cdc 100644 --- a/preferences/templates/preferences/aff_mailcontact.html +++ b/preferences/templates/preferences/aff_mailcontact.html @@ -24,24 +24,26 @@ with this program; if not, write to the Free Software Foundation, Inc., {% load i18n %} {% load acl %} {% load logs_extra %} - - - - - - - - - {% for mailcontact in mailcontact_list %} + +
{% trans "Adress" %}{% trans "Remark" %}
+ + + + + + + + {% for mailcontact in mailcontact_list %} - {% endfor %} -
{% trans "Address" %}{% trans "Comment" %}
{{ mailcontact.address }} {{ mailcontact.commentary }} - {% can_edit mailcontact %} - {% include 'buttons/edit.html' with href='preferences:edit-mailcontact' id=mailcontact.id %} - {% acl_end %} - {% history_button mailcontact %} + {% can_edit mailcontact %} + {% include 'buttons/edit.html' with href='preferences:edit-mailcontact' id=mailcontact.id %} + {% acl_end %} + {% history_button mailcontact %}
+ {% endfor %} + + diff --git a/preferences/templates/preferences/aff_service.html b/preferences/templates/preferences/aff_service.html index 89cfc641..c08e14e0 100644 --- a/preferences/templates/preferences/aff_service.html +++ b/preferences/templates/preferences/aff_service.html @@ -23,30 +23,31 @@ with this program; if not, write to the Free Software Foundation, Inc., {% endcomment %} {% load acl %} {% load logs_extra %} - - - - - - - - - - - - {% for service in service_list %} +{% load i18n %} + +
NomUrlDescriptionImage
+ + + + + + + + + + {% for service in service_list %} - {% endfor %} -
{% trans "Name" %}{% trans "URL" %}{% trans "Description" %}{% trans "Image" %}
{{ service.name }} {{ service.url }} {{ service.description }} {{ service.image }} - {% can_edit service%} - {% include 'buttons/edit.html' with href='preferences:edit-service' id=service.id %} - {% acl_end %} - {% history_button service %} + {% can_edit service%} + {% include 'buttons/edit.html' with href='preferences:edit-service' id=service.id %} + {% acl_end %} + {% history_button service %}
+ {% endfor %} + diff --git a/preferences/templates/preferences/display_preferences.html b/preferences/templates/preferences/display_preferences.html index a7ada02b..6a499969 100644 --- a/preferences/templates/preferences/display_preferences.html +++ b/preferences/templates/preferences/display_preferences.html @@ -28,223 +28,215 @@ with this program; if not, write to the Free Software Foundation, Inc., {% load design %} {% load i18n %} -{% block title %}Création et modification des préférences{% endblock %} +{% block title %}{% trans "Preferences" %}{% endblock %} {% block content %} -

Préférences utilisateur

- - Editer - - -
Généralités
- - - - - - - - - - - - - - - - - - - - - - - - -
Téléphone obligatoirement requis{{ useroptions.is_tel_mandatory|tick }}Auto inscription{{ useroptions.self_adhesion|tick }}
Shell par défaut des utilisateurs{{ useroptions.shell_default }}Les utilisateurs peuvent changer leur shell{{ useroptions.self_change_shell|tick }}
Creations d'adhérents par tous{{ useroptions.all_can_create_adherent|tick }}Creations de clubs par tous{{ useroptions.all_can_create_club|tick }}
Champ gpg fingerprint{{ useroptions.gpg_fingerprint|tick }}
- -
Comptes mails
- - - - - - - - - - - -
Gestion des comptes mails{{ useroptions.local_email_accounts_enabled | tick }}Extension mail interne{{ useroptions.local_email_domain }}
Nombre d'alias mail max{{ useroptions.max_email_address }}
- - -

Préférences machines

- - Editer - - - - - - - - - - - - - - - - - - -
Mot de passe par machine{{ machineoptions.password_machine|tick }}Machines/interfaces autorisées par utilisateurs{{ machineoptions.max_lambdauser_interfaces }}
Alias dns autorisé par utilisateur{{ machineoptions.max_lambdauser_aliases }}Support de l'ipv6{{ machineoptions.ipv6_mode }}
Creation de machines{{ machineoptions.create_machine|tick }}
- - -

Préférences topologie

- - Editer - - - - - - - - - - - - - - -
Politique générale de placement de vlan{{ topologieoptions.radius_general_policy }} - Ce réglage défini la politique vlan après acceptation radius : - soit sur le vlan de la plage d'ip de la machine, soit sur un - vlan prédéfini dans "Vlan où placer les machines après acceptation - RADIUS" -
Vlan où placer les machines après acceptation RADIUS{{ topologieoptions.vlan_decision_ok }}Vlan où placer les machines après rejet RADIUS{{ topologieoptions.vlan_decision_nok }}
- - -

Préférences generales

- - Editer - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Nom du site web{{ generaloptions.site_name }}Adresse mail d'expedition automatique{{ generaloptions.email_from }}
Affichage de résultats dans le champ de recherche{{ generaloptions.search_display_page }}Nombre d'items affichés en liste (taille normale){{ generaloptions.pagination_number }}
Nombre d'items affichés en liste (taille élevée){{ generaloptions.pagination_large_number }}Temps avant expiration du lien de reinitialisation de mot de passe (en heures){{ generaloptions.req_expire_hrs }}
Message global affiché sur le site{{ generaloptions.general_message }}Résumé des CGU{{ generaloptions.GTU_sum_up }}
CGU{{generaloptions.GTU}} -
- - -

Données de l'association

- - Editer - - - - - - - - - - - - - - - - - - - - - - - - - - -
Nom{{ assooptions.name }}SIRET{{ assooptions.siret }}
Adresse{{ assooptions.adresse1 }}
- {{ assooptions.adresse2 }}
Contact mail{{ assooptions.contact }}
Telephone{{ assooptions.telephone }}Pseudo d'usage{{ assooptions.pseudo }}
Objet utilisateur de l'association{{ assooptions.utilisateur_asso }}Description de l'association{{ assooptions.description | safe }}
- - -

Messages personalisé dans les mails

- - Editer - - - - - - - - - - -
Mail de bienvenue (Français){{ mailmessageoptions.welcome_mail_fr | safe }}
Mail de bienvenue (Anglais){{ mailmessageoptions.welcome_mail_en | safe }}
- - -

Liste des services et préférences page d'accueil

-{% can_create preferences.Service%} - - Ajouter un service - -{% acl_end %} - - Supprimer un ou plusieurs service - -{% include "preferences/aff_service.html" with service_list=service_list %} - - - Editer - - -

{% trans "Contact email adresses list" %}

- {% can_create preferences.MailContact%} - {% trans "Add an adress" %} - {% acl_end %} - {% trans "Delete one or multiple adresses" %} - {% include "preferences/aff_mailcontact.html" with mailcontact_list=mailcontact_list %} -

- - - - - - - - - - - - -
Url du compte twitter{{ homeoptions.twitter_url }}Nom utilisé pour afficher le compte{{ homeoptions.twitter_account_name }}
Url du compte facebook{{ homeoptions.facebook_url }}
+

{% trans "User preferences" %}

+ + + {% trans "Edit" %} + + + + + + + + + + + + + + + + + + + + + + + + +
{% trans "Telephone number required" %}{{ useroptions.is_tel_mandatory|tick }}{% trans "Self registration" %}{{ useroptions.self_adhesion|tick }}
{% trans "Default shell for users" %}{{ useroptions.shell_default }}{% trans "Users can edit their shell" %}{{ useroptions.self_change_shell|tick }}
{% trans "Creation of members by everyone" %}{{ useroptions.all_can_create_adherent|tick }}{% trans "Creation of clubs by everyone" %}{{ useroptions.all_can_create_club|tick }}
{% trans "GPG fingerprint field" %}{{ useroptions.gpg_fingerprint|tick }}
+
{% trans "Email accounts preferences" %} + + + + + + + + + + + +
{% trans "Local email accounts enabled" %}{{ useroptions.local_email_accounts_enabled|tick }}{% trans "Local email domain" %}{{ useroptions.local_email_domain }}
{% trans "Maximum number of email aliases allowed" %}{{ useroptions.max_email_address }}
+

{% trans "Machines preferences" %}

+ + + {% trans "Edit" %} + +

+

+ + + + + + + + + + + + + + + + + +
{% trans "Password per machine" %}{{ machineoptions.password_machine|tick }}{% trans "Maximum number of interfaces allowed for a standard user" %}{{ machineoptions.max_lambdauser_interfaces }}
{% trans "Maximum number of DNS aliases allowed for a standard user" %}{{ machineoptions.max_lambdauser_aliases }}{% trans "IPv6 support" %}{{ machineoptions.ipv6_mode }}
{% trans "Creation of machines" %}{{ machineoptions.create_machine|tick }}
+

{% trans "Topology preferences" %}

+ + + {% trans "Edit" %} + +

+

+ + + + + + + + + + + + + +
{% trans "General policy for VLAN setting" %}{{ topologieoptions.radius_general_policy }}{% trans "This setting defines the VLAN policy after acceptance by RADIUS: either on the IP range's VLAN of the machine, or a VLAN preset in 'VLAN for machines accepted by RADIUS'" %}
{% trans "VLAN for machines accepted by RADIUS" %}{{ topologieoptions.vlan_decision_ok }}{% trans "VLAN for machines rejected by RADIUS" %}{{ topologieoptions.vlan_decision_nok }}
+

{% trans "General preferences" %}

+ + + {% trans "Edit" %} + +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{% trans "Website name" %}{{ generaloptions.site_name }}{% trans "Email address for automatic emailing" %}{{ generaloptions.email_from }}
{% trans "Number of results displayed when searching" %}{{ generaloptions.search_display_page }}{% trans "Number of items per page (standard size)" %}{{ generaloptions.pagination_number }}
{% trans "Number of items per page (large size)" %}{{ generaloptions.pagination_large_number }}{% trans "Time before expiration of the reset password link (in hours)" %}{{ generaloptions.req_expire_hrs }}
{% trans "General message displayed on the website" %}{{ generaloptions.general_message }}{% trans "Summary of the General Terms of Use" %}{{ generaloptions.GTU_sum_up }}
{% trans "General Terms of Use" %}{{ generaloptions.GTU }} +
+

{% trans "Information about the organisation" %}

+ + + {% trans "Edit" %} + +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + +
{% trans "Name" %}{{ assooptions.name }}{% trans "SIRET number" %}{{ assooptions.siret }}
{% trans "Address" %}{{ assooptions.adresse1 }}
+ {{ assooptions.adresse2 }} +
{% trans "Contact email address" %}{{ assooptions.contact }}
{% trans "Telephone number" %}{{ assooptions.telephone }}{% trans "Usual name" %}{{ assooptions.pseudo }}
{% trans "User object of the organisation" %}{{ assooptions.utilisateur_asso }}{% trans "Description of the organisation" %}{{ assooptions.description|safe }}
+

{% trans "Custom email message" %}

+ + + {% trans "Edit" %} + +

+

+ + + + + + + + + +
{% trans "Welcome email (in French)" %}{{ mailmessageoptions.welcome_mail_fr|safe }}
{% trans "Welcome email (in English)" %}{{ mailmessageoptions.welcome_mail_en|safe }}
+

{% trans "List of services and homepage preferences" %}

+ {% can_create preferences.Service%} + {% trans " Add a service" %} + {% acl_end %} + {% trans " Delete one or several services" %} + {% include "preferences/aff_service.html" with service_list=service_list %} + + + {% trans "Edit" %} + +

{% trans "List of contact email addresses" %}

+ {% can_create preferences.MailContact %} + {% trans "Add an address" %} + {% acl_end %} + {% trans "Delete one or several addresses" %} + {% include "preferences/aff_mailcontact.html" with mailcontact_list=mailcontact_list %} +

+

+ + + + + + + + + + + +
{% trans "Twitter account URL" %}{{ homeoptions.twitter_url }}{% trans "Twitter account name" %}{{ homeoptions.twitter_account_name }}
{% trans "Facebook account URL" %}{{ homeoptions.facebook_url }}
{% endblock %} + diff --git a/preferences/templates/preferences/edit_preferences.html b/preferences/templates/preferences/edit_preferences.html index 055ac7e8..356f2362 100644 --- a/preferences/templates/preferences/edit_preferences.html +++ b/preferences/templates/preferences/edit_preferences.html @@ -25,20 +25,23 @@ with this program; if not, write to the Free Software Foundation, Inc., {% load bootstrap3 %} {% load massive_bootstrap_form %} +{% load i18n %} -{% block title %}Création et modification des préférences{% endblock %} +{% block title %}{% trans "Preferences" %}{% endblock %} {% block content %} {% bootstrap_form_errors options %} -

Edition des préférences

+

{% trans "Editing of preferences" %}

-{% csrf_token %} -{% massive_bootstrap_form options 'utilisateur_asso' %} -{% bootstrap_button "Modifier" button_type="submit" icon="star" %} + {% csrf_token %} + {% massive_bootstrap_form options 'utilisateur_asso' %} + {% trans "Edit" as tr_edit %} + {% bootstrap_button tr_edit button_type="submit" icon="star" %} -
-
-
+
+
+
{% endblock %} + diff --git a/preferences/templates/preferences/preferences.html b/preferences/templates/preferences/preferences.html index e8972d8d..e4ad4ba2 100644 --- a/preferences/templates/preferences/preferences.html +++ b/preferences/templates/preferences/preferences.html @@ -24,8 +24,9 @@ with this program; if not, write to the Free Software Foundation, Inc., {% endcomment %} {% load bootstrap3 %} +{% load i18n %} -{% block title %}Création et modification des preferences{% endblock %} +{% block title %}{% trans "Preferences" %}{% endblock %} {% block content %} {% if preferenceform %} @@ -44,3 +45,4 @@ with this program; if not, write to the Free Software Foundation, Inc.,

{% endblock %} + diff --git a/preferences/views.py b/preferences/views.py index 3c0c4879..559cdfef 100644 --- a/preferences/views.py +++ b/preferences/views.py @@ -95,14 +95,14 @@ def edit_options(request, section): model = getattr(models, section, None) form_instance = getattr(forms, 'Edit' + section + 'Form', None) if not (model or form_instance): - messages.error(request, "Objet inconnu") + messages.error(request, _("Unknown object")) return redirect(reverse('preferences:display-options')) options_instance, _created = model.objects.get_or_create() can, msg = options_instance.can_edit(request.user) if not can: - messages.error(request, msg or "Vous ne pouvez pas éditer cette\ - option.") + messages.error(request, msg or _("You don't have the right to edit" + " this option.")) return redirect(reverse('index')) options = form_instance( request.POST or None, @@ -114,11 +114,11 @@ def edit_options(request, section): options.save() reversion.set_user(request.user) reversion.set_comment( - "Champs modifié(s) : %s" % ', '.join( + "Field(s) edited: %s" % ', '.join( field for field in options.changed_data ) ) - messages.success(request, "Préférences modifiées") + messages.success(request, _("The preferences were edited.")) return redirect(reverse('preferences:display-options')) return form( {'options': options}, @@ -136,11 +136,11 @@ def add_service(request): with transaction.atomic(), reversion.create_revision(): service.save() reversion.set_user(request.user) - reversion.set_comment("Création") - messages.success(request, "Ce service a été ajouté") + reversion.set_comment("Creation") + messages.success(request, _("The service was added.")) return redirect(reverse('preferences:display-options')) return form( - {'preferenceform': service, 'action_name': 'Ajouter'}, + {'preferenceform': service, 'action_name': _("Add a service")}, 'preferences/preferences.html', request ) @@ -160,14 +160,14 @@ def edit_service(request, service_instance, **_kwargs): service.save() reversion.set_user(request.user) reversion.set_comment( - "Champs modifié(s) : %s" % ', '.join( + "Field(s) edited: %s" % ', '.join( field for field in service.changed_data ) ) - messages.success(request, "Service modifié") + messages.success(request, _("The service was edited.")) return redirect(reverse('preferences:display-options')) return form( - {'preferenceform': service, 'action_name': 'Editer'}, + {'preferenceform': service, 'action_name': _("Edit")}, 'preferences/preferences.html', request ) @@ -185,13 +185,13 @@ def del_service(request, instances): with transaction.atomic(), reversion.create_revision(): services_del.delete() reversion.set_user(request.user) - messages.success(request, "Le service a été supprimé") + messages.success(request, _("The service was deleted.")) except ProtectedError: - messages.error(request, "Erreur le service\ - suivant %s ne peut être supprimé" % services_del) + messages.error(request, _("Error: the service %s can't be" + " deleted.") % services_del) return redirect(reverse('preferences:display-options')) return form( - {'preferenceform': services, 'action_name': 'Supprimer'}, + {'preferenceform': services, 'action_name': _("Delete")}, 'preferences/preferences.html', request ) @@ -207,10 +207,11 @@ def add_mailcontact(request): ) if mailcontact.is_valid(): mailcontact.save() - messages.success(request, _("The adress was created.")) + messages.success(request, _("The contact email address was created.")) return redirect(reverse('preferences:display-options')) return form( - {'preferenceform': mailcontact, 'action_name': 'Ajouter'}, + {'preferenceform': mailcontact, + 'action_name': _("Add a contact email address")}, 'preferences/preferences.html', request ) @@ -227,10 +228,10 @@ def edit_mailcontact(request, mailcontact_instance, **_kwargs): ) if mailcontact.is_valid(): mailcontact.save() - messages.success(request, _("Email adress updated.")) + messages.success(request, _("The contact email address was edited.")) return redirect(reverse('preferences:display-options')) return form( - {'preferenceform': mailcontact, 'action_name': _('Edit')}, + {'preferenceform': mailcontact, 'action_name': _("Edit")}, 'preferences/preferences.html', request ) @@ -248,10 +249,12 @@ def del_mailcontact(request, instances): mailcontacts_dels = mailcontacts.cleaned_data['mailcontacts'] for mailcontacts_del in mailcontacts_dels: mailcontacts_del.delete() - messages.success(request, _("The email adress was deleted.")) + messages.success(request, + _("The contact email adress was deleted.")) return redirect(reverse('preferences:display-options')) return form( - {'preferenceform': mailcontacts, 'action_name': _('Delete')}, + {'preferenceform': mailcontacts, 'action_name': _("Delete")}, 'preferences/preferences.html', request ) + diff --git a/re2o/acl.py b/re2o/acl.py index bd304443..116d273b 100644 --- a/re2o/acl.py +++ b/re2o/acl.py @@ -34,6 +34,7 @@ from django.db.models import Model from django.contrib import messages from django.shortcuts import redirect from django.urls import reverse +from django.utils.translation import ugettext as _ def acl_base_decorator(method_name, *targets, on_instance=True): @@ -138,7 +139,7 @@ ModelC) target = target.get_instance(*args, **kwargs) instances.append(target) except target.DoesNotExist: - yield False, u"Entrée inexistante" + yield False, _("Nonexistent entry.") return if hasattr(target, method_name): can_fct = getattr(target, method_name) @@ -155,7 +156,8 @@ ModelC) if error_messages: for msg in error_messages: messages.error( - request, msg or "Vous ne pouvez pas accéder à ce menu") + request, msg or _("You don't have the right to access" + " this menu.")) return redirect(reverse( 'users:profil', kwargs={'userid': str(request.user.id)} @@ -219,7 +221,8 @@ def can_delete_set(model): instances = model.objects.filter(id__in=instances_id) if not instances: messages.error( - request, "Vous ne pouvez pas accéder à ce menu") + request, _("You don't have the right to access this menu.") + ) return redirect(reverse( 'users:profil', kwargs={'userid': str(request.user.id)} @@ -268,10 +271,11 @@ def can_edit_history(view): return view(request, *args, **kwargs) messages.error( request, - "Vous ne pouvez pas éditer l'historique." + _("You don't have the right to edit the history.") ) return redirect(reverse( 'users:profil', kwargs={'userid': str(request.user.id)} )) return wrapper + diff --git a/re2o/locale/fr/LC_MESSAGES/django.mo b/re2o/locale/fr/LC_MESSAGES/django.mo index c0bdc974..7e9e55c3 100644 Binary files a/re2o/locale/fr/LC_MESSAGES/django.mo and b/re2o/locale/fr/LC_MESSAGES/django.mo differ diff --git a/re2o/locale/fr/LC_MESSAGES/django.po b/re2o/locale/fr/LC_MESSAGES/django.po index cd293d53..86ed6316 100644 --- a/re2o/locale/fr/LC_MESSAGES/django.po +++ b/re2o/locale/fr/LC_MESSAGES/django.po @@ -21,153 +21,189 @@ msgid "" msgstr "" "Project-Id-Version: 2.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-06-23 18:26+0200\n" +"POT-Creation-Date: 2018-08-15 16:11+0200\n" "PO-Revision-Date: 2018-03-31 16:09+0002\n" -"Last-Translator: Maël Kervella \n" +"Last-Translator: Laouen Fernet \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" -#: settings.py:140 +#: acl.py:142 +msgid "Nonexistent entry." +msgstr "Entrée inexistante." + +#: acl.py:159 acl.py:224 +msgid "You don't have the right to access this menu." +msgstr "Vous n'avez pas le droit d'accéder à ce menu." + +#: acl.py:274 +msgid "You don't have the right to edit the history." +msgstr "Vous n'avez pas le droit de modifier l'historique." + +#: mixins.py:111 +#, python-format +msgid "You don't have the right to create a %s object." +msgstr "Vous n'avez pas le droit de créer un objet %s." + +#: mixins.py:125 +#, python-format +msgid "You don't have the right to edit a %s object." +msgstr "Vous n'avez pas le droit de modifier un objet %s." + +#: mixins.py:139 +#, python-format +msgid "You don't have the right to delete a %s object." +msgstr "Vous n'avez pas le droit de supprimer un objet %s." + +#: mixins.py:153 +#, python-format +msgid "You don't have the right to view every %s object." +msgstr "Vous n'avez pas le droit de voir tous les objets %s." + +#: mixins.py:167 +#, python-format +msgid "You don't have the right to view a %s object." +msgstr "Vous n'avez pas le droit de voir un objet %s." + +#: settings.py:155 msgid "English" msgstr "Anglais" -#: settings.py:141 +#: settings.py:156 msgid "French" msgstr "Français" #: templates/re2o/about.html:29 templates/re2o/about.html:35 msgid "About Re2o" -msgstr "A propos de Re2o" +msgstr "À propos de Re2o" #: templates/re2o/about.html:32 #, python-format msgid "About %(AssoName)s" -msgstr "A propos de %(AssoName)s" +msgstr "À propos de %(AssoName)s" #: templates/re2o/about.html:36 msgid "" -"\n" -" Re2o is an administration tool initiated by\n" -" Rezo Supelec Metz and a few\n" -" members of other FedeRez " -"associations\n" -" around the summer 2016.
\n" -" It is intended to be a tool independant from any network " -"infrastructure\n" -" so it can be setup in \"a few steps\". This tool is entirely free " -"and\n" -" available under a GNU Public License v2 (GPLv2) license on\n" -" FedeRez gitlab.
\n" -" Re2o's mainteners are proud volunteers mainly from French " -"engineering\n" -" schools (but not limited to) who have given a lot of their time to " -"make\n" -" this project possible. So please be kind with them.
\n" -" If you want to get involved in the development process, we will be " -"glad to\n" -" welcome you so do not hesitate to contact us and come help us build " -"the\n" -" future of Re2o.\n" -" " +"Re2o is an administration tool initiated by
Rezo Supelec Metz and a few members of other FedeRez associations around the summer 2016.
It is " +"intended to be a tool independant from any network infrastructure so it can " +"be setup in \"a few steps\". This tool is entirely free and available under " +"a GNU Public License v2 (GPLv2) license on FedeRez gitlab.
Re2o's mainteners are " +"volunteers mainly from French schools.
If you want to get involved in " +"the development process, we will be glad to welcome you so do not hesitate " +"to contact us and come help us build the future of Re2o." msgstr "" -"\n" -" Re2o est un outil d'administration initié par\n" -" Rezo Supelec Metz et quelques\n" -" membres d'autres assocations de FedeRez\n" -" autour de l'été 2016.
\n" -" Il se veut être un outil idépendant de toute infrastructure réseau\n" -" pour pouvoir être installé en \"quelques étapes\". Cet outil est " -"entièrement gratuit et\n" -" est disponible sous license GNU Public License v2 (GPLv2) sur le\n" -" gitlab de " -"FedeRez.
\n" -" Les mainteneurs de Re2o sont de fiers bénévoles venant " -"principalement d'écoles d'ingénieurs françaises\n" -" (mais pas seulement) qui ont donné beaucoup de leur temps pour faire " -"en sorte que\n" -" ce projet soit possible. Donc s'il vous plait soyez gentils avez eux." -"
\n" -" Si vous voulez prendre part au développement, nous serons heureux " -"de\n" -" vous accueillir donc n'hésitez pas à nous contacter et à venir nous " -"aider à construire le\n" -" futur de Re2o.\n" -" " +"Re2o est un outil d'administration initié par Rézo Supélec Metz et quelques membres d'autres assocations de FedeRez autour de l'été 2016.
Il se veut " +"être un outil indépendant de toute infrastructure réseau pour pouvoir être " +"installé en \"quelques étapes\". Cet outil est entièrement gratuit et est " +"disponible sous license GNU Public License v2 (GPLv2) sur legitlab de FedeRez.
\n" +"Les mainteneurs de Re2o sont de fiers bénévoles venant principalement " +"d'écoles d'ingénieurs françaises (mais pas seulement) qui ont donné beaucoup " +"de leur temps pour faire en sorte que ce projet soit possible. Donc s'il " +"vous plait soyez gentils avez eux.
Si vous voulez prendre part au " +"développement, nous serons heureux de vous accueillir donc n'hésitez pas à " +"nous contacter et à venir nous aider à construire le futur de Re2o." -#: templates/re2o/about.html:57 +#: templates/re2o/about.html:55 msgid "Contributors list" msgstr "Liste des contributeurs" -#: templates/re2o/about.html:66 -msgid "Version informations" +#: templates/re2o/about.html:64 +msgid "Version information" msgstr "Informations de versions" -#: templates/re2o/about.html:68 +#: templates/re2o/about.html:66 #, python-format -msgid "" -"\n" -" Remote URL: %(git_info_remote)s\n" -" " -msgstr "" -"\n" -" URL distante : %(git_info_remote)s\n" -" " +msgid "Remote URL: %(git_info_remote)s" +msgstr "URL distante : %(git_info_remote)s" -#: templates/re2o/about.html:71 +#: templates/re2o/about.html:69 #, python-format -msgid "" -"\n" -" Branch: %(git_info_branch)s\n" -" " -msgstr "" -"\n" -" Branche : %(git_info_branch)s\n" -" " +msgid "Branch: %(git_info_branch)s" +msgstr "Branche : %(git_info_branch)s" -#: templates/re2o/about.html:74 +#: templates/re2o/about.html:72 #, python-format -msgid "" -"\n" -" Commit: %(git_info_commit)s\n" -" " -msgstr "" -"\n" -" Commit : %(git_info_commit)s\n" -" " +msgid "Commit: %(git_info_commit)s" +msgstr "Commit : %(git_info_commit)s" -#: templates/re2o/about.html:77 +#: templates/re2o/about.html:75 #, python-format -msgid "" -"\n" -" Commit date: %(git_info_commit_date)s\n" -" " -msgstr "" -"\n" -" Date du commit : %(git_info_commit_date)s\n" -" " +msgid "Commit date: %(git_info_commit_date)s" +msgstr "Date du commit : %(git_info_commit_date)s" -#: templates/re2o/about.html:82 +#: templates/re2o/about.html:80 msgid "Dependencies" msgstr "Dépendances" +#: templates/re2o/aff_history.html:30 +msgid "Next" +msgstr "Suivant" + +#: templates/re2o/aff_history.html:37 +msgid "Previous" +msgstr "Précédent" + +#: templates/re2o/aff_history.html:45 +msgid "Date" +msgstr "Date" + +#: templates/re2o/aff_history.html:46 +msgid "Performed by" +msgstr "Effectuée par" + +#: templates/re2o/aff_history.html:47 +msgid "Comment" +msgstr "Commentaire" + +#: templates/re2o/contact.html:29 +msgid "Contact" +msgstr "Contact" + +#: templates/re2o/contact.html:32 +#, python-format +msgid "Contact the organisation %(asso_name)s" +msgstr "Contacter l'association %(asso_name)s" + +#: templates/re2o/history.html:29 +msgid "History" +msgstr "Historique" + +#: templates/re2o/history.html:32 +#, python-format +msgid "History of %(object)s" +msgstr "Historique de %(object)s" + #: templates/re2o/index.html:30 msgid "Home" msgstr "Accueil" #: templates/re2o/index.html:33 #, python-format -msgid "Welcome to %(name_website)s !" +msgid "Welcome to %(name_website)s!" msgstr "Bienvenue sur %(name_website)s !" #: templates/re2o/index.html:47 msgid "Go there" msgstr "Accéder" -#: views.py:205 +#: templates/re2o/sidebar.html:47 +#, python-format +msgid "Tweets from @%(twitter_account_name)s" +msgstr "Tweets de @%(twitter_account_name)s" + +#: templates/re2o/sidebar.html:50 +#, python-format +msgid "Follow @%(twitter_account_name)s" +msgstr "Suivre @%(twitter_account_name)s" + +#: views.py:87 msgid "Unable to get the information" msgstr "Impossible d'obtenir l'information" diff --git a/re2o/mixins.py b/re2o/mixins.py index 2ee049cc..f3858428 100644 --- a/re2o/mixins.py +++ b/re2o/mixins.py @@ -25,6 +25,7 @@ A set of mixins used all over the project to avoid duplicating code from reversion import revisions as reversion from django.db import transaction +from django.utils.translation import ugettext as _ class RevMixin(object): @@ -35,14 +36,14 @@ class RevMixin(object): """ Creates a version of this object and save it to database """ if self.pk is None: with transaction.atomic(), reversion.create_revision(): - reversion.set_comment("Création") + reversion.set_comment("Creation") return super(RevMixin, self).save(*args, **kwargs) return super(RevMixin, self).save(*args, **kwargs) def delete(self, *args, **kwargs): """ Creates a version of this object and delete it from database """ with transaction.atomic(), reversion.create_revision(): - reversion.set_comment("Suppresion") + reversion.set_comment("Deletion") return super(RevMixin, self).delete(*args, **kwargs) @@ -58,7 +59,7 @@ class FormRevMixin(object): ) elif self.changed_data: reversion.set_comment( - "Champs modifié(s) : %s" + "Field(s) altered : %s" % ', '.join(field for field in self.changed_data) ) return super(FormRevMixin, self).save(*args, **kwargs) @@ -107,7 +108,8 @@ class AclMixin(object): user_request.has_perm( cls.get_modulename() + '.add_' + cls.get_classname() ), - u"Vous n'avez pas le droit de créer un " + cls.get_classname() + (_("You don't have the right to create a %s object.") + % cls.get_classname()) ) def can_edit(self, user_request, *_args, **_kwargs): @@ -120,7 +122,8 @@ class AclMixin(object): user_request.has_perm( self.get_modulename() + '.change_' + self.get_classname() ), - u"Vous n'avez pas le droit d'éditer des " + self.get_classname() + (_("You don't have the right to edit a %s object.") + % self.get_classname()) ) def can_delete(self, user_request, *_args, **_kwargs): @@ -133,7 +136,8 @@ class AclMixin(object): user_request.has_perm( self.get_modulename() + '.delete_' + self.get_classname() ), - u"Vous n'avez pas le droit d'éditer des " + self.get_classname() + (_("You don't have the right to delete a %s object.") + % self.get_classname()) ) @classmethod @@ -146,7 +150,8 @@ class AclMixin(object): user_request.has_perm( cls.get_modulename() + '.view_' + cls.get_classname() ), - u"Vous n'avez pas le droit de voir des " + cls.get_classname() + (_("You don't have the right to view every %s object.") + % cls.get_classname()) ) def can_view(self, user_request, *_args, **_kwargs): @@ -159,5 +164,7 @@ class AclMixin(object): user_request.has_perm( self.get_modulename() + '.view_' + self.get_classname() ), - u"Vous n'avez pas le droit de voir des " + self.get_classname() + (_("You don't have the right to view a %s object.") + % self.get_classname()) ) + diff --git a/re2o/script_utils.py b/re2o/script_utils.py index e1420e6d..92c00fab 100644 --- a/re2o/script_utils.py +++ b/re2o/script_utils.py @@ -50,10 +50,10 @@ def get_user(pseudo): """Cherche un utilisateur re2o à partir de son pseudo""" user = User.objects.filter(pseudo=pseudo) if len(user) == 0: - raise CommandError("Utilisateur invalide") + raise CommandError("Invalid user.") if len(user) > 1: - raise CommandError("Plusieurs utilisateurs correspondant à ce " - "pseudo. Ceci NE DEVRAIT PAS arriver") + raise CommandError("Several users match this username. This SHOULD" + " NOT happen.") return user[0] @@ -81,19 +81,19 @@ def form_cli(Form, user, action, *args, **kwargs): form = Form(data, user=user, *args, **kwargs) if not form.is_valid(): - sys.stderr.write("Erreurs : \n") + sys.stderr.write("Errors: \n") for err in form.errors: # Oui, oui, on gère du HTML là où d'autres ont eu la # lumineuse idée de le mettre sys.stderr.write( "\t%s : %s\n" % (err, strip_tags(form.errors[err])) ) - raise CommandError("Formulaire invalide") + raise CommandError("Invalid form.") with transaction.atomic(), reversion.create_revision(): form.save() reversion.set_user(user) reversion.set_comment(action) - sys.stdout.write("%s : effectué. La modification peut prendre " - "quelques minutes pour s'appliquer.\n" % action) + sys.stdout.write("%s : done. The edit may take several minutes to" + " apply.\n" % action) diff --git a/re2o/templates/re2o/about.html b/re2o/templates/re2o/about.html index d960067a..f7afc69c 100644 --- a/re2o/templates/re2o/about.html +++ b/re2o/templates/re2o/about.html @@ -33,7 +33,7 @@ with this program; if not, write to the Free Software Foundation, Inc., {{ description | safe }}

{% trans "About Re2o" %}

-

{% blocktrans %} +

{% blocktrans trimmed %} Re2o is an administration tool initiated by Rezo Supelec Metz and a few members of other FedeRez associations @@ -61,18 +61,18 @@ with this program; if not, write to the Free Software Foundation, Inc.,

-

{% trans "Version informations" %}

+

{% trans "Version information" %}

    -
  • {% blocktrans %} +
  • {% blocktrans trimmed %} Remote URL: {{ git_info_remote }} {% endblocktrans %}
  • -
  • {% blocktrans %} +
  • {% blocktrans trimmed %} Branch: {{ git_info_branch }} {% endblocktrans %}
  • -
  • {% blocktrans %} +
  • {% blocktrans trimmed %} Commit: {{ git_info_commit }} {% endblocktrans %}
  • -
  • {% blocktrans %} +
  • {% blocktrans trimmed %} Commit date: {{ git_info_commit_date }} {% endblocktrans %}
diff --git a/re2o/templates/re2o/aff_history.html b/re2o/templates/re2o/aff_history.html index d7be350c..7079d7de 100644 --- a/re2o/templates/re2o/aff_history.html +++ b/re2o/templates/re2o/aff_history.html @@ -22,17 +22,19 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. {% endcomment %} +{% load i18n %} + {% if reversions.paginator %} {% endif %} @@ -40,9 +42,9 @@ with this program; if not, write to the Free Software Foundation, Inc., - - - + + + {% for rev in reversions %} @@ -53,3 +55,4 @@ with this program; if not, write to the Free Software Foundation, Inc., {% endfor %}
DateEffectué parCommentaire{% trans "Date" %}{% trans "Performed by" %}{% trans "Comment" %}
+ diff --git a/re2o/templates/re2o/contact.html b/re2o/templates/re2o/contact.html index f2de696d..f26e002b 100644 --- a/re2o/templates/re2o/contact.html +++ b/re2o/templates/re2o/contact.html @@ -29,7 +29,7 @@ with this program; if not, write to the Free Software Foundation, Inc., {% block title %}{% trans "Contact" %}{% endblock %} {% block content %} -

{% blocktrans %}Contacter l'association {{asso_name}}{% endblocktrans %}

+

{% blocktrans %}Contact the organisation {{asso_name}}{% endblocktrans %}


{% for contact in contacts %} @@ -45,8 +45,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% endfor %} - - {% endblock %} diff --git a/re2o/templates/re2o/history.html b/re2o/templates/re2o/history.html index e9d654d9..945a355e 100644 --- a/re2o/templates/re2o/history.html +++ b/re2o/templates/re2o/history.html @@ -24,11 +24,12 @@ with this program; if not, write to the Free Software Foundation, Inc., {% endcomment %} {% load bootstrap3 %} +{% load i18n %} -{% block title %}Historique{% endblock %} +{% block title %}{% trans "History" %}{% endblock %} {% block content %} -

Historique de {{ object }}

+

{% blocktrans %}History of {{ object }}{% endblocktrans %}

{% include "re2o/aff_history.html" with reversions=reversions %}

diff --git a/re2o/templates/re2o/index.html b/re2o/templates/re2o/index.html index 5b505c0f..28adf055 100644 --- a/re2o/templates/re2o/index.html +++ b/re2o/templates/re2o/index.html @@ -30,7 +30,7 @@ with this program; if not, write to the Free Software Foundation, Inc., {% block title %}{% trans "Home" %}{% endblock %} {% block content %} -

{% blocktrans %}Welcome to {{ name_website }} !{% endblocktrans %}

+

{% blocktrans %}Welcome to {{ name_website }}!{% endblocktrans %}

{% for service_list in services_urls %} diff --git a/re2o/templates/re2o/sidebar.html b/re2o/templates/re2o/sidebar.html index ad64caae..c9202d14 100644 --- a/re2o/templates/re2o/sidebar.html +++ b/re2o/templates/re2o/sidebar.html @@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. {% endcomment %} +{% load i18n %} {% block sidebar %} @@ -43,10 +44,10 @@ with this program; if not, write to the Free Software Foundation, Inc., {% endif %} {% if twitter_url %} - + - + {% endif %} diff --git a/re2o/views.py b/re2o/views.py index c3f13332..15becb35 100644 --- a/re2o/views.py +++ b/re2o/views.py @@ -131,3 +131,4 @@ def handler500(request): def handler404(request): """The handler view for a 404 error""" return render(request, 'errors/404.html') + diff --git a/search/forms.py b/search/forms.py index 8cdb1cc1..6065e799 100644 --- a/search/forms.py +++ b/search/forms.py @@ -26,23 +26,24 @@ from __future__ import unicode_literals from django import forms from django.forms import Form +from django.utils.translation import ugettext_lazy as _ from re2o.utils import get_input_formats_help_text CHOICES_USER = ( - ('0', 'Actifs'), - ('1', 'Désactivés'), - ('2', 'Archivés'), + ('0', _("Active")), + ('1', _("Disabled")), + ('2', _("Archived")), ) CHOICES_AFF = ( - ('0', 'Utilisateurs'), - ('1', 'Machines'), - ('2', 'Factures'), - ('3', 'Bannissements'), - ('4', 'Accès à titre gracieux'), - ('5', 'Chambres'), - ('6', 'Ports'), - ('7', 'Switchs'), + ('0', _("Users")), + ('1', _("Machines")), + ('2', _("Invoices")), + ('3', _("Bans")), + ('4', _("Whitelists")), + ('5', _("Rooms")), + ('6', _("Ports")), + ('7', _("Switches")), ) @@ -55,11 +56,11 @@ def initial_choices(choice_set): class SearchForm(Form): """The form for a simple search""" q = forms.CharField( - label='Recherche', + label=_("Search"), help_text=( - 'Utilisez « » et «,» pour spécifier différents mots, «"query"» ' - 'pour une recherche exacte et «\\» pour échapper un caractère.' - ), + _("Use « » and «,» to specify distinct words, «\"query\"» for" + " an exact search and «\\» to escape a character.") + ), max_length=100 ) @@ -67,23 +68,23 @@ class SearchForm(Form): class SearchFormPlus(Form): """The form for an advanced search (with filters)""" q = forms.CharField( - label='Recherche', + label=_("Search"), help_text=( - 'Utilisez « » et «,» pour spécifier différents mots, «"query"» ' - 'pour une recherche exacte et «\\» pour échapper un caractère.' + _("Use « » and «,» to specify distinct words, «\"query\"» for" + " an exact search and «\\» to escape a character.") ), max_length=100, required=False ) u = forms.MultipleChoiceField( - label="Filtre utilisateurs", + label=_("Users filter"), required=False, widget=forms.CheckboxSelectMultiple, choices=CHOICES_USER, initial=initial_choices(CHOICES_USER) ) a = forms.MultipleChoiceField( - label="Filtre affichage", + label=_("Display filter"), required=False, widget=forms.CheckboxSelectMultiple, choices=CHOICES_AFF, @@ -91,11 +92,11 @@ class SearchFormPlus(Form): ) s = forms.DateField( required=False, - label="Date de début", + label=_("Start date"), ) e = forms.DateField( required=False, - label="Date de fin" + label=_("End date") ) def __init__(self, *args, **kwargs): @@ -106,3 +107,4 @@ class SearchFormPlus(Form): self.fields['e'].help_text = get_input_formats_help_text( self.fields['e'].input_formats ) + diff --git a/search/locale/fr/LC_MESSAGES/django.mo b/search/locale/fr/LC_MESSAGES/django.mo new file mode 100644 index 00000000..94a44104 Binary files /dev/null and b/search/locale/fr/LC_MESSAGES/django.mo differ diff --git a/search/locale/fr/LC_MESSAGES/django.po b/search/locale/fr/LC_MESSAGES/django.po new file mode 100644 index 00000000..dd0b63a3 --- /dev/null +++ b/search/locale/fr/LC_MESSAGES/django.po @@ -0,0 +1,163 @@ +# 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 18:15+0200\n" +"PO-Revision-Date: 2018-06-24 20:10+0200\n" +"Last-Translator: Laouen Fernet \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" + +#: forms.py:33 +msgid "Active" +msgstr "Actifs" + +#: forms.py:34 +msgid "Disabled" +msgstr "Désactivés" + +#: forms.py:35 +msgid "Archived" +msgstr "Archivés" + +#: forms.py:39 +msgid "Users" +msgstr "Utilisateurs" + +#: forms.py:40 +msgid "Machines" +msgstr "Machines" + +#: forms.py:41 +msgid "Invoices" +msgstr "Factures" + +#: forms.py:42 +msgid "Bans" +msgstr "Bannissements" + +#: forms.py:43 +msgid "Whitelists" +msgstr "Accès gracieux" + +#: forms.py:44 +msgid "Rooms" +msgstr "Chambres" + +#: forms.py:45 +msgid "Ports" +msgstr "Ports" + +#: forms.py:46 +msgid "Switches" +msgstr "Commutateurs réseau" + +#: forms.py:59 forms.py:71 templates/search/search.html:29 +#: templates/search/search.html:48 +msgid "Search" +msgstr "Rechercher" + +#: forms.py:61 forms.py:73 +msgid "" +"Use « » and «,» to specify distinct words, «\"query\"» for an exact search " +"and «\\» to escape a character." +msgstr "" +"Utilisez « » et «,» pour spécifier différents mots, «\"query\"» pour une " +"recherche exacte et «\\» pour échapper un caractère." + +#: forms.py:80 +msgid "Users filter" +msgstr "Filtre utilisateurs" + +#: forms.py:87 +msgid "Display filter" +msgstr "Filtre affichage" + +#: forms.py:95 +msgid "Start date" +msgstr "Date de début" + +#: forms.py:99 +msgid "End date" +msgstr "Date de fin" + +#: templates/search/index.html:29 +msgid "Search results" +msgstr "Résultats de la recherche" + +#: templates/search/index.html:33 +msgid "Results among users:" +msgstr "Résultats parmi les utilisateurs :" + +#: templates/search/index.html:37 +msgid "Results among clubs:" +msgstr "Résultats parmi les clubs :" + +#: templates/search/index.html:41 +msgid "Results among machines:" +msgstr "Résultats parmi les machines :" + +#: templates/search/index.html:45 +msgid "Results among invoices:" +msgstr "Résultats parmi les factures :" + +#: templates/search/index.html:49 +msgid "Results among whitelists:" +msgstr "Résultats parmi les accès à titre gracieux :" + +#: templates/search/index.html:53 +msgid "Results among bans:" +msgstr "Résultats parmi les bannissements :" + +#: templates/search/index.html:57 +msgid "Results among rooms:" +msgstr "Résultats parmi les chambres :" + +#: templates/search/index.html:61 +msgid "Results among ports" +msgstr "Résultats parmi les ports :" + +#: templates/search/index.html:65 +msgid "Results among switches" +msgstr "Résultats parmi les commutateurs réseau :" + +#: templates/search/index.html:69 +msgid "No result" +msgstr "Pas de résultat" + +#: templates/search/index.html:71 +#, python-format +msgid "(Only the first %(max_result)s results are displayed in each category)" +msgstr "" +"(Seulement les %(max_result)s premiers résultats sont affichés dans chaque " +"catégorie)" + +#: templates/search/sidebar.html:31 +msgid "Simple search" +msgstr "Recherche simple" + +#: templates/search/sidebar.html:35 +msgid "Advanced search" +msgstr "Recherche avancée" diff --git a/search/templates/search/index.html b/search/templates/search/index.html index 2fad0c89..23b57cce 100644 --- a/search/templates/search/index.html +++ b/search/templates/search/index.html @@ -24,52 +24,54 @@ with this program; if not, write to the Free Software Foundation, Inc., {% endcomment %} {% load bootstrap3 %} +{% load i18n %} -{% block title %}Résultats de la recherche{% endblock %} +{% block title %}{% trans "Search results" %}{% endblock %} {% block content %} {% if users %} -

Résultats dans les utilisateurs

+

{% trans "Results among users:" %}

{% include "users/aff_users.html" with users_list=users %} {% endif%} {% if clubs %} -

Résultats dans les clubs

+

{% trans "Results among clubs:" %}

{% include "users/aff_clubs.html" with clubs_list=clubs %} {% endif%} {% if machines %} -

Résultats dans les machines :

+

{% trans "Results among machines:" %}

{% include "machines/aff_machines.html" with machines_list=machines %} {% endif %} {% if factures %} -

Résultats dans les factures :

+

{% trans "Results among invoices:" %}

{% include "cotisations/aff_cotisations.html" with facture_list=factures %} {% endif %} {% if whitelists %} -

Résultats dans les accès à titre gracieux :

+

{% trans "Results among whitelists:" %}

{% include "users/aff_whitelists.html" with white_list=whitelists %} {% endif %} {% if bans %} -

Résultats dans les banissements :

+

{% trans "Results among bans:" %}

{% include "users/aff_bans.html" with ban_list=bans %} {% endif %} {% if rooms %} -

Résultats dans les chambres :

+

{% trans "Results among rooms:" %}

{% include "topologie/aff_chambres.html" with room_list=rooms %} {% endif %} {% if ports %} -

Résultats dans les ports :

+

{% trans "Results among ports" %}

{% include "topologie/aff_port.html" with port_list=ports %} {% endif %} {% if switches %} -

Résultats dans les switchs :

+

{% trans "Results among switches" %}

{% include "topologie/aff_switch.html" with switch_list=switches %} {% endif %} {% if not users and not machines and not factures and not whitelists and not bans and not rooms and not ports and not switches %} -

Aucun résultat

+

{% trans "No result" %}

{% else %} -
(Seulement les {{ max_result }} premiers résultats sont affichés dans chaque catégorie)
+
{% blocktrans %}(Only the first {{ max_result }} results are displayed in each category){% endblocktrans %}
{% endif %}


{% endblock %} + diff --git a/search/templates/search/search.html b/search/templates/search/search.html index 7ae5d56d..42012339 100644 --- a/search/templates/search/search.html +++ b/search/templates/search/search.html @@ -24,8 +24,9 @@ with this program; if not, write to the Free Software Foundation, Inc., {% endcomment %} {% load bootstrap3 %} +{% load i18n %} -{% block title %}Recherche{% endblock %} +{% block title %}{% trans "Search" %}{% endblock %} {% block content %} {% bootstrap_form_errors search_form %} @@ -44,7 +45,8 @@ with this program; if not, write to the Free Software Foundation, Inc., {% if search_form.e %} {% bootstrap_field search_form.e %} {% endif %} - {% bootstrap_button "Search" button_type="submit" icon="search" %} + {% trans "Search" as tr_search %} + {% bootstrap_button tr_search button_type="submit" icon="search" %}

@@ -52,3 +54,4 @@ with this program; if not, write to the Free Software Foundation, Inc.,

{% endblock %} + diff --git a/search/templates/search/sidebar.html b/search/templates/search/sidebar.html index 8e29d379..a445ef41 100644 --- a/search/templates/search/sidebar.html +++ b/search/templates/search/sidebar.html @@ -23,14 +23,16 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. {% endcomment %} +{% load i18n %} {% block sidebar %} - Recherche simple + {% trans "Simple search" %} - Recherche avancée + {% trans "Advanced search" %} {% endblock %} + diff --git a/templates/base.html b/templates/base.html index 698195f7..aeb840da 100644 --- a/templates/base.html +++ b/templates/base.html @@ -39,8 +39,8 @@ with this program; if not, write to the Free Software Foundation, Inc., - - + + {# Load CSS and JavaScript #} {% bootstrap_css %} @@ -78,17 +78,17 @@ with this program; if not, write to the Free Software Foundation, Inc.,