Skip to content

dungsil-ai/pat

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

430 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Paradox Auto Translate

Paradox Interactive ๊ฒŒ์ž„ ๋ชจ๋“œ๋ฅผ ์œ„ํ•œ ์ž๋™ ๋ฒˆ์—ญ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. Google AI Studio(Gemini)๋ฅผ ai-sdk.dev ๊ธฐ๋ฐ˜์œผ๋กœ ํ˜ธ์ถœํ•ด ์˜์–ด ํ˜„์ง€ํ™” ํŒŒ์ผ์„ ํ•œ๊ตญ์–ด๋กœ ๋ฒˆ์—ญํ•ฉ๋‹ˆ๋‹ค.

์ง€์› ๊ฒŒ์ž„

  • Crusader Kings III (CK3)
  • Victoria 3 (VIC3)
  • Stellaris

์ฃผ์š” ๊ธฐ๋Šฅ

  • ๐Ÿค– Google AI Studio(Gemini) ๊ธฐ๋ฐ˜ ์ž๋™ ๋ฒˆ์—ญ (ai-sdk.dev)
  • ๐ŸŽฎ ๊ฒŒ์ž„๋ณ„ ํŠนํ™” ๋ฒˆ์—ญ (์ค‘์„ธ ์—ญ์‚ฌ, ์—ญ์‚ฌ์  ์ธ๋ฌผ, ์ง€๋ช… ๋“ฑ)
  • ๐Ÿ”ค ์Œ์—ญ ๋ชจ๋“œ: ๊ณ ์œ ๋ช…์‚ฌ(๋ฌธํ™”๋ช…, ์™•์กฐ๋ช…, ์ธ๋ฌผ๋ช…)๋ฅผ ๋ฐœ์Œ ๊ธฐ๋ฐ˜์œผ๋กœ ์Œ์—ญ (์˜ˆ: "Afar" โ†’ "์•„ํŒŒ๋ฅด")
  • ๐Ÿ“ ๊ฒŒ์ž„ ๋ณ€์ˆ˜ ๋ฐ ํ˜•์‹ ๋ณด์กด
  • ๐Ÿ“Œ ์žฌ๋ฒˆ์—ญ ๋Œ€๊ธฐ ํ•ญ๋ชฉ์ด ์žˆ์–ด๋„ ์›๋ณธ localization ํ‚ค ์ˆœ์„œ ๋ณด์กด
  • ๐Ÿ’พ ์Šค๋งˆํŠธ ์บ์‹ฑ์œผ๋กœ ์ค‘๋ณต ๋ฒˆ์—ญ ๋ฐฉ์ง€ (๋ฒˆ์—ญ/์Œ์—ญ ๋ณ„๋„ ์บ์‹œ)
  • ๐Ÿ“š ์ˆ˜๋™ ๋‹จ์–ด์‚ฌ์ „ ์ง€์› (์ผ๋ฐ˜ ์šฉ์–ด + ๊ณ ์œ ๋ช…์‚ฌ ์‚ฌ์ „)
  • โœ… ๋ฒˆ์—ญ ๊ฒ€์ฆ ๋ฐ ์žฌ๋ฒˆ์—ญ ๊ธฐ๋Šฅ
  • โฑ๏ธ .env์— ์„ค์ • ๊ฐ€๋Šฅํ•œ ๋ฒˆ์—ญ ํƒ€์ž„์•„์›ƒ ๋ฐ ๋ฐฐ์น˜ ํฌ๊ธฐ
  • ๐Ÿงญ ์—…์ŠคํŠธ๋ฆผ ํŒŒ์ผ ํ•ด์‹œ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ณ€๊ฒฝ ์—†๋Š” ํŒŒ์ผ์€ ์ž๋™ ์Šคํ‚ต (ํ•ด์‹œ ์บ์‹œ๋Š” ์ผ๋ฐ˜ ํŒŒ์ผ๋งŒ ์•ˆ์ „ํ•˜๊ฒŒ ๊ฐฑ์‹ )
  • โš™๏ธ ๋ชจ๋“œ ์ˆ˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ž๋™ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ(ETC ํ•˜์œ„ upstream ํด๋”๋„ ๋…๋ฆฝ ๋ชจ๋“œ๋กœ ๊ณ„์‚ฐ)

์„ค์น˜

pnpm install

ํ…Œ์ŠคํŠธ

์ด ํ”„๋กœ์ ํŠธ๋Š” Vitest๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํฌ๊ด„์ ์ธ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

# ๋ชจ๋“  ํ…Œ์ŠคํŠธ ์‹คํ–‰
pnpm test

# Watch ๋ชจ๋“œ๋กœ ํ…Œ์ŠคํŠธ ์‹คํ–‰ (ํŒŒ์ผ ๋ณ€๊ฒฝ ์‹œ ์ž๋™ ์žฌ์‹คํ–‰)
pnpm test:watch

# UI ๋ชจ๋“œ๋กœ ํ…Œ์ŠคํŠธ ์‹คํ–‰
pnpm test:ui

