fix(i18n): 파파고 번역 요청을 길이 제한에 맞춰 분할한다
This commit is contained in:
+39
-15
@@ -43,32 +43,54 @@ class PapagoTranslationService(
|
||||
|
||||
request.texts.forEach { text ->
|
||||
try {
|
||||
val body = mapOf(
|
||||
"source" to request.sourceLanguage,
|
||||
"target" to request.targetLanguage,
|
||||
"text" to text
|
||||
)
|
||||
val translatedText = StringBuilder()
|
||||
for (chunk in splitText(text)) {
|
||||
val body = mapOf(
|
||||
"source" to request.sourceLanguage,
|
||||
"target" to request.targetLanguage,
|
||||
"text" to chunk
|
||||
)
|
||||
|
||||
val requestEntity = HttpEntity(body, headers)
|
||||
val requestEntity = HttpEntity(body, headers)
|
||||
|
||||
val response = restTemplate.postForEntity<PapagoTranslationResponse>(
|
||||
papagoTranslateUrl,
|
||||
requestEntity
|
||||
)
|
||||
val response = restTemplate.postForEntity<PapagoTranslationResponse>(
|
||||
papagoTranslateUrl,
|
||||
requestEntity
|
||||
)
|
||||
|
||||
if (!response.statusCode.is2xxSuccessful) {
|
||||
return@forEach
|
||||
if (!response.statusCode.is2xxSuccessful) {
|
||||
return TranslateResult(emptyList())
|
||||
}
|
||||
|
||||
val translated = response.body?.message?.result?.translatedText
|
||||
if (translated.isNullOrBlank()) {
|
||||
return TranslateResult(emptyList())
|
||||
}
|
||||
translatedText.append(translated)
|
||||
}
|
||||
|
||||
val translated = response.body?.message?.result?.translatedText
|
||||
translatedTexts.add(translated ?: "")
|
||||
translatedTexts.add(translatedText.toString())
|
||||
} catch (_: Exception) {
|
||||
return TranslateResult(emptyList())
|
||||
}
|
||||
}
|
||||
|
||||
return TranslateResult(translatedTexts)
|
||||
}
|
||||
|
||||
private fun splitText(text: String): List<String> {
|
||||
val chunks = mutableListOf<String>()
|
||||
var start = 0
|
||||
do {
|
||||
var end = minOf(start + MAX_REQUEST_TEXT_LENGTH, text.length)
|
||||
if (end < text.length && text[end - 1].isHighSurrogate() && text[end].isLowSurrogate()) {
|
||||
end -= 1
|
||||
}
|
||||
chunks.add(text.substring(start, end))
|
||||
start = end
|
||||
} while (start < text.length)
|
||||
return chunks
|
||||
}
|
||||
|
||||
private fun validateLanguages(sourceLanguage: String, targetLanguage: String): Boolean {
|
||||
return requireSupportedLanguage(sourceLanguage) && requireSupportedLanguage(targetLanguage)
|
||||
}
|
||||
@@ -79,6 +101,8 @@ class PapagoTranslationService(
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val MAX_REQUEST_TEXT_LENGTH = 5000
|
||||
|
||||
private val SUPPORTED_LANGUAGE_CODES = setOf(
|
||||
"ko",
|
||||
"en",
|
||||
|
||||
Reference in New Issue
Block a user