ó
    Â)ÒjÑ  ã            
       ó€  • S r SSKrSSKrSSKrSSKrSSKr\R                  R                  \R                  R                  \R                  R                  \	5      5      5      r
\R                  R                  S\
5        SSKrSSKJr  \R                  R                  \
SS5      r\" \R$                  5      S:”  a  \R$                  S   OSr\R(                  R+                  SS	S
9  SrS rS rS r\S:X  Ga$  \" 5       r\R8                  " \R:                  5       V s/ s H%  o \;  d  M
  \R=                  SU 5      (       a  M#  U PM'     sn r\ " \" \5      S\SS9  Sr!\"" S\" \5      \!5       Hœ  r#\$" \%" \\#\#\!-    5      5      r& \" \&5      r'\& HK  u  r*r+\'RY                  \*5      r-\-(       d  M   \-R]                  S5      \+R]                  S5      :X  d  MF  \-\\+'   MM     \" \5        \ " S\/" \#\!-   \" \5      5       S\" \5       3SS9  Mž     \ " S\" \5      SS9  ggs  sn f ! \( a  r)\ " S\)SS9   Sr)C)MÉ  Sr)C)ff = f)a:  Machine-translate the French strings that still have no English hover text (Level 4+), with the local Ollama model.
Writes curriculum/en_machine.py  (MACHINE = {normalised French: English}), resumable; review a sample by hand.
    python tools/translate_en.py [model]        (default qwen3:14b; needs the GPU free)é    N)ÚenÚ
curriculumzen_machine.pyé   z	qwen3:14búutf-8Úreplace)ÚencodingÚerrorsu—  You translate short French texts from a French course for an 11-year-old Arabic-speaking pupil into simple, natural English.
They are shown as a hover tooltip, so keep the meaning exact and short. Rules:
- Keep "___" blanks exactly as they are (they stand for a missing word).
- Keep French grammar terms readable: "passÃ© composÃ©" -> "passÃ© composÃ© (compound past)", "imparfait" -> "imperfect", "plus-que-parfait" -> "pluperfect",
  "conditionnel prÃ©sent" -> "present conditional", "futur simple" -> "simple future", "impÃ©ratif prÃ©sent" -> "imperative", "prÃ©sent" -> "present".
