Communitygithub.com

mwasobaddy/skills

Next.js App Router 앱을 위한 국제화(i18n) 아키텍처 구현 — 폴더 구조, 로케일 접두사 라우팅, 타입화된 메시지 파일, ICU 복수형, hreflang을 포함한 로컬라이즈드 SEO. 다국어 또는 번역을 추가/수정할 때, next-intl, Lingui, next-i18next 중 선택하여 [locale] 세그먼트를 프록시 또는 미들웨어로 연결하거나, 영어 전용 앱을 로컬라이즈드 URL로 마이그레이션할 때 사용하세요.

skills란 무엇인가요?

이 스킬은 Next.js App Router 기반 애플리케이션에 완전한 국제화(i18n)를 도입하기 위한 종합적인 가이드입니다. 개발자가 next-intl, Lingui, next-i18next 등 적절한 라이브러리를 선택하고, `[locale]` 동적 세그먼트를 기반으로 한 폴더 구조를 설계하며, 프록시 또는 미들웨어를 통한 로케일 감지 및 리디렉션을 구현할 수 있도록 돕습니다. ICU 메시지 형식, 타입 안전한 번역 파일, hreflang SEO 태그 등 모범 사례를 제공하며, 기존 앱을 여러 언어로 마이그레이션할 때의 단계별 계획과 주의사항도 포함합니다. 이 트리거는 i18n, 다국어 지원, 로케일 라우팅 등 키워드에 반응하며, 주로 Claude Code, Cursor, Codex와 같은 AI 에이전트에서 사용됩니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/mwasobaddy/skills/tree/HEAD/nextjs-i18n

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

Next.js i18n

Next.js 앱을 여러 언어로 전환하기 위한 구조적 가이드: 폴더 레이아웃이 어떻게 되어야 하는지, 잘못되었을 때 무엇이 깨지는지, 피해야 할 사항은 무엇인지 설명합니다.

먼저 라이브러리를 선택하세요

기본적으로 App Router의 새로운 프로젝트에는 next-intl을 사용하세요. 빌드 플러그인, 매크로 단계, 로케일별 인스턴스 관리가 필요 없으며, 메시지는 소스 로케일을 기준으로 타입이 지정된 일반 JSON입니다.

라이브러리사용 시기비용
next-intl (기본)새로운 App Router 작업, 모든 팀 규모없음 — 일반 JSON, 코드 생성 불필요
@lingui/react컴파일 타임 추출과 작은 런타임, 또는 React/Vue/Astro에서 공통 i18n 레이어가 필요할 때SWC 또는 Babel 매크로 플러그인, 정확히 고정 필요
next-i18next팀이 이미 i18next를 알고 있거나, Pages Router 코드를 마이그레이션할 때요청별 인스턴스, getT/useT 분리
Next.js 내장 i18nPages Router 전용. App Router에서는 사용 불가해당 없음

Next.js의 i18n: { locales, defaultLocale } 설정은 Pages Router 전용입니다. App Router에서는 아무 효과가 없습니다. App Router에서 로케일 라우팅은 [locale] 세그먼트와 프록시를 의미합니다. 에이전트가 App Router 프로젝트에서 내장 i18n을 '활성화'하도록 두지 마세요.

번들 비용과 라이브러리별 트레이드오프를 포함한 전체 비교는 다음을 참조하세요: references/library-comparison.md.

표준 아키텍처

정적 딕셔너리는 src/ 외부에 두어 번들링과 가져오기 경로가 명확하게 유지되고, 모든 로케일 관련 메커니즘을 한 폴더에 모으세요.

messages/                      # 순수 정적 딕셔너리 — /src 외부 유지
├── en.json                     # 소스 of truth; 다른 모든 로케일이 이를 미러링
├── de.json
└── ja.json
src/
├── i18n/
│   ├── routing.ts              # defineRouting: locales + defaultLocale
│   ├── request.ts              # getRequestConfig: 로케일 해석, 메시지 로드
│   └── navigation.ts           # createNavigation: 로케일 인식 Link/redirect
├── proxy.ts                    # 로케일 감지 + 리디렉션 (Next 16; 이전에는 middleware.ts)
└── app/
    ├── [locale]/               # 전체 로컬라이즈드 앱을 감쌈
    │   ├── layout.tsx          # 로케일 검증, <html lang>, generateStaticParams
    │   └── page.tsx
    └── not-found.tsx           # 전역 404는 [locale] 외부에 위치

