Ë
    ¾Žjb>  ã                   ó|   — d dl Z d dlmZmZmZ d dlmZ d dlm	Z	 d dl
Z
d dlmZ  e«         G d„ d«      Z e«       Zy)é    N)ÚDictÚListÚOptional)Útranslate_v2)Ú	lru_cache)Úload_dotenvc                   óì   — e Zd ZdZd„ Zdefd„Z ed¬«      ddeded	edefd
„«       Z	dde
e   ded	ede
e   fd„Z	 ddedede
e   d	edef
d„Zdededefd„Zdededefd„Zdededefd„Zdedefd„Zy)ÚTranslationServicezt
    Translation service using Google Cloud Translation API
    Supports English (default) and Korean languages
    c                 óH  — t        j                  d«      }|r^t        d|› �«       t         j                  j	                  |«      s_t        d|› �«       t        d«       d| _        ddg| _        d| _        yt        d«       t        d	«       d| _        ddg| _        d| _        y	 t        j                  «       | _        ddg| _        d| _        t        d
«       	 | j
                  j                  dd¬«      }|d   }t        d«       y# t        $ r#}t        d|› �«       t        d«       Y d}~yd}~ww xY w# t        $ ra}t        d|› �«       t        d«       t        d«       t        d«       t        d«       t        d«       t        d«       d| _        Y d}~yd}~ww xY w)z*Initialize Google Cloud Translation clientÚGOOGLE_APPLICATION_CREDENTIALSz%Using Google Cloud credentials file: z(Warning: Credentials file not found at: zTranslations will be disabled.NÚenÚkoz>Warning: GOOGLE_APPLICATION_CREDENTIALS not set in environmentzHTranslations will be disabled. Set this variable in .env file to enable.z,Translation service initialized successfullyÚHello)Útarget_languageÚtranslatedTextzTranslation API test successfulz&Warning: Translation API test failed: z+Translation service may not work correctly.z+Translation service initialization failed: z
