
    P1iD                        d Z ddlmZmZ ddgZdZi ddddd	d
ddddddddddddddddddddddd d!d"d#i dd$dd%d	d&dd'dddd(dd)dd*dd+dd,dd-dd.dd.dd/d d0d"d1d2Zdd)d2dd*d2dd+d2dd,d2dd-d2d3Zd4d5d2d6d7d2d8d9d2d:d;d2d<d=d2d>d?d2d@dAd2dBdCd2dDdEd2dFdGd2dH
ZdIdJd2dKdLd2dMdNd2dOdPd2dQdRd2dSdTd2dUdVd2dWdXd2dYdZd2d[d\d2d]d^d2d_d`d2daZ	dbdcd2ddded2dfdgd2dhdid2djdkd2dldmd2dndod2dpdqd2drdsd2dtdud2dv
Z
i ddwdxd2dydzd{d2d|d}d~d2dddd2dddd2dddd2dddd2dddd2dddd2dddd2dddd2dddd2dddd2dddd2dddd2dddd2dddd2ddd2ddd2ddd2ddd2ddd2ddd2ddd2ddd2ddd2d	ZefdededefdZefdededefdZefdededefdÄZefdededefdńZdedefdƄZdedefdǄZefdededefdȄZefdedefdɄZefdedefdʄZefdedefd˄ZedfdedededefdτZefdededefdЄZefdededefd҄ZefdededefdԄZefdededefdքZefdededefd؄Zddefdededededededefd߄Zy)z
Internationalization utilities for AI analysis prompts.

This module provides translation dictionaries and helper functions
for generating multilingual prompts for BaZi and LiuYao analysis.
    )DictAnyzh-hansengender_maleu   男gender_femaleu   女gender_not_specifiedu	   不指定none   无errorErrorunknownu   未知element_woodu   木element_fireu   火element_earthu   土element_metalu   金element_wateru   水selfu   日主
self_labelcurrent_ageu   当前年龄current_luck_pillaru   当前大运current_yearu   当前年份MaleFemalezNot SpecifiedNoneUnknownWoodFireEarthMetalWaterz
Day MasterzCurrent AgezCurrent Luck PillarzCurrent Year)r   r   )woodfireearthmetalwateru   甲Jiau   乙Yiu   丙Bingu   丁Dingu   戊Wuu   己Jiu   庚Gengu   辛Xinu   壬Renu   癸Gui)
r                           	   u   子zZi (Rat)u   丑z	Chou (Ox)u   寅zYin (Tiger)u   卯zMao (Rabbit)u   辰zChen (Dragon)u   巳z
Si (Snake)u   午z
Wu (Horse)u   未z
Wei (Goat)u   申zShen (Monkey)u   酉zYou (Rooster)u   戌zXu (Dog)u   亥z	Hai (Pig))r   r1   r2   r3   r4   r5   r6   r7   r8   r9   
         比肩u   Friends (比肩)   劫财u   Rob Wealth (劫财)   食神u   Eating God (食神)   伤官u   Hurting Officer (伤官)   偏财u   Indirect Wealth (偏财)   正财u   Direct Wealth (正财)   七煞u   Seven Killings (七煞)   正官u   Direct Officer (正官)   偏印u   Indirect Resource (偏印)   正印u   Direct Resource (正印))
r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   u   天乙u   Heavenly Nobleman (天乙)r1   u   天德u   Heavenly Virtue (天德)r2   u   月德u   Moon Virtue (月德)r3   u   太极u   Grand Ultimate (太极)r4   u   禄神u   Fortune God (禄神)r5   u   文昌u   Academic Star (文昌)r6   u   驿马u   Traveling Horse (驿马)r7   u   桃花u   Peach Blossom (桃花)r8   u   红鸾u   Red Phoenix (红鸾)r9   u   天喜u   Heavenly Joy (天喜)r:   u   将星u   General Star (将星)r;   u   福星u   Fortune Star (福星)   u   华盖u   Artistic Star (华盖)   u   劫煞u   Robbery Star (劫煞)   u   亡神u   Calamity Star (亡神)   u   羊刃u   Goat Blade (羊刃)   u   灾煞u   Disaster (灾煞)u   孤辰u   Lonely Star (孤辰)u   寡宿u   Widow Star (寡宿)u   阴差阳错u    Yin-Yang Mismatch (阴差阳错)u   天医u   Heavenly Doctor (天医)u   飞刃u   Flying Blade (飞刃)u   隔角u   Separated Angle (隔角)u   十恶大败u    Great Defeat Star (十恶大败)u   六秀u   Six Talents (六秀)u   金舆u   Golden Chariot (金舆))	                           keylanguagereturnc                 j    |t         vrt        }t        j                  |i       j                  | |       S )z
    Get a translated string for a given key and language.
    
    Args:
        key: Translation key
        language: Language code (zh-hans or en)
        
    Returns:
        Translated string, or the key if translation not found
    )SUPPORTED_LANGUAGESDEFAULT_LANGUAGETRANSLATIONSgetrT   rU   s     //home/cursorai/projects/iching/ai/utils/i18n.pyget_translationr^      s2     **#Hb)--c377    genderc                 ^    | dk(  rt        d|      S | dk(  rt        d|      S t        d|      S )z
    Translate gender value to the specified language.
    
    Args:
        gender: Gender code (M, F, N)
        language: Language code (zh-hans or en)
        
    Returns:
        Translated gender string
    Mr   Fr   r	   r^   )r`   rU   s     r]   translate_genderre      s:     }}h77	3995x@@r_   elementc                     |t         vrt        }t        j                  | j	                         i       j                  ||       S )z
    Translate element name to the specified language.
    
    Args:
        element: Element name in English (wood, fire, earth, metal, water)
        language: Language code (zh-hans or en)
        
    Returns:
        Translated element string
    )rX   rY   ELEMENT_TRANSLATIONr[   lower)rf   rU   s     r]   translate_elementrj      s8     **#""7==?B7;;HgNNr_   valuec                 H    | 
