BlogAI Translation

What machine translation into Thai gets wrong, and how to check it

The five ways a Thai translation can be grammatical and still wrong, a review a team without a Thai reader can run, and where machine output is already enough.

· 10 min read

A Thai sentence can be grammatical, accurate, and wrong for the reader at the same time. Thai asks the writer to choose a level of politeness, a pronoun for the speaker and one for the reader, and a spelling for every borrowed word. English asks for none of those, and a translation engine that carries the meaning across still has to make each choice. The choices it makes are the errors a team without a Thai reader ships.

This guide names the five failures that survive a grammar check and gives a review a non-reader can run on every batch. It ends with where machine output is already good enough to ship after that review. The examples use Paxa Translate Lite and its fields, and the checks apply to output from any engine.

Five failures that survive a grammar check#

Register drift#

Every Thai sentence sits at one level of formality, and the level shows in the particle at the end, the pronouns, and the verbs. A product is translated in batches over months, and each batch arrives at the level the engine inferred from that batch's text. The support macros come back polite, the onboarding tour casual, the terms formal. Each batch is correct on its own, and the product speaks in three voices.

one string, two batches
source     Your order has shipped.
batch 1    ส่งของแล้วนะ
batch 2    จัดส่งคำสั่งซื้อของคุณเรียบร้อยแล้วค่ะ

Both lines above are fine Thai. The first belongs in a chat app and the second in a bank, and a product that shows one on the order page and the other in the email has drifted. The politeness post explains the three registers in depth. The fix for drift is one decision written down and sent with every request.

The wrong pronoun#

English has one word for I and one for you. Thai has a dozen of each, and the pair a sentence uses states who is speaking to whom. A support macro written in the first person often comes back with ฉัน, the pronoun a person uses about themselves in casual speech. A company writes เรา, or its own name, and addresses the reader as คุณ. ท่าน sits a rank higher and belongs in a letter to a government office or a formal notice.

a refund macro
source     I've refunded your order. You'll see it in 5 to 7 days.
machine    ฉันคืนเงินคำสั่งซื้อของคุณแล้ว คุณจะเห็นภายใน 5 ถึง 7 วัน
better     เราคืนเงินค่าสินค้าให้คุณเรียบร้อยแล้วค่ะ ยอดเงินจะเข้าภายใน 5 ถึง 7 วัน

The second line also changes the verb of receipt. A refund in Thai arrives, ยอดเงินจะเข้า, and the reader does not see it. That change is the kind a native reader makes in one pass and a checklist never catches, which is why the review below keeps a reader on the strings customers see most.

Three spellings of one borrowed word#

Thai borrows English words constantly and spells many of them more than one way. The Office of the Royal Society publishes one spelling, newspapers and apps use another, and chat uses a third. An engine that has seen all three picks per sentence, and a product ends up with two spellings of email on one screen.

WordRoyal Society spellingCommon variants
emailอีเมลอีเมล์, เมล
applicationแอปพลิเคชันแอพพลิเคชั่น, แอพ
digitalดิจิทัลดิจิตอล
internetอินเทอร์เน็ตอินเตอร์เน็ต
websiteเว็บไซต์เว็ปไซต์

Pick one column per product and hold it. The Royal Society spelling is the safe default for anything formal, and the common variant reads as natural in a consumer app. Whichever it is, put the chosen spellings in the glossary, and the engine will use them. The borrowed words section of the guide covers the borrowed_words field, which decides whether a word with no established Thai form is transliterated or kept in Latin script.

Words that are correct and never said#

A calque translates each word and produces a phrase no Thai service uses. บำรุงรักษา is maintenance, and it is what a mechanic does to an engine. A website that goes down for maintenance ปิดปรับปรุง, closes to improve. Both phrases are in the dictionary, and only one has ever appeared on a Thai status page.

a maintenance notice
source     Heads up: we're doing maintenance tonight.
machine    แจ้งเตือน: เราจะดำเนินการบำรุงรักษาในคืนนี้
better     แจ้งเพื่อทราบ คืนนี้ระบบจะปิดปรับปรุงชั่วคราวค่ะ

Calques cluster in system messages, error text, and status pages, because those strings are short and give the engine no context. Sending the surface in context, a status page or a push notification, is what moves the engine from the dictionary phrase to the one in use. A glossary entry does the same for a phrase that recurs. The instructions section of the guide covers the fields.

Formatting that changes at the border#

Several formatting rules change when the language does. Thai has no plural forms, and the CLDR plural rules give it one category. Written Thai ends a sentence with a space and no full stop. The baht sign is rare in Thai text and the word บาท follows the number. Dates print in the Buddhist Era, which is the Common Era year plus 543, and a receipt that prints 2026 has kept the source calendar.

