diff --git a/src/CrowdinApiClient/Api/TranslationApi.php b/src/CrowdinApiClient/Api/TranslationApi.php
index 170e8b45..04183a5a 100644
--- a/src/CrowdinApiClient/Api/TranslationApi.php
+++ b/src/CrowdinApiClient/Api/TranslationApi.php
@@ -3,6 +3,7 @@
namespace CrowdinApiClient\Api;
use CrowdinApiClient\Http\ResponseDecorator\ResponseArrayDecorator;
+use CrowdinApiClient\Http\ResponseDecorator\ResponseModelListDecorator;
use CrowdinApiClient\Model\DownloadFile;
use CrowdinApiClient\Model\DownloadFileTranslation;
use CrowdinApiClient\Model\PreTranslation;
@@ -90,6 +91,31 @@ public function getPreTranslationReport(int $projectId, string $preTranslationId
return $this->_get($path, PreTranslationReport::class);
}
+ /**
+ * Batch Update Pre-Translations
+ * @link https://developer.crowdin.com/api/v2/#operation/api.projects.pre-translations.patchBatch API Documentation
+ *
+ * @param int $projectId
+ * @param array $data JSON Patch array with operations (replace)
+ * @return ModelCollection
+ */
+ public function updatePreTranslations(int $projectId, array $data): ModelCollection
+ {
+ $path = sprintf('projects/%d/pre-translations', $projectId);
+
+ $options = [
+ 'body' => json_encode($data),
+ 'headers' => $this->getHeaders(),
+ ];
+
+ return $this->client->apiRequest(
+ 'patch',
+ $path,
+ new ResponseModelListDecorator(PreTranslation::class),
+ $options
+ );
+ }
+
/**
* Build Project Directory Translation
* @link https://developer.crowdin.com/api/v2/#operation/api.projects.translations.builds.directories.post API Documentation
@@ -226,8 +252,10 @@ public function getTranslationImportStatus(int $projectId, string $importTransla
* @link https://developer.crowdin.com/api/v2/#operation/api.projects.translations.imports.report.get API Documentation
* @link https://developer.crowdin.com/enterprise/api/v2/#operation/api.projects.translations.imports.report.get API Documentation Enterprise
*/
- public function downloadTranslationImportReport(int $projectId, string $importTranslationId): ?TranslationImportReport
- {
+ public function downloadTranslationImportReport(
+ int $projectId,
+ string $importTranslationId
+ ): ?TranslationImportReport {
$path = sprintf('projects/%d/translations/imports/%s/report', $projectId, $importTranslationId);
return $this->_get($path, TranslationImportReport::class);
}
@@ -325,7 +353,7 @@ public function exportProjectTranslation(int $projectId, array $params = []): Do
* @link https://developer.crowdin.com/api/v2/#operation/api.projects.translations.alignment.post API Documentation
* @link https://developer.crowdin.com/enterprise/api/v2/#operation/api.projects.translations.alignment.post API Documentation Enterprise
*
- * @param int $projectId
+ * @param int $projectId
* @param array $params
* string $params[sourceLanguageId] required
* string $params[targetLanguageId] required
diff --git a/tests/CrowdinApiClient/Api/TranslationApiTest.php b/tests/CrowdinApiClient/Api/TranslationApiTest.php
index 9f08e087..173ede05 100644
--- a/tests/CrowdinApiClient/Api/TranslationApiTest.php
+++ b/tests/CrowdinApiClient/Api/TranslationApiTest.php
@@ -657,4 +657,59 @@ public function testDownloadTranslationImportReport(): void
$this->assertInstanceOf(PreTranslationReportLanguage::class, $report->getLanguages()[0]);
$this->assertSame('uk', $report->getLanguages()[0]->getId());
}
+
+ public function testUpdatePreTranslations(): void
+ {
+ $this->mockRequest([
+ 'uri' => 'https://api.crowdin.com/api/v2/projects/1/pre-translations',
+ 'method' => 'patch',
+ 'response' => json_encode([
+ 'data' => [
+ [
+ 'data' => [
+ 'identifier' => '9e7de270-4f83-41cb-b606-2f90631f26e2',
+ 'status' => 'canceled',
+ 'progress' => 50,
+ 'attributes' => [
+ 'languageIds' => ['uk'],
+ 'fileIds' => [742],
+ 'method' => 'tm',
+ 'autoApproveOption' => 'all',
+ 'duplicateTranslations' => true,
+ 'skipApprovedTranslations' => true,
+ 'translateUntranslatedOnly' => true,
+ 'translateWithPerfectMatchOnly' => true,
+ 'priority' => 'high',
+ ],
+ 'createdAt' => '2019-09-20T14:05:50+00:00',
+ 'updatedAt' => '2019-09-20T14:05:50+00:00',
+ 'startedAt' => '2019-09-20T14:05:50+00:00',
+ 'finishedAt' => '2019-09-20T14:06:50+00:00',
+ ],
+ ],
+ ],
+ ]),
+ ]);
+
+ $data = [
+ [
+ 'op' => 'replace',
+ 'path' => '/9e7de270-4f83-41cb-b606-2f90631f26e2/status',
+ 'value' => 'canceled',
+ ],
+ [
+ 'op' => 'replace',
+ 'path' => '/9e7de270-4f83-41cb-b606-2f90631f26e2/priority',
+ 'value' => 'high',
+ ],
+ ];
+
+ $preTranslations = $this->crowdin->translation->updatePreTranslations(1, $data);
+
+ $this->assertInstanceOf(ModelCollection::class, $preTranslations);
+ $this->assertCount(1, $preTranslations);
+ $this->assertInstanceOf(PreTranslation::class, $preTranslations[0]);
+ $this->assertEquals('9e7de270-4f83-41cb-b606-2f90631f26e2', $preTranslations[0]->getIdentifier());
+ $this->assertEquals('canceled', $preTranslations[0]->getStatus());
+ }
}