a
    F^if                     @   s  d dl mZmZmZmZmZ d dlmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZ d dlZe  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G dd deZdd ZG dd	 d	eZd
d Z dej!v Z"dd Z#G dd deZ$dd Z%ej&dZ'e'fddZ(dd Z)dd Z*dd Z+da,dd Z-da.g Z/dd  Z0d!d" Z1dd$d%Z2d&d' Z3d(d) Z4d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddٜZ5ddۄ Z6dd krddl7m8Z8 ddl7m9Z9 ddl7m:Z: ddl7m;Z; ddl7m<Z< dS )    )divisionabsolute_importwith_statementprint_functionunicode_literals)PY2
basestringbchrbordchropenpystrrangeroundstrtobytesunicodeNc                   @   s6   e Zd Zdd Zdd Zdd Zdd Zdd
dZd	S )ScriptTranslatorc                 C   sf   t  | _i | _i | _g | _tt| _tt	| _
tt| _tt| _tt| _tt| _d S N)set	languagesdefault_translateslanguage_translateschain_worklistcollectionsdefaultdictlistfile_translatesStringTranslatorstringsblockearly_blockpythonadditional_stringsself r&   ^C:\Program Files (x86)\Steam\steamapps\common\Selene ~Apoptosis~\renpy\translation\__init__.py__init__-   s    zScriptTranslator.__init__c                 C   s
   t | jS )zC
        Return the number of dialogue blocks in the game.
        )lenr   r$   r&   r&   r'   count_translatesT   s    z!ScriptTranslator.count_translatesc                 C   s  d}d}|sdS t jj}t jj}t jj}t jj}t jj}t jj}	t j	|d j
}
tjtj|
}
|D ]"}|jsxqj|jjturt|jtr|j}|j}|j}||u r|jdur| j|j | j|j | qj||u r|jdur| j|j | j|j | qj||u rD|jdur0| j|j | j|j | qj||u r|jD ]J}|d }t jjrv| dd}|du rqT| j!|
 |j"||f qTqj||u r|#d}|du rqj|D ]}| j!|
 |j"||f qqj||	u rj|jdu rZ|j$| j%v r6| j%|j$ }t&d|j$|j
|j"|j
|j"f || j%|j$< | j'|
 |||f qj| j|j || j(|j$|jf< | j)|j$|jf qjdS )z}
        Takes the translates out of the flattened list of statements, and stores
        them into the dicts above.
        NFr   z%%%translation_stringsz3Line with id %s appeared twice, at %s:%d and %s:%d.)*renpyastTranslatePythonTranslateBlockTranslateEarlyBlockMenuUserStatement	Translateexportsunelide_filenamefilenameospathnormpathabspathtranslation_relevantname	__class__tuple
isinstancer   hidelanguager   addr"   appendr!   r    itemsconfigold_substitutionsreplacer#   
linenumbercall
identifierr   	Exceptionr   r   r   )r%   nodeslabelZhide_statusr/   r0   r1   r2   r3   r4   r7   nZtype_nisr   old_noder&   r&   r'   take_translates[   sz    











z ScriptTranslator.take_translatesc                 C   sb   g }| j D ]L\}}|| jvr,|||f q
| j||f }| j| j}tj|j| q
|| _ dS )zB
        Chains nodes in non-default translates together.
        N)	r   r   rD   r   afterr-   r.   chain_blockr    )r%   Z	unchainedrK   rB   	translate	next_noder&   r&   r'   chain_translates   s    
z!ScriptTranslator.chain_translatesNc                 C   sp   | dd}tjjj}|d urP| j||fd }|d u rT|rT| j||fd }nd }|d u rf| j| }|jd S )N._r   )	rH   r-   gamepreferencesrB   r   getr   r    )r%   rK   	alternaterB   tlr&   r&   r'   lookup_translate   s    

