web-dev-qa-db-fra.com

django-admin.py makemessages ne fonctionne pas

J'essaie de traduire une chaîne.

{% load i18n %}
{% trans "Well, Hello there, how are you?" %}

à...

Hola amigo, ¿que tal?

Mon fichier settings.py a ceci:

LOCALE_PATHS = (
    os.path.join(BASE_DIR, 'translations'),
)

Et j'obtiens ceci:

(env)glitch:translations nathann$ Django-admin.py compilemessages
CommandError: Can't find msgfmt. Make sure you have GNU gettext tools 0.15 or newer installed.

Je ne comprends pas non plus ce message d'erreur.

(env)glitch:ipals nathann$ Django-admin.py makemessages -l es
CommandError:
This script should be run from the Django Git tree or your project or
app tree. If you did indeed run it from the Git checkout or your project
or application, maybe you are just missing the conf / locale(in the
Django tree) or locale(for project and application) directory? It is not
created automatically, you have to create it by hand if you want to
enable i18n for your project or application.

Les documents: https://docs.djangoproject.com/fr/1.6/ref/Django-admin/#Django-admin-makemessages

Et pour les bonus upvotes, une question connexe: Gettext n’était pas lié lorsque je l’ai installé ... Avez-vous de l’aide pour cela? Devrais-je le forcer?

glitch:translations nathann$ brew link gettext
Warning: gettext is keg-only and must be linked with --force
Note that doing so can interfere with building software.

Merci!


MISES À JOUR:

Depuis, j'ai changé le nom des traductions en locale et mis à jour mon settings.py en conséquence. alors j'ai couru à nouveau et il se plaint toujours de gettext:

(env)glitch:ipals nathann$ mv translations/ locale
(env)glitch:ipals nathann$ Django-admin.py makemessages -l es
CommandError: Can't find xgettext. Make sure you have GNU gettext tools 0.15 or newer installed.

J'ai aussi trouvé ceci:

Comprendre les dépendances de l'homebrew et des fûts uniquement

après avoir lu ceci:

(env)glitch:ipals nathann$ brew install gettext
Warning: gettext-0.18.3.2 already installed
(env)glitch:ipals nathann$ brew link gettext
Warning: gettext is keg-only and must be linked with --force
Note that doing so can interfere with building software.
41
broinjc

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é deux fois que le répertoire locale était à la bonne place et que son nom était orthographié correctement.

J'ai fini par lier gettext (après avoir posé ma question sur superuser ):

brew link gettext --force

manage.py compilemessages

Django-admin.py makemessages -l es

Et BAM. J'ai mon fichier po.

Mais le médecin 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
64
broinjc

S'il vous plaît essayez ceci dans Ubuntu 

Sudo apt-get install gettext

Et utilisez brew install gettext sous OSX

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

48
Vijesh Venugopal

Voici la solution pour ceux qui rencontrent des problèmes de traduction ou qui créent pour la première fois un site multilingue dans Django. Voici comment je le fais, et je le fais depuis Django 1.4, ci-dessous est testé dans la version 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 ici 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 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, 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 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')),
)

Remarque: vous pouvez également déposer vos URL d'administrateur dans les fichiers i18n_patterns.

Désormais, où que vous utilisiez du texte et que vous souhaitiez le convertir, importer lazytext et envelopper chaque chaîne de la même manière que _ ('text'), vous pouvez même accéder à vos autres fichiers urls.py et effectuer 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"))

Les documents de traduction Django sont parfaits pour cela!

Dans vos modèles HTML ...

Vous pouvez maintenant accéder à vos modèles, charger le 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 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

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é!

7
radtek

Pour les utilisateurs de Mac, brew link gettext --force peut être risqué, comme le conseille Brew. Une meilleure solution consiste à définir un nouveau PATH variable pour votre environnement virtuel. Ainsi, dans le fichier postactivate, qui se trouve dans le dossier bin de votre dossier d’environnement virtuel, tapez:

export TEMP_PATH=$PATH
export PATH=$PATH:/usr/local/Cellar/gettext/0.19.7/bin

Notez que vous devez remplacer 0.19.7 par la version installée sur votre ordinateur.

Et dans votre fichier predeactivate, qui se trouve dans le même dossier que le fichier postactivate, tapez:

export PATH=$TEMP_PATH
unset TEMP_PATH

Maintenant, vous pouvez utiliser le python manage.py makemessages -l <desired_language> sans soucis. :)

À votre santé.

6
reinaldoluckman

Avez-vous ajouté {% load i18n %} en haut de votre modèle?

Bonus: Vous n'avez pas besoin de lier gettext, quelle est la sortie de brew doctor?

2
Gregg_1987

Veuillez installer gettext dans votre système d'exploitation Ubuntu À l'aide de la commande Sudo apt-get

Ou sur Mac

en utilisant la commande d'infusion

1
Abin Abraham

Pour macOS:

brew install gettext export PATH="/usr/local/opt/gettext/bin:$PATH"

1
valex

Si vous ne souhaitez pas lier gettext (ce qui ne devrait pas être le cas, il est mauvais de manipuler les composants internes de OS X), vous pouvez définir PATH pour la commande makemessages. Ce qui suit devrait fonctionner (mais vous devez ajuster votre numéro de version de gettext):

PATH=/usr/local/Cellar/gettext/<installed version>/bin/:$PATH && \
Django-admin makemessages -l <language>

Si vous le faites de cette façon, votre gettext installée restera uniquement dans le fût et Django-admin sera heureux et trouvera tous les programmes dont il a besoin.

0
jschrewe