o
    HEDi4                     @   sx   d dl Z d dlZd dlmZ d dlmZmZmZmZ d dl	m
Z
 d dlmZ ddlmZ ddlmZ G d	d
 d
eZdS )    N)
ContextVar)AnyDictTupleOptional)Locale)	LazyProxy   )types)BaseMiddlewarec                       s   e Zd ZdZedddZd fdd	Zdeee	j
f fd	d
Zdd Zedee fddZddefddZddefddZ	ddefddZdedee dee fddZdd Z  ZS ) I18nMiddlewarea  
    I18n middleware based on gettext util

    >>> dp = Dispatcher(bot)
    >>> i18n = I18nMiddleware(DOMAIN, LOCALES_DIR)
    >>> dp.middleware.setup(i18n)
    and then
    >>> _ = i18n.gettext
    or
    >>> _ = i18n = I18nMiddleware(DOMAIN_NAME, LOCALES_DIR)
    ctx_user_localeN)defaultenc                    sH   t t|   |du rtjt d}|| _|| _|| _| 	 | _
dS )z
        :param domain: domain
        :param path: path where located all *.mo files
        :param default: default locale name
        Nlocales)superr   __init__ospathjoingetcwddomainr   find_localesr   )selfr   r   r   	__class__ o/var/www/www-root/data/www/ovozai.pdev.uz/venv/lib/python3.10/site-packages/aiogram/contrib/middlewares/i18n.pyr      s   zI18nMiddleware.__init__returnc              	   C   s   i }t | jD ]S}t jt j| j|sqt j| j|d| jd }t j|rGt|d}t	|||< W d   n1 sAw   Y  qt j|dd d r[t
d| dq|S )	zY
        Load all compiled locales from path

        :return: dict with locales
        LC_MESSAGESz.morbNpozFound locale 'z$' but this language is not compiled!)r   listdirr   isdirr   r   existsopengettextGNUTranslationsRuntimeError)r   translationsnamemo_pathfpr   r   r   r   -   s   zI18nMiddleware.find_localesc                 C   s   |   | _dS )z$
        Hot reload locales
        N)r   r   r   r   r   r   reloadB   s   zI18nMiddleware.reloadc                 C   s   t | j S )z:
        list of loaded locales

        :return:
        )tupler   keysr.   r   r   r   available_localesH   s   z I18nMiddleware.available_locales   c                 C   s   |  ||||S )N)r'   )r   singularpluralnlocaler   r   r   __call__Q   s   zI18nMiddleware.__call__c                 C   sV   |du r	| j  }|| jvr|dkr|S |S | j| }|du r$||S ||||S )z
        Get text

        :param singular:
        :param plural:
        :param n:
        :param locale:
        :return:
        Nr3   )
ctx_localegetr   r'   ngettext)r   r4   r5   r6   r7   
translatorr   r   r   r'   T   s   




zI18nMiddleware.gettextFc                 C   s   t | j|||||dS )z
        Lazy get text

        :param singular:
        :param plural:
        :param n:
        :param locale:
        :param enable_cache:
        :return:
        )enable_cache)r   r'   )r   r4   r5   r6   r7   r=   r   r   r   lazy_gettextl   s   zI18nMiddleware.lazy_gettextactionargsc                    sL   t j }|r|jnd}|r#|j| jv r#|^ }}|j }|d< |S | jS )z
        User locale getter
        You can override the method if you want to use different way of
        getting user language.

        :param action: event name
        :param args: event arguments
        :return: locale name or None
        Nr7   )r
   Userget_currentr7   languager   r   )r   r?   r@   userr7   _datarC   r   r   r   get_user_localez   s   


zI18nMiddleware.get_user_localec                    sJ   d|vrd|vr!| dr#| ||I dH }| j| dS dS dS dS )zx
        Event trigger

        :param action: event name
        :param args: event arguments
        :return:
        updateerrorpre_processNT)
startswithrG   r9   set)r   r?   r@   r7   r   r   r   trigger   s   zI18nMiddleware.trigger)Nr   )Nr3   N)Nr3   NF)__name__
__module____qualname____doc__r   r9   r   r   strr'   r(   r   r/   propertyr   r2   r8   r   r>   r   r   rG   rM   __classcell__r   r   r   r   r      s    r   )r'   r   contextvarsr   typingr   r   r   r   babelr   babel.supportr    r
   dispatcher.middlewaresr   r   r   r   r   r   <module>   s    