# ์ปค๋ฒ„๋ฆฌ์ง€ ๋ฆฌํฌํŠธ ์ƒ์„ฑ
pnpm test:coverage

ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€:

  • scripts/utils/hashing.ts - ํ•ด์‹œ ์ƒ์„ฑ ํ•จ์ˆ˜
  • scripts/utils/dictionary.ts - ๋‹จ์–ด์‚ฌ์ „ ๋กœ๋” (TOML ํŒŒ์ผ ์ฝ๊ธฐ)
  • scripts/parser/yaml.ts - YAML ํŒŒ์„œ
  • scripts/utils/translation-validator.ts - ๋ฒˆ์—ญ ๊ฒ€์ฆ ๋กœ์ง
  • scripts/utils/delay.ts - ์ง€์—ฐ ์œ ํ‹ธ๋ฆฌํ‹ฐ
  • scripts/utils/cache.ts - ์บ์‹ฑ ์‹œ์Šคํ…œ
  • scripts/utils/queue.ts - ํ ๊ด€๋ฆฌ ๋ฐ ์žฌ์‹œ๋„ ๋กœ์ง

์‚ฌ์šฉ๋ฒ•

๊ธฐ๋ณธ ๋ฒˆ์—ญ

# CK3 ๋ชจ๋“œ ๋ฒˆ์—ญ
pnpm ck3

# Victoria 3 ๋ชจ๋“œ ๋ฒˆ์—ญ
pnpm vic3

# Stellaris ๋ชจ๋“œ ๋ฒˆ์—ญ
pnpm stellaris

์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ช…๋ น์–ด

# upstream ์ €์žฅ์†Œ ์—…๋ฐ์ดํŠธ (์†Œ์Šค ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ)
pnpm upstream                  # ๋ชจ๋“  ๊ฒŒ์ž„์˜ ๋ชจ๋“  ๋ชจ๋“œ ์—…๋ฐ์ดํŠธ
pnpm upstream ck3              # CK3 ๊ฒŒ์ž„์˜ ๋ชจ๋“  ๋ชจ๋“œ ์—…๋ฐ์ดํŠธ
pnpm upstream vic3             # VIC3 ๊ฒŒ์ž„์˜ ๋ชจ๋“  ๋ชจ๋“œ ์—…๋ฐ์ดํŠธ
pnpm upstream stellaris        # Stellaris ๊ฒŒ์ž„์˜ ๋ชจ๋“  ๋ชจ๋“œ ์—…๋ฐ์ดํŠธ
pnpm upstream ck3 RICE         # CK3 ๊ฒŒ์ž„์˜ RICE ๋ชจ๋“œ๋งŒ ์—…๋ฐ์ดํŠธ
pnpm upstream vic3 "Better Politics Mod"  # VIC3์˜ Better Politics Mod๋งŒ ์—…๋ฐ์ดํŠธ

# upstream ๋ช…๋ น์–ด ๋„์›€๋ง
pnpm upstream --help

# ํŒŒ์ผ ํ•ด์‹œ๋งŒ ์—…๋ฐ์ดํŠธ (๋ฒˆ์—ญ ์—†์ด)
pnpm ck3:update-hash
pnpm vic3:update-hash
pnpm stellaris:update-hash

# ๋‹จ์–ด์‚ฌ์ „ ๊ธฐ๋ฐ˜ ๋ฒˆ์—ญ ๋ฌดํšจํ™” (์žฌ๋ฒˆ์—ญ ์ค€๋น„)
pnpm ck3:update-dict
pnpm vic3:update-dict
pnpm stellaris:update-dict

# ๋‹จ์–ด์‚ฌ์ „ ๋ฌดํšจํ™” - ์ปค๋ฐ‹ ๊ธฐ๋ฐ˜ ํ•„ํ„ฐ๋ง (ํŠน์ • ๋ณ€๊ฒฝ์‚ฌํ•ญ๋งŒ ๋ฌดํšจํ™”)
pnpm ck3:update-dict -- --since-commit HEAD~3        # ์ตœ๊ทผ 3๊ฐœ ์ปค๋ฐ‹ ์ดํ›„
pnpm ck3:update-dict -- --commit-range abc..def      # ์ปค๋ฐ‹ ๋ฒ”์œ„
pnpm ck3:update-dict -- --since-date "2024-01-01"    # ๋‚ ์งœ ์ดํ›„

# ์ž˜๋ชป ๋ฒˆ์—ญ๋œ ํ•ญ๋ชฉ ์žฌ๋ฒˆ์—ญ
pnpm ck3:retranslate
pnpm vic3:retranslate
pnpm stellaris:retranslate

# meta.toml์˜ transliteration_files ๋ณ€๊ฒฝ๋ถ„์— ๋งž์ถฐ ์Œ์—ญ ๋Œ€์ƒ ํŒŒ์ผ ์žฌ๋ฌดํšจํ™”
pnpm ck3:retransliteration -- --since-commit=HEAD
pnpm vic3:retransliteration -- --since-commit=HEAD
pnpm stellaris:retransliteration -- --since-commit=HEAD

๋‹จ์–ด์‚ฌ์ „ ๊ด€๋ฆฌ

Git ์ปค๋ฐ‹์—์„œ ํ•œ๊ตญ์–ด ๋ฒˆ์—ญ ํŒŒ์ผ์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ถ”์ถœํ•˜์—ฌ TOML ๋‹จ์–ด์‚ฌ์ „์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

