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

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

문제

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

해결 방법

언어 식별자를 /en/about 또는 /fr/about와 같이 URL 경로에 직접 넣습니다. 이렇게 하면 모든 경로가 특정 언어에 고유하게 되어 사용자와 검색 엔진 모두에 대한 모호성이 제거됩니다. 라우트 구조에 로케일 매개변수를 사용하면 각 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. 로케일을 유지하는 링크 만들기

현재 언어를 유지하면서 페이지 간 이동하려면 locale 매개변수와 함께 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 prop에 현재 로케일을 전달하면 링크가 자동으로 사용자의 현재 언어 컨텍스트와 일치하는 URL을 생성합니다. 예를 들어 프랑스어 버전을 볼 때 /fr/about와 같이 생성됩니다.