콘텐츠로 이동

번역자를 위한 안내

이 페이지는 코드를 작성하는 사람이 아니라 카탈로그를 편집하는 사람을 위한 것입니다. 일부러 짧게 썼고, 프로젝트가 자체 번역자 지침에 링크하거나 그대로 복사해 넣으라고 만든 문서입니다.

여기에 Python을 읽어야 하는 내용은 없습니다. 여기 있는 내용은 전부 한 가지, 메시지 안에서 중괄호로 묶인 부분에 관한 것입니다.

플레이스홀더란

카탈로그의 메시지에는 중괄호로 묶인 이름이 들어 있을 수 있습니다.

msgid "Hello {name}"
msgstr ""

{name}플레이스홀더입니다. 프로그램이 이 메시지를 보여 줄 때 {name} 자리에 프로그램이 준비한 값 — 사람 이름, 파일 이름, 숫자 — 을 넣습니다. 플레이스홀더는 번역할 낱말이 아니라 자리입니다.

여러분의 번역은 msgstr에 들어가며, 그 자리를 그대로 유지해야 합니다.

msgid "Hello {name}"
msgstr "こんにちは {name}"

바꿔도 되는 것과 안 되는 것

해도 되는 일:

  • 플레이스홀더 옮기기. 대상 언어의 문법이 원하는 자리라면 어디로든, 메시지 맨 앞으로도 옮길 수 있습니다.
  • 플레이스홀더 반복하기. 언어상 값이 두 번 필요하다면 반복해도 됩니다.
  • 나머지 모든 낱말 새로 쓰기. 문장 부호, 띄어쓰기, 어순까지 포함해서요.

하면 안 되는 일:

  • 중괄호 안의 이름 번역하기. {name}{name} 그대로 둡니다. 나머지가 전부 라틴 문자가 아닌 언어에서도 마찬가지입니다.
  • 중괄호 없애기, 또는 이름을 중괄호 없이 쓰기.
  • ASCII 중괄호 { }를 전각 로 바꾸기. 많은 입력기가 전각 형태를 만들어 냅니다. 거의 똑같아 보이지만 동작하지 않습니다.
  • 포매팅 추가하기. {name!r}이나 {amount:.2f} 같은 것 말입니다. 값을 어떻게 표시할지는 카탈로그가 아니라 프로그램이 정합니다.
  • msgid에 없는 플레이스홀더 만들어 내기.

원문이 제공하지 않는 값이 메시지에 필요하다면, 그것은 개발자가 메시지를 고쳐야 하는 경우입니다. 우회하지 말고 그렇다고 말해 주세요.

복수형

수를 세는 메시지는 여러분의 언어에 있는 복수형 개수만큼 msgstr 칸을 가지고 도착하며, 그 개수는 언어가 정합니다. 일본어는 하나, 독일어는 둘, 러시아어는 셋, 아랍어는 여섯입니다. 카탈로그가 주는 칸을 모두 채우세요.

사람들이 자주 걸려 넘어지는 두 가지 규칙이 있습니다.

  • 칸은 "단수, 복수, 더 많은 복수"가 아닙니다. 각 번호는 여러분 언어의 복수형 규칙이 정한 의미를 가집니다. 라트비아어의 세 번째 형태는 0 하나만을 위한 것이고, 슬로베니아어의 두 번째는 정확히 2를 위한 것이며, 웨일스어는 일반형을 0번에, 단수형을 1번에 둡니다.
  • 두 칸에 같은 텍스트가 들어가는 것도 정당합니다. 터키어, 헝가리어, 페르시아어, 벵골어에서는 수사 뒤의 명사가 단수형을 유지하므로, 수를 세는 메시지의 두 형태가 같은 문자열이 됩니다. 복사해 붙여넣다 생긴 실수가 아니라 올바른 결과입니다.

위의 플레이스홀더 규칙은 각 형태에 따로따로 적용됩니다.

fuzzy 항목

fuzzy 표시가 붙은 항목은 기계의 추측입니다. 개발자가 원본 메시지를 바꾸었고, 도구가 새 텍스트를 여러분의 예전 번역과 짝지어 출발점을 마련해 준 것입니다.

#, fuzzy
msgid "Welcome back, {name}"
msgstr "こんにちは {name}"

fuzzy 항목은 누군가 텍스트를 손보고 fuzzy 표시를 지울 때까지 프로그램이 사용하지 않으며, 대신 번역되지 않은 원문이 표시됩니다. 대부분의 PO 편집기에는 바로 그 일을 하는 버튼이 있습니다.

오류 메시지 읽기

도구는 카탈로그를 컴파일할 때 플레이스홀더를 검사하며, 그 메시지는 프로그래머가 아니라 여러분을 위해 쓰였습니다. 눈앞에 그 글자가 보이는데 {name}이 없다고만 알려 주는 것은 막다른 길이므로, 플레이스홀더가 있어 보이는데 실제로는 없을 때 메시지는 그 이유를 설명합니다. 원문 Hello {name}에 대해 아래 각각은 translation does not match the source placeholders: 아래에 보고됩니다.

여러분의 번역에 있는 내용 이유
こんにちは {name} {name} is missing (the braces around it are not the ASCII { and })
こんにちは {{name}} {name} is missing (it is written {{name}}, which is how a literal brace is escaped)
こんにちは name {name} is missing (the name appears, but not inside braces)
こんにちは {名前} {name} is missing; {名前} is not in the source message

보이지 않는 문자는 따로 다룹니다. 중괄호 안의 줄 바꿈 없는 공백은 입력기가 만들어 내고 어떤 편집기도 보여 주지 않으므로, 메시지는 여러분이 결코 찾을 수 없는 문자 이름을 대는 대신 코드 포인트로 출력합니다.

placeholder {<U+00A0>name} has a space inside the braces; write {name}

글자가 여러 문자 체계에 걸쳐 섞인 이름 — 키릴 문자 а를 라틴 문자와 구별할 수 없는 동형 문자 사례 — 은 읽을 수 있는 형태와 이스케이프한 형태로 두 번 표시됩니다. 둘을 구분해 주는 형태는 이스케이프뿐이기 때문입니다.

translation does not match the source placeholders: {name} is missing;
{nаme} (n\u0430me) is not in the source message

그리스어나 키릴 문자만으로 쓴 이름이 ASCII 원본 이름과 충돌할 때에도 같은 방식으로 구분하며, 한 글자짜리 라틴 a / 키릴 а 사례도 포함됩니다.

이런 경우를 만났는데 고칠 방법이 분명하지 않다면, 직접 입력한 플레이스홀더를 지우고 msgid에 있는 것을 복사해 오는 것이 안전한 방법입니다.

검사가 할 수 없는 일

도구는 플레이스홀더가 온전한지 검증합니다. 번역이 정확한지, 자연스러운지, 문맥에 맞는지는 판단할 수 없습니다. 그것은 온전히 여러분의 몫입니다.

어떤 검사보다 도움이 되는 두 가지가 있습니다.

  • 번역자 주석을 읽으세요. 메시지 위에 #.으로 시작하는 줄은 개발자가 이 메시지가 어디에 나오고 무슨 뜻인지 알려 주는 것입니다.
  • msgctxt에 대해 물어보세요. 같은 낱말이 서로 다른 컨텍스트로 두 번 나온다면, 그 둘이 다르게 번역되어야 하기 때문입니다. 버튼으로서의 "Open"과 상태로서의 "Open"이 그런 예입니다.