o
    Fh                     @   s   d dl mZmZ d dlmZmZmZmZmZm	Z	 z
d dl
mZmZ W n ey5   dZG dd deZY nw 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 deeZG dd deZG dd deZG dd deZdS )    )ABCabstractmethod)Any	AwaitableCallableDictOptionalSet)LocaleUnknownLocaleErrorNc                   @   s   e Zd ZdS )r   N)__name__
__module____qualname__ r   r   P/var/www/html/venv/lib/python3.10/site-packages/aiogram/utils/i18n/middleware.pyr   	   s    r   )BaseMiddlewareRouter)
FSMContext)TelegramObjectUser)I18nc                	   @   s   e Zd ZdZ		ddedee deddfdd	Z	dd
ede	dee
e  defddZdeeeeef gee f dedeeef defddZededeeef defddZdS )I18nMiddlewarez#
    Abstract I18n middleware.
    i18ni18n_middlewarei18n_keymiddleware_keyreturnNc                 C   s   || _ || _|| _dS )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r   r   r   selfr   r   r   r   r   r   __init__   s   
zI18nMiddleware.__init__r   routerexcludec                 C   sD   |du rt  }dh|}|j D ]\}}||v rq||  q| S )z
        Register middleware for all events in the Router

        :param router:
        :param exclude:
        :return:
        Nupdate)set	observersitemsouter_middleware)r   r!   r"   exclude_events
event_nameobserverr   r   r   setup)   s   

zI18nMiddleware.setuphandlereventdatac              	      s   | j ||dI d H p| jj}| jr| j|| j< | jr | || j< | j . | j| |||I d H W  d    W  d    S 1 sFw   Y  W d    d S 1 sVw   Y  d S )Nr-   r.   )
get_localer   default_localer   r   context
use_locale)r   r,   r-   r.   current_localer   r   r   __call__<   s   
RzI18nMiddleware.__call__c                    s   dS )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   r-   r.   r   r   r   r0   L   s   zI18nMiddleware.get_localer   r   N)r   r   r   __doc__r   r   strr    r   r   r	   r+   r   r   r   r   r   r5   r   r0   r   r   r   r   r      sD    




$r   c                	       sZ   e Zd ZdZ		ddedee deddf fdd	Zd
ede	ee
f defddZ  ZS )SimpleI18nMiddlewarezc
    Simple I18n middleware.

    Chooses language code from the User object received in event
    r   r   r   r   r   Nc                    s2   t  j|||d td u rtt| j dd S )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
   RuntimeErrortyper   r   	__class__r   r   r    a   s   zSimpleI18nMiddleware.__init__r-   r.   c                    s   t d u rtt| j d|dd }|d u s|jd u r"| jjS z
t j|jdd}W n t	y9   | jj Y S w |j
| jjvrE| jjS |j
S )Nr<   event_from_user-)sep)r
   r>   r?   r   getlanguage_coder   r1   parser   languageavailable_locales)r   r-   r.   rB   localer   r   r   r0   p   s    zSimpleI18nMiddleware.get_localer7   )r   r   r   r9   r   r   r:   r    r   r   r   r0   __classcell__r   r   r@   r   r;   Z   s    	&r;   c                       s^   e Zd ZdZ		ddededee deddf
 fd	d
Zdede	ee
f defddZ  ZS )ConstI18nMiddlewarez<
    Const middleware chooses statically defined locale
    r   r   rJ   r   r   r   Nc                    s   t  j|||d || _d S Nr   )r=   r    rJ   )r   rJ   r   r   r   r@   r   r   r          
zConstI18nMiddleware.__init__r-   r.   c                    s   | j S r8   )rJ   r6   r   r   r   r0      s   zConstI18nMiddleware.get_localer7   )r   r   r   r9   r:   r   r   r    r   r   r   r0   rK   r   r   r@   r   rL      s     &
rL   c                       sz   e Zd ZdZ			ddededee dedd	f
 fd
dZdede	ee
f def fddZdededd	fddZ  ZS )FSMI18nMiddlewarez:
    This middleware stores locale in the FSM storage
    rJ   r   r   keyr   r   r   Nc                    s   t  j|||d || _d S rM   )r=   r    rP   )r   r   rP   r   r   r@   r   r   r       rN   zFSMI18nMiddleware.__init__r-   r.   c                    sj   | d}d }|r| I d H }| | jd }|s3t j||dI d H }|r3|j| j|idI d H  |S )Nstater/   r.   )rE   get_datarP   r=   r0   update_data)r   r-   r.   fsm_contextrJ   fsm_datar@   r   r   r0      s   
zFSMI18nMiddleware.get_localerQ   c                    s&   |j | j|idI dH  || j_dS )z
        Write new locale to the storage

        :param state: instance of FSMContext
        :param locale: new locale
        rR   N)rT   rP   r   r4   )r   rQ   rJ   r   r   r   
set_locale   s   zFSMI18nMiddleware.set_locale)rJ   r   r   )r   r   r   r9   r   r:   r   r    r   r   r   r0   r   rW   rK   r   r   r@   r   rO      s$    "
rO   )abcr   r   typingr   r   r   r   r   r	   babelr
   r   ImportError	Exceptionaiogramr   r   aiogram.fsm.contextr   aiogram.typesr   r   aiogram.utils.i18n.corer   r   r;   rL   rO   r   r   r   r   <module>   s      G+