
[[\D                 @   s  d  Z  d d l Z d d l Z d d l Z d d l Z d d l Z d d l Z d d l Z d d l m	 Z	 d d d d d d	 d
 d d d d d g Z
 e j j e j d d  Z d d   Z d d   Z Gd d   d  Z Gd d   d e  Z d d d d d  Z i  Z d d d d d d d  Z d d d d d	  Z i  a i  a d a d d d
  Z d d 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$ e Z% d S)-a  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)ENOENTNullTranslationsGNUTranslationsCatalogfindtranslationinstall
textdomainbindtextdomaindgettext	dngettextgettextngettextZsharelocalec                s  d d l   d d l } | j t j |   j  } y  f d d   | D } Wn! | j k
 rs t d   Yn X| r t d   n  |  j d d  }  |  j d	 d
  }  t	 j
 d      j d |   }  t	 j
 d       f d d    d g } x |  D] } | d k r$| j d  q| d k r~t |  d k rQt d   n    j  | j    } | d d | 7<q| d | 7<qW  j  | j    }  t d |   S)zGets a C expression as used in PO files for plural forms and returns a
    Python lambda function that implements an equivalent expression.
    r   Nc                s9   g  |  ]/ } | d    j  k r | d d k r |  q S)r      n)NAME).0x)token /usr/lib/python3.4/gettext.py
<listcomp>E   s   	 zc2py.<locals>.<listcomp>z;plural forms expression error, maybe unbalanced parenthesisz*plural forms expression could be dangerousz&&z and z||z or z\!([^=])z not \1z(.*?)\?(.*?):(.*)c                s8   d |  j  d  |  j  d    j  |  j  d   f S)Nz(%s if %s else %s)   r      )groupsub)r   )exprreplr   r   r   V   s    zc2py.<locals>.repl ()r   z%unbalanced parenthesis in plural formz(%s)zlambda n: int(%s)r"   )r   tokenizegenerate_tokensioStringIOreadline
TokenError
ValueErrorreplacerecompiler   appendlenpopeval)pluralr#   tokensZdangerstackcsr   )r   r   r   r   c2py=   s4    	r6   c             C   s  t  j |   }  d } d	 } d
 } d } |  j d  } | d k ro |  | d   } |  d  |  }  | | O} n d } |  j d  } | d k r |  | d   } |  d  |  }  | | O} n d } |  j d  } | d k r|  | d   } |  d  |  }  | | O} n d } |  }	 g  }
 x~ t | d  D]l } | | @s.|	 } | | @r\| | 7} n  | | @rs| | 7} n  | | @r| | 7} n  |
 j |  q.q.W|
 j   |
 S)Nr   r   r   @r   ._r   r      )r   Z	normalizer   ranger-   reverse)ZlocZCOMPONENT_CODESETZCOMPONENT_TERRITORYZCOMPONENT_MODIFIERmaskposZmodifiercodesetZ	territoryZlanguageZretivalr   r   r   _expand_lango   sJ    
 
 
 
rB   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 d  Z d S)r   Nc             C   sD   i  |  _  d  |  _ d  |  _ d  |  _ | d  k	 r@ |  j |  n  d  S)N)_info_charset_output_charset	_fallback_parse)selffpr   r   r   __init__   s    				zNullTranslations.__init__c             C   s   d  S)Nr   )rH   rI   r   r   r   rG      s    zNullTranslations._parsec             C   s)   |  j  r |  j  j |  n	 | |  _  d  S)N)rF   add_fallback)rH   fallbackr   r   r   rK      s    	zNullTranslations.add_fallbackc             C   s   |  j  r |  j  j |  S| S)N)rF   r   )rH   messager   r   r   r      s    	zNullTranslations.gettextc             C   s   |  j  r |  j  j |  S| S)N)rF   lgettext)rH   rM   r   r   r   rN      s    	zNullTranslations.lgettextc             C   s7   |  j  r |  j  j | | |  S| d k r/ | S| Sd  S)Nr   )rF   r   )rH   msgid1msgid2r   r   r   r   r      s
    	zNullTranslations.ngettextc             C   s7   |  j  r |  j  j | | |  S| d k r/ | S| Sd  S)Nr   )rF   	lngettext)rH   rO   rP   r   r   r   r   rQ      s
    	zNullTranslations.lngettextc             C   s   |  j  S)N)rC   )rH   r   r   r   info   s    zNullTranslations.infoc             C   s   |  j  S)N)rD   )rH   r   r   r   charset   s    zNullTranslations.charsetc             C   s   |  j  S)N)rE   )rH   r   r   r   output_charset   s    zNullTranslations.output_charsetc             C   s   | |  _  d  S)N)rE   )rH   rS   r   r   r   set_output_charset   s    z#NullTranslations.set_output_charsetc             C   s   d d  l  } |  j | j d <t | d  r d | k rN | j d | j d <n  d | k rm |  j | j d <n  d | k r |  j | j d <n  d | k r |  j | j d <q n  d  S)Nr   r9   __contains__r   r   rN   rQ   )builtinsr   __dict__hasattrr   rN   rQ   )rH   namesrW   r   r   r   r      s    zNullTranslations.install)__name__
