66from transifex .common .utils import generate_key , parse_plurals
77from transifex .native .cache import MemoryCache
88from transifex .native .cds import CDSHandler
9+ from transifex .native .events import EventDispatcher
910from transifex .native .rendering import (SourceStringErrorPolicy ,
1011 SourceStringPolicy , StringRenderer )
1112
@@ -20,6 +21,7 @@ def __init__(self, **kwargs):
2021 self .hardcoded_language_codes = None
2122 self .remote_languages = None
2223
24+ self ._event_dispatcher = EventDispatcher ()
2325 self ._missing_policy = SourceStringPolicy ()
2426 self ._cds_handler = CDSHandler ()
2527 self ._cache = MemoryCache ()
@@ -62,10 +64,19 @@ def setup(self,
6264
6365 if current_language is not None :
6466 self .set_current_language (current_language )
67+ elif source_language is not None :
68+ self .set_current_language (source_language )
6569
6670 def fetch_languages (self , force = False ):
6771 if self .remote_languages is None or force :
68- self .remote_languages = self ._cds_handler .fetch_languages ()
72+ self ._event_dispatcher .trigger ('FETCHING_LOCALES' )
73+ try :
74+ self .remote_languages = self ._cds_handler .fetch_languages ()
75+ except Exception :
76+ self ._event_dispatcher .trigger ('LOCALES_FETCH_FAILED' )
77+ raise
78+ else :
79+ self ._event_dispatcher .trigger ('LOCALES_FETCHED' )
6980
7081 if self .hardcoded_language_codes is not None :
7182 return [language
@@ -81,7 +92,9 @@ def set_current_language(self, language_code, force=False):
8192 format (language_code ))
8293 if language_code not in self ._cache or force :
8394 self .fetch_translations (language_code = language_code , force = True )
95+ prev = self .current_language_code
8496 self .current_language_code = language_code
97+ self ._event_dispatcher .trigger ('LOCALE_CHANGED' , prev , language_code )
8598
8699 def fetch_translations (self , language_code = None , force = False ):
87100 """Fetch fresh content from the CDS."""
@@ -95,10 +108,20 @@ def fetch_translations(self, language_code=None, force=False):
95108 "Language {} is not supported by the application" .
96109 format (language_code )
97110 )
98- if language_code not in self ._cache or force :
99- translations = self ._cds_handler .\
100- fetch_translations (language_code )
101- self ._cache .update (translations )
111+ self ._event_dispatcher .trigger ('FETCHING_TRANSLATIONS' ,
112+ language_code )
113+ try :
114+ if language_code not in self ._cache or force :
115+ translations = self ._cds_handler .\
116+ fetch_translations (language_code )
117+ self ._cache .update (translations )
118+ except Exception :
119+ self ._event_dispatcher .trigger ('TRANSLATIONS_FETCH_FAILED' ,
120+ language_code )
121+ raise
122+ else :
123+ self ._event_dispatcher .trigger ('TRANSLATIONS_FETCHED' ,
124+ language_code )
102125
103126 def translate (self , source_string , language_code = None , _context = None ,
104127 escape = True , params = None ):
@@ -191,3 +214,10 @@ def push_source_strings(self, strings, purge=False):
191214 """
192215 response = self ._cds_handler .push_source_strings (strings , purge )
193216 return response .status_code , json .loads (response .content )
217+
218+ # Events
219+ def on (self , label , callback ):
220+ self ._event_dispatcher .on (label , callback )
221+
222+ def off (self , label , callback ):
223+ self ._event_dispatcher .off (label , callback )
0 commit comments