Sideband/sbapp/kivymd/tools/patterns/MVC/libs/translation.py

50 lines
1.4 KiB
Python

import gettext
from kivy.lang import Observable
class Translation(Observable):
"""Original source - https://github.com/tito/kivy-gettext-example."""
observers = []
def __init__(self, defaultlang, domian, resource_dir):
super().__init__()
self.ugettext = None
self.lang = defaultlang
self.domian = domian
self.resource_dir = resource_dir
self.switch_lang(self.lang)
def _(self, text):
return self.ugettext(text)
def fbind(self, name, func, args, **kwargs):
if name == "_":
self.observers.append((func, args, kwargs))
else:
return super().fbind(name, func, *args, **kwargs)
def funbind(self, name, func, args, **kwargs):
if name == "_":
key = (func, args, kwargs)
if key in self.observers:
self.observers.remove(key)
else:
return super().funbind(name, func, *args, **kwargs)
def switch_lang(self, lang):
locales = gettext.translation(
self.domian, self.resource_dir, languages=[lang]
)
try:
self.ugettext = locales.ugettext
except AttributeError:
self.ugettext = locales.gettext
for func, largs, kwargs in self.observers:
try:
func(largs, None, None)
except ReferenceError:
pass