
    IwiA                     ~   % S r SSKrSSKrSSKrSSKJr  SSKJrJr  SSK	J
r
  \R                  " SSS9r\R                  \S-     \S'    " S	 S
5      rSq\\   \S'   \" 5       rSS\\   S\4S jjrS\S\R&                  \S-     4S jrS\R&                  \S-     SS4S jrS\S\4S jrS\\\\\4      4S jrg)zo
Internationalization (i18n) module for Gradio UI
Supports multiple languages with easy translation management
    N)Lock)DictOptional)loggercurrent_language)default_current_language_varc                       \ rS rSrSrSS\4S jjrS rS\4S jrS\S	\4S
 jr	S\
S\S	\\   4S jrS	\4S jrS	\\\\\4      4S jrSrg)I18n   zInternationalization handlerdefault_languagec                 j    [        5       U l        Xl        / U l        0 U l        U R                  5         g)z_
Initialize i18n handler

Args:
    default_language: Default language code (en, zh, ja, etc.)
N)r   _lockr   languages_infotranslations_load_all_translations)selfr   s     :/mnt/workspace/ACE-Step-1.5/acestep/ui/gradio/i18n/i18n.py__init__I18n.__init__   s/     V
 0:<79##%    c                    [         R                  R                  [        5      n[         R                  R	                  U5      n[         R                  R                  U5      (       d  [         R                  " U5        g[         R                  " U5       GH  nUR                  S5      (       d  M  USS n[         R                  R                  X#5      n [        USSS9 n[        R                  " U5      U R                  U'   SSS5        U R                  U R                  R                  U0 5      S5      =(       d    UR!                  5       nU R                  U R                  R                  U0 5      S5      =(       d    UnU R"                  R%                  XGU45        GM     g! , (       d  f       N= f! [&         a  n	[)        S	U S
U	 35         Sn	A	GMF  Sn	A	ff = f)z/Load all translation files from i18n directory.Nz.jsonrzutf-8)encodingzcommon.language_metadata.namez$common.language_metadata.native_namezError loading translation file z: )ospathabspath__file__dirnameexistsmakedirslistdirendswithjoinopenjsonloadr   _get_nested_valuegetupperr   append	Exceptionprint)
r   current_filei18n_dirfilename	lang_codefilepathf	lang_namelang_native_namees
             r   r   I18n._load_all_translations%   s   wwx077??<0ww~~h''KK! 

8,H  ))$SbM	77<<;Yhg>!7;yy|)))4 ?
 !% 6 6))--i<7!9 !N<EOO<M  (,'='=))--i<>(@ (MCL % ''..	FV/WX! -
 ?>  M;H:RsKLLMs0   F8 $F'F8'
F5	1F88
GGGlanguagec                     U R                      XR                  ;   a  Xl        O[        SU S35        SSS5        g! , (       d  f       g= f)zWSet the instance-level default language (shared fallback when no ContextVar is active).zWarning: Language 'z' not found, using defaultN)r   r   r   r.   )r   r9   s     r   set_languageI18n.set_languageB   s8    ZZ,,,(0%+H:5OPQ	 ZZs	   &<
A
keyreturnc                    [         R                  5       nUc!  U R                     U R                  nSSS5        U R	                  U R
                  R                  U0 5      U5      nUc,  U R	                  U R
                  R                  S0 5      U5      nUc  UnU(       a   UR                  " S0 UD6nU$ U$ ! , (       d  f       N= f! [         a     U$ f = f)zRTranslate *key* using per-request ContextVar, then instance default, then English.Nen )r	   r*   r   r   r)   r   formatKeyError)r   r=   kwargslangtranslations        r   tI18n.tJ   s     %((*<,,  ,,!!$+
 00!!%%dB/K K )00:6: {7 0  s   B7!C 7
C
CCdatac                     UR                  S5      nUnU H#  n[        U[        5      (       a  XT;   a  XE   nM#    g   [        U[        5      (       a  U$ S$ )z
Get nested dictionary value using dot notation

Args:
    data: Dictionary to search
    key: Dot-separated key (e.g., "section.subsection.key")

Returns:
    Value if found, None otherwise
.N)split
isinstancedictstr)r   rI   r=   keyscurrentks         r   r)   I18n._get_nested_valuem   sT     yy~A'4((Q\!*	  %Wc22w<<r   c                 H    [        U R                  R                  5       5      $ )z$Get list of available language codes)listr   rP   r   s    r   get_available_languagesI18n.get_available_languages   s    D%%**,--r   c                 ,    [        U R                  5      $ )z
Provides a list of tuples containing ISO codes and descriptive language names

Returns:
    List of tuples (iso code, english name, native name)
 )rU   r   rV   s    r   get_available_languages_info!I18n.get_available_languages_info   s     D''((r   )r   r   r   r   N)r@   )__name__
__module____qualname____firstlineno____doc__rO   r   r   r;   rG   rN   r   r)   rU   rW   tuplerZ   __static_attributes__rA   r   r   r   r      s    && &Y:RS R!S !s !F=d = =# =,. .)d5c33G.H )r   r   _i18n_instancer9   r>   c                     [         c8  [           [         c!  [        U =(       d    SS9q [         sSSS5        $  SSS5        U b  [         R                  U 5        [         $ ! , (       d  f       N,= f)zd
Get global i18n instance

Args:
    language: Optional language to set

Returns:
    I18n instance
Nr@   )r   )rc   
_i18n_lockr   r;   )r9   s    r   get_i18nrf      sX     %!%x7G4!H% Z%  ##H- Zs   A
A,c                     [         R                  U 5      n[        nUb&  XR                  ;  a  [        R
                  " SU 5        U$ )a  Set the per-request language for the current execution context.

Call at a request boundary (Gradio event handler, FastAPI middleware)
to scope ``t()`` calls to *language* without mutating shared state.
If *language* is not in loaded translations, ``t()`` silently falls
back to English.  Requires the singleton to be initialised first
(via ``get_i18n()``) for validation; otherwise the check is skipped.

Returns a token for ``reset_language_context`` to restore the prior value.
z@Language '{}' not in translations, t() will fall back to English)r	   setrc   r   r   warning)r9   tokeninstances      r   set_language_contextrl      sA     "%%h/EH0E0E EY	!Lr   rj   c                 .    [         R                  U 5        g)z7Restore the per-request language to its previous value.N)r	   reset)rj   s    r   reset_language_contextro      s    &r   r=   c                 8    [        5       R                  " U 40 UD6$ )z
Convenience function for translation

Args:
    key: Translation key
    **kwargs: Optional format parameters

Returns:
    Translated string
)rf   rG   )r=   rD   s     r   rG   rG      s     :<<&v&&r   c                  2    [        5       R                  5       $ )z
Provides a list of tuples containing ISO codes and descriptive language names

Returns:
    List of tuples (iso code, english name, native name)
)rf   rZ   rA   r   r   available_languages_inforr      s     :2244r   )N)r`   contextvarsr   r'   	threadingr   typingr   r   logurur   
ContextVarr	   rO   __annotations__r   rc   re   rf   Tokenrl   ro   rG   rU   ra   rr   rA   r   r   <module>rz      s     	   ! 
 =H<R<R= {--cDj9 
y) y)z "& %V
x}  .3 ;+<+<S4Z+H *'+"3"3C$J"? 'D '
'3 'S '5$uS#s]';"< 5r   