Initial commit: Document Translation API with Excel, Word, PowerPoint support
This commit is contained in:
4
services/__init__.py
Normal file
4
services/__init__.py
Normal file
@@ -0,0 +1,4 @@
|
||||
"""Services package initialization"""
|
||||
from .translation_service import TranslationService, translation_service
|
||||
|
||||
__all__ = ['TranslationService', 'translation_service']
|
||||
124
services/translation_service.py
Normal file
124
services/translation_service.py
Normal file
@@ -0,0 +1,124 @@
|
||||
"""
|
||||
Translation Service Abstraction
|
||||
Provides a unified interface for different translation providers
|
||||
"""
|
||||
from abc import ABC, abstractmethod
|
||||
from typing import Optional
|
||||
from deep_translator import GoogleTranslator, DeeplTranslator, LibreTranslator
|
||||
from config import config
|
||||
|
||||
|
||||
class TranslationProvider(ABC):
|
||||
"""Abstract base class for translation providers"""
|
||||
|
||||
@abstractmethod
|
||||
def translate(self, text: str, target_language: str, source_language: str = 'auto') -> str:
|
||||
"""Translate text from source to target language"""
|
||||
pass
|
||||
|
||||
|
||||
class GoogleTranslationProvider(TranslationProvider):
|
||||
"""Google Translate implementation"""
|
||||
|
||||
def translate(self, text: str, target_language: str, source_language: str = 'auto') -> str:
|
||||
if not text or not text.strip():
|
||||
return text
|
||||
|
||||
try:
|
||||
translator = GoogleTranslator(source=source_language, target=target_language)
|
||||
return translator.translate(text)
|
||||
except Exception as e:
|
||||
print(f"Translation error: {e}")
|
||||
return text
|
||||
|
||||
|
||||
class DeepLTranslationProvider(TranslationProvider):
|
||||
"""DeepL Translate implementation"""
|
||||
|
||||
def __init__(self, api_key: str):
|
||||
self.api_key = api_key
|
||||
|
||||
def translate(self, text: str, target_language: str, source_language: str = 'auto') -> str:
|
||||
if not text or not text.strip():
|
||||
return text
|
||||
|
||||
try:
|
||||
translator = DeeplTranslator(api_key=self.api_key, source=source_language, target=target_language)
|
||||
return translator.translate(text)
|
||||
except Exception as e:
|
||||
print(f"Translation error: {e}")
|
||||
return text
|
||||
|
||||
|
||||
class LibreTranslationProvider(TranslationProvider):
|
||||
"""LibreTranslate implementation"""
|
||||
|
||||
def translate(self, text: str, target_language: str, source_language: str = 'auto') -> str:
|
||||
if not text or not text.strip():
|
||||
return text
|
||||
|
||||
try:
|
||||
translator = LibreTranslator(source=source_language, target=target_language)
|
||||
return translator.translate(text)
|
||||
except Exception as e:
|
||||
print(f"Translation error: {e}")
|
||||
return text
|
||||
|
||||
|
||||
class TranslationService:
|
||||
"""Main translation service that delegates to the configured provider"""
|
||||
|
||||
def __init__(self, provider: Optional[TranslationProvider] = None):
|
||||
if provider:
|
||||
self.provider = provider
|
||||
else:
|
||||
# Auto-select provider based on configuration
|
||||
self.provider = self._get_default_provider()
|
||||
|
||||
def _get_default_provider(self) -> TranslationProvider:
|
||||
"""Get the default translation provider from configuration"""
|
||||
service_type = config.TRANSLATION_SERVICE.lower()
|
||||
|
||||
if service_type == "deepl":
|
||||
if not config.DEEPL_API_KEY:
|
||||
raise ValueError("DeepL API key not configured")
|
||||
return DeepLTranslationProvider(config.DEEPL_API_KEY)
|
||||
elif service_type == "libre":
|
||||
return LibreTranslationProvider()
|
||||
else: # Default to Google
|
||||
return GoogleTranslationProvider()
|
||||
|
||||
def translate_text(self, text: str, target_language: str, source_language: str = 'auto') -> str:
|
||||
"""
|
||||
Translate a single text string
|
||||
|
||||
Args:
|
||||
text: Text to translate
|
||||
target_language: Target language code (e.g., 'es', 'fr', 'de')
|
||||
source_language: Source language code (default: 'auto' for auto-detection)
|
||||
|
||||
Returns:
|
||||
Translated text
|
||||
"""
|
||||
if not text or not text.strip():
|
||||
return text
|
||||
|
||||
return self.provider.translate(text, target_language, source_language)
|
||||
|
||||
def translate_batch(self, texts: list[str], target_language: str, source_language: str = 'auto') -> list[str]:
|
||||
"""
|
||||
Translate multiple text strings
|
||||
|
||||
Args:
|
||||
texts: List of texts to translate
|
||||
target_language: Target language code
|
||||
source_language: Source language code (default: 'auto')
|
||||
|
||||
Returns:
|
||||
List of translated texts
|
||||
"""
|
||||
return [self.translate_text(text, target_language, source_language) for text in texts]
|
||||
|
||||
|
||||
# Global translation service instance
|
||||
translation_service = TranslationService()
|
||||
Reference in New Issue
Block a user