# General Translation React SDKs (gt-react, gt-next, gt-react-native): Using Cache Components URL: https://generaltranslation.com/en-GB/docs/react/nextjs/cache-components.mdx --- title: Using Cache Components description: How to use Next.js Cache Components with locale-safe request functions and locally stored translations. related: links: - /docs/react/nextjs/app-router-middleware - /docs/react/nextjs/app-router-static-site-generation - /docs/react/nextjs/registering-request-locales - /docs/react/nextjs/locale-alias-seo --- Cache Components can prerender and cache localised server content. The locale, region and translations must all resolve without request headers, cookies or the default remote translation loader. *Note: This guide uses Next.js 16 or later, where Cache Components are configured with `cacheComponents: true`.* ## Enable Cache Components [#enable] Enable Cache Components in `next.config.ts`. Keep [`withGTConfig`](/docs/react/nextjs/config) around the Next.js config: ```ts title="next.config.ts" import type { NextConfig } from 'next'; import { withGTConfig } from 'gt-next/config'; const nextConfig: NextConfig = { cacheComponents: true, }; export default withGTConfig(nextConfig); ``` When Cache Components are enabled, `gt-next`: * Requires a custom [`loadTranslations`](/docs/react/reference/functions/load-translations) function. The default remote loader is not safe during prerendering. * Warns when custom [`getLocale`](/docs/react/nextjs/reference/functions/get-locale) and [`getRegion`](/docs/react/nextjs/reference/functions/get-region) request functions are missing. * Disables development runtime translation hot reload because it makes dynamic requests. * Lets Next.js manage cache invalidation instead of applying the usual General Translation cache expiry. ## Resolve request values [#request-values] Place the `[locale]` segment at the root of the App Router tree. The root layout must be `app/[locale]/layout.tsx`, with no `app/layout.tsx` above it. Create `getLocale.ts` at the project root: ```ts title="getLocale.ts" import { locale } from 'next/root-params'; export default async function getLocale() { return await locale(); } ``` Create `getRegion.ts` alongside it. Return a fixed region when your output depends on one, or `undefined` to disable region detection: ```ts title="getRegion.ts" export default async function getRegion() { return undefined; } ``` `withGTConfig` detects both files automatically. If they are elsewhere, set [`getLocalePath` and `getRegionPath`](/docs/react/nextjs/config#request-function-paths). Do not call `headers()` or `cookies()` from these request functions. Dynamic request APIs cannot run inside a `"use cache"` boundary. Read the locale from `next/root-params` and return a fixed region instead. ## Store translations locally [#local-translations] Generate translation files before the Next.js build, then load them from your bundle: ```ts title="loadTranslations.ts" export default async function loadTranslations(locale: string) { try { const translations = await import(`./public/_gt/${locale}.json`); return translations.default; } catch { return {}; } } ``` `withGTConfig` detects `loadTranslations.ts` at the project root or in `src/`. You can also set [`loadTranslationsPath`](/docs/react/nextjs/config#load-translations-path). Configure the CLI output to match the loader and run [`npx gt translate`](/docs/cli/reference/commands/translate) before `next build`. See [Storing translations locally](/docs/react/guides/storing-translations) for the complete workflow. ## Cache translated content [#cache-content] Resolve the locale outside the cached function and pass it as a serialisable argument. Function arguments form part of the Cache Components cache key, keeping entries for different locales separate. ```tsx title="app/[locale]/page.tsx" import { T } from 'gt-next'; import { getLocale } from 'gt-next/server'; import { cacheLife, cacheTag } from 'next/cache'; async function CachedContent({ locale }: { locale: string }) { 'use cache'; cacheLife('hours'); cacheTag(`home-${locale}`); return Welcome to our site; } export default async function Page() { const locale = await getLocale(); return ; } ``` Apply the same pattern to any region or other request value that changes the rendered translation. Never let two locales share a cache entry. ## Next steps - /docs/react/nextjs/app-router-middleware - /docs/react/nextjs/app-router-static-site-generation - /docs/react/nextjs/registering-request-locales - /docs/react/nextjs/locale-alias-seo