From 4ede555c13a1da8572fed690c30434cd0f27dbb4 Mon Sep 17 00:00:00 2001 From: A_D <aunderscored@gmail.com> Date: Sat, 7 Nov 2020 15:52:42 +0200 Subject: [PATCH] Refactored return based logic A good chunk of the logic in here was returning from branches but still using else/elif/except branches to do an alternate behaviour. --- l10n.py | 148 +++++++++++++++++++++++++------------------------------- 1 file changed, 66 insertions(+), 82 deletions(-) diff --git a/l10n.py b/l10n.py index fb6a8b06..d9fcce63 100755 --- a/l10n.py +++ b/l10n.py @@ -10,10 +10,11 @@ import re import sys from codecs import StreamReaderWriter from collections import OrderedDict +from contextlib import suppress from os.path import basename, dirname, exists, isdir, isfile, join, normpath from sys import platform from traceback import print_exc -from typing import TYPE_CHECKING, Any, Dict, Iterable, Optional, Set, Union, cast +from typing import TYPE_CHECKING, Dict, Iterable, Optional, Set, Union, cast if TYPE_CHECKING: def _(x: str) -> str: ... @@ -106,22 +107,22 @@ class _Translations: if lang not in self.available(): self.install_dummy() + return - else: - self.translations = {None: self.contents(cast(str, lang))} - for plugin in os.listdir(config.plugin_dir): - plugin_path = join(config.plugin_dir, plugin, LOCALISATION_DIR) - if isdir(plugin_path): - try: - self.translations[plugin] = self.contents(cast(str, lang), plugin_path) + self.translations = {None: self.contents(cast(str, lang))} + for plugin in os.listdir(config.plugin_dir): + plugin_path = join(config.plugin_dir, plugin, LOCALISATION_DIR) + if isdir(plugin_path): + try: + self.translations[plugin] = self.contents(cast(str, lang), plugin_path) - except UnicodeDecodeError as e: - print(f'Malformed file {lang}.strings in plugin {plugin}: {e}') + except UnicodeDecodeError as e: + print(f'Malformed file {lang}.strings in plugin {plugin}: {e}') - except Exception: - print_exc() + except Exception: + print_exc() - builtins.__dict__['_'] = self.translate + builtins.__dict__['_'] = self.translate def contents(self, lang: str, plugin_path: Optional[str] = None) -> Dict[str, str]: """Get all the translations from a translation file.""" @@ -131,16 +132,15 @@ class _Translations: if not h: return {} - else: - for line in h: - if line.strip(): - match = _Translations.TRANS_RE.match(line) - if match: - to_set = match.group(2).replace(r'\"', u'"').replace(u'{CR}', u'\n') - translations[match.group(1).replace(r'\"', u'"')] = to_set + for line in h: + if line.strip(): + match = _Translations.TRANS_RE.match(line) + if match: + to_set = match.group(2).replace(r'\"', u'"').replace(u'{CR}', u'\n') + translations[match.group(1).replace(r'\"', u'"')] = to_set - elif __debug__ and not _Translations.COMMENT_RE.match(line): - print(f'Bad translation: {line.strip()}') + elif __debug__ and not _Translations.COMMENT_RE.match(line): + print(f'Bad translation: {line.strip()}') if translations.get(LANGUAGE_ID, LANGUAGE_ID) == LANGUAGE_ID: translations[LANGUAGE_ID] = str(lang) # Replace language name with code if missing @@ -163,12 +163,11 @@ class _Translations: return self.translations.get(context, {}).get(x) or self.translate(x) - else: - if __debug__: - if self.translations[None] and x not in self.translations[None]: - print(f'Missing translation: {x!r}') + if __debug__: + if self.translations[None] and x not in self.translations[None]: + print(f'Missing translation: {x!r}') - return self.translations[None].get(x) or str(x).replace(r'\"', u'"').replace(u'{CR}', u'\n') + return self.translations[None].get(x) or str(x).replace(r'\"', u'"').replace(u'{CR}', u'\n') def available(self) -> Set[str]: """Return a list of available language codes.""" @@ -186,11 +185,11 @@ class _Translations: def available_names(self) -> Dict[Optional[str], str]: """Available language names by code.""" - names = OrderedDict([ + names: Dict[Optional[str], str] = OrderedDict([ (None, _('Default')), # Appearance theme and language setting ]) names.update(sorted( - [(lang, self.contents(lang).get(LANGUAGE_ID, lang)) for lang in self.available()] + # type: ignore + [(lang, self.contents(lang).get(LANGUAGE_ID, lang)) for lang in self.available()] + [(_Translations.FALLBACK, _Translations.FALLBACK_NAME)], key=lambda x: x[1] )) # Sort by name @@ -203,14 +202,12 @@ class _Translations: if platform == 'darwin': return normpath(join(dirname(sys.executable), os.pardir, 'Resources')) - else: - return join(dirname(sys.executable), LOCALISATION_DIR) + return join(dirname(sys.executable), LOCALISATION_DIR) elif __file__: return join(dirname(__file__), LOCALISATION_DIR) - else: - return LOCALISATION_DIR + return LOCALISATION_DIR def file(self, lang: str, plugin_path: Optional[str] = None) -> Optional[StreamReaderWriter]: """ @@ -235,8 +232,7 @@ class _Translations: elif getattr(sys, 'frozen', False) and platform == 'darwin': return codecs.open(join(self.respath(), f'{lang}.lproj', 'Localizable.strings'), 'r', 'utf-16') - else: - return codecs.open(join(self.respath(), f'{lang}.strings'), 'r', 'utf-8') + return codecs.open(join(self.respath(), f'{lang}.strings'), 'r', 'utf-8') class _Locale: @@ -270,17 +266,15 @@ class _Locale: if not decimals and isinstance(number, numbers.Integral): return self.int_formatter.stringFromNumber_(number) - else: - self.float_formatter.setMinimumFractionDigits_(decimals) - self.float_formatter.setMaximumFractionDigits_(decimals) - return self.float_formatter.stringFromNumber_(number) + self.float_formatter.setMinimumFractionDigits_(decimals) + self.float_formatter.setMaximumFractionDigits_(decimals) + return self.float_formatter.stringFromNumber_(number) + + if not decimals and isinstance(number, numbers.Integral): + return locale.format('%d', number, True) else: - if not decimals and isinstance(number, numbers.Integral): - return locale.format('%d', number, True) - - else: - return locale.format('%.*f', (decimals, number), True) # type: ignore # It ends up working out + return locale.format('%.*f', (decimals, number), True) # type: ignore # It ends up working out def numberFromString(self, string: str) -> Union[int, float, None]: """ @@ -293,16 +287,13 @@ class _Locale: if platform == 'darwin': return self.float_formatter.numberFromString_(string) - else: - try: # TODO: This is awful. - return locale.atoi(string) + with suppress(ValueError): + return locale.atoi(string) - except Exception: - try: - return locale.atof(string) + with suppress(ValueError): + return locale.atof(string) - except Exception: - return None + return None def preferredLanguages(self) -> Iterable[str]: """ @@ -318,39 +309,32 @@ class _Locale: if platform == 'darwin': return NSLocale.preferredLanguages() - elif platform == 'win32': - - def wszarray_to_list(array): - offset = 0 - while offset < len(array): - sz = ctypes.wstring_at(ctypes.addressof(array) + offset*2) - if sz: - yield sz - offset += len(sz)+1 - - else: - break - - num = ctypes.c_ulong() - size = ctypes.c_ulong(0) - if ( - GetUserPreferredUILanguages(MUI_LANGUAGE_NAME, ctypes.byref(num), None, ctypes.byref(size)) - and size.value - ): - buf = ctypes.create_unicode_buffer(size.value) - if ( - GetUserPreferredUILanguages( - MUI_LANGUAGE_NAME, ctypes.byref(num), ctypes.byref(buf), ctypes.byref(size) - ) - ): - return wszarray_to_list(buf) - - return [] - - else: # POSIX + elif platform != 'win32': + # POSIX lang = locale.getlocale()[0] return lang and [lang.replace('_', '-')] or [] + def wszarray_to_list(array): + offset = 0 + while offset < len(array): + sz = ctypes.wstring_at(ctypes.addressof(array) + offset*2) + if sz: + yield sz + offset += len(sz)+1 + + else: + break + + num = ctypes.c_ulong() + size = ctypes.c_ulong(0) + if GetUserPreferredUILanguages(MUI_LANGUAGE_NAME, ctypes.byref(num), None, ctypes.byref(size)) and size.value: + buf = ctypes.create_unicode_buffer(size.value) + + if GetUserPreferredUILanguages(MUI_LANGUAGE_NAME, ctypes.byref(num), ctypes.byref(buf), ctypes.byref(size)): + return wszarray_to_list(buf) + + return [] + # singletons Locale = _Locale()