U
    gk                     @   s  d Z ddlZddlZddlZddlZddddddd	d
dddddddddddddgZejejddZ	e
dejejB Zdd Zdd ZdZd d! eed"D Zd#d$d%d&ZdGd(d)Zd*d+ Zd,d- Zd.d/ ZG d0d dZG d1d deZdHd3dZi Zd4gZdddd2efd5dZdedfd6dZi ai ad7a dId8d	Z!dJd9d
Z"dKd:dZ#d;d Z$d<d Z%d=d Z&d>d Z'd?d Z(d@d Z)dAd Z*dBd Z+dCd Z,dDd Z-dEd Z.dFd Z/eZ0dS )La  Internationalization and localization support.

This module provides internationalization (I18N) and localization (L10N)
support for your Python programs by providing an interface to the GNU gettext
message catalog library.

I18N refers to the operation by which a program is made aware of multiple
languages.  L10N refers to the adaptation of your program, once
internationalized, to the local language and cultural habits.

    NNullTranslationsGNUTranslationsCatalogfindtranslationinstall
textdomainbindtextdomainbind_textdomain_codesetdgettext	dngettextgettextlgettext	ldgettext
ldngettext	lngettextngettextpgettext	dpgettext	npgettext
dnpgettextZsharelocalea  
        (?P<WHITESPACES>[ \t]+)                    | # spaces and horizontal tabs
        (?P<NUMBER>[0-9]+\b)                       | # decimal integer
        (?P<NAME>n\b)                              | # only n is allowed
        (?P<PARENTHESIS>[()])                      |
        (?P<OPERATOR>[-*/%+?:]|[><!]=?|==|&&|\|\|) | # !, *, /, %, +, -, <, >,
                                                     # <=, >=, ==, !=, &&, ||,
                                                     # ? :
                                                     # unary and bitwise ops
                                                     # not allowed
        (?P<INVALID>\w+|.)                           # invalid token
    c                 c   sP   t t| D ]8}|j}|dkr q||}|dkr>td| |V  qdV  d S )NZWHITESPACESZINVALIDz invalid token in plural form: %s )refinditer_token_pattern	lastgroupgroup
ValueError)pluralZmoZkindvalue r!   /usr/lib/python3.8/gettext.py	_tokenizeW   s    
r#   c                 C   s   | rt d|  S t dS d S )Nz#unexpected token in plural form: %szunexpected end of plural form)r   )r    r!   r!   r"   _errorb   s    r$   ))||)&&)z==z!=)<>z<=z>=)+-)*/%c                 C   s    i | ]\}}|D ]
}||qqS r!   r!   ).0iZopsopr!   r!   r"   
<dictcomp>p   s
        r1      orandz//)r%   r&   r,   c                 C   s  d}t | }|dkr&|d7 }t | }q|dkrXt| \}}d||f }|dkrtdnP|dkrnd	||f }n:zt|d
}W n tk
r   t|d Y nX d||f }t | }d}|tkrt| }||k rҐq|dkr|dkrd| }t||}t| |d \}	}d|||	f }|}q||  kr4dkr@n nd| }|dkr|dkrt| d\}
}|dkrtt|t| \}}d|
||f }|dkrd| }||fS )Nr   !znot (z%s(%s))z%unbalanced parenthesis in plural formnz%s%s
   z%s%dd   )      z(%s)r2   z%s %s %sr=   ?r   :z%s if %s else %s)next_parser   intr$   _binary_ops	_c2py_opsget)tokensZpriorityresultnexttoksubr    jr/   r0   rightZif_trueZif_falser!   r!   r"   rA   s   sP    




rA   c                 C   sZ   zt | }W n( tk
r4   td| jjf d Y nX dd l}|d| jjf td | S )Nz'Plural value must be an integer, got %sr   r=   )round	TypeError	__class____name__warningswarnDeprecationWarning)r9   r/   rP   r!   r!   r"   _as_int   s      rS   c                 C   s   t | dkrtdz|tt| \}}|r2t|d}|D ]6}|dkr`|d7 }|dkrptdq:|dkr:|d8 }q:d	ti}td
| | |d W S  tk
r   tdY nX dS )zGets a C expression as used in PO files for plural forms and returns a
    Python function that implements an equivalent expression.
    i  z"plural form expression is too longr   r7   r2      z%plural form expression is too complexr8   rS   zif True:
            def func(n):
                if not isinstance(n, int):
                    n = _as_int(n)
                return int(%s)
            funcN)lenr   rA   r#   r$   rS   execRecursionError)r   rG   rH   Zdepthcnsr!   r!   r"   c2py   s.    


