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?
Use the function django. utils. translation. gettext_noop() to mark a string as a translation string without translating it.
gettext_lazy is a callable within the django. utils. translation module of the Django project.
The modulo % is also known as the “string-formatting operator”.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With