django - comment faire fonctionner la traduction?

j'essaie de rendre un modèle dans une autre langue en utilisant i18n. J'ai fait tout ce que j'ai pu lire, depuis la définition du code de langue, la création et la compilation des fichiers de traduction, y compris les balises de traduction dans le modèle et tout ça, et mon modèle rend toujours en anglais, même à travers les points variables {LANGUAGE_CODE} vers le code correct (et différent) que j'avais l'intention de rendre. Ce qui me manque?

modèle:

{% extends "base.html" %}
{% load i18n %}
{% get_current_language as LANGUAGE_CODE %}
{% get_available_languages as LANGUAGES %}
{% get_current_language_bidi as LANGUAGE_BIDI %}
{% block title %}{% trans "translation test" %}{% endblock %}
{% block content %}
<div id="some-text">
  {% trans "some translated text goes here" %}
  {% blocktrans %}
  <ol>
    <li>here are some</li>
    <li>items that should be</li>
    <li>translated as well</li>
  </ol>
  {% endblocktrans %}
  <ul>
      <li>The current language is <b>{{ LANGUAGE_CODE }}</b></li>
      {% if LANGUAGE_BIDI %}
        <li>The current language is bidirectional</li>
      {% else %}
        <li>The current language is <b>not</b> bidirectional</li>
      {% endif %}
      <li>Available languages are:
        <ul>
        {% for lang in LANGUAGES %}
          <li>{{ lang.1}}</li>
        {% endfor %}
        </ul>
      </li>
  </ul>
</div>
{% endblock %}

:

from django.shortcuts import render_to_response
from django.template import RequestContext
from pdb import set_trace as debugger
def check(request):
    return render_to_response('index.html', context_instance=RequestContext(request)

ligne de commande (j'ai rempli les bonnes traductions .les fichiers po):

$ django-admin.py makemessages -l he-il -e html
$ django-admin.py compilemessages

settings.py:

# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE = 'he-il'

gettext = lambda s: s
LANGUAGES = (
    ('he-il', gettext('Hebrew')),
    ('en-us', gettext('English')),
)

# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
USE_I18N = True

TEMPLATE_CONTEXT_PROCESSORS = (
    "django.core.context_processors.auth",
    "django.core.context_processors.i18n",
)

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
)
30
demandé sur sa125 2009-12-02 15:49:20

9 réponses

il suffit d'ajouter les chemins des fichiers locaux générés dans le fichier settings.py comme le suivant

LOCALE_PATHS = ( "/xxx/xxx/Projects/xxx/sites/avb/locale/",)
64
répondu AbuFida 2011-10-03 16:03:32

j'ai peut - être tort - car la seule fois où j'ai utilisé des traductions était sur un projet de test il y a de nombreuses lunes-mais je pense que vous ne voulez pas cela:

$ django-admin.py makemessages -l he-il -e html

mais plutôt ceci:

$ django-admin.py makemessages -l he_il -e html

remarquez le trait de soulignement dans he_il .

j'avais des problèmes avec pt-BR aussi, jusqu'à ce que je fasse le fichier de messages avec pt_br à la place. Puis les choses ont commencé à travailler...

Oui, ce n'est pas évident et je n'ai pu trouver de documentation à ce sujet nulle part.

Espère que ça aide.

20
répondu cethegeek 2009-12-02 14:45:27

c'est une solution complète que J'ai utilisé de Django 1.4 et toujours en 1.7.1:

settings.py ...

ajouter à MIDDLEWEAR_CLASSES, locale, il permet la sélection de langue basée sur la demande:

'django.middleware.locale.LocaleMiddleware',

ajouter LOCALE_PATHS, c'est ici que vos fichiers de traduction seront stockés:

LOCALE_PATHS = (
    os.path.join(PROJECT_PATH, 'locale/'),
)

Enable I18N:

USE_I18N = True    

définissez les langues que vous traduit le site en:

ugettext = lambda s: s
LANGUAGES = (
    ('en', ugettext('English')),
    ('fr', ugettext('French')),
    ('pl', ugettext('Polish')),
)

ajoute i18n template context processor à TEMPLATE_CONTEXT_PROCESSORS, les requêtes incluront désormais LANGUAGES and LANGUAGE_CODE:

'django.core.context_processors.i18n',

urls.py :

dans url_patterns, ajouter le ci-dessous, il permettra à la langue définie redirect view:

url(r'^i18n/', include('django.conf.urls.i18n')),

Voir Divers 1519320920" Traductions pour en savoir plus sur cette.

ajoutez les importations suivantes, et encapsulez les urls que vous voulez traduire avec i18n_patterns. Voici à quoi ressemble le mien:

from django.conf.urls.i18n import i18n_patterns
from django.utils.translation import ugettext_lazy as _

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    url(r'^i18n/', include('django.conf.urls.i18n')),
)

urlpatterns += i18n_patterns('',
    (_(r'^dual-lang/'), include('duallang.urls')),
    (r'^', include('home.urls')),
)

maintenant, partout où vous utilisez du texte et que vous voulez le convertir, importer lazytext et envelopper chaque chaîne avec elle comme si _('texte'), vous pouvez même aller à votre autre urls.py fichiers et faire la traduction d'url comme cela:

