web-dev-qa-db-fra.com

django - comment faire fonctionner la traduction?

J'essaie de rendre un modèle dans une langue différente en utilisant i18n. Je faisais tout ce que je pouvais lire, depuis la définition du code de langue jusqu'à la création et la compilation de fichiers de traduction, y compris les balises de traduction du modèle, etc., et mon modèle est toujours affiché en anglais, même à travers la variable {{LANGUAGE_CODE}}. le code correct (et différent) que j'avais l'intention de restituer. Qu'est-ce que je rate?

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 %}

vue:

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 traductions correctes dans 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
sa125

J’ai utilisé le code de langue exact que Django utilise dans ses propres fichiers de traduction (et non par le lien fourni dans settings.py), en supposant que cette langue est prise en charge fournissez également vos propres fichiers de traduction à Django).

J'ai trouvé ce code en allant dans $ Django_DIR/conf/locale et en regardant le nom du dossier (pour moi c'était en fonction de l'OS et tel).

2
sa125

Ajoutez simplement les chemins des fichiers de paramètres régionaux générés dans le fichier settings.py comme suit:

LOCALE_PATHS = ( "/xxx/xxx/Projects/xxx/sites/avb/locale/",)
65
AbuFida

C’est une solution complète que j’utilise depuis Django 1.4 et toujours en 1.7.1:

Dans settings.py…

Ajouter à MIDDLEWEAR_CLASSES, locale, permet la sélection de la langue en fonction de la demande:

'Django.middleware.locale.LocaleMiddleware',

Ajoutez LOCALE_PATHS, c'est là que seront stockés vos fichiers de traduction:

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

Activer I18N:

USE_I18N = True    

Définissez les LANGUES dans lesquelles vous traduirez le site:

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

Ajoutez un processeur de contexte de modèle i18n à TEMPLATE_CONTEXT_PROCESSORS. Les demandes incluent désormais LANGUAGES et LANGUAGE_CODE:

'Django.core.context_processors.i18n',

Dans urls.py:

Dans url_patterns, ajoutez ce qui suit, cela activera la vue de redirection de langue définie:

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

Voir Divers dans Traductions pour plus d'informations.

Ajoutez les importations suivantes et encapsulez les URL que vous souhaitez 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 de la même manière que _ ('text'), vous pouvez même aller à vos autres fichiers urls.py et faire la traduction d'URL comme suit:

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

Vous pouvez insérer du texte que vous souhaitez traduire dans vos autres fichiers, tels que models.py, views.py, etc. Voici un exemple de champ de modèle avec les traductions pour label et help_text:

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

Dans vos templates HTML ...

Faites de même pour vos modèles, chargez le modèle i18n et utilisez trans et transblock sur les éléments statiques que vous souhaitez 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 paramètres régionaux:

./manage.py makemessages -l pl

Et tout ce qui reste à faire est d’aller dans votre dossier/locales et d’éditer chacun des fichiers .po. Remplissez les données pour chaque msgstr. Voici un exemple de cela:

msgid "English"
msgstr "Angielski"

Et enfin compiler les messages:

./manage.py compilemessages

Pour la traduction des données d'instance de modèle, vous pouvez utiliser certains des packages réutilisables disponibles, tels que 

Il y a encore beaucoup à apprendre avec les traductions et l'internationalisation est étroitement liée à ce sujet, alors consultez la documentation à ce sujet également. Je recommande également de consulter certains des packages d’internationalisation disponibles pour Django, tels que Django-rosetta et Django-linguo . Ils aident à traduire le contenu du modèle, 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 cela, vous devriez être bien parti. Je pense que c'est la manière la plus standardisée de faire fonctionner votre site dans plusieurs langues. À votre santé!

21
radtek

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

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

Mais plutôt ceci:

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

Notez le trait de soulignement dans he_il.

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

Oui, ce n'est pas évident et je n'ai trouvé aucune documentation à ce sujet.

J'espère que cela pourra aider.

20
cethegeek

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

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

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

 "Equipe Langue: LANGUE\n" 
 "Langue: ru\n" 
 "MIME-Version: 1.0\n" 

ça marche pour moi

15
serg666_2000

J'ai eu les mêmes problèmes, il semble que votre chemin d'accès aux paramètres régionaux doit se terminer par une barre oblique :

LOCALE_PATHS = (
    '/dir/to/my/locale/', 
)
5

Oui, vous devez créer des fichiers de messages comme le suggère celopes, puis les compiler.

python manage.py compilemessages

Mais vous aurez toujours un problème. 

Désactivez LocaleMiddleware un peu, c’est-à-dire supprimez-le

Django.middleware.locale.LocaleMiddleware

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

J'avais aussi ce problème étrange avant. La commande Makemessages s'étoufferait avec les chaînes entourées d'une barre oblique inverse dans les fichiers .py.

1
Evgeny

J'ai eu très le même problème, j'ai essayé de changer de langue et Django a dit non, allez-y. Pas d'erreur, pas d'avertissement, mais Django a changé de langue en pl-pl (dans mon cas). Cependant, en supprimant tous les dossiers de la locale et en exécutant la commande: Django-admin.py makemessages -l pl_PL (le trait de soulignement au lieu du tiret et de la lettre majuscule pour le second PL a résolu ce problème).

J'espère que ça aide certains gars là-bas.

1
Drachenfels

J'ai eu le même problème. Je l'ai expliqué avec des détails dans ce lien sous une autre question similaire .

En résumé, 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 pour voir les changements.

0
Raham