fix(i18n): 파파고 번역 요청을 길이 제한에 맞춰 분할한다

This commit is contained in:
2026-11-09 12:23:19 +09:00
parent 1578503072
commit b3c9b9bb2e
2 changed files with 246 additions and 15 deletions
@@ -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",