# ์ปค๋ฐ‹ ID๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ํ•ด๋‹น ์ปค๋ฐ‹์˜ *_l_korean.yml ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ถ”์ถœํ•˜์—ฌ TOML ์‚ฌ์ „์— ์ถ”๊ฐ€
pnpm add-dict <commit-id>

# ์˜ˆ์‹œ
pnpm add-dict abc123

๊ธฐ๋Šฅ:

  • ์ปค๋ฐ‹์˜ ํ•œ๊ตญ์–ด ๋ฒˆ์—ญ ํŒŒ์ผ(*_l_korean.yml)์—์„œ ์ถ”๊ฐ€๋œ ํ•ญ๋ชฉ๋งŒ ์ถ”์ถœ
  • ์˜์–ด ์›๋ฌธ์€ ์—…์ŠคํŠธ๋ฆผ ํŒŒ์ผ์—์„œ ์ž๋™์œผ๋กœ ๋งค์นญ
  • CK3, Stellaris, VIC3 ๋ชจ๋“  ๊ฒŒ์ž„ ํƒ€์ž… ์ง€์›
  • ์ž๋™ ์ค‘๋ณต ๊ฒ€์‚ฌ๋กœ ๊ธฐ์กด ํ•ญ๋ชฉ์€ ๊ฑด๋„ˆ๋œ€
  • ํ•ด๋‹น ๊ฒŒ์ž„์˜ TOML ํŒŒ์ผ์— ์ž๋™ ์ €์žฅ (์˜ˆ: dictionaries/ck3-glossary.toml)

์‚ฌ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค:

  • ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜๋‚˜ ๊ณผ๊ฑฐ ์ปค๋ฐ‹์—์„œ ๊ฒ€์ฆ๋œ ๋ฒˆ์—ญ์„ ๋‹จ์–ด์‚ฌ์ „์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ๋•Œ
  • ์—ฌ๋Ÿฌ ์ปค๋ฐ‹์— ๋ถ„์‚ฐ๋œ ๋ฒˆ์—ญ์„ ๋‹จ์–ด์‚ฌ์ „์œผ๋กœ ํ†ตํ•ฉํ•  ๋•Œ
  • ํŒ€์›์ด ์ž‘์„ฑํ•œ ๋ฒˆ์—ญ์„ ๋‹จ์–ด์‚ฌ์ „์— ์ถ”๊ฐ€ํ•  ๋•Œ

ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •

.env ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ๋‹ค์Œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜์„ธ์š”:

GOOGLE_AI_STUDIO_TOKEN=your_api_key_here   # ํ•„์ˆ˜: Google AI Studio ํ† ํฐ
# ์„ ํƒ: ๊ตฌํ‚ค๋„ ํ—ˆ์šฉ
GOOGLE_GENERATIVE_AI_API_KEY=legacy_api_key
# ์„ ํƒ: GitHub API ์ธ์ฆ(๋ ˆ์ดํŠธ ๋ฆฌ๋ฐ‹ ์™„ํ™”, ๋Œ€์‹œ๋ณด๋“œ/๋ฒ„์ „ ์กฐํšŒ ์•ˆ์ •ํ™”)
GITHUB_TOKEN=github_pat_xxx

# ์‹คํ–‰ ์˜ต์…˜
LOG_LEVEL=info
TRANSLATE_BATCH_SIZE=10
TRANSLATION_TIMEOUT_MINUTES=15
TRANSLATE_MOD_CONCURRENCY=4
GEMINI_MODEL=gemini-flash-lite-latest
  • GOOGLE_AI_STUDIO_TOKEN: ai-sdk.dev์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ณธ Gemini API ํ‚ค์ž…๋‹ˆ๋‹ค.
  • GOOGLE_GENERATIVE_AI_API_KEY: (์„ ํƒ) ๊ธฐ์กด Gemini SDK ํ‚ค. ์กด์žฌํ•˜๋ฉด ํด๋ฐฑ์šฉ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • GITHUB_TOKEN: (์„ ํƒ) GitHub API ํ˜ธ์ถœ ์‹œ ์ธ์ฆ ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•ด ๋ ˆ์ดํŠธ ๋ฆฌ๋ฐ‹์„ ์™„ํ™”ํ•ฉ๋‹ˆ๋‹ค. ์—…์ŠคํŠธ๋ฆผ ๋Œ€์‹œ๋ณด๋“œ์™€ GitHub ๊ธฐ๋ฐ˜ ๋ฒ„์ „ ์กฐํšŒ ์•ˆ์ •ํ™”์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • TRANSLATE_BATCH_SIZE: ๋ฒŒํฌ ๋ฒˆ์—ญ ์‹œ ํ•œ ๋ฒˆ์— ์š”์ฒญํ•  ํ•ญ๋ชฉ ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • TRANSLATION_TIMEOUT_MINUTES: ๋ฒˆ์—ญ ์ž‘์—… ํƒ€์ž„์•„์›ƒ(๋ถ„)์ž…๋‹ˆ๋‹ค. false ๋˜๋Š” 0์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๋น„ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.
  • TRANSLATE_MOD_CONCURRENCY: ๋ชจ๋“œ ๋‹จ์œ„ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ๋™์‹œ์„ฑ์ž…๋‹ˆ๋‹ค. ๋ฏธ์„ค์ • ์‹œ ๋ชจ๋“œ ๊ฐœ์ˆ˜๋งŒํผ ์ž๋™ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
  • GEMINI_MODEL: ์‚ฌ์šฉํ•  Gemini ๋ชจ๋ธ ID์ž…๋‹ˆ๋‹ค. ๋ฏธ์„ค์ • ์‹œ ์ฝ”๋“œ ๊ธฐ๋ณธ๊ฐ’(gemini-flash-lite-latest)์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

