summaryrefslogtreecommitdiff
path: root/mailman/i18n.py
diff options
context:
space:
mode:
authorBarry Warsaw2009-01-25 13:01:41 -0500
committerBarry Warsaw2009-01-25 13:01:41 -0500
commiteefd06f1b88b8ecbb23a9013cd223b72ca85c20d (patch)
tree72c947fe16fce0e07e996ee74020b26585d7e846 /mailman/i18n.py
parent07871212f74498abd56bef3919bf3e029eb8b930 (diff)
downloadmailman-eefd06f1b88b8ecbb23a9013cd223b72ca85c20d.tar.gz
mailman-eefd06f1b88b8ecbb23a9013cd223b72ca85c20d.tar.zst
mailman-eefd06f1b88b8ecbb23a9013cd223b72ca85c20d.zip
Diffstat (limited to 'mailman/i18n.py')
-rw-r--r--mailman/i18n.py198
1 files changed, 0 insertions, 198 deletions
diff --git a/mailman/i18n.py b/mailman/i18n.py
deleted file mode 100644
index 12a06dc02..000000000
--- a/mailman/i18n.py
+++ /dev/null
@@ -1,198 +0,0 @@
-# Copyright (C) 2000-2009 by the Free Software Foundation, Inc.
-#
-# This file is part of GNU Mailman.
-#
-# GNU Mailman is free software: you can redistribute it and/or modify it under
-# the terms of the GNU General Public License as published by the Free
-# Software Foundation, either version 3 of the License, or (at your option)
-# any later version.
-#
-# GNU Mailman is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-# more details.
-#
-# You should have received a copy of the GNU General Public License along with
-# GNU Mailman. If not, see <http://www.gnu.org/licenses/>.
-
-"""Internationalization support."""
-
-from __future__ import unicode_literals
-
-__metaclass__ = type
-__all__ = [
- '_',
- 'get_translation',
- 'set_language',
- 'set_translation',
- 'using_language',
- ]
-
-
-import os
-import sys
-import time
-import string
-import gettext
-
-import mailman.messages
-from mailman.utilities.string import expand
-
-_translation = None
-_missing = object()
-
-MESSAGES_DIR = os.path.dirname(mailman.messages.__file__)
-
-
-
-class Template(string.Template):
- idpattern = r'[_a-z][_a-z0-9.]*'
-
-
-class attrdict(dict):
- def __getitem__(self, key):
- parts = key.split('.')
- value = super(attrdict, self).__getitem__(parts.pop(0))
- while parts:
- value = getattr(value, parts.pop(0), _missing)
- if value is _missing:
- raise KeyError(key)
- return value
-
-
-
-def set_language(language=None):
- global _translation
- if language is not None:
- language = [language]
- try:
- _translation = gettext.translation('mailman', MESSAGES_DIR, language)
- except IOError:
- # The selected language was not installed in messages, so fall back to
- # untranslated English.
- _translation = gettext.NullTranslations()
-
-
-def get_translation():
- return _translation
-
-
-def set_translation(translation):
- global _translation
- _translation = translation
-
-
-class using_language(object):
- """Context manager for Python 2.5's `with` statement."""
- def __init__(self, language):
- self._language = language
- self._old_translation = None
-
- def __enter__(self):
- self._old_translation = _translation
- set_language(self._language)
-
- def __exit__(self, *exc_info):
- global _translation
- _translation = self._old_translation
- # Do not suppress exceptions.
- return False
-
-
-# Set up the global translation based on environment variables. Mostly used
-# for command line scripts.
-if _translation is None:
- _translation = gettext.NullTranslations()
-
-
-
-def _(s):
- if s == '':
- return ''
- assert s, 'Cannot translate: {0}'.format(s)
- # Do translation of the given string into the current language, and do PEP
- # 292 style $-string interpolation into the resulting string.
- #
- # This lets you write something like:
- #
- # now = time.ctime(time.time())
- # print _('The current time is: $now')
- #
- # and have it Just Work. Note that the lookup order for keys in the
- # original string is 1) locals dictionary, 2) globals dictionary.
- #
- # Get the frame of the caller.
- frame = sys._getframe(1)
- # A `safe' dictionary is used so we won't get an exception if there's a
- # missing key in the dictionary.
- raw_dict = frame.f_globals.copy()
- raw_dict.update(frame.f_locals)
- # Mailman must be unicode safe internally (i.e. all strings inside Mailman
- # must be unicodes). The translation service is one boundary to the
- # outside world, so to honor this constraint, make sure that all strings
- # to come out of _() are unicodes, even if the translated string or
- # dictionary values are 8-bit strings.
- tns = _translation.ugettext(s)
- charset = _translation.charset() or 'us-ascii'
- # Python requires ** dictionaries to have str, not unicode keys. For our
- # purposes, keys should always be ascii. Values though should be unicode.
- translated_string = expand(tns, attrdict(raw_dict), Template)
- if isinstance(translated_string, str):
- translated_string = unicode(translated_string, charset)
- return translated_string
-
-
-
-def ctime(date):
- # Don't make these module globals since we have to do runtime translation
- # of the strings anyway.
- daysofweek = [
- _('Mon'), _('Tue'), _('Wed'), _('Thu'),
- _('Fri'), _('Sat'), _('Sun')
- ]
- months = [
- '',
- _('Jan'), _('Feb'), _('Mar'), _('Apr'), _('May'), _('Jun'),
- _('Jul'), _('Aug'), _('Sep'), _('Oct'), _('Nov'), _('Dec')
- ]
-
- tzname = _('Server Local Time')
- if isinstance(date, str):
- try:
- year, mon, day, hh, mm, ss, wday, ydat, dst = time.strptime(date)
- if dst in (0, 1):
- tzname = time.tzname[dst]
- else:
- # MAS: No exception but dst = -1 so try
- return ctime(time.mktime((year, mon, day, hh, mm, ss, wday,
- ydat, dst)))
- except (ValueError, AttributeError):
- try:
- wday, mon, day, hms, year = date.split()
- hh, mm, ss = hms.split(':')
- year = int(year)
- day = int(day)
- hh = int(hh)
- mm = int(mm)
- ss = int(ss)
- except ValueError:
- return date
- else:
- for i in range(0, 7):
- wconst = (1999, 1, 1, 0, 0, 0, i, 1, 0)
- if wday.lower() == time.strftime('%a', wconst).lower():
- wday = i
- break
- for i in range(1, 13):
- mconst = (1999, i, 1, 0, 0, 0, 0, 1, 0)
- if mon.lower() == time.strftime('%b', mconst).lower():
- mon = i
- break
- else:
- year, mon, day, hh, mm, ss, wday, yday, dst = time.localtime(date)
- if dst in (0, 1):
- tzname = time.tzname[dst]
-
- wday = daysofweek[wday]
- mon = months[mon]
- return _('$wday $mon $day $hh:$mm:$ss $tzname $year')