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.

    PR에는 PO 파일, changeset, 그리고 새 언어 추가하기에 설명된 로케일 파일만 포함하세요. 그 외의 것을 변경하는 번역 PR에는 자동화가 코멘트를 남깁니다.

번역해야 할 것

  • 각 항목의 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는 래핑된 모든 문자열을 악센트가 붙은 비슷한 글자로 바꿔 놓는 **의사 로케일(pseudo locale)**을 제공합니다. "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: "vi",
        label: "Tiếng Việt",
        enabled: false,
        dateLocale: () => import("react-day-picker/locale/vi").then((m) => m.vi),
      },
    ];

    dateLocale은 해당 언어의 달력 및 날짜 형식 현지화를 불러옵니다. react-day-picker/locale에서 가장 가까운 파일(예: pt-PT에는 pt)을 고르고, 그 파일에 이름이 지정된 export를 사용하세요. 해당 언어가 미국 영어 달력을 쓰는 경우에만 생략하세요.

    이것이 유일한 단일 원천입니다. lingui.config.ts, lunaria.config.ts, 관리자 런타임은 모두 이 파일에서 로케일 목록을 가져옵니다. 번역이 진행 중일 때는 enabled: false로 설정하세요. 관리자 UI에서 사용할 만큼 충분한 커버리지에 도달하면 메인테이너가 로케일을 활성화합니다.

  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에서 모든 문자열을 번역할 필요는 없습니다. 어떤 진전이든 도움이 됩니다. 번역되지 않은 문자열은 런타임에 영어로 폴백합니다.