Python >> Tutoriel Python >  >> Python

django-admin.py makemessages ne fonctionne pas

Après m'être assuré que j'avais ceci dans les paramètres :

LOCALE_PATHS = (
    os.path.join(BASE_DIR, 'locale'),
)
print(LOCALE_PATHS)

J'ai vérifié que j'avais le locale répertoire au bon endroit avec son nom correctement orthographié.

J'ai fini par lier gettext (après avoir demandé cela au superutilisateur):

brew link gettext --force

manage.py compilemessages

django-admin.py makemessages -l es

Et BAM. J'ai mon fichier po.

Mais le docteur dit :

Warning: Some keg-only formula are linked into the Cellar.
Linking a keg-only formula, such as gettext, into the cellar with
`brew link <formula>` will cause other formulae to detect them during
the `./configure` step. This may cause problems when compiling those
other formulae.

Binaries provided by keg-only formulae may override system binaries
with other strange results.

You may wish to `brew unlink` these brews:

    gettext

Veuillez essayer ceci dans Ubuntu

sudo apt-get install gettext

Et utilisez brew install gettext sous OSX

Assurez-vous également de définir le chemin local dans le fichier settings.py.


Voici la solution pour ceux qui ont des problèmes de traduction ou qui créent un site multilingue pour la toute première fois dans Django. Voici la façon dont je le fais, et je le fais depuis Django 1.4, ci-dessous est testé en 1.7.1 :

Dans settings.py …

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

'django.middleware.locale.LocaleMiddleware',

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

USE_I18N = True

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

Définissez les LANGUES dans lesquelles vous allez traduire le site :

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

Ajoutez le processeur de contexte de modèle i18n, les requêtes incluront désormais LANGUAGES et LANGUAGE_CODE :

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.contrib.auth.context_processors.auth',
    'django.core.context_processors.debug',
    'django.core.context_processors.i18n', # this one
    'django.core.context_processors.request',
    'django.core.context_processors.static',
    'django.contrib.messages.context_processors.messages',  
)

Nest, 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 les traductions pour plus d'informations à ce sujet.

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')),
)

Remarque :Vous pouvez également déposer vos URL d'administration dans les i18n_patterns.

Désormais, où que vous utilisiez du texte et que vous souhaitiez le convertir, importez du lazytext et enveloppez chaque chaîne avec comme suit _('text'), vous pouvez même accéder à vos autres fichiers urls.py et effectuer une traduction d'URL comme suit :

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

Vous pouvez envelopper le 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 des traductions pour label et help_text :

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

Les documents de traduction Django sont parfaits pour cela !

Dans vos modèles html...

Vous pouvez maintenant accéder à vos modèles et charger la balise de modèle i18n et utiliser 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 maintenant, il ne vous reste plus qu'à aller dans votre dossier /locales et à modifier chacun des fichiers .po. Remplissez les données pour chaque msgstr. En voici un exemple :

msgid "English"
msgstr "Angielski"

Et enfin compilez les messages :

./manage.py compilemessages

Il y a beaucoup plus à apprendre avec les traductions et l'internationalisation est étroitement liée à ce sujet, alors consultez également la documentation à ce sujet. 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 sur la bonne voie. Je pense que c'est le moyen le plus standardisé de faire fonctionner votre site en plusieurs langues. Santé !