Theme
Listing translations
Staff write a listing in English. As it is created or edited, the API has Claude translate it into the site's ten other languages (French, Swahili, Portuguese, Amharic, Oromo, Tigrinya, Arabic, Simplified Chinese, Vietnamese, Russian), and every reader sees it in theirs, on the web, in the Mini App and through the API.
What is translated
The event's title and description, and each market's question, outcome label, rules, description and resolution source: every text a reader sees. Tags, the category, staff notes and resolution reasons are not. A text that several outcomes share (rules copied into each) is translated once.
How it runs
- Creating or editing a listing queues it, in the same transaction as the change.
- Housekeeping translates in the background, one listing at a time, oldest first, one request per language. A listing usually reads in every language a minute or two after it is saved; long rules in Amharic or Tigrinya can take a few minutes.
- Translations are stored under the English they translate. A text you edit shows in English until its new translation lands, so a reader never sees a translation of words the listing no longer says. Re-translation sends only what changed.
- A language that fails is retried after 1, 5, 30, 120, 360 and 720 minutes, then waits for staff.
The Languages panel
On an event's page in the portal, the Languages panel shows, per language, whether the listing is complete, partly translated or not yet, when, and its translated title; what is waiting, and why the last try failed.
Translate again drops the stored translations and translates the whole listing afresh, for a translation that reads wrong or a listing that stopped retrying. It is audited (event.retranslate). It costs a few hundred model requests for a large listing, so each staff member gets ten an hour, and a listing already waiting its turn is not queued twice.
What you cannot do yet
- Edit a translation by hand: edit the English, which is translated again.
- Translate notifications, portfolio rows, the activity feed or a pause or cancellation reason: those are English.
When nothing translates
Translation runs only where the operator has set the API's ANTHROPIC_API_KEY; LISTING_TRANSLATION=off stops new translations while keeping what is stored. If the panel shows every language not yet for every listing, ask the operations team (Deploying). Listings written before the key was set are translated once with bun run --filter @jua/data translate-listings.
The demo listings (the seeded test markets) come translated into every language and need no key. On a test server seeded before they did, the same command gives them their translations.