Spaces:
Sleeping
Sleeping
| from fastapi import FastAPI, HTTPException, Query | |
| from fastapi.middleware.cors import CORSMiddleware | |
| from pydantic import BaseModel | |
| from typing import Dict, Any, Optional, List | |
| from chat_service import translate_locale, get_supported_languages | |
| import logging | |
| # Configura il logging | |
| logging.basicConfig(level=logging.INFO) | |
| logger = logging.getLogger(__name__) | |
| app = FastAPI( | |
| title="Local Translation Server", | |
| description="API per tradurre oggetti locale dall'italiano ad altre lingue", | |
| version="1.0.0" | |
| ) | |
| # Abilita CORS per permettere richieste da altri domini | |
| app.add_middleware( | |
| CORSMiddleware, | |
| allow_origins=["*"], | |
| allow_credentials=True, | |
| allow_methods=["*"], | |
| allow_headers=["*"], | |
| ) | |
| class LocaleRequest(BaseModel): | |
| """Modello per la richiesta di traduzione di un oggetto locale.""" | |
| locales: Dict[str, str] | |
| model_config = { | |
| "json_schema_extra": { | |
| "example": { | |
| "locales": { | |
| "welcome_message": "Benvenuto nella nostra applicazione!", | |
| "button_save": "Salva", | |
| "error_required": "Questo campo è obbligatorio", | |
| "html_content": "<p>Clicca <a href='#'>qui</a> per continuare</p>", | |
| "template_message": "Ciao {name}, hai {count} nuovi messaggi" | |
| } | |
| } | |
| } | |
| } | |
| class LocaleResponse(BaseModel): | |
| """Modello per la risposta di traduzione.""" | |
| translated_locales: Dict[str, str] | |
| source_language: str | |
| target_language: str | |
| model_config = { | |
| "json_schema_extra": { | |
| "example": { | |
| "translated_locales": { | |
| "welcome_message": "Welcome to our application!", | |
| "button_save": "Save", | |
| "error_required": "This field is required", | |
| "html_content": "<p>Click <a href='#'>here</a> to continue</p>", | |
| "template_message": "Hello {name}, you have {count} new messages" | |
| }, | |
| "source_language": "it", | |
| "target_language": "en" | |
| } | |
| } | |
| } | |
| class LanguagesResponse(BaseModel): | |
| """Modello per la risposta delle lingue supportate.""" | |
| supported_languages: List[str] | |
| def health_check(): | |
| """Endpoint per verificare che il server sia in esecuzione.""" | |
| return { | |
| "service": "Local Translation Server", | |
| "status": "running", | |
| "version": "1.0.0" | |
| } | |
| def get_languages(): | |
| """Restituisce la lista delle lingue supportate per la traduzione.""" | |
| return LanguagesResponse(supported_languages=get_supported_languages()) | |
| async def translate_locales( | |
| request: LocaleRequest, | |
| target_language: str = Query( | |
| ..., | |
| description="Codice della lingua target (es: 'en', 'fr', 'de')", | |
| example="en" | |
| ) | |
| ): | |
| """ | |
| Traduce un oggetto contenente locales dall'italiano alla lingua specificata. | |
| - **locales**: Dizionario chiave-valore dove ogni chiave è un identificatore | |
| e ogni valore è il testo in italiano da tradurre | |
| - **target_language**: Codice della lingua target (parametro query) | |
| Il servizio preserva: | |
| - Tag HTML nel testo | |
| - Placeholders con parentesi graffe (es: {name}, {count}) | |
| - Struttura delle chiavi originali | |
| """ | |
| try: | |
| logger.info(f"Richiesta traduzione per {len(request.locales)} locales verso {target_language}") | |
| # Verifica che la lingua target sia supportata | |
| supported_languages = get_supported_languages() | |
| if target_language not in supported_languages: | |
| raise HTTPException( | |
| status_code=400, | |
| detail=f"Lingua '{target_language}' non supportata. Lingue disponibili: {supported_languages}" | |
| ) | |
| # Esegui la traduzione | |
| translated_data = translate_locale(request.locales, target_language) | |
| logger.info(f"Traduzione completata per {len(translated_data)} locales") | |
| return LocaleResponse( | |
| translated_locales=translated_data, | |
| source_language="it", | |
| target_language=target_language | |
| ) | |
| except ValueError as e: | |
| raise HTTPException(status_code=400, detail=str(e)) | |
| except Exception as e: | |
| logger.error(f"Errore durante la traduzione: {str(e)}") | |
| raise HTTPException(status_code=500, detail=f"Errore interno del server: {str(e)}") | |
| async def translate_single_text( | |
| text: str = Query(..., description="Testo in italiano da tradurre"), | |
| target_language: str = Query( | |
| ..., | |
| description="Codice della lingua target (es: 'en', 'fr', 'de')", | |
| example="en" | |
| ) | |
| ): | |
| """ | |
| Traduce un singolo testo dall'italiano alla lingua specificata. | |
| Utile per test rapidi o traduzioni singole. | |
| """ | |
| try: | |
| from chat_service import get_translation_service | |
| # Verifica che la lingua target sia supportata | |
| supported_languages = get_supported_languages() | |
| if target_language not in supported_languages: | |
| raise HTTPException( | |
| status_code=400, | |
| detail=f"Lingua '{target_language}' non supportata. Lingue disponibili: {supported_languages}" | |
| ) | |
| # Ottieni il servizio di traduzione e traduci | |
| translation_service = get_translation_service() | |
| translated_text = translation_service.translate_text(text, target_language) | |
| return { | |
| "original_text": text, | |
| "translated_text": translated_text, | |
| "source_language": "it", | |
| "target_language": target_language | |
| } | |
| except ValueError as e: | |
| raise HTTPException(status_code=400, detail=str(e)) | |
| except Exception as e: | |
| logger.error(f"Errore durante la traduzione: {str(e)}") | |
| raise HTTPException(status_code=500, detail=f"Errore interno del server: {str(e)}") | |
| if __name__ == "__main__": | |
| import uvicorn | |
| uvicorn.run(app, host="0.0.0.0", port=8000) | |