ó
3…6ic           @  sj  d  d l  m 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	 Z	 d e
 f d „  ƒ  YZ d „  Z d e
 f d „  ƒ  YZ d „  Z d	 e j k Z d
 „  Z d e
 f d „  ƒ  YZ d „  Z e j
 j d ƒ Z e d „ Z d „  Z d „  Z d „  Z d a d „  Z d a g  Z d „  Z d „  Z  d „  Z! d „  Z" d „  Z# d S(   iÿÿÿÿ(   t   print_functionNt   ScriptTranslatorc           B  s5   e  Z d  „  Z d „  Z d „  Z d „  Z d „  Z RS(   c         C  s—   t  ƒ  |  _ i  |  _ i  |  _ g  |  _ t j t ƒ |  _ t j t	 ƒ |  _
 t j t ƒ |  _ t j t ƒ |  _ t j t ƒ |  _ t j t ƒ |  _ d  S(   N(   t   sett	   languagest   default_translatest   language_translatest   chain_worklistt   collectionst   defaultdictt   listt   file_translatest   StringTranslatort   stringst   blockt   early_blockt   pythont   additional_strings(   t   self(    (    si   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\translation\__init__.pyt   __init__)   s    			c         C  s   t  |  j ƒ S(   sC   
        Return the number of dialogue blocks in the game.
        (   t   lenR   (   R   (    (    si   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\translation\__init__.pyt   count_translatesP   s    c         C  s³  d } | s d St j j } t j j } t j j } t j j } t j j } t j j	 | d j
 ƒ } t j j t j j | ƒ ƒ } x)| D]!}	 |	 j sŸ qŠ n  |	 j j t k	 rÒ t |	 j t ƒ rÒ |	 j } qÒ n  |	 j }
 |
 | k r&|	 j d k	 r|  j j |	 j ƒ n  |  j |	 j j |	 ƒ qŠ |
 | k rq|	 j d k	 rW|  j j |	 j ƒ n  |  j |	 j j |	 ƒ qŠ |
 | k r¼|	 j d k	 r¢|  j j |	 j ƒ n  |  j |	 j j |	 ƒ qŠ |
 | k rxà |	 j D]? } | d } | d k rôqÒn  |  j | j |	 j | f ƒ qÒWqŠ |
 | k rŠ |	 j d k r`|	 |  j |	 j  <|  j! | j | |	 f ƒ q«|  j j |	 j ƒ |	 |  j" |	 j  |	 j f <|  j# j |	 j  |	 j f ƒ qŠ qŠ Wd S(   s}   
        Takes the translates out of the flattened list of statements, and stores
        them into the dicts above.
        Ni    ($   t   Nonet   renpyt   astt   TranslatePythont   TranslateBlockt   TranslateEarlyBlockt   Menut	   Translatet   exportst   unelide_filenamet   filenamet   ost   patht   normpatht   abspatht   translation_relevantt   namet	   __class__t   tuplet
   isinstancet
   basestringt   languageR   t   addR   t   appendR   R   t   itemsR   t
   linenumberR   t
   identifierR
   R   R   (   R   t   nodest   labelR   R   R   R   R   R   t   nt   type_nt   it   s(    (    si   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\translation\__init__.pyt   take_translatesW   sT    		
$c         C  sŽ   g  } xx |  j  D]m \ } } | |  j k rD | j | | f ƒ q n  |  j | | f } |  j | j } t j j | j | ƒ q W| |  _  d S(   sB   
        Chains nodes in non-default translates together.
        N(	   R   R   R,   R   t   afterR   R   t   chain_blockR   (   R   t	   unchainedR/   R*   t	   translatet	   next_node(    (    si   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\translation\__init__.pyt   chain_translates™   s    c         C  sx   | j  d d ƒ } t j j j } | d  k	 rK |  j j | | f d  ƒ } n d  } | d  k rm |  j | } n  | j	 d S(   Nt   .t   _i    (
   t   replaceR   t   gamet   preferencesR*   R   R   t   getR   R   (   R   R/   R*   t   tl(    (    si   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\translation\__init__.pyt   lookup_translate­   s    (   t   __name__t
   __module__R   R   R6   R<   RD   (    (    (    si   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\translation\__init__.pyR   '   s
   	'		B	c         C  sW   |  j  d d ƒ }  |  j  d d ƒ }  |  j  d d ƒ }  t j d d |  ƒ }  d |  d S(	   sG   
    Encodes a string in the format used by Ren'Py say statements.
    s   \s   \\s   
s   \ns   "s   \"s   (?<= ) s   \ (   R?   t   ret   sub(   R5   (    (    si   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\translation\__init__.pyt   encode_say_string½   s
    t   Restructurerc           B  s,   e  Z d  „  Z d „  Z d „  Z d „  Z RS(   c         C  s&   d  |  _ t ƒ  |  _ |  j | ƒ d  S(   N(   R   R1   R   t   identifierst   callback(   R   t   children(    (    si   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\translation\__init__.pyR   Ì   s    	c         C  s3   | |  j  k r t S| t j j j j k r/ t St S(   N(   RK   t   TrueR   R@   t   scriptt
   translatorR   t   False(   R   R/   (    (    si   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\translation\__init__.pyt	   id_existsÑ   s
    c         C  s^  t  j ƒ  } x4 | D], } | j ƒ  } | j | j d ƒ d ƒ q W|  j rv |  j j d d ƒ d | j ƒ  d  } n | j ƒ  d  } d } d } x@ t rÔ | | } |  j	 | ƒ s¸ Pn  | d 7} d	 j
 | ƒ } q• W|  j j | ƒ | d j | d j f } t j j | | d | ƒ }	 | d j d |	 _ t j j | ƒ }
 | d j d |
 _ |	 |
 g S(   sz   
        Creates an ast.Translate that wraps `block`. The block may only contain
        translatable statements.
        s   utf-8s   
R=   R>   i   i    t    i   s   _{0}R:   t   end_translateN(   s	   translate(   RT   (   t   hashlibt   md5t   get_codet   updatet   encodeR1   R?   t	   hexdigestRN   RR   t   formatRK   R+   R   R.   R   R   R   R   R%   t   EndTranslate(   R   R   RV   R4   t   codet   baset   suffixR/   t   locRC   t   ed(    (    si   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\translation\__init__.pyt   create_translateÚ   s,    	*	

c         C  sC  g  } g  } xþ | D]ö } t  | t j j ƒ rI | j sI | j |  _ qI n  t  | t j j ƒ sq | j |  j	 ƒ n  t  | t j j
 ƒ r¸ | j | ƒ |  j | ƒ } | j | ƒ g  } q | j rÑ | j | ƒ q | rü |  j | ƒ } | j | ƒ g  } n  | j | ƒ q W| r8|  j | ƒ } | j | ƒ g  } n  | | (d S(   s¾   
        This should be called with a list of statements. It restructures the statements
        in the list so that translatable statements are contained within translation blocks.
        N(   R(   R   R   t   Labelt   hideR%   R1   R   t   restructureRL   t   SayR,   Rb   t   extendt   translatable(   R   RM   t   new_childrent   groupR4   RC   R0   (    (    si   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\translation\__init__.pyRL     s2    					(   RE   RF   R   RR   Rb   RL   (    (    (    si   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\translation\__init__.pyRJ   Ê   s   				)c         C  s   t  |  ƒ d  S(   N(   RJ   (   RM   (    (    si   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\translation\__init__.pyRe   .  s    t   RENPY_UPDATE_STRINGSc         C  s¦   |  j  d d ƒ }  |  j  d d ƒ }  |  j  d d ƒ }  |  j  d d ƒ }  |  j  d	 d
 ƒ }  |  j  d d ƒ }  |  j  d d ƒ }  |  j  d d ƒ }  |  j  d d ƒ }  |  S(   Ns   \s   \\s   "s   \"s   s   \as   s   \bs   s   \fs   
s   \ns   s   \rs   	s   \ts   s   \v(   R?   (   R5   (    (    si   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\translation\__init__.pyt   quote_unicode9  s    R   c           B  s2   e  Z d  Z d „  Z d „  Z d „  Z d „  Z RS(   s¸   
    This object stores the translations for a single language. It can also
    buffer unknown translations, and write them to a file at game's end, if
    we want that to happen.
    c         C  s   i  |  _  i  |  _ g  |  _ d  S(   N(   t   translationst   translation_loct   unknown(   R   (    (    si   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\translation\__init__.pyR   N  s    		c         C  s@   | |  j  k r" t d | ƒ ‚ n  | |  j  | <| |  j | <d  S(   Ns$   A translation for %r already exists.(   Rm   t	   ExceptionRn   (   R   t   oldt   newt   newloc(    (    si   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\translation\__init__.pyR+   Y  s    c         C  s˜   |  j  j | d  ƒ } | d  k	 r% | St rK | |  j  | <|  j j | ƒ n  | d  k r„ t j d d | ƒ } |  j  j | d  ƒ } n  | d  k	 r” | S| S(   Ns	   \{\#.*?\}RS   (   Rm   RB   R   t   update_translationsRo   R,   RG   RH   (   R   Rq   Rr   t   notags(    (    si   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\translation\__init__.pyR:   `  s    c         C  sý   |  j  s d  S| d  k r7 t j j t j j d ƒ } n' t j j t j j t j j | d ƒ } t j	 j
 j | ƒ } | j d j | ƒ ƒ | j d ƒ xV |  j  D]K } t | ƒ } | j d j | ƒ ƒ | j d j | ƒ ƒ | j d ƒ q  W| j ƒ  d  S(   Ns   strings.rpyu   translate {} strings:
u   
u       old "{}"
u       new "{}"
(   Ro   R   R    R!   t   joinR   t   configt   gamedirt   tl_directoryt   translationt
   generationt   open_tl_filet   writeR[   Rl   t   close(   R   R*   t   fnt   fR4   (    (    si   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\translation\__init__.pyt   write_updated_stringsu  s    	'(   RE   RF   t   __doc__R   R+   R:   R   (    (    (    si   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\translation\__init__.pyR   G  s
   			c         C  sC   t  j j j } | j |  } | j j |  ƒ | j | | | ƒ d  S(   N(   R   R@   RO   RP   R   R   R+   (   R*   Rq   Rr   Rs   RC   t   stl(    (    si   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\translation\__init__.pyt   add_string_translation  s    t   defaultc         C  sA   | t  k r t j j j } n  t j j j j | } | j |  ƒ S(   s   
    Translates interface string `s` to `language`. If `languages` is Default,
    uses the language set in the preferences.
    (	   t   DefaultR   R@   RA   R*   RO   RP   R   R:   (   R5   R*   Rƒ   (    (    si   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\translation\__init__.pyt   translate_string™  s    c          C  s9   t  j j j j t  j j j }  |  j t  j j j ƒ d  S(   N(   R   R@   RO   RP   R   RA   R*   R   (   Rƒ   (    (    si   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\translation\__init__.pyR   ¦  s    c         C  s\  d „  } t  j j |  ƒ j d d ƒ } t j j |  ƒ } d } xå | D]Ý } | j d ƒ } | j	 ƒ  } | ss qF n  | d d k r‰ qF n  | | d ƒ } | d d k rÓ | rÊ t
 d	 j | | ƒ ƒ ‚ n  | } n  | d d
 k rF | d k r
t
 d j | | ƒ ƒ ‚ n  t | | | ƒ d } qF qF W| j ƒ  | d k	 rXt
 d	 j | | ƒ ƒ ‚ n  d S(   s#   
    Loads the .rpt file `fn`.
    c         S  s(   |  j  d d ƒ }  |  j  d d ƒ }  |  S(   Ns   \ns   
s   \\s   \(   R?   (   R5   (    (    si   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\translation\__init__.pyt   unquote¶  s    s   .rptRS   s   utf-8i    t   #i   t   <s-   {0} string {1!r} does not have a translation.t   >s1   {0} translation {1!r} doesn't belong to a string.N(   R    R!   t   basenameR?   R   t   loadert   loadR   t   decodet   rstripRp   R[   R„   R~   (   R   Rˆ   R*   R€   Rq   t   lR5   (    (    si   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\translation\__init__.pyt   load_rpt±  s0    		
c          C  s:   x3 t  j j ƒ  D]" }  |  j d ƒ r t |  ƒ q q Wd S(   s   
    Loads all .rpt files.
    s   .rptN(   R   R   t
   list_filest   endswithR’   (   R   (    (    si   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\translation\__init__.pyt   load_all_rptsà  s    c           C  s'   t  j j ƒ  a t ƒ  t  j j ƒ  d S(   s(   
    Called before the game starts.
    N(   R   t   stylet   backupt   style_backupR•   t   storet   _init_language(    (    (    si   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\translation\__init__.pyt   init_translationð  s    s   language never setc           s‘   x t  D] } | j ƒ  q W‡  ‡ f d †  } t j j | ƒ x+ ˆ j ˆ  D] } t j j | j j ƒ qK Wx t j	 j
 ˆ  D] } | ƒ  q| Wd  S(   Nc            sn   x2 ˆ j  ˆ  D]# }  t j j ƒ  j |  j d ƒ q Wx2 ˆ j ˆ  D]# }  t j j ƒ  j |  j d ƒ qC Wd  S(   Ni    (   R   R   R@   t   contextt   runR   (   R4   (   R*   RC   (    si   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\translation\__init__.pyt
   run_blocks  s    !(   t   deferred_stylest   applyR   R@   t   invoke_in_new_contextR   t   py_exec_bytecodeR]   t   bytecodeRw   t   language_callbacks(   RC   R*   R4   Rž   (    (   R*   RC   si   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\translation\__init__.pyt   old_change_language  s    c           sÀ   t  j j ƒ  x+ ˆ j ˆ  D] } t  j j | j j ƒ q W‡  ‡ f d †  } t  j j | ƒ x t  j j	 ˆ  D] } | ƒ  qn Wx t
 D] } | j ƒ  q† W‡  ‡ f d †  } t  j j | ƒ d  S(   Nc            s9   x2 ˆ j  ˆ  D]# }  t j j ƒ  j |  j d ƒ q Wd  S(   Ni    (   R   R   R@   Rœ   R   R   (   R4   (   R*   RC   (    si   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\translation\__init__.pyRž     s    c            s9   x2 ˆ j  ˆ  D]# }  t j j ƒ  j |  j  d ƒ q Wd  S(   Ni    (   R   R   R@   Rœ   R   (   R4   (   R*   RC   (    si   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\translation\__init__.pyRž   +  s    (   R   Rw   t   init_system_stylesR   R¢   R]   R£   R@   R¡   R¤   RŸ   R    (   RC   R*   R4   Rž   (    (   R*   RC   si   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\translation\__init__.pyt   new_change_language  s    c         C  s,  |  t  j j _ t  j j j } t  j j t ƒ t  j j	 ƒ  x$ t  j
 j D] } t  j j | ƒ qH Wt  j
 j r~ t | |  ƒ n t | |  ƒ x t  j
 j D] } | ƒ  q˜ Wt |  k rØ t  j j ƒ  t  j j	 ƒ  |  a n  x$ t  j
 j D] } t  j j | ƒ qå Wt  j j ƒ  |  t k r(t  j j ƒ  n  d S(   s•   
    :doc: translation_functions

    Changes the current language to `language`, which can be a string or
    None to use the default language.
    N(   R   R@   RA   R*   RO   RP   R–   t   restoreR˜   t   rebuildRw   t   translate_clean_storesR   t   clean_storet   new_translate_orderR§   R¥   t   change_language_callbackst   old_languageR   t   free_memoryt   reset_store_changest   restart_interactiont   block_rollback(   R*   RC   R4   (    (    si   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\translation\__init__.pyt   change_language2  s(    
	c          C  s•   t  j j d }  t  j j } |  j | j k r‘ | j |  _ |  j } | d k	 r‘ t  j j j	 j
 | ƒ } | d k	 rŽ t  j j | j ƒ ‚ qŽ q‘ n  d S(   sw   
    Checks to see if the language has changed. If it has, jump to the start
    of the current translation block.
    iÿÿÿÿN(   R   R@   t   contextsRA   t   translate_languageR*   t   translate_identifierR   RO   RP   RD   t   JumpExceptionR%   (   t   ctxRA   t   tidt   node(    (    si   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\translation\__init__.pyt   check_languagec  s    	c           C  s   d „  t  j j j j Dƒ S(   s„   
    :doc: translation_functions

    Returns the set of known languages. This does not include the default
    language, None.
    c         S  s"   h  |  ] } | d  k	 r | ’ q S(   N(   R   (   t   .0R4   (    (    si   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\translation\__init__.pys	   <setcomp>  s   	 (   R   R@   RO   RP   R   (    (    (    si   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\translation\__init__.pyt   known_languagesy  s    ($   t
   __future__R    R   RU   RG   R   R    t   timet   iot   codecst   objectR   RI   RJ   Re   t   environRt   Rl   R   R„   t   SentinelR†   R‡   R   R’   R•   R   R˜   R›   R®   RŸ   R¥   R§   R³   R»   R½   (    (    (    si   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\translation\__init__.pyt   <module>   s<   –	d		H			/					1	