- A single conjugated verb form (e.g. "avions chantÃ©", "tu finiras") -> give its English meaning (e.g. "(we) had sung", "you will finish").
- Words in parentheses like "(chanter â€“ imparfait)" are instructions: translate them too.
- Do not add explanations. Answer ONLY with a JSON object mapping each input id to its English text.c                 ó~  • [        S5      R                  S U  5       5      n[        R                  " SS[	        [
        SSS[	        SSS	9[	        S
[        S9[	        SUS9/S9S9nUR                  5         [        R                  " UR                  5       S   S   5      nUR                  5        VVs0 s H{  u  pE[        U5      R                  5       R                  5       (       d  M3  [        U[        5      (       d  MJ  UR                  5       (       d  Ma  [        U5      UR                  5       _M}     snn$ s  snnf )Né
   c              3   ó4   #   • U  H  u  pU S U 3v •  M     g7f)ú: N© )Ú.0ÚiÚss      Útools/translate_en.pyÚ	<genexpr>Úask.<locals>.<genexpr>   s   é € Ð5ªu¡t q˜!˜˜B˜q˜c•{ªuùs   ‚zhttp://localhost:11434/api/chatiX  FÚjsongš™™™™™¹?i    )ÚtemperatureÚnum_ctxÚsystem)ÚroleÚcontentÚuser)ÚmodelÚstreamÚthinkÚformatÚoptionsÚmessages)Útimeoutr   Úmessager   )ÚchrÚjoinÚrequestsÚpostÚdictÚMODELÚPROMPTÚraise_for_statusr   ÚloadsÚitemsÚstrÚstripÚisdigitÚ
isinstanceÚint)ÚbatchÚmsgÚrÚoutÚkÚvs         r   Úaskr9      só   € Ü
ˆb‹'�,‰,Ñ5©uÓ5Ó
5€CÜ�ŠÐ7ÀÌ4Ü˜E¨°vÄtÐX[ÐeiÑGjÜ˜H¬fÑ5´tÀÐQTÑ7UÐVñLXñ 	Y€Að ×ÑÔÜ
�*Š*�Q—V‘V“X˜iÑ(¨Ñ3Ó
4€CØ*-¯)©)¬+Ôwª+¡$ !¼¸Q»¿¹»×9OÑ9O×9QÓÔV`ÐabÔdg×VhÓÐmn×mtÑmt×mvÓŒC�‹F�A—G‘G“IÒ©+ÒwÐwùÓws   Â32D9Ã)D9Ä D9ÄD9c                  ó°   • [         R                  R                  [        5      (       d  0 $ 0 n [	        [        [        SS9R                  5       U 5        U S   $ )Nr   ©r   ÚMACHINE)ÚosÚpathÚexistsÚOUTÚexecÚopenÚread)Únss    r   ÚloadrE   !   sC   € Ü�7‰7�>‰>œ#×ÑØˆ	Ø	€BÜŒŒc˜GÑ	$×	)Ñ	)Ó	+¨RÔ0Øˆi‰=Ðó    c                 ó`  • [        [        SSS9 nUR                  S5        UR                  S5        [        U 5       HC  nUR                  S[        R
                  " USS9 S	[        R
                  " X   SS9 S
35        ME     UR                  S5        S S S 5        g ! , (       d  f       g = f)NÚwr   r;   u�   # -*- coding: utf-8 -*-
"""Machine translations (local model) for hover text â€” generated by tools/translate_en.py; hand-written SENT wins."""
zMACHINE = {
z    F)Úensure_asciir   z,
z}
)rB   r@   ÚwriteÚsortedr   Údumps)ÚdoneÚfr7   s      r   ÚsaverO   )   s‹   € Ü	Œc�3 Ò	)¨QØ	�‰ð  eô  	fØ	�‰�Ô Ü˜–ˆAØ�G‰G�dœ4Ÿ:š: a°eÑ<Ð=¸RÄÇ
Â
È4É7ÐafÑ@gÐ?hÐhkÐlÖmñ à	�‰�Œ÷ 
*×	)Ö	)ús   �BBÂ
B-Ú__main__z[\u0600-\u06FF]zstrings to translate withT)Úflushé   z  batch failed:Ú___z  Ú/zTRANSLATION DONE)0Ú__doc__r=   Úsysr   Úrer&   r>   ÚdirnameÚabspathÚ__file__ÚROOTÚinsertr   ÚCr   r%   r@   ÚlenÚargvr)   ÚstdoutÚreconfigurer*   r9   rE   rO   Ú__name__rM   ÚmissingÚUNITSÚsearchÚtodoÚprintÚBÚrangeÚnÚlistÚ	enumerater3   ÚgotÚ	ExceptionÚer   r   ÚgetÚtÚcountÚmin)r   s   0r   Ú<module>rt      s  ðñ[÷ #× "Ó "Ø	‡w�w‡��r—w‘w—‘ r§w¡w§¡°xÓ'@ÓAÓB€Ø ‡�‡���4Ô Û Ý Ø‡g�g‡l�l�4˜ Ó7€Ù˜3Ÿ8™8“} qÓ(ˆ�‰�Š¨k€Ø ‡
�
× Ñ  °	Ð Ñ :ð
h€òxòòð ˆzÔÙ‹6€DØ—z’z !§'¡'Ô*ÓeÒ*�!°t©m‹AÀBÇIÁIÐN`Ðbc×Dd�AÑ*Ñe€DÙ	‰#ˆd‹)Ð0°%¸tÒDØ
€AÙ�1‘c˜$“i Ö#ˆÙ‘Y˜t A a¨!¡e˜}Ó-Ó.ˆð	Ù�e“*ˆCó ‰DˆAˆqØ—‘˜“
ˆAßˆq�Q—W‘W˜U“^ q§w¡w¨u£~Õ5Ø��Q“ñ ñ 	ˆTŒ
Ù�‘3�q˜1‘u™c $›iÓ(Ð)¨©3¨t«9¨+Ð6¸dÔCñ $ñ 
Ð
™c $›i¨tÓ4ð% ùâeøð ó 	ÙÐ# Q¨dÒ3Ýûð	ús*   Ä	HÄ,HÅHÆH$È$H=È*H8È8H=