r[   c                 C   s4  t | } d}d}d}d}| d}|dkrN| |d  }| d | } ||O }nd}| d}|dkr| |d  }| d | } ||O }nd}| d}|dkr| |d  }| d | } ||O }nd}| }	g }
t|d D ]P}|| @ s|	}||@ r||7 }||@ r
||7 }||@ r||7 }|
| q|
  |
S )	Nr2      r=   r   @r   ._)r   Z	normalizer   rangeappendreverse)ZlocZCOMPONENT_CODESETZCOMPONENT_TERRITORYZCOMPONENT_MODIFIERmaskposZmodifiercodesetZ	territoryZlanguageZretr/   valr!   r!   r"   _expand_lang   sJ    







 
 
 rg   c                   @   s   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd ZdddZdS ) r   Nc                 C   s.   i | _ d | _d | _d | _|d k	r*| | d S N)_info_charset_output_charset	_fallbackrA   selffpr!   r!   r"   __init__   s    zNullTranslations.__init__c                 C   s   d S rh   r!   rm   r!   r!   r"   rA     s    zNullTranslations._parsec                 C   s   | j r| j | n|| _ d S rh   )rl   add_fallback)rn   fallbackr!   r!   r"   rq   
  s    zNullTranslations.add_fallbackc                 C   s   | j r| j |S |S rh   )rl   r   )rn   messager!   r!   r"   r     s    zNullTranslations.gettextc              
   C   sr   dd l }|dtd | jrR| ( |ddt | j|W  5 Q R  S Q R X | jrd|| jS |t	
 S )Nr   /lgettext() is deprecated, use gettext() insteadr\   ignore.*\blgettext\b.*)rP   rQ   rR   rl   catch_warningsfilterwarningsr   rk   encoder   getpreferredencoding)rn   rs   rP   r!   r!   r"   r     s     
zNullTranslations.lgettextc                 C   s*   | j r| j |||S |dkr"|S |S d S Nr2   )rl   r   )rn   msgid1msgid2r9   r!   r!   r"   r   "  s
    zNullTranslations.ngettextc              
   C   s   dd l }|dtd | jrV| , |ddt | j|||W  5 Q R  S Q R X |dkrd|}n|}| jrz|| jS |t	
 S )Nr   1lngettext() is deprecated, use ngettext() insteadr\   ru   .*\blngettext\b.*r2   )rP   rQ   rR   rl   rw   rx   r   rk   ry   r   rz   rn   r|   r}   r9   rP   tmsgr!   r!   r"   r   *  s"     
"zNullTranslations.lngettextc                 C   s   | j r| j ||S |S rh   )rl   r   )rn   contextrs   r!   r!   r"   r   ;  s    zNullTranslations.pgettextc                 C   s,   | j r| j ||||S |dkr$|S |S d S r{   )rl   r   )rn   r   r|   r}   r9   r!   r!   r"   r   @  s
    zNullTranslations.npgettextc                 C   s   | j S rh   )ri   rn   r!   r!   r"   infoH  s    zNullTranslations.infoc                 C   s   | j S rh   )rj   r   r!   r!   r"   charsetK  s    zNullTranslations.charsetc                 C   s   dd l }|dtd | jS )Nr   zoutput_charset() is deprecatedr\   rP   rQ   rR   rk   )rn   rP   r!   r!   r"   output_charsetN  s     zNullTranslations.output_charsetc                 C   s    dd l }|dtd || _d S )Nr   z"set_output_charset() is deprecatedr\   r   )rn   r   rP   r!   r!   r"   set_output_charsetT  s     z#NullTranslations.set_output_charsetc                 C   sR   dd l }| j|jd< |d k	rNddddddh}|t|@ D ]}t| ||j|< q8d S )	Nr   r_   r   r   r   r   r   r   )builtinsr   __dict__setgetattr)rn   namesr   Zallowednamer!   r!   r"   r   Z  s      zNullTranslations.install)N)N)rO   
__module____qualname__rp   rA   rq   r   r   r   r   r   r   r   r   r   r   r   r!   r!   r!   r"   r      s   
c                   @   s\   e Zd ZdZdZdZdZdd Zdd Zd	d
 Z	dd Z
