Lingui.js는 JavaScript 및 React 애플리케이션을 위한 가볍지만 강력한 국제화(i18n) 프레임워크입니다. 번역 카탈로그를 위해 업계 표준인 PO(Portable Object) 파일을 사용하며, 깔끔한 개발자 경험을 위한 강력한 컴파일 타임 매크로를 제공하고, 2kB 미만의 최적화된 번들을 생성합니다. 이 가이드에서는 프로젝트 설정부터 PO 파일 워크플로우, 복수형 처리, l10n.dev를 이용한 번역 자동화까지 모든 것을 다룹니다.
Lingui.js는 개발자 경험, 성능 및 전문적인 번역 워크플로우의 결합으로 JavaScript i18n 라이브러리 중에서 두각을 나타냅니다:
Lingui의 코어 패키지와 개발 도구를 설치하세요. 런타임 패키지(@lingui/core 및 @lingui/react)는 프로덕션 환경에서 필요하며, CLI, Vite 플러그인 및 Babel 매크로는 개발 전용입니다:
npm install @lingui/core @lingui/react
npm install --save-dev @lingui/cli @lingui/vite-plugin @lingui/babel-plugin-lingui-macroLingui는 두 개의 구성 파일이 필요합니다: Lingui 구성(로케일 및 카탈로그 경로 정의)과 빌드 도구 구성(컴파일 타임 매크로 활성화).
프로젝트 루트에 lingui.config.js 파일을 생성하세요. 여기에서 소스 로케일, 대상 로케일, PO 카탈로그 저장 위치 및 카탈로그 형식을 정의합니다. PO 형식이 기본값이자 권장되는 선택입니다:
// lingui.config.js
import { defineConfig } from "@lingui/cli";
import { formatter } from "@lingui/format-po";
export default defineConfig({
sourceLocale: "en",
locales: ["en", "fr", "de", "ja", "es", "zh-CN"],
catalogs: [
{
path: "<rootDir>/src/locales/{locale}/messages",
include: ["src"],
},
],
format: formatter({ lineNumbers: false }),
});Vite를 사용하는 경우, Babel 매크로와 함께 Lingui 플러그인을 React 플러그인 옆에 추가하세요. 이를 통해 컴파일 타임 메시지 변환과 즉석 카탈로그 컴파일이 가능해집니다:
// vite.config.ts
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import { lingui } from "@lingui/vite-plugin";
export default defineConfig({
plugins: [
react({
babel: {
plugins: ["@lingui/babel-plugin-lingui-macro"],
},
}),
lingui(),
],
});PO(Portable Object)는 GNU gettext 시스템에서 유래한 업계 표준 번역 파일 형식입니다. Lingui는 전 세계의 번역 도구, TMS 플랫폼 및 전문 번역가들이 널리 지원하기 때문에 기본 카탈로그 형식으로 PO를 사용합니다.
#: src/components/WelcomeBanner.js:6
msgid "Welcome to our platform"
msgstr ""
#: src/components/WelcomeBanner.js:8
msgid "Hello {userName}, check out your <0>dashboard</0> to get started."
msgstr ""
#: src/components/CartSummary.js:5
msgid "{itemCount, plural, =0 {Your cart is empty} one {You have # item in your cart} other {You have # items in your cart}}"
msgstr ""번역 후 각 msgstr은 현지화된 버전으로 채워집니다. Lingui는 모든 번역에서 ICU MessageFormat 구문, React 컴포넌트를 위한 인덱스 태그, 플레이스홀더 변수를 보존합니다.
#: src/components/WelcomeBanner.js:6
msgid "Welcome to our platform"
msgstr "Bienvenue sur notre plateforme"
#: src/components/WelcomeBanner.js:8
msgid "Hello {userName}, check out your <0>dashboard</0> to get started."
msgstr "Bonjour {userName}, consultez votre <0>tableau de bord</0> pour commencer."
#: src/components/CartSummary.js:5
msgid "{itemCount, plural, =0 {Your cart is empty} one {You have # item in your cart} other {You have # items in your cart}}"
msgstr "{itemCount, plural, =0 {Votre panier est vide} one {Vous avez # article dans votre panier} other {Vous avez # articles dans votre panier}}"PO 카탈로그를 로케일별로 하위 폴더를 만들어 locales 디렉토리 안에 구성하세요. Lingui CLI는 추출 중에 이러한 파일을 자동으로 생성하고 업데이트합니다. 컴파일된 JS 모듈은 빌드 시점에 생성되므로 수동으로 편집해서는 안 됩니다.
src/
├── locales/
│ ├── en/
│ │ └── messages.po ← Source (English)
│ ├── fr/
│ │ └── messages.po ← French
│ ├── de/
│ │ └── messages.po ← German
│ ├── ja/
│ │ └── messages.po ← Japanese
│ ├── es/
│ │ └── messages.po ← Spanish
│ └── zh-CN/
│ └── messages.po ← Chinese Simplified
├── components/
├── i18n.ts
├── App.tsx
└── ...Lingui는 메시지를 표시하기 위한 두 가지 주요 접근 방식을 제공합니다: 컴포넌트 콘텐츠를 위한 JSX 매크로와 명령형 문자열을 위한 useLingui 훅입니다. 둘 다 최적화된 출력을 생성하는 컴파일 타임 매크로입니다.
번역이 필요한 JSX 콘텐츠를 Trans 매크로로 감싸세요. 변수, HTML 요소 및 React 컴포넌트가 완벽하게 지원되며, 매크로가 이를 인덱스 태그가 포함된 ICU MessageFormat으로 자동으로 변환합니다.
import { Trans } from "@lingui/react/macro";
function WelcomeBanner({ userName }) {
return (
<div>
<h1>
<Trans>Welcome to our platform</Trans>
</h1>
<p>
<Trans>
Hello {userName}, check out your <a href="/dashboard">dashboard</a> to
get started.
</Trans>
</p>
</div>
);
}JSX 외부의 문자열(알림 메시지, aria 레이블, 속성 값 또는 기타 명령형 코드)에는 태그가 지정된 템플릿 리터럴과 함께 useLingui 매크로 훅을 사용하세요:
import { useLingui } from "@lingui/react/macro";
function NotificationButton() {
const { t } = useLingui();
const showAlert = () => {
alert(t`Your changes have been saved.`);
};
return (
<button onClick={showAlert} aria-label={t`Save changes`}>
<Trans>Save</Trans>
</button>
);
}Lingui는 메시지 식별을 위한 두 가지 접근 방식을 지원합니다: 자동 생성 ID(소스 메시지 콘텐츠에서 파생됨)와 명시적 ID(개발자가 정의한 키). 두 방식 모두 PO 파일과 함께 작동합니다.
import { Trans } from "@lingui/react/macro";
// Auto-generated ID (from message content)
<Trans>Welcome to our platform</Trans>
// Explicit ID (developer-defined key)
<Trans id="nav.welcome">Welcome to our platform</Trans>모든 매크로에서 comment prop을 사용하여 설명을 추가하세요. 이 주석은 번역가 노트로 PO 파일에 추출되어 메시지가 어디에 어떻게 나타나는지에 대한 중요한 컨텍스트를 제공합니다.
import { Trans } from "@lingui/react/macro";
<Trans comment="Shown on the homepage hero section above the fold">
Start building with confidence
</Trans>Lingui는 복수형 처리를 위해 모든 CLDR 복수형 범주를 지원하는 ICU MessageFormat을 사용합니다. Plural 매크로를 사용하면 JSX에서 다양한 복수형을 쉽게 처리할 수 있습니다:
import { Plural } from "@lingui/react/macro";
function CartSummary({ itemCount }) {
return (
<p>
<Plural
value={itemCount}
_0="Your cart is empty"
one="You have # item in your cart"
other="You have # items in your cart"
/>
</p>
);
}메시지를 추출하고 컴파일한 후, i18n 인스턴스를 설정하고 앱을 I18nProvider로 감싸세요.
컴파일된 메시지 카탈로그를 동적으로 로드하는 i18n 모듈을 생성하세요. Lingui Vite 플러그인은 개발 중에 즉석에서 컴파일되는 PO 파일의 직접 가져오기를 가능하게 합니다:
// src/i18n.ts
import { i18n } from "@lingui/core";
export async function loadCatalog(locale: string) {
const { messages } = await import(`./locales/${locale}/messages.po`);
i18n.load(locale, messages);
i18n.activate(locale);
}
// Initialize with default locale
loadCatalog("en");
export default i18n;전체 앱을 I18nProvider로 감싸서 React 컨텍스트를 통해 모든 컴포넌트에서 번역을 사용할 수 있도록 하세요:
// src/App.tsx
import { I18nProvider } from "@lingui/react";
import { i18n } from "./i18n";
function App() {
return (
<I18nProvider i18n={i18n}>
<YourAppContent />
</I18nProvider>
);
}언어 전환은 간단합니다: 새 카탈로그를 로드하고 로케일을 활성화하면 React가 자동으로 모든 번역된 콘텐츠를 다시 렌더링합니다. 다음은 완전한 언어 전환 컴포넌트 예시입니다:
import { useState } from "react";
import { loadCatalog } from "./i18n";
import { Trans } from "@lingui/react/macro";
const LANGUAGES = {
en: "English",
fr: "Français",
de: "Deutsch",
ja: "日本語",
es: "Español",
};
function LanguageSwitcher() {
const [currentLocale, setCurrentLocale] = useState("en");
const handleChange = async (locale: string) => {
await loadCatalog(locale);
setCurrentLocale(locale);
};
return (
<select
value={currentLocale}
onChange={(e) => handleChange(e.target.value)}
>
{Object.entries(LANGUAGES).map(([code, name]) => (
<option key={code} value={code}>
{name}
</option>
))}
</select>
);
}Lingui의 CLI는 번역 워크플로우의 핵심인 두 가지 주요 명령을 제공합니다: 소스 코드에서 PO 카탈로그로 메시지를 가져오는 extract와 PO 파일을 프로덕션용 최적화된 JavaScript 모듈로 변환하는 compile입니다.
# Extract messages from source code into PO catalogs
npx lingui extract
# Translate your PO files (manually, with a TMS, or with AI)
# Compile PO catalogs into optimized JS modules for production
npx lingui compilel10n.dev는 PO 파일에 대한 기본 지원을 제공하여 Lingui.js 프로젝트의 완벽한 동반자가 됩니다. 소스 PO 카탈로그를 업로드하고 정확하게 번역된 파일을 돌려받으세요:
ai-l10n npm 패키지를 사용하여 명령줄에서 또는 CI/CD 파이프라인의 일부로 Lingui PO 카탈로그를 번역하세요. 한 번 설치하면 단일 명령으로 원하는 수의 언어로 번역할 수 있습니다.
# Install the CLI
npm install ai-l10n
# Translate your source PO file to multiple languages
npx ai-l10n translate src/locales/en/messages.po \
--languages fr,de,ja,zh-CN,es,koai-l10n을 Lingui 빌드 프로세스에 직접 연결하여 항상 최신 상태의 번역을 유지하세요. 추출, 번역, 컴파일을 단일 워크플로우로 결합하세요.
extract, translate, compile을 스크립트로 추가하고 연결하세요. i18n 스크립트는 전체 파이프라인을 실행합니다. 배포 전에 번역이 항상 최신 상태인지 확인하기 위해 prebuild에서 사용하세요.
{
"scripts": {
"extract": "lingui extract",
"compile": "lingui compile",
"translate": "ai-l10n translate src/locales/en/messages.po --languages fr,de,ja,zh-CN,es,ko --update",
"i18n": "npm run extract && npm run translate && npm run compile",
"prebuild": "npm run i18n",
"build": "vite build",
"dev": "vite"
}
}팀에서 Make를 사용하는 경우, 추출, 번역 및 컴파일을 적절한 종속성이 있는 별도의 타겟으로 선언하세요:
LANGUAGES = fr,de,ja,zh-CN,es,ko
extract:
npx lingui extract
translate:
npx ai-l10n translate src/locales/en/messages.po --languages $(LANGUAGES) --update
compile:
npx lingui compile
i18n: extract translate compile
dev: i18n
npx vite
build: i18n
npx vite buildCI/CD 통합, 증분 업데이트, 여러 파일에 대한 일괄 번역 및 GitHub Actions 워크플로우 예제에 대해서는 다음을 참조하세요: 현지화 자동화 가이드.
l10n.dev VS Code 확장 프로그램은 PO 파일 번역을 에디터로 직접 가져옵니다. VS Code를 떠나지 않고 Lingui 카탈로그를 번역하세요.
전 세계 사용자에게 다가갈 준비가 되셨나요? l10n.dev 워크스페이스에서 직접 Lingui PO 파일을 번역하거나, npm CLI로 자동화하거나, VS Code 내에서 바로 번역하세요:
Lingui.js 프로젝트를 현지화하기 위해 l10n.dev를 사용해 주셔서 감사합니다! 🚀
이 가이드가 도움이 되었다면, PO 파일을 사용하여 애플리케이션을 국제화해야 하는 다른 React 개발자들과 공유해 주세요.
함께 JavaScript 애플리케이션을 더 접근하기 쉽고 전 세계 사용자를 맞이할 준비가 되도록 만들 수 있습니다.