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=HEADGit ์ปค๋ฐ์์ ํ๊ตญ์ด ๋ฒ์ญ ํ์ผ์ ๋ณ๊ฒฝ์ฌํญ์ ์ถ์ถํ์ฌ 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-latestGOOGLE_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
- Upstream ์
๋ฐ์ดํธ: ์ต์ ์์ค ํ์ผ ๋ค์ด๋ก๋ (sparse checkout ์ฌ์ฉ). ํน์ ๋ชจ๋๋ง ์ฒ๋ฆฌํ๋ ค๋ฉด
--mod์ต์ ์ด ์๋๋ผ ๋ชจ๋๋ช ์ positional ์ธ์๋ก ์ง์ ํฉ๋๋ค(์:pnpm ck3 RICE,pnpm ck3 updateDict RICE ...). ์ด ๊ฒฝ์ฐ ํด๋น ๋ชจ๋์ upstream๋ง ๊ฐฑ์ ํฉ๋๋ค. - ํ์ผ ๋ฐ๊ฒฌ:
meta.toml๊ธฐ๋ฐ ๋ชจ๋ ๊ตฌ์ฑ ๋ก๋ - ํ์ฑ: YAML ํ์งํ ํ์ผ ํ์ฑ (
l_englishโl_korean) - ๋ชจ๋ ๊ฐ์ง: ํ์ผ๋ช ๊ธฐ๋ฐ ์๋ ๋ฒ์ญ/์์ญ ๋ชจ๋ ์ ํ
- ํด์ฑ: ๋ด์ฉ ๊ธฐ๋ฐ ํด์๋ก ๋ณ๊ฒฝ์ฌํญ ๊ฐ์ง
- ๋ฒ์ญ/์์ญ: AI ๋ฒ์ญ ๋๋ ์์ญ (๊ฒ์๋ณ ์ปจํ ์คํธ ๋ฐ ๊ณ ์ ๋ช ์ฌ ์ฌ์ ํฌํจ). ๋ฒํฌ ์์ฒญ ์ ๋์ผ ํ ์คํธ๋ ๋จ์ผ AI ํธ์ถ๋ก ๋ณํฉํ์ฌ ์ค๋ณต ์ ์ก์ ์ ๊ฑฐํฉ๋๋ค.
- ์บ์ฑ: ๋ฒ์ญ ๊ฒฐ๊ณผ ์ ์ฅ (๋ฒ์ญ/์์ญ ๋ณ๋ ์บ์๋ก ์ค๋ณต ๋ฐฉ์ง)
- ์ถ๋ ฅ: ํ๊ตญ์ด ํ์ผ ์์ฑ (
___์ ๋์ฌ๋ก ๋ก๋ ์์ ๋ณด์ฅ). ์์ค ์ธ์ด๊ฐkorean์ธ ๊ฒฝ์ฐ ๊ธฐ์กด___์ ๋์ฌ๋ฅผ ์ ๊ฑฐํ ๋ค ์ ์ ๋์ฌ๋ฅผ ๋ถ์ฌ ์ด์ค ์ ๋์ฌ๋ฅผ ๋ฐฉ์งํฉ๋๋ค. ์ ์คํธ๋ฆผ ํ์ผ๋ช ์ด ๋์๋ฌธ์๋ง ๋ฐ๋ ๊ฒฝ์ฐ์๋ ์ด์ ํ๊ตญ์ด ํ์ผ์ ์ ๊ฑฐํด ์ค๋ณต ํ์ผ ์์กด์ ๋ง์ต๋๋ค. ๋ณ๊ฒฝ/๋ฏธ๋ณ๊ฒฝ ํค๊ฐ ์์ฌ ์์ด๋ ์๋ณธ ํค ์์๋ฅผ ์ ์งํด ํ์ผ diff ์์ ์ฑ์ ๋ณด์ฅํฉ๋๋ค.
ํ์ผ๋ช ๋๋ ํค ์ด๋ฆ์ ํน์ ํจํด์ด ํฌํจ๋ ๊ฒฝ์ฐ, ์๋ฏธ ๋ฒ์ญ์ด ์๋ ๋ฐ์ ๊ธฐ๋ฐ ์์ญ์ ์ํํฉ๋๋ค.
ํ์ผ๋ช ์ ํน์ ํค์๋๊ฐ ํฌํจ๋ ๊ฒฝ์ฐ ์ ์ฒด ํ์ผ์ ์์ญ ๋ชจ๋๋ก ์ฒ๋ฆฌํฉ๋๋ค.
์๋ ๊ฐ์ง ํค์๋:
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๋ก ํ์ผ๋ช /์์ผ๋์นด๋ ํจํด์ ์๋ ์ง์ ๊ฐ๋ฅ
- AI ์๋ต, ์บ์, ๋จ์ด์ฌ์ , YAML ์ ์ถ๋ ฅ์์ U+200E(Left-to-Right Mark) ๋ฌธ์๋ฅผ ์ ๊ฑฐํด Paradox localization ํค/๊ฐ ์ค์ผ์ ๋ฐฉ์งํฉ๋๋ค.
- ๋ซ๋ ๋ณ์ ๋ง์ปค ๋ค์ ๋ฐ๋ก
[๊ฐ ์ค๋$[ํํ๋ ๊ณต๋ฐฑ์ ๋ณด์ ํด ์๋ชป๋ ๋ณ์ ๊ตฌ๋ฌธ์ด ์ถ๋ ฅ๋์ง ์๋๋ก ์ ๋ฆฌํฉ๋๋ค.
๋จ์ด์ฌ์ ํ์ผ(dictionaries/*.toml)์ด ์
๋ฐ์ดํธ๋๋ฉด ์๋์ผ๋ก ๋ค์ ์์
์ ์ํํฉ๋๋ค:
- ์๋ ํธ๋ฆฌ๊ฑฐ:
main๋ธ๋์น์dictionaries/๋๋ ํ ๋ฆฌ์ ํ์ผ์ด ๋ณ๊ฒฝ๋๋ฉด GitHub Actions ์ํฌํ๋ก์ฐ๊ฐ ์๋ ์คํ - ์บ์ ๋ฌดํจํ: ๊ฐ ๊ฒ์(CK3, Stellaris, VIC3)์ ๋ํด ๋จ์ด์ฌ์ ๊ธฐ๋ฐ ๋ฒ์ญ ๋ฌดํจํ (
update-dict) - ์ฌ๋ฒ์ญ: ์๋ชป ๋ฒ์ญ๋ ํญ๋ชฉ ์ฌ๋ฒ์ญ (
retranslate) - ์๋ ์ปค๋ฐ: ๋ณ๊ฒฝ์ฌํญ ์๋ ์ปค๋ฐ ๋ฐ ํธ์
์ด๋ฅผ ํตํด ๋จ์ด์ฌ์ ์ ์๋ก์ด ์ฉ์ด๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๊ธฐ์กด ๋ฒ์ญ์ ์์ ํ๋ฉด ์๋์ผ๋ก ๋ชจ๋ ๊ฒ์์ ๋ฒ์ญ์ด ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
์ํฌํ๋ก์ฐ ํ์ผ: .github/workflows/invalidate-on-dictionary-update.yml
๋ฒ์ญ ๊ณผ์ ์์ AI๊ฐ ๋ฒ์ญ์ ๊ฑฐ๋ถํ ํญ๋ชฉ(์: ์์ ์ฑ ํํฐ, ์ฝํ ์ธ ์ ์ฑ ์๋ฐ ๋ฑ)์ ์๋์ผ๋ก ์ถ์ ํ๊ณ GitHub Issues๋ก ๋ฑ๋กํฉ๋๋ค:
- ์๋ ๊ฐ์ง: ๋ฒ์ญ ์ค AI๊ฐ ๊ฑฐ๋ถํ ํญ๋ชฉ์ ์๋์ผ๋ก ์์ง
- ์ค๊ฐ ์ ์ฅ: ๋ฒ์ญ ๊ฑฐ๋ถ ๋ฐ์ ์ ์ฒ๋ฆฌ๋ ํญ๋ชฉ๊น์ง gracefulํ๊ฒ ์ ์ฅ
- ์ด์ ์์ฑ: ๋ชจ๋๋ณ๋ก ๊ทธ๋ฃนํํ์ฌ GitHub Issues ์๋ ์์ฑ
- ๋ ์ด๋ธ ํ๊น
:
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๊ฒฝ๋ก์ ์ํฅ์ ์ค ์ต์ ์ปค๋ฐ์ ๊ธฐ์ค์ผ๋ก ๋ฏธ๋ฐ์ ์ฌ๋ถ๋ฅผ ๊ณ์ฐํฉ๋๋ค.["."]์ด๋ฉด ์ ์ฅ์ ์ ์ฒด๋ฅผ ์ถ์ ํฉ๋๋ค.
์ด ํ๋ก์ ํธ๋ ์คํ์์ค์ ๋๋ค.