본문으로 건너뛰기

인공어, 스크립트 및 정자법

champollion은 LLM 레지스터와 결정론적 스크립트 변환기를 통해 인공어를 일급으로 지원해요. 이 가이드에서는 인공어 지원이 어떻게 작동하는지, 어떤 폰트가 필요한지, 그리고 직접 추가하는 방법을 다뤄요.

:::tip 인공어가 중요한 이유 인공어는 단순한 신기한 기능이 아니에요 — 실제로 소외된 언어에 사용되는 것과 정확히 동일한 인프라를 활용해요. 품질 게이트, 코칭 시스템, 스크립트 변환 파이프라인은 Klingon과 Plains Cree에 동일하게 작동해요. 인공어 파이프라인이 작동한다면, 저자원 언어 파이프라인도 작동할 거예요. :::


지원되는 인공어

언어코드스크립트 변환기폰트 필요
Klingontlh✅ 로마자 표기 → pIqaDPUA 폰트 (예: pIqaD qolqoS)
Sindarin (Tolkien Elvish)x-elvish-s✅ 라틴 문자 → TengwarCSUR PUA 폰트
Kryptonianx-kryptonian✅ 라틴 문자 → KryptonianPUA 폰트
Pirate Englishx-pirate❌ 레지스터만없음
Shakespearean Englishx-shakespeare❌ 레지스터만없음
Yoda-speakx-yoda❌ 레지스터만없음

인공어 코드는 BCP-47 사용자 정의 규칙에 따라 x- 접두사를 사용하지만, SIL International에서 ISO 639-3 코드를 할당받은 Klingon (tlh)은 예외예요.


Unicode, PUA 및 폰트 요구 사항

Private Use Area

Klingon (pIqaD), Sindarin (Tengwar), Kryptonian은 Unicode Private Use Area (PUA) 문자를 사용해요. PUA는 U+E000–U+F8FF 범위예요 — 이 코드포인트들은 표준 할당이 없어요. ConScript Unicode Registry (CSUR)는 가상 스크립트에 대한 커뮤니티 합의 매핑을 관리하지만, 이는 Unicode 표준의 일부가 아니에요.

실제로 이것이 의미하는 바는 다음과 같아요:

  • PUA 텍스트는 올바른 폰트가 로드되지 않으면 빈 상자(□□□)로 렌더링돼요
  • 폰트마다 동일한 PUA 코드포인트에 서로 다른 글리프를 매핑할 수 있어요
  • champollion은 PUA 폰트를 번들로 제공하지 않아요 — 직접 로드해야 해요
  • 시스템 폰트는 이 문자들을 절대 렌더링하지 않아요

스크립트별 PUA 범위

스크립트PUA 범위CSUR 참조
Klingon (pIqaD)U+F8D0–U+F8FFCSUR Klingon
Tengwar (Elvish)U+E000–U+E07FCSUR Tengwar
Kryptonian폰트에 따라 다름CSUR 표준 없음

PUA 웹 폰트 로드하기

champollion에는 PUA 웹 폰트를 다운로드하고 관리하는 내장 명령이 포함되어 있어요:

# See which fonts are needed for your configured languages
champollion fonts list

# Download all needed fonts (auto-detects project type for output directory)
champollion fonts install

# Also generate a CSS snippet with @font-face declarations
champollion fonts install --css

fonts install 명령은 검증된 오픈소스 저장소에서 다운로드해요:

폰트스크립트라이선스출처
pIqaD qolqoSKlingonSIL Open Font License 1.1GitHub
FreeMonoTengwarTengwarGNU GPL v3 (폰트 예외 포함)SourceForge
(사용자 제공)Kryptonian다양함사용 가능한 오픈소스 PUA 폰트 없음

출력 디렉터리는 프로젝트 구조에서 자동으로 감지돼요 (Docusaurus → static/fonts/, Hugo → static/fonts/, 기본값 → public/fonts/). --dir로 재정의할 수 있어요.

폰트를 수동으로 관리하고 싶다면, CSS에 @font-face 규칙을 추가하세요:

