File size: 3,791 Bytes
5009cb8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
"""TranslationRequest value object for translation service requests."""

from dataclasses import dataclass
from typing import Optional
import re
from .text_content import TextContent


@dataclass(frozen=True)
class TranslationRequest:
    """Value object representing a translation request with source and target languages."""
    
    source_text: TextContent
    target_language: str
    source_language: Optional[str] = None
    
    def __post_init__(self):
        """Validate translation request after initialization."""
        self._validate()
    
    def _validate(self):
        """Validate translation request properties."""
        if not isinstance(self.source_text, TextContent):
            raise TypeError("Source text must be a TextContent instance")
        
        if not isinstance(self.target_language, str):
            raise TypeError("Target language must be a string")
        
        if not self.target_language.strip():
            raise ValueError("Target language cannot be empty")
        
        # Validate target language code format (ISO 639-1 or ISO 639-3)
        if not re.match(r'^[a-z]{2,3}(-[A-Z]{2})?$', self.target_language):
            raise ValueError(f"Invalid target language code format: {self.target_language}. Expected format: 'en', 'en-US', etc.")
        
        if self.source_language is not None:
            if not isinstance(self.source_language, str):
                raise TypeError("Source language must be a string")
            
            if not self.source_language.strip():
                raise ValueError("Source language cannot be empty string")
            
            # Validate source language code format
            if not re.match(r'^[a-z]{2,3}(-[A-Z]{2})?$', self.source_language):
                raise ValueError(f"Invalid source language code format: {self.source_language}. Expected format: 'en', 'en-US', etc.")
            
            # Check if source and target languages are the same
            if self.source_language == self.target_language:
                raise ValueError("Source and target languages cannot be the same")
        
        # If source language is not specified, use the language from TextContent
        if self.source_language is None and self.source_text.language == self.target_language:
            raise ValueError("Source and target languages cannot be the same")
    
    @property
    def effective_source_language(self) -> str:
        """Get the effective source language (from parameter or TextContent)."""
        return self.source_language if self.source_language is not None else self.source_text.language
    
    @property
    def is_auto_detect_source(self) -> bool:
        """Check if source language should be auto-detected."""
        return self.source_language is None
    
    @property
    def text_length(self) -> int:
        """Get the length of source text."""
        return len(self.source_text.text)
    
    @property
    def word_count(self) -> int:
        """Get the word count of source text."""
        return self.source_text.word_count
    
    def with_target_language(self, target_language: str) -> 'TranslationRequest':
        """Create a new TranslationRequest with different target language."""
        return TranslationRequest(
            source_text=self.source_text,
            target_language=target_language,
            source_language=self.source_language
        )
    
    def with_source_language(self, source_language: Optional[str]) -> 'TranslationRequest':
        """Create a new TranslationRequest with different source language."""
        return TranslationRequest(
            source_text=self.source_text,
            target_language=self.target_language,
            source_language=source_language
        )