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