From 4226437db709c16e348f7c5d790c5af11c964a50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Vinot?= Date: Sun, 23 Nov 2014 15:40:37 +0100 Subject: [PATCH] Add basic support for localization --- .gitignore | 3 ++ compile_pofiles.sh | 6 ++++ generate_pofiles.sh | 16 ++++++++++ locale/de/LC_MESSAGES/django.po | 52 +++++++++++++++++++++++++++++++++ locale/en/LC_MESSAGES/django.po | 51 ++++++++++++++++++++++++++++++++ locale/fr/LC_MESSAGES/django.po | 52 +++++++++++++++++++++++++++++++++ picampaign/campaign/models.py | 6 ++-- picampaign/contact/models.py | 4 ++- picampaign/feedback/models.py | 6 ++-- picampaign/settings.py.sample | 9 ++++++ 10 files changed, 200 insertions(+), 5 deletions(-) create mode 100755 compile_pofiles.sh create mode 100755 generate_pofiles.sh create mode 100644 locale/de/LC_MESSAGES/django.po create mode 100644 locale/en/LC_MESSAGES/django.po create mode 100644 locale/fr/LC_MESSAGES/django.po diff --git a/.gitignore b/.gitignore index cef7a8f..9667329 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,6 @@ ve/ venv/ .venv/ .env/ + +# Compiled locales +*.mo diff --git a/compile_pofiles.sh b/compile_pofiles.sh new file mode 100755 index 0000000..7dfed34 --- /dev/null +++ b/compile_pofiles.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +set -e +set -x + +./manage.py compilemessages diff --git a/generate_pofiles.sh b/generate_pofiles.sh new file mode 100755 index 0000000..b5310e9 --- /dev/null +++ b/generate_pofiles.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +set -e +set -x + +IGNORE_DIRS='virtenv build' + +ignore='' + +for d in ${IGNORE_DIRS}; do + ignore="${ignore} --ignore=${d}" +done + +./manage.py makemessages -l de ${ignore} +./manage.py makemessages -l fr ${ignore} +./manage.py makemessages -l en ${ignore} diff --git a/locale/de/LC_MESSAGES/django.po b/locale/de/LC_MESSAGES/django.po new file mode 100644 index 0000000..f54366a --- /dev/null +++ b/locale/de/LC_MESSAGES/django.po @@ -0,0 +1,52 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-11-23 15:35+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: picampaign/campaign/models.py:22 picampaign/campaign/models.py:34 +msgid "language" +msgstr "sprache" + +#: picampaign/campaign/models.py:38 +msgid "Argumentary in %(lang) for %(title)" +msgstr "" + +#: picampaign/campaign/models.py:50 +msgid "Contact %(ccontact) on %(title)" +msgstr "" + +#: picampaign/contact/models.py:16 +#, python-format +msgid "%(firstname) %(lastname)" +msgstr "" + +#: picampaign/feedback/models.py:14 +msgid "feedback for %(callee contact) on %(campaign title)" +msgstr "" + +#: picampaign/settings.py:78 +msgid "English" +msgstr "Englisch" + +#: picampaign/settings.py:79 +msgid "German" +msgstr "Deutsch" + +#: picampaign/settings.py:80 +msgid "French" +msgstr "Französisch" diff --git a/locale/en/LC_MESSAGES/django.po b/locale/en/LC_MESSAGES/django.po new file mode 100644 index 0000000..ed7e791 --- /dev/null +++ b/locale/en/LC_MESSAGES/django.po @@ -0,0 +1,51 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-11-23 15:35+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: picampaign/campaign/models.py:22 picampaign/campaign/models.py:34 +msgid "language" +msgstr "language" + +#: picampaign/campaign/models.py:38 +msgid "Argumentary in %(lang) for %(title)" +msgstr "" + +#: picampaign/campaign/models.py:50 +msgid "Contact %(ccontact) on %(title)" +msgstr "" + +#: picampaign/contact/models.py:16 +#, python-format +msgid "%(firstname) %(lastname)" +msgstr "" + +#: picampaign/feedback/models.py:14 +msgid "feedback for %(callee contact) on %(campaign title)" +msgstr "" + +#: picampaign/settings.py:78 +msgid "English" +msgstr "" + +#: picampaign/settings.py:79 +msgid "German" +msgstr "" + +#: picampaign/settings.py:80 +msgid "French" +msgstr "" diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po new file mode 100644 index 0000000..0534b52 --- /dev/null +++ b/locale/fr/LC_MESSAGES/django.po @@ -0,0 +1,52 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-11-23 15:35+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: picampaign/campaign/models.py:22 picampaign/campaign/models.py:34 +msgid "language" +msgstr "langue" + +#: picampaign/campaign/models.py:38 +msgid "Argumentary in %(lang) for %(title)" +msgstr "" + +#: picampaign/campaign/models.py:50 +msgid "Contact %(ccontact) on %(title)" +msgstr "" + +#: picampaign/contact/models.py:16 +#, python-format +msgid "%(firstname) %(lastname)" +msgstr "" + +#: picampaign/feedback/models.py:14 +msgid "feedback for %(callee contact) on %(campaign title)" +msgstr "" + +#: picampaign/settings.py:78 +msgid "English" +msgstr "Anglais" + +#: picampaign/settings.py:79 +msgid "German" +msgstr "Allemand" + +#: picampaign/settings.py:80 +msgid "French" +msgstr "Francais" diff --git a/picampaign/campaign/models.py b/picampaign/campaign/models.py index 2836ff8..6d3240b 100644 --- a/picampaign/campaign/models.py +++ b/picampaign/campaign/models.py @@ -35,7 +35,8 @@ class Argumentary(models.Model): text = models.TextField(null=True) def __unicode__(self): - return 'Argumentary in %s for %s' % (self.lang, self.campaign.title) + return _('Argumentary in %(lang) for %(title)') % {'lang': self.lang, + 'title': self.campaign.title} class CampaignContact(models.Model): @@ -46,7 +47,8 @@ class CampaignContact(models.Model): weight = models.IntegerField(default=0) def __unicode__(self): - return 'Contact %s on %s' % (self.contact, self.campaign.title) + return _('Contact %(ccontact) on %(title)') % {'contact': self.contact, + 'title': self.campaign.title} def all_groups(self): return [x.name for x in self.contact.groups.all()] diff --git a/picampaign/contact/models.py b/picampaign/contact/models.py index 8894c1a..8a4c369 100644 --- a/picampaign/contact/models.py +++ b/picampaign/contact/models.py @@ -1,4 +1,5 @@ from django.db import models +from django.utils.translation import ugettext_lazy as _ class Contact(models.Model): @@ -12,4 +13,5 @@ class Contact(models.Model): photo = models.ImageField(upload_to='contacts/photos', blank=True) def __unicode__(self): - return '%s %s' % (self.first_name, self.last_name) + return _('%(firstname) %(lastname)') % {'firstname': self.first_name, + 'lastname': self.last_name} diff --git a/picampaign/feedback/models.py b/picampaign/feedback/models.py index 826772c..c669209 100644 --- a/picampaign/feedback/models.py +++ b/picampaign/feedback/models.py @@ -1,6 +1,7 @@ from django.db import models from picampaign.campaign.models import CampaignContact from picampaign.organization.models import FeedbackCategory +from django.utils.translation import ugettext_lazy as _ class Feedback(models.Model): @@ -10,5 +11,6 @@ class Feedback(models.Model): comment = models.CharField(max_length=512, blank=True) def __unicode__(self): - return 'feedback for %s on %s' % (self.callee.contact, - self.callee.campaign.title) + return _('feedback for %(callee contact) on %(campaign title)') % \ + {'callee contact': self.callee.contact, + 'campaign title': self.callee.campaign.title} diff --git a/picampaign/settings.py.sample b/picampaign/settings.py.sample index 59a68ec..cdf4504 100644 --- a/picampaign/settings.py.sample +++ b/picampaign/settings.py.sample @@ -10,6 +10,7 @@ https://docs.djangoproject.com/en/1.7/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(__file__)) @@ -45,6 +46,7 @@ INSTALLED_APPS = ( MIDDLEWARE_CLASSES = ( 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.locale.LocaleMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', @@ -71,6 +73,12 @@ DATABASES = { # Internationalization # https://docs.djangoproject.com/en/1.7/topics/i18n/ +LANGUAGES = ( + ('en', _('English')), + ('de', _('German')), + ('fr', _('French')), +) + LANGUAGE_CODE = 'fr-FR' TIME_ZONE = 'Europe/Paris' @@ -86,6 +94,7 @@ USE_TZ = True # https://docs.djangoproject.com/en/1.7/howto/static-files/ STATIC_URL = '/static/' +STATIC_ROOT = os.path.join(BASE_DIR, 'static') #REST_FRAMEWORK = { # 'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAdminUser',), -- GitLab