kivy: change language without restarting the app
This commit is contained in:
36
gui/kivy/i18n.py
Normal file
36
gui/kivy/i18n.py
Normal file
@@ -0,0 +1,36 @@
|
||||
import gettext
|
||||
|
||||
class _(str):
|
||||
|
||||
observers = set()
|
||||
lang = None
|
||||
|
||||
def __new__(cls, s, *args, **kwargs):
|
||||
if _.lang is None:
|
||||
_.switch_lang('en')
|
||||
t = _.translate(s, *args, **kwargs)
|
||||
o = super(_, cls).__new__(cls, t)
|
||||
o.source_text = s
|
||||
return o
|
||||
|
||||
@staticmethod
|
||||
def translate(s, *args, **kwargs):
|
||||
return _.lang(s).format(args, kwargs)
|
||||
|
||||
@staticmethod
|
||||
def bind(label):
|
||||
if isinstance(label.text, _):
|
||||
_.observers.add(label)
|
||||
|
||||
@staticmethod
|
||||
def switch_lang(lang):
|
||||
# get the right locales directory, and instanciate a gettext
|
||||
from electrum.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 ReferenceError:
|
||||
pass
|
||||
|
||||
Reference in New Issue
Block a user