이 프로젝트에서는 다음을 사용해 다국어를 구현합니다
i18next (번역 핵심)react-i18next (React 통합)i18next-http-backend (JSON 파일로 번역 관리)i18next-browser-languagedetector (브라우저 언어 자동 감지)public/locales/{lng}.translation.json 형식으로 저장.i18n.ts에서 i18next 초기화.vite-plugin-next-react-router를 사용하여 레이아웃 기반 초기화.i18n.ts - i18next 초기화tsx
복사편집
import i18n from "i18next";
import { initReactI18next } from "react-i18next";
import HttpBackend from "i18next-http-backend";
import LanguageDetector from "i18next-browser-languagedetector";
i18n
.use(HttpBackend) // JSON 번역 파일 로드
.use(LanguageDetector) // 브라우저 언어 감지
.use(initReactI18next) // React와 i18n 연결
.init({
fallbackLng: "en", // 기본 언어
supportedLngs: ["en", "ko"], // 지원하는 언어
interpolation: {
escapeValue: false, // React에서 XSS 방어 필요 없음
},
backend: {
loadPath: "/locales/{{lng}}/{{ns}}.json", // 번역 파일 경로
},
debug: true, // 디버깅 활성화
});
export default i18n;
public/locales/ko.translation.json (한국어){
"welcome": "우리 웹사이트에 오신 것을 환영합니다!",
"about": "우리에 대해 더 알아보세요.",
"change_language": "언어 변경",
"login": "로그인"
}
public/locales/en.translation.json (영어){
"welcome": "Welcome to our website!",
"about": "Learn more about us.",
"change_language": "Change Language",
"login": "Login"
}
i18n 초기화 - _layout.tsx에서vite-plugin-next-react-router를 사용하면 모든 페이지에 공통으로 적용되는 레이아웃 파일에서 i18n을 초기화합니다.
_layout.tsx
import React from "react";
import { Outlet } from "react-router-dom";
import "../i18n"; // i18n 초기화
const Layout = () => {
return (
<div>
<header>
<h1>My Application</h1>
</header>
<main>
<Outlet /> {/* 각 페이지가 렌더링됨 */}
</main>
</div>
);
};
export default Layout;
IndexPage.tsximport { useTranslation } from "react-i18next";
const IndexPage = () => {
const { t, i18n } = useTranslation();
// 언어 변경 핸들러
const handleChangeLanguage = (
event: React.ChangeEvent<HTMLSelectElement>,
) => {
const selectedLanguage = event.target.value;
i18n.changeLanguage(selectedLanguage);
};
return (
<div>
<header>
<select
id="language-select"
value={i18n.language}
onChange={handleChangeLanguage}
>
<option value="en">English</option>
<option value="ko">한국어</option>
{/* 다른 언어 추가 가능 */}
</select>
</header>
<h2 className="mb-4 text-[28px] font-bold">{t("login")}</h2>
</div>
);
};
export default IndexPage;
en 또는 ko)이 자동으로 로드됩니다.i18next가 즉시 언어를 변경합니다./locales/{언어}/translation.json에서 가져옵니다.public/locales 디렉토리에 위치해야 하며, loadPath가 이를 가리키도록 설정.main.tsx가 아닌 _layout.tsx에서 초기화.t("key")를 사용하여 번역을 가져오며, 미번역된 키는 그대로 표시됩니다.i18next-browser-languagedetector로 브라우저 언어를 자동 감지.이제 프로젝트가 다국어를 지원하며, 사용자는 손쉽게 언어를 전환할 수 있습니다. 🚀