Skip to content

Commit fec2ef7

Browse files
committed
Do not perform string formatting if no variables were passed.
Fixes complaints raised by the CKAN project and reflects the behaviour of Python, pylons, and django's gettext().
1 parent 414428b commit fec2ef7

2 files changed

Lines changed: 27 additions & 8 deletions

File tree

flask_babel/__init__.py

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -532,8 +532,9 @@ def gettext(string, **variables):
532532
"""
533533
t = get_translations()
534534
if t is None:
535-
return string % variables
536-
return t.ugettext(string) % variables
535+
return string if not variables else string % variables
536+
s = t.ugettext(string)
537+
return s if not variables else s % variables
537538
_ = gettext
538539

539540

@@ -552,8 +553,11 @@ def ngettext(singular, plural, num, **variables):
552553
variables.setdefault('num', num)
553554
t = get_translations()
554555
if t is None:
555-
return (singular if num == 1 else plural) % variables
556-
return t.ungettext(singular, plural, num) % variables
556+
s = singular if num == 1 else plural
557+
return s if not variables else s % variables
558+
559+
s = t.ungettext(singular, plural, num)
560+
return s if not variables else s % variables
557561

558562

559563
def pgettext(context, string, **variables):
@@ -563,8 +567,9 @@ def pgettext(context, string, **variables):
563567
"""
564568
t = get_translations()
565569
if t is None:
566-
return string % variables
567-
return t.upgettext(context, string) % variables
570+
return string if not variables else string % variables
571+
s = t.upgettext(context, string)
572+
return s if not variables else s % variables
568573

569574

570575
def npgettext(context, singular, plural, num, **variables):
@@ -575,8 +580,10 @@ def npgettext(context, singular, plural, num, **variables):
575580
variables.setdefault('num', num)
576581
t = get_translations()
577582
if t is None:
578-
return (singular if num == 1 else plural) % variables
579-
return t.unpgettext(context, singular, plural, num) % variables
583+
s = singular if num == 1 else plural
584+
return s if not variables else s % variables
585+
s = t.unpgettext(context, singular, plural, num)
586+
return s if not variables else s % variables
580587

581588

582589
def lazy_gettext(string, **variables):

tests/tests.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,18 @@ def test_list_translations(self):
229229
assert len(translations) == 1
230230
assert str(translations[0]) == 'de'
231231

232+
def test_no_formatting(self):
233+
"""
234+
Ensure we don't format strings unless a variable is passed.
235+
"""
236+
app = flask.Flask(__name__)
237+
babel.Babel(app)
238+
239+
with app.test_request_context():
240+
assert gettext(u'Test %s') == u'Test %s'
241+
assert gettext(u'Test %(name)s', name=u'test') == u'Test test'
242+
assert gettext(u'Test %s') % 'test' == u'Test test'
243+
232244

233245
if __name__ == '__main__':
234246
unittest.main()

0 commit comments

Comments
 (0)