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'
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 = []
'%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 <EMAIL@ADDRESS>'))
headers.append(('Language-Team', 'LANGUAGE <LL@li.org>'))
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 <LL@li.org>' % self.locale))
headers.append(('Plural-Forms', self.plural_forms))
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
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 <jd@example.com>')
>>> for name, value in catalog.headers:
... print '%s: %s' % (name, value)
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:
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")
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(',')
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 '
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')
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)],
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):
: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()