국제화 (i18n)
TanStack Router는 선택적 경로 매개변수, 라우트 재작성, 타입 안전 매개변수와 같은 일반적인 국제화(i18n) 라우팅 패턴을 지원하도록 조합할 수 있는 유연하고 고도로 사용자 지정 가능한 프리미티브를 제공합니다. 이를 통해 깔끔하고 SEO 친화적인 URL, 유연한 로캘 처리, i18n 라이브러리와의 원활한 통합을 구현할 수 있습니다.
이 가이드에서는 다음을 다룹니다.
- 접두사 기반 및 선택적 로캘 라우팅
- i18n을 위한 고급 라우팅 패턴
- 언어 탐색 및 전환
- SEO 고려 사항
- 타입 안전성
- i18n 라이브러리(Paraglide)와의 통합 패턴
선택적 경로 매개변수를 사용하는 i18n
이 패턴은 TanStack Router 기능만 사용합니다. 다음과 같은 경우에 적합합니다.
- 번역을 완전히 제어하려는 경우
- 이미 수동으로 번역을 관리하는 경우
- 로캘 자동 감지가 필요하지 않은 경우
선택적 경로 매개변수는 라우트를 중복하지 않고 로캘 인식 라우팅을 구현하는 데 적합합니다.
/{-$locale}/about
이 단일 라우트는 다음과 일치합니다.
/about(default locale)/en/about/fr/about/es/about
접두사 기반 i18n
// Route: /{-$locale}/about
export const Route = createFileRoute('/{-$locale}/about')({
component: AboutComponent,
})
function AboutComponent() {
const { locale } = Route.useParams()
const currentLocale = locale || 'en'
const content = {
en: { title: 'About Us' },
fr: { title: 'À Propos' },
es: { title: 'Acerca de' },
}
return <h1>{content[currentLocale].title}</h1>
}
복잡한 라우팅 패턴
// Route: /{-$locale}/blog/{-$category}/$slug
export const Route = createFileRoute('/{-$locale}/blog/{-$category}/$slug')({
beforeLoad: ({ params }) => {
const locale = params.locale || 'en'
const validLocales = ['en', 'fr', 'es', 'de']
if (params.locale && !validLocales.includes(params.locale)) {
throw new Error('Invalid locale')
}
return { locale }
},
})
언어 전환
<Link
to="/{-$locale}/blog/{-$category}/$slug"
params={(prev) => ({
...prev,
locale: prev.locale === 'en' ? undefined : 'fr',
})}
>
Français
</Link>
타입 안전 로캘
type Locale = 'en' | 'fr' | 'es' | 'de'
function isLocale(value?: string): value is Locale {
return ['en', 'fr', 'es', 'de'].includes(value as Locale)
}
i18n 라이브러리 통합 패턴
TanStack Router는 라이브러리에 종속되지 않습니다. 로캘 상태를 라우팅 동작에 매핑해 어떤 i18n 솔루션이든 통합할 수 있습니다.
다음은 Paraglide를 사용하는 권장 패턴입니다.
라이브러리를 사용하는 클라이언트 측 i18n (TanStack Router)
이 패턴은 TanStack Router를 클라이언트 측 i18n 라이브러리와 결합합니다. 다음과 같은 경우에 적합합니다.
- 타입 안전 번역이 필요한 경우
- 지역화된 URL이 필요한 경우
- 서버 측 렌더링이 필요하지 않은 경우
TanStack Router + Paraglide (클라이언트 전용)
Paraglide는 TanStack Router와 자연스럽게 결합되는 타입 안전 번역, 로캘 감지, URL 지역화를 제공합니다.
GitHub 예시: https://github.com/TanStack/router/tree/main/examples/react/i18n-paraglide
프로젝트 설정
npx @inlang/paraglide-js@latest init
import { paraglideVitePlugin } from '@inlang/paraglide-js'
paraglideVitePlugin({
project: './project.inlang',
outdir: './app/paraglide',
})
라우터 재작성을 통한 URL 지역화
라우터의 rewrite 옵션은 양방향 URL 변환을 활성화하며, 로캘 접두사에 적합합니다. 고급 패턴을 포함한 URL 재작성에 대한 자세한 문서는 URL 재작성 가이드를 참고하세요.
import { deLocalizeUrl, localizeUrl } from './paraglide/runtime'
const router = createRouter({
routeTree,
rewrite: {
input: ({ url }) => deLocalizeUrl(url),
output: ({ url }) => localizeUrl(url),
},
})
서버 측 i18n (TanStack Start)
이 패턴은 라우팅 계층과 서버 계층에 i18n을 통합합니다. 다음과 같은 경우에 적합합니다.
- TanStack Start를 사용하는 경우
- SSR 또는 스트리밍이 필요한 경우
- 로캘 인식 리디렉션과 메타데이터가 필요한 경우
TanStack Start + Paraglide
GitHub 예시: https://github.com/TanStack/router/tree/main/examples/react/start-i18n-paraglide
서버 미들웨어 (SSR)
import { paraglideMiddleware } from './paraglide/server'
export default {
fetch(req: Request) {
return paraglideMiddleware(req, () => handler.fetch(req))
},
}
HTML 언어 속성
import { getLocale } from '../paraglide/runtime'
;<html lang={getLocale()} />
오프라인 안전 리디렉션
오프라인 또는 클라이언트 전용 환경에서는 다음과 같이 사용합니다.
import { shouldRedirect } from '../paraglide/runtime'
beforeLoad: async () => {
const decision = await shouldRedirect({ url: window.location.href })
if (decision.redirectUrl) {
throw redirect({ href: decision.redirectUrl.href })
}
}
타입 안전 번역 경로명
모든 라우트에 번역이 있는지 확인하려면 TanStack Router 라우트 트리에서 번역된 경로명을 직접 파생할 수 있습니다.
import { FileRoutesByTo } from '../routeTree.gen'
import { Locale } from '@/paraglide/runtime'
이를 통해 다음을 보장합니다.
- 누락된 번역 없음
- 완전한 타입 안전성
- 라우팅 오류에 대한 컴파일러 피드백
지역화된 라우트 프리렌더링
import { localizeHref } from './paraglide/runtime'
export const prerenderRoutes = ['/', '/about'].map((path) => ({
path: localizeHref(path),
prerender: { enabled: true },
}))
추가 i18n 통합 패턴
Intlayer (TanStack Start 통합)
https://intlayer.org/doc/environment/tanstack-start