url(_(r'^dual_language/$'), landing, name='duallang_landing'),

vous pouvez envelopper le texte que vous voulez traduit dans vos autres dossiers, tel comme models.py, views.py etc.. Voici un exemple de champ model avec des traductions pour label et help_text:

name = models.CharField(_('name'), max_length=255, unique=True, help_text=_("Name of the FAQ Topic"))

dans vos modèles html...

faites la même chose pour vos gabarits et chargez le i18n templatetag et utilisez trans et transblock sur les trucs statiques que vous voulez traduire. Voici un exemple:

{% load i18n %}

{% trans "This is a translation" %}<br><br>
{% blocktrans with book_t='book title'|title author_t='an author'|title %}
This is {{ book_t }} by {{ author_t }}. Block trans is powerful!
{% endblocktrans %}

exécutez maintenant un makemessages pour chacun de vos emplacements:

./manage.py makemessages -l pl

et maintenant tout ce qui reste est d'aller dans votre dossier /locales, et d'éditer chacun des .les fichiers po. Remplissez les données pour chaque msgstr. En voici un exemple:

msgid "English"
msgstr "Angielski"

et enfin compiler les messages:

./manage.py compilemessages

pour la traduction de données d'instance de modèle vous pouvez utiliser certains des paquets réutilisables disponibles comme

Il ya beaucoup plus à apprendre avec des traductions et internationalisation est étroitement liée à ce sujet, alors consultez les docs pour elle aussi. Je recommande également de vérifier certains des paquets d'internationalisation disponibles pour Django comme django-rosetta , et django-linguo . Django-rosetta ne crée pas de nouvelles entrées pour cela dans votre base de données, contrairement à django-linguo.

Si vous avez suivi, vous devez être un bon début. Je crois que c'est le plus mode standardisé pour faire fonctionner votre site dans plusieurs langues. Acclamations!

18
répondu radtek 2014-10-23 01:51:20

j'ai le même problème. Mais je le résous en mettant "Language:" to .fichier po. Dans mon cas .le fichier po ne contient pas l'attribut" Language:", il ressemble...

"Language-Team: LANGUAGE \n"
"Language: \n"
"MIME-Version: 1.0\n"

mais quand je mets le code de langue (dans mon cas 'ru' ou 'en')

"Language-Team: LANGUAGE \n"
"Language: ru\n"
"MIME-Version: 1.0\n"

ça marche pour moi

14
répondu serg666_2000 2012-10-10 18:35:02

j'ai eu les mêmes problèmes, il semble que vos paramètres régionaux chemin ont fin par une barre oblique :

LOCALE_PATHS = (
    '/dir/to/my/locale/', 
)
4
répondu Benoit Vanalderweireldt 2014-01-16 10:19:40

la façon dont je l'ai fait est en utilisant le code de langue exacte que django utilise dans ses propres fichiers de traduction (et non par le lien fourni à l'intérieur settings.py), en supposant que cette langue est prise en charge (si ce n'est pas compliqué, puisque vous devez fournir vos propres fichiers de traduction à django).

j'ai trouvé ce code en allant à $ DJANGO_DIR / conf / locale et en regardant le nom du dossier (pour moi, c'était à /usr/local/lib / python2.6 / dist-packages/django/conf / locale, mais elle peut différer selon L'OS et tel).

2
répondu sa125 2009-12-24 09:51:30

j'avais le même problème, j'ai essayé de passer ma langue et django dit pas d'aller. Pas d'erreur, pas d'avertissement, mais django commutation de langue à pl-pl (dans mon cas). Cependant, supprimer tous les dossiers de locale et exécuter la commande: django-admin.py makemessages-l pl_PL (souligné au lieu de tiret et lettre majuscule pour la deuxième PL, travaillé ce numéro).

j'espère que ça aidera certains gars là-bas.

1
répondu Drachenfels 2009-12-22 23:39:41

Oui, vous avez besoin de faire des fichiers de messages que celopes suggère et puis les compiler

python manage.py compilemessages

Mais vous aurez toujours un problème.

désactiver LocaleMiddleware pour un bit, i.e. supprimer ce

django.middleware.locale.LocaleMiddleware

de votre liste middleware. Ne l'utilisez pas si vous n'avez pas besoin de changer la langue au moment de l'exécution, mais si vous en avez besoin, alors il y a une solution 1519100920". J'ai eu le même problème avant et quelqu'un m'a expliqué cela.

aussi j'ai eu ce problème bizarre avant. La commande Makemessages s'étouffe sur les cordes enveloppées de backslash .les dossiers py.

1
répondu Evgeny 2017-05-23 12:26:26

j'ai eu le même problème. Je l'ai expliqué en détail dans ce lien sous une autre question similaire .

brièvement, mon problème a été résolu en rechargeant le serveur avec ce code:

sudo /etc/init.d/uwsgi reload

maintenant, chaque fois que je change les phrases et après avoir compilé les fichiers de langue, je recharge le serveur aussi pour voir les changements.

0
répondu Raham 2017-05-23 12:10:40