| dk(  s| dk(  rt        d|      S t        |       S )a  
    Translate None/empty values to the specified language.
    
    Args:
        value: Value to check (None, empty string, etc.)
        language: Language code (zh-hans or en)
        
    Returns:
        Translated "None" string if value is None/empty, otherwise str(value)
     r   r
   )r^   strrk   rU   s     r]   translate_nonerp      s,     }u~vx00u:r_   c                 "    | t         v r| S t        S )z
    Validate and normalize language code.
    
    Args:
        language: Language code to validate
        
    Returns:
        Validated language code (defaults to zh-hans if invalid)
    )rX   rY   rU   s    r]   validate_languagers      s     &&r_   c                     t        |       S )z
    Normalize language code (alias for validate_language).
    
    Args:
        language: Language code to normalize
        
    Returns:
        Normalized language code (defaults to zh-hans if invalid)
    )rs   rr   s    r]   normalize_languageru      s     X&&r_   c                     t        | |      S )z
    Get a translated text by key (alias for get_translation).
    
    Args:
        key: Translation key
        language: Language code (zh-hans or en)
        
    Returns:
        Translated string, or the key if translation not found
    rd   r\   s     r]   get_textrw   
  s     3))r_   c                     t        d|       S )z
    Get the "None" placeholder text for the specified language.
    
    Args:
        language: Language code (zh-hans or en)
        
    Returns:
        "None" text in the specified language
    r
   rd   rr   s    r]   	none_textry     s     68,,r_   c                     t        d|       S )z
    Get the "Error" placeholder text for the specified language.
    
    Args:
        language: Language code (zh-hans or en)
        
    Returns:
        "Error" text in the specified language
    r   rd   rr   s    r]   
