site.loading
site.loading
features.description
features.journey.description
features.journey.step1.description
features.journey.step1.codefeatures.journey.step2.description
export const i18n = createI18n({ ... })features.journey.step3.description
<BetterI18nProvider>features.journey.step4.description
const t = useTranslations("ns")features.compat.description
| features.compat.featureColumn | Next.js | Expo | Remix | Hono | TanStack |
|---|---|---|---|---|---|
| features.compat.cdnFetch | ✓ | ✓ | ✓ | ✓ | ✓ |
| features.compat.isrRevalidation | ✓ | — | ✓ | — | ✓ |
| useSetLocale() | ✓ | ✓ | ✓ | ✓ | ✓ |
| useFormatter() | ✓ | ✓ | ✓ | ✓ | ✓ |
| LocaleDropdown | ✓ | ✓ | ✓ | ✓ | ✓ |
| features.compat.ssrSupport | ✓ | — | ✓ | ✓ | ✓ |
features.quickIntegrationDesc features.followGuide
// i18n.config.ts
import { createI18n } from "@better-i18n/next";
export const i18n = createI18n({
project: "your-org/your-project",
defaultLocale: "en",
});
// middleware.ts
import { i18n } from "./i18n.config";
export default i18n.betterMiddleware();
// app/[locale]/layout.tsx
const messages = await i18n.getMessages(locale);
<BetterI18nProvider config={i18n.config} locale={locale} messages={messages}>
{children}
</BetterI18nProvider>
// Any component
const t = useTranslations("namespace");
return <h1>{t("title")}</h1>;features.ctaDescription