388bc6ba04
Use locale endoding else this generate error in GU : as default time format can have non ascii char on non english locale, but using ascii in locale can generate UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 : In PyBitmessage/src/bitmessageqt/__init__.py" l10n.formatTimestamp()) In PyBitmessage/src/l10n.py", line 81, in formatTimestamp return unicode(timestring, encoding)
94 lines
2.8 KiB
Python
94 lines
2.8 KiB
Python
|
|
import logging
|
|
import time
|
|
|
|
import shared
|
|
|
|
|
|
#logger = logging.getLogger(__name__)
|
|
logger = logging.getLogger('file_only')
|
|
|
|
|
|
DEFAULT_ENCODING = 'ISO8859-1'
|
|
DEFAULT_LANGUAGE = 'en_US'
|
|
DEFAULT_TIME_FORMAT = '%Y-%m-%d %H:%M:%S'
|
|
|
|
encoding = DEFAULT_ENCODING
|
|
language = DEFAULT_LANGUAGE
|
|
|
|
try:
|
|
import locale
|
|
encoding = locale.getpreferredencoding(True) or DEFAULT_ENCODING
|
|
language = locale.getlocale()[0] or locale.getdefaultlocale()[0] or DEFAULT_LANGUAGE
|
|
except:
|
|
logger.exception('Could not determine language or encoding')
|
|
|
|
|
|
if shared.config.has_option('bitmessagesettings', 'timeformat'):
|
|
time_format = shared.config.get('bitmessagesettings', 'timeformat')
|
|
#Test the format string
|
|
try:
|
|
time.strftime(time_format)
|
|
except:
|
|
logger.exception('Could not format timestamp')
|
|
time_format = DEFAULT_TIME_FORMAT
|
|
else:
|
|
time_format = DEFAULT_TIME_FORMAT
|
|
|
|
#It seems some systems lie about the encoding they use so we perform
|
|
#comprehensive decoding tests
|
|
if time_format != DEFAULT_TIME_FORMAT:
|
|
try:
|
|
#Check day names
|
|
for i in xrange(7):
|
|
unicode(time.strftime(time_format, (0, 0, 0, 0, 0, 0, i, 0, 0)), encoding)
|
|
#Check month names
|
|
for i in xrange(1, 13):
|
|
unicode(time.strftime(time_format, (0, i, 0, 0, 0, 0, 0, 0, 0)), encoding)
|
|
#Check AM/PM
|
|
unicode(time.strftime(time_format, (0, 0, 0, 11, 0, 0, 0, 0, 0)), encoding)
|
|
unicode(time.strftime(time_format, (0, 0, 0, 13, 0, 0, 0, 0, 0)), encoding)
|
|
#Check DST
|
|
unicode(time.strftime(time_format, (0, 0, 0, 0, 0, 0, 0, 0, 1)), encoding)
|
|
except:
|
|
logger.exception('Could not decode locale formatted timestamp')
|
|
time_format = DEFAULT_TIME_FORMAT
|
|
encoding = DEFAULT_ENCODING
|
|
|
|
|
|
def formatTimestamp(timestamp = None, as_unicode = True):
|
|
#For some reason some timestamps are strings so we need to sanitize.
|
|
if timestamp is not None and not isinstance(timestamp, int):
|
|
try:
|
|
timestamp = int(timestamp)
|
|
except:
|
|
timestamp = None
|
|
|
|
#timestamp can't be less than 0.
|
|
if timestamp is not None and timestamp < 0:
|
|
timestamp = None
|
|
|
|
if timestamp is None:
|
|
timestring = time.strftime(time_format)
|
|
else:
|
|
#In case timestamp is too far in the future
|
|
try:
|
|
timestring = time.strftime(time_format, time.localtime(timestamp))
|
|
except ValueError:
|
|
timestring = time.strftime(time_format)
|
|
|
|
if as_unicode:
|
|
return unicode(timestring, encoding)
|
|
return timestring
|
|
|
|
def getTranslationLanguage():
|
|
userlocale = None
|
|
if shared.config.has_option('bitmessagesettings', 'userlocale'):
|
|
userlocale = shared.config.get('bitmessagesettings', 'userlocale')
|
|
|
|
if userlocale in [None, '', 'system']:
|
|
return language
|
|
|
|
return userlocale
|
|
|