Languages and translation

Updated Oct 16, 2026 Open the tool

Languages and translation

Since 2026-09-20 the workspace (/app), the landing page, the knowledge base pages, the policies' surrounding page and the Photoshop plugin panel are available in seven languages: English, French, German, Spanish, Portuguese, Polish and Dutch. Knowledge base articles are translated too. The older pages of the site (the legacy tools, the store, the account pages outside /app) are English only.

What the languages were chosen from

PostHog, 90 days to 2026-09-20, distinct visitors by browser language: English 5,302, French 631, German 575, Spanish 519, Polish 338, Portuguese 326 (two thirds Brazil), Dutch 211, Italian 200, Arabic 176. About four visitors in ten browse in a language other than English. Among visitors with a sign-in or payment event the order is German, French, Spanish, Portuguese, Dutch, Italian. Dutch was added the same day as the test of adding a language (three small edits and two script runs, about 3 USD); Italian is next by numbers.

How a visitor gets their language

  • Automatically. A first visit follows the browser's language when it is one of the seven; otherwise English. In the workspace that happens in place. On a public page, someone whose browser asks for French first and who has made no choice yet is sent from the English address to the same page at its French address (/ to /fr, /kb/guides to /fr/kb/guides), and French carries into the workspace afterwards. It goes by the browser's language list, which is the visitor's own setting, and never by country: a country is not a language (Belgium, Switzerland, Canada, anyone travelling, any VPN). Choosing English from the menu stops it for good on that device.
  • The language menu. A small icon (two letters, "Language") sits in the workspace's top bar beside the profile, and in the public pages' navigation. Each language is listed under its own name (Français, Deutsch, Español, Português, Polski, Nederlands). For a signed-in person the choice is also kept on the account, so a new device or a cleared browser starts in it. Choosing one reloads the page in that language and the choice is remembered on that device (a cookie, PARAGLIDE_LOCALE). A choice wins everywhere: with German chosen, zoov.dev/ opens as /de, and a French link someone shared opens at its German address. A tool holding unsaved work asks before the reload, as it does for any reload.
  • Public pages have an address per language: /fr, /de/kb, /es/discover, /pl/policy/.... English has no prefix. A link to a French address opens in French for anyone. The workspace has no prefixed addresses: /app/... is one address in whichever language the visitor has.
  • Syntax (the Code agent) answers in the visitor's language. The code it writes, its comments and file names stay in English unless asked otherwise. Writing to it in any language gets an answer in that language.

How the browser gets a language (2026-09-29)

The browser downloads only the visitor's own language. Paraglide compiles each message into a module with all seven languages, and until 2026-09-29 every page shipped all seven for every message it showed: about a third of the workspace's startup code was message text, mostly in languages nobody on that page was reading. Seventy percent of workspace page views are in English, and the rest spread over the six other languages.

In the production browser build (vite.messages.ts), each message keeps only its English text, which was already the fallback. Every script file that shows messages is named <name>.m.js and gets a small companion per language with exactly those messages' translations (/_app/immutable/messages/chunks/<name>.m.fr.js). The script waits for its companion in the page's language before it runs, so a French page never shows English and then switches: switching tools, opening a dialog or following a link brings its translations with its code. An English page fetches no companion files at all. The server still renders every language, so the first HTML a visitor sees is already in their language.

The companions are requested beside the scripts, not after them. The server lists them in the Link header of a page in another language, next to SvelteKit's own list of scripts, and in the browser a companion is requested the moment a tool or dialog asks for its scripts. The first version fetched each companion only once its script had arrived and started, one round trip per level of imports, and a French visit over a real connection was slower than before the change (Vercel previews: ready 1.6 s to 2.5 s).

Measured on the same machine against the previous build, at four times CPU slowdown: the Props tool is clickable 30% sooner in English; the workspace's startup code is 16% smaller for everyone. A language chosen from the menu reloads the page, as it always did, and the new page fetches the new language.

What is not translated

  • A knowledge base article published or edited since the translations were last made: it shows in English until pnpm i18n:translate-kb is run again (a staff step after publishing). Code blocks, inline code, file names and the menu paths of other programs (Photoshop, Blender) are never translated.
  • The policies (terms, privacy, competition terms): legal copy, English is the binding text.
  • Anything the user typed or uploaded, file names, format names (GLB, YDR, YTD), product and model names, code and console commands.
  • Messages that come back from the server as text can still appear in English. The common fixed ones (sign in to use the workspace, storage full, file too large, daily allowance used, no pins left, deploy needs Pro or Max, Sketchfab busy, and about fifteen more) are translated; one that carries a file name or a number is shown as it arrives.
  • Plan names and the plans' feature lists, the AI model descriptions ("Fast and reliable for most props"), the usage band under Syntax's box ("Light usage"), sign-in error descriptions, competition prize and rules text, and customer reviews. The first four are shared with the legacy site and wait for it; reviews are what people wrote.
  • The words typed into search (Ctrl+K and the converter's recipe search) are matched against English keywords plus the translated tool names, so "Convertisseur" finds the converter and a French synonym for it does not.
  • Default names the tools give things (a new layer, "{name} livery", a tattoo pack) are made in the visitor's language and saved that way. File names inside exported resources stay English and ASCII.
  • Emails and the Discord bot.

Quality

The translations are machine-made (OpenAI, given the product's own writing rules and a glossary per language) and checked by rules, not yet by native speakers. A wrong or awkward translation is worth reporting with the screen it was on; the fix is a one-line correction that the translator then never overwrites.

Common questions

The page is in the wrong language. Use the language menu (the icon beside the profile in /app, or in the top navigation on public pages). It follows the browser's language until a choice is made.

Part of the screen is still English. Expected for article text, policies, file names, formats and some server errors (see above). Anything else in English on a translated page is a missed string; report the screen.

Can I have Italian, Arabic, Turkish...? Not yet. Italian is next by visitor numbers.

Does the language change prices or what a plan includes? No. Only the words.

Topics languagetranslationi18nlocalefrenchgermanspanishportuguesepolishdutchhreflang

Something missing? Ask on Discord