App Router를 사용하는 Next.js 애플리케이션에서 국제화(i18n)를 구현하는 방법
React 애플리케이션의 접근성을 높이고 국제화(i18n)를 통해 새로운 시장에 진출하세요.
세계화가 진행되면서 웹 개발자들은 서로 다른 국가와 문화의 사용자들을 수용할 수 있는 애플리케이션을 구축하는 것이 더욱 중요해지고 있습니다. 이를 달성하는 주요 방법 중 하나는 국제화(i18n)로, 애플리케이션을 다양한 언어, 통화 및 날짜 형식에 맞게 조정할 수 있게 해줍니다.
이 글에서는 서버 사이드 렌더링을 사용하는 React Next.js 애플리케이션에 국제화를 추가하는 방법을 살펴보겠습니다. TL;DR: 전체 예제는 여기에서 확인하세요.
이 가이드는 App Router을 사용하는 Next.js 애플리케이션을 위한 가이드입니다.
만약 Pages Router을 사용하고 있다면, 대신 이 가이드를 참조하세요.
1단계: i18n 라이브러리 설치
Next.js 애플리케이션에 국제화를 구현하려면 먼저 i18n 라이브러리를 선택하겠습니다. 여러 인기 있는 라이브러리가 있으며, 그중에는 next-intl도 있습니다. 그러나 이 예제에서는 TacoTranslate를 사용하겠습니다.
TacoTranslate는 최첨단 AI를 사용하여 문자열을 자동으로 모든 언어로 번역하고, 번거로운 JSON 파일 관리에서 해방시켜줍니다.
터미널에서 npm을 사용하여 설치합니다:
npm install tacotranslate
2단계: 무료 TacoTranslate 계정 만들기
모듈을 설치했으니, 이제 TacoTranslate 계정과 번역 프로젝트 및 관련 API 키를 생성할 시간입니다. 여기에서 계정을 생성하세요. 무료이며, 신용카드 등록이 필요하지 않습니다.
TacoTranslate 애플리케이션 UI에서 프로젝트를 생성한 다음 API 키 탭으로 이동하세요. 하나의 read
키와 하나의 read/write
키를 생성하세요. 이 키들을 환경 변수로 저장합니다. read
키를 public
이라 부르고 read/write
키를 secret
이라 부릅니다. 예를 들어, 프로젝트 루트의 .env
파일에 추가할 수 있습니다.
TACOTRANSLATE_PUBLIC_API_KEY=123456
TACOTRANSLATE_SECRET_API_KEY=789010
비밀 read/write
API 키를 클라이언트 측 프로덕션 환경에 절대 유출하지 마세요.
또한 두 개의 환경 변수를 더 추가하겠습니다: TACOTRANSLATE_DEFAULT_LOCALE
및 TACOTRANSLATE_ORIGIN
.
TACOTRANSLATE_DEFAULT_LOCALE
: 기본 폴백 로케일 코드입니다. 이 예에서는 영어를 위해en
으로 설정합니다.TACOTRANSLATE_ORIGIN
: 문자열이 저장될 "폴더"로, 예를 들어 웹사이트의 URL과 같습니다. origins에 대해 자세히 알아보려면 여기를 읽어보세요.
TACOTRANSLATE_DEFAULT_LOCALE=en
TACOTRANSLATE_ORIGIN=your-website-url.com
3단계: TacoTranslate 설정하기
TacoTranslate를 애플리케이션에 통합하려면 앞에서 만든 API 키를 사용하여 클라이언트를 생성해야 합니다. 예를 들어 /tacotranslate-client.js
라는 파일을 만드세요.
const {default: createTacoTranslateClient} = require('tacotranslate');
const tacoTranslate = createTacoTranslateClient({
apiKey:
process.env.TACOTRANSLATE_SECRET_API_KEY ??
process.env.TACOTRANSLATE_PUBLIC_API_KEY ??
process.env.TACOTRANSLATE_API_KEY,
projectLocale:
process.env.TACOTRANSLATE_IS_PRODUCTION === 'true'
? process.env.TACOTRANSLATE_PROJECT_LOCALE
: undefined,
});
module.exports = tacoTranslate;
곧 자동으로 TACOTRANSLATE_API_KEY
와 TACOTRANSLATE_PROJECT_LOCALE
을 정의할 예정입니다.
클라이언트를 별도의 파일로 분리하면 나중에 다시 사용하기가 쉽습니다. getLocales
는 몇 가지 기본적인 오류 처리가 포함된 유틸리티 함수일 뿐입니다. 이제 /app/[locale]/tacotranslate.tsx
라는 파일을 생성하세요. 여기서 TacoTranslate
프로바이더를 구현합니다.
'use client';
import React, {type ReactNode} from 'react';
import {
type TranslationContextProperties,
TacoTranslate as ImportedTacoTranslate,
} from 'tacotranslate/react';
import tacoTranslateClient from '@/tacotranslate-client';
export default function TacoTranslate({
locale,
origin,
localizations,
children,
}: TranslationContextProperties & {
readonly children: ReactNode;
}) {
return (
<ImportedTacoTranslate
client={tacoTranslateClient}
locale={locale}
origin={origin}
localizations={localizations}
>
{children}
</ImportedTacoTranslate>
);
}
이것이 클라이언트 컴포넌트임을 나타내는 'use client';
에 주목하세요.
이제 컨텍스트 프로바이더가 준비되었으므로, /app/[locale]/layout.tsx
라는 파일을 생성하세요. 이 파일은 애플리케이션의 루트 레이아웃입니다. 이 경로는 Dynamic Routes을(를) 사용하는 폴더를 포함하고 있으며, 여기서 [locale]
는 동적 매개변수입니다.
import React, {type ReactNode} from 'react';
import {type Locale, isRightToLeftLocaleCode} from 'tacotranslate';
import './global.css';
import tacoTranslateClient from '@/tacotranslate-client';
import TacoTranslate from './tacotranslate';
export async function generateStaticParams() {
const locales = await tacoTranslateClient.getLocales();
return locales.map((locale) => ({locale}));
}
type RootLayoutParameters = {
readonly params: Promise<{locale: Locale}>;
readonly children: ReactNode;
};
export default async function RootLayout({params, children}: RootLayoutParameters) {
const {locale} = await params;
const origin = process.env.TACOTRANSLATE_ORIGIN;
const localizations = await tacoTranslateClient.getLocalizations({
locale,
origins: [origin /* , other origins to fetch */],
});
return (
<html lang={locale} dir={isRightToLeftLocaleCode(locale) ? 'rtl' : 'ltr'}>
<body>
<TacoTranslate
locale={locale}
origin={origin}
localizations={localizations}
>
{children}
</TacoTranslate>
</body>
</html>
);
}
여기서 먼저 알아둘 점은 해당 언어의 번역을 가져오기 위해 Dynamic Route
매개변수 [locale]
을 사용하고 있다는 것입니다. 또한, generateStaticParams
는 프로젝트에서 활성화한 모든 로케일 코드가 사전 렌더링되도록 보장합니다.
이제 첫 페이지를 만들어 봅시다! /app/[locale]/page.tsx
라는 이름의 파일을 만드세요.
import React from 'react';
import {Translate} from 'tacotranslate/react';
export const revalidate = 60;
export default async function Page() {
return (
<Translate string="Hello, world!" />
);
}
Next.js가 60초 후에 페이지를 다시 빌드하고 번역을 최신 상태로 유지하도록 알려주는 revalidate
변수를 참고하세요.
4단계: 서버 사이드 렌더링 구현
TacoTranslate는 서버 사이드 렌더링을 지원합니다. 이를 통해 번역되지 않은 콘텐츠가 잠깐 깜박이는 대신 번역된 콘텐츠를 즉시 보여주어 사용자 경험을 크게 개선합니다. 또한 사용자가 보고 있는 페이지에 필요한 번역을 이미 보유하고 있으므로 클라이언트에서 네트워크 요청을 생략할 수 있습니다.
서버 사이드 렌더링을 설정하려면 /next.config.js
파일을 생성하거나 수정하세요:
const withTacoTranslate = require('tacotranslate/next/config').default;
const tacoTranslateClient = require('./tacotranslate-client');
module.exports = async () => {
const config = await withTacoTranslate(
{},
{
client: tacoTranslateClient,
isProduction:
process.env.TACOTRANSLATE_ENV === 'production' ||
process.env.VERCEL_ENV === 'production' ||
(!(process.env.TACOTRANSLATE_ENV || process.env.VERCEL_ENV) &&
process.env.NODE_ENV === 'production'),
}
);
// NOTE: Remove i18n from config when using the app router
return {...config, i18n: undefined};
};
환경에 맞게 isProduction
검사를 수정하세요. true
인 경우 TacoTranslate는 공개 API 키를 노출합니다. 로컬, 테스트 또는 스테이징 환경 (isProduction
is false
), 우리는 새 문자열이 번역으로 전송되도록 비밀 read/write
API 키를 사용합니다.
라우팅과 리디렉션이 예상대로 작동하도록 하려면 /middleware.ts
라는 파일을 생성해야 합니다. Middleware를 사용하면 사용자를 선호하는 언어로 제공되는 페이지로 리디렉션할 수 있습니다.
import {type NextRequest} from 'next/server';
import {middleware as tacoTranslateMiddleware} from 'tacotranslate/next';
import tacoTranslate from '@/tacotranslate-client';
export const config = {
matcher: ['/((?!api|_next|favicon.ico).*)'],
};
export async function middleware(request: NextRequest) {
return tacoTranslateMiddleware(tacoTranslate, request);
}
Next.js 미들웨어 문서에 따라 matcher
가 설정되어 있는지 확인하세요.
클라이언트에서는 locale
쿠키를 변경하여 사용자의 선호 언어를 바꿀 수 있습니다. 이 작업을 수행하는 방법에 대한 아이디어는 전체 예제 코드를 참고하세요!
5단계: 배포 및 테스트!
완료되었습니다! 이제 React 애플리케이션은 Translate
컴포넌트에 문자열을 추가하면 자동으로 번역됩니다. API 키에 대해 read/write
권한이 있는 환경에서만 번역할 새 문자열을 생성할 수 있다는 점을 유의하세요. 프로덕션 애플리케이션을 해당 유형의 API 키로 테스트하고 라이브로 전환하기 전에 새 문자열을 추가할 수 있도록, 폐쇄적이고 보안된 스테이징 환경을 마련할 것을 권장합니다. 이렇게 하면 누구든지 귀하의 비밀 API 키를 훔치거나 관련 없는 새 문자열을 추가하여 번역 프로젝트를 불필요하게 부풀리는 것을 방지할 수 있습니다.
Be sure to check out the complete example over at our GitHub profile. There, you’ll also find an example of how to do this using the Pages Router! If you encounter any problems, feel free to reach out, and we’ll be more than happy to help.
TacoTranslate lets you automatically localize your React applications quickly to and from over 75 languages. Get started today!