Lingui.js는 JavaScript 및 React 애플리케이션을 위한 가볍지만 강력한 국제화(i18n) 프레임워크입니다. 번역 카탈로그를 위해 업계 표준인 PO(Portable Object) 파일을 사용하고, 깔끔한 개발자 경험을 위해 강력한 컴파일 타임 매크로를 사용하며, 2kB 미만의 최적화된 번들을 생성합니다. 이 가이드에서는 프로젝트 설정부터 PO 파일 워크플로우, 복수형 처리, l10n.dev를 통한 번역 자동화까지 모든 내용을 다룹니다.
Lingui.js는 개발자 경험, 성능 및 전문적인 번역 워크플로우의 결합으로 JavaScript i18n 라이브러리 중에서 두각을 나타냅니다:
Lingui의 코어 패키지와 개발 도구를 설치하세요. 런타임 패키지(@lingui/core 및 @lingui/react)는 프로덕션 환경에서 필요하며, 명령줄 인터페이스, 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 매크로와 함께 React 플러그인 옆에 Lingui 플러그인을 추가하세요. 이를 통해 컴파일 타임 메시지 변환 및 즉시 카탈로그 컴파일이 가능해집니다:
// 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는 전 세계의 번역 도구, 콘텐츠 관리 시스템 플랫폼 및 전문 번역가들이 널리 지원하기 때문에 기본 카탈로그 형식으로 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 명령줄 인터페이스는 추출 중에 이러한 파일을 자동으로 생성하고 업데이트합니다. 컴파일된 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;React 컨텍스트를 통해 모든 컴포넌트에서 번역을 사용할 수 있도록 전체 앱을 I18nProvider로 감싸세요:
// 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의 명령줄 인터페이스는 번역 워크플로우의 핵심을 형성하는 두 가지 주요 명령을 제공합니다: 소스 코드에서 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 빌드 프로세스에 직접 연결하여 번역이 항상 최신 상태로 유지되도록 하세요. 추출, 번역 및 컴파일을 단일 워크플로우로 결합하세요.
추출, 번역 및 컴파일을 스크립트로 추가하고 함께 연결하세요. 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 액션 워크플로우 예시는 다음을 참조하세요.현지화 자동화 가이드.
l10n.dev VS Code 확장 프로그램은 PO 파일 번역을 에디터 안으로 직접 가져옵니다. VS Code를 떠나지 않고 Lingui 카탈로그를 번역하세요.
전 세계 사용자에게 다가갈 준비가 되셨나요? l10n.dev 작업 공간에서 직접 Lingui PO 파일을 번역하거나, npm 명령줄 인터페이스로 자동화하거나, VS Code 내에서 바로 번역할 수 있습니다:
l10n.dev를 사용하여 Lingui.js 프로젝트를 현지화해 주셔서 감사합니다! 🚀
이 가이드가 도움이 되었다면, PO 파일을 사용하여 애플리케이션을 국제화해야 하는 다른 React 개발자들과 공유해 주세요.
함께 JavaScript 애플리케이션을 더 접근하기 쉽고 전 세계 사용자를 맞이할 준비가 되도록 만들 수 있습니다.