From 1b4324f38f7fe080a4bf497677e9c5d16522efda Mon Sep 17 00:00:00 2001 From: Skia Date: Mon, 18 Jul 2016 17:47:43 +0200 Subject: [PATCH] Add french translation file --- club/migrations/0002_auto_20160718_1456.py | 19 + club/models.py | 2 +- counter/views.py | 4 +- locale/fr/LC_MESSAGES/django.mo | Bin 0 -> 6666 bytes locale/fr/LC_MESSAGES/django.po | 433 +++++++++++++++++++++ sith/settings_sample.py | 50 +-- 6 files changed, 483 insertions(+), 25 deletions(-) create mode 100644 club/migrations/0002_auto_20160718_1456.py create mode 100644 locale/fr/LC_MESSAGES/django.mo create mode 100644 locale/fr/LC_MESSAGES/django.po diff --git a/club/migrations/0002_auto_20160718_1456.py b/club/migrations/0002_auto_20160718_1456.py new file mode 100644 index 00000000..dcb7e081 --- /dev/null +++ b/club/migrations/0002_auto_20160718_1456.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('club', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='membership', + name='role', + field=models.IntegerField(verbose_name='role', default=0, choices=[(0, 'Curious'), (1, 'Active member'), (2, 'Board member'), (3, 'IT supervisor'), (4, 'Secretary'), (5, 'Communication supervisor'), (7, 'Treasurer'), (9, 'Vice-President'), (10, 'President')]), + ), + ] diff --git a/club/models.py b/club/models.py index 3a0bd2e8..0152bb63 100644 --- a/club/models.py +++ b/club/models.py @@ -120,7 +120,7 @@ class Membership(models.Model): raise ValidationError(_('User is already member of that club')) def __str__(self): - return self.club.name+' - '+self.user.username+' - '+settings.SITH_CLUB_ROLES[self.role]+str( + return self.club.name+' - '+self.user.username+' - '+str(settings.SITH_CLUB_ROLES[self.role])+str( " - "+str(_('past member')) if self.end_date is not None else "" ) diff --git a/counter/views.py b/counter/views.py index 75a2896f..c3dc1419 100644 --- a/counter/views.py +++ b/counter/views.py @@ -191,9 +191,9 @@ class CounterClick(DetailView): def parse_code(self, request): """Parse the string entered by the barman""" string = str(request.POST['code']).upper() - if string == _("FIN"): + if string == _("END"): return self.finish(request) - elif string == _("ANN"): + elif string == _("CAN"): return self.cancel(request) regex = re.compile(r"^((?P[0-9]+)X)?(?P[A-Z0-9]+)$") m = regex.match(string) diff --git a/locale/fr/LC_MESSAGES/django.mo b/locale/fr/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..d02b7fe3d785b752fea4faa196915465b2997484 GIT binary patch literal 6666 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 literal 0 HcmV?d00001 diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po new file mode 100644 index 00000000..39a481de --- /dev/null +++ b/locale/fr/LC_MESSAGES/django.po @@ -0,0 +1,433 @@ +# Sith AE french translation file +# Copyright (C) 2016 +# This file is distributed under the same license as the Sith package. +# Skia , 2016 +# +msgid "" +msgstr "" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-07-18 15:44+0000\n" +"PO-Revision-Date: 2016-07-18\n" +"Last-Translator: Skia \n" +"Language-Team: AE info \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: accounting/models.py:29 accounting/models.py:52 accounting/models.py:91 +#: club/models.py:18 counter/models.py:35 counter/models.py:54 +#: counter/models.py:76 +msgid "name" +msgstr "nom" + +#: accounting/models.py:30 +msgid "iban" +msgstr "IBAN" + +#: accounting/models.py:31 +msgid "account number" +msgstr "numero de compte" + +#: accounting/models.py:89 club/models.py:109 counter/models.py:211 +msgid "start date" +msgstr "date de début" + +#: accounting/models.py:90 club/models.py:110 counter/models.py:212 +msgid "end date" +msgstr "date de fin" + +#: accounting/models.py:92 +msgid "is closed" +msgstr "est fermé" + +#: accounting/models.py:94 accounting/models.py:132 counter/models.py:21 +#: counter/models.py:159 +msgid "amount" +msgstr "montant" + +#: accounting/models.py:95 +msgid "effective_amount" +msgstr "montant effectif" + +#: accounting/models.py:133 core/models.py:456 counter/models.py:162 +#: counter/models.py:190 +msgid "date" +msgstr "date" + +#: accounting/models.py:134 accounting/models.py:182 +msgid "label" +msgstr "intitulé" + +#: accounting/models.py:135 +msgid "remark" +msgstr "remarque" + +#: accounting/models.py:136 counter/models.py:163 subscription/models.py:34 +msgid "payment method" +msgstr "méthode de paiement" + +#: accounting/models.py:137 +msgid "cheque number" +msgstr "numéro de chèque" + +#: accounting/models.py:139 +msgid "is done" +msgstr "est fait" + +#: accounting/models.py:181 counter/models.py:57 +msgid "code" +msgstr "code" + +#: accounting/models.py:183 +msgid "movement type" +msgstr "type de mouvement" + +#: club/models.py:20 +msgid "unix name" +msgstr "nom unix" + +#: club/models.py:24 +msgid "" +"Enter a valid unix name. This value may contain only letters, numbers ./-/_ " +"characters." +msgstr "" +"Entrez un nom UNIX valide. Cette valeur peut contenir uniquement des " +"lettres, des nombres, et les caractères ./-/_" + +#: club/models.py:29 +msgid "A club with that unix name already exists." +msgstr "Un club avec ce nom UNIX existe déjà." + +#: club/models.py:32 +msgid "address" +msgstr "Adresse" + +#: club/models.py:45 +msgid "You can not make loops in clubs" +msgstr "Vous ne pouvez pas faire de boucles dans les clubs" + +#: club/models.py:111 +msgid "role" +msgstr "rôle" + +#: club/models.py:113 core/models.py:27 counter/models.py:36 +#: counter/models.py:55 +msgid "description" +msgstr "description" + +#: club/models.py:118 +msgid "User must be subscriber to take part to a club" +msgstr "L'utilisateur doit être cotisant pour faire partie d'un club" + +#: club/models.py:120 +msgid "User is already member of that club" +msgstr "L'utilisateur est déjà membre de ce club" + +#: club/models.py:124 +msgid "past member" +msgstr "Anciens membres" + +#: core/models.py:23 +msgid "meta group status" +msgstr "Status du meta-groupe" + +#: core/models.py:25 +msgid "Whether a group is a meta group or not" +msgstr "Si un groupe est un meta-groupe ou pas" + +#: core/models.py:60 +msgid "username" +msgstr "nom d'utilisateur" + +#: core/models.py:63 +msgid "Required. 254 characters or fewer. Letters, digits and @/./+/-/_ only." +msgstr "" +"Requis. Pas plus de 254 caractères. Uniquement des lettres, numéros, et @/./" +"+/-/_" + +#: core/models.py:67 +msgid "" +"Enter a valid username. This value may contain only letters, numbers and @/./" +"+/-/_ characters." +msgstr "" +"Entrez un nom d'utilisateur correct. Uniquement des lettres, numéros, et @/./" +"+/-/_" + +#: core/models.py:72 +msgid "A user with that username already exists." +msgstr "Un utilisateur de ce nom existe déjà" + +#: core/models.py:75 +msgid "first name" +msgstr "Prénom" + +#: core/models.py:76 +msgid "last name" +msgstr "Nom" + +#: core/models.py:77 +msgid "email address" +msgstr "adresse email" + +#: core/models.py:78 +msgid "date of birth" +msgstr "date de naissance" + +#: core/models.py:81 +msgid "staff status" +msgstr "status \"staff\"" + +#: core/models.py:83 +msgid "Designates whether the user can log into this admin site." +msgstr "Est-ce que l'utilisateur peut se logger à la partie admin du site." + +#: core/models.py:86 +msgid "active" +msgstr "actif" + +#: core/models.py:89 +msgid "" +"Designates whether this user should be treated as active. Unselect this " +"instead of deleting accounts." +msgstr "" +"Est-ce que l'utilisateur doit être traité comme actif. Déselectionnez au " +"lieu de supprimer les comptes." + +#: core/models.py:93 +msgid "date joined" +msgstr "date d'inscription" + +#: core/models.py:95 +msgid "superuser" +msgstr "super-utilisateur" + +#: core/models.py:98 +msgid "Designates whether this user is a superuser. " +msgstr "Est-ce que l'utilisateur est super-utilisateur." + +#: core/models.py:274 +msgid "Visitor" +msgstr "Visiteur" + +#: core/models.py:279 +msgid "define if we show a users stats" +msgstr "Definit si l'on montre les statistiques de l'utilisateur" + +#: core/models.py:281 +msgid "Show your account statistics to others" +msgstr "Montrez vos statistiques de compte aux autres" + +#: core/models.py:307 core/models.py:311 +msgid "page name" +msgstr "nom de la page" + +#: core/models.py:344 +msgid "Duplicate page" +msgstr "Duppliquer la page" + +#: core/models.py:350 +msgid "Loop in page tree" +msgstr "Boucle dans l'arborescence des pages" + +#: core/models.py:454 +msgid "page title" +msgstr "titre de la page" + +#: core/models.py:455 +msgid "page content" +msgstr "contenu de la page" + +#: core/templates/core/password_reset_email.jinja:2 +#, python-format +# msgid "" +# "You're receiving this email because you requested a password reset for your " +# "user account at %(site_name)s." +# msgstr "" +# "Vous avez reçu cet email parce que vous avez demandé une réinitialisation du " +# "mot de passe pour votre compte sur le site %(site_name)." + +#: core/templates/core/password_reset_email.jinja:4 +msgid "Please go to the following page and choose a new password:" +msgstr "" +"Merci de vous rendre sur la page suivante et de choisir un nouveau mot de " +"passe :" + +#: core/templates/core/password_reset_email.jinja:8 +msgid "Your username, in case you've forgotten: " +msgstr "Votre nom d'utilisateur, en cas d'oubli :" + +#: core/templates/core/password_reset_email.jinja:10 +msgid "Thanks for using our site! " +msgstr "Merci d'utiliser notre site!" + +#: core/templates/core/password_reset_email.jinja:12 +#, python-format +msgid "The %(site_name)s team" +msgstr "L'équipe de %(site_name)s" + +#: counter/models.py:20 +msgid "account id" +msgstr "numéro de compte" + +#: counter/models.py:24 +msgid "customer" +msgstr "client" + +#: counter/models.py:25 +msgid "customers" +msgstr "clients" + +#: counter/models.py:58 +msgid "purchase price" +msgstr "prix d'achat" + +#: counter/models.py:59 +msgid "selling price" +msgstr "prix de vente" + +#: counter/models.py:60 +msgid "special selling price" +msgstr "prix de vente spécial" + +#: counter/models.py:79 subscription/models.py:29 +msgid "subscription type" +msgstr "type d'inscription" + +#: counter/models.py:81 +msgid "Bar" +msgstr "Bar" + +#: counter/models.py:81 +msgid "Office" +msgstr "Bureau" + +#: counter/models.py:165 +msgid "bank" +msgstr "banque" + +#: counter/models.py:186 +msgid "unit price" +msgstr "prix unitaire" + +#: counter/models.py:187 +msgid "quantity" +msgstr "quantité" + +#: counter/views.py:194 +msgid "END" +msgstr "FIN" + +#: counter/views.py:196 +msgid "CAN" +msgstr "ANN" + +#: sith/settings.py:227 sith/settings.py:234 sith/settings.py:246 +#: sith/settings_sample.py:227 sith/settings_sample.py:234 +#: sith/settings_sample.py:246 +msgid "Check" +msgstr "Chèque" + +#: sith/settings.py:228 sith/settings.py:235 sith/settings.py:247 +#: sith/settings_sample.py:228 sith/settings_sample.py:235 +#: sith/settings_sample.py:247 +msgid "Cash" +msgstr "Espèces" + +#: sith/settings.py:229 sith/settings_sample.py:229 +msgid "Transfert" +msgstr "Virement" + +#: sith/settings.py:230 sith/settings_sample.py:230 +msgid "Credit card" +msgstr "Carte banquaire" + +#: sith/settings.py:236 sith/settings_sample.py:236 +msgid "Other" +msgstr "Autre" + +#: sith/settings.py:260 sith/settings_sample.py:260 +msgid "One semester" +msgstr "Un semestre" + +#: sith/settings.py:265 sith/settings_sample.py:265 +msgid "Two semesters" +msgstr "Deux semestres" + +#: sith/settings.py:270 sith/settings_sample.py:270 +msgid "Common core cursus" +msgstr "Cursus tronc commun" + +#: sith/settings.py:275 sith/settings_sample.py:275 +msgid "Branch cursus" +msgstr "Cursus branche" + +#: sith/settings.py:283 sith/settings_sample.py:283 +msgid "President" +msgstr "Président" + +#: sith/settings.py:284 sith/settings_sample.py:284 +msgid "Vice-President" +msgstr "Vice-Président" + +#: sith/settings.py:285 sith/settings_sample.py:285 +msgid "Treasurer" +msgstr "Trésorier" + +#: sith/settings.py:286 sith/settings_sample.py:286 +msgid "Communication supervisor" +msgstr "Responsable com" + +#: sith/settings.py:287 sith/settings_sample.py:287 +msgid "Secretary" +msgstr "Secrétaire" + +#: sith/settings.py:288 sith/settings_sample.py:288 +msgid "IT supervisor" +msgstr "Responsable info" + +#: sith/settings.py:289 sith/settings_sample.py:289 +msgid "Board member" +msgstr "Membre du bureau" + +#: sith/settings.py:290 sith/settings_sample.py:290 +msgid "Active member" +msgstr "Membre actif" + +#: sith/settings.py:291 sith/settings_sample.py:291 +msgid "Curious" +msgstr "Curieux" + +#: subscription/models.py:13 +msgid "Bad subscription type" +msgstr "Mauvais type de cotisation" + +#: subscription/models.py:17 +msgid "Bad payment method" +msgstr "Mauvais type de paiement" + +#: subscription/models.py:32 +msgid "subscription start" +msgstr "début de la cotisation" + +#: subscription/models.py:33 +msgid "subscription end" +msgstr "fin de la cotisation" + +#: subscription/models.py:47 +msgid "You can not subscribe many time for the same period" +msgstr "Vous ne pouvez pas cotiser plusieurs fois pour la même période" + +#: subscription/models.py:51 +msgid "You are trying to create a subscription without member" +msgstr "Vous essayez de créer une cotisation sans membre" + +#: subscription/views.py:41 +msgid "A user with that email address already exists" +msgstr "Un utilisateur avec cette adresse email existe déjà" + +#: subscription/views.py:56 +msgid "You must either choose an existing user or create a new one properly" +msgstr "" +"Vous devez soit choisir un utilisateur existant, ou en créer un proprement." diff --git a/sith/settings_sample.py b/sith/settings_sample.py index a82b9601..ac8e8340 100644 --- a/sith/settings_sample.py +++ b/sith/settings_sample.py @@ -12,6 +12,7 @@ https://docs.djangoproject.com/en/1.8/ref/settings/ # Build paths inside the project like this: os.path.join(BASE_DIR, ...) import os +from django.utils.translation import ugettext_lazy as _ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) @@ -52,6 +53,7 @@ MIDDLEWARE_CLASSES = ( 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.locale.LocaleMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.security.SecurityMiddleware', 'core.middleware.AuthenticationMiddleware', @@ -152,6 +154,10 @@ USE_L10N = True USE_TZ = True +LOCALE_PATHS = ( + os.path.join(BASE_DIR, "locale"), +) + # Medias MEDIA_ROOT = './data/' MEDIA_URL = '/data/' @@ -218,16 +224,16 @@ SITH_MAIN_BOARD_GROUP=SITH_MAIN_CLUB['unix_name']+SITH_BOARD_SUFFIX SITH_MAIN_MEMBERS_GROUP=SITH_MAIN_CLUB['unix_name']+SITH_MEMBER_SUFFIX SITH_ACCOUNTING_PAYMENT_METHOD = [ - ('cheque', 'Chèque'), - ('cash', 'Espèce'), - ('transfert', 'Virement'), - ('card', 'Carte banquaire'), + ('cheque', _('Check')), + ('cash', _('Cash')), + ('transfert', _('Transfert')), + ('card', _('Credit card')), ] SITH_SUBSCRIPTION_PAYMENT_METHOD = [ - ('cheque', 'Chèque'), - ('cash', 'Espèce'), - ('other', 'Autre'), + ('cheque', _('Check')), + ('cash', _('Cash')), + ('other', _('Other')), ] SITH_COUNTER_BARS = [ @@ -237,8 +243,8 @@ SITH_COUNTER_BARS = [ ] SITH_COUNTER_PAYMENT_METHOD = [ - ('cheque', 'Chèque'), - ('cash', 'Espèce'), + ('cheque', _('Check')), + ('cash', _('Cash')), ] SITH_COUNTER_BANK = [ @@ -251,22 +257,22 @@ SITH_COUNTER_BANK = [ # Subscription durations are in semestres (should be settingized) SITH_SUBSCRIPTIONS = { 'un-semestre': { - 'name': 'Un semestre', + 'name': _('One semester'), 'price': 15, 'duration': 1, }, 'deux-semestres': { - 'name': 'Deux semestres', + 'name': _('Two semesters'), 'price': 28, 'duration': 2, }, 'cursus-tronc-commun': { - 'name': 'Cursus Tronc Commun', + 'name': _('Common core cursus'), 'price': 45, 'duration': 4, }, 'cursus-branche': { - 'name': 'Cursus Branche', + 'name': _('Branch cursus'), 'price': 45, 'duration': 6, }, @@ -274,15 +280,15 @@ SITH_SUBSCRIPTIONS = { } SITH_CLUB_ROLES = { - 10: 'Président', - 9: 'Vice-Président', - 7: 'Trésorier', - 5: 'Responsable com', - 4: 'Secrétaire', - 3: 'Responsable info', - 2: 'Membre du bureau', - 1: 'Membre actif', - 0: 'Curieux', + 10: _('President'), + 9: _('Vice-President'), + 7: _('Treasurer'), + 5: _('Communication supervisor'), + 4: _('Secretary'), + 3: _('IT supervisor'), + 2: _('Board member'), + 1: _('Active member'), + 0: _('Curious'), } # This corresponds to the maximum role a user can freely subscribe to