Languages
The interface languages of the site and app, and how they differ from the language outreach is written in.
SignalDock has two separate language settings:
- the interface language: what you read in the marketing site and the app;
- the outreach language: what agents write in, chosen per contact from the market's locales (see Markets).
Changing one never changes the other. A Dutch team can work in a Dutch interface and still send German messages to a German buyer.
Interface language
The marketing site and the app are available in English and Dutch, using
next-intl. Copy is written in English next to the code with
useExtracted or getExtracted, and pnpm i18n:extract collects it into
one PO catalog per language (apps/marketing/translations,
apps/app/translations). A test fails when a message is missing, untranslated,
or loses a placeholder.
- Marketing uses the URL: English at
/, Dutch at/nl. A first visit with a Dutch browser is redirected to/nl. The language switcher sits in the navigation bar. - App uses the
profile-localecookie, which the marketing site also sets, so a choice made there carries over. Without the cookie, the app follows the browser'sAccept-Language. The language is saved on your profile and restored when you sign in. Change it in Settings → General → Language.
Blog posts, the changelog, and customer stories are published in English only; the navigation and page chrome around them are translated.
Adding a language
- Add the locale to
apps/marketing/lib/i18n/locale.tsandapps/app/lib/i18n/locale.ts, plus a client messages provider in each app'scomponents/client-messages/. Add it to the profile locale enum insupabase/schemasand toPROFILE_LOCALESinpackages/domain. - Create a header-only
translations/<locale>.poin both apps, then runpnpm --filter @signaldock/marketing i18n:extractandpnpm --filter @signaldock/app i18n:extract. - Translate every
msgstr, then runpnpm verify; the i18n tests list anything missing.
Last updated on