Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
/.gradle/
/build/
75 changes: 48 additions & 27 deletions src/main/java/space/dynomake/libretranslate/Translator.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,16 @@
import space.dynomake.libretranslate.exception.BadTranslatorResponseException;
import space.dynomake.libretranslate.type.TranslateResponse;
import space.dynomake.libretranslate.util.JsonUtil;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.*;
import java.util.Scanner;

import static java.nio.charset.StandardCharsets.UTF_8;

@UtilityClass
public class Translator {
Expand All @@ -20,46 +26,61 @@ public class Translator {
@Setter
private String apiKey = "unknown";

@Setter
private static int connectTimeout = 5000; // 5 seconds

@Setter
private static int readTimeout = 5000;

public String translate(@NonNull String from, @NonNull String to, @NonNull String request) {
return translateDetect(from, to, request).getTranslatedText();
}

public TranslateResponse translateDetect(@NonNull String from, @NonNull String to, @NonNull String request) {
HttpURLConnection httpConn = null;
try {

URL url = new URL(urlApi);
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
httpConn = (HttpURLConnection) url.openConnection();
httpConn.setConnectTimeout(connectTimeout);
httpConn.setReadTimeout(readTimeout);
httpConn.setUseCaches(false);
httpConn.setRequestMethod("POST");

httpConn.setRequestProperty("accept", "application/json");
httpConn.setRequestProperty("Accept", "application/json");
httpConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
httpConn.setRequestProperty("User-Agent", "Mozilla/5.0");

httpConn.setDoOutput(true);

OutputStreamWriter writer = new OutputStreamWriter(httpConn.getOutputStream());

writer.write("q=" + URLEncoder.encode(request, "UTF-8") + "&source=" + from + "&api_key=" + apiKey + "&target=" + to + "&format=text");
writer.flush();
writer.close();
httpConn.getOutputStream().close();

if (!(httpConn.getResponseCode() / 100 == 2))
throw new BadTranslatorResponseException(httpConn.getResponseCode(), urlApi);

InputStream responseStream = httpConn.getInputStream();

InputStreamReader reader = new InputStreamReader(responseStream, StandardCharsets.UTF_8);

Scanner s = new Scanner(reader).useDelimiter("\\A");
String response = s.hasNext() ? s.next() : "";

return JsonUtil.from(response, TranslateResponse.class);
// Build request body
String requestBody = "q=" + URLEncoder.encode(request, "UTF-8") + "&source=" + from + "&target=" + to + "&format=text";
// Write request
try (OutputStream outputStream = httpConn.getOutputStream();
OutputStreamWriter writer = new OutputStreamWriter(outputStream, UTF_8)) {
writer.write(requestBody);
writer.flush();
}

// Check response code before reading
int responseCode = httpConn.getResponseCode();
if (responseCode != HttpURLConnection.HTTP_OK) {
throw new BadTranslatorResponseException(responseCode, urlApi);
}

try (InputStream responseStream = httpConn.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(responseStream, UTF_8))) {
return JsonUtil.from(reader, TranslateResponse.class);
}
} catch (IOException e) {
throw new RuntimeException("Network error during translation", e);
} catch (RuntimeException e) {
throw e;
} catch (Exception e) {
if (e instanceof RuntimeException)
throw (RuntimeException) e;

e.printStackTrace();
throw new RuntimeException(e);
throw new RuntimeException("Translation failed", e);
} finally {
if (httpConn != null) {
httpConn.disconnect();
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import lombok.NonNull;
import lombok.experimental.UtilityClass;

import java.io.Reader;


@UtilityClass
public class JsonUtil {
Expand All @@ -17,4 +19,8 @@ public String to(@NonNull Object object) {
public <T> T from(@NonNull String s, Class<T> tClass) {
return gson.fromJson(s, tClass);
}

public <T> T from(@NonNull Reader reader, Class<T> tClass) {
return gson.fromJson(reader, tClass);
}
}