Newer
Older
Twilight / src / main / kotlin / net / taehui / twilight / system / Translator.kt
@Taehui Taehui on 13 Mar 3 KB v1.0-SNAPSHOT
package net.taehui.twilight.system

import com.fasterxml.jackson.databind.ObjectMapper
import com.github.pemistahl.lingua.api.Language
import com.github.pemistahl.lingua.api.LanguageDetectorBuilder
import net.taehui.twilight.JSON
import net.taehui.twilight.Logger
import org.apache.hc.client5.http.HttpResponseException
import org.apache.hc.client5.http.classic.methods.HttpPost
import org.apache.hc.client5.http.entity.UrlEncodedFormEntity
import org.apache.hc.client5.http.impl.classic.BasicHttpClientResponseHandler
import org.apache.hc.client5.http.impl.classic.HttpClients
import org.apache.hc.core5.http.message.BasicNameValuePair
import java.nio.charset.StandardCharsets
import java.util.concurrent.CompletableFuture

object Translator {
    private val languageSystem =
        LanguageDetectorBuilder.fromLanguages(Language.KOREAN, Language.ENGLISH, Language.JAPANESE).build()

    fun translate(
        language: String,
        text: String,
        logger: Logger
    ): CompletableFuture<String> {
        return if (text.length > 766) CompletableFuture.completedFuture(
            text
        ) else {
            val textLanguage = when (languageSystem.detectLanguageOf(text)) {
                Language.KOREAN -> "ko"
                Language.ENGLISH -> "en"
                Language.JAPANESE -> "ja"
                else -> ""
            }
            val targetLanguage = language.split('-')[0]
            if (textLanguage.isEmpty() || textLanguage == "en" || textLanguage == targetLanguage) CompletableFuture.completedFuture(
                text
            ) else DB.loadTranslatedText(
                text,
                targetLanguage
            ).thenApply { loadedTranslatedText ->
                try {
                    loadedTranslatedText.ifEmpty {
                        HttpClients.createDefault().use {
                            val dataPost = HttpPost("https://naveropenapi.apigw.ntruss.com/nmt/v1/translation")
                            dataPost.setHeader("X-NCP-APIGW-API-KEY-ID", Configure.nhn.nhnID)
                            dataPost.setHeader("X-NCP-APIGW-API-KEY", Configure.nhn.nhnPw)
                            dataPost.entity = UrlEncodedFormEntity(
                                listOf(
                                    BasicNameValuePair("source", textLanguage),
                                    BasicNameValuePair("target", targetLanguage),
                                    BasicNameValuePair("text", text)
                                ), StandardCharsets.UTF_8
                            )
                            val translatedText = ObjectMapper().readValue(
                                it.execute(dataPost, BasicHttpClientResponseHandler()),
                                JSON.N2MT::class.java
                            ).message.result.translatedText
                            DB.saveTranslatedText(text, targetLanguage, translatedText)
                            translatedText
                        }
                    }
                } catch (e: HttpResponseException) {
                    if (e.statusCode != 429) {
                        logger.logFault(e)
                    }
                    text
                }
            }
        }
    }
}