dd Zdd Zdd Zdd ZdS )r   l   * l   $< z%s%s)r   r2   c                 C   s   |d? |d@ fS )z/Returns a tuple of major version, minor version   i  r!   )rn   versionr!   r!   r"   _get_versionsp  s    zGNUTranslations._get_versionsc           "      C   s  ddl m} t|dd}i  | _}dd | _| }t|}|d|dd	 d }|| jkr||d
|d	d \}}	}
}d}n6|| jkr|d|d	d \}}	}
}d}nt	dd|| 
|\}}|| jkrt	ddt| |td|	D ]}||||
|
d  \}}|| }|||||d  \}}|| }||k r`||k r`||| }||| }nt	dd||dkrld}|dD ]}|  }|sq|dr|drqd }}d|kr |dd\}}|  }| }|| j|< |}n|r| j|  d| 7  < |dkr8|dd | _n0|dkr|d}|d dd }t|| _q| jpvd}d|kr|d\}} |d}t||}t|D ]\}}!t|!||||f< qnt|||t||< |
d7 }
|d7 }qdS )z8Override this method to support alternative .mo formats.r   )unpackr   r   c                 S   s   t | dkS r{   )rB   )r9   r!   r!   r"   <lambda>}      z(GNUTranslations._parse.<locals>.<lambda>z<INr=   z<4IrT   z<IIz>4Iz>IIzBad magic numberzBad version number    zFile is corrupt   
z	#-#-#-#-#r?   r2   
zcontent-typezcharset=zplural-forms;zplural=ascii    )Zstructr   r   _catalogr   readrV   LE_MAGICBE_MAGICOSErrorr   VERSIONSstrr`   splitdecodestrip
startswithendswithlowerri   rj   r[   	enumerate)"rn   ro   r   filenameZcatalogZbufZbuflenmagicr   ZmsgcountZ	masteridxZtransidxZiiZmajor_versionZminor_versionr/   ZmlenZmoffZmendZtlenZtoffZtendmsgr   ZlastkZb_itemitemkvr   r   r|   r}   xr!   r!   r"   rA   t  sv    














zGNUTranslations._parsec                 C   sh   dd l }|dtd t }| j||}||krH| jrD| j|S |}| jrZ|	| jS |	t
 S )Nr   rt   r\   )rP   rQ   rR   objectr   rE   rl   r   rk   ry   r   rz   )rn   rs   rP   missingr   r!   r!   r"   r     s     zGNUTranslations.lgettextc                 C   s   dd l }|dtd z| j|| |f }W n@ tk
rn   | jrX| j||| Y S |dkrf|}n|}Y nX | jr|	| jS |	t
 S )Nr   r~   r\   r2   )rP   rQ   rR   r   r   KeyErrorrl   r   rk   ry   r   rz   r   r!   r!   r"   r     s      
zGNUTranslations.lngettextc                 C   s6   t  }| j||}||kr2| jr.| j|S |S |S rh   )r   r   rE   rl   r   )rn   rs   r   r   r!   r!   r"   r     s    zGNUTranslations.gettextc                 C   s^   z| j || |f }W n@ tk
rX   | jrB| j||| Y S |dkrP|}n|}Y nX |S r{   )r   r   r   rl   r   )rn   r|   r}   r9   r   r!   r!   r"   r     s    
zGNUTranslations.ngettextc                 C   sF   | j ||f }t }| j||}||krB| jr>| j||S |S |S rh   )CONTEXTr   r   rE   rl   r   )rn   r   rs   ctxt_msg_idr   r   r!   r!   r"   r     s    zGNUTranslations.pgettextc              	   C   sn   | j ||f }z| j|| |f }W nB tk
rh   | jrR| j|||| Y S |dkr`|}n|}Y nX |S r{   )r   r   r   r   rl   r   )rn   r   r|   r}   r9   r   r   r!   r!   r"   r     s    
zGNUTranslations.npgettextN)rO   r   r   r   r   r   r   r   rA   r   r   r   r   r   r   r!   r!   r!   r"   r   d  s   Y	
Fc                 C   s   |d krt }|d krRg }dD ]"}tj|}|r|d} q@qd|krR|d g }|D ]$}t|D ]}||krf|| qfqZ|rg }	nd }	|D ]}|dkr qtj||dd|  }
tjd|dd|  }tj	|
r|r|	|
 n|
  S tj	|r|r|	| q|  S q|	S )N)ZLANGUAGELC_ALLLC_MESSAGESZLANGr?   Cr   z%s.moz/usr/share/locale-langpack)
_default_localedirosenvironrE   r   ra   rg   pathjoinexists)domain	localedir	languagesallZenvarrf   ZnelangsZlangZnelangrG   mofileZ	mofile_lpr!   r!   r"   r     sH    


 
Zunspecifiedc              
   C   s  |d krt }t| ||dd}|sB|r*t S ddlm} t|d| d }|D ]}	|tj|	f}
