i18n.py (1104B)
1 import gettext 2 3 4 class _(str): 5 6 observers = set() 7 lang = None 8 9 def __new__(cls, s): 10 if _.lang is None: 11 _.switch_lang('en') 12 t = _.translate(s) 13 o = super(_, cls).__new__(cls, t) 14 o.source_text = s 15 return o 16 17 @staticmethod 18 def translate(s, *args, **kwargs): 19 return _.lang(s) 20 21 @staticmethod 22 def bind(label): 23 try: 24 _.observers.add(label) 25 except: 26 pass 27 # garbage collection 28 new = set() 29 for label in _.observers: 30 try: 31 new.add(label) 32 except: 33 pass 34 _.observers = new 35 36 @staticmethod 37 def switch_lang(lang): 38 # get the right locales directory, and instanciate a gettext 39 from electrum.i18n import LOCALE_DIR 40 locales = gettext.translation('electrum', LOCALE_DIR, languages=[lang], fallback=True) 41 _.lang = locales.gettext 42 for label in _.observers: 43 try: 44 label.text = _(label.text.source_text) 45 except: 46 pass