← Changelog

Translated labels: collections, categories, the space name, the intro and the chrome

2026.10.14-api-translated-labels
The Forumulate team
2 min read
apii18n

Added

One translations map for every label around your content. The map has the shape { "<locale>": { … } }. A reader sees an entry when the page's language or their interface language matches it. A missing language or field shows the original. See Translated labels.

  • Collections: translations: { es: { name, description } } on POST / PATCH …/collections. It is returned on every collection and on the reader overview, and the overview resolves it for ?locale=. This covers sidebar headings, landing cards, breadcrumbs and the collection page.

  • Forum categories: translations: { es: { name, description } } on POST / PATCH …/forum/categories. It is returned on every category, including a category page's parent.

  • Category lists in a language: GET …/forum/categories (public and signed-in) takes an optional ?locale=<code> and answers each category's name and description from its translations entry for that code. Without it the answer is unchanged. The reader's browser-loaded category lists (new-topic dropdown, # autocomplete, move picker, subscriptions) now use it, so they match the page's language.

  • The space: PATCH /orgs/{orgId}/spaces/{spaceId} { translations } (stored as settings.translations). It is returned as space.translations on the reader overview, as translations on …/chrome, and on each space of a public site.

  • The intro: PUT …/home-doc { translations: { es: { markdown | doc } } }. GET returns it. The public payloads that carry homeDoc now also carry homeDocTranslations. A PUT with only translations keeps the original intro.

  • A hub's intro (collection, series, category, lane): PUT …/hubs/{kind}/{key}/intro takes translations: { es: { doc } } (replaced whole, omitted keeps, null clears) and GET returns it. GET /public/…/hubs/{kind}/{key}?locale=es answers that language's intro when one is written and locale (served; default is the original).

  • The chrome: theme.chrome.translations and a site's config.translations take { labels, footerDescription, copyright, tagline }. labels maps the original words of any header or footer item, button, search pill or sign-in control to the translation.

Changed

A reader page requested with the forumulate_lang cookie is no longer stored in a shared cache. The page now carries labels in that reader's language. A cached copy would have shown that language to the next reader of the same address.