refactor(i18n): 코드포인트 기반 문자열 분할을 공통화한다

This commit is contained in:
2026-11-10 10:23:19 +09:00
parent 2bd2328548
commit a8e4cbac28
4 changed files with 208 additions and 11 deletions
@@ -0,0 +1,41 @@
package kr.co.vividnext.sodalive.i18n.translation
internal fun splitTextByCodePoint(text: String, maxSize: Int, codePointSize: (Int) -> Int): List<String> {
val chunks = mutableListOf<String>()
var start = 0
do {
val end = findChunkEnd(text, start, maxSize, codePointSize)
chunks.add(text.substring(start, end))
start = end
} while (start < text.length)
return chunks
}
internal fun takeTextPrefixByCodePoint(text: String, maxSize: Int, codePointSize: (Int) -> Int): String {
return text.substring(0, findChunkEnd(text, 0, maxSize, codePointSize))
}
internal fun utf8CodePointSize(codePoint: Int): Int {
return when {
codePoint <= 0x7F -> 1
codePoint <= 0x7FF -> 2
codePoint in 0xD800..0xDFFF -> 1
codePoint <= 0xFFFF -> 3
else -> 4
}
}
private fun findChunkEnd(text: String, start: Int, maxSize: Int, codePointSize: (Int) -> Int): Int {
var end = start
var size = 0
while (end < text.length) {
val codePoint = text.codePointAt(end)
val nextSize = codePointSize(codePoint)
if (size + nextSize > maxSize) {
break
}
size += nextSize
end += Character.charCount(codePoint)
}
return end
}
@@ -78,17 +78,7 @@ class PapagoTranslationService(
}
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
return splitTextByCodePoint(text, MAX_REQUEST_TEXT_LENGTH, Character::charCount)
}
private fun validateLanguages(sourceLanguage: String, targetLanguage: String): Boolean {