Multi-language support
Translate your help center articles, collections, and groups into multiple languages.
Multi-language support
Ticket0's Help Center supports per-locale translations for articles, collections, and groups. Visitors see content in their chosen language, while operators manage translations from a single admin interface.
How it works
- Every workspace has a default language (usually
en). - You can enable additional supported languages in Settings → Help Center → Branding → Languages.
- The default language is served at the existing root URLs (e.g.
/,/a/getting-started,/c/billing). - Each supported non-default language is served under its own path prefix (e.g.
/da/,/da/a/getting-started,/da/c/billing). - Selecting the default language from a
/[locale]/page redirects to the canonical root URL.
Configuring languages
- Go to Settings → Help Center → Branding → Languages.
- Pick a default language. This is the language visitors see if no translation exists for their selected locale.
- Enable the languages you want to support.
- Save branding settings.
Managing translations
- Open Settings → Help Center → Translations.
- Select a non-default language from the dropdown.
- The content tree shows the status of every collection, group, and article:
- Untranslated — no translation exists.
- Draft — a translation exists but is not public.
- Published — visitors can see the translation.
- Click any status badge to open the editor, translate the fields, set the status, and save.
Article translations
Articles require a title, content, and optionally a slug. If you leave the slug blank, it is derived from the translated title.
Collection and group translations
Collections and groups require a title and optionally a description. Collections also support a custom slug.
Public behavior
- Missing translations fall back to default-language content with a small visitor-language notice (for example,
/da/a/getting-startedshows “This page isn't available in Danish yet — showing English”) instead of a 404. - The fallback page's canonical points to the default-language URL (
/a/getting-started); fallback URLs are not added to the sitemap and not listed ashreflangalternates — only URLs with a real published translation are advertised. - Structural labels (group titles, breadcrumb ancestors) fall back to the default language when a translation is missing, so navigation never shows blank labels.
- Search is locale-aware and does not fall back: a locale search only returns content translated into that locale. The default language searches the base article index (
english), while other locales search a language-specific index that applies that language's stemming and stopword removal (Danish, German, Spanish, Finnish, French, Italian, Dutch, Norwegian, Portuguese, Swedish, plus English translations); Polish and any language without a built-in Postgres configuration fall back to exact-token matching (no stemming), so search still works but is less forgiving. hreflangalternate links,inLanguageschema.org markup, and the sitemap all include per-locale URLs automatically.
Disabling a language
If you remove a language from the supported list, its /[locale]/ pages stop being advertised and return 404. This is different from a missing translation for an enabled language, which falls back to default-language content as described above. Existing translations are preserved, so re-enabling the language restores the content immediately.
AI replies in the visitor's language
Ticket0's AI also uses your help-center translations when it replies to customers.
- Chat widget — The widget API reads the visitor's browser language from the
Accept-Languageheader, negotiates it against the workspace's supported languages, and forwards the best matching locale to the AI service. - Email auto-replies and operator drafts — The ticket's detected customer language is already forwarded to the AI service, so these paths become locale-aware automatically.
When the AI retrieves knowledge-base articles, it prefers a published translation in the visitor's locale. If a published translation exists, the AI sees the translated title and content and cites the localized URL (/da/a/...). If no translation exists for that article, the AI falls back to the default-language content and the default URL (/a/...), so coverage never regresses. Draft translations are never served to customers.
AI-assisted translation
Ticket0 can draft translations for you using your workspace's own AI provider keys (BYOK). Every AI translation is saved as a draft — nothing publishes automatically.
Translate a single article, collection, or group
- Open Settings → Help Center → Translations.
- Select the target language and click any Untranslated (or existing) status badge.
- Click Translate with AI at the top of the editor.
- Ticket0 reads the source content, calls the AI service for the target locale, and fills the title and content/description fields.
- Review and edit the draft, then save.
Articles with an empty source body are not auto-translated — the content field is left blank so you can decide what to write.
Translate everything at once
- On the Translations tab, choose a target language.
- Click Translate all with AI.
- Review the estimated item count, model, and rough cost, then confirm.
- A background job (
ai.bulk-translate-help-center) translates every untranslated entity for that locale, saving each as a draft. Progress (12/47) is shown in the tab and survives a page refresh. - You receive an email summary when the run finishes.
The estimate is a rough token count using the Flash-Lite pricing mirrored from the AI service; your actual cost depends on the model and provider you configure.
Cost, keys, and spend limits
- AI translation uses your workspace's own API keys (BYOK). Ticket0 does not pay for the AI calls.
- If your workspace's AI spend limit is reached, translation is blocked (single-article) or pauses mid-run (bulk). Re-running the bulk job later resumes from the remaining untranslated items.
- Transient failures (e.g. a bad API key or provider outage causing every entity to fail) trigger BullMQ retries automatically. If only a few entities fail among many successes, the run does not retry — the failed items are logged and you can re-run manually.
Publishing
AI translations are always saved as drafts. Use the existing editor Save flow and choose Published when you are ready to make a translation public.