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.
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
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.
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!
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é.
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
?
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
pour macOS
:
brew install gettext
export PATH="/usr/local/opt/gettext/bin:$PATH"
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.