Un guide rapide sur la façon de traduire son site Web avec Django:
Modifiez le fichier settings.py
Supposons que nous souhaitons que notre site Web django soit disponible en anglais et en français. Première étape, éditons le fichier settings.py en ajoutant les lignes suivantes:
from django.utils.translation import ugettext_lazy as _
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
LANGUAGES = (
('en-us', _('English')),
('fr', _('French')),
)
LOCALE_PATHS = (
os.path.join(BASE_DIR, 'locale'),
)
ici par défaut le site est en anglais (LANGUAGE_CODE = 'en-us').
Creer un dossier appelé locale
Etape suivante créer un dossier nommé "locale" à la racine du projet django:
mkdir locale
votre projet devrait ressembler à ceci:
locale
myproject/
settings.py
urls.py
myapps/
templates/
models.py
views.py
Modifier les templates
Ensuite, dans tous les templates (par exemple home.html), indiquez le texte que vous souhaitez traduire:
{% trans 'text' %}
par exemples
{% trans 'Hello everyone !' %}
ou
{% trans 'search' %}
Modifier le fichier views.py
Dans le fichier views.py, ajoutez la ligne suivante:
from django.utils.translation import gettext
puis indiquez le texte que vous souhaitez traduire comme ceci
text = gettext("text")
par exemple avec un message d'erreur:
err_msg = gettext("Oups somehting went wrong")
Créer les fichiers de traduction
Nous pouvons maintenant commencer à créer les fichiers de traduction qui seront stockés dans le dossier local que nous avons créé juste au-dessus. Pour cela, il est nécessaire d'installer gettext. L'installation dépend de votre système actuel, par exemple sur mac (voir Comment installer gettext sur MacOS X ) avec homebrew:
brew unlink gettext && brew link --force gettext
Pour vérifier où gettext a été installé (par exemple /usr/local/Cellar/gettext/0.21):
brew info gettext
puis entrez:
PATH="/usr/local/Cellar/gettext/0.21/bin:$PATH"
pour éviter l'erreur suivante lorsque vous essayez de compiler les messages (voir django i18n ne fonctionne pas sous mac ):
CommandError: errors happened while running msguniq
msguniq: Cannot convert from "ASCII" to "UTF-8". msguniq relies on iconv(). This version was built without iconv().
Maintenant, dans votre terminal, allez à la racine de votre projet:
/locale
/myproject
/myapps
et entrez les commandes suivantes:
django-admin.py makemessages -l fr
django-admin compilemessages
Il devrait ensuite créer les fichiers suivants dans le dossier locale:
django.po
django.mo
Editez le fichier .po
Modifiez ensuite le fichier .po pour traduire le texte.
Remarque: pour éditer le fichier .po, il existe des éditeur sde texte comme poedit.
Changer la langue
Deux options (définir la langue dans une vue django, définir explicitement la langue active, Impossible de changer la langue dans django):
Option (1) dans le fichier settings.py changez:
LANGUAGE_CODE = 'en-us'
en
LANGUAGE_CODE = 'fr'
Option (2) dans le fichier views.py ajoutez la ligne suivante
from django.utils import translation
vous pouvez maintenant changer du français
language = 'fr'
translation.activate(language)
ou anglais dans une vue django
language = 'en-us'
translation.activate(language)
Remarque: peut être utile si vous souhaitez laisser le visiteur choisir sa langue préférée. Créez un lien:
/myapps/?language=fr
et dans vue views.py
if 'language' in request.GET and request.GET['language']:
language = request.GET['language']
if language in ['fr','en']:
if language == 'fr':
translation.activate(language)
if language == 'en':
translation.activate(language)
Références
- Translation
- Internationalization and localization
- A Quick Guide to Django i18n
- Django makemessage command not processing app
- Chapter 19: Internationalization
- Getting started with translating a Django Application
- Django i18n: A beginner’s guide
- Django gettext doesn't works
- django-admin.py makemessages not working