web-dev-qa-db-fra.com

Comment configurer correctement la traduction de Django?

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

26
frlan

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.

40
Omid Raha

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

4
James J. Ye

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:

  1. préfixe de langue dans l'URL, lors de l'utilisation de i18n_patterns dans URLconf
  2. _language dans la session de l'utilisateur actuel
  3. Cookie Django_language (ou tel que spécifié par settings.LANGUAGE_COOKIE_NAME)
  4. En-tête HTTP Accept-Language (voici les paramètres envoyés par votre navigateur)
  5. paramètres.LANGUAGE_CODE

É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.

2
miraculixx

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

2
Nilesh

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

0
sk1p