정적 콘텐츠 로컬라이제이션

업데이트일: 지난달 · 4분 소요

Lingo.dev CLI는 리포지토리의 정적 파일(Markdown, MDX, Markdoc, JSON, YAML, 자막 등)을 구성된 로컬라이제이션 엔진을 통해 번역합니다. 콘텐츠 경로만 지정해 한 번 실행하면, 원본 파일과 나란히 번역된 파일이 생성됩니다.

지원 콘텐츠 유형#

CLI는 파일 확장자를 기준으로 각 파일 형식을 자동으로 감지하므로 bucket type을 따로 설정할 필요가 없습니다. 로캘은 경로에 포함되므로(content/en/x.md가 content/de/x.md로 바뀜) [locale] 플레이스홀더도 필요하지 않습니다.

콘텐츠 유형형식예시 경로
문서Markdowndocs/en/getting-started.md
문서MDXdocs/en/getting-started.mdx
문서Markdocdocs/en/getting-started.mdoc
구조화된 데이터JSONdata/en.json
구조화된 데이터YAMLdata/en.yaml
블로그 포스트Markdown / MDXblog/en/post-slug.md
로컬라이제이션Gettext POlocale/en/messages.po
로컬라이제이션XLIFFlocale/en.xliff
자막SRTsubs/en/intro.srt

지원되는 전체 파일 형식 목록은 formats 레퍼런스에서 확인하세요.

새 CLI에서는 아직 지원되지 않습니다

CSV (csv-per-locale), VTT 자막, 일반 텍스트 .txt, Java .properties는 아직 새 CLI에서 지원되지 않습니다. 현재로서는 해당 파일을 legacy CLI에서 계속 사용하시고, 업데이트는 변경 로그에서 확인해 주세요.

사전 준비#

실행할 때마다 콘텐츠는 로컬라이제이션 엔진을 거칩니다. 이 설정에 따라 어떤 LLM 모델, 용어집, 브랜드 보이스, 규칙이 적용될지가 결정됩니다. 먼저 Lingo.dev 대시보드에서 엔진을 만든 다음, CLI(Node 22+)를 설정하세요:

bash
npm install -g @lingo.dev/cli
lingo login
lingo init
lingo link

lingo init 및 lingo link를 실행하면 .lingo/config.json가 생성되어 CLI가 조직과 엔진에 연결됩니다. 모든 환경에서 동일한 구성을 공유할 수 있도록 이 파일은 커밋해 두세요.

json
{
  "orgId": "org_abc123",
  "engineId": "eng_abc123",
  "sourceLocale": "en",
  "targetLocales": ["es", "fr", "de", "ja"],
  "files": [{ "pattern": "docs/en/getting-started.md" }]
}

CI에서는 lingo login를 건너뛰고, 대신 LINGO_API_KEY를 환경 변수로 제공하세요. 이 값은 API keys에서 생성할 수 있습니다.

문서 사이트#

대부분의 문서 프레임워크는 번역된 콘텐츠를 로캘별 디렉터리로 구성합니다. 소스 파일마다 패턴(또는 glob)을 files에 추가하세요. CLI는 Markdown, MDX, Markdoc를 번역하면서 frontmatter, 코드 블록, 컴포넌트 문법은 그대로 유지합니다.

json
{
  "orgId": "org_abc123",
  "engineId": "eng_abc123",
  "sourceLocale": "en",
  "targetLocales": ["es", "fr", "de", "ja"],
  "files": [
    { "pattern": "docs/en/getting-started.md" },
    { "pattern": "docs/en/setup.mdx" }
  ]
}

첫 번역을 실행해 모든 대상 로캘을 한 번에 채우세요:

bash
lingo push --backfill-missing

이후 실행에서는 lingo push가 변경된 내용만 번역합니다. 다른 곳에서 생성된 번역을 가져오려면 lingo pull를 사용하세요.

사용 중인 프레임워크의 디렉터리 규칙에 맞게 소스 경로를 조정하세요:

프레임워크로캘 디렉터리 규칙참고 자료
Docusaurusi18n/[locale]/docusaurus-plugin-content-docs/current/Docusaurus i18n 가이드
Nextra로캘별 페이지 또는 JSON 딕셔너리Nextra 문서
Hugocontent/[locale]/Hugo 다국어 가이드
Astrosrc/content/[locale]/ 또는 JSON 딕셔너리Astro i18n 가이드
VitePress[locale]/ 디렉터리 접두사VitePress i18n
MkDocsi18n 플러그인과 함께 사용하는 로캘별 docs/MkDocs i18n 플러그인

MDX 컴포넌트

MDX 번역은 JSX 컴포넌트 문법을 그대로 유지합니다. <Callout>, <Tabs>, <CodeBlock> 같은 사용자 지정 컴포넌트도 변경 없이 통과하며, 내부의 텍스트 콘텐츠만 번역됩니다.

구조화된 데이터#

JSON과 YAML 파일은 확장자를 기준으로 자동 번역됩니다. 번역하면 안 되는 값(ID, URL, 구성 플래그)이 수정되지 않도록 key controls를 활용하세요.

json
{
  "orgId": "org_abc123",
  "engineId": "eng_abc123",
  "sourceLocale": "en",
  "targetLocales": ["es", "fr", "de", "ja"],
  "files": [
    { "pattern": "content/en.json" },
    { "pattern": "data/en.yaml" }
  ]
}

Generic YAML에는 format 필드가 필요하지 않습니다. yaml-openapi, yaml-root-key, android만 파일 항목에 "format"을(를) 명시해야 합니다.

로캘 루트 키 YAML

로캘 코드를 루트 키로 사용하는 YAML 파일(Rails와 Hugo에서 흔함)에는 "format": "yaml-root-key"을(를) 명시해야 합니다. 루트 키가 대상 로캘로 다시 작성되기 때문입니다. 자세한 내용은 formats 레퍼런스를 참고하세요.

자막#

SRT 자막 파일은 확장자를 기준으로 번역됩니다. CLI는 모든 타이밍 데이터, 큐 인덱스, 서식 태그를 그대로 보존하고 텍스트 콘텐츠만 번역합니다.

json
{
  "orgId": "org_abc123",
  "engineId": "eng_abc123",
  "sourceLocale": "en",
  "targetLocales": ["es", "fr", "de", "ja"],
  "files": [{ "pattern": "subs/en/intro.srt" }]
}

VTT는 아직 지원되지 않습니다

WebVTT(.vtt) 자막은 아직 새 CLI에서 지원되지 않습니다. 당분간은 VTT 파일을 legacy CLI에서 계속 사용하고, 업데이트는 변경 로그를 확인하세요.

대규모 콘텐츠 다루기#

정적 콘텐츠 리포지토리에는 수천 개의 파일이 들어 있을 수 있습니다. CLI는 이런 규모도 효율적으로 처리합니다:

메커니즘도움이 되는 방식
실행 상태.lingo/lock.json는 소스 콘텐츠의 지문을 추적하므로 lingo push는 새로 추가되었거나 변경된 파일만 번역합니다. 이 파일은 커밋해 두세요. 푸시할 때마다 다시 생성됩니다.
서버 측 병렬 처리엔진이 번역을 병렬로 처리하므로 별도로 조정할 동시성 플래그는 없습니다.
대상 지정 실행glob을 사용해 특정 파일로 실행 범위를 좁힐 수 있습니다: lingo push "docs/en/**".

파일을 쓰지 않고 번역이 최신 상태인지 확인하려면(CI 게이트로 활용하기 좋습니다) lingo check를 실행하세요.

다음 단계#