Skip to content
better-i18n.com

Work outwards from the CDN. One curl tells you whether this is a Better i18n problem or an app problem, and that answer saves you checking six things that were never wrong.

Start here #

Bash
curl https://cdn.better-i18n.com/your-org/your-project/en/translations.json

If the string is in there, the platform's part is done — publishing worked, the language is live, the key exists. Skip to "Your app is not seeing it".

If it is not, the problem is on the dashboard side. Read the next section.

Check the manifest too — it is what every SDK uses to decide whether its copy is stale:

Bash
curl https://cdn.better-i18n.com/your-org/your-project/manifest.json

files[lang].lastModified should be newer than your publish. If it is not, the publish did not land.

It is not on the CDN #

Nothing was published. Writing a translation does not ship it. Run better-i18n publish:status — if it lists your key, it was never published. See How do I publish translations so my app uses them?.

The language is a draft. A language in Draft status is visible in the editor and excluded from publishing — deliberately, so you can work on it before it ships. Switch it to Active on the Languages page and publish again. See How do I manage languages and track coverage?.

The key does not exist. You wrote t("checkout.total") but never created it. better-i18n check:missing lists every key your code uses that your project does not have.

The language has no value for that key. Coverage on the Languages page tells you at a glance; the editor's Only missing filter tells you exactly which keys.

Your app is not seeing it #

The string is on the CDN, so something between the CDN and the screen is in the way.

The project identifier. It is org/project, exactly as it appears in your dashboard, and it is case-sensitive. A typo here fails quietly — no translations, no error.

The locale code. The SDK asks for /{locale}/translations.json, so your app's locale string has to be the code in your project. The usual mismatches:

Your app might useBetter i18n has
zhzh-Hans or zh-Hant
ptpt-BR or pt-PT
nonb

Compare against the Languages page, not against what looks right.

A cache in your app. The CDN's own cache is one minute and publishing purges it, so past a minute the delay belongs to your side: SSR output, ISR, a CDN in front of your app, a service worker. I published but my app still shows old translations goes layer by layer.

A blocked request. Open the Network tab and look for the request to cdn.better-i18n.com. Blocked by a corporate proxy or a content blocker looks exactly like "translations are broken". A 200 with the right JSON means your app received the strings and did something else with them.

Still nothing #

Bash
better-i18n check     # what is missing, what is unused
better-i18n doctor    # missing translations, orphan keys, placeholder mismatches

doctor catches the case nobody looks for: a translation whose {count} placeholder does not match the source, which some setups render as nothing at all.