EmDash 번역하기

이 페이지

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

번역 상태

모든 로케일의 현재 진행 상황은 번역 대시보드를 참조하세요.

누가 번역할 수 있나요

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

문자열을 번역하지 않은 채로 두는 것이 잘못 번역하는 것보다 낫습니다. 잘못된 번역은 사용자를 오도합니다. 영어 대체는 불편할 뿐입니다.

파일 구조

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

packages/admin/src/locales/
├── en/
│   └── messages.po    # English (source)
├── de/
│   └── messages.po    # German
└── ...

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

문자열 번역하기

  1. 번역 대시보드를 확인하여 무엇이 필요한지 확인합니다. 중복 작업을 피하기 위해 열린 PR을 확인하세요.

  2. 저장소를 포크하고 브랜치를 만듭니다:

    git checkout -b i18n/de
  3. 로케일의 PO 파일을 엽니다 (예: packages/admin/src/locales/de/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 "Mit Passkey anmelden"
  5. 번역을 테스트합니다 (아래 참조).

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

번역해야 할 것

  • 각 항목의 msgstr 값.

번역하지 말아야 할 것

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

보간 및 태그

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

msgid "Authentication error: {error}"
msgstr "Authentifizierungsfehler: {error}"

msgid "Don't have an account? <0>Sign up</0>"
msgstr "Noch kein Konto? <0>Registrieren</0>"

msgid "If an account exists for <0>{email}</0>, we've sent a sign-in link."
msgstr "Falls ein Konto für <0>{email}</0> existiert, haben wir einen Anmeldelink gesendet."

플레이스홀더 ({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: "ja", label: "日本語", enabled: false },  // add yours
    ];

    이것은 유일한 진실의 원천입니다 — lingui.config.ts, lunaria.config.ts 및 관리 런타임은 모두 이 파일에서 로케일 목록을 파생합니다. 번역이 100% 커버리지가 없는 한 enabled: false로 설정하세요 — 메인테이너는 번역이 충분한 커버리지에 도달하면 활성화합니다.

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

    pnpm run locale:extract

    이렇게 하면 모든 문자열이 번역 준비된 상태로 packages/admin/src/locales/{your-locale}/messages.po가 생성됩니다.

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

번역 표준

정확성

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

일관성

로케일 내에서 일관된 용어를 사용하세요. 한 곳에서 “collection”을 “Sammlung”으로 번역했다면 다른 곳에서 “Kollektion”으로 전환하지 마세요. 언어에 이미 번역이 있는 경우 시작하기 전에 기존 PO 파일을 읽고 확립된 용어와 일치시키세요.

어조

관리 UI는 직접적이고 전문적인 어조를 사용합니다. 언어에서 그것에 맞추세요 — 지나치게 공식적이거나 지나치게 캐주얼한 표현을 피하세요.

AI 지원 번역

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

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

부분 번역

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