The cursed inputs of chat translation
14 July 2026 · ThaiPo
Translating chat sounds like a text-in, text-out problem. Then you put a translator inside real LINE groups, in real Thai nightlife-adjacent group chats, and you discover that a surprising fraction of "messages" are not really text at all. This is our field guide to the inputs that broke us in production, in roughly ascending order of cursedness, each with the fix that shipped.
Messages that are only emoji
🍺🍺🍺 does not need translation, but a model asked to translate it will valiantly produce "three beers!" and the chat now has a pointless bot bubble after every reaction. The fix is a skip: emoji-only messages are not translation jobs. The subtlety is the escape hatch, because occasionally someone genuinely wants an emoji string explained, so the explicit translate command overrides the skip.
Messages that are only punctuation
Someone in a group typed ?. Just the question mark. Our Meaning feature (which explains what a message really meant) treated a lone "?" as a request to explain the previous message, on a chat whose plan did not include the feature, so the group got marketing copy and a quota notice in response to a single keystroke. Free users were getting upsold by punctuation. Now punctuation-only messages skip everything, and feature triggers check both the toggle and the plan before saying a word.
555
In Thai, 555 is laughter: ห้า (five) three times is ha-ha-ha. A translator that renders it as "five hundred and fifty-five" kills the joke and outs itself as a machine in one move. This one is a straightforward instruction (555 and its longer cousins are laughter, not numbers), but it earns its place here because every Thai-facing system gets it wrong on day one, and because 5555555 with more fives is more laughter, which the instruction also has to say.
Bare @-mentions
Group chats are full of messages that are nothing but @Somchai: a summon, not a sentence. We translated them anyway, which meant burning a frontier-model call to "translate" a name, watching the output guard notice the result echoed the input, retrying context-free (another model call), and finally posting the mention back to the group as a fresh notification for the person mentioned. Expensive, spammy, and useless. The platform actually tells you: mention spans arrive as structured metadata, so a message whose content is entirely mentions is now recognized for what it is and skipped.
Stickers that pretend to be text
LINE has large animated emoji (Sticons) that arrive as a text message plus an array of icon references, where the visible "text" is placeholder characters. They walked straight past our emoji-only skip, and the model, handed placeholders it could not see, did what models do with a vacuum: it confabulated. Confidently. Whole sentiments were invented from a sticker of a bear. The fix strips the icon spans using the structured metadata before any content decision, after which most such messages are, correctly, nothing.
The bot's own name
Our most self-inflicted bug. Language detection on short messages weighs character classes, and people naturally address the bot by name: "thaipo แปลอันนี้หน่อย". Five Latin characters of brand name outweighed the Thai that followed, the detector called the message English, and the translation ran in the wrong direction. We were literally the corruption in our own input. The bot's name is now stripped before detection, which is the kind of fix that takes one line and a full day of staring at logs to find.
Voices from the platform itself
Honorable mentions that shaped the same lesson: greetings that echo back in kind (the model answers "good morning" with a greeting instead of a translation, caught by a direction guard and a context-free retry), and clipped voice notes whose garbled transcripts read like noise and tempt the model into nonsense (caught by a runaway detector on output).
The pattern
Every one of these has the same shape: the payload lied about its own type.Text that is not text, punctuation that is not language, names that are not words, laughter that looks numeric. The classifier that decides "is this a translation job at all?" turned out to be as important as the translator, and almost none of it is model work: it is metadata, Unicode ranges, and respect for the platform's structured fields. The model is the easy 90%. The cursed 10% is why the logs exist.
Try it in your own chats
ThaiPo lives inside LINE and translates every message in both directions, free forever. Get started free or add @thaipo.ai as a friend on LINE and it sends your signup link right in the chat.