@font-face {
font-family: 'pIqaD';
src: url('/fonts/pIqaDqolqoS.ttf') format('truetype');
font-display: swap;
unicode-range: U+F8D0-F8FF;
}

/* Apply to Klingon text elements */
[lang="tlh"], [data-script="piqad"] {
font-family: 'pIqaD', sans-serif;
}

:::warning Unicode 지원은 보장되지 않아요 Unicode Consortium은 가상 스크립트를 표준으로 인코딩하기를 명시적으로 거부했어요. PUA 할당은 커뮤니티에서 관리되며 폰트 구현 간에 충돌할 수 있어요. 항상 프로젝트가 사용하는 정확한 폰트를 지정하고, 브라우저 전반에서 렌더링을 테스트하세요. :::


스크립트 변환기

작동 방식

champollion의 스크립트 변환은 번역 후 후크예요:

  1. LLM이 텍스트를 작업 스크립트(보통 라틴 문자 또는 SRO)로 번역해요
  2. 품질 게이트가 출력을 검증해요
  3. 결정론적 변환기가 검증된 텍스트를 표시 스크립트로 변환해요
  4. 변환된 텍스트가 디스크에 기록돼요

이 2단계 방식은 LLM이 라틴 기반 스크립트로 작업할 때 더 나은 출력을 생성하기 때문에 작동해요. 결정론적 변환기는 모델의 (종종 신뢰할 수 없는) 스크립트 지식에 의존하지 않고 올바른 스크립트 출력을 보장해요.

다섯 가지 변환기 모두

champollion에는 다섯 가지 내장 스크립트 변환기가 포함되어 있어요:

Plains Cree: SRO → Syllabics (crk)

Standard Roman Orthography에서 Canadian Aboriginal Syllabics로 변환해요.

Input: "tawâw"
Output: "ᑕᐚᐤ"

장모음은 마크론/곡절 부호를 사용해요: ê, î, ô, â. 변환기는 모든 SRO 발음 구별 부호를 처리하고 올바른 음절 문자로 매핑해요. 전체 Cree 파이프라인은 저자원 언어 지원하기를 참조하세요.

Serbian: Latin → Cyrillic (sr)

세르비아어를 위한 결정론적 라틴 문자에서 키릴 문자로의 변환이에요.

Input: "zdravo"
Output: "здраво"

이는 이중 문자(lj → љ, nj → њ, dž → џ)를 포함한 전체 세르비아어 알파벳 매핑을 처리해요.

Klingon: Romanization → pIqaD (tlh)

Marc Okrand의 로마자 표기 시스템에서 pIqaD PUA 문자로 변환해요.

Input: "Qapla'" (romanized Klingon)
Output: [pIqaD PUA] (requires pIqaD font to render)

Sindarin: Latin → Tengwar (x-elvish-s)

Tolkien의 Sindarin 모드 Tengwar 매핑이에요.

Input: "elen síla" (Latin Sindarin)
Output: [Tengwar PUA] (requires Tengwar font to render)

Kryptonian: Latin → Kryptonian (x-kryptonian)

팬 어휘집 Kryptonian 스크립트 매핑이에요.

Input: "Kal-El"
Output: [Kryptonian PUA] (requires Kryptonian font to render)

변환기 트리거하기

언어 설정에서 scripts 필드를 설정하세요. 내장 변환기의 경우, 이는 언어 코드에서 자동으로 감지돼요:

{
"languages": {
"sr": { "scripts": "sr" },
"crk": {}
}
}

Plains Cree (crk)는 자동으로 감지돼요 — scripts을 명시적으로 설정할 필요가 없어요.


다중 스크립트 언어

일부 실제 언어는 여러 활성 스크립트를 사용해요:

언어스크립트champollion 접근 방식
SerbianLatin + Cyrillic스크립트 변환기 (sr) — 라틴 문자로 번역한 후 키릴 문자로 변환
ChineseSimplified + Traditional별개의 레지스터를 가진 별도의 로케일 코드 (zh vs zh-TW)

