mirror of
https://github.com/EDCD/EDMarketConnector.git
synced 2025-06-03 00:51:11 +03:00
Locale: More detailed login at startup around changes
As we might run into some special cases with users we need to log in more detail what the locale is around our changes. NB: Also contains some misc. PyCharm-enacted formatting changes, white space, wrapping etc.
This commit is contained in:
parent
faf4906eea
commit
8b5e5e73de
@ -23,6 +23,7 @@ if __name__ == "__main__":
|
|||||||
if getattr(sys, 'frozen', False):
|
if getattr(sys, 'frozen', False):
|
||||||
# By default py2exe tries to write log to dirname(sys.executable) which fails when installed
|
# By default py2exe tries to write log to dirname(sys.executable) which fails when installed
|
||||||
import tempfile
|
import tempfile
|
||||||
|
|
||||||
# unbuffered not allowed for text in python3, so use `1 for line buffering
|
# unbuffered not allowed for text in python3, so use `1 for line buffering
|
||||||
sys.stdout = sys.stderr = open(join(tempfile.gettempdir(), f'{appname}.log'), mode='wt', buffering=1)
|
sys.stdout = sys.stderr = open(join(tempfile.gettempdir(), f'{appname}.log'), mode='wt', buffering=1)
|
||||||
|
|
||||||
@ -45,6 +46,7 @@ if __debug__:
|
|||||||
if platform != 'win32':
|
if platform != 'win32':
|
||||||
import pdb
|
import pdb
|
||||||
import signal
|
import signal
|
||||||
|
|
||||||
signal.signal(signal.SIGTERM, lambda sig, frame: pdb.Pdb().set_trace(frame))
|
signal.signal(signal.SIGTERM, lambda sig, frame: pdb.Pdb().set_trace(frame))
|
||||||
|
|
||||||
import companion
|
import companion
|
||||||
@ -61,7 +63,6 @@ from protocol import protocolhandler
|
|||||||
from dashboard import dashboard
|
from dashboard import dashboard
|
||||||
from theme import theme
|
from theme import theme
|
||||||
|
|
||||||
|
|
||||||
SERVER_RETRY = 5 # retry pause for Companion servers [s]
|
SERVER_RETRY = 5 # retry pause for Companion servers [s]
|
||||||
|
|
||||||
SHIPYARD_HTML_TEMPLATE = """
|
SHIPYARD_HTML_TEMPLATE = """
|
||||||
@ -81,7 +82,6 @@ SHIPYARD_HTML_TEMPLATE = """
|
|||||||
|
|
||||||
|
|
||||||
class AppWindow(object):
|
class AppWindow(object):
|
||||||
|
|
||||||
# Tkinter Event types
|
# Tkinter Event types
|
||||||
EVENT_KEYPRESS = 2
|
EVENT_KEYPRESS = 2
|
||||||
EVENT_BUTTON = 4
|
EVENT_BUTTON = 4
|
||||||
@ -104,10 +104,14 @@ class AppWindow(object):
|
|||||||
if platform == 'win32':
|
if platform == 'win32':
|
||||||
self.w.wm_iconbitmap(default='EDMarketConnector.ico')
|
self.w.wm_iconbitmap(default='EDMarketConnector.ico')
|
||||||
else:
|
else:
|
||||||
self.w.tk.call('wm', 'iconphoto', self.w, '-default', tk.PhotoImage(file=join(config.respath, 'EDMarketConnector.png'))) # noqa: E501
|
self.w.tk.call('wm', 'iconphoto', self.w, '-default',
|
||||||
self.theme_icon = tk.PhotoImage(data='R0lGODlhFAAQAMZQAAoKCQoKCgsKCQwKCQsLCgwLCg4LCQ4LCg0MCg8MCRAMCRANChINCREOChIOChQPChgQChgRCxwTCyYVCSoXCS0YCTkdCTseCT0fCTsjDU0jB0EnDU8lB1ElB1MnCFIoCFMoCEkrDlkqCFwrCGEuCWIuCGQvCFs0D1w1D2wyCG0yCF82D182EHE0CHM0CHQ1CGQ5EHU2CHc3CHs4CH45CIA6CIE7CJdECIdLEolMEohQE5BQE41SFJBTE5lUE5pVE5RXFKNaFKVbFLVjFbZkFrxnFr9oFsNqFsVrF8RsFshtF89xF9NzGNh1GNl2GP+KG////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////yH5BAEKAH8ALAAAAAAUABAAAAeegAGCgiGDhoeIRDiIjIZGKzmNiAQBQxkRTU6am0tPCJSGShuSAUcLoIIbRYMFra4FAUgQAQCGJz6CDQ67vAFJJBi0hjBBD0w9PMnJOkAiJhaIKEI7HRoc19ceNAolwbWDLD8uAQnl5ga1I9CHEjEBAvDxAoMtFIYCBy+kFDKHAgM3ZtgYSLAGgwkp3pEyBOJCC2ELB31QATGioAoVAwEAOw==') # noqa: E501
|
tk.PhotoImage(file=join(config.respath, 'EDMarketConnector.png'))) # noqa: E501
|
||||||
self.theme_minimize = tk.BitmapImage(data='#define im_width 16\n#define im_height 16\nstatic unsigned char im_bits[] = {\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x3f,\n 0xfc, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };\n') # noqa: E501
|
self.theme_icon = tk.PhotoImage(
|
||||||
self.theme_close = tk.BitmapImage(data='#define im_width 16\n#define im_height 16\nstatic unsigned char im_bits[] = {\n 0x00, 0x00, 0x00, 0x00, 0x0c, 0x30, 0x1c, 0x38, 0x38, 0x1c, 0x70, 0x0e,\n 0xe0, 0x07, 0xc0, 0x03, 0xc0, 0x03, 0xe0, 0x07, 0x70, 0x0e, 0x38, 0x1c,\n 0x1c, 0x38, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x00 };\n') # noqa: E501
|
data='R0lGODlhFAAQAMZQAAoKCQoKCgsKCQwKCQsLCgwLCg4LCQ4LCg0MCg8MCRAMCRANChINCREOChIOChQPChgQChgRCxwTCyYVCSoXCS0YCTkdCTseCT0fCTsjDU0jB0EnDU8lB1ElB1MnCFIoCFMoCEkrDlkqCFwrCGEuCWIuCGQvCFs0D1w1D2wyCG0yCF82D182EHE0CHM0CHQ1CGQ5EHU2CHc3CHs4CH45CIA6CIE7CJdECIdLEolMEohQE5BQE41SFJBTE5lUE5pVE5RXFKNaFKVbFLVjFbZkFrxnFr9oFsNqFsVrF8RsFshtF89xF9NzGNh1GNl2GP+KG////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////yH5BAEKAH8ALAAAAAAUABAAAAeegAGCgiGDhoeIRDiIjIZGKzmNiAQBQxkRTU6am0tPCJSGShuSAUcLoIIbRYMFra4FAUgQAQCGJz6CDQ67vAFJJBi0hjBBD0w9PMnJOkAiJhaIKEI7HRoc19ceNAolwbWDLD8uAQnl5ga1I9CHEjEBAvDxAoMtFIYCBy+kFDKHAgM3ZtgYSLAGgwkp3pEyBOJCC2ELB31QATGioAoVAwEAOw==') # noqa: E501
|
||||||
|
self.theme_minimize = tk.BitmapImage(
|
||||||
|
data='#define im_width 16\n#define im_height 16\nstatic unsigned char im_bits[] = {\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x3f,\n 0xfc, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };\n') # noqa: E501
|
||||||
|
self.theme_close = tk.BitmapImage(
|
||||||
|
data='#define im_width 16\n#define im_height 16\nstatic unsigned char im_bits[] = {\n 0x00, 0x00, 0x00, 0x00, 0x0c, 0x30, 0x1c, 0x38, 0x38, 0x1c, 0x70, 0x0e,\n 0xe0, 0x07, 0xc0, 0x03, 0xc0, 0x03, 0xe0, 0x07, 0x70, 0x0e, 0x38, 0x1c,\n 0x1c, 0x38, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x00 };\n') # noqa: E501
|
||||||
|
|
||||||
frame = tk.Frame(self.w, name=appname.lower())
|
frame = tk.Frame(self.w, name=appname.lower())
|
||||||
frame.grid(sticky=tk.NSEW)
|
frame.grid(sticky=tk.NSEW)
|
||||||
@ -152,7 +156,8 @@ class AppWindow(object):
|
|||||||
row = frame.grid_size()[1]
|
row = frame.grid_size()[1]
|
||||||
self.button.grid(row=row, columnspan=2, sticky=tk.NSEW)
|
self.button.grid(row=row, columnspan=2, sticky=tk.NSEW)
|
||||||
self.theme_button.grid(row=row, columnspan=2, sticky=tk.NSEW)
|
self.theme_button.grid(row=row, columnspan=2, sticky=tk.NSEW)
|
||||||
theme.register_alternate((self.button, self.theme_button, self.theme_button), {'row': row, 'columnspan': 2, 'sticky': tk.NSEW}) # noqa: E501
|
theme.register_alternate((self.button, self.theme_button, self.theme_button),
|
||||||
|
{'row': row, 'columnspan': 2, 'sticky': tk.NSEW}) # noqa: E501
|
||||||
self.status.grid(columnspan=2, sticky=tk.EW)
|
self.status.grid(columnspan=2, sticky=tk.EW)
|
||||||
self.button.bind('<Button-1>', self.getandsend)
|
self.button.bind('<Button-1>', self.getandsend)
|
||||||
theme.button_bind(self.theme_button, self.getandsend)
|
theme.button_bind(self.theme_button, self.getandsend)
|
||||||
@ -291,6 +296,7 @@ class AppWindow(object):
|
|||||||
# Check that the titlebar will be at least partly on screen
|
# Check that the titlebar will be at least partly on screen
|
||||||
import ctypes
|
import ctypes
|
||||||
from ctypes.wintypes import POINT
|
from ctypes.wintypes import POINT
|
||||||
|
|
||||||
# https://msdn.microsoft.com/en-us/library/dd145064
|
# https://msdn.microsoft.com/en-us/library/dd145064
|
||||||
MONITOR_DEFAULTTONULL = 0 # noqa: N806
|
MONITOR_DEFAULTTONULL = 0 # noqa: N806
|
||||||
if ctypes.windll.user32.MonitorFromPoint(POINT(int(match.group(1)) + 16, int(match.group(2)) + 16),
|
if ctypes.windll.user32.MonitorFromPoint(POINT(int(match.group(1)) + 16, int(match.group(2)) + 16),
|
||||||
@ -322,6 +328,7 @@ class AppWindow(object):
|
|||||||
|
|
||||||
# Load updater after UI creation (for WinSparkle)
|
# Load updater after UI creation (for WinSparkle)
|
||||||
import update
|
import update
|
||||||
|
|
||||||
if getattr(sys, 'frozen', False):
|
if getattr(sys, 'frozen', False):
|
||||||
# Running in frozen .exe, so use (Win)Sparkle
|
# Running in frozen .exe, so use (Win)Sparkle
|
||||||
self.updater = update.Updater(tkroot=self.w, provider='external')
|
self.updater = update.Updater(tkroot=self.w, provider='external')
|
||||||
@ -971,6 +978,7 @@ def enforce_single_instance() -> None:
|
|||||||
if platform == 'win32':
|
if platform == 'win32':
|
||||||
import ctypes
|
import ctypes
|
||||||
from ctypes.wintypes import HWND, LPWSTR, LPCWSTR, INT, BOOL, LPARAM
|
from ctypes.wintypes import HWND, LPWSTR, LPCWSTR, INT, BOOL, LPARAM
|
||||||
|
|
||||||
EnumWindows = ctypes.windll.user32.EnumWindows # noqa: N806
|
EnumWindows = ctypes.windll.user32.EnumWindows # noqa: N806
|
||||||
GetClassName = ctypes.windll.user32.GetClassNameW # noqa: N806
|
GetClassName = ctypes.windll.user32.GetClassNameW # noqa: N806
|
||||||
GetClassName.argtypes = [HWND, LPWSTR, ctypes.c_int] # noqa: N806
|
GetClassName.argtypes = [HWND, LPWSTR, ctypes.c_int] # noqa: N806
|
||||||
@ -1028,17 +1036,8 @@ def test_logging():
|
|||||||
logger.debug('Test from EDMarketConnector.py top-level test_logging()')
|
logger.debug('Test from EDMarketConnector.py top-level test_logging()')
|
||||||
|
|
||||||
|
|
||||||
# Run the app
|
def log_locale(prefix: str) -> None:
|
||||||
if __name__ == "__main__":
|
logger.debug(f'''Locale: {prefix}
|
||||||
enforce_single_instance()
|
|
||||||
|
|
||||||
from EDMCLogging import logger
|
|
||||||
logger.info(f'Startup v{appversion} : Running on Python v{sys.version}')
|
|
||||||
logger.debug(f'''Platform: {sys.platform}
|
|
||||||
argv[0]: {sys.argv[0]}
|
|
||||||
exec_prefix: {sys.exec_prefix}
|
|
||||||
executable: {sys.executable}
|
|
||||||
sys.path: {sys.path}
|
|
||||||
Locale LC_COLLATE: {locale.getlocale(locale.LC_COLLATE)}
|
Locale LC_COLLATE: {locale.getlocale(locale.LC_COLLATE)}
|
||||||
Locale LC_CTYPE: {locale.getlocale(locale.LC_CTYPE)}
|
Locale LC_CTYPE: {locale.getlocale(locale.LC_CTYPE)}
|
||||||
Locale LC_MONETARY: {locale.getlocale(locale.LC_MONETARY)}
|
Locale LC_MONETARY: {locale.getlocale(locale.LC_MONETARY)}
|
||||||
@ -1046,20 +1045,43 @@ Locale LC_NUMERIC: {locale.getlocale(locale.LC_NUMERIC)}
|
|||||||
Locale LC_TIME: {locale.getlocale(locale.LC_TIME)}'''
|
Locale LC_TIME: {locale.getlocale(locale.LC_TIME)}'''
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# Run the app
|
||||||
|
if __name__ == "__main__":
|
||||||
|
enforce_single_instance()
|
||||||
|
|
||||||
|
from EDMCLogging import logger
|
||||||
|
|
||||||
|
logger.info(f'Startup v{appversion} : Running on Python v{sys.version}')
|
||||||
|
logger.debug(f'''Platform: {sys.platform}
|
||||||
|
argv[0]: {sys.argv[0]}
|
||||||
|
exec_prefix: {sys.exec_prefix}
|
||||||
|
executable: {sys.executable}
|
||||||
|
sys.path: {sys.path}'''
|
||||||
|
)
|
||||||
|
|
||||||
# Change locale to a utf8 one
|
# Change locale to a utf8 one
|
||||||
# First make sure the local is actually set as per locale's idea of defaults
|
# Log what we have at startup
|
||||||
|
log_locale('Initial Locale')
|
||||||
|
# Make sure the local is actually set as per locale's idea of defaults
|
||||||
locale.setlocale(locale.LC_ALL, '')
|
locale.setlocale(locale.LC_ALL, '')
|
||||||
|
log_locale('After LC_ALL defaults set')
|
||||||
# Now find out the current locale, mostly the language
|
# Now find out the current locale, mostly the language
|
||||||
locale_startup = locale.getlocale(locale.LC_ALL)
|
locale_startup = locale.getlocale(locale.LC_ALL)
|
||||||
|
logger.debug(f'Locale LC_ALL: {locale_startup}')
|
||||||
# Now set that same language, but utf8 encoding (it was probably cp1252
|
# Now set that same language, but utf8 encoding (it was probably cp1252
|
||||||
# or equivalent for other languages).
|
# or equivalent for other languages).
|
||||||
locale.setlocale(locale.LC_ALL, (locale_startup[0], 'utf8'))
|
locale.setlocale(locale.LC_ALL, (locale_startup[0], 'utf8'))
|
||||||
|
log_locale('After switching to utf8 encoding (same language)')
|
||||||
|
|
||||||
# TODO: unittests in place of these
|
# TODO: unittests in place of these
|
||||||
# logger.debug('Test from __main__')
|
# logger.debug('Test from __main__')
|
||||||
# test_logging()
|
# test_logging()
|
||||||
|
|
||||||
class A(object):
|
class A(object):
|
||||||
|
|
||||||
class B(object):
|
class B(object):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
logger.debug('A call from A.B.__init__')
|
logger.debug('A call from A.B.__init__')
|
||||||
|
|
||||||
@ -1102,7 +1124,8 @@ Locale LC_TIME: {locale.getlocale(locale.LC_TIME)}'''
|
|||||||
# Now the string should match, so try translation
|
# Now the string should match, so try translation
|
||||||
popup_text = _(popup_text)
|
popup_text = _(popup_text)
|
||||||
# And substitute in the other words.
|
# And substitute in the other words.
|
||||||
popup_text = popup_text.format(PLUGINS=_('Plugins'), FILE=_('File'), SETTINGS=_('Settings'), DISABLED='.disabled')
|
popup_text = popup_text.format(PLUGINS=_('Plugins'), FILE=_('File'), SETTINGS=_('Settings'),
|
||||||
|
DISABLED='.disabled')
|
||||||
# And now we do need these to be actual \r\n
|
# And now we do need these to be actual \r\n
|
||||||
popup_text = popup_text.replace('\\n', '\n')
|
popup_text = popup_text.replace('\\n', '\n')
|
||||||
popup_text = popup_text.replace('\\r', '\r')
|
popup_text = popup_text.replace('\\r', '\r')
|
||||||
|
Loading…
x
Reference in New Issue
Block a user