what changes
ICU     {count, plural, one {# message} other {# messages}}
Thai    {count, plural, other {# ข้อความ}}

source  Saved.
Thai    บันทึกแล้ว

source  ฿100 · 2026-07-15
Thai    100 บาท · 15 ก.ค. 2569

An ICU message with one, few, and other branches collapses to other in Thai, and a file that keeps the English branches carries text no Thai user will see. A placeholder such as {count} has to survive with its braces intact, and a tag has to close where it opened. Send rich strings with format set to "html" or "markdown" and the engine preserves the structure. The markup section of the guide describes what is preserved.

A review a non-reader can run#

The engine runs the first pass itself. Every delivered segment is checked against what the request asked for, and a segment that fails a check carries a review member naming the reason. The review section lists the reasons. A flag never refuses a request, and the translation is delivered either way. Read the flags before anything else.

  • Count the placeholders and tags. Every {name}, %s, and tag in the source appears once in the output, and the markup_changed and preserved_span_missing reasons name the strings where one moved or vanished.
  • Compare lengths. Thai runs at a fairly steady ratio to English across a batch, and a string far outside that ratio dropped a clause or picked up one. Set max_length on strings bound to a button or a title, and read the too_long reason.
  • Search for the glossary. Each term's chosen Thai form appears wherever the source term did, and the glossary_term_missing reason names the segments where it did not.
  • Read the untranslated reason with care. A product name that came back unchanged is right. A sentence that came back unchanged is a failure the engine reported on itself.
  • Check the particles by eye. Every customer-facing statement ends on the same particle, ค่ะ or ครับ, across the batch, and no string ends on นะ in a surface that handles money. The particles are visible to anyone, whatever they read.
  • Check the numerals, the dates, and the currency. Arabic digits throughout, บาท after the amount with a space before it, and the year in the era the surface uses everywhere else.
  • Give a reader the delta. The ten strings customers see most, the top of every surface, and every string about money or terms get a native read on every batch. The rest gets a sampled read on the first batch and the flagged strings after that.

Measure the register without reading it#

Three counts over a batch show its register to someone who reads none of it. Each is a one-line script over the output file, and each catches drift before a reader is asked for an hour.

  • Count the last word of every statement. A batch at one register ends most statements on one particle, ค่ะ or ครับ, and a batch that splits between ค่ะ, นะคะ, นะ, and no particle at all is three batches in one file.
  • Count the pronouns. ฉัน, ผม, ดิฉัน, เรา, คุณ, and ท่าน each have a place, and a customer-facing batch should contain เรา and คุณ and little else. A single ฉัน in a support batch is worth opening.
  • Count each spelling of the borrowed words in the glossary. The chosen spelling should be the only one present, and a variant that appears once is a string the glossary did not reach.
three counts over one batch
particle   ค่ะ 412   นะคะ 9   นะ 3   none 61
pronoun    เรา 388   คุณ 402   ฉัน 2   ท่าน 0
spelling   อีเมล 37   อีเมล์ 1   เมล 0

The second and third lines above each name a string to open. The first says the batch holds together, apart from the 61 statements with no particle, which are most likely labels and belong in a separate count. Run the same counts on the approved strings from the last batch, and a new batch is compared against a number.

Brief before you edit#

A wrong register on one string is an edit. A wrong register on a batch is a brief that was never written. The fields below fix each decision once, and a batch sent with them comes back needing the reader's pass and little else.

DecisionFieldWhat to send
Level of formalityformalityformal for money, legal text, errors, and email; casual only for an audience that speaks that way
Speaker and readerinstructionsThe particle the product speaks with and the pronoun pair, for example a company voice with ค่ะ, เรา for us, and คุณ for the reader
Surface and audiencecontextWhere the string appears and who reads it. A status page and a contract translate differently
Fixed terms and spellingsglossaryEvery term with one Thai form, borrowed-word spellings included
Strings that staydo_not_translateProduct names, feature names, placeholders, and codes
Accepted outputexamplesSource and approved Thai pairs from the last batch, which carry the voice better than a description of it
Space on screenmax_lengthThe width a control allows, per segment, on buttons, titles, and notifications

Some strings are cheaper to write than to brief. A headline, a tagline, and anything that turns on wordplay are a copywriter's job in Thai as in English. A batch of under ten such strings costs less to hand to a writer than to describe to an engine. Send the engine the volume and the writer the voice.

Where machine output is enough, and where it is not#

SurfaceAfter the review aboveNative read
Support macros and system emailShipsFirst batch in full, then the flagged strings
Product descriptions at volumeShipsA sample per batch
Interface stringsShips with max_length and idsThe top of every surface
Help center and documentationShipsThe pages with the most traffic
Terms, policies, invoicesA draftEvery string, every batch
Headlines, taglines, campaign copyA draftA rewrite by a writer

The line between the rows is the cost of a wrong sentence. A support macro with a stiff particle costs a raised eyebrow. A clause in the terms with the wrong verb costs a dispute. The review is the same on every row, and the reader's share of it grows with what a mistake costs.

A workflow that holds across batches#

  • Batch by surface. One request carries up to 200 segments with shared context, and a batch drawn from one surface gets one register. Send each string's key as its id, and the result comes back keyed to your file with no dependence on order. The batching section covers the shape.
  • Keep one glossary per product, in version control, and send the whole of it with every batch. Only the terms that appear in the text are sent to the engine and billed, and the pruning is automatic.
  • Read the review flags first, the reader's delta second, and change the brief when the same flag repeats. A flag that appears on every batch is a missing glossary term or a missing instruction.
  • Feed accepted strings back as examples on the next batch. Ten approved pairs from the last batch hold the voice better than any paragraph of instruction.
  • Translate only what changed. Hash each source string, and send a batch of the strings whose hash moved. The register holds because the brief has not changed, and the reader's delta stays small.

Next steps#

  • Read the translation guide for every field, and the reference for the request and response shapes.
  • Read the politeness post to choose the register before the first batch.
  • Read the cost post for what a batch costs against an agency or a freelancer.
  • Open the translate tool with ten real strings from one surface and read the flags it returns.