From 8afd6dec6e925cbd158de86c50c60a68fa0246aa Mon Sep 17 00:00:00 2001 From: Olivier DOSSMANN Date: Thu, 24 Aug 2017 22:36:55 +0200 Subject: [PATCH] =?UTF-8?q?Traduction=20de=20l'interface=20en=20Fran=C3=A7?= =?UTF-8?q?ais?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TODO | 1 - .../locale/fr/LC_MESSAGES/django.po | 26 +++++ collection/collection/settings.py | 16 ++- .../conf/locale/fr/LC_MESSAGES/django.po | 102 ++++++++++++++++++ collection/core/models.py | 19 ++-- .../0003_add_verbose_translatable_names.py | 74 +++++++++++++ collection/games/models.py | 14 +++ 7 files changed, 243 insertions(+), 9 deletions(-) create mode 100644 collection/collection/locale/fr/LC_MESSAGES/django.po create mode 100644 collection/conf/locale/fr/LC_MESSAGES/django.po create mode 100644 collection/games/migrations/0003_add_verbose_translatable_names.py diff --git a/TODO b/TODO index faca4df..988633a 100644 --- a/TODO +++ b/TODO @@ -1,6 +1,5 @@ # À faire - * traduction de l'interface pour l'avoir en Français de base * tester django-split-settings pour voir ce que ça donne * étudier la possibilité à l'utilisateur, via des variables d'environnement, de configurer un email, une autre BDD, etc. diff --git a/collection/collection/locale/fr/LC_MESSAGES/django.po b/collection/collection/locale/fr/LC_MESSAGES/django.po new file mode 100644 index 0000000..176123b --- /dev/null +++ b/collection/collection/locale/fr/LC_MESSAGES/django.po @@ -0,0 +1,26 @@ +# OpenBackloggery. +# Copyright (C) 2017 +# This file is distributed under the same license as the openbackloggery package. +# Olivier DOSSMANN , 2017. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 0.1\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-08-24 22:23+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Olivier DOSSMANN \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: collection/settings.py:114 +msgid "French" +msgstr "Français" + +#: collection/settings.py:115 +msgid "English" +msgstr "Anglais" diff --git a/collection/collection/settings.py b/collection/collection/settings.py index e47a413..744e7a3 100644 --- a/collection/collection/settings.py +++ b/collection/collection/settings.py @@ -11,6 +11,8 @@ https://docs.djangoproject.com/en/1.11/ref/settings/ """ import os +from django.utils.translation import ugettext_lazy as _ + # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) @@ -44,6 +46,7 @@ INSTALLED_APPS = [ MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.locale.LocaleMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', @@ -105,7 +108,12 @@ AUTH_PASSWORD_VALIDATORS = [ # Internationalization # https://docs.djangoproject.com/en/1.11/topics/i18n/ -LANGUAGE_CODE = 'en-us' +LANGUAGE_CODE = 'fr' + +LANGUAGES = ( + ('fr', _('French')), + ('en', _('English')), +) TIME_ZONE = 'UTC' @@ -123,3 +131,9 @@ STATIC_URL = '/static/' STATIC_ROOT = os.path.join(os.path.abspath(os.path.curdir), 'static') if os.getenv('STATIC_ROOT', None): STATIC_ROOT = os.path.abspath(os.getenv('STATIC_ROOT')) + +# Translation directories +LOCALE_PATHS = [ + os.path.join(BASE_DIR, 'conf/locale'), + os.path.join(BASE_DIR, 'collection/locale') +] diff --git a/collection/conf/locale/fr/LC_MESSAGES/django.po b/collection/conf/locale/fr/LC_MESSAGES/django.po new file mode 100644 index 0000000..888633e --- /dev/null +++ b/collection/conf/locale/fr/LC_MESSAGES/django.po @@ -0,0 +1,102 @@ +# OpenBackloggery. +# Copyright (C) 2017 +# This file is distributed under the same license as the openbackloggery package. +# Olivier DOSSMANN , 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: 0.1\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-08-24 22:23+0200\n" +"PO-Revision-Date: 2017-08-24 22:28+0200\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Last-Translator: \n" +"Language-Team: \n" +"X-Generator: Poedit 2.0.3\n" + +#: core/models.py:7 core/models.py:28 +msgid "name" +msgstr "nom" + +#: core/models.py:24 +msgid "New" +msgstr "Nouveau" + +#: core/models.py:48 core/models.py:80 +msgid "status" +msgstr "état" + +#: core/models.py:65 +msgid "date" +msgstr "date" + +#: games/models.py:14 games/models.py:24 +msgid "console" +msgstr "console" + +#: games/models.py:15 +msgid "consoles" +msgstr "consoles" + +#: games/models.py:35 +msgid "Beaten" +msgstr "Terminé (quête principale)" + +#: games/models.py:36 +msgid "Completed" +msgstr "Terminé complètement" + +#: games/models.py:37 +msgid "Excluded" +msgstr "Exclu" + +#: games/models.py:38 +msgid "Mastered" +msgstr "Usé / Épuisé" + +#: games/models.py:39 +msgid "Unfinished" +msgstr "Inachevé" + +#: games/models.py:46 +msgid "playing?" +msgstr "en train d'y jouer ?" + +#: games/models.py:47 +msgid "You're currently playing this game." +msgstr "Vous jouez actuellement à ce jeu." + +#: games/models.py:50 +msgid "unplayed?" +msgstr "jamais joué ?" + +#: games/models.py:51 +msgid "You never played this game." +msgstr "Vous n'avez jamais joué à ce jeu." + +#: games/models.py:54 +msgid "wish?" +msgstr "envie de l'avoir ?" + +#: games/models.py:55 +msgid "You're waiting X-mas father offers you this game." +msgstr "Vous patientez que le père Noël vous offre ce jeu." + +#: games/models.py:59 +msgid "game" +msgstr "jeu" + +#: games/models.py:60 +msgid "games" +msgstr "jeux" + +#: games/models.py:70 +msgid "Timeline" +msgstr "Chronologie" + +#: games/models.py:71 +msgid "Timelines" +msgstr "Chronologies" diff --git a/collection/core/models.py b/collection/core/models.py index e84d149..d8079fe 100644 --- a/collection/core/models.py +++ b/collection/core/models.py @@ -4,7 +4,7 @@ from django.utils.translation import ugettext as _ class Collection(models.Model): - name = models.CharField(max_length=255) + name = models.CharField(max_length=255, verbose_name=_('name')) def __str__(self): return '%s' % self.name @@ -25,7 +25,7 @@ class Item(models.Model): ) DEFAULT_CHOICE = CREATED - name = models.CharField(max_length=255) + name = models.CharField(max_length=255, verbose_name=_('name')) def __str__(self): return '%s' % self.name @@ -39,12 +39,13 @@ class Item(models.Model): target_field = models.ForeignKey( cls.TARGET_MODEL, related_name=cls.RELATED_TARGET_NAME, - verbose_name=cls.TARGET_VERBOSE_NAME) + verbose_name=_(cls.TARGET_VERBOSE_NAME)) target_field.contribute_to_class(cls, 'collection') status_field = models.CharField( max_length=30, choices=Item.STATUS_CHOICES + cls.STATUS_CHOICES, - default=cls.DEFAULT_CHOICE) + default=cls.DEFAULT_CHOICE, + verbose_name=_('status')) status_field.contribute_to_class(cls, 'status') class Meta: @@ -58,21 +59,25 @@ class Timeline(models.Model): For an example, a game cretion date. Or when you completed a game. """ TARGET_MODEL = None + TARGET_VERBOSE_NAME = None STATUS_CHOICES = Item.STATUS_CHOICES DEFAULT_CHOICE = Item.CREATED - date = models.DateTimeField(default=datetime.now) + date = models.DateTimeField(default=datetime.now, verbose_name=_('date')) @classmethod def on_class_prepared(cls): """ Add new field 'item' which is a link to TARGET_MODEL """ - target_field = models.ForeignKey(cls.TARGET_MODEL) + target_field = models.ForeignKey( + cls.TARGET_MODEL, + verbose_name=_(cls.TARGET_VERBOSE_NAME)) target_field.contribute_to_class(cls, 'item') status_field = models.CharField( max_length=30, choices=Item.STATUS_CHOICES + cls.STATUS_CHOICES, - default=cls.DEFAULT_CHOICE) + default=cls.DEFAULT_CHOICE, + verbose_name=_('status')) status_field.contribute_to_class(cls, 'status') def __str__(self): diff --git a/collection/games/migrations/0003_add_verbose_translatable_names.py b/collection/games/migrations/0003_add_verbose_translatable_names.py new file mode 100644 index 0000000..92e6a26 --- /dev/null +++ b/collection/games/migrations/0003_add_verbose_translatable_names.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11 on 2017-08-24 20:22 +from __future__ import unicode_literals + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('games', '0002_auto_20170824_1843'), + ] + + operations = [ + migrations.AlterModelOptions( + name='console', + options={'verbose_name': 'console', 'verbose_name_plural': 'consoles'}, + ), + migrations.AlterModelOptions( + name='game', + options={'ordering': ('-playing', 'name'), 'verbose_name': 'game', 'verbose_name_plural': 'games'}, + ), + migrations.AlterModelOptions( + name='timeline', + options={'verbose_name': 'Timeline', 'verbose_name_plural': 'Timelines'}, + ), + migrations.AlterField( + model_name='console', + name='name', + field=models.CharField(max_length=255, verbose_name='nom'), + ), + migrations.AlterField( + model_name='game', + name='name', + field=models.CharField(max_length=255, verbose_name='nom'), + ), + migrations.AlterField( + model_name='game', + name='playing', + field=models.BooleanField(default=False, help_text="You're currently playing this game.", verbose_name='playing?'), + ), + migrations.AlterField( + model_name='game', + name='status', + field=models.CharField(choices=[('created', 'New'), ('beaten', 'Beaten'), ('completed', 'Completed'), ('excluded', 'Excluded'), ('mastered', 'Mastered'), ('unfinished', 'Unfinished')], default='unfinished', max_length=30, verbose_name='status'), + ), + migrations.AlterField( + model_name='game', + name='unplayed', + field=models.BooleanField(default=False, help_text='You never played this game.', verbose_name='unplayed?'), + ), + migrations.AlterField( + model_name='game', + name='wish', + field=models.BooleanField(default=False, help_text="You're waiting X-mas father offers you this game.", verbose_name='wish?'), + ), + migrations.AlterField( + model_name='timeline', + name='date', + field=models.DateTimeField(default=datetime.datetime.now, verbose_name='date'), + ), + migrations.AlterField( + model_name='timeline', + name='item', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='games.Game', verbose_name='game'), + ), + migrations.AlterField( + model_name='timeline', + name='status', + field=models.CharField(choices=[('created', 'New'), ('beaten', 'Beaten'), ('completed', 'Completed'), ('excluded', 'Excluded'), ('mastered', 'Mastered'), ('unfinished', 'Unfinished')], default='created', max_length=30, verbose_name='status'), + ), + ] diff --git a/collection/games/models.py b/collection/games/models.py index 51a8cfc..68a5fd1 100644 --- a/collection/games/models.py +++ b/collection/games/models.py @@ -10,6 +10,10 @@ class Console(Collection): def __str__(self): return '%s' % self.name + class Meta: + verbose_name = _('console') + verbose_name_plural = _('consoles') + class Game(Item): """ @@ -39,19 +43,29 @@ class Game(Item): # others playing = models.BooleanField( default=False, + verbose_name=_('playing?'), help_text=_('You\'re currently playing this game.')) unplayed = models.BooleanField( default=False, + verbose_name=_('unplayed?'), help_text=_('You never played this game.')) wish = models.BooleanField( default=False, + verbose_name=_('wish?'), help_text=_('You\'re waiting X-mas father offers you this game.')) class Meta: ordering = ('-playing', 'name') + verbose_name = _('game') + verbose_name_plural = _('games') class Timeline(BaseTimeline): TARGET_MODEL = 'games.Game' + TARGET_VERBOSE_NAME = 'game' STATUS_CHOICES = Game.STATUS_CHOICES DEFAULT_CHOICE = Item.DEFAULT_CHOICE + + class Meta: + verbose_name = _('Timeline') + verbose_name_plural = _('Timelines')