Opened 3 years ago
Closed 3 years ago
#33440 closed Uncategorized (invalid)
Cannot escape % character when using gettext().
Reported by: | Stian Jensen | Owned by: | nobody |
---|---|---|---|
Component: | Internationalization | Version: | 3.2 |
Severity: | Normal | Keywords: | |
Cc: | Claude Paroz, Ramiro Morales | Triage Stage: | Unreviewed |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
Reproduce:
Write something like gettext('This item is 50% off!')
run ./manage.py makemessages -a
find the string in the .po file and translate it like this:
#: templates/test.html:2
#, python-format
msgid "This item is 50% off!"
msgstr "Denne har 50% rabatt!"
run ./manage.py compilemessages
get this error message:
Execution of msgfmt failed: /Users/stiaje/Projects/django-backend/app/hyre/locale/nb/LC_MESSAGES/django.po:601: format specifications in 'msgid' and 'msgstr' for argument 1 are not the same
It works if the letter after the percentage is o in all languages, but fails otherwise.
I tried escaping the percentage symbol as %%, but that resulted in %% being outputted on runtime.
I tried using \u00e0 instead, but that gave:
Execution of msgfmt failed: /Users/stiaje/Projects/django-backend/app/hyre/locale/nb/LC_MESSAGES/django.po:980:36: invalid control sequence
I see that a very similar issue has been reported before, but it is closed, with a comment saying to open a new issue for followups:
https://code.djangoproject.com/ticket/11240
I can make compilemessages work by manually removing python-format from the strings with %, but makemessages will just add that back the next time I run it.
Change History (1)
comment:1 by , 3 years ago
Cc: | added |
---|---|
Component: | Uncategorized → Internationalization |
Resolution: | → invalid |
Status: | new → closed |
Summary: | Cannot escape % character when using gettext → Cannot escape % character when using gettext(). |
#11240 is about a similar issue but with
{% translate %}
template tag. The main difference is that by design we don't support %-formatting in{% translate %}
(see comment), which is not the case ingettext()
.gettext()
supports%-formatting
and%o
is a valid conversion type (signed octal value) so there is not much we can do. I'd recommend to remove50%
from translated string (it's not something that will change in different languages), e.g.