두 스크립트가 동일한 대상에게 사용되는 언어(Serbian)의 경우, 스크립트 변환기를 사용하세요. 스크립트가 서로 다른 대상에게 사용되는 언어(중국 본토용 중국어 간체, 대만/홍콩용 번체)의 경우, 별도의 로케일 코드를 사용하세요.


정자법 노트

레지스터는 단순한 어조가 아니에요 — 정자법 지침을 담고 있어 LLM이 올바른 작성 관습을 따르도록 유도해요.

격식 호칭 형태

champollion의 내장 레지스터는 각 언어에 문화적으로 적절한 격식 호칭을 포함해요:

언어격식 형태레지스터 지침
GermanSieUse Sie-form for formal address
FrenchvousUse vous-form
RussianвыProfessional register with вы-form
TurkishsizProfessional register with siz-form
Korean합쇼체Formal Korean (합쇼체)
Japaneseです/ますPolite professional register (です/ます form)
PolishPan/PaniProfessional register with Pan/Pani form

성 포용적 글쓰기

각 언어 카드에는 언어별 조언이 담긴 gender.inclusiveGuidance 필드가 있어요. 이는 레지스터 프리셋과는 별도로 LLM 번역 프롬프트에 주입되므로, 사용자가 어떤 격식 프리셋을 선택하든 일관되게 적용돼요:

  • French: 가운뎃점 표기를 사용하는 Écriture inclusive (예: "Connecté·e")
  • German: 쌍점 표기 (예: "Benutzer:innen")
  • Spanish: 성 중립적 재구성 선호; 대체 방안으로 슬래시 표기 (예: "usuario/a")

카드에 특정 지침이 없는 언어(예: Korean, 인공어)의 경우, 시스템은 일반적인 규칙으로 대체돼요: "성 중립적 형태나 사용 가능한 가장 포용적인 옵션을 선호하세요."

RTL 스크립트 요구 사항

Arabic, Hebrew, Persian, Urdu 레지스터는 모두 오른쪽에서 왼쪽으로 쓰는 요구 사항을 명시해요: Ensure text reads naturally in RTL layout contexts.

모든 레지스터 재정의하기

모든 레지스터는 설정 값이에요 — 프로젝트의 목소리에 맞게 재정의하세요:

{
"languages": {
"fr": {
"register": "Casual French. Use tu-form. Conversational blog tone. Gender-neutral when possible."
},
"de": {
"register": "Informal German. Use du-form. Tech startup voice."
}
}
}

전체 설정 참조는 Configuration을 참조하세요.


새로운 인공어 추가하기

단계별 안내

  1. BCP-47 사용자 정의 코드 선택: x- 접두사를 사용하세요 (예: x-dothraki, x-valyrian).

  2. 설정에 추가:

{
"languages": {
"x-dothraki": {
"register": "Dothraki language. Use David J. Peterson's vocabulary from the Living Language Dothraki textbook. Harsh, direct tone. No articles, no verb 'to be'."
}
}
}
  1. (선택 사항) 스크립트 변환기 추가: 인공어가 라틴 문자가 아닌 표시 스크립트를 사용한다면, lib/scripts.js에 변환기를 추가하고 SCRIPT_CONVERTERS에 등록하세요.

  2. 테스트: champollion sync --dry를 실행해 파일을 작성하지 않고 번역을 미리 보세요.

  3. 품질 게이트 확인: 품질 게이트는 인공어에 맞게 조정이 필요할 수 있어요 — 특히 인공어가 PUA 문자를 사용한다면 requireNonLatin 검사가 그래요.

:::note 인공어 품질은 LLM 지식에 따라 달라져요 LLM은 훈련 데이터에서 본 적이 있는 인공어로만 번역할 수 있어요. 잘 문서화된 인공어(Klingon, Sindarin, Dothraki)는 잘 작동해요. 잘 알려지지 않았거나 새로 만들어진 인공어는 일관성 없는 결과를 낼 수 있어요. 코칭 데이터를 사용해 품질을 개선하세요. :::


함께 보기