error_textr{   %  s     7H--r_   c                     t        d|       S )z
    Get the "Unknown" placeholder text for the specified language.
    
    Args:
        language: Language code (zh-hans or en)
        
    Returns:
        "Unknown" text in the specified language
    r   rd   rr   s    r]   unknown_textr}   2  s     9h//r_   , items	separatorc                     | st        |      S | D cg c]*  }|t        |      j                         s t        |      , }}|st        |      S |j                  |      S c c}w )a1  
    Join a list of items with a separator, handling None/empty values.
    
    Args:
        items: List of items to join
        language: Language code (zh-hans or en)
        separator: Separator string (default: ', ')
        
    Returns:
        Joined string, or "None" text if list is empty
    )ry   rn   stripjoin)r   rU   r   itemfiltered_itemss        r]   	join_listr   ?  sa     "" -2\EDT5E#d)//J[c$iEN\"">>.)) ]s   A!A!A!c                 x    | yt        | t              r'| j                         } | sy| t        |      k(  s| dk(  ryy)a  
    Check if a value is missing (None, empty, or equals the "None" text).
    
    Args:
        value: Value to check
        language: Language code (zh-hans or en) - used to check against localized "None"
        
    Returns:
        True if value is missing, False otherwise
    Tr   F)
isinstancern   r   ry   ro   s     r]   
is_missingr   W  s@     }%Ih''5E>r_   stemc                 :   |t         vrt        }t        j                         D ])  \  }}|d   | k(  s|dk(  r|d    d|d    dc S |d   c S  	 t	        |       }|t        v r!t        |   }|dk(  r|d    d|d    dS |d   S 	 | S # t
        t        f$ r Y | S w xY w)u1  
    Translate heavenly stem (天干) to the specified language.
    
    Args:
        stem: Heavenly stem character (e.g., '甲', '乙') or index (0-9)
        language: Language code (zh-hans or en)
        
    Returns:
        Translated stem string. For English: "Jia (甲)", for Chinese: "甲"
    r   r    ())rX   rY   HEAVENLY_STEMSr   int
ValueError	TypeError)r   rU   idxdatas       r]   translate_heavenly_stemr   n  s     **# $))+	T	?d"4t*RY'8::	?"	 ,$i. !#&D4t*RY'8::	?"	 ! K	 	"  K	   .B ?B BBbranchc                 :   |t         vrt        }t        j                         D ])  \  }}|d   | k(  s|dk(  r|d    d|d    dc S |d   c S  	 t	        |       }|t        v r!t        |   }|dk(  r|d    d|d    dS |d   S 	 | S # t
        t        f$ r Y | S w xY w)u=  
    Translate earthly branch (地支) to the specified language.
    
    Args:
        branch: Earthly branch character (e.g., '子', '丑') or index (0-11)
        language: Language code (zh-hans or en)
        
    Returns:
        Translated branch string. For English: "Zi (Rat) (子)", for Chinese: "子"
    r   r   r   r   )rX   rY   EARTHLY_BRANCHESr   r   r   r   )r   rU   r   r   s       r]   translate_earthly_branchr     s     **# &++-	T	?f$4t*RY'8::	?"	 .&k""#C(D4t*RY'8::	?"	 # M	 	"  M	r   ten_godc                 d    |t         vrt        }| t        v rt        |    j                  ||       S | S )u2  
    Translate Ten God (十神) to the specified language.
    
    Args:
        ten_god: Ten God name in Chinese (e.g., '比肩', '食神')
        language: Language code (zh-hans or en)
        
    Returns:
        Translated Ten God string. For English: "Friends (比肩)", for Chinese: "比肩"
    )rX   rY   TEN_GODSr[   )r   rU   s     r]   translate_ten_godr     s9     **#( $$Xw77 Nr_   starc                    |t         vrt        }t        j                         D ]!  \  }}|d   | k(  s|dk(  r|d    c S |d   c S  	 t	        |       }|t        v rt        |   }|dk(  r|d    S |d   S 	 | S # t
        t        f$ r Y | S w xY w)uX  
    Translate Special Star (神煞) to the specified language.
    
    Args:
        star: Special Star name in Chinese (e.g., '天乙', '文昌') or index (0-25)
        language: Language code (zh-hans or en)
        
    Returns:
        Translated Special Star string. For English: "Heavenly Nobleman (天乙)", for Chinese: "天乙"
    r   r   )rX   rY   SPECIAL_STARSr   r   r   r   )r   rU   r   r   s       r]   translate_special_starr     s     **# #((*	T	?d"4t*&	?"	 +$i- %D4t*&	?"	   K	 	"  K	s   &A7 /A7 7B
	B
