J'ai un problème avec les traductions qui ne fonctionnent pas sur Django 1.6 !. J'ai ajouté à mes settings.py
LANGUAGE_CODE = 'en-us'
ugettext = lambda s: s
LANGUAGES = (
('en', ugettext('English')),
('de', ugettext('German')),
)
Middlewares également ajoutés:
MIDDLEWARE_CLASSES = (
'Django.middleware.common.CommonMiddleware',
'Django.contrib.sessions.middleware.SessionMiddleware',
'Django.middleware.csrf.CsrfViewMiddleware',
'Django.contrib.auth.middleware.AuthenticationMiddleware',
'Django.contrib.messages.middleware.MessageMiddleware',
'Django.middleware.locale.LocaleMiddleware',
'Django.middleware.clickjacking.XFrameOptionsMiddleware',
)
ainsi qu'à mes fichiers * .py chaque fois que j'utilise une chaîne qui doit être l10nd:
from Django.utils.translation import ugettext_lazy as _
Mes modèles commençant par
{% extends "base.html" %}
{% load i18n %}
et à l'intérieur du modèle que j'ai utilisé l'espace réservé trans. Par exemple.
<h1>{% trans "Register a tank" %}</h1>
En fait, la chaîne apparaît dans les paramètres régionaux/de/LC_MESSAGES/Django.po lors de l'exécution, mais je les ai traduits. Par exemple.
msgid "Register a tank"
msgstr "Einen neuen Tank anmelden"
Mon navigateur est configuré pour demander le contenu en allemand en premier: Paramètres du navigateur
Qu'est-ce que j'ai raté?
P.S. Le projet en cours de réalisation est hébergé sur github: https://github.com/frlan/blankspot
Ajoutez le LOCALE_PATHS
à settings.py
et définissez-le comme suit:
Notez que LOCALE_PATHS
doit être un tuple (regardez la virgule à la fin du chemin)
import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
LOCALE_PATHS = (
os.path.join(BASE_DIR, 'locale'),
)
Maintenant basé sur LOCALE_PATHS
, le dossier locale
devrait être à la racine de votre projet.
Et assurez-vous que vous exécutez Django-admin.py makemessages -l de
et Django-admin.py compilemessages
cmds à partir de la racine de votre projet.
djPrj
|
+---> djPrj
|
+---> djApp
|
+---> locale
|
+---> templates
Réarrangez également votre MIDDLEWARE_CLASSES
pour qu'il soit LocaleMiddleware
après SessionMiddleware
et avant CommonMiddleware
qui a mentionné ici :
MIDDLEWARE_CLASSES = (
'Django.contrib.sessions.middleware.SessionMiddleware',
'Django.middleware.locale.LocaleMiddleware',
'Django.middleware.common.CommonMiddleware',
'Django.middleware.csrf.CsrfViewMiddleware',
'Django.contrib.auth.middleware.AuthenticationMiddleware',
'Django.contrib.messages.middleware.MessageMiddleware',
'Django.middleware.clickjacking.XFrameOptionsMiddleware',
)
Redémarrez votre service (python manage.py runserver
) et vérifiez à nouveau.
Juste pour vous assurer que votre localisation est appliquée à votre page d'administration Django avec le fichier Django.mo
par défaut de Django, effectuez le test suivant:
Premier dans le urls.py
principal du projet, remplacez patterns
par i18n_patterns
:
from Django.conf.urls.i18n import i18n_patterns
urlpatterns = i18n_patterns('',
url(r'^admin/', include(admin.site.urls)),
# ...
)
Maintenant, allez à la page Admin
avec le préfixe de
, comme: http://127.0.0.1:8000/de/admin/
Et la page Admin
devrait apparaître dans la langue German
.
Ok, pouvez-vous voir la page Admin
de Django en de
langue?
Vérifiez également votre vue avec le préfixe de
.
Selon votre code de projet , certaines phrases ne sont pas en bloc trans. mettez-les comme:
{% trans "your sentence" %}
Vous devez également utiliser ugettext_lazy
au lieu de ugettext dans votre code pour les vues et les modèles, ( lireici )
remplacez ceci:
from Django.utils.translation import ugettext as _
avec:
from Django.utils.translation import ugettext_lazy as _
Et maintenant tout va marcher.
Dans mon cas, j'ai utilisé en-gb comme paramètre pour exécuter
Django-admin.py makemessages -l en-gb
Au lieu de cela, il devrait être en_GB.
Django-admin.py makemessages -l en_GB
Vérifiez les cookies et la session - en fonction de Comment Django découvre les préférences de langue , la procédure est la suivante:
Étant donné que les paramètres de votre navigateur sont configurés pour préférer "de", je suppose que LocaleMiddleware doit en décider autrement dans l'une des étapes précédentes 1. - 3.
Veuillez définir translated string
dans Django.po
puis utiliser python manage.py compilemessages
for e.g
#: path/to/python/module.py:23
msgid "Welcome to my site."
msgstr "put appropriate translated string here"
Suggestion-: Vous pouvez utiliser le package Django-rosetta
pour ajouter translated string
à partir de l'interface utilisateur. Il est facile d'ajouter une chaîne de caractères depuis Django-admin. https://github.com/mbi/Django-rosetta
Vous devez activer la variable LocaleMiddleware
dans vos paramètres pour indiquer à Django de détecter les langues en fonction des paramètres du navigateur. Changer vos préférences de langue définit effectivement l'en-tête Accept-Language
. Vous devrez peut-être vérifier dans une fenêtre de navigation privée, car les autres moyens de détection de la langue ont une priorité plus élevée, tels que la session de l'utilisateur et le cookie Django_language
.