From b1287f38b6f9140d04c2cab05ba4fadc4b71ea4c Mon Sep 17 00:00:00 2001 From: Sanzhar Akparaliev Date: Fri, 21 Jun 2024 18:56:45 +0600 Subject: [PATCH] translation --- .../axelor/script/module/AxelorScript.java | 3 + .../script/service/DictionaryService.java | 5 ++ .../service/impl/DictionaryServiceImpl.java | 69 +++++++++++++++++++ .../script/web/TranslationController.java | 58 ++++++++++++++++ src/main/resources/views/AppScript.xml | 5 ++ 5 files changed, 140 insertions(+) create mode 100644 src/main/java/com/axelor/script/service/DictionaryService.java create mode 100644 src/main/java/com/axelor/script/service/impl/DictionaryServiceImpl.java create mode 100644 src/main/java/com/axelor/script/web/TranslationController.java diff --git a/src/main/java/com/axelor/script/module/AxelorScript.java b/src/main/java/com/axelor/script/module/AxelorScript.java index 82a89c0..f83b2ae 100644 --- a/src/main/java/com/axelor/script/module/AxelorScript.java +++ b/src/main/java/com/axelor/script/module/AxelorScript.java @@ -1,8 +1,10 @@ package com.axelor.script.module; import com.axelor.app.AxelorModule; +import com.axelor.script.service.DictionaryService; import com.axelor.script.service.FieldService; import com.axelor.script.service.PermissionService; +import com.axelor.script.service.impl.DictionaryServiceImpl; import com.axelor.script.service.impl.FieldServiceImpl; import com.axelor.script.service.impl.PermissionServiceImpl; @@ -11,5 +13,6 @@ public class AxelorScript extends AxelorModule { protected void configure() { bind(PermissionService.class).to(PermissionServiceImpl.class); bind(FieldService.class).to(FieldServiceImpl.class); + bind(DictionaryService.class).to(DictionaryServiceImpl.class); } } diff --git a/src/main/java/com/axelor/script/service/DictionaryService.java b/src/main/java/com/axelor/script/service/DictionaryService.java new file mode 100644 index 0000000..8115a4c --- /dev/null +++ b/src/main/java/com/axelor/script/service/DictionaryService.java @@ -0,0 +1,5 @@ +package com.axelor.script.service; + +public interface DictionaryService { + String getTranslation(String from, String to, String request); +} diff --git a/src/main/java/com/axelor/script/service/impl/DictionaryServiceImpl.java b/src/main/java/com/axelor/script/service/impl/DictionaryServiceImpl.java new file mode 100644 index 0000000..17f48e8 --- /dev/null +++ b/src/main/java/com/axelor/script/service/impl/DictionaryServiceImpl.java @@ -0,0 +1,69 @@ +package com.axelor.script.service.impl; + +import com.axelor.script.service.DictionaryService; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; + +public class DictionaryServiceImpl implements DictionaryService { + + private static final String USER_AGENT = "Mozilla/5.0"; + private static final String TRANSLATE_API_URL = "https://translate.googleapis.com/translate_a/single"; + private final ObjectMapper objectMapper = new ObjectMapper(); + + @Override + public String getTranslation(String from, String to, String request) { + try { + String url = buildUrl(from, to, request); + HttpURLConnection connection = setupConnection(url); + + String response = getResponse(connection); + String translatedText = parseResponse(response); + + return translatedText; + } catch (Exception e) { + e.printStackTrace(); + } + return ""; + } + + private String buildUrl(String from, String to, String request) throws Exception { + return TRANSLATE_API_URL + "?" + + "client=gtx&" + + "sl=" + from + "&" + + "tl=" + to + "&" + + "dt=t&q=" + URLEncoder.encode(request, "UTF-8"); + } + + private HttpURLConnection setupConnection(String url) throws Exception { + URL obj = new URL(url); + HttpURLConnection connection = (HttpURLConnection) obj.openConnection(); + connection.setRequestProperty("User-Agent", USER_AGENT); + return connection; + } + + private String getResponse(HttpURLConnection connection) throws Exception { + StringBuilder response = new StringBuilder(); + try (BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()))) { + String inputLine; + while ((inputLine = in.readLine()) != null) { + response.append(inputLine); + } + } + return response.toString(); + } + + private String parseResponse(String response) throws Exception { + JsonNode jsonNode = objectMapper.readTree(response); + if (jsonNode.isArray()) { + return jsonNode.get(0).get(0).get(0).asText(); + } else { + return jsonNode.asText(); + } + } +} diff --git a/src/main/java/com/axelor/script/web/TranslationController.java b/src/main/java/com/axelor/script/web/TranslationController.java new file mode 100644 index 0000000..0c55810 --- /dev/null +++ b/src/main/java/com/axelor/script/web/TranslationController.java @@ -0,0 +1,58 @@ +package com.axelor.script.web; + +import com.axelor.meta.db.MetaTranslation; +import com.axelor.meta.db.repo.MetaTranslationRepository; +import com.axelor.rpc.ActionRequest; +import com.axelor.rpc.ActionResponse; +import com.axelor.script.service.DictionaryService; +import com.google.inject.Inject; +import com.google.inject.Singleton; +import com.google.inject.persist.Transactional; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; + +@Singleton +public class TranslationController { + + private static final Logger logger = LoggerFactory.getLogger(TranslationController.class); + + private final DictionaryService dictionaryService; + private final MetaTranslationRepository metaTranslationRepository; + + @Inject + public TranslationController(DictionaryService dictionaryService, MetaTranslationRepository metaTranslationRepository) { + this.dictionaryService = dictionaryService; + this.metaTranslationRepository = metaTranslationRepository; + } + + @Transactional + public void makeTranslation(ActionRequest request, ActionResponse response) { + List metaTranslations = fetchUntranslatedMetaTranslations(); + if (metaTranslations == null || metaTranslations.isEmpty()) { + logger.info("No untranslated MetaTranslations found."); + return; + } + for (MetaTranslation metaTranslation : metaTranslations) { + translateAndSaveMetaTranslation(metaTranslation); + } + } + + private List fetchUntranslatedMetaTranslations() { + return metaTranslationRepository.all() + .filter("self.message IS NULL OR self.message = ''") + .fetch(); + } + + private void translateAndSaveMetaTranslation(MetaTranslation metaTranslation) { + try { + String translatedText = dictionaryService.getTranslation("en", metaTranslation.getLanguage(), metaTranslation.getKey()); + metaTranslation.setMessage(translatedText); + metaTranslationRepository.save(metaTranslation); + logger.info("Translated and saved MetaTranslation: {}", metaTranslation); + } catch (Exception e) { + logger.error("Error translating MetaTranslation with key: " + metaTranslation.getKey(), e); + } + } +} diff --git a/src/main/resources/views/AppScript.xml b/src/main/resources/views/AppScript.xml index 1009c13..c98250c 100644 --- a/src/main/resources/views/AppScript.xml +++ b/src/main/resources/views/AppScript.xml @@ -12,6 +12,7 @@