.
โ”œโ”€โ”€ ck3/                    # CK3 ๋ชจ๋“œ ๋ฐ ๋ฒˆ์—ญ ํŒŒ์ผ
โ”œโ”€โ”€ vic3/                   # Victoria 3 ๋ชจ๋“œ ๋ฐ ๋ฒˆ์—ญ ํŒŒ์ผ
โ”œโ”€โ”€ stellaris/              # Stellaris ๋ชจ๋“œ ๋ฐ ๋ฒˆ์—ญ ํŒŒ์ผ
โ”œโ”€โ”€ scripts/
โ”‚   โ”œโ”€โ”€ add-dict-from-commit.ts  # Git ์ปค๋ฐ‹์—์„œ ๋‹จ์–ด์‚ฌ์ „ ์ถ”๊ฐ€ ์Šคํฌ๋ฆฝํŠธ
โ”‚   โ”œโ”€โ”€ ck3.ts                   # CK3 ๋ฒˆ์—ญ ์Šคํฌ๋ฆฝํŠธ
โ”‚   โ”œโ”€โ”€ vic3.ts                  # VIC3 ๋ฒˆ์—ญ ์Šคํฌ๋ฆฝํŠธ
โ”‚   โ”œโ”€โ”€ stellaris.ts             # Stellaris ๋ฒˆ์—ญ ์Šคํฌ๋ฆฝํŠธ
โ”‚   โ”œโ”€โ”€ factory/                 # ๋ฒˆ์—ญ ์ฒ˜๋ฆฌ ๋กœ์ง
โ”‚   โ”œโ”€โ”€ parser/                  # ํŒŒ์ผ ํŒŒ์‹ฑ ์œ ํ‹ธ๋ฆฌํ‹ฐ
โ”‚   โ””โ”€โ”€ utils/
โ”‚       โ”œโ”€โ”€ dictionary.ts        # ๋‹จ์–ด์‚ฌ์ „ ๋กœ๋” (TOML ํŒŒ์ผ ์ฝ๊ธฐ)
โ”‚       โ”œโ”€โ”€ prompts.ts           # ํ”„๋กฌํ”„ํŠธ ๋กœ๋”
โ”‚       โ”œโ”€โ”€ ai.ts                # AI ํ†ตํ•ฉ
โ”‚       โ”œโ”€โ”€ cache.ts             # ์บ์‹ฑ ์‹œ์Šคํ…œ
โ”‚       โ””โ”€โ”€ logger.ts            # ๋กœ๊น… ์œ ํ‹ธ๋ฆฌํ‹ฐ
โ”œโ”€โ”€ dictionaries/                # ๋‹จ์–ด์‚ฌ์ „ ํŒŒ์ผ (TOML ํ˜•์‹)
โ”‚   โ”œโ”€โ”€ ck3-glossary.toml       # CK3 ์ผ๋ฐ˜ ์šฉ์–ด
โ”‚   โ”œโ”€โ”€ ck3-proper-nouns.toml   # CK3 ๊ณ ์œ ๋ช…์‚ฌ
โ”‚   โ”œโ”€โ”€ stellaris.toml          # Stellaris ์‚ฌ์ „
โ”‚   โ””โ”€โ”€ vic3.toml               # VIC3 ์‚ฌ์ „
โ”œโ”€โ”€ prompts/                     # AI ํ”„๋กฌํ”„ํŠธ ํŒŒ์ผ (Markdown ํ˜•์‹)
โ”‚   โ”œโ”€โ”€ ck3-translation.md      # CK3 ๋ฒˆ์—ญ ํ”„๋กฌํ”„ํŠธ
โ”‚   โ”œโ”€โ”€ ck3-transliteration.md  # CK3 ์Œ์—ญ ํ”„๋กฌํ”„ํŠธ
โ”‚   โ””โ”€โ”€ ...                     # ๊ธฐํƒ€ ๊ฒŒ์ž„ ํ”„๋กฌํ”„ํŠธ
โ””โ”€โ”€ package.json

