EmDash 번역하기

이 페이지

EmDash의 관리 UI는 메시지 추출에 Lingui, 번역 진행 상황 추적에 Lunaria를 사용하여 번역할 수 있습니다. 모든 번역은 PO (gettext) 파일에 저장됩니다 — 로케일당 하나입니다.

번역 상태

모든 로케일의 현재 진행 상황은 번역 대시보드에서 확인하세요.

번역할 수 있는 사람

모든 번역은 원어민 또는 유창한 화자가 감독해야 합니다. AI 생성 번역은 허용되지만, 유창한 화자가 모든 문자열을 검토하고 제출 전에 실행 중인 관리 패널에서 미리 보기한 경우에만 가능합니다. 감독되지 않은 기계 출력은 허용되지 않습니다. 아래의 AI 지원 번역번역 테스트하기를 참조하세요.

문자열을 번역하지 않은 채로 두는 것이 잘못 번역하는 것보다 낫습니다. 잘못된 번역은 사용자를 오도합니다. 영어 폴백은 사용자에게 불편함만 줄 뿐입니다.

파일 구조

번역 카탈로그는 packages/admin/src/locales/에 있습니다:

packages/admin/src/locales/
├── en/
│   └── messages.po    # 영어 (소스)
├── de/
│   └── messages.po    # 독일어
└── ...

.po 파일에는 msgid/msgstr 쌍이 포함되어 있습니다. msgid는 영어 소스 텍스트이고, msgstr은 여러분의 번역입니다. 빈 msgstr은 “아직 번역되지 않음”을 의미합니다 — Lingui는 런타임에 영어로 폴백합니다.

문자열 번역하기

  1. 번역 대시보드를 확인하여 어떤 작업이 필요한지 확인하세요. 중복을 피하기 위해 열린 PR도 확인하세요.

  2. 리포지토리를 포크하고 브랜치를 생성하세요:

    git checkout -b i18n/ko
  3. 로케일의 PO 파일을 엽니다 (예: packages/admin/src/locales/ko/messages.po).

  4. 번역을 작성합니다. 각 항목은 다음과 같습니다:

    #: packages/admin/src/components/LoginPage.tsx:304
    msgid "Sign in with Passkey"
    msgstr ""

    msgstr을 작성합니다:

    #: packages/admin/src/components/LoginPage.tsx:304
    msgid "Sign in with Passkey"
    msgstr "Passkey로 로그인"
  5. 번역을 테스트합니다 (아래 참조).

  6. PR을 엽니다 main을 대상으로 합니다. 제목 형식: i18n(ko): add/update Korean translations.

번역해야 할 것

  • 각 항목의 msgstr 값.

번역하지 말아야 할 것

  • msgid 값 — 이것은 조회 키입니다.
  • {error}, {email}, {label} 같은 보간 플레이스홀더 — 그대로 정확히 유지하세요.
  • <0>, </0> 같은 XML 스타일 태그 — 이것은 인터랙티브 요소(링크, 버튼)를 감쌉니다. 태그를 유지하고 그 사이의 텍스트를 번역하세요.
  • #:로 시작하는 주석 — 이것은 Lingui가 추가한 소스 참조입니다.

보간과 태그

일부 문자열에는 플레이스홀더와 태그가 포함되어 있습니다:

msgid "Authentication error: {error}"
msgstr "인증 오류: {error}"

msgid "Don't have an account? <0>Sign up</0>"
msgstr "계정이 없으신가요? <0>가입하기</0>"

msgid "If an account exists for <0>{email}</0>, we've sent a sign-in link."
msgstr "<0>{email}</0>에 대한 계정이 존재하면 로그인 링크를 보냈습니다."

플레이스홀더({error}, {email})는 런타임에 동적 값으로 대체됩니다. 태그(<0>...</0>)는 React 컴포넌트를 감쌉니다. 둘 다 소스에 나타나는 것과 정확히 동일하게 번역에 나타나야 합니다 — 같은 이름, 같은 중첩 구조.