Troubleshooting steps:z;1. Check that GOOGLE_APPLICATION_CREDENTIALS is set in .envz72. Verify the credentials file exists and is valid JSONz>3. Ensure Cloud Translation API is enabled in your GCP projectzC4. Verify the service account has 'Cloud Translation API User' role)ÚosÚgetenvÚprintÚpathÚexistsÚclientÚsupported_languagesÚdefault_languageÚ	translateÚClientÚ	Exception)ÚselfÚcredentials_pathÚtest_resultÚ
translatedÚ
test_errorÚes         ú;/var/www/html/Fitness-lenito-AI-main/translation_service.pyÚ__init__zTranslationService.__init__   s˜  € ô Ÿ9™9Ð%EÓFÐáÜÐ9Ð:JÐ9KÐLÔMô —7‘7—>‘>Ð"2Ô3ÜÐ@ÐAQÐ@RÐSÔTÜÐ6Ô7Ø"�”Ø,0°$¨<�Ô(Ø(,�Ô%ØäÐRÔSÜÐ\Ô]ØˆDŒKØ(,¨d |ˆDÔ$Ø$(ˆDÔ!Øð	Ü#×*Ñ*Ó,ˆDŒKØ(,¨d |ˆDÔ$Ø$(ˆDÔ!ÜÐ@ÔAðEØ"Ÿk™k×3Ñ3°GÈTÐ3ÓR�Ø(Ð)9Ñ:�
ÜÐ7Õ9øÜò EÜÐ>¸z¸lÐKÔLÜÐC×DÑDûðEûô ò 	ÜÐ?À¸sÐCÔDÜÐ2Ô3ÜÐ,Ô-ÜÐOÔPÜÐKÔLÜÐRÔSÜÐWÔXØˆD�K‰Kûð	ús=   Â%4D7 Ã-D Ä	D4ÄD/Ä*D7 Ä/D4Ä4D7 Ä7	F!Å AFÆF!Úreturnc                 ó   — | j                   duS )z)Check if translation service is availableN)r   )r   s    r#   Úis_translation_enabledz)TranslationService.is_translation_enabledC   s   € à�{‰{ $Ð&Ð&ó    iè  )ÚmaxsizeÚtextr   Úsource_languagec                 óH  — | j                  «       s|S ||k(  r|S || j                  vrt        d|› d| j                  › �«       |S |r|j	                  «       s|S 	 | j
                  j                  |||d¬«      }|d   S # t        $ r}t        d|› �«       |cY d}~S d}~ww xY w)aQ  
        Translate text to target language
        
        Args:
            text: Text to translate
            target_language: Target language code ('en' or 'ko')
            source_language: Source language code (default: 'en')
            
        Returns:
            Translated text or original text if translation fails
        zUnsupported target language: z, defaulting to r*   )r   r+   Úformat_r   zTranslation error: N)r'   r   r   r   Ústripr   r   r   )r   r*   r   r+   Úresultr"   s         r#   Útranslate_textz!TranslationService.translate_textG   sÆ   € ð ×*Ñ*Ô,ØˆKð ˜oÒ-ØˆKð  $×":Ñ":Ñ:ÜÐ1°/Ð1BÐBRÐSW×ShÑShÐRiÐjÔkØˆKá˜4Ÿ:™:œ<ØˆKð
	Ø—[‘[×*Ñ*ØØ /Ø /Øð	 +ó ˆFð Ð*Ñ+Ð+øÜò 	ÜÐ'¨ sÐ+Ô,Ø�Kûð	ús   Á#A> Á>	B!ÂBÂB!ÂB!Útextsc                 ó’   — | j                  «       s|S ||k(  r|S g }|D ]&  }| j                  |||«      }|j                  |«       Œ( |S )a  
        Translate a list of texts
        
        Args:
            texts: List of texts to translate
            target_language: Target language code
            source_language: Source language code
            
        Returns:
            List of translated texts
        )r'   r0   Úappend)r   r1   r   r+   Útranslated_textsr*   r    s          r#   Útranslate_listz!TranslationService.translate_listo   s\   € ð ×*Ñ*Ô,ØˆLà˜oÒ-ØˆLàÐÛˆDØ×,Ñ,¨T°?ÀOÓTˆJØ×#Ñ# JÕ/ð ð  Ðr(   ÚdataÚfields_to_translatec                 óÊ   — | j                  «       s|S ||k(  r|S |j                  «       }|D ]4  }||v sŒt        ||   t        «      sŒ| j	                  ||   ||«      ||<   Œ6 |S )aq  
        Translate specific fields in a dictionary
        
        Args:
            data: Dictionary containing data
            target_language: Target language code
            fields_to_translate: List of field names to translate
            source_language: Source language code
            
        Returns:
            Dictionary with translated fields
        )r'   ÚcopyÚ
isinstanceÚstrr0   )r   r6   r   r7   r+   Útranslated_dataÚfields          r#   Útranslate_dictz!TranslationService.translate_dictˆ   sx   € ð ×*Ñ*Ô,ØˆKà˜oÒ-ØˆKàŸ)™)›+ˆã(ˆEØ˜Ò'¬J°ÀuÑ7MÌsÕ,SØ)-×)<Ñ)<Ø# EÑ*Ø#Ø#ó*� Ò&ð )ð Ðr(   Ú	meal_datac                 óz  — | j                  «       r|dk(  r|S |j                  «       }d|v r| j                  |d   |«      |d<   d|v r| j                  |d   |«      |d<   d|v r| j                  |d   |«      |d<   d|v r| j                  |d   |«      |d<   d|v rŸt        |d   t        «      rŒg }|d   D ]}  }t        |t
        «      rZ|j                  «       }d|v r| j                  |d   |«      |d<   d|v r| j                  |d   |«      |d<   |j                  |«       Œm|j                  |«       Œ ||d<   |S )	a  
        Translate meal data including name, description, and ingredients
        
        Args:
            meal_data: Meal dictionary
            target_language: Target language code
            
        Returns:
            Translated meal dictionary
        r   Ú	meal_nameÚdescriptionÚcategoryÚsub_categoryÚingredientsÚnameÚquantity)r'   r9   r0   r:   ÚlistÚdictr3   )r   r?   r   Útranslated_mealÚtranslated_ingredientsÚ
