이 페이지와 원하는 AI 어시스턴트를 사용하여 문서를 요약합니다
버전 기록
- "Solid useIntlayer API 사용법을 직접 속성 액세스로 업데이트"v8.9.02026. 5. 4.
- "init 명령어 추가"v7.5.92025. 12. 30.
- "초기 이력"v5.5.102025. 6. 29.
이 페이지의 콘텐츠는 AI를 사용하여 번역되었습니다.
영어 원본 내용의 최신 버전을 보기이 문서를 개선할 아이디어가 있으시면 GitHub에 풀 리퀘스트를 제출하여 자유롭게 기여해 주세요.
문서에 대한 GitHub 링크문서의 Markdown을 클립보드에 복사
Intlayer로 Create React App 번역하기 | 국제화(i18n)
Intlayer란 무엇인가요?
react-i18next 또는 i18next와 같은 주요 솔루션과 비교하여 Intlayer는 다음과 같은 통합 최적화를 제공하는 솔루션입니다:
Intlayer는 현대 웹 애플리케이션에서 다국어 지원을 간소화하기 위해 설계된 혁신적이고 오픈 소스인 국제화(i18n) 라이브러리입니다.
대규모 JSON 파일을 페이지에 로드하는 대신 필요한 콘텐츠만 로드하세요. Intlayer는 번들 및 페이지 크기를 최대 50%까지 줄이는 데 도움을 줍니다.
애플리케이션의 콘텐츠를 스코핑하면 대규모 애플리케이션의 유지보수가 용이해집니다. 전체 콘텐츠 codebase를 검토해야 한다는 심리적 부담 없이 단일 기능 폴더를 복제하거나 삭제할 수 있습니다. 또한, Intlayer는 콘텐츠의 정확성을 보장하기 위해 완벽한 타입 지정(fully typed)을 지원합니다.
콘텐츠를 함께 배치하면 Large Language Models (LLMs)에 필요한 컨텍스트를 줄일 수 있습니다. Intlayer는 또한 누락된 번역을 테스트하기 위한 CLI, LSP, MCP, 및 agent skills 등의 도구 모음을 제공하여 AI agents를 위한 개발자 경험(DX)을 더욱 매끄럽게 합니다.
CI/CD 파이프라인에서 선택한 LLM을 사용하여 자동화로 번역하면 AI 공급자의 비용으로 처리할 수 있습니다. Intlayer는 또한 콘텐츠 추출을 자동화하는 컴파일러와 백그라운드에서 번역을 돕는 웹 플랫폼을 제공합니다.
대규모 JSON 파일을 컴포넌트에 연결하면 성능 및 반응성 문제가 발생할 수 있습니다. Intlayer는 빌드 시간에 콘텐츠 로딩을 최적화합니다.
React 애플리케이션에서 Intlayer 설정 단계별 가이드
종속성 설치
npm을 사용하여 필요한 패키지를 설치합니다:
bash코드 복사코드를 클립보드에 복사
--interactive플래그는 선택 사항입니다. AI 에이전트인 경우intlayer-cli init를 사용하세요.이 명령은 환경을 감지하고 필요한 패키지를 설치합니다. 예를 들어:
bash코드 복사코드를 클립보드에 복사
intlayer
구성 관리, 번역, 콘텐츠 선언, 트랜스파일링 및 CLI 명령을 위한 국제화 도구를 제공하는 핵심 패키지입니다.
react-intlayer
Intlayer를 React 애플리케이션과 통합하는 패키지입니다. React 국제화를 위한 컨텍스트 제공자와 훅을 제공합니다.
react-scripts-intlayer
Create React App 기반 애플리케이션과 Intlayer를 통합하기 위한
react-scripts-intlayer명령 및 플러그인을 포함합니다. 이 플러그인들은 craco를 기반으로 하며, Webpack 번들러에 대한 추가 구성을 포함합니다.프로젝트 구성
애플리케이션의 언어를 구성하기 위한 설정 파일을 생성합니다:
intlayer.config.ts코드 복사코드를 클립보드에 복사
import { Locales, type IntlayerConfig } from "intlayer"; const config: IntlayerConfig = { internationalization: { locales: [ Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH, // 다른 로케일 추가 ], defaultLocale: Locales.ENGLISH, }, }; export default config;이 구성 파일을 통해 로컬라이즈된 URL, 미들웨어 리디렉션, 쿠키 이름, 콘텐츠 선언의 위치 및 확장자, 콘솔에서 Intlayer 로그 비활성화 등을 설정할 수 있습니다. 사용 가능한 매개변수의 전체 목록은 구성 문서를 참조하세요.
콘텐츠 선언
번역을 저장하기 위해 콘텐츠 선언을 생성하고 관리합니다:
src/app.content.tsx코드 복사코드를 클립보드에 복사
import { t, type Dictionary } from "intlayer"; import React, { type ReactNode } from "react"; const appContent = { key: "app", content: { getStarted: t<ReactNode>({ en: ( <> Edit <code>src/App.tsx</code> and save to reload </> ), fr: ( <> Éditez <code>src/App.tsx</code> et enregistrez pour recharger </> ), es: ( <> Edita <code>src/App.tsx</code> y guarda para recargar </> ), }), reactLink: { href: "https://reactjs.org", content: t({ ko: "React 배우기", en: "Learn React", fr: "Apprendre React", es: "Aprender React", }), }, }, } satisfies Dictionary; export default appContent;콘텐츠 선언은 애플리케이션 어디에서나 정의할 수 있으며,
contentDir디렉토리(기본값:./src)에 포함되고 콘텐츠 선언 파일 확장자(기본값:.content.{json,ts,tsx,js,jsx,mjs,cjs,md,mdx,yaml,yml})와 일치해야 합니다.자세한 내용은 콘텐츠 선언 문서를 참조하세요.
콘텐츠 파일에 TSX 코드가 포함된 경우, 콘텐츠 파일에
import React from "react";를 가져오는 것을 고려해야 합니다.코드에서 Intlayer 사용
애플리케이션 전반에서 콘텐츠 사전을 액세스합니다:
src/App.tsx코드 복사코드를 클립보드에 복사
import logo from "./logo.svg"; import "./App.css"; import type { FC } from "react"; import { IntlayerProvider, useIntlayer } from "react-intlayer"; const AppContent: FC = () => { const content = useIntlayer("app"); return ( <div className="App"> <img src={logo} className="App-logo" alt="logo" /> {content.getStarted} <a className="App-link" href={content.reactLink.href.value} target="_blank" rel="noopener noreferrer" > {content.reactLink.content} </a> </div> ); }; const App: FC = () => ( <IntlayerProvider> <AppContent /> </IntlayerProvider> ); export default App;참고:
alt,title,href,aria-label등과 같은string속성에서 콘텐츠를 사용하려면, 함수의 값을 호출해야 합니다. 예를 들어:tsx코드 복사코드를 클립보드에 복사
useIntlayer훅에 대해 더 알아보려면 문서를 참조하세요.콘텐츠 언어 변경
선택사항콘텐츠의 언어를 변경하려면
useLocale훅에서 제공하는setLocale함수를 사용할 수 있습니다. 이 함수는 애플리케이션의 로케일을 설정하고 콘텐츠를 업데이트합니다.src/components/LocaleSwitcher.tsx코드 복사코드를 클립보드에 복사
import { Locales } from "intlayer"; import { useLocale } from "react-intlayer"; const LocaleSwitcher = () => { const { setLocale } = useLocale(); return ( <button onClick={() => setLocale(Locales.English)}> 언어를 영어로 변경 </button> ); };useLocale훅에 대해 더 알아보려면 문서를 참조하세요.애플리케이션에 로컬화된 라우팅 추가
선택사항이 단계의 목적은 각 언어에 대해 고유한 경로를 만드는 것입니다. 이는 SEO 및 SEO 친화적인 URL에 유용합니다. 예시:
plaintext코드 복사코드를 클립보드에 복사
기본적으로, 기본 로케일에 대해서는 경로가 접두어로 설정되지 않습니다. 기본 로케일에 접두어를 설정하려면, 구성에서
middleware.prefixDefault옵션을true로 설정할 수 있습니다. 자세한 내용은 구성 문서를 참조하세요.애플리케이션에 로컬화된 라우팅을 추가하려면, 애플리케이션의 경로를 감싸고 로케일 기반 라우팅을 처리하는
LocaleRouter컴포넌트를 생성할 수 있습니다. 다음은 React Router를 사용하는 예제입니다:src/components/LocaleRouter.tsx코드 복사코드를 클립보드에 복사
// 필요한 종속성과 함수 가져오기 import { type Locales, configuration, getPathWithoutLocale } from "intlayer"; // 'intlayer'에서 유틸리티 함수 및 타입 가져오기 import type { FC, PropsWithChildren } from "react"; // React의 함수형 컴포넌트 및 props 타입 import { IntlayerProvider } from "react-intlayer"; // 국제화 컨텍스트를 위한 제공자 import { BrowserRouter, Routes, Route, Navigate, useLocation, } from "react-router-dom"; // 탐색 관리를 위한 라우터 컴포넌트 // Intlayer에서 구성 해체 const { internationalization, middleware } = configuration; const { locales, defaultLocale } = internationalization; /** * 로컬화를 처리하고 적절한 로케일 컨텍스트로 자식을 감싸는 컴포넌트. * URL 기반 로케일 감지 및 유효성 검사를 관리합니다. */ const AppLocalized: FC<PropsWithChildren<{ locale: Locales }>> = ({ children, locale, }) => { const { pathname, search } = useLocation(); // 현재 URL 경로 가져오기 // 현재 로케일 결정, 제공되지 않은 경우 기본 로케일로 대체 const currentLocale = locale ?? defaultLocale; // 경로에서 로케일 접두사를 제거하여 기본 경로 생성 const pathWithoutLocale = getPathWithoutLocale( pathname // 현재 URL 경로 ); /** * middleware.prefixDefault가 true인 경우, 기본 로케일은 항상 접두어로 설정되어야 합니다. */ if (middleware.prefixDefault) { // 로케일 유효성 검사 if (!locale || !locales.includes(locale)) { // 기본 로케일과 업데이트된 경로로 리디렉션 return ( <Navigate to={`/${defaultLocale}/${pathWithoutLocale}${search}`} replace // 현재 히스토리 항목을 새 항목으로 대체 /> ); } // IntlayerProvider로 자식을 감싸고 현재 로케일 설정 return ( <IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider> ); } else { /** * middleware.prefixDefault가 false인 경우, 기본 로케일은 접두어로 설정되지 않습니다. * 현재 로케일이 유효하고 기본 로케일이 아닌지 확인합니다. */ if ( currentLocale.toString() !== defaultLocale.toString() && !locales .filter( (locale) => locale.toString() !== defaultLocale.toString() // 기본 로케일 제외 ) .includes(currentLocale) // 현재 로케일이 유효한 로케일 목록에 있는지 확인 ) { // 로케일 접두사가 없는 경로로 리디렉션 return <Navigate to={`${pathWithoutLocale}${search}`} replace />; } // IntlayerProvider로 자식을 감싸고 현재 로케일 설정 return ( <IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider> ); } }; /** * 로케일별 경로를 설정하는 라우터 컴포넌트입니다. * React Router를 사용하여 탐색을 관리하고 로컬화된 컴포넌트를 렌더링합니다. */ export const LocaleRouter: FC<PropsWithChildren> = ({ children }) => ( <BrowserRouter> <Routes> {locales .filter( (locale) => middleware.prefixDefault || locale !== defaultLocale ) .map((locale) => ( <Route // 로케일을 캡처하는 경로 패턴(e.g., /en/, /fr/) 및 모든 후속 경로와 일치 path={`/${locale}/*`} key={locale} element={<AppLocalized locale={locale}>{children}</AppLocalized>} // 로케일 관리로 자식을 감쌈 /> ))} { // 기본 로케일 접두어가 비활성화된 경우, 루트 경로에서 자식을 직접 렌더링 !middleware.prefixDefault && ( <Route path="*" element={ <AppLocalized locale={defaultLocale}>{children}</AppLocalized> } // 로케일 관리로 자식을 감쌈 /> ) } </Routes> </BrowserRouter> );그런 다음, 애플리케이션에서
LocaleRouter컴포넌트를 사용할 수 있습니다:src/App.tsx코드 복사코드를 클립보드에 복사
import { LocaleRouter } from "./components/LocaleRouter"; import type { FC } from "react"; // ... AppContent 컴포넌트 const App: FC = () => ( <LocaleRouter> <AppContent /> </LocaleRouter> );로케일 변경 시 URL 변경
선택사항로케일이 변경될 때 URL을 변경하려면
useLocale훅에서 제공하는onLocaleChange속성을 사용할 수 있습니다. 동시에,react-router-dom의useLocation및useNavigate훅을 사용하여 URL 경로를 업데이트할 수 있습니다.src/components/LocaleSwitcher.tsx코드 복사코드를 클립보드에 복사
import { useLocation, useNavigate } from "react-router-dom"; import { Locales, getHTMLTextDir, getLocaleName, getLocalizedUrl, } from "intlayer"; import { useLocale } from "react-intlayer"; import { type FC } from "react"; const LocaleSwitcher: FC = () => { const { pathname, search } = useLocation(); // 현재 URL 경로를 가져옵니다. 예: /fr/about?foo=bar const navigate = useNavigate(); const { locale, availableLocales, setLocale } = useLocale({ onLocaleChange: (locale) => { // 업데이트된 로케일로 URL을 구성합니다. // 예: /es/about?foo=bar const pathWithLocale = getLocalizedUrl(`${pathname}${search}`, locale); // URL 경로를 업데이트합니다. navigate(pathWithLocale); }, }); return ( <div> <button popoverTarget="localePopover">{getLocaleName(locale)}</button> <div id="localePopover" popover="auto"> {availableLocales.map((localeItem) => ( <a href={getLocalizedUrl(location.pathname, localeItem)} hrefLang={localeItem} aria-current={locale === localeItem ? "page" : undefined} onClick={(e) => { e.preventDefault(); setLocale(localeItem); }} key={localeItem} > <span> {/* 로케일 - 예: FR */} {localeItem} </span> <span> {/* 해당 로케일의 언어 - 예: Français */} {getLocaleName(localeItem, locale)} </span> <span dir={getHTMLTextDir(localeItem)} lang={localeItem}> {/* 현재 로케일의 언어 - 예: Francés (현재 로케일이 Locales.SPANISH로 설정된 경우) */} {getLocaleName(localeItem)} </span> <span dir="ltr" lang={Locales.ENGLISH}> {/* 영어로 된 언어 - 예: French */} {getLocaleName(localeItem, Locales.ENGLISH)} </span> </a> ))} </div> </div> ); };문서 참조:
HTML 언어 및 방향 속성 전환
선택사항애플리케이션이 여러 언어를 지원할 때,
<html>태그의lang및dir속성을 현재 로케일에 맞게 업데이트하는 것이 중요합니다. 이를 통해 다음을 보장할 수 있습니다:- 접근성: 스크린 리더 및 보조 기술은 올바른
lang속성을 사용하여 콘텐츠를 정확히 발음하고 해석합니다. - 텍스트 렌더링:
dir(방향) 속성은 텍스트가 올바른 순서로 렌더링되도록 보장합니다(예: 영어는 왼쪽에서 오른쪽, 아랍어나 히브리어는 오른쪽에서 왼쪽). 이는 가독성에 필수적입니다. - SEO: 검색 엔진은
lang속성을 사용하여 페이지의 언어를 판단하고, 검색 결과에서 적절한 현지화된 콘텐츠를 제공하는 데 도움을 줍니다.
로케일이 변경될 때 이러한 속성을 동적으로 업데이트하면 지원되는 모든 언어에서 사용자에게 일관되고 접근 가능한 경험을 보장할 수 있습니다.
Hook 구현
HTML 속성을 관리하기 위한 커스텀 훅을 생성합니다. 이 훅은 로케일 변경을 감지하고 속성을 적절히 업데이트합니다:
src/hooks/useI18nHTMLAttributes.tsx코드 복사코드를 클립보드에 복사
import { useEffect } from "react"; import { useLocale } from "react-intlayer"; import { getHTMLTextDir } from "intlayer"; /** * 현재 로케일에 따라 HTML <html> 요소의 `lang` 및 `dir` 속성을 업데이트합니다. * - `lang`: 브라우저와 검색 엔진에 페이지의 언어를 알립니다. * - `dir`: 올바른 읽기 방향을 보장합니다 (예: 영어의 경우 'ltr', 아랍어의 경우 'rtl'). * * 이 동적 업데이트는 올바른 텍스트 렌더링, 접근성 및 SEO를 위해 필수적입니다. */ export const useI18nHTMLAttributes = () => { const { locale } = useLocale(); useEffect(() => { // 현재 로케일로 언어 속성을 업데이트합니다. document.documentElement.lang = locale; // 현재 로케일에 따라 텍스트 방향을 설정합니다. document.documentElement.dir = getHTMLTextDir(locale); }, [locale]); };애플리케이션에서 Hook 사용하기
로케일이 변경될 때마다 HTML 속성이 업데이트되도록 훅을 메인 컴포넌트에 통합하세요:
src/App.tsx코드 복사코드를 클립보드에 복사
import type { FC } from "react"; import { IntlayerProvider, useIntlayer } from "react-intlayer"; import { useI18nHTMLAttributes } from "./hooks/useI18nHTMLAttributes"; import "./App.css"; const AppContent: FC = () => { // 로케일에 따라 <html> 태그의 lang 및 dir 속성을 업데이트하는 훅을 적용합니다. useI18nHTMLAttributes(); // ... 나머지 컴포넌트 }; const App: FC = () => ( <IntlayerProvider> <AppContent /> </IntlayerProvider> ); export default App;이러한 변경 사항을 적용하면 애플리케이션은 다음을 보장합니다:
- 언어(
lang) 속성이 현재 로케일을 정확히 반영하여 SEO 및 브라우저 동작에 중요합니다. - 로케일에 따라 텍스트 방향(
dir)을 조정하여 다른 읽기 순서를 가진 언어의 가독성과 사용성을 향상시킵니다. - 접근성을 개선하여 보조 기술이 이러한 속성에 의존해 최적의 기능을 수행할 수 있도록 합니다.
- 접근성: 스크린 리더 및 보조 기술은 올바른
TypeScript 구성
Intlayer는 TypeScript의 모듈 확장을 사용하여 코드베이스를 더 강력하게 만듭니다.


TypeScript 구성에 자동 생성된 타입을 포함해야 합니다.
코드를 클립보드에 복사
Git 구성
Intlayer에서 생성된 파일을 무시하는 것이 좋습니다. 이를 통해 해당 파일을 Git 저장소에 커밋하는 것을 방지할 수 있습니다.
이를 위해 .gitignore 파일에 다음 지침을 추가할 수 있습니다:
코드를 클립보드에 복사
VS Code 확장
Intlayer를 사용하면서 개발 경험을 개선하기 위해 공식 Intlayer VS Code Extension을 설치할 수 있습니다.
Intlayer와 함께 개발 경험을 향상시키려면 공식 Intlayer VS Code 확장을 설치할 수 있습니다. VS Code 마켓플레이스에서 설치하기
이 확장 기능은 다음을 제공합니다:
- 번역 키에 대한 자동 완성.
- 누락된 번역에 대한 실시간 오류 감지.
- 번역된 콘텐츠의 인라인 미리보기.
- 번역을 쉽게 생성하고 업데이트할 수 있는 빠른 작업.
확장 기능 사용 방법에 대한 자세한 내용은 Intlayer VS Code 확장 기능 문서를 참조하세요.
더 나아가기
더 나아가려면 비주얼 에디터를 구현하거나 CMS를 사용하여 콘텐츠를 외부화할 수 있습니다.
자주 묻는 질문
react-i18next/i18next: 가장 널리 사용되며, 런타임에 JSON 네임스페이스를 로드합니다.react-intl및Lingui: ICU 메시지 형식 기반으로, 추출 방식을 사용합니다.Intlayer: 가장 진보된 솔루션입니다. 코드베이스 어디에나 콘텐츠를 선언할 수 있으며(각 컴포넌트 옆 또는 중앙 집중식),react-scripts-intlayer를 통해 빌드 타임에 컴파일되고, 완전한 타입 안전성을 제공하며 AI 번역, 비주얼 에디터 및 CMS를 지원합니다.
Create React App은 자체 webpack 구성을 래핑하므로, 직접 플러그인을 등록하는 대신 react-scripts의 드롭인 대체품인 react-scripts-intlayer를 통해 통합됩니다. 왜 Intlayer인가와 벤치마크를 참조하세요.
네, 두 가지 방법이 있습니다. react-i18next 마이그레이션 가이드 또는 i18next 마이그레이션 가이드를 따라 점진적으로 이전할 수 있습니다. 또는 현재 API를 완전히 유지할 수도 있습니다. 호환 어댑터(compat adapters)는 react-i18next, react-intl 및 i18next와 완전히 동일한 API를 노출하면서 Intlayer 사전에서 데이터를 제공하므로, import 구문만 변경하고 컴포넌트 코드는 그대로 유지할 수 있습니다.
네. sync JSON 플러그인은 /messages/{locale}/{namespace}.json 파일을 단일 진실 공급원(source of truth)으로 유지하면서 양방향으로 Intlayer 사전을 생성합니다. sync PO 플러그인은 gettext 카탈로그에 대해 동일한 작업을 수행하며, 로케일별 파일을 통해 로케일을 한 파일에 모으는 대신 언어별로 콘텐츠를 분할할 수도 있습니다.
아닙니다. npx intlayer extract를 실행하면 Intlayer가 컴포넌트를 읽고 사용자 대면 문자열을 추출하여 각 컴포넌트 옆에 .content 파일을 생성하므로 카탈로그에 일일이 복사할 필요 없이 diff만 검토하면 됩니다.
완전 자동화된 파이프라인을 위해 Intlayer 컴파일러는 빌드 타임에 JSX, TSX, Vue 및 Svelte 소스에서 동일한 작업을 수행하여 변경될 때마다 사전을 생성하고 HMR을 통해 동기화하므로 수동으로 키를 관리할 필요가 없습니다.
컴파일러를 켜기 전에 알아두어야 할 두 가지 제한 사항이 있습니다. 정적 분석으로 작동하므로 API 오류 코드나 CMS 필드와 같이 런타임에만 존재하는 문자열은 처리할 수 없습니다. 또한 큰 코드베이스에서 몇 가지 어노테이션이 필요한 className="active" 또는 상태 코드와 같은 애플리케이션 로직과 사용자 대면 텍스트를 구분해야 합니다. extract 명령은 사용자가 직접 제어할 수 있도록 하여 두 가지 문제를 모두 방지합니다.
5가지 도구가 모두 선택 사항으로 제공됩니다:
- VS Code 확장 프로그램:
useIntlayer키에서 이를 선언한 콘텐츠 파일로 바로 이동하고, 컴포넌트에서 콘텐츠를 추출하며, 명령 팔레트나 전용 Intlayer 탭에서 build, fill, test, push, pull을 실행할 수 있습니다. - LSP 서버: LSP를 지원하는 모든 에디터에서 정의로 이동, 모든 참조 찾기, 번역 값 마우스 오버 미리보기, 키 및 필드 자동 완성, 선언되지 않은 키에 대한 경고 등 동일한 기능을 제공합니다. 또한
i18next,react-i18next,next-intl,use-intl호출도 해석하므로 마이그레이션 시 유용합니다. - MCP 서버: Cursor, VS Code, Claude Desktop, Claude Code, ChatGPT에 Intlayer 문서와 CLI를 노출하여 AI 어시스턴트가 최신 문서를 기반으로 정확히 답변하고
intlayer fill등의 명령을 직접 실행할 수 있게 합니다. - Agent Skills:
intlayer-config,intlayer-cli,intlayer-content및 각 프레임워크 전용 스킬을 통해 AI 에이전트에게 라우팅 설정과 콘텐츠 노드 타입을 학습시킵니다. - ESLint 플러그인:
no-raw-text규칙으로 하드코딩된 문자열을 표시하고, 정적 사전 키 및 사용되지 않는 콘텐츠에 대한 추가 규칙을 제공합니다.
