
    G˝ih                       d dl mZ d dlmZmZ d dlmZmZ 	 d dlm	Z	m
Z
 d dlmZmZ erd d	lmZmZ d d
lmZ d dlmZmZ d dlmZ  G d dee      Z G d de      Z G d de      Z G d de      Zy# e$ r dZ	 G d de      Z
Y hw xY w)    )annotations)ABCabstractmethod)TYPE_CHECKINGAny)LocaleUnknownLocaleErrorNc                      e Zd Zy)r	   N)__name__
__module____qualname__     V/home/leshdev/mybot/venv/lib/python3.12/site-packages/aiogram/utils/i18n/middleware.pyr	   r	      s    r   r	   )BaseMiddlewareRouter)	AwaitableCallable)
FSMContext)TelegramObjectUser)I18nc                  p    e Zd ZdZ	 	 d	 	 	 	 	 	 	 ddZ	 d		 	 	 	 	 	 	 d
dZ	 	 	 	 	 	 	 	 ddZedd       Zy)I18nMiddlewarez#
    Abstract I18n middleware.
    c                .    || _         || _        || _        y)z
        Create an instance of middleware

        :param i18n: instance of I18n
        :param i18n_key: context key for I18n instance
        :param middleware_key: context key for this middleware
        Ni18ni18n_keymiddleware_key)selfr   r   r   s       r   __init__zI18nMiddleware.__init__   s     	 ,r   Nc                    |
t               }dh|}|j                  j                         D ]  \  }}||v r|j                  |         | S )z
        Register middleware for all events in the Router

        :param router:
        :param exclude:
        :return:
        update)set	observersitemsouter_middleware)r    routerexcludeexclude_events
event_nameobservers         r   setupzI18nMiddleware.setup/   s`     ?eG"-W-$*$4$4$:$:$< 	, J^+%%d+	, r   c                  K   | j                  ||       d {   xs | j                  j                  }| j                  r| j                  || j                  <   | j                  r| || j                  <   | j                  j                         5  | j                  j                  |      5   |||       d {   cd d d        cd d d        S 7 7 # 1 sw Y   nxY wd d d        y # 1 sw Y   y xY ww)Neventdata)
get_localer   default_localer   r   context
use_locale)r    handlerr0   r1   current_locales        r   __call__zI18nMiddleware.__call__D   s       $UFFb$))JbJb=="&))D(,D$$%YY  	.$))"6"6~"F 	. --	. 	. 	. G .	. 	. 	. 	. 	.sX   C5CA6C5C),C9C:C=	C)C5CC	C) 	C5)C2.C5c                   K   yw)z
        Detect current user locale based on event and context.

        **This method must be defined in child classes**

        :param event:
        :param data:
        :return:
        Nr   r    r0   r1   s      r   r2   zI18nMiddleware.get_localeT   s     s   r   i18n_middlewarer   r   r   
str | Noner   strreturnNoneN)r    r   r(   r   r)   zset[str] | Noner@   r   )r6   z:Callable[[TelegramObject, dict[str, Any]], Awaitable[Any]]r0   r   r1   dict[str, Any]r@   r   r0   r   r1   rC   r@   r?   )	r   r   r   __doc__r!   r-   r8   r   r2   r   r   r   r   r      s      &/	-- - 	-
 
-( $( ! 
	*.K. . 	.
 
.  	 	r   r   c                  @     e Zd ZdZ	 	 d	 	 	 	 	 	 	 d fdZddZ xZS )SimpleI18nMiddlewarezc
    Simple I18n middleware.

    Chooses language code from the User object received in event
    c                |    t         |   |||       t        #t        |       j                   d}t        |      y )Nr    can be used only when Babel installed
Just install Babel (`pip install Babel`) or aiogram with i18n support (`pip install aiogram[i18n]`))superr!   r   typer   RuntimeError)r    r   r   r   msg	__class__s        r   r!   zSimpleI18nMiddleware.__init__h   sQ     	dXnU>:&&' (M M 
 s## r   c                  K   t         #t        |       j                   d}t        |      |j	                  d      }||j
                  | j                  j                  S 	 t        j                  |j
                  d      }|j                  | j                  j                  vr| j                  j                  S |j                  S # t        $ r | j                  j                  cY S w xY ww)NrI   event_from_user-)sep)r   rK   r   rL   getlanguage_coder   r3   parser	   languageavailable_locales)r    r0   r1   rM   rP   locales         r   r2   zSimpleI18nMiddleware.get_localex   s     >:&&' (M M 
 s##'+xx0A'B"o&C&C&K99+++	,\\/"?"?SIF ??$))"="==99+++ " 	,99+++	,s+   AC,"!C AC,C)&C,(C))C,r;   r=   rD   r   r   r   rE   r!   r2   __classcell__rN   s   @r   rG   rG   a   s@      &/	$$ $ 	$
 
$ r   rG   c                  D     e Zd ZdZ	 	 d	 	 	 	 	 	 	 	 	 d fdZddZ xZS )ConstI18nMiddlewarez<
    Const middleware chooses statically defined locale
    c                8    t         |   |||       || _        y Nr   )rJ   r!   rX   )r    rX   r   r   r   rN   s        r   r!   zConstI18nMiddleware.__init__   s      	dXnUr   c                "   K   | j                   S wrB   )rX   r:   s      r   r2   zConstI18nMiddleware.get_locale   s     {{s   r;   )
rX   r?   r   r   r   r>   r   r?   r@   rA   rD   rY   r[   s   @r   r]   r]      sJ      &/  	
  
r   r]   c                  R     e Zd ZdZ	 	 	 d	 	 	 	 	 	 	 	 	 d fdZd fdZddZ xZS )	FSMI18nMiddlewarez:
    This middleware stores locale in the FSM storage
    c                8    t         |   |||       || _        y r_   )rJ   r!   key)r    r   rd   r   r   rN   s        r   r!   zFSMI18nMiddleware.__init__   s      	dXnUr   c                4  K   |j                  d      }d }|r4|j                          d {   }|j                  | j                  d       }|sAt        |   ||       d {   }|r&|j                  | j                  |i       d {    |S 7 e7 07 
w)Nstater/   r1   )rS   get_datard   rJ   r2   update_data)r    r0   r1   fsm_contextrX   fsm_datarN   s         r   r2   zFSMI18nMiddleware.get_locale   s     )-'):(1133H\\$((D1F 7-E-EEF!--DHHf3E-FFF 4 FFs3   )BB6B#B$'BBBBBc                ~   K   |j                  | j                  |i       d{    || j                  _        y7 w)z
        Write new locale to the storage

        :param state: instance of FSMContext
        :param locale: new locale
        rg   N)ri   rd   r   r7   )r    rf   rX   s      r   
set_localezFSMI18nMiddleware.set_locale   s9      dhh%7888#)		  	9s   "=;=)rX   r   r<   )
r   r   rd   r?   r   r>   r   r?   r@   rA   rD   )rf   r   rX   r?   r@   rA   )r   r   r   rE   r!   r2   rm   rZ   r[   s   @r   rb   rb      sR     %/  	
  

*r   rb   )
__future__r   abcr   r   typingr   r   babelr   r	   ImportError	Exceptionaiogramr   r   collections.abcr   r   aiogram.fsm.contextr   aiogram.typesr   r   aiogram.utils.i18n.corer   r   rG   r]   rb   r   r   r   <module>ry      s    " # %0 +3.2,E^S EP*> *Z. &#*, #*s  FY s   A4 4B	B	