a
    :g                     @   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yj   dZG dd deZY n0 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   z/var/www/vosh/data/www/fastworkle.ru/webshop-tgbot-v.1.0/venv/lib/python3.9/site-packages/aiogram/utils/i18n/middleware.pyr   	   s   r   )BaseMiddlewareRouter)
FSMContext)TelegramObjectUser)I18nc                   @   s   e Zd ZdZdeee eddddZdee	ee
e  edd	d
Zeeeeef gee f eeeef edddZeeeeef edddZdS )I18nMiddlewarez#
    Abstract I18n middleware.
    i18ni18n_middlewareNr   i18n_keymiddleware_keyreturnc                 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excluder   c                 C   sD   |du rt  }dh|}|j D ]\}}||v r4q"||  q"| S )z
        Register middleware for all events in the Router

        :param router:
        :param exclude:
        :return:
        Nupdate)setZ	observersitemsZouter_middleware)r    r"   r#   Zexclude_eventsZ
event_nameZobserverr   r   r   setup)   s    

zI18nMiddleware.setup)handlereventdatar   c              	      s   | j ||dI d H p| jj}| jr.| j|| j< | jr>| || j< | j Z | j|. |||I d H W  d    W  d    S 1 s0    Y  W d    n1 s0    Y  d S )Nr)   r*   )
get_localer   default_localer   r   contextZ
use_locale)r    r(   r)   r*   current_localer   r   r   __call__<   s    
zI18nMiddleware.__call__r)   r*   r   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   r,   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   r0   r   r,   r   r   r   r   r      s*      
r   c                       sL   e Zd ZdZdeee edd fddZee	ee
f edd	d
Z  ZS )SimpleI18nMiddlewarezc
    Simple I18n middleware.

    Chooses language code from the User object received in event
    r   r   Nr   c                    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__r1   c                    s   t d u rtt| j d|dd }|d u s:|jd u rB| jjS zt j|jdd}W n t	yp   | jj Y S 0 |j
| jjvr| jjS |j
S )Nr6   event_from_user-)sep)r
   r8   r9   r   getZlanguage_coder   r-   parser   languageZavailable_locales)r    r)   r*   r<   localer   r   r   r,   p   s    zSimpleI18nMiddleware.get_locale)r   r   )r   r   r   r3   r   r   r4   r!   r   r   r   r,   __classcell__r   r   r:   r   r5   Z   s   	  r5   c                       sN   e Zd ZdZdeeee edd fddZee	ee
f edd	d
Z  ZS )ConstI18nMiddlewarez<
    Const middleware chooses statically defined locale
    r   r   N)rB   r   r   r   r   c                    s   t  j|||d || _d S Nr   )r7   r!   rB   )r    rB   r   r   r   r:   r   r   r!      s    zConstI18nMiddleware.__init__r1   c                    s   | j S )N)rB   r2   r   r   r   r,      s    zConstI18nMiddleware.get_locale)r   r   )r   r   r   r3   r4   r   r   r!   r   r   r   r,   rC   r   r   r:   r   rD      s     
rD   c                       sd   e Zd ZdZdeeee edd fddZee	ee
f ed	 fd
dZeeddddZ  ZS )FSMI18nMiddlewarez:
    This middleware stores locale in the FSM storage
    rB   r   r   N)r   keyr   r   r   c                    s   t  j|||d || _d S rE   )r7   r!   rG   )r    r   rG   r   r   r:   r   r   r!      s    zFSMI18nMiddleware.__init__r1   c                    sh   | d}d }|r.| I d H }| | jd }|sdt j||dI d H }|rd|j| j|idI d H  |S )Nstater+   r*   )r?   get_datarG   r7   r,   update_data)r    r)   r*   Zfsm_contextrB   Zfsm_datar:   r   r   r,      s    
zFSMI18nMiddleware.get_locale)rH   rB   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
        rI   N)rK   rG   r   r/   )r    rH   rB   r   r   r   
set_locale   s    zFSMI18nMiddleware.set_locale)rB   r   r   )r   r   r   r3   r   r4   r   r!   r   r   r   r,   r   rL   rC   r   r   r:   r   rF      s      
rF   )abcr   r   typingr   r   r   r   r   r	   Zbabelr
   r   ImportError	ExceptionZaiogramr   r   Zaiogram.fsm.contextr   Zaiogram.typesr   r   Zaiogram.utils.i18n.corer   r   r5   rD   rF   r   r   r   r   <module>   s    G+