django-admin.py makemessages ne fonctionne pas

j'essaie de traduire une chaîne.

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

to...

Hola amigo, ¿que tal?

mon settings.py le fichier 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.

The docs: https://docs.djangoproject.com/en/1.6/ref/django-admin/#django-admin-makemessages

et pour les upvotes bonus, une question connexe: gettext n'était pas lié quand je l'ai installé... Tout aider avec celui-ci? Dois-je la force?

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:

j'ai depuis changé le nom des traductions en locale et mis à jour mon settings.py en conséquence. puis j'ai relu ça 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é ce qui suit:

Comprendre homebrew et keg-seulement les dépendances

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.
39
demandé sur Community 2014-04-29 03:49:08

8 réponses

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 j'avais le répertoire locale au bon endroit avec son nom correctement épelé.

j'ai fini par lier gettext (après avoir posé des questions à ce sujet 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
59
répondu broinjc 2017-03-20 10:04:20

s'il vous Plaît essayer dans Ubuntu

sudo apt-get install gettext

et utiliser brew install gettext in OSX

assurez-vous également de définir le chemin local dans settings.py file.

46
répondu Vijesh Venugopal 2016-10-24 12:18:07

Voici la solution pour ceux qui ont des problèmes avec les traductions ou qui créent un site multilingue pour la première fois à Django. Voici comment je le fais, et je le fais depuis Django 1.4, ci-dessous est testé 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 votre traduction les fichiers seront stockés, aussi activer i18N:

USE_I18N = True

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

mettez les langues que vous traduirez le site en:

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

Ajouter i18n modèle de contexte processeur, les demandes comportent désormais des LANGUES 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, ajouter le ci-dessous, il permettra à la langue définie redirect view:

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

voir Divers dans traductions pour plus sur ce.

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

Note: Vous pouvez également déposer vos urls admin dans les i18n_patterns.

maintenant partout où vous utilisez du texte et que vous voulez le convertir, importer lazytext et envelopper chaque chaîne de caractères 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 traduire dans vos autres fichiers, tels que 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"))

Django traduction docs sont parfaits pour cela!

dans vos modèles html...

Maintenant vous pouvez aller dans vos gabarits et charger 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 é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

Il ya beaucoup plus à apprendre avec les traductions et internationalisation est étroitement liée à ce sujet, alors consultez les docs pour elle aussi. Je vous recommande également de vérifier certains des paquets d'internationalisation disponibles pour Django comme 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, alors que django-linguo.

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

7
répondu radtek 2014-10-23 01:43:04

pour les utilisateurs Mac brew link gettext --force peut être à risque, comme Brew conseille. Une meilleure solution consiste à définir un nouveau PATH variable pour votre environnement virtuel. Ainsi, dans le fichier postactivate , qui est situé dans le dossier bin de votre dossier 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 qui est installée sur votre ordinateur.

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

export PATH=$TEMP_PATH
unset TEMP_PATH

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

santé.

6
répondu reinaldoluckman 2016-02-23 14:08:25

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
répondu Gregg_1987 2014-04-28 23:53:42

s'il vous plaît installer gettext dans votre système d'exploitation ubuntu à l'aide de la commande sudo apt-get commande

ou en Mac

brasser à l'aide de la commande

1
répondu Abin Abraham 2014-08-01 07:15:00

pour macOS :

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

1
répondu valex 2018-06-07 08:09:57

si vous ne voulez pas lier gettext (ce que vous ne devriez pas car jouer avec les internes D'OS X est mauvais) alors vous pouvez définir PATH pour la commande makemessages . Ce qui suit devrait fonctionner (mais vous devez ajuster votre numéro de version 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é ne reste que sur le fût et django-admin sera heureux et trouvera tous les programmes dont il a besoin.

0
répondu jschrewe 2015-07-20 21:43:56