Skip to content

Commit 1ffb497

Browse files
Add profanity filter support in translation
1 parent 73886bc commit 1ffb497

3 files changed

Lines changed: 39 additions & 6 deletions

File tree

examples/text_translation.py

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ def main():
2424

2525
credentials = AccessKey(access_key_id, access_key_secret)
2626
lara = Translator(credentials)
27-
27+
2828
try:
2929
# Example 1: Basic single string translation
3030
print("=== Basic Single String Translation ===")
@@ -48,7 +48,7 @@ def main():
4848
TextBlock(text='<div class="separator"></div>', translatable=False), # Non-translatable HTML
4949
TextBlock(text="Every page you turn is a new journey, and the best part?", translatable=True)
5050
]
51-
51+
5252
result3 = lara.translate(text_blocks, target="it-IT", source="en-US")
5353
print(f"Original TextBlocks: {len(text_blocks)} blocks")
5454
print(f"Translated blocks: {len(result3.translation)}")
@@ -91,7 +91,21 @@ def main():
9191
print("Original: This is a comprehensive translation example")
9292
print(f"Italian (with all options): {result6.translation}\n")
9393

94-
# Example 7: Get available languages
94+
# Example 7: Profanity filter options
95+
print("=== Translation with Profanity Filter Options ===")
96+
profanity_text = "Don't be such a tool."
97+
detect_result = lara.translate(profanity_text, target="it-IT", source="en-US",
98+
profanity_filter="detect", verbose=True)
99+
hide_result = lara.translate(profanity_text, target="it-IT", source="en-US",
100+
profanity_filter="hide", verbose=True)
101+
avoid_result = lara.translate(profanity_text, target="it-IT", source="en-US",
102+
profanity_filter="avoid", verbose=True)
103+
print(f"Original: {profanity_text}")
104+
print(f"Detect mode translation: {detect_result.translation}")
105+
print(f"Hide mode translation: {hide_result.translation}")
106+
print(f"Avoid mode translation: {avoid_result.translation}\n")
107+
108+
# Example 8: Get available languages
95109
print("=== Available Languages ===")
96110
languages = lara.languages()
97111
print(f"Supported languages: {languages}")
@@ -100,4 +114,4 @@ def main():
100114
print(f"Error: {error}")
101115

102116
if __name__ == "__main__":
103-
main()
117+
main()

src/lara_sdk/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from ._client import LaraObject
22
from ._credentials import Credentials, AccessKey, AuthToken
33
from ._errors import LaraApiError, LaraError
4-
from ._translator import Memory, MemoryImport, TextBlock, TextResult, DetectPrediction, DetectResult, Memories, Translator, TranslatePriority, UseCache, Documents, Document, DocumentStatus, DocxExtractionParams, DocumentExtractionParams, GlossaryTerm, Audio, AudioStatus, AudioTranslator, AudioOptions, VoiceGender, ImageParagraph, ImageTranslator
4+
from ._translator import Memory, MemoryImport, TextBlock, TextResult, DetectPrediction, DetectResult, Memories, Translator, TranslatePriority, UseCache, Documents, Document, DocumentStatus, DocxExtractionParams, DocumentExtractionParams, GlossaryTerm, Audio, AudioStatus, AudioTranslator, AudioOptions, VoiceGender, ImageParagraph, ImageTranslator, ProfanityDetectResult
55

66
# This constant is auto-generated by the build script.
77
# Manual modifications will be overwritten and may cause unexpected behavior.

src/lara_sdk/_translator.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from ._s3client import S3Client, S3UploadFields
1616

1717
TranslationStyle = Literal["faithful", "fluid", "creative"]
18+
ProfanityFilter = Literal["detect", "avoid", "hide"]
1819
GlossaryFileFormat = Literal["csv/table-uni", "csv/table-multi"]
1920

2021
# Objects --------------------------------------------------------------------------------------------------------------
@@ -114,6 +115,11 @@ def __init__(self, **kwargs):
114115
self.text: str = kwargs.get('text')
115116
self.translatable: bool = kwargs.get('translatable', True)
116117

118+
class ProfanityDetectResult(LaraObject):
119+
def __init__(self, **kwargs):
120+
self.masked_text: Optional[str] = kwargs.get('masked_text')
121+
self.profanities: List[dict] = kwargs.get('profanities', [])
122+
117123
class NGMemoryMatch(LaraObject):
118124
def __init__(self, **kwargs):
119125
self.memory: str = kwargs.get('memory')
@@ -138,6 +144,18 @@ def __init__(self, **kwargs):
138144
self.glossaries: Optional[List[str]] = kwargs.get('glossaries', None)
139145
self.adapted_to_matches: Optional[Union[List[NGMemoryMatch], List[Optional[List[NGMemoryMatch]]]]] = None
140146
self.glossaries_matches: Optional[Union[List[NGGlossaryMatch], List[Optional[List[NGGlossaryMatch]]]]] = None
147+
self.profanities: Optional[Union[ProfanityDetectResult, List[Optional[ProfanityDetectResult]]]] = None
148+
149+
# Parse profanities
150+
raw_profanities = kwargs.get('profanities', None)
151+
if raw_profanities is not None:
152+
if isinstance(raw_profanities, dict):
153+
self.profanities = ProfanityDetectResult(**raw_profanities)
154+
elif isinstance(raw_profanities, list):
155+
self.profanities = [
156+
ProfanityDetectResult(**p) if p is not None else None
157+
for p in raw_profanities
158+
]
141159

142160
# Parse adapted_to_matches
143161
adapted_to_matches = kwargs.get('adapted_to_matches', None)
@@ -686,6 +704,7 @@ def translate(self, text: Union[str, Iterable[str], Iterable[TextBlock]], *,
686704
no_trace: bool = False, verbose: bool = False, style: Optional[TranslationStyle] = None,
687705
headers: Optional[Dict[str, str]] = None, reasoning: bool = False,
688706
metadata: Optional[Union[str, Dict]] = None,
707+
profanity_filter: Optional[ProfanityFilter] = None,
689708
callback: Optional[Callable[[TextResult], None]] = None) -> TextResult:
690709
if isinstance(text, str):
691710
q = text
@@ -710,7 +729,7 @@ def translate(self, text: Union[str, Iterable[str], Iterable[TextBlock]], *,
710729
'priority': priority.value if priority is not None else None,
711730
'use_cache': use_cache.value if use_cache is not None else None, 'cache_ttl': cache_ttl_s,
712731
'glossaries': glossaries, 'verbose': verbose, 'style': style, 'reasoning': reasoning,
713-
'metadata': metadata
732+
'metadata': metadata, 'profanity_filter': profanity_filter
714733
}
715734

716735
request_headers = {}

0 commit comments

Comments
 (0)