Question Comment configurer correctement la traduction Django?


J'ai un problème avec les traductions ne fonctionnant pas sur Django 1.6 !. J'ai ajouté à mes paramètres.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 templates commençant par

{% extends "base.html" %}
{% load i18n %}

et à l'intérieur du modèle que j'ai utilisé le trans placeholder. Par exemple.

<h1>{% trans "Register a tank" %}</h1>

En fait, la chaîne apparaît à l’intérieur de locale / de / LC_MESSAGES / django.po lors de son exécution. Je les ai traduites. Par exemple.

msgid "Register a tank"
msgstr "Einen neuen Tank anmelden"

Mon navigateur est configuré pour demander d'abord du contenu allemand: Paramètres du navigateur

Qu'est-ce que j'ai raté?

P.S. Le projet que je vois actuellement est hébergé sur github: https://github.com/frlan/blankspot


23
2017-12-09 09:55


origine


Réponses:


Ajouter le LOCALE_PATHS à settings.py et le définir comme ci-dessous:

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 locale Le dossier doit être à la racine de votre projet.

Et assurez-vous que vous courez django-admin.py makemessages -l de et django-admin.py compilemessages cmds de la racine de votre projet.

djPrj
  |
  +---> djPrj
  |
  +---> djApp
  |
  +---> locale
  |
  +---> templates

Réorganisez également votre MIDDLEWARE_CLASSES être 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érifier à nouveau.


Juste pour vous assurer que votre localisation est appliquée à votre page d'administration django par défaut django.mo fichier de django, faites le test suivant:

Premier en principal urls.py de projet remplacer patterns avec i18n_patterns:

from django.conf.urls.i18n import i18n_patterns

urlpatterns = i18n_patterns('',
    url(r'^admin/', include(admin.site.urls)),
    # ...
)

Maintenant allez à Admin page avec de préfixe, comme: http://127.0.0.1:8000/de/admin/ Et Admin la page doit apparaître dans German la langue.

Ok, tu peux voir Admin page de django dans de la langue ?

Vérifiez également votre vue avec de préfixe aussi.


Selon votre code de projet, certaines phrases ne sont pas en bloc trans. mettez-les comme:

{% trans "your sentence" %}

Aussi, vous devez utiliser ugettext_lazy au lieu de ugettext dans votre code pour les vues et les modèles, (lis  ici)

remplacez ceci:

from django.utils.translation import ugettext as _ 

avec:

from django.utils.translation import ugettext_lazy as _

Et maintenant, tout fonctionnera.


36
2018-01-02 23:22



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
2017-10-09 07:20



S'il vous plaît définir translated string dans django.po et ensuite 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 django-rosetta paquet à ajouter translated string depuis l'interface utilisateur. Il est facile d'ajouter une chaîne de caractères à partir de django-admin. https://github.com/mbi/django-rosetta


2
2017-12-09 10:32



Vérifiez les cookies et la session - selon Comment Django découvre la préférence linguistique, le processus est le suivant:

  1. préfixe de langue dans l'URL, lors de l'utilisation de i18n_patterns dans URLconf
  2. _language clé dans la session de l'utilisateur actuel
  3. cookie django_language (ou comme spécifié par settings.LANGUAGE_COOKIE_NAME)
  4. En-tête HTTP Accept-Language (c'est ce que le paramétrage de votre navigateur envoie)
  5. settings.LANGUAGE_CODE

Comme les paramètres de votre navigateur sont définis 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
2018-01-03 22:53



Tu dois activer le LocaleMiddleware dans vos paramètres, pour dire à Django de faire une détection de langage basée sur les paramètres du navigateur. Changer vos préférences de langue définit efficacement le Accept-Language entête. Vous devrez peut-être archiver une fenêtre de navigation privée, car les autres moyens de détection de la langue ont une priorité plus élevée, comme la session de l'utilisateur et la django_language biscuit.


0
2018-01-02 01:36