import gettext class _(str): observers = set() lang = None def __new__(cls, s): if _.lang is None: _.switch_lang('en') t = _.translate(s) o = super(_, cls).__new__(cls, t) o.source_text = s return o @staticmethod def translate(s, *args, **kwargs): return _.lang(s) @staticmethod def bind(label): try: _.observers.add(label) except: pass # garbage collection new = set() for label in _.observers: try: new.add(label) except: pass _.observers = new @staticmethod def switch_lang(lang): # get the right locales directory, and instanciate a gettext from electrum_bitcoinprivate.i18n import LOCALE_DIR locales = gettext.translation('electrum', LOCALE_DIR, languages=[lang], fallback=True) _.lang = locales.gettext for label in _.observers: try: label.text = _(label.text.source_text) except: pass