ingredientÚtranslated_ings          r#   Útranslate_mealz!TranslationService.translate_meal¨   s’  € ð ×*Ñ*Ô,°À4Ò0GØÐà#Ÿ.™.Ó*ˆð ˜/Ñ)Ø+/×+>Ñ+>Ø Ñ,¨oó,ˆO˜KÑ(ð
 ˜OÑ+Ø-1×-@Ñ-@Ø Ñ.°ó.ˆO˜MÑ*ð
 ˜Ñ(Ø*.×*=Ñ*=Ø 
Ñ+¨_ó+ˆO˜JÑ'ð
 ˜_Ñ,Ø.2×.AÑ.AØ Ñ/°ó/ˆO˜NÑ+ð
 ˜OÑ+´
¸?È=Ñ;YÔ[_Ô0`Ø%'Ð"Ø-¨mÔ<�
Ü˜j¬$Ô/Ø%/§_¡_Ó%6�NØ Ñ/Ø15×1DÑ1DØ*¨6Ñ2°Oó2˜ vÑ.ð " ^Ñ3Ø59×5HÑ5HØ*¨:Ñ6¸ó6˜ zÑ2ð +×1Ñ1°.ÕAà*×1Ñ1°*Õ=ð =ð .DˆO˜MÑ*àÐr(   Ú	meal_planc                 óP  — | j                  «       r|dk(  r|S |j                  «       }g d¢}g d¢}|D ]l  }||v sŒ|D ]`  }|||   v sŒg }||   |   D ]A  }	| j                  |	|«      }
d|
v r| j                  |
d   |«      |
d<   |j	                  |
«       ŒC |||   |<   Œb Œn d|v r	 |S )a  
        Translate entire meal plan response with new structure
        
        Args:
            meal_plan: Meal plan dictionary
            target_language: Target language code
            
        Returns:
            Translated meal plan dictionary
        r   )Úbreakfast_optionsÚlunch_optionsÚdinner_options)Úprotein_packedÚlight_freshÚhealthy_comfortingrD   Úmeal_calorie_distribution)r'   r9   rN   r0   r3   )r   rO   r   Útranslated_planÚmeal_categoriesÚsub_categoriesrC   Úsub_catÚtranslated_mealsÚmealrJ   s              r#   Útranslate_meal_plan_responsez/TranslationService.translate_meal_plan_responseå   së   € ð ×*Ñ*Ô,°À4Ò0GØÐà#Ÿ.™.Ó*ˆò SˆÚPˆó
 (ˆHØ˜?Ò*Û-�GØ /°(Ñ";Ò;à+-Ð(Ø$3°HÑ$=¸gÔ$F˜DØ.2×.AÑ.AÀ$ÈÓ.X˜Oà-°Ñ@ØBF×BUÑBUØ$3°NÑ$CÀ_óC" °Ñ ?ð -×3Ñ3°OÕDð %Gð >N˜¨Ñ1°'Ò:ñ  .ð (ð" '¨/Ñ9ààÐr(   Úscan_resultc                 ó  — | j                  «       r|dk(  r|S |j                  «       }d|v r| j                  |d   |«      |d<   d|v r{g }|d   D ]l  }t        |t        «      sŒ|j                  «       }d|v r| j                  |d   |«      |d<   d|v r| j                  |d   |«      |d<   |j                  |«       Œn ||d<   d|v r{g }|d   D ]l  }t        |t        «      sŒ|j                  «       }d|v r| j                  |d   |«      |d<   d|v r| j                  |d   |«      |d<   |j                  |«       Œn ||d<   d|v r_g }|d   D ]P  }t        |t        «      sŒ|j                  «       }d|v r| j                  |d   |«      |d<   |j                  |«       ŒR ||d<   d|v r| j                  |d   |«      |d<   d	|v r| j                  |d	   |«      |d	<   d
|v r| j                  |d
   |«      |d
<   d|v rŒg }	|d   D ]}  }t        |t        «      rZ|j                  «       }d|v r| j                  |d   |«      |d<   d|v r| j                  |d   |«      |d<   |	j                  |«       Œm|	j                  |«       Œ |	|d<   |S )zò
        Translate food scan response
        
        Args:
            scan_result: Food scan result dictionary
            target_language: Target language code
            
        Returns:
            Translated food scan result
        r   Úidentified_ingredientsÚharmful_ingredientsrF   ÚreasonÚsafe_ingredientsÚneutral_ingredientsÚwarning_messageÚsafe_messageÚneutral_messageÚ