z!ScriptTranslator.lookup_translate)N)__name__
__module____qualname__r(   r*   rS   rX   r`   r&   r&   r&   r'   r   +   s
   'Wr   c                 C   s>   |  dd} |  dd} |  dd} tdd| } d|  d S )	zG
    Encodes a string in the format used by Ren'Py say statements.
    \\\
\n"\"z(?<= ) z\ )rH   resubrQ   r&   r&   r'   encode_say_string   s
    rm   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )Restructurerc                 C   s"   d | _ d | _t | _| | d S r   )rN   r^   r   identifierscallback)r%   childrenr&   r&   r'   r(      s    zRestructurer.__init__c                 C   s&   || j v rdS |tjjjjv r"dS dS )NTF)ro   r-   r[   script
translatorr   )r%   rK   r&   r&   r'   	id_exists   s
    
zRestructurer.id_existsc                 C   sV   |d u r|}n| ddd | }d}d}|| }| |s>qR|d7 }d|}q*|S )NrY   rZ   r       z_{0})rH   rt   format)r%   rN   digestbaserP   suffixrK   r&   r&   r'   unique_identifier   s    
zRestructurer.unique_identifierc                 C   s.  t  }|D ] }| }||d d q| dd }| | j|}d}|D ]}t|t	j
jrTt|d|}qT| jdur| | j|}|p|}n|dur|}|}nd}|}| j| |dur| j| |d j|d jf}	t	j
j|	|d||d}
|d jd |
_t	j
|	}|d jd	 |_|
|gS )
zz
        Creates an ast.Translate that wraps `block`. The block may only contain
        translatable statements.
        z
utf-8N   rK   r   )r^   )rV   )Zend_translate)hashlibmd5get_codeupdateencode	hexdigestr{   rN   r@   r-   r.   Saygetattrr^   ro   rC   r7   rI   r4   r=   EndTranslate)r%   r    r   rP   coderx   rK   Zid_identifierr^   locr_   Zedr&   r&   r'   create_translate  s6    

zRestructurer.create_translatec                 C   s   g }g }|D ]}t |tjjrH|jsH|jdr:|j| _n|j| _d| _t |tjj	sb|
| j t |tjjr|| | |}|| g }q|jr|| q|r| |}|| g }|| q|r| |}|| g }||dd< dS )z
        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.
        rZ   N)r@   r-   r.   LabelrA   r=   
startswithr^   rN   r4   restructurerp   r   rD   r   extendtranslatable)r%   rq   Znew_childrengrouprP   r_   rM   r&   r&   r'   rp   ?  s8    







zRestructurer.callbackN)ra   rb   rc   r(   rt   r{   r   rp   r&   r&   r&   r'   rn      s
   	0rn   c                 C   s   t |  d S r   )rn   )rq   r&   r&   r'   r   o  s    r   ZRENPY_UPDATE_STRINGSc                 C   sp   |  dd} |  dd} |  dd} |  dd} |  d	d
} |  dd} |  dd} |  dd} |  dd} | S )Nrd   re   rh   ri   z\az\bz\frf   rg   z\r	z\tz\vrH   rl   r&   r&   r'   quote_unicodez  s    r   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )r   z
    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 r   )translationstranslation_locunknownr$   r&   r&   r'   r(     s    zStringTranslator.__init__c                 C   sl   || j v rL|| jv r:| j| \}}tdt|||ntdt||| j |< |d urh|| j|< d S )Nz/A translation for "{}" already exists at {}:{}.z&A translation for "{}" already exists.)r   r   rL   rw   r   )r%   oldnewnewlocfnliner&   r&   r'   rC     s    



zStringTranslator.addc                 C   sh   | j |d }|d ur|S tr4|| j |< | j| |d u rXtdd|}| j |d }|d urd|S |S )Nz	\{\#.*?\}ru   )r   r]   update_translationsr   rD   rj   rk   )r%   r   r   Znotagsr&   r&   r'   rV     s    
zStringTranslator.translatec                 C   s   | j s
d S |d u r&tjtjjd}ntjtjjtjj|d}tjj	
|h}|d| |d | j D ]6}t|}|d| |d| |d qpW d    n1 s0    Y  d S )Nzstrings.rpyztranslate {} strings:
rf   z    old "{}"
z    new "{}"
)r   r8   r9   joinr-   rF   gamedirtl_directorytranslation
generationZopen_tl_filewriterw   r   )r%   rB   r   frP   r&   r&   r'   write_updated_strings  s    

z&StringTranslator.write_updated_stringsN)ra   rb   rc   __doc__r(   rC   rV   r   r&   r&   r&   r'   r     s
   r   c                 C   s2   t jjj}|j|  }|j|  |||| d S r   )r-   r[   rr   rs   r   r   rC   )rB   r   r   r   r_   stlr&   r&   r'   add_string_translation  s    

r   defaultc                 C   s,   |t u rtjjj}tjjjj| }|| S )a  
    :doc: translate_string
    :name: renpy.translate_string

    Returns `s` immediately translated into `language`. If `language`
    is Default, uses the language set in the preferences.
    Strings enclosed in this function will **not** be added
    to the list of translatable strings. Note that the string may be
    double-translated, if it matches a string translation when it
    is displayed.
    )	Defaultr-   r[   r\   rB   rr   rs   r   rV   )rQ   rB   r   r&   r&   r'   translate_string  s    
r   c                  C   s*   t jjjjt jjj } | t jjj d S r   )r-   r[   rr   rs   r   r\   rB   r   )r   r&   r&   r'   r     s    r   c                 C   s  dd }t j| dd}d}tj| }|D ]}|d}| }|sNq2|d dkr\q2||d	d }|d d
kr|rt	d
|||}|d dkr2|du rt	d
||t|||d d}q2W d   n1 s0    Y  |durt	d
||dS )z#
    Loads the .rpt file `fn`.
    c                 S   s   |  dd} |  dd} | S )Nrg   rf   re   rd   r   rl   r&   r&   r'   unquote  s    zload_rpt.<locals>.unquote.rptru   Nr|   r   #   <z-{0} string {1!r} does not have a translation.>z1{0} translation {1!r} doesn't belong to a string.)r8   r9   basenamerH   r-   loaderloaddecoderstriprL   rw   r   )r   r   rB   r   r   lrQ   r&   r&   r'   load_rpt   s.    
$r   c                  C   s&   t j D ]} | dr
t|  q
dS )z
    Loads all .rpt files.
    r   N)r-   r5   Z
list_filesendswithr   )r   r&   r&   r'   load_all_rpts,  s    
r   c                   C   s   t j at  t j  dS )z(
    Called before the game starts.
    N)r-   stylebackupstyle_backupr   storeZ_init_languager&   r&   r&   r'   init_translation=  s    
r   zlanguage never setc                    sh   t D ]}|  q fdd}tj| j  D ]}tj|jj q6tj	j
  D ]
}|  qXd S )Nc                     sP   j   D ]} tj | jd  q
j  D ]} tj | jd  q0d S Nr   r!   r-   r[   contextrunr    rP   rB   r_   r&   r'   
run_blocksV  s    z'old_change_language.<locals>.run_blocks)deferred_stylesapplyr-   r[   invoke_in_new_contextr"   py_exec_bytecoder   bytecoderF   language_callbacks)r_   rB   rP   r   r&   r   r'   old_change_languageQ  s    
r   c                    s   j   D ]}tj |jj q
 fdd}tj| tjj  D ]
}|  qFt	D ]}|
  qV fdd}tj| tj  d S )Nc                     s*   j   D ]} tj | jd  q
d S r   r   r   r   r&   r'   run_early_blocksk  s    z-new_change_language.<locals>.run_early_blocksc                     s*   j   D ]} tj | j d  q
d S r   )r    r-   r[   r   r   r   r   r&   r'   r   w  s    z'new_change_language.<locals>.run_blocks)r"   r-   r   r   r   r[   r   rF   r   r   r   init_system_styles)r_   rB   rP   r   r   r&   r   r'   new_change_languagef  s    
r   Fc                 C   s   t | kr$tj tj_tj tj_| tjj_t | kr>|s>dS tjj	j
}tjt tj  tjjD ]}tj| qftjjrt||  n
t||  tjjD ]
}|  qtj  tj  tjjD ]}tj| qtj  | t krtj  | a dS )z
    :doc: translation_functions

    Changes the current language to `language`, which can be a string or
    None to use the default language.
    N)old_languager-   r   r   Z_history_listZnvl_listr[   r\   rB   rr   rs   r   restorer   rebuildrF   translate_clean_storesr"   clean_storenew_translate_orderr   r   change_language_callbacksr5   free_memoryreset_store_changesrestart_interactionZblock_rollback)rB   forcer_   rP   r&   r&   r'   change_language  s0    








r   c                  C   s`   t jjd } t jj}| j|jkr\|j| _| j}|dur\t jjj	|}|dur\t j
|jdS )zw
    Checks to see if the language has changed. If it has, jump to the start
    of the current translation block.
    N)r-   r[   contextsr\   translate_languagerB   translate_identifierrr   rs   r`   JumpExceptionr=   )ctxr\   tidnoder&   r&   r'   check_language  s    r   c                   C   s   dd t jjjjD S )z
    :doc: translation_functions

    Returns the set of known languages. This does not include the default
    language, None.
    c                 S   s   h | ]}|d ur|qS r   r&   ).0rP   r&   r&   r'   	<setcomp>      z"known_languages.<locals>.<setcomp>)r-   r[   rr   rs   r   r&   r&   r&   r'   known_languages  s    r   Z	abkhazianZafarZ	afrikaansZakanZalbanianZamharicarabicZ	aragoneseZarmenianZassameseZavaricZavestanZaymaraZazerbaijaniZbambaraZbashkirZbasqueZ
belarusianZbengaliZbihariZbislamaZbosnianZbreton	bulgarianZburmesecatalanZchamorroZchechenZchewaZchuvashZcornishZcorsicanZcreecroatianczechdanishZ	maldiviandutchZdzongkhaenglishestonianZeweZfaroeseZfijianfinnishfrenchZfulahgalicianZgeorgiangermangreekZguaranZgujaratiZhaitianZhausahebrewZhereroZhindiZ	hiri_motu	hungarianZ
indonesianZirishZigboZinupiaq	icelandicitalianZ	inuktitutjapaneseZjavaneseZgreenlandicZkannadaZkanuriZkashmiriZkazakhZkhmerZkikuyuZkinyarwandaZkirghizZkomiZkongokoreanZkurdishZkuanyamalatinZluxembourgishZgandaZ	limburganZlingalaZlao
lithuanianZlatvianZmanxZ
macedonianZmalagasyZmalayZ	malayalamZmalteseZmaoriZmarathiZmarshalleseZ	mongolianZnauruZnavahoZnepaliZndonga	norwegianZnuosuZndebeleZoccitanZojibwaZoromoZoriyaZossetianZpanjabiZpaliZpersianpolishZpashto
portugueseZquechuaZromanshZrundiromanianrussianZsanskritZ	sardinianZsindhiZsamiZsamoanZsangoZserbianZgaelicZshonasinhalaslovaksloveneZsomaliZsothospanishZ	sundaneseZswahiliZswatiswedishZtamilZteluguZtajikthaiZtigrinyaZtibetanZturkmenZtagalogZtswanaZtonganturkishZtsongaZtatarZtwiZtahitianZuighurZ	ukrainianZurduZuzbekZvendaZ
vietnameseZwalloonZwelshZwolofZfrisianZxhosaZyiddishZyorubaZzhuangZzuluZsimplified_chineseZtraditional_chinese)abZaaafZaksqamarZanZhyasavZaeZayazZbmbaeubeZbnZbhZbibsbrbgZmycachcenyZcvkwcoZcrhrcsdaZdvnlZdzeneteefoZfjfifrZffglkadeelZgnZguhtZhahehzhiZhohuidgaZigZikisitiujaZjvklknZkrksZkkZkmZkirwkyZkvZkgkoZkuZkjlalbZlgZlilnloltlvgvmkZmgmsmlmtmimrZmhZmnZnaZnvneZngnoiinrocZojZomorr8   papifaplpsptZqurmZrnroruZsaZscsdZsesmZsgsrgdZsnsiskslsostesZsuswsssvtatetgthZtiZboZtkr_   tntotrtsttZtwtyZugukuruzveviwacyZwoZfyxhyiZyoZzazuZchsZchtzhc                  C   s$  dd l } tjr0dd l}|jj}| j| }ntj	r\ddl
m} |d}t|  }nhtjrdd l}|d}| }|d }t|tr|d}|dd}	n|  }|d ur|d }|d u rdS | |}
|
|kr| }}n0|
}d	|v r
|d	d
\}}| d\}}||fS )Nr   )	autoclasszjava.util.LocaleNSLocaler|   -rZ   )NNrY   rv   )localer-   windowsctypeswindllkernel32windows_localer]   ZGetUserDefaultUILanguageandroidZjniusr  r   Z
getDefaultZgetLanguageiospyobjusZpreferredLanguagesZobjectAtIndex_
UTF8Stringr@   bytesr   rH   getdefaultlocale	normalizesplitlower)r  r  r  Zlocale_namer  ZLocaler  r  r   
local_namer  rB   ZregionrZ   r&   r&   r'   detect_user_locale  s<    





r  rv   )dialogue)extract)r   )merge)scanstrings)F)=
__future__r   r   r   r   r   renpy.compatr   r   r	   r
   r   r   r   r   r   r   r   r   r-   update_pathr~   rj   r   r8   timeiocodecsobjectr   rm   rn   r   environr   r   r   r   Sentinelr   r   r   r   r   r   r   r   r   r   r   r   r   r   Zlocalesr  ru   r  r  r   r  r  r&   r&   r&   r'   <module>   s  8 0 	
N,
5  5(