__module____qualname__rJ   rG   rK   r   rN   r   rQ   rR   rS   rT   rU   r   r   r   r   r   r      s   c               @   sX   e  Z d  Z d Z d Z d d   Z d d   Z d d   Z d	 d
   Z d d   Z	 d S)r   l   * l   $< c              C   s  t  j } t | d d  } i  |  _ } d d   |  _ | j   } t |  } | d | d d   d } | |  j k r | d	 | d d
   \ } }	 }
 } d } nO | |  j k r | d | d d
   \ } }	 }
 } d } n t	 d d |   xt
 d |	  D]} | | | |
 |
 d   \ } } | | } | | | | | d   \ } } | | } | | k  r| | k  r| | |  } | | |  } n t	 d d |   | d k rd } } x | j d j d   D]} | j   j   } | sqn  d | k r`| j d d  \ } } | j   j   } | j   } | |  j | <| } n | r~|  j | d | 7<n  | d k r| j d  d |  _ q| d k r| j d  } | d j d  d } t |  |  _ qqWn  |  j pd } d | k ru| j d  \ } } | j d  } t | |  } xR t |  D]% \ } } t | |  | | | f <qIWn t | |  | t | |  <|
 d 7}
 | d 7} qWd S)z8Override this method to support alternative .mo formats.namer   c             S   s   t  |  d k  S)Nr   )int)r   r   r   r   <lambda>   s    z(GNUTranslations._parse.<locals>.<lambda>z<INr:   r   z<4I   z<IIz>4Iz>IIzBad magic number   zFile is corrupt
ascii:r   zcontent-typezcharset=zplural-forms;zplural=s    )structunpackgetattr_catalogr1   readr.   LE_MAGICBE_MAGICOSErrorr;   splitencodedecodestriplowerrC   rD   r6   str	enumerate) rH   rI   rh   filenameZcatalogZbufZbuflenmagicversionZmsgcountZ	masteridxZtransidxZiir@   ZmlenZmoffZmendZtlenZtoffZtendmsgtmsgZlastkkZb_itemitemvr1   rS   rO   rP   r   r   r   r   rG      sj    	%	%	#
#

	
 
zGNUTranslations._parsec             C   ss   t    } |  j j | |  } | | k rG |  j rC |  j j |  S| S|  j r` | j |  j  S| j t j    S)N)	objectrj   getrF   rN   rE   rp   r   getpreferredencoding)rH   rM   missingrz   r   r   r   rN   1  s    			zGNUTranslations.lgettextc             C   s   yL |  j  | |  j |  f } |  j r8 | j |  j  S| j t j    SWnE t k
 r |  j r{ |  j j | | |  S| d k r | S| SYn Xd  S)Nr   )	rj   r1   rE   rp   r   r   KeyErrorrF   rQ   )rH   rO   rP   r   rz   r   r   r   rQ   <  s    		zGNUTranslations.lngettextc             C   sK   t    } |  j j | |  } | | k rG |  j rC |  j j |  S| S| S)N)r~   rj   r   rF   r   )rH   rM   r   rz   r   r   r   r   J  s    		zGNUTranslations.gettextc             C   ss   y  |  j  | |  j |  f } WnL t k
 rn |  j rO |  j j | | |  S| d k rd | } n | } Yn X| S)Nr   )rj   r1   r   rF   r   )rH   rO   rP   r   rz   r   r   r   r   S  s     		zGNUTranslations.ngettextN)
