12

I have problem with translating formatted strings in Django using django.utils.translations. Only strings without format (%s or {}) are working.

My locale/en/LC_MESSAGES/django.po file:

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}"

First string is working:

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

But rest is not:

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

No mater if I use ugettext_lazy, gettext or gettext_lazy - same story, not translated output.

Any idea why formatted strings are not working?

  • Django 1.11.3
  • Python 3.5.3
bns
  • 182
  • 2
  • 11

1 Answers1

20

You should format the strings returned by ugettext and not the strings in the call. See clarification below.

Instead of:

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

You need to do:

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

In your code you are trying to get the translation of 'foo bax' each time, and you don't have that msgid in your translation file.

Enric Calabuig
  • 470
  • 6
  • 12