t	
|
}|d krt|	d}t	|
||}W 5 Q R X dd l}||}|tk	rdd l}|dtd |r|  |d	d
t || W 5 Q R X |d kr|}qJ|| qJ|S )NT)r   r   )ENOENTz$No translation file found for domainrbzparameter codeset is deprecatedr\   ru   z.*\bset_output_charset\b.*)r   r   r   errnor   FileNotFoundErrorr   r   abspath_translationsrE   open
setdefaultcopy_unspecifiedrP   rQ   rR   rw   rx   r   rq   )r   r   r   Zclass_rr   re   Zmofilesr   rG   r   keytro   r   rP   r!   r!   r"   r   R  sH     

 

c                 C   s   t | |d|d}|| d S )NT)rr   re   )r   r   )r   r   re   r   r   r!   r!   r"   r   }  s    Zmessagesc                 C   s   | d k	r| a t S rh   )_current_domain)r   r!   r!   r"   r     s    c                 C   s   |d k	r|t | < t | tS rh   )_localedirsrE   r   )r   r   r!   r!   r"   r	     s    c                 C   s0   dd l }|dtd |d k	r&|t| < t| S )Nr   z'bind_textdomain_codeset() is deprecatedr\   )rP   rQ   rR   _localecodesetsrE   )r   re   rP   r!   r!   r"   r
     s     c                 C   s:   zt | t| d }W n tk
r.   | Y S X ||S rh   )r   r   rE   r   r   )r   rs   r   r!   r!   r"   r     s
    
c              
   C   s   dd l }|dtd t| }z<| * |ddt t| t| d |d}W 5 Q R X W n& t	k
r   |
|pzt  Y S X | & |ddt ||W  5 Q R  S Q R X d S )Nr   z1ldgettext() is deprecated, use dgettext() insteadr\   ru   .*\bparameter codeset\b.*re   rv   )rP   rQ   rR   r   rE   rw   rx   r   r   r   ry   r   rz   r   )r   rs   rP   re   r   r!   r!   r"   r     s&     

$
c                 C   sR   zt | t| d }W n, tk
rB   |dkr6| Y S | Y S Y nX ||||S r{   )r   r   rE   r   r   )r   r|   r}   r9   r   r!   r!   r"   r     s    c              
   C   s   dd l }|dtd t| }z<| * |ddt t| t| d |d}W 5 Q R X W n8 t	k
r   |dkrz|}n|}|
|pt  Y S X | * |ddt ||||W  5 Q R  S Q R X d S )	Nr   z3ldngettext() is deprecated, use dngettext() insteadr\   ru   r   r   r2   r   )rP   rQ   rR   r   rE   rw   rx   r   r   r   ry   r   rz   r   )r   r|   r}   r9   rP   re   r   r   r!   r!   r"   r     s,     

$
c                 C   s<   zt | t| d }W n tk
r.   | Y S X |||S rh   )r   r   rE   r   r   )r   r   rs   r   r!   r!   r"   r     s
    
c                 C   sT   zt | t| d }W n, tk
rB   |dkr6| Y S | Y S Y nX |||||S r{   )r   r   rE   r   r   )r   r   r|   r}   r9   r   r!   r!   r"   r     s    c                 C   s
   t t| S rh   )r   r   )rs   r!   r!   r"   r     s    c              
   C   sN   dd l }|dtd | & |ddt tt| W  5 Q R  S Q R X d S )Nr   rt   r\   ru   z.*\bldgettext\b.*)rP   rQ   rR   rw   rx   r   r   )rs   rP   r!   r!   r"   r     s     
c                 C   s   t t| ||S rh   )r   r   )r|   r}   r9   r!   r!   r"   r     s    c              
   C   sR   dd l }|dtd | * |ddt tt| ||W  5 Q R  S Q R X d S )Nr   r~   r\   ru   z.*\bldngettext\b.*)rP   rQ   rR   rw   rx   r   r   )r|   r}   r9   rP   r!   r!   r"   r     s     
c                 C   s   t t| |S rh   )r   r   )r   rs   r!   r!   r"   r     s    c                 C   s   t t| |||S rh   )r   r   )r   r|   r}   r9   r!   r!   r"   r     s    )r5   )NNF)N)N)N)1__doc__r   r   r   sys__all__r   r   base_prefixr   compileVERBOSEDOTALLr   r#   r$   rC   r   rD   rA   rS   r[   rg   r   r   r   r   r   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r!   r!   r!   r"   <module>   s   0             

1$*f 7
5  
+




	