번역 테스트하기

  1. 컴파일하고 데모를 실행합니다:

    pnpm run locale:compile
    pnpm build
    pnpm --filter emdash-demo dev
  2. 관리 설정 페이지에서 로케일을 전환하고 번역이 컨텍스트에서 올바르게 표시되는지 확인합니다.

의사 로케일

EmDash에는 모든 래핑된 문자열을 악센트가 있는 유사 문자로 변환하는 의사 로케일이 포함되어 있습니다 — "Dashboard""Ðàšĥƀöàřð"가 됩니다. 의사 로케일이 활성화된 상태에서 일반 영어로 나타나는 문자열은 t\…“ 래퍼가 없거나 카탈로그 외부에서 온 것입니다.

활성화하려면 데모 디렉터리의 .env 파일에 다음을 추가하세요:

EMDASH_PSEUDO_LOCALE=1

그런 다음 개발 서버를 다시 시작하세요. 의사 로케일은 로그인 페이지와 설정의 언어 선택기에 Pseudo로 나타납니다. 전환하여 래핑되지 않은 문자열을 한눈에 찾으세요.

새 언어 추가하기

아직 PO 파일이 없는 언어인 경우:

  1. packages/admin/src/locales/locales.ts에 로케일을 추가합니다:

    export const LOCALES: LocaleDefinition[] = [
      { code: "en", label: "English", enabled: true },
      { code: "de", label: "Deutsch", enabled: true },
      // ...
      { code: "vi", label: "Tiếng Việt", enabled: false },  // 여러분의 것을 추가
    ];

    이것이 유일한 진실의 소스입니다 — lingui.config.ts, lunaria.config.ts 및 관리 런타임은 모두 이 파일에서 로케일 목록을 파생합니다. 번역이 진행 중인 동안 enabled: false로 설정하세요. 메인테이너가 관리 UI에서 사용하기에 충분한 커버리지가 확보되면 로케일을 활성화합니다.

  2. 추출을 실행하여 빈 PO 파일을 생성합니다:

    pnpm run locale:extract

    이렇게 하면 모든 문자열이 번역 준비 완료 상태인 packages/admin/src/locales/{여러분의-로케일}/messages.po가 생성됩니다.

  3. 위의 단계에 따라 번역하고 테스트합니다.

번역 표준

정확성

번역은 원어민 수준에서 영어 소스 텍스트를 충실하게 표현해야 합니다. 의미를 추가, 제거 또는 재해석하지 마세요. 소스 문자열이 모호한 경우, #: 주석에서 소스 파일 위치를 확인하세요 — 컴포넌트 코드를 읽어 컨텍스트를 이해하세요.

일관성

로케일 내에서 일관된 용어를 사용하세요. 한 곳에서 “collection”을 “컬렉션”으로 번역했다면, 다른 곳에서 “모음”으로 바꾸지 마세요. 이미 번역이 있는 언어인 경우, 시작 전에 기존 PO 파일을 읽어 확립된 용어에 맞추세요.

어조

관리 UI는 직접적이고 전문적인 어조를 사용합니다. 여러분의 언어에서도 그것에 맞추세요 — 과도하게 격식적이거나 과도하게 캐주얼한 표현은 피하세요.

AI 지원 번역

AI 도구를 사용하여 번역을 생성할 수 있습니다(전체 첫 번째 패스 포함). 하지만 유창한 화자가 결과를 감독해야 합니다:

  • 유창한 화자가 모든 문자열을 반드시 검토해야 합니다. AI 도구는 유창한 화자만이 잡을 수 있는 미묘한 오류를 범합니다 — 잘못된 존댓말 수준, 부자연스러운 표현, 잘못된 기술 용어 등.
  • 유창한 화자가 실행 중인 관리 UI에서 번역을 반드시 미리 봐야 합니다. AI 도구는 레이아웃 제약이나 UI 컨텍스트를 인식하지 못합니다.
  • PR 설명에 AI 사용을 공개하세요.
  • 감독되지 않은 기계 번역이 포함된 PR은 닫힙니다.

부분 번역

부분 번역은 환영합니다. 하나의 PR에서 모든 문자열을 번역할 필요는 없습니다 — 어떤 진전이든 도움이 됩니다. 번역되지 않은 문자열은 런타임에 영어로 폴백됩니다.