# HG changeset patch # User cmlenz # Date 1216137737 0 # Node ID ff9a6a37eb72cd9dfe0c4cc6848a36e40793ffe0 # Parent 45a5b22660017e72a7dc22d663445aedb4ab7800 The `format_timedelta` function now returns, for example, ?1 day? instead of ?0 days? if the granularity is `day` and the delta is less than a day but greater than zero. diff --git a/ChangeLog b/ChangeLog --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +Version 1.0 +http://svn.edgewall.org/repos/babel/tags/1.0.0/ +(???, from branches/stable/1.0.x) + + * Added support for the locale plural rules defined by the CLDR. + * Added `format_timedelta` function to support localized formatting of + relative times with strings such as "2 days" or "1 month" (ticket #126). + + Version 0.9.3 http://svn.edgewall.org/repos/babel/tags/0.9.3/ (Jul 9 2008, from branches/stable/0.9.x) diff --git a/babel/dates.py b/babel/dates.py --- a/babel/dates.py +++ b/babel/dates.py @@ -613,7 +613,7 @@ >>> format_timedelta(timedelta(hours=3), granularity='day', ... locale='en_US') - u'0 days' + u'1 day' The threshold parameter can be used to determine at which value the presentation switches to the next higher unit. A higher threshold factor @@ -643,6 +643,8 @@ for unit, secs_per_unit in TIMEDELTA_UNITS: value = abs(seconds) / secs_per_unit if value >= threshold or unit == granularity: + if unit == granularity and value > 0: + value = max(1, value) value = int(round(value)) plural_form = locale.plural_form(value) pattern = locale._data['unit_patterns'][unit][plural_form] diff --git a/babel/tests/dates.py b/babel/tests/dates.py --- a/babel/tests/dates.py +++ b/babel/tests/dates.py @@ -238,6 +238,21 @@ "yyyy-MM-dd HH:mm", locale='en_US') +class FormatTimedeltaTestCase(unittest.TestCase): + + def test_zero_seconds(self): + string = dates.format_timedelta(timedelta(seconds=0), locale='en') + self.assertEqual('0 seconds', string) + string = dates.format_timedelta(timedelta(seconds=0), + granularity='hour', locale='en') + self.assertEqual('0 hours', string) + + def test_small_value_with_granularity(self): + string = dates.format_timedelta(timedelta(seconds=42), + granularity='hour', locale='en') + self.assertEqual('1 hour', string) + + def suite(): suite = unittest.TestSuite() suite.addTest(doctest.DocTestSuite(dates)) @@ -246,5 +261,6 @@ suite.addTest(unittest.makeSuite(FormatTimeTestCase)) return suite + if __name__ == '__main__': unittest.main(defaultTest='suite') diff --git a/doc/dates.txt b/doc/dates.txt --- a/doc/dates.txt +++ b/doc/dates.txt @@ -234,7 +234,7 @@ >>> format_timedelta(delta, threshold=1.2, locale='en_US') u'6 days' >>> format_timedelta(delta, granularity='month', locale='en_US') - u'0 months' + u'1 month' Time-zone Support