๋ฒˆ์—ญ ํ”„๋กœ์„ธ์Šค

  1. Upstream ์—…๋ฐ์ดํŠธ: ์ตœ์‹  ์†Œ์Šค ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ (sparse checkout ์‚ฌ์šฉ). ํŠน์ • ๋ชจ๋“œ๋งŒ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด --mod ์˜ต์…˜์ด ์•„๋‹ˆ๋ผ ๋ชจ๋“œ๋ช…์„ positional ์ธ์ž๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: pnpm ck3 RICE, pnpm ck3 updateDict RICE ...). ์ด ๊ฒฝ์šฐ ํ•ด๋‹น ๋ชจ๋“œ์˜ upstream๋งŒ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค.
  2. ํŒŒ์ผ ๋ฐœ๊ฒฌ: meta.toml ๊ธฐ๋ฐ˜ ๋ชจ๋“œ ๊ตฌ์„ฑ ๋กœ๋“œ
  3. ํŒŒ์‹ฑ: YAML ํ˜„์ง€ํ™” ํŒŒ์ผ ํŒŒ์‹ฑ (l_english โ†’ l_korean)
  4. ๋ชจ๋“œ ๊ฐ์ง€: ํŒŒ์ผ๋ช… ๊ธฐ๋ฐ˜ ์ž๋™ ๋ฒˆ์—ญ/์Œ์—ญ ๋ชจ๋“œ ์ „ํ™˜
  5. ํ•ด์‹ฑ: ๋‚ด์šฉ ๊ธฐ๋ฐ˜ ํ•ด์‹œ๋กœ ๋ณ€๊ฒฝ์‚ฌํ•ญ ๊ฐ์ง€
  6. ๋ฒˆ์—ญ/์Œ์—ญ: AI ๋ฒˆ์—ญ ๋˜๋Š” ์Œ์—ญ (๊ฒŒ์ž„๋ณ„ ์ปจํ…์ŠคํŠธ ๋ฐ ๊ณ ์œ ๋ช…์‚ฌ ์‚ฌ์ „ ํฌํ•จ). ๋ฒŒํฌ ์š”์ฒญ ์‹œ ๋™์ผ ํ…์ŠคํŠธ๋Š” ๋‹จ์ผ AI ํ˜ธ์ถœ๋กœ ๋ณ‘ํ•ฉํ•˜์—ฌ ์ค‘๋ณต ์ „์†ก์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  7. ์บ์‹ฑ: ๋ฒˆ์—ญ ๊ฒฐ๊ณผ ์ €์žฅ (๋ฒˆ์—ญ/์Œ์—ญ ๋ณ„๋„ ์บ์‹œ๋กœ ์ค‘๋ณต ๋ฐฉ์ง€)
  8. ์ถœ๋ ฅ: ํ•œ๊ตญ์–ด ํŒŒ์ผ ์ƒ์„ฑ (___ ์ ‘๋‘์‚ฌ๋กœ ๋กœ๋“œ ์ˆœ์„œ ๋ณด์žฅ). ์†Œ์Šค ์–ธ์–ด๊ฐ€ korean์ธ ๊ฒฝ์šฐ ๊ธฐ์กด ___ ์ ‘๋‘์‚ฌ๋ฅผ ์ œ๊ฑฐํ•œ ๋’ค ์ƒˆ ์ ‘๋‘์‚ฌ๋ฅผ ๋ถ™์—ฌ ์ด์ค‘ ์ ‘๋‘์‚ฌ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์—…์ŠคํŠธ๋ฆผ ํŒŒ์ผ๋ช…์ด ๋Œ€์†Œ๋ฌธ์ž๋งŒ ๋ฐ”๋€ ๊ฒฝ์šฐ์—๋Š” ์ด์ „ ํ•œ๊ตญ์–ด ํŒŒ์ผ์„ ์ œ๊ฑฐํ•ด ์ค‘๋ณต ํŒŒ์ผ ์ž”์กด์„ ๋ง‰์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ/๋ฏธ๋ณ€๊ฒฝ ํ‚ค๊ฐ€ ์„ž์—ฌ ์žˆ์–ด๋„ ์›๋ณธ ํ‚ค ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•ด ํŒŒ์ผ diff ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

์Œ์—ญ ๋ชจ๋“œ (Transliteration Mode)

ํŒŒ์ผ๋ช… ๋˜๋Š” ํ‚ค ์ด๋ฆ„์— ํŠน์ • ํŒจํ„ด์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ, ์˜๋ฏธ ๋ฒˆ์—ญ์ด ์•„๋‹Œ ๋ฐœ์Œ ๊ธฐ๋ฐ˜ ์Œ์—ญ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ ๋‹จ์œ„ ์Œ์—ญ ๋ชจ๋“œ

ํŒŒ์ผ๋ช…์— ํŠน์ • ํ‚ค์›Œ๋“œ๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ์šฐ ์ „์ฒด ํŒŒ์ผ์„ ์Œ์—ญ ๋ชจ๋“œ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ž๋™ ๊ฐ์ง€ ํ‚ค์›Œ๋“œ:

  • culture / cultures - ๋ฌธํ™” ์ด๋ฆ„
  • dynasty / dynasties - ์™•์กฐ ์ด๋ฆ„
  • names - ์ด๋ฆ„ ๋ชฉ๋ก
  • character_name - ์บ๋ฆญํ„ฐ ์ด๋ฆ„
  • name_list - ์ด๋ฆ„ ๋ฆฌ์ŠคํŠธ

์˜ˆ์‹œ:

ํŒŒ์ผ: culture_name_lists_l_english.yml
์ž๋™ ๊ฐ์ง€: โœ“ ์Œ์—ญ ๋ชจ๋“œ ํ™œ์„ฑํ™”

