o
    5˜ŽjÝ  ã                   @  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   úZ/var/www/kodo/Anonymous/send/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   €
Rÿz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 t
|ƒg}|jrI| |j¡ |D ]}|| jjv rW|  S qK| jjS )NrA   Úevent_from_userú-)Úsep)r   rC   r	   rD   ÚgetÚlanguage_coder   r5   Úparser   r   Ú	territoryÚappendÚlanguageÚavailable_locales)r    r0   r1   rE   rH   ÚlocaleÚ
candidatesÚ	candidater   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   rR   r   r   r   r   r   r   r   c                   s   t ƒ j|||d� || _d S ©Nr   )rB   r!   rR   )r    rR   r   r   r   rF   r   r   r!   š   ó   
zConstI18nMiddleware.__init__r0   r   r1   r2   c                 Ã  s   �| j S r=   )rR   r:   r   r   r   r4   ¤   s   €zConstI18nMiddleware.get_localer;   )
rR   r   r   r   r   r   r   r   r   r   r>   rU   r   r   rF   r   rW   •   s    û
rW   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
    rR   r   r   r   Úkeyr   r   r   r   r   r   c                   s   t ƒ j|||d� || _d S rX   )rB   r!   r[   )r    r   r[   r   r   rF   r   r   r!   ­   rY   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_datar[   rB   r4   Úupdate_data)r    r0   r1   Úfsm_contextrR   Úfsm_datarF   r   r   r4   ·   s   €
zFSMI18nMiddleware.get_localer\   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
        r]   N)r_   r[   r   r8   )r    r\   rR   r   r   r   Ú
set_localeÃ   s   €zFSMI18nMiddleware.set_locale)rR   r   r   )
r   r   r[   r   r   r   r   r   r   r   r>   )r\   r   rR   r   r   r   )r	   r
   r   r?   r!   r4   rb   rV   r   r   rF   r   rZ   ¨   s    û
rZ   )Ú
__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@   rW   rZ   r   r   r   r   Ú<module>   s&    ýH4