Opened 9 years ago
Closed 9 years ago
#25571 closed Bug (fixed)
When number argument is not an integer ungettext_lazy's return value evaluates to False
Reported by: | Michał Przybyś | Owned by: | nobody |
---|---|---|---|
Component: | Internationalization | Version: | 1.8 |
Severity: | Normal | Keywords: | |
Cc: | Triage Stage: | Ready for checkin | |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
When I tried to pass ungettext_lazy as the message argument for MinLengthValidator:
MinLengthValidator(4, ungettext_lazy( 'Name has to be at least %(limit_value)d character long.', 'Name has to be at least %(limit_value)d characters long.', 'limit_value' ))
the default message was still used. After fiddling around I found out, that it's because ungettext_lazy's return value's __len__
returns 0 which makes it evaluate to False and fail a check in BaseValidator's constructor.
>>> len(ungettext_lazy('%(number)d object', '%(number)d objects', 'number')) 0 >>> len(ungettext_lazy('%(number)d object', '%(number)d objects', 1)) 17 >>> bool(ungettext_lazy('%(number)d object', '%(number)d objects', 'number')) False >>> bool(ungettext_lazy('%(number)d object', '%(number)d objects', 1)) True
I'm not sure if this behaviour is a bug, or is it by design and it's a bug in BaseValidator's constructor, but I assume it's the former.
Using django 1.8.5, checked on python 2.7.9 and 3.4.3.
Change History (3)
comment:1 by , 9 years ago
Component: | Utilities → Internationalization |
---|---|
Has patch: | set |
Triage Stage: | Unreviewed → Accepted |
comment:2 by , 9 years ago
Triage Stage: | Accepted → Ready for checkin |
---|
Yes, that's a bug. Possible resolution: PR