Skip to content

Commit d77ffd8

Browse files
committed
feat(translations): add scope and re-translation options to Apply Pre-Translation
1 parent cbd3280 commit d77ffd8

3 files changed

Lines changed: 96 additions & 0 deletions

File tree

‎crowdin_api/api_resources/translations/enums.py‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,18 @@ class PreTranslationAutoApproveOption(Enum):
1414
NONE = "none"
1515

1616

17+
class PreTranslationScope(Enum):
18+
UNTRANSLATED = "untranslated"
19+
TRANSLATED = "translated"
20+
ALL = "all"
21+
22+
23+
class PreTranslationReplaceTranslationsOption(Enum):
24+
NONE = "none"
25+
AUTO_TRANSLATED = "autoTranslated"
26+
ALL = "all"
27+
28+
1729
class CharTransformation(Enum):
1830
ASIAN = "asian"
1931
EUROPEAN = "european"

‎crowdin_api/api_resources/translations/resource.py‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
CharTransformation,
1212
PreTranslationApplyMethod,
1313
PreTranslationAutoApproveOption,
14+
PreTranslationReplaceTranslationsOption,
15+
PreTranslationScope,
1416
)
1517

1618

@@ -87,6 +89,10 @@ def apply_pre_translation(
8789
duplicateTranslations: Optional[bool] = None,
8890
skipApprovedTranslations: Optional[bool] = None,
8991
translateUntranslatedOnly: Optional[bool] = None,
92+
scope: Optional[PreTranslationScope] = None,
93+
translationModifiedBefore: Optional[str] = None,
94+
replaceTranslationsOption: Optional[PreTranslationReplaceTranslationsOption] = None,
95+
resetApprovalStatus: Optional[bool] = None,
9096
translateWithPerfectMatchOnly: Optional[bool] = None,
9197
fallbackLanguages: Optional[Iterable[FallbackLanguages]] = None,
9298
labelIds: Optional[Iterable[int]] = None,
@@ -96,6 +102,9 @@ def apply_pre_translation(
96102
"""
97103
Apply Pre-Translation.
98104
105+
`translateUntranslatedOnly` is deprecated in favor of `scope` and cannot be
106+
combined with it in the same request.
107+
99108
Link to documentation:
100109
https://developer.crowdin.com/api/v2/#operation/api.projects.pre-translations.post
101110
"""
@@ -126,6 +135,10 @@ def apply_pre_translation(
126135
"duplicateTranslations": duplicateTranslations,
127136
"skipApprovedTranslations": skipApprovedTranslations,
128137
"translateUntranslatedOnly": translateUntranslatedOnly,
138+
"scope": scope,
139+
"translationModifiedBefore": translationModifiedBefore,
140+
"replaceTranslationsOption": replaceTranslationsOption,
141+
"resetApprovalStatus": resetApprovalStatus,
129142
"translateWithPerfectMatchOnly": translateWithPerfectMatchOnly,
130143
"fallbackLanguages": fallbackLanguages,
131144
"labelIds": labelIds,

‎crowdin_api/api_resources/translations/tests/test_translations_resources.py‎

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
PreTranslationApplyMethod,
88
PreTranslationAutoApproveOption,
99
PreTranslationEditOperation,
10+
PreTranslationReplaceTranslationsOption,
11+
PreTranslationScope,
1012
)
1113
from crowdin_api.api_resources.translations.resource import TranslationsResource
1214
from crowdin_api.requester import APIRequester
@@ -67,6 +69,10 @@ def test_list_pre_translations(self, m_request, base_absolut_url):
6769
"duplicateTranslations": None,
6870
"skipApprovedTranslations": None,
6971
"translateUntranslatedOnly": None,
72+
"scope": None,
73+
"translationModifiedBefore": None,
74+
"replaceTranslationsOption": None,
75+
"resetApprovalStatus": None,
7076
"translateWithPerfectMatchOnly": None,
7177
"fallbackLanguages": [],
7278
"labelIds": [],
@@ -85,6 +91,10 @@ def test_list_pre_translations(self, m_request, base_absolut_url):
8591
"duplicateTranslations": False,
8692
"skipApprovedTranslations": False,
8793
"translateUntranslatedOnly": False,
94+
"scope": PreTranslationScope.TRANSLATED,
95+
"translationModifiedBefore": "2026-01-01T00:00:00+00:00",
96+
"replaceTranslationsOption": PreTranslationReplaceTranslationsOption.AUTO_TRANSLATED,
97+
"resetApprovalStatus": True,
8898
"translateWithPerfectMatchOnly": False,
8999
"fallbackLanguages": ["lang"],
90100
"labelIds": [1],
@@ -100,6 +110,10 @@ def test_list_pre_translations(self, m_request, base_absolut_url):
100110
"duplicateTranslations": False,
101111
"skipApprovedTranslations": False,
102112
"translateUntranslatedOnly": False,
113+
"scope": PreTranslationScope.TRANSLATED,
114+
"translationModifiedBefore": "2026-01-01T00:00:00+00:00",
115+
"replaceTranslationsOption": PreTranslationReplaceTranslationsOption.AUTO_TRANSLATED,
116+
"resetApprovalStatus": True,
103117
"translateWithPerfectMatchOnly": False,
104118
"fallbackLanguages": ["lang"],
105119
"labelIds": [1],
@@ -147,6 +161,10 @@ def test_apply_pre_translation_with_branchids(self, m_request, base_absolut_url)
147161
"duplicateTranslations": None,
148162
"skipApprovedTranslations": None,
149163
"translateUntranslatedOnly": None,
164+
"scope": None,
165+
"translationModifiedBefore": None,
166+
"replaceTranslationsOption": None,
167+
"resetApprovalStatus": None,
150168
"translateWithPerfectMatchOnly": None,
151169
"fallbackLanguages": [],
152170
"labelIds": [],
@@ -186,6 +204,10 @@ def test_apply_pre_translation_edge_cases(self, m_request, base_absolut_url):
186204
"duplicateTranslations": None,
187205
"skipApprovedTranslations": None,
188206
"translateUntranslatedOnly": None,
207+
"scope": None,
208+
"translationModifiedBefore": None,
209+
"replaceTranslationsOption": None,
210+
"resetApprovalStatus": None,
189211
"translateWithPerfectMatchOnly": None,
190212
"fallbackLanguages": [],
191213
"labelIds": [],
@@ -237,6 +259,10 @@ def test_apply_pre_translation_with_all_optional_params(self, m_request, base_ab
237259
"duplicateTranslations": True,
238260
"skipApprovedTranslations": False,
239261
"translateUntranslatedOnly": True,
262+
"scope": None,
263+
"translationModifiedBefore": None,
264+
"replaceTranslationsOption": None,
265+
"resetApprovalStatus": None,
240266
"translateWithPerfectMatchOnly": False,
241267
"fallbackLanguages": [{"languageId": "fr", "userId": 789}],
242268
"labelIds": [1, 2, 3],
@@ -246,6 +272,51 @@ def test_apply_pre_translation_with_all_optional_params(self, m_request, base_ab
246272
path="projects/1/pre-translations",
247273
)
248274

275+
@mock.patch("crowdin_api.requester.APIRequester.request")
276+
def test_apply_pre_translation_with_scope_and_retranslation_options(
277+
self, m_request, base_absolut_url
278+
):
279+
"""Test that scope, translationModifiedBefore, replaceTranslationsOption
280+
and resetApprovalStatus are properly handled."""
281+
m_request.return_value = "response"
282+
283+
resource = self.get_resource(base_absolut_url)
284+
response = resource.apply_pre_translation(
285+
projectId=1,
286+
languageIds=["en"],
287+
fileIds=[1],
288+
scope=PreTranslationScope.ALL,
289+
translationModifiedBefore="2026-01-01T00:00:00+00:00",
290+
replaceTranslationsOption=PreTranslationReplaceTranslationsOption.ALL,
291+
resetApprovalStatus=True,
292+
)
293+
294+
assert response == "response"
295+
m_request.assert_called_once_with(
296+
method="post",
297+
request_data={
298+
"languageIds": ["en"],
299+
"fileIds": [1],
300+
"method": None,
301+
"engineId": None,
302+
"aiPromptId": None,
303+
"autoApproveOption": None,
304+
"duplicateTranslations": None,
305+
"skipApprovedTranslations": None,
306+
"translateUntranslatedOnly": None,
307+
"scope": PreTranslationScope.ALL,
308+
"translationModifiedBefore": "2026-01-01T00:00:00+00:00",
309+
"replaceTranslationsOption": PreTranslationReplaceTranslationsOption.ALL,
310+
"resetApprovalStatus": True,
311+
"translateWithPerfectMatchOnly": None,
312+
"fallbackLanguages": [],
313+
"labelIds": [],
314+
"excludeLabelIds": [],
315+
"branchIds": [],
316+
},
317+
path="projects/1/pre-translations",
318+
)
319+
249320
@mock.patch("crowdin_api.requester.APIRequester.request")
250321
def test_pre_translation_report(self, m_request, base_absolut_url):
251322
m_request.return_value = "response"

0 commit comments

Comments
 (0)