2017-07-06 1 views
4

J'ai un problème avec la traduction des chaînes formatées dans Django en utilisant django.utils.translations. Seules les chaînes sans format (%s ou {}) fonctionnent.La traduction des chaînes formatées dans Django ne fonctionne pas

Mon fichier locale/en/LC_MESSAGES/django.po:

msgid "foo" 
msgstr "bar" 

#, python-format 
msgid "foo %s" 
msgstr "bar %s" 

#, python-format 
msgid "foo %(baz)s" 
msgstr "bar %(baz)s " 

#, python-brace-format 
msgid "foo {}" 
msgstr "bar {}" 

#, python-brace-format 
msgid "foo {baz}" 
msgstr "bar {baz}" 

Première chaîne fonctionne:

>>> from django.utils import translation 
>>> translation.activate('en') 
>>> translation.ugettext('foo') 
'bar' 

Mais reste n'est pas:

>>> translation.ugettext('foo %s' % 'bax') 
'foo bax' 
>>> translation.ugettext('foo %(baz)s' % {'baz': 'bax'}) 
'foo bax' 
>>> translation.ugettext('foo {}'.format('bax')) 
'foo bax' 
>>> translation.ugettext('foo {baz}'.format(baz='bax')) 
'foo bax' 

Pas mater si j'utilise ugettext_lazy, gettext ou gettext_lazy - même histoire, sortie non traduite.

Une idée de pourquoi les chaînes formatées ne fonctionnent pas?

  • Django 1.11.3
  • Python 3.5.3

Répondre

4

Vous devez formater les chaînes renvoyées par ugettext et non les chaînes dans l'appel. Voir la clarification ci-dessous.

Au lieu de:

translation.ugettext('foo %s' % 'bax') 
translation.ugettext('foo %(baz)s' % {'baz': 'bax'}) 
translation.ugettext('foo {}'.format('bax')) 
translation.ugettext('foo {baz}'.format(baz='bax')) 

que vous devez faire:

translation.ugettext('foo %s') % 'bax' 
translation.ugettext('foo %(baz)s') % {'baz': 'bax'} 
translation.ugettext('foo {}').format('bax') 
translation.ugettext('foo {baz}').format(baz='bax') 

Dans votre code, vous essayez d'obtenir la traduction de 'foo bax' à chaque fois, et vous n'avez pas msgid dans votre fichier de traduction.

+0

Merci pour cela. Je ne pouvais pas voir les bois pour les arbres. – Moritz