Skip to content

Commit d871581

Browse files
feat: add support for ai translate strings (#360)
1 parent df1c08e commit d871581

7 files changed

Lines changed: 111 additions & 2 deletions

File tree

src/main/java/com/crowdin/client/ai/AIApi.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -587,9 +587,24 @@ public ResponseList<AiSupportedModel> listSupportedAiProviderModels(Long userId,
587587
return AiSupportedModelResponseList.to(responseList);
588588
}
589589

590+
/**
591+
* @param userId user identifier
592+
* @param request AiTranslateRequest
593+
* @return translated strings
594+
* @see <ul>
595+
* <li><a href="https://developer.crowdin.com/api/v2/#tag/AI/operation/api.users.ai.translate.strings.post" target="_blank"><b>API Documentation</b></a></li>
596+
* <li><a href="https://developer.crowdin.com/enterprise/api/v2/#tag/AI/operation/api.ai.translate.strings.post" target="_blank"><b>Enterprise API Documentation</b></a></li>
597+
* </ul>
598+
*/
599+
public ResponseObject<AiTranslate> aiTranslateStrings(Long userId, AiTranslateRequest request) {
600+
String url = getAIPath(userId, "ai/translate");
601+
AiTranslateResponse response = this.httpClient.post(url, request, new HttpRequestConfig(), AiTranslateResponse.class);
602+
603+
return ResponseObject.of(response.getData());
604+
}
605+
590606
private String getAIPath(Long userId, String path) {
591607
return userId != null ? String.format("%s/users/%d/%s", this.url, userId, path) : String.format("%s/%s", this.url, path);
592608
}
593-
594609
}
595610

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.crowdin.client.ai.model;
2+
3+
import lombok.Data;
4+
5+
import java.util.List;
6+
7+
@Data
8+
public class AiTranslate {
9+
private String sourceLanguageId;
10+
private String targetLanguageId;
11+
private List<String> translations;
12+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.crowdin.client.ai.model;
2+
3+
import lombok.Data;
4+
5+
import java.util.List;
6+
7+
@Data
8+
public class AiTranslateRequest {
9+
private List<String> strings;
10+
private String sourceLanguageId;
11+
private String targetLanguageId;
12+
private List<Long> tmIds;
13+
private List<Long> glossaryIds;
14+
private Long aiPromptId;
15+
private Long aiProviderId;
16+
private String aiModelId;
17+
private List<String> instructions;
18+
private List<Long> attachmentIds;
19+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.crowdin.client.ai.model;
2+
3+
import lombok.Data;
4+
5+
@Data
6+
public class AiTranslateResponse {
7+
private AiTranslate data;
8+
}

src/test/java/com/crowdin/client/ai/AIApiTest.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ public class AIApiTest extends TestClient {
6666
private static final String AI_PROMPT_COMPLETION_DOWNLOAD = "%s/users/%d/ai/prompts/%d/completions/%s/download";
6767
private static final String PROXY_CHAT = "%s/users/%d/ai/providers/%d/chat/completions";
6868
private static final String LIST_SUPPORTED_AI_PROVIDER_MODELS = "%s/users/%d/ai/providers/supported-models";
69+
private static final String AI_TRANSLATE_STRING = "%s/users/%d/ai/translate";
6970

7071
@Override
7172
public List<RequestMock> getMocks() {
@@ -106,7 +107,8 @@ public List<RequestMock> getMocks() {
106107
RequestMock.build(String.format(AI_PROMPT, this.url, userId, aiPromptId), HttpDelete.METHOD_NAME),
107108
RequestMock.build(String.format(AI_PROMPT, this.url, userId, aiPromptId), HttpPatch.METHOD_NAME, "api/ai/editPromptRequest.json", "api/ai/promptResponse.json"),
108109
RequestMock.build(String.format(PROXY_CHAT, this.url, userId, aiPromptId), HttpPost.METHOD_NAME, "api/ai/proxyChatCompletionRequest.json", "api/ai/proxyChatCompletionResponse.json"),
109-
RequestMock.build(String.format(LIST_SUPPORTED_AI_PROVIDER_MODELS, this.url, userId), HttpGet.METHOD_NAME, "api/ai/listSupportedAiProviderModels.json")
110+
RequestMock.build(String.format(LIST_SUPPORTED_AI_PROVIDER_MODELS, this.url, userId), HttpGet.METHOD_NAME, "api/ai/listSupportedAiProviderModels.json"),
111+
RequestMock.build(String.format(AI_TRANSLATE_STRING, this.url, userId), HttpPost.METHOD_NAME, "api/ai/aiTranslateRequest.json", "api/ai/aiTranslateResponse.json")
110112
);
111113
}
112114

@@ -531,4 +533,25 @@ public void listSupportedAiProviderModelsTest() {
531533
assertTrue(response.getData().get(0).getData().getModalities().getOutput().getImage());
532534
assertEquals(0.1, response.getData().get(0).getData().getPrice().getInput());
533535
}
536+
537+
@Test
538+
public void aiTranslateStringsTest() {
539+
AiTranslateRequest request = new AiTranslateRequest();
540+
request.setStrings(Collections.singletonList("Some text to translate!"));
541+
request.setSourceLanguageId("en");
542+
request.setTargetLanguageId("uk");
543+
request.setTmIds(Collections.singletonList(123L));
544+
request.setGlossaryIds(Collections.singletonList(456L));
545+
request.setAiPromptId(789L);
546+
request.setAiProviderId(12L);
547+
request.setAiModelId("gpt-4.1");
548+
request.setInstructions(Collections.singletonList("Keep a formal tone"));
549+
request.setAttachmentIds(Collections.singletonList(123L));
550+
ResponseObject<AiTranslate> response = this.getAiApi().aiTranslateStrings(userId, request);
551+
552+
assertEquals("en", response.getData().getSourceLanguageId());
553+
assertEquals("uk", response.getData().getTargetLanguageId());
554+
assertEquals(2, response.getData().getTranslations().size());
555+
assertEquals("Перекладений текст 1", response.getData().getTranslations().get(0));
556+
}
534557
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
{
2+
"strings": [
3+
"Some text to translate!"
4+
],
5+
"sourceLanguageId": "en",
6+
"targetLanguageId": "uk",
7+
"tmIds": [
8+
123
9+
],
10+
"glossaryIds": [
11+
456
12+
],
13+
"aiPromptId": 789,
14+
"aiProviderId": 12,
15+
"aiModelId": "gpt-4.1",
16+
"instructions": [
17+
"Keep a formal tone"
18+
],
19+
"attachmentIds": [
20+
123
21+
]
22+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"data": {
3+
"sourceLanguageId": "en",
4+
"targetLanguageId": "uk",
5+
"translations": [
6+
"Перекладений текст 1",
7+
"Перекладений текст 2"
8+
]
9+
}
10+
}

0 commit comments

Comments
 (0)