"Afar" โ†’ "์•„ํŒŒ๋ฅด" (์Œ์—ญ)
"Anglo-Saxon" โ†’ "์•ต๊ธ€๋กœ์ƒ‰์Šจ" (์Œ์—ญ)

vs.

ํŒŒ์ผ: events_l_english.yml  
์ž๋™ ๊ฐ์ง€: ๋ฒˆ์—ญ ๋ชจ๋“œ

"Afar" โ†’ "๋ฉ€๋ฆฌ" (์˜๋ฏธ ๋ฒˆ์—ญ)

ํ‚ค ๋‹จ์œ„ ์Œ์—ญ ๋ชจ๋“œ

์ผ๋ฐ˜ ๋ฒˆ์—ญ ํŒŒ์ผ ๋‚ด์—์„œ๋„ ํŠน์ • ํ‚ค ํŒจํ„ด์€ ์Œ์—ญ ๋ชจ๋“œ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

์ž๋™ ๊ฐ์ง€ ํŒจํ„ด:

  • dynn_* - ์™•์กฐ ์ด๋ฆ„ (์˜ˆ: dynn_Austmadur, dynn_RICE_leslie)
  • dynnp_* - ์™•์กฐ ์ ‘๋‘์‚ฌ (์˜ˆ: dynnp_al-, dynnp_de, dynnp_banu)
  • *_adj - ํ˜•์šฉ์‚ฌํ˜• ๊ณ ์œ ๋ช…์‚ฌ (์˜ˆ: dyn_c_pingnan_guo_adj)
  • *_name - ์ด๋ฆ„ (์˜ˆ: dynasty_name, culture_name)

์ œ์™ธ ๊ทœ์น™:

  • *_desc, *_event, *_decision ๋“ฑ์œผ๋กœ ๋๋‚˜๋Š” ํ‚ค๋Š” ์ผ๋ฐ˜ ๋ฒˆ์—ญ ์‚ฌ์šฉ
  • ์„ค๋ช…, ์ด๋ฒคํŠธ, ๊ฒฐ์ • ๋“ฑ์˜ ์ปจํ…์ŠคํŠธ๋Š” ์˜๋ฏธ ๋ฒˆ์—ญ ํ•„์š”

์˜ˆ์‹œ:

# ์ผ๋ฐ˜ ๋ฒˆ์—ญ ํŒŒ์ผ ๋‚ด์—์„œ๋„ ํ‚ค ๋‹จ์œ„๋กœ ์Œ์—ญ ์ ์šฉ
# events_l_english.yml
dynn_Austmadur:0 "Austmadur"        โ†’ "์•„์šฐ์ŠคํŠธ๋งˆ๋‘๋ฅด" (์Œ์—ญ)
culture_name:0 "Korean"              โ†’ "ํ•œ๊ตญ์ธ" (์Œ์—ญ)
culture_adj:0 "Korean"               โ†’ "ํ•œ๊ตญ์˜" (์Œ์—ญ)
heritage_desc:0 "Korean heritage"    โ†’ "ํ•œ๊ตญ ์œ ์‚ฐ" (์˜๋ฏธ ๋ฒˆ์—ญ, _desc๋กœ ๋๋‚จ)

ํŠน์ง•:

  • ๊ณ ์œ ๋ช…์‚ฌ ์‚ฌ์ „ ํ™œ์šฉ (ck3ProperNouns ๋“ฑ)
  • ๋ณ„๋„ ์บ์‹œ ๊ด€๋ฆฌ (transliteration: prefix)
  • ๊ธฐ์กด ๋ฒˆ์—ญ ์บ์‹œ์™€ ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘
  • ์™„์ „ ์ž๋™, ์ˆ˜๋™ ์„ค์ • ๋ถˆํ•„์š”
  • ํŒŒ์ผ ๋‹จ์œ„์™€ ํ‚ค ๋‹จ์œ„ ๊ฐ์ง€๋ฅผ ๋ชจ๋‘ ์ง€์›
  • meta.toml์˜ upstream.transliteration_files๋กœ ํŒŒ์ผ๋ช…/์™€์ผ๋“œ์นด๋“œ ํŒจํ„ด์„ ์ˆ˜๋™ ์ง€์ • ๊ฐ€๋Šฅ

