Server Components
Using i18nexus in Next.js Server Components
Overview
In Next.js Server Components, you cannot use the useTranslation hook. Instead, you must use server-only functions.
✓Smaller JavaScript Bundle
✓Faster Initial Load
✓Better SEO
⚠Cannot dynamically switch language
Server Translation API
getServerLanguage()
Reads the current language from cookies on the server.
import { headers } from "next/headers";
import { getServerLanguage } from "i18nexus/server";
export default async function Page() {
const headersList = await headers();
const language = getServerLanguage(headersList);
console.log(language); // "ko" or "en"
}createServerTranslation()
Creates a translation function for use on the server.
import { createServerTranslation } from "i18nexus/server";
import { translations } from "@/locales";
export default async function Page() {
const language = getServerLanguage(headersList);
const t = createServerTranslation(language, translations);
return <h1>{t("Welcome")}</h1>;
}Complete Example
import { headers } from "next/headers";
import { getServerLanguage, createServerTranslation } from "i18nexus/server";
import { translations } from "@/locales";
// ✅ 서버 컴포넌트 (기본값)
export default async function ServerPage() {
// 1. 쿠키에서 언어 가져오기
const headersList = await headers();
const language = getServerLanguage(headersList);
// 2. 번역 함수 생성
const t = createServerTranslation(language, translations);
// 3. 번역 사용
return (
<div>
<h1>{t("Welcome")}</h1>
<p>{t("This is a server component")}</p>
<p>Current language: {language}</p>
</div>
);
}Server Components vs Client Components
🖥️Server Components
✓Smaller Bundle Size
✓Faster Initial Load
✓Better SEO
✓No hydration mismatches
✗Cannot switch language
✗No client interaction
createServerTranslation()⚡Client Components
✓Dynamic Language Switching
✓Fully interactive
✓React hooks available
✓Using event handlers
⚠Larger Bundle Size
⚠'use client' required
useTranslation()When should you use it?
✅Using Server Components
- Static content (blog, documentation)
- Pages where SEO is important
- When initial load speed is important
- Pages that don't require user interaction
⚡Using Client Components
- Language selector/switch button
- Forms that require user input
- Dynamically changing content
- When React hooks are needed
Hybrid approach
Using Server Components and Client Components together gives you optimal performance.
// app/page.tsx (서버 컴포넌트)
import { headers } from "next/headers";
import { getServerLanguage, createServerTranslation } from "i18nexus/server";
import { translations } from "@/locales";
import LanguageSwitcher from "./LanguageSwitcher"; // 클라이언트 컴포넌트
export default async function HomePage() {
const headersList = await headers();
const language = getServerLanguage(headersList);
const t = createServerTranslation(language, translations);
return (
<div>
{/* 클라이언트 컴포넌트: 언어 전환 */}
<LanguageSwitcher />
{/* 서버 컴포넌트: 정적 콘텐츠 */}
<h1>{t("Welcome")}</h1>
<p>{t("This content is rendered on the server")}</p>
</div>
);
}
// app/LanguageSwitcher.tsx (클라이언트 컴포넌트)
"use client";
import { useLanguageSwitcher } from "i18nexus";
export default function LanguageSwitcher() {
const { currentLanguage, changeLanguage, availableLanguages } =
useLanguageSwitcher();
return (
<div>
{availableLanguages.map((lang) => (
<button
key={lang.code}
onClick={() => changeLanguage(lang.code)}
>
{lang.name}
</button>
))}
</div>
);
}Important Notes
💡Prevent hydration mismatches
Must read language from cookies so server and client use the same language.
// layout.tsx에서
const headersList = await headers();
const language = getServerLanguage(headersList);
<I18nProvider initialLanguage={language}>🔄Page reload on language change
Server Components do not automatically update when language changes. When you change language in a Client Component, the cookie is updated, and refreshing the page will render the Server Component in the new language.