
[F                 @   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)locZCOMPONENT_CODESETZCOMPONENT_TERRITORYZCOMPONENT_MODIFIERmaskposZmodifiercodesetZ	territoryZlanguageZretivalr   r   r   _expand_lango   sJ    
 
 
 
rC   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   )rI   rJ   r   r   r   rH      s    zNullTranslations._parsec             C   s)   |  j  r |  j  j |  n	 | |  _  d  S)N)rG   add_fallback)rI   fallbackr   r   r   rL      s    	zNullTranslations.add_fallbackc             C   s   |  j  r |  j  j |  S| S)N)rG   r   )rI   messager   r   r   r      s    	zNullTranslations.gettextc             C   s   |  j  r |  j  j |  S| S)N)rG   lgettext)rI   rN   r   r   r   rO      s    	zNullTranslations.lgettextc             C   s7   |  j  r |  j  j | | |  S| d k r/ | S| Sd  S)Nr   )rG   r   )rI   msgid1msgid2r   r   r   r   r      s
    	zNullTranslations.ngettextc             C   s7   |  j  r |  j  j | | |  S| d k r/ | S| Sd  S)Nr   )rG   	lngettext)rI   rP   rQ   r   r   r   r   rR      s
    	zNullTranslations.lngettextc             C   s   |  j  S)N)rD   )rI   r   r   r   info   s    zNullTranslations.infoc             C   s   |  j  S)N)rE   )rI   r   r   r   charset   s    zNullTranslations.charsetc             C   s   |  j  S)N)rF   )rI   r   r   r   output_charset   s    zNullTranslations.output_charsetc             C   s   | |  _  d  S)N)rF   )rI   rT   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   rO   rR   )builtinsr   __dict__hasattrr   rO   rR   )rI   namesrX   r   r   r   r      s    zNullTranslations.install)__name__
__module____qualname__rK   rH   rL   r   rO   r   rR   rS   rT   rU   rV   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lowerrD   rE   r6   str	enumerate) rI   rJ   ri   filenameZcatalogZbufZbuflenmagicversionZmsgcountZ	masteridxZtransidxZiirA   ZmlenZmoffZmendZtlenZtoffZtendmsgtmsgZlastkkZb_itemitemvr1   rT   rP   rQ   r   r   r   r   rH      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)	objectrk   getrG   rO   rF   rq   r   getpreferredencoding)rI   rN   missingr{   r   r   r   rO   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   )	rk   r1   rF   rq   r   r   KeyErrorrG   rR   )rI   rP   rQ   r   r{   r   r   r   rR   <  s    		zGNUTranslations.lngettextc             C   sK   t    } |  j j | |  } | | k rG |  j rC |  j j |  S| S| S)N)r   rk   r   rG   r   )rI   rN   r   r{   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   )rk   r1   r   rG   r   )rI   rP   rQ   r   r{   r   r   r   r   S  s     		zGNUTranslations.ngettextN)
r\   r]   r^   rm   rn   rH   rO   rR   r   r   r   r   r   r   r      s   M	Fc             C   s  | 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  }	 x | D] } | d k r Pn  t j j | | d d |   }
 t j j d | d d |   } t j j	 |
  rk| rd|	 j |
  qk|
 Sn  t j j	 |  r | r|	 j |  q| Sq q W|	 S)
NLANGUAGELC_ALLLC_MESSAGESLANGrf   Cz%s.moz/usr/share/locale-langpack)r   zLC_ALLzLC_MESSAGESr   )
_default_localedirosenvironr   rp   r-   rC   pathjoinexists)domain	localedir	languagesallZenvarrB   ZnelangsZlangZnelangresultmofileZ	mofile_lpr   r   r   r   a  sD    		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   ro   r   r   r   abspath_translationsr   open
setdefaultcopyrV   rL   )r   r   r   Zclass_rM   r@   Zmofilesr   r   keytrJ   r   r   r   r     s*    	!	c             C   s,   t  |  | d d d | } | j |  d  S)NrM   Tr@   )r   r   )r   r   r@   r[   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   ro   r   )r   rN   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   ro   rO   )r   rN   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   ro   r   )r   rP   rQ   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   ro   rR   )r   rP   rQ   r   r   r   r   r   
ldngettext  s    	r   c             C   s   t  t |   S)N)r   r   )rN   r   r   r   r      s    c             C   s   t  t |   S)N)r   r   )rN   r   r   r   rO     s    rO   c             C   s   t  t |  | |  S)N)r   r   )rP   rQ   r   r   r   r   r     s    c             C   s   t  t |  | |  S)N)r   r   )rP   rQ   r   r   r   r   rR   	  s    rR   )&__doc__r   r   r%   r   r+   rh   syserrnor   __all__r   r   base_prefixr   r6   rC   r   r   r   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   rO   r   rR   r   r   r   r   r   <module>   s<   &T	2*F5