r[   r\   r]   rl   rm   rG   rN   rQ   r   r   r   r   r   r   r      s   M	Fc             C   sT  | d  k r t  } n  | d  k r g  } x9 d D]1 } t j j |  } | r. | j d  } Pq. q. Wd | k r | j d  q n  g  } xA | D]9 } x0 t |  D]" } | | k r | j |  q q Wq W| r g  }	 n d  }	 xl | D]d } | d k r Pn  t j j | | d d |   }
 t j j	 |
  r | rE|	 j |
  qL|
 Sq q W|	 S)	NLANGUAGELC_ALLLC_MESSAGESLANGre   Cz%s.mo)r   r   r   r   )
_default_localedirosenvironr   ro   r-   rB   pathjoinexists)domain	localedir	languagesallZenvarrA   ZnelangsZlangZnelangresultmofiler   r   r   r   a  s8    		c             C   s  | d  k r t  } n  t |  | | d d } | sU | r@ t   St t d |    n  d  } x | D] } | t j j |  f }	 t j	 |	  }
 |
 d  k r t
 | d   } t j |	 | |   }
 Wd  QXn  t j |
  }
 | r |
 j |  n  | d  k r|
 } qb | j |
  qb W| S)Nr   Tz$No translation file found for domainrb)r   r   r   rn   r   r   r   abspath_translationsr   open
setdefaultcopyrU   rK   )r   r   r   Zclass_rL   r?   Zmofilesr   r   keytrI   r   r   r   r     s*    	!	c             C   s,   t  |  | d d d | } | j |  d  S)NrL   Tr?   )r   r   )r   r   r?   rZ   r   r   r   r   r     s    Zmessagesc             C   s   |  d  k	 r |  a  n  t  S)N)_current_domain)r   r   r   r   r	     s    	c             C   s)   | d  k	 r | t  |  <n  t  j |  t  S)N)_localedirsr   r   )r   r   r   r   r   r
     s    c             C   s&   | d  k	 r | t  |  <n  t  j |   S)N)_localecodesetsr   )r   r?   r   r   r   bind_textdomain_codeset  s    r   c             C   sT   y. t  |  t j |  d   d t j |   } Wn t k
 rF | SYn X| j |  S)Nr?   )r   r   r   r   rn   r   )r   rM   r   r   r   r   r     s    	c             C   sT   y. t  |  t j |  d   d t j |   } Wn t k
 rF | SYn X| j |  S)Nr?   )r   r   r   r   rn   rN   )r   rM   r   r   r   r   	ldgettext  s    	r   c             C   sj   y. t  |  t j |  d   d t j |   } Wn& t k
 rV | d k rN | S| SYn X| j | | |  S)Nr?   r   )r   r   r   r   rn   r   )r   rO   rP   r   r   r   r   r   r     s    	c             C   sj   y. t  |  t j |  d   d t j |   } Wn& t k
 rV | d k rN | S| SYn X| j | | |  S)Nr?   r   )r   r   r   r   rn   rQ   )r   rO   rP   r   r   r   r   r   
ldngettext  s    	r   c             C   s   t  t |   S)N)r   r   )rM   r   r   r   r     s    c             C   s   t  t |   S)N)r   r   )rM   r   r   r   rN     s    rN   c             C   s   t  t |  | |  S)N)r   r   )rO   rP   r   r   r   r   r     s    c             C   s   t  t |  | |  S)N)r   r   )rO   rP   r   r   r   r   rQ     s    rQ   )&__doc__r   r   r%   r   r+   rg   syserrnor   __all__r   r   base_prefixr   r6   rB   r   r   r   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   rN   r   rQ   r   r   r   r   r   <module>   s<   &T	2*F&