64 lines
1.8 KiB
Python
64 lines
1.8 KiB
Python
"""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"]
|