"""Kivy observable adapter for the framework-neutral translator.""" from kivy._event import Observable from katrain.core.lang import DEFAULT_LANGUAGE, Lang as CoreLang from katrain.gui.theme import Theme class Lang(CoreLang, Observable): observers = [] def __init__(self, lang): Observable.__init__(self) self.callbacks = [] super().__init__(lang) def set_widget_font(self, widget): widget.font_name = self.font_name or Theme.DEFAULT_FONT for sub_widget in [getattr(widget, "_hint_lbl", None), getattr(widget, "_msg_lbl", None)]: if sub_widget: sub_widget.font_name = widget.font_name def fbind(self, name, func, *args): if name != "_": return Observable.fbind(self, name, func, *args) widget, _property, *_ = args[0] self.observers.append((widget, func, args)) self.set_widget_font(widget) def funbind(self, name, func, *args): if name != "_": return Observable.funbind(self, name, func, *args) widget, *_ = args[0] key = (widget, func, args) if key in self.observers: self.observers.remove(key) def switch_lang(self, lang): previous = self.lang super().switch_lang(lang) if lang == previous: return for widget, func, args in self.observers: try: func(args[0], None, None) self.set_widget_font(widget) except ReferenceError: pass for callback in self.callbacks: callback(self) i18n = Lang(DEFAULT_LANGUAGE) def rank_label(rank): if rank is None: return "??k" if rank >= 0.5: return f"{rank:.0f}{i18n._('strength:dan')}" return f"{1-rank:.0f}{i18n._('strength:kyu')}" __all__ = ["DEFAULT_LANGUAGE", "i18n", "rank_label"]