Ngodr$   	age_rangestem_relationshipbranch_relationshipsc                    t        | |      }t        ||      }|dk(  r|  | d| d}n|  | d| | d| d}|dk(  r|rt        ||      st        ||      }	d| d|	 g}
|rt        ||      s{g }|j	                  d	      D ]>  }|j                         st        |j                         |      }|j                  |       @ |r%|
j                  | dd	j                  |              |dd	j                  |
       dz  }|S |rQt        ||      sEd
|  d| g}
|r"t        ||      s|
j                  | d|        |dd	j                  |
       dz  }|S )u  
    Format a luck pillar description with optional ten god relationships.
    
    Args:
        god: Heavenly stem (天干)
        earth: Earthly branch (地支)
        age_range: Age range string
        stem_relationship: Optional ten god relationship for stem
        branch_relationships: Optional ten god relationships for branch
        language: Language code (zh-hans or en)
        
    Returns:
        Formatted luck pillar description
    r   z (Ages r   r   z) (Ages r   z
Ten Gods: z: r~   u	   十神：u   ：)r   r   r   r   splitr   appendr   )r   r$   r   r   r   rU   translated_godtranslated_earthbasetranslated_stem_relpartsbranch_partsreltranslated_rels                 r]   format_luck_descriptionr     s   . -S(;N/x@ 9ugWYKq1 ugR/0@/A)TUV4Z0A8%L"34Ex"P!.!14G3HIJE#J7KX,V!/55d;Cyy{):399;)Q$++N; <  LL$4#5R		,8O7P!QRb5)*!,,D K Z0A8%L S):(;<=E#J7KX,Vwc*>)?@Ab5)*!,,DKr_   ) __doc__typingr   r   rX   rY   rZ   rh   r   r   r   r   rn   r^   re   rj   rp   rs   ru   rw   ry   r{   r}   listr   boolr   r   r   r   r   r    r_   r]   <module>r      s    !$'  u 	 		 	 	 	8 	 	 	 	  	!& 	'( 	h)* 	~+, 	~-. 	/2v 	 		 	 	 	9 	 	 	 	  	!& 	'( 	l)* 	}+, 	4-. 	/53p 
 
 
 
 # 4 &%''%%'&&&  
+,./0---00,- " #*<="*?@"*?@"*DE"*DE"*BC"*CD"*CD"*FG"*DE8#?@8#=> 8#9: 8#<=	
 8#9: 8#;< 8#=> 8#;< 8#9: 8#:; H$;< H$;< H$<= H$;< H$<=  H$9:!" H$78#$ $:;$9:"*LM$>?$;<$>?"*LM$:;$=>5< /? 8 8 83 8" 3C AS AC As A& 5E Os Oc O O" 0@ #  C    
' 
' 
' (8 *# * *C * / 
- 
-3 
-  0 
. 
.C 
. "2 
03 
0c 
0 ,<d *T *S * *WZ *0 ,< c S  . 8H !# ! !C !H ;K !S !C !s !H 5E s c  * 7G ! ! !3 !P " $$8	88 8 	8
 8 8 	8r_   