TanStack Start v1에서 로케일 기반 라우팅을 구현하는 방법

로케일 세그먼트로 라우팅 구성하기

문제

다국어 애플리케이션을 구축할 때, 모든 것을 좌우하는 하나의 근본적인 결정이 있습니다: 애플리케이션이 어떤 언어를 표시할지 어떻게 알 수 있을까요? 명시적인 메커니즘이 없다면, /about이라는 URL은 모호해집니다—어떤 언어의 콘텐츠든 나타낼 수 있기 때문입니다. 사용자는 특정 언어 버전의 링크를 공유할 수 없고, 검색 엔진은 어떤 버전이 어떤 대상에게 속하는지 이해하기 어렵습니다. 이러한 모호성은 사용자 경험과 SEO 모두에 문제를 일으킵니다. 동일한 콘텐츠의 언어 변형을 구분할 수 있는 명확한 방법이 없기 때문입니다.

해결책

URL 경로에 직접 언어 식별자를 넣습니다. 예를 들어 /en/about 또는 /fr/about과 같이 말입니다. 이렇게 하면 모든 경로가 특정 언어에 고유하게 되어 사용자와 검색 엔진 모두에게 모호함이 사라집니다. 라우트 구조에 로케일 매개변수를 사용함으로써 각 URL은 자체 설명적이고 공유 가능해집니다. 사용자는 선호하는 언어로 된 콘텐츠의 링크를 북마크하거나 공유할 수 있으며, 검색 엔진은 각 언어 변형을 적절히 색인화할 수 있습니다.

단계

1. 로케일 레이아웃 라우트 생성하기

로케일 매개변수가 선택적인 유연한 라우팅 패턴을 만들기 위해 {-$locale} 구문을 사용하여 선택적 로케일 매개변수를 정의합니다. TanStack Start는 src/routes 디렉토리에서 라우트가 정의되는 파일 기반 라우팅을 사용합니다.

import { createFileRoute, Outlet } from "@tanstack/react-router";

export const Route = createFileRoute("/{-$locale}")({
  component: LocaleLayout,
});

function LocaleLayout() {
  return <Outlet />;
}

이 라우트는 /about(로케일이 정의되지 않음)과 /en/about(로케일이 "en") 모두에 일치하여 로케일 접두사가 있거나 없는 URL을 지원할 수 있게 합니다.

2. 로케일 레이아웃 아래에 하위 라우트 생성하기

TanStack Router는 중첩 라우팅을 사용하여 URL을 올바른 컴포넌트 트리와 매칭하여 렌더링합니다. 로케일 파라미터의 하위 항목으로 라우트 파일을 생성하여 URL에서 로케일을 상속받을 수 있습니다.

import { createFileRoute } from "@tanstack/react-router";

export const Route = createFileRoute("/{-$locale}/about")({
  component: AboutPage,
});

function AboutPage() {
  const { locale } = Route.useParams();
  const currentLocale = locale || "en";

  return (
    <div>
      <h1>About Us</h1>
      <p>Current locale: {currentLocale}</p>
    </div>
  );
}

라우트 파일 구조 {-$locale}/about.tsx/about/en/about과 같은 경로를 생성하며, 두 경로 모두 로케일 파라미터에 접근할 수 있는 동일한 컴포넌트를 렌더링합니다.

3. 컴포넌트에서 로케일 파라미터 접근하기

URL에서 로케일을 읽고 표시할 언어를 결정하기 위해 useParams 훅을 사용하세요.

import { createFileRoute } from "@tanstack/react-router";

export const Route = createFileRoute("/{-$locale}/products")({
  component: ProductsPage,
});

function ProductsPage() {
  const { locale } = Route.useParams();
  const displayLocale = locale || "en";

  return (
    <div>
      <h1>{displayLocale === "fr" ? "Produits" : "Products"}</h1>
    </div>
  );
}

로케일 파라미터가 정의되지 않은 경우, 컴포넌트는 기본 언어로 설정되어 애플리케이션이 로컬라이즈된 URL과 로컬라이즈되지 않은 URL을 모두 처리할 수 있습니다.

4. 로케일을 유지하는 링크 생성하기

현재 언어를 유지하면서 페이지 간 이동을 위해 로케일 파라미터와 함께 Link 컴포넌트를 사용하세요.

import { Link, createFileRoute } from "@tanstack/react-router";

export const Route = createFileRoute("/{-$locale}/")({
  component: HomePage,
});

function HomePage() {
  const { locale } = Route.useParams();

  return (
    <nav>
      <Link to="/{-$locale}/about" params={{ locale }}>
        About
      </Link>
      <Link to="/{-$locale}/products" params={{ locale }}>
        Products
      </Link>
    </nav>
  );
}

params 속성에 현재 로케일을 전달함으로써, 링크는 자동으로 사용자의 현재 언어 컨텍스트와 일치하는 URL을 생성합니다. 예를 들어, 프랑스어 버전을 보고 있을 때 /fr/about과 같은 URL이 생성됩니다.