Better I18NBetter I18N
Next.js

Configuration

All configuration options for @better-i18n/next

The createI18n function is the entry point for the SDK. It accepts a configuration object that defines your project context and delivery preferences.

Basic Configuration

The absolute minimum required is your project indentifier and default locale.

i18n.config.ts
import { createI18n } from "@better-i18n/next";

export const i18n = createI18n({
  project: "your-org/your-project",
  defaultLocale: "en",
});

The project value uses org/project format. This same value is used by the CLI and MCP to identify your project.

You can also configure CLI-specific options (like linting rules and file exclusions) in this same file. See CLI Configuration for details.

Full Reference

OptionTypeDefaultDescription
projectstringrequiredProject identifier in org/project format
defaultLocalestringrequiredDefault/fallback locale code
cdnBaseUrlstringautoCDN base URL (auto-detected)
localePrefix"as-needed" | "always" | "never""as-needed"URL locale prefix behavior
debugbooleanfalseEnable debug logging
logLevelLogLevel"warn"Logging verbosity
manifestCacheTtlMsnumber300000Manifest cache TTL in ms
manifestRevalidateSecondsnumber3600Next.js revalidate for manifest
messagesRevalidateSecondsnumber30Next.js revalidate for messages
cookieNamestring"locale"Name of the locale persistence cookie
timeZonestringSystem tzIANA timezone. Set explicitly to avoid ENVIRONMENT_FALLBACK warnings and prevent SSR/client hydration mismatches.
storageTranslationStoragePersistent storage adapter (offline fallback)
staticDataRecord<string, Messages> | (() => Promise<...>)Last-resort bundled translations for offline use
fetchTimeoutnumber10000CDN fetch timeout in ms
retryCountnumber1Retry attempts on CDN failure
namespacesstring[]Default namespaces to fetch on every call (namespaced_folders projects only). See Selective Loading.

Behavior Customization

Control how locales appear in your URLs.

"as-needed" (default) — Only non-default locales get a prefix. Clean URLs for your primary language.

// /about (English), /tr/about (Turkish)
createI18n({ project: "org/project", defaultLocale: "en", localePrefix: "as-needed" });

"always" — Every URL includes the locale, including the default. Best for explicit SEO signals.

// /en/about, /tr/about
createI18n({ project: "org/project", defaultLocale: "en", localePrefix: "always" });

"never" — No locale in URLs. Locale is determined by cookie and Accept-Language header.

// /about for all locales
createI18n({ project: "org/project", defaultLocale: "en", localePrefix: "never" });

"never" mode requires specific file structure and middleware behavior. See Middleware — Locale Prefix Modes for the full setup guide.

Configure TTL for edge and runtime caching.

createI18n({
  project: "org/project",
  defaultLocale: "en",
  // Cache manifest in memory for 5 minutes
  manifestCacheTtlMs: 5 * 60 * 1000,

  // Next.js ISR revalidation times
  manifestRevalidateSeconds: 3600,
  messagesRevalidateSeconds: 30,
});

Enable detailed logging for troubleshooting.

createI18n({
  project: "org/project",
  defaultLocale: "en",
  debug: true,
  logLevel: "debug",
});

On this page