이 구조가 작동하게 하는 규칙:

  • [locale]는 루트 동적 세그먼트입니다. 모든 로컬라이즈드 콘텐츠는 그 아래에 있습니다. 루트 레벨 라우트(not-found.tsx, error.tsx, api/)는 외부에 있어야 하며 무조건 i18n 훅을 호출해서는 안 됩니다. 그렇지 않으면 런타임에 충돌합니다.
  • 하나의 소스 로케일. messages/en.json이 마스터입니다. 다른 모든 파일은 그 형태를 정확히 미러링해야 합니다.
  • 모든 로케일 지식은 src/i18n/에 있습니다. 컴포넌트는 @/i18n/navigation에서 Link를 가져오고, next/link에서 가져오지 않습니다. 언어를 추가할 때 한 곳만 수정하면 됩니다.

설정 (신규 프로젝트)

다음 순서대로 실행하세요. 순서가 중요합니다. proxy.ts는 routing.ts에 의존하고, 레이아웃은 request.ts에 의존합니다.

  1. next-intl을 설치하고, createNextIntlPlugin()으로 next.config.ts를 감쌉니다.
  2. defineRouting을 사용하여 src/i18n/routing.ts를 생성합니다.
  3. createMiddleware(routing)과 기본 매처를 내보내는 src/proxy.ts를 생성합니다.
  4. 로케일을 해석하는 getRequestConfig를 사용하여 src/i18n/request.ts를 생성합니다.
  5. app/**을 app/[locale]/** 아래로 이동합니다. generateStaticParams를 추가하고 매개변수를 검증합니다.
  6. createNavigation(routing)을 사용하여 src/i18n/navigation.ts를 생성합니다.
  7. messages/en.json을 생성하고 하드코딩된 문자열을 useTranslations로 교체합니다.
  8. <html lang>을 설정하고 로컬라이즈드 메타데이터와 hreflang을 추가합니다.

모든 단계의 정확한 파일 내용은 references/next-intl-setup.md를 참조하세요.

주의사항

i18n 코드를 작성하기 전에 이 섹션을 읽으세요. 시간을 낭비하게 만드는 실패 사례들입니다.

  • setRequestLocale은 레거시입니다. Next.js 16.3+에서는 getRequestConfig 내부에서 next/root-params로 로케일을 읽습니다. 대부분의 가이드, 튜토리얼, LLM 훈련 데이터는 여전히 setRequestLocale(params.locale)을 가르칩니다. 여전히 작동하며 하위 호환으로 문서화되어 있지만, 이전 API입니다. Next < 16.3에서만 사용하세요. generateStaticParams는 어느 경우든 계속 필요합니다.
  • params는 Next 15+에서 Promise입니다. const {locale} = await params. params.locale을 런타임 오류가 아닌 타입 오류로 취급하세요.
  • 로케일을 검증하지 않으면 알 수 없는 값이 렌더링됩니다. hasLocale(routing.locales, locale)과 notFound()를 사용하세요. 그렇지 않으면 /xx/about이 가짜 URL에서 영어 페이지를 렌더링합니다.
  • Next 16에서는 middleware.ts가 아닌 proxy.ts입니다. middleware.ts는 더 이상 사용되지 않습니다. 프록시는 Node.js에서만 실행됩니다. Edge 런타임은 지원되지 않습니다. Lingui와 next-i18next는 Edge 안전 프록시를 광고합니다. Edge가 필요하다면, 공짜가 아닌 실제 트레이드오프가 있습니다.
  • 번역된 문자열을 절대 연결하지 마세요. `

관련 스킬