From 3a6491cf56ccd8b5cdbc081034b9ab4a9dbc596b Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Mon, 24 Jan 2011 08:16:09 +0000 Subject: [PATCH] Fixed #14240 -- Enabled localization for the filesize filter. Thanks to David Danier for the report and patch. git-svn-id: http://code.djangoproject.com/svn/django/trunk@15290 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- AUTHORS | 2 +- django/template/defaultfilters.py | 14 +++++----- tests/regressiontests/defaultfilters/tests.py | 27 +++++++++++++++++++ 3 files changed, 36 insertions(+), 7 deletions(-) diff --git a/AUTHORS b/AUTHORS index ceb5f1a7c7b..1a3a82b26f8 100644 --- a/AUTHORS +++ b/AUTHORS @@ -131,7 +131,7 @@ answer newbie questions, and generally made Django that much better: dackze+django@gmail.com Jim Dalton Mihai Damian - David Danier + David Danier Dirk Datzert Jonathan Daugherty (cygnus) dave@thebarproject.com diff --git a/django/template/defaultfilters.py b/django/template/defaultfilters.py index 1e00effea09..8fabef642f0 100644 --- a/django/template/defaultfilters.py +++ b/django/template/defaultfilters.py @@ -799,19 +799,21 @@ def filesizeformat(bytes): try: bytes = float(bytes) except (TypeError,ValueError,UnicodeDecodeError): - return u"0 bytes" + return ungettext("%(size)d byte", "%(size)d bytes", 0) % {'size': 0} + + filesize_number_format = lambda value: formats.number_format(round(value, 1), 1) if bytes < 1024: return ungettext("%(size)d byte", "%(size)d bytes", bytes) % {'size': bytes} if bytes < 1024 * 1024: - return ugettext("%.1f KB") % (bytes / 1024) + return ugettext("%s KB") % filesize_number_format(bytes / 1024) if bytes < 1024 * 1024 * 1024: - return ugettext("%.1f MB") % (bytes / (1024 * 1024)) + return ugettext("%s MB") % filesize_number_format(bytes / (1024 * 1024)) if bytes < 1024 * 1024 * 1024 * 1024: - return ugettext("%.1f GB") % (bytes / (1024 * 1024 * 1024)) + return ugettext("%s GB") % filesize_number_format(bytes / (1024 * 1024 * 1024)) if bytes < 1024 * 1024 * 1024 * 1024 * 1024: - return ugettext("%.1f TB") % (bytes / (1024 * 1024 * 1024 * 1024)) - return ugettext("%.1f PB") % (bytes / (1024 * 1024 * 1024 * 1024 * 1024)) + return ugettext("%s TB") % filesize_number_format(bytes / (1024 * 1024 * 1024 * 1024)) + return ugettext("%s PB") % filesize_number_format(bytes / (1024 * 1024 * 1024 * 1024 * 1024)) filesizeformat.is_safe = True def pluralize(value, arg=u's'): diff --git a/tests/regressiontests/defaultfilters/tests.py b/tests/regressiontests/defaultfilters/tests.py index 27014a7813c..95140b7dafc 100644 --- a/tests/regressiontests/defaultfilters/tests.py +++ b/tests/regressiontests/defaultfilters/tests.py @@ -443,6 +443,33 @@ class DefaultFiltersTests(unittest.TestCase): self.assertEqual(filesizeformat(u"\N{GREEK SMALL LETTER ALPHA}"), u'0 bytes') + def test_localized_filesizeformat(self): + from django.utils.translation import activate, deactivate + old_localize = settings.USE_L10N + try: + activate('de') + settings.USE_L10N = True + self.assertEqual(filesizeformat(1023), u'1023 Bytes') + self.assertEqual(filesizeformat(1024), u'1,0 KB') + self.assertEqual(filesizeformat(10*1024), u'10,0 KB') + self.assertEqual(filesizeformat(1024*1024-1), u'1024,0 KB') + self.assertEqual(filesizeformat(1024*1024), u'1,0 MB') + self.assertEqual(filesizeformat(1024*1024*50), u'50,0 MB') + self.assertEqual(filesizeformat(1024*1024*1024-1), u'1024,0 MB') + self.assertEqual(filesizeformat(1024*1024*1024), u'1,0 GB') + self.assertEqual(filesizeformat(1024*1024*1024*1024), u'1,0 TB') + self.assertEqual(filesizeformat(1024*1024*1024*1024*1024), + u'1,0 PB') + self.assertEqual(filesizeformat(1024*1024*1024*1024*1024*2000), + u'2000,0 PB') + self.assertEqual(filesizeformat(complex(1,-1)), u'0 Bytes') + self.assertEqual(filesizeformat(""), u'0 Bytes') + self.assertEqual(filesizeformat(u"\N{GREEK SMALL LETTER ALPHA}"), + u'0 Bytes') + finally: + deactivate() + settings.USE_L10N = old_localize + def test_pluralize(self): self.assertEqual(pluralize(1), u'') self.assertEqual(pluralize(0), u's')