o
    LDih                     @  s   d dl mZ d dlmZmZ d dlmZmZ z
d dlm	Z	m
Z
 W n ey3   dZ	G dd deZ
Y nw d dlmZmZ erZd 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 )    )annotations)ABCabstractmethod)TYPE_CHECKINGAny)LocaleUnknownLocaleErrorNc                   @  s   e Zd ZdS )r   N)__name__
__module____qualname__ r   r   i/var/www/www-root/data/www/77.83.87.30/venv/lib/python3.10/site-packages/aiogram/utils/i18n/middleware.pyr      s    r   )BaseMiddlewareRouter)	AwaitableCallable)
FSMContext)TelegramObjectUser)I18nc                   @  sF   e Zd ZdZ		d!d"ddZ	d#d$ddZd%ddZed&dd ZdS )'I18nMiddlewarez#
    Abstract I18n middleware.
    i18ni18n_middlewarer   i18n_key
str | Nonemiddleware_keystrreturnNonec                 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__Nr    r   routerr   excludeset[str] | Nonec                 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:Callable[[TelegramObject, dict[str, Any]], Awaitable[Any]]eventr   datadict[str, Any]r   c              	     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r0   r1   )
get_localer   default_localer   r   context
use_locale)r    r.   r0   r1   current_localer   r   r   __call__D   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    r0   r1   r   r   r   r4   T   s    zI18nMiddleware.get_localer   r   r   r   r   r   r   r   r   r   N)r    r   r"   r   r#   r$   r   r   )r.   r/   r0   r   r1   r2   r   r   r0   r   r1   r2   r   r   )	r	   r
   r   __doc__r!   r-   r9   r   r4   r   r   r   r   r      s    
r   c                      s2   e Zd ZdZ		dd fddZdddZ  ZS )SimpleI18nMiddlewarezc
    Simple I18n middleware.

    Chooses language code from the User object received in event
    r   r   r   r   r   r   r   r   r   c                   s6   t  j|||d td u rt| j d}t|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   typer	   RuntimeError)r    r   r   r   msg	__class__r   r   r!   h   s   zSimpleI18nMiddleware.__init__r0   r   r1   r2   c                   s   t d u rt| j d}t||d}|d u s|jd u r#| jjS z
t j|jdd}W n t	y:   | jj Y S w |j
| jjvrF| jjS |j
S )NrA   event_from_user-)sep)r   rC   r	   rD   getlanguage_coder   r5   parser   languageavailable_locales)r    r0   r1   rE   rH   localer   r   r   r4   x   s    
zSimpleI18nMiddleware.get_localer;   r<   r>   r	   r
   r   r?   r!   r4   __classcell__r   r   rF   r   r@   a   s    	r@   c                      s2   e Zd ZdZ		dd fddZdddZ  ZS )ConstI18nMiddlewarez<
    Const middleware chooses statically defined locale
    r   r   rP   r   r   r   r   r   r   r   c                   s   t  j|||d || _d S Nr   )rB   r!   rP   )r    rP   r   r   r   rF   r   r   r!         
zConstI18nMiddleware.__init__r0   r   r1   r2   c                   s   | j S r=   )rP   r:   r   r   r   r4      s   zConstI18nMiddleware.get_localer;   )
rP   r   r   r   r   r   r   r   r   r   r>   rQ   r   r   rF   r   rS      s    
rS   c                      sB   e Zd ZdZ			dd fddZd fddZdddZ  ZS )FSMI18nMiddlewarez:
    This middleware stores locale in the FSM storage
    rP   r   r   r   keyr   r   r   r   r   r   c                   s   t  j|||d || _d S rT   )rB   r!   rW   )r    r   rW   r   r   rF   r   r   r!      rU   zFSMI18nMiddleware.__init__r0   r   r1   r2   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stater3   r1   )rK   get_datarW   rB   r4   update_data)r    r0   r1   fsm_contextrP   fsm_datarF   r   r   r4      s   
zFSMI18nMiddleware.get_localerX   r   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
        rY   N)r[   rW   r   r8   )r    rX   rP   r   r   r   
set_locale   s   zFSMI18nMiddleware.set_locale)rP   r   r   )
r   r   rW   r   r   r   r   r   r   r   r>   )rX   r   rP   r   r   r   )r	   r
   r   r?   r!   r4   r^   rR   r   r   rF   r   rV      s    
rV   )
__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   r@   rS   rV   r   r   r   r   <module>   s&    H-