# HG changeset patch # User cmlenz # Date 1181673639 0 # Node ID f9007588a860360c419752f55e9b1ed8ec70c5fe # Parent 96037779b5187f9fe275718153a9b5094c6474a3 Fix for #11 (use local timezone in timestamps of generated POT). diff --git a/babel/messages/catalog.py b/babel/messages/catalog.py --- a/babel/messages/catalog.py +++ b/babel/messages/catalog.py @@ -24,7 +24,7 @@ from babel import __version__ as VERSION from babel.core import Locale from babel.messages.plurals import PLURALS -from babel.util import odict, UTC +from babel.util import odict, LOCAL, UTC __all__ = ['Message', 'Catalog'] __docformat__ = 'restructuredtext en' @@ -132,23 +132,19 @@ self.project = project or 'PROJECT' #: the project name self.version = version or 'VERSION' #: the project version self.msgid_bugs_address = msgid_bugs_address or 'EMAIL@ADDRESS' + self.last_translator = last_translator #: last translator name + email + self.charset = charset or 'utf-8' if creation_date is None: - creation_date = time.localtime() - elif isinstance(creation_date, datetime): - if creation_date.tzinfo is None: - creation_date = creation_date.replace(tzinfo=UTC) - creation_date = creation_date.timetuple() + creation_date = datetime.now(LOCAL) + elif isinstance(creation_date, datetime) and not creation_date.tzinfo: + creation_date = creation_date.replace(tzinfo=LOCAL) self.creation_date = creation_date #: creation date of the template if revision_date is None: - revision_date = time.localtime() - elif isinstance(revision_date, datetime): - if revision_date.tzinfo is None: - revision_date = revision_date.replace(tzinfo=UTC) - revision_date = revision_date.timetuple() + revision_date = datetime.now(LOCAL) + elif isinstance(revision_date, datetime) and not revision_date.tzinfo: + revision_date = revision_date.replace(tzinfo=LOCAL) self.revision_date = revision_date #: last revision date of the catalog - self.last_translator = last_translator #: last translator name + email - self.charset = charset or 'utf-8' def headers(self): headers = [] @@ -156,14 +152,14 @@ '%s %s' % (self.project, self.version))) headers.append(('Report-Msgid-Bugs-To', self.msgid_bugs_address)) headers.append(('POT-Creation-Date', - time.strftime('%Y-%m-%d %H:%M%z', self.creation_date))) + self.creation_date.strftime('%Y-%m-%d %H:%M%z'))) if self.locale is None: headers.append(('PO-Revision-Date', 'YEAR-MO-DA HO:MI+ZONE')) headers.append(('Last-Translator', 'FULL NAME ')) headers.append(('Language-Team', 'LANGUAGE ')) else: headers.append(('PO-Revision-Date', - time.strftime('%Y-%m-%d %H:%M%z', self.revision_date))) + self.revision_date.strftime('%Y-%m-%d %H:%M%z'))) headers.append(('Last-Translator', self.last_translator)) headers.append(('Language-Team', '%s ' % self.locale)) headers.append(('Plural-Forms', self.plural_forms)) @@ -182,8 +178,9 @@ Here's an example of the output for such a catalog template: + >>> created = datetime(1990, 4, 1, 15, 30, tzinfo=UTC) >>> catalog = Catalog(project='Foobar', version='1.0', - ... creation_date=datetime(1990, 4, 1, 15, 30)) + ... creation_date=created) >>> for name, value in catalog.headers: ... print '%s: %s' % (name, value) Project-Id-Version: Foobar 1.0 @@ -199,9 +196,9 @@ And here's an example of the output when the locale is set: + >>> revised = datetime(1990, 8, 3, 12, 0, tzinfo=UTC) >>> catalog = Catalog(locale='de_DE', project='Foobar', version='1.0', - ... creation_date=datetime(1990, 4, 1, 15, 30), - ... revision_date=datetime(1990, 8, 3, 12, 0), + ... creation_date=created, revision_date=revised, ... last_translator='John Doe ') >>> for name, value in catalog.headers: ... print '%s: %s' % (name, value) diff --git a/babel/messages/frontend.py b/babel/messages/frontend.py --- a/babel/messages/frontend.py +++ b/babel/messages/frontend.py @@ -114,7 +114,7 @@ self.msgid_bugs_address = None self.copyright_holder = None self.add_comments = None - self._add_comments = None + self._add_comments = [] def finalize_options(self): if self.no_default_keywords and not self.keywords: @@ -133,7 +133,7 @@ self.width = None else: self.width = int(self.width) - + if self.sort_output and self.sort_by_file: raise DistutilsOptionError("'--sort-output' and '--sort-by-file' " "are mutually exclusive") @@ -142,7 +142,7 @@ self.input_dirs = dict.fromkeys([k.split('.',1)[0] for k in self.distribution.packages ]).keys() - + if self.add_comments: self._add_comments = self.add_comments.split(',') @@ -424,7 +424,7 @@ help='set report address for msgid') parser.add_option('--copyright-holder', dest='copyright_holder', help='set copyright holder in output') - parser.add_option('--add-comments', '-c', dest='add_comments', + parser.add_option('--add-comments', '-c', dest='comment_tags', metavar='TAG', action='append', help='place comment block with TAG (or those ' 'preceding keyword lines) in output file. One ' @@ -434,7 +434,7 @@ no_default_keywords=False, no_location=False, omit_header = False, width=76, no_wrap=False, sort_output=False, sort_by_file=False, - add_comments=[]) + comment_tags=[]) options, args = parser.parse_args(argv) if not args: parser.error('incorrect number of arguments') @@ -479,9 +479,8 @@ for dirname in args: if not os.path.isdir(dirname): parser.error('%r is not a directory' % dirname) - extracted = extract_from_dir(dirname, method_map, - options_map, keywords, - comment_tags=options.add_comments) + extracted = extract_from_dir(dirname, method_map, options_map, + keywords, options.comment_tags) for filename, lineno, message, comments in extracted: filepath = os.path.normpath(os.path.join(dirname, filename)) catalog.add(message, None, [(filepath, lineno)], diff --git a/babel/messages/tests/catalog.py b/babel/messages/tests/catalog.py --- a/babel/messages/tests/catalog.py +++ b/babel/messages/tests/catalog.py @@ -42,7 +42,7 @@ cat.add('foo') cat.add(('foo', 'foos')) self.assertEqual(1, len(cat)) - + def test_update_message_updates_comments(self): cat = catalog.Catalog() cat[u'foo'] = catalog.Message('foo', locations=[('main.py', 5)]) diff --git a/babel/util.py b/babel/util.py --- a/babel/util.py +++ b/babel/util.py @@ -16,8 +16,9 @@ from datetime import timedelta, tzinfo import os import re +import time -__all__ = ['pathmatch', 'relpath', 'UTC'] +__all__ = ['pathmatch', 'relpath', 'UTC', 'LOCAL'] __docformat__ = 'restructuredtext en' def pathmatch(pattern, filename): @@ -169,3 +170,38 @@ :type: `tzinfo` """ + +STDOFFSET = timedelta(seconds = -time.timezone) +if time.daylight: + DSTOFFSET = timedelta(seconds = -time.altzone) +else: + DSTOFFSET = STDOFFSET + +DSTDIFF = DSTOFFSET - STDOFFSET + +class LocalTimezone(tzinfo): + + def utcoffset(self, dt): + if self._isdst(dt): + return DSTOFFSET + else: + return STDOFFSET + + def dst(self, dt): + if self._isdst(dt): + return DSTDIFF + else: + return ZERO + + def tzname(self, dt): + return time.tzname[self._isdst(dt)] + + def _isdst(self, dt): + tt = (dt.year, dt.month, dt.day, + dt.hour, dt.minute, dt.second, + dt.weekday(), 0, -1) + stamp = time.mktime(tt) + tt = time.localtime(stamp) + return tt.tm_isdst > 0 + +LOCAL = LocalTimezone()