๋ฒˆ์—ญ ๊ฒฐ๊ณผ sanitize

  • AI ์‘๋‹ต, ์บ์‹œ, ๋‹จ์–ด์‚ฌ์ „, YAML ์ž…์ถœ๋ ฅ์—์„œ U+200E(Left-to-Right Mark) ๋ฌธ์ž๋ฅผ ์ œ๊ฑฐํ•ด Paradox localization ํ‚ค/๊ฐ’ ์˜ค์—ผ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹ซ๋Š” ๋ณ€์ˆ˜ ๋งˆ์ปค ๋’ค์— ๋ฐ”๋กœ [๊ฐ€ ์˜ค๋Š” $[ ํ˜•ํƒœ๋Š” ๊ณต๋ฐฑ์„ ๋ณด์ •ํ•ด ์ž˜๋ชป๋œ ๋ณ€์ˆ˜ ๊ตฌ๋ฌธ์ด ์ถœ๋ ฅ๋˜์ง€ ์•Š๋„๋ก ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ž๋™ํ™” ์›Œํฌํ”Œ๋กœ์šฐ

๋‹จ์–ด์‚ฌ์ „ ์ž๋™ ๋ฌดํšจํ™”

๋‹จ์–ด์‚ฌ์ „ ํŒŒ์ผ(dictionaries/*.toml)์ด ์—…๋ฐ์ดํŠธ๋˜๋ฉด ์ž๋™์œผ๋กœ ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. ์ž๋™ ํŠธ๋ฆฌ๊ฑฐ: main ๋ธŒ๋žœ์น˜์— dictionaries/ ๋””๋ ‰ํ† ๋ฆฌ์˜ ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋˜๋ฉด GitHub Actions ์›Œํฌํ”Œ๋กœ์šฐ๊ฐ€ ์ž๋™ ์‹คํ–‰
  2. ์บ์‹œ ๋ฌดํšจํ™”: ๊ฐ ๊ฒŒ์ž„(CK3, Stellaris, VIC3)์— ๋Œ€ํ•ด ๋‹จ์–ด์‚ฌ์ „ ๊ธฐ๋ฐ˜ ๋ฒˆ์—ญ ๋ฌดํšจํ™” (update-dict)
  3. ์žฌ๋ฒˆ์—ญ: ์ž˜๋ชป ๋ฒˆ์—ญ๋œ ํ•ญ๋ชฉ ์žฌ๋ฒˆ์—ญ (retranslate)
  4. ์ž๋™ ์ปค๋ฐ‹: ๋ณ€๊ฒฝ์‚ฌํ•ญ ์ž๋™ ์ปค๋ฐ‹ ๋ฐ ํ‘ธ์‹œ

์ด๋ฅผ ํ†ตํ•ด ๋‹จ์–ด์‚ฌ์ „์— ์ƒˆ๋กœ์šด ์šฉ์–ด๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด ๋ฒˆ์—ญ์„ ์ˆ˜์ •ํ•˜๋ฉด ์ž๋™์œผ๋กœ ๋ชจ๋“  ๊ฒŒ์ž„์˜ ๋ฒˆ์—ญ์ด ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.

์›Œํฌํ”Œ๋กœ์šฐ ํŒŒ์ผ: .github/workflows/invalidate-on-dictionary-update.yml

๋ฒˆ์—ญ ๊ฑฐ๋ถ€ ํ•ญ๋ชฉ ์ž๋™ ์ด์Šˆ ๋“ฑ๋ก

๋ฒˆ์—ญ ๊ณผ์ •์—์„œ AI๊ฐ€ ๋ฒˆ์—ญ์„ ๊ฑฐ๋ถ€ํ•œ ํ•ญ๋ชฉ(์˜ˆ: ์•ˆ์ „์„ฑ ํ•„ํ„ฐ, ์ฝ˜ํ…์ธ  ์ •์ฑ… ์œ„๋ฐ˜ ๋“ฑ)์„ ์ž๋™์œผ๋กœ ์ถ”์ ํ•˜๊ณ  GitHub Issues๋กœ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค:

  1. ์ž๋™ ๊ฐ์ง€: ๋ฒˆ์—ญ ์ค‘ AI๊ฐ€ ๊ฑฐ๋ถ€ํ•œ ํ•ญ๋ชฉ์„ ์ž๋™์œผ๋กœ ์ˆ˜์ง‘
  2. ์ค‘๊ฐ„ ์ €์žฅ: ๋ฒˆ์—ญ ๊ฑฐ๋ถ€ ๋ฐœ์ƒ ์‹œ ์ฒ˜๋ฆฌ๋œ ํ•ญ๋ชฉ๊นŒ์ง€ gracefulํ•˜๊ฒŒ ์ €์žฅ
  3. ์ด์Šˆ ์ƒ์„ฑ: ๋ชจ๋“œ๋ณ„๋กœ ๊ทธ๋ฃนํ™”ํ•˜์—ฌ GitHub Issues ์ž๋™ ์ƒ์„ฑ
  4. ๋ ˆ์ด๋ธ” ํƒœ๊น…: translation-refused, ๊ฒŒ์ž„๋ณ„ ๋ ˆ์ด๋ธ”(์˜ˆ: ck3) ์ž๋™ ๋ถ€์—ฌ

๋ฒˆ์—ญ ๊ฑฐ๋ถ€ ํ•ญ๋ชฉ์€ {game}-untranslated-items.json ํŒŒ์ผ์— ์ €์žฅ๋˜๋ฉฐ, ๋‹ค์Œ ์ •๋ณด๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค:

  • ๋ชจ๋“œ ์ด๋ฆ„
  • ํŒŒ์ผ ๊ฒฝ๋กœ
  • ํ‚ค ์ด๋ฆ„
  • ์›๋ณธ ๋ฉ”์‹œ์ง€

๊ด€๋ จ ์›Œํฌํ”Œ๋กœ์šฐ: .github/workflows/translate-ck3.yml, translate-vic3.yml, translate-stellaris.yml

ํด๋ฐฑ ๋ฒˆ์—ญ ์›Œํฌํ”Œ๋กœ์šฐ: translation-refused ์ด์Šˆ๋ฅผ ์ž๋™์œผ๋กœ ํƒ์ƒ‰ํ•ด ํด๋ฐฑ ๋ฒˆ์—ญ์„ ์ ์šฉํ•˜๊ณ  ์ปค๋ฐ‹ํ•˜๋Š” ์ „์šฉ ์›Œํฌํ”Œ๋กœ์šฐ(.github/workflows/fallback-translate-on-translation-refused.yml)๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์—…์ŠคํŠธ๋ฆผ ๋ฒˆ์—ญ ๋ฏธ๋ฐ˜์˜ ๋Œ€์‹œ๋ณด๋“œ

์—…์ŠคํŠธ๋ฆผ ์ €์žฅ์†Œ๊ฐ€ ๊ฐฑ์‹ ๋์ง€๋งŒ ๋ฒˆ์—ญ์ด ๋”ฐ๋ผ๊ฐ€์ง€ ๋ชปํ•œ ๋ชจ๋“œ๋ฅผ ์ž๋™ ์ง‘๊ณ„ํ•˜์—ฌ ์ด์Šˆ ๋Œ€์‹œ๋ณด๋“œ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • ์›Œํฌํ”Œ๋กœ์šฐ: .github/workflows/upstream-translation-dashboard.yml (12์‹œ๊ฐ„๋งˆ๋‹ค ์Šค์ผ€์ค„ ์‹คํ–‰ + ์ˆ˜๋™ workflow_dispatch)
  • ๋นŒ๋“œ: pnpm exec jiti scripts/upstream-dashboard.ts โ†’ upstream-dashboard.md ์ƒ์„ฑ (GitHub API/GraphQL๋กœ ํƒœ๊ทธยท์ปค๋ฐ‹ ๋น„๊ต, GITHUB_TOKEN ์„ค์ • ์‹œ ์ธ์ฆ ์‚ฌ์šฉ, annotated ํƒœ๊ทธ ์ง€์›)
  • ๊ฒŒ์‹œ: ์ œ๋ชฉ [๋Œ€์‹œ๋ณด๋“œ] ์—…์ŠคํŠธ๋ฆผ ๋ณ€๊ฒฝ ๋Œ€๋น„ ๋ฒˆ์—ญ ๋ฏธ๋ฐ˜์˜ ํ˜„ํ™ฉ, ๋ผ๋ฒจ upstream-dashboard ๋กœ ์ด์Šˆ ์ƒ์„ฑยท๊ฐฑ์‹ . ๋™์ผ ์ œ๋ชฉ์˜ ์ด์Šˆ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์กด์žฌํ•  ๊ฒฝ์šฐ ๋ฒˆํ˜ธ๊ฐ€ ๊ฐ€์žฅ ๋‚ฎ์€ ์ด์Šˆ๋งŒ ์œ ์ง€ํ•˜๊ณ  ๋‚˜๋จธ์ง€ ์ค‘๋ณต ์ด์Šˆ๋ฅผ ์ž๋™์œผ๋กœ ๋‹ซ์Šต๋‹ˆ๋‹ค.
  • ์ค‘๋ณต ์‹คํ–‰ ๋ฐฉ์ง€: concurrency ๊ทธ๋ฃน(upstream-dashboard)์œผ๋กœ ๋™์‹œ ์‹คํ–‰์„ ์ง๋ ฌํ™”ํ•˜์—ฌ ์ค‘๋ณต ์ด์Šˆ ์ƒ์„ฑ์„ ์˜ˆ๋ฐฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋‚ด์šฉ: ๊ฒŒ์ž„/๋ชจ๋“œ๋ณ„ ์ถ”์  ๋ฐฉ์‹(tag/commit), ๊ธฐ์ค€ ๋ฒ„์ „ยท์ตœ์‹  ๋ฒ„์ „ ๊ฐ’์— ๋น„๊ต ๋งํฌ ํฌํ•จ, ๋ฏธ๋ฐ˜์˜ ์ˆ˜ ์ง‘๊ณ„
  • github ์ „๋žต์€ GitHub Releases์˜ ๊ณต๊ฐœ ๋ฆด๋ฆฌ์Šค๋งŒ ์‚ฌ์šฉํ•˜๋ฉฐ ํ”„๋ฆฌ๋ฆด๋ฆฌ์ฆˆ/๋“œ๋ž˜ํ”„ํŠธ๋Š” ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.
  • default ์ „๋žต์€ ๊ธฐ๋ณธ ๋ธŒ๋žœ์น˜ ์ „์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ upstream.localization ๊ฒฝ๋กœ์— ์˜ํ–ฅ์„ ์ค€ ์ตœ์‹  ์ปค๋ฐ‹์„ ๊ธฐ์ค€์œผ๋กœ ๋ฏธ๋ฐ˜์˜ ์—ฌ๋ถ€๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ["."]์ด๋ฉด ์ €์žฅ์†Œ ์ „์ฒด๋ฅผ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค.

๋ผ์ด์„ ์Šค

์ด ํ”„๋กœ์ ํŠธ๋Š” ์˜คํ”ˆ์†Œ์Šค์ž…๋‹ˆ๋‹ค.

About

Automated AI translation mod based on GitHub Actions

Resources

Stars

Watchers

Forks

Contributors