Intlayer
Use this skill when work touches Intlayer i18n, especially Intlayer v9 with TanStack Start (@tanstack/react-start) via intlayer + react-intlayer + vite-intlayer.
Workflow
- Inspect the local Intlayer + Start shape before changing code:
- Package versions for
intlayer,react-intlayer,vite-intlayer,@tanstack/react-start,@tanstack/react-router. - Config:
intlayer.config.tslocales,routing.mode,routing.enableProxy,content.contentDir,dictionary.importMode,compiler.enabled. - Vite:
intlayer()plugin,proxy.ignore,tanstackStart({ router: { routeFileIgnorePattern } }). - Routes:
src/routes/__root.tsxshell +IntlayerProvider,src/routes/{-$locale}/layout withvalidatePrefix. - Content:
*.content.{ts,tsx,js,json,...}dictionaries and generated.intlayer/output. - Navigation: reject
LocalizedLink,useLocalizedNavigate, and any other Link/navigate wrappers — use native TanStack Router APIs only.
- Package versions for
- Refresh docs when the task depends on latest behavior, v9 defaults, CMS/editor, or package drift. Start from source-map.md.
- For install, config, Vite plugin, provider, and TypeScript includes, use setup-tanstack-start.md.
- For content declarations,
t(),useIntlayer, collections, variants, and attribute string rendering, use content-dictionaries.md. - For locale routing, native links/navigate, SSR
getLocale/getIntlayer, SEO head, sitemap, and 404s, use routing-ssr-seo.md. - Prefer
bun/bunxin command examples. Prefer the official Start guide over Next.js or Solid Start docs — but do not copy Intlayer'sLocalizedLink/useLocalizedNavigateexamples; use native TanStack RouterLink/useNavigateinstead.
Implementation Judgment
- TanStack Start uses
intlayer+react-intlayer+vite-intlayer. Do not install or copy APIs fromnext-intlayer/next-intlayer/serverorsolid-intlayer. - There is no
tanstack-intlayerpackage. Locale detection/redirect is the Viteintlayer()proxy (routing.enableProxy, defaulttrue), not a TanStack Router middleware API. - No Link/navigate wrappers. Do not create, keep, or recommend
LocalizedLink,useLocalizedNavigate, or any component/hook that wraps TanStackLink/useNavigateto inject locale. Use nativeLinkanduseNavigatewith fulltopaths (/{-$locale}/...) andparams.localefromgetPrefix(locale).localePrefix. On review/migrate, delete existing wrappers and rewrite call sites. - Always set
routeFileIgnorePatternfor.content.*so content files are not treated as routes. - Match the locale route slot to
routing.mode:{-$locale}forprefix-no-default; prefer$localeforprefix-all; remove the slot forno-prefix/search-params. - Client UI:
useIntlayer/useLocalefromreact-intlayer. Server functions,head, and non-React code:getIntlayer/getLocalefromintlayer. - In
beforeLoad, validate locale fromparams.localeviavalidatePrefix— not from cookies/headers (the proxy already handled request locale). - Co-locate
.content.*with features. Setcontent.contentDirexplicitly for Start apps undersrc(do not assume a Next-style./appdefault without checking config). - v9:
compiler.enableddefaults tofalse; bundled proxy/compiler live insideintlayer()— do not require separateintlayerProxy()/intlayerCompiler()unless plugin order demands it. - For production SSR that needs the locale proxy, keep
vite-intlayeravailable at runtime (move out ofdevDependencieswhen docs/proxy require it). - For HTML attributes (
alt,title,aria-label), use.value,.toString(), orString(...)on content nodes.
Verification
Prefer the repo's existing checks. For meaningful Intlayer + Start work, include the relevant subset:
- Typecheck with
.intlayer/**/*.tsincluded and route tree regenerated. - Locale smoke: default locale (no prefix or prefixed), alternate locales, invalid prefix → 404 redirect, locale switcher.
- Navigation smoke: in-app links and programmatic navigate keep the current locale; switcher updates
params.localewithout wrapper components. - SSR smoke: first HTML
lang/dir, cookie/Accept-Languageproxy redirects, server functiongetLocale+getIntlayer. - Content smoke: missing keys, attribute string rendering, collections/variants when used.
- CLI:
bunx intlayer buildandbunx intlayer content test(orintlayer test) when dictionaries change. - Sitemap/prerender smoke when changing localized SEO routes.
Report which checks ran, which did not, and any version-sensitive assumptions that remain.