Step 3: Configure localisation with Ovok CMS
What we are building
An i18next instance that reads application interface text from the Ovok CMS translations collection. The Questionnaire remains a governed FHIR clinical artifact; it is not copied into CMS strings or casually machine-translated.
What you should already have
- The app and
ovokConfigfrom steps 1–2. - Ovok CMS enabled for the sandbox project.
i18nextandreact-i18nextinstalled.
The implementation
Publish an English translation group in Console
In the sandbox CMS, create and publish a translations document with slug screening. Add app-owned keys for navigation, status, errors, buttons, and screen labels. Use the same groups for all later steps, or add one per screen if that is easier for translators to maintain.
Publish English strings to the sandbox staging environment before opening the app. The translations collection is public by default, so the app uses its tenant code; do not put patient data or secrets in this collection. See Use Ovok CMS with i18n for Console fields, locale fallback, and caching.
Initialize i18next with no bundled UI dictionary
Create src/localization/i18n.ts:
import "@ovok/native/auth";
import i18n from "i18next";
import { initReactI18next } from "react-i18next";
export const localizationReady = i18n.use(initReactI18next).init({
lng: "en",
fallbackLng: "en",
supportedLngs: ["en", "de"],
interpolation: { escapeValue: false },
react: { useSuspense: false },
});
export default i18n;
There is no local app translation JSON. Importing the auth module registers native English auth labels; the CMS supplies app-specific labels and can override SDK groups when published.
Load published CMS translations at the app root
Create src/localization/cms-translations.tsx:
import { useCmsTranslations } from "@ovok/native/cms";
import { ovokConfig } from "../config/ovok";
export function CmsTranslations() {
useCmsTranslations({
tenantCode: ovokConfig.tenantCode,
environment: "staging",
});
return null;
}
Mount <CmsTranslations /> once under OvokProvider and the initialized i18next instance, as part of the root layout in step 6. The hook merges published groups into i18next and reloads when the language changes. Pass the tenant code because this first load happens before patient sign-in.
Use translated UI copy in screens:
import { useTranslation } from "react-i18next";
import { Text } from "react-native";
export function ScreeningTitle() {
const { t } = useTranslation("translation", { keyPrefix: "screening" });
return <Text>{t("title", "Diabetes risk screening")}</Text>;
}
The second argument is a runtime fallback for an unpublished key during development. It is not a translation catalog; publish the final text in the CMS.
Important Ovok decisions
- CMS stores app-owned interface text. The licensed FINDRISC Questionnaire carries its own approved clinical wording and answer options.
- Publish the translation group in the same sandbox environment the app requests. A draft or a different environment is not delivered.
- The UI language may use a regional tag such as
de-DE; the CMS reads a supported base locale such asde. - Native permission prompts are platform configuration strings. They are not automatically replaced by CMS content.
Expected result
The root app can mount the CMS hook, and app screens can resolve screening.* keys from published CMS translations with English fallback.
Common errors and troubleshooting
- Text shows its key: check the
screeninggroup slug, key name, published status, tenant, and environment. - CMS load fails before sign-in: ensure the hook receives
tenantCode. - German labels still show English: add and publish the German group; set i18next to the locale you published.
- FINDRISC text differs from the approved instrument: do not fix it in CMS. Restore the approved Questionnaire version and review it with the content owner.
Previous / Next
Previous: create and configure the Ovok project · Next: choose the glucose device