food_typesÚtitlerB   )r'   r9   r5   r:   rI   r0   r3   )
r   r_   r   Útranslated_resultÚtranslated_harmfulÚitemÚtranslated_itemÚtranslated_lowÚtranslated_safeÚtranslated_typess
             r#   Útranslate_food_scan_responsez/TranslationService.translate_food_scan_response  sZ  € ð ×*Ñ*Ô,°À4Ò0GØÐà'×,Ñ,Ó.Ðð $Ð'8Ñ8Ø:>×:MÑ:MØ!Ð":Ñ;¸_ó;ÐÐ6Ñ7ð
 !Ð$5Ñ5Ø!#ÐØ)Ð*?Ô@�Ü˜d¤DÕ)Ø&*§i¡i£k�OØ Ñ0Ø26×2EÑ2EØ+¨FÑ3°_ó3˜¨Ñ/ð   ?Ñ2Ø48×4GÑ4GØ+¨HÑ5°ó5˜¨Ñ1ð '×-Ñ-¨oÕ>ð Að 8JÐÐ3Ñ4ð Ð!2Ñ2ØˆNØ)Ð*<Ô=�Ü˜d¤DÕ)Ø&*§i¡i£k�OØ Ñ0Ø26×2EÑ2EØ+¨FÑ3°_ó3˜¨Ñ/ð   ?Ñ2Ø48×4GÑ4GØ+¨HÑ5°ó5˜¨Ñ1ð #×)Ñ)¨/Õ:ð >ð 5CÐÐ0Ñ1ð !Ð$5Ñ5Ø ˆOØ)Ð*?Ô@�Ü˜d¤DÕ)Ø&*§i¡i£k�OØ Ñ0Ø26×2EÑ2EØ+¨FÑ3°_ó3˜¨Ñ/ð $×*Ñ*¨?Õ;ð Að 8GÐÐ3Ñ4ð Ð 1Ñ1Ø37×3FÑ3FØ!Ð"3Ñ4°oó4ÐÐ/Ñ0ð Ð.Ñ.Ø04×0CÑ0CØ! .Ñ1°?ó1Ð˜nÑ-ð Ð 1Ñ1Ø37×3FÑ3FØ!Ð"3Ñ4°oó4ÐÐ/Ñ0ð Ð,Ñ,Ø!ÐØ)¨,Ô7�Ü˜d¤DÔ)Ø&*§i¡i£k�OØ /Ñ1Ø37×3FÑ3FØ+¨GÑ4°oó4˜¨Ñ0ð %¨Ñ7Ø9=×9LÑ9LØ+¨MÑ:¸Oó:˜¨Ñ6ð %×+Ñ+¨OÕ<à$×+Ñ+¨DÕ1ð 8ð /?Ð˜lÑ+à Ð r(   Úlanguage_codec                 ó0   — dddœ}|j                  ||«      S )zGet language name from codeÚEnglishu   í•œêµ­ì–´ (Korean))r   r   )Úget)r   rs   Úlanguage_namess      r#   Úget_language_namez$TranslationService.get_language_name|  s&   € ð Ø&ñ
ˆð ×!Ñ! -°Ó?Ð?r(   N)r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r$   Úboolr'   r   r;   r0   r   r5   r   r>   rN   r^   rr   rx   © r(   r#   r
   r
      s!  „ ñò
0ðd'¨ó 'ñ �tÔñ% 3ð %¸ð %Èsð %Ð^aò %ó ð%ñN  D¨¡Ið  Àð  ÐVYð  ÐeiÐjmÑenó  ð4 NRñ 4ð ¸#ð Ø+/°©9ðØGJðØVZóð@;¨ð ;¸sð ;Àtó ;ðz,°dð ,ÈSð ,ÐUYó ,ð\g!¸ð g!Èsð g!ÐW[ó g!ðR@¨sð @°sô @r(   r
   )r   Útypingr   r   r   Úgoogle.cloudr   r   Ú	functoolsr   ÚjsonÚdotenvr   r
   Útranslation_servicer~   r(   r#   Ú<module>r…      s;   ðÛ 	ß 'Ñ 'Ý 2Ý Û Ý ñ „÷w@ñ w@ñv )Ó*Ñ r(   