
nWG                 @   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 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bind_textdomain_codesetdgettext	dngettextgettextlgettext	ldgettext
ldngettext	lngettextngettext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   |  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 rxt |  d k rKt d     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 ?/afs/cs.wisc.edu/s/python-3.5.2/src/Python-3.5.2/Lib/gettext.py
<listcomp>G   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$   X   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    	r<   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  }
 xr t | d  D]` } | | @s.|	 } | | @rY| | 7} | | @rm| | 7} | | @r| | 7} |
 j |  q.W|
 j   |
 S)Nr   r   r   @r%   ._r   r      )r   	normalizer   ranger3   reverse)locZCOMPONENT_CODESETZCOMPONENT_TERRITORYZCOMPONENT_MODIFIERmaskposZmodifiercodesetZ	territoryZlanguageZretivalr   r   r   _expand_langq   sJ    
 

 

 

rJ   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   sA   i  |  _  d  |  _ d  |  _ d  |  _ | d  k	 r= |  j |  d  S)N)_info_charset_output_charset	_fallback_parse)selffpr   r   r   __init__   s    				zNullTranslations.__init__c             C   s   d  S)Nr   )rP   rQ   r   r   r   rO      s    zNullTranslations._parsec             C   s)   |  j  r |  j  j |  n	 | |  _  d  S)N)rN   add_fallback)rP   fallbackr   r   r   rS      s    	zNullTranslations.add_fallbackc             C   s   |  j  r |  j  j |  S| S)N)rN   r   )rP   messager   r   r   r      s    	zNullTranslations.gettextc             C   s   |  j  r |  j  j |  S| S)N)rN   r   )rP   rU   r   r   r   r      s    	zNullTranslations.lgettextc             C   s7   |  j  r |  j  j | | |  S| d k r/ | S| Sd  S)Nr   )rN   r   )rP   msgid1msgid2r   r   r   r   r      s
    	zNullTranslations.ngettextc             C   s7   |  j  r |  j  j | | |  S| d k r/ | S| Sd  S)Nr   )rN   r   )rP   rV   rW   r   r   r   r   r      s
    	zNullTranslations.lngettextc             C   s   |  j  S)N)rK   )rP   r   r   r   info   s    zNullTranslations.infoc             C   s   |  j  S)N)rL   )rP   r   r   r   charset   s    zNullTranslations.charsetc             C   s   |  j  S)N)rM   )rP   r   r   r   output_charset   s    zNullTranslations.output_charsetc             C   s   | |  _  d  S)N)rM   )rP   rY   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 rK | j d | j d <d | k rg |  j | j d <d | k r |  j | j d <d | k r |  j | j d <d  S)Nr   r?   __contains__r   r   r   r   )builtinsr   __dict__hasattrr   r   r   )rP   namesr]   r   r   r   r      s    zNullTranslations.install)__name__
__module____qualname__rR   rO   rS   r   r   r   r   rX   rY   rZ   r[   r   r   r   r   r   r      s   c               @   sj   e  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 S)r   l   * l   $< r   r   c             C   s   | d ?| d @f S)z/Returns a tuple of major version, minor version   i  r   )rP   versionr   r   r   _get_versions   s    zGNUTranslations._get_versionsc       "      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 |   |  j
 |  \ } } | |  j k r8t	 d d t |  |   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   } | sAq d } } d | k r| j d d  \ } } | j   j   } | j   } | |  j | <| } n | r|  j | d | 7<| d k r| j d  d |  _ q | d k r | j d  } | d j d  d } t |  |  _ q W|  j p4d } d | k r| j d  \ } }  | j d  } t | |  } xR t |  D]% \ } }! t |! |  | | | f <qWn t | |  | t | |  <|
 d 7}
 | d 7} qH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 numberzBad version number    zFile is corrupt
ascii:r   zcontent-typezcharset=zplural-forms;zplural=s    )structunpackgetattr_catalogr7   readr4   LE_MAGICBE_MAGICOSErrorrf   VERSIONSstrrB   splitencodedecodestriplowerrK   rL   r<   	enumerate)"rP   rQ   rq   filenameZcatalogbufZbuflenmagicre   ZmsgcountZ	masteridxZtransidxZiiZmajor_versionZminor_versionrH   ZmlenZmoffZmendZtlenZtoffZtendmsgtmsgZlastkZb_itemitemkvr7   rY   rV   rW   r   r   r   r   rO      sr    	%	%	#
#

	
 
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)	objectrs   getrN   r   rM   r{   r   getpreferredencoding)rP   rU   missingr   r   r   r   r   A  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   )	rs   r7   rM   r{   r   r   KeyErrorrN   r   )rP   rV   rW   r   r   r   r   r   r   L  s    		zGNUTranslations.lngettextc             C   sK   t    } |  j j | |  } | | k rG |  j rC |  j j |  S| S| S)N)r   rs   r   rN   r   )rP   rU   r   r   r   r   r   r   Z  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   )rs   r7   r   rN   r   )rP   rV   rW   r   r   r   r   r   r   c  s     		zGNUTranslations.ngettextN)r   r   )ra   rb   rc   ru   rv   rx   rf   rO   r   r   r   r   r   r   r   r   r      s   T	Fc             C   s?  | d  k r t  } | d  k rv g  } x6 d D]. } t j j |  } | r+ | j d  } Pq+ Wd | k rv | j d  g  } x> | D]6 } x- t |  D] } | | k r | j |  q Wq W| r g  }	 n d  }	 xf | D]^ } | d k r Pt j j | | d d |   }
 t j j	 |
  r | r3|	 j |
  q |
 Sq W|	 S)	NLANGUAGELC_ALLLC_MESSAGESLANGrn   Cz%s.mo)r   zLC_ALLzLC_MESSAGESr   )
_default_localedirosenvironr   rz   r3   rJ   pathjoinexists)domain	localedir	languagesallZenvarrI   ZnelangsZlangZnelangresultmofiler   r   r   r   q  s8    	c             C   s  | d  k r t  } t |  | | d d } | sO | r= t   St t d |    d  } x | D] } | t j j |  f }	 t j	 |	  }
 |
 d  k r t
 | d   } t j |	 | |   }
 Wd  QRXt j |
  }
 | r |
 j |  | d  k r |
 } q\ | j |
  q\ W| S)Nr   Tz$No translation file found for domainrb)r   r   r   rw   r   r   r   abspath_translationsr   open
setdefaultcopyr[   rS   )r   r   r   Zclass_rT   rG   Zmofilesr   r   keytrQ   r   r   r   r     s*    	c             C   s,   t  |  | d d d | } | j |  d  S)NrT   TrG   )r   r   )r   r   rG   r`   r   r   r   r   r     s    Zmessagesc             C   s   |  d  k	 r |  a  t  S)N)_current_domain)r   r   r   r   r	     s    c             C   s&   | d  k	 r | t  |  <t  j |  t  S)N)_localedirsr   r   )r   r   r   r   r   r
     s    
c             C   s#   | d  k	 r | t  |  <t  j |   S)N)_localecodesetsr   )r   rG   r   r   r   r     s    
c             C   sT   y. t  |  t j |  d   d t j |   } Wn t k
 rF | SYn X| j |  S)NrG   )r   r   r   r   rw   r   )r   rU   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)NrG   )r   r   r   r   rw   r   )r   rU   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)NrG   r   )r   r   r   r   rw   r   )r   rV   rW   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)NrG   r   )r   r   r   r   rw   r   )r   rV   rW   r   r   r   r   r   r     s    	c             C   s   t  t |   S)N)r   r   )rU   r   r   r   r     s    c             C   s   t  t |   S)N)r   r   )rU   r   r   r   r     s    c             C   s   t  t |  | |  S)N)r   r   )rV   rW   r   r   r   r   r     s    c             C   s   t  t |  | |  S)N)r   r   )rV   rW   r   r   r   r   r   
  s    )&__doc__r   r   r+   r   r1   rp   syserrnor   __all__r   r   base_prefixr   r<   rJ   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@   &T	2*F&