feat: 지정 게임 용어집 추가 (워독스·배그·R6·에이펙스)

사용자가 필수로 지정한 게임 중 오버워치를 뺀 세 개가 빠져 있었다.

- 레인보우 식스 시즈 67개 — 보강·하드브리치·앵커/로머·디퓨저·런아웃
- 배틀그라운드 66개 — 자기장·어부·낙하·파밍·3렙헬멧·스쿼드 콜
- 워치독스 59개 — 데드섹·ctOS·블룸·알비온 등 조직명과 해킹/잠입 용어
- 에이펙스 레전드 45개 — 링·배너·리스폰 비컨 (등등 항목으로 추가)

워치독스는 멀티 콜아웃이 아니라 스토리 대사가 주라, 번역기가 특히 잘 틀리는
고유명사(조직명)와 해킹 용어 위주로 골랐다.

전용 팩이 생긴 만큼 'FPS 공통' 설명을 장르 공통 콜로 좁혔다.
필수 게임이 빠지면 바로 잡히도록 test_required_games_are_bundled 추가.

번들 용어 304개 → 541개 (10개 팩)
검증: pytest 92개 통과, ruff clean

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
EJClaw
2026-09-21 17:54:20 +09:00
parent 8b36b244ff
commit a7eafd03e1
8 changed files with 662 additions and 57 deletions

View File

@@ -28,7 +28,7 @@
- **게임과 같이 써도 안 무겁게** — GPU를 얼마나 양보할지 직접 정합니다 (아래 참고)
- **디스코드식 자막 배치** — 모니터를 고르고 9칸 중 하나를 누르면 그 자리에 붙습니다
- **전역 단축키** — 게임 중에 `Ctrl+Alt+S` 로 자막을 껐다 켭니다
- **게임별 기본 용어집 내장** — 롤·발로란트·옵치2·마크·FPS공통·방송용어 **304개**
- **게임별 기본 용어집 내장** — 옵치2·워독스·배그·R6·롤·발로란트·에이펙스 등 **541개**
- **5단계 품질 선택** — 속도 우선(0.6초)부터 품질 우선까지
- **자막 자유 설정** — 글꼴·크기·색·외곽선·투명도·줄 수
- **추가학습** — 게임/방송 말투로 번역 모델을 LoRA 학습시킬 수 있습니다
@@ -160,12 +160,18 @@ VRAM이 넉넉하면 **모델** 화면에서 올리면 됩니다.
| 팩 | 개수 | 내용 |
|---|---|---|
| 리그 오브 레전드 | 74 | 바론·갱·억제기·한타·오브젝트 콜 |
| 레인보우 식스 시즈 | 67 | 보강·하드브리치·앵커/로머·디퓨저·파밸 |
| 배틀그라운드 | 66 | 자기장·어부·파밍·낙하·스쿼드 콜 |
| 발로란트 | 59 | 스파이크·설치·해체·이코·리테이크 |
| 워치독스 | 59 | 데드섹·ctOS·블룸·해킹/잠입 용어 |
| 오버워치 2 | 49 | 궁 게이지·거점·화물·역할군 |
| FPS 공통 | 46 | 배그·CS·에이펙스에서 두루 쓰는 교전/파티 콜 |
| FPS 공통 | 46 | 장르 전반의 총기·교전·파티 콜 |
| 에이펙스 레전드 | 45 | 링·배너·리스폰 비컨·스쿼드 콜 |
| 마인크래프트 | 38 | 블록·몹·차원 이름 (한국어판 공식 번역어) |
| 방송·스트리밍 | 38 | 후원·구독·클립·메타 등 방송 말투 |
게임별 팩 + `FPS 공통`을 같이 켜는 것을 권합니다. 겹치는 단어는 게임별 팩이 이깁니다.
![용어집 화면](docs/images/glossary.png)
### 직접 추가하기

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

After

Width:  |  Height:  |  Size: 112 KiB

View File

@@ -0,0 +1,52 @@
{
"key": "apex",
"name": "에이펙스 레전드",
"description": "링·배너·부활 등 스쿼드 콜. 배틀로얄 FPS를 같이 하신다면 켜두세요.",
"entries": [
{"source": "legend", "targets": {"ko": "레전드", "ja": "レジェンド", "zh": "传奇"}},
{"source": "ring", "targets": {"ko": "링", "ja": "リング", "zh": "圆圈"}},
{"source": "ring is closing", "targets": {"ko": "링 좁혀진다", "ja": "リングが縮む", "zh": "圈要缩了"}},
{"source": "jumpmaster", "targets": {"ko": "점프마스터", "ja": "ジャンプマスター", "zh": "跳伞指挥"}},
{"source": "hot zone", "targets": {"ko": "핫존", "ja": "ホットゾーン", "zh": "热区"}},
{"source": "care package", "targets": {"ko": "보급", "ja": "ケアパッケージ", "zh": "空投"}},
{"source": "banner", "targets": {"ko": "배너", "ja": "バナー", "zh": "旗帜"}},
{"source": "grab my banner", "targets": {"ko": "내 배너 챙겨", "ja": "バナー取って", "zh": "捡我旗帜"}},
{"source": "respawn beacon", "targets": {"ko": "리스폰 비컨", "ja": "リスポーンビーコン", "zh": "重生信标"}},
{"source": "survey beacon", "targets": {"ko": "조사 비컨", "ja": "調査ビーコン", "zh": "勘探信标"}},
{"source": "knocked", "targets": {"ko": "눕혔다", "ja": "ダウンさせた", "zh": "打倒了"}},
{"source": "thirsting", "targets": {"ko": "마무리", "ja": "追い打ち", "zh": "补刀"}},
{"source": "finisher", "targets": {"ko": "피니셔", "ja": "フィニッシャー", "zh": "处决"}},
{"source": "knockdown shield", "targets": {"ko": "녹다운 실드", "ja": "ノックダウンシールド", "zh": "击倒护盾"}},
{"source": "evo shield", "targets": {"ko": "진화 실드", "ja": "EVOシールド", "zh": "进化护盾"}},
{"source": "shield cell", "targets": {"ko": "실드 셀", "ja": "シールドセル", "zh": "小蓝"}},
{"source": "shield battery", "targets": {"ko": "실드 배터리", "ja": "シールドバッテリー", "zh": "大蓝"}},
{"source": "med kit", "targets": {"ko": "의료 키트", "ja": "医療キット", "zh": "大血包"}},
{"source": "syringe", "targets": {"ko": "주사기", "ja": "注射器", "zh": "小血包"}},
{"source": "phoenix kit", "targets": {"ko": "피닉스 키트", "ja": "フェニックスキット", "zh": "凤凰治疗包"}},
{"source": "heat shield", "targets": {"ko": "히트 실드", "ja": "ヒートシールド", "zh": "隔热罩"}},
{"source": "ult", "targets": {"ko": "궁", "ja": "アルト", "zh": "大招"}},
{"source": "ultimate accelerant", "targets": {"ko": "궁 가속제", "ja": "アルト促進剤", "zh": "大招加速器"}},
{"source": "tactical", "targets": {"ko": "전술 능력", "ja": "戦術アビリティ", "zh": "战术技能"}},
{"source": "passive", "targets": {"ko": "패시브", "ja": "パッシブ", "zh": "被动"}},
{"source": "zipline", "targets": {"ko": "집라인", "ja": "ジップライン", "zh": "索道"}},
{"source": "portal", "targets": {"ko": "포탈", "ja": "ポータル", "zh": "传送门"}},
{"source": "dome", "targets": {"ko": "돔", "ja": "ドーム", "zh": "护盾罩"}},
{"source": "gas", "targets": {"ko": "가스", "ja": "ガス", "zh": "毒气"}},
{"source": "wall", "targets": {"ko": "벽", "ja": "ウォール", "zh": "墙"}},
{"source": "attachment", "targets": {"ko": "부착물", "ja": "アタッチメント", "zh": "配件"}},
{"source": "purple", "targets": {"ko": "보라", "ja": "紫", "zh": "紫色"}},
{"source": "gold", "targets": {"ko": "금", "ja": "金", "zh": "金色"}},
{"source": "loot bin", "targets": {"ko": "보급 상자", "ja": "ルートビン", "zh": "物资箱"}},
{"source": "death box", "targets": {"ko": "데스박스", "ja": "デスボックス", "zh": "死亡盒"}},
{"source": "third party", "targets": {"ko": "어부", "ja": "漁夫", "zh": "第三方"}},
{"source": "rotate", "targets": {"ko": "로테", "ja": "ローテ", "zh": "转点"}},
{"source": "push them", "targets": {"ko": "밀어", "ja": "詰めよう", "zh": "推他们"}},
{"source": "back off", "targets": {"ko": "빠져", "ja": "引こう", "zh": "撤"}},
{"source": "high ground", "targets": {"ko": "고지", "ja": "高所", "zh": "高地"}},
{"source": "ping", "targets": {"ko": "핑", "ja": "ピン", "zh": "标记"}},
{"source": "ping it", "targets": {"ko": "핑 찍어", "ja": "ピンして", "zh": "标记一下"}},
{"source": "squad wiped", "targets": {"ko": "스쿼드 전멸", "ja": "スクワッド全滅", "zh": "小队团灭"}},
{"source": "champion", "targets": {"ko": "챔피언", "ja": "チャンピオン", "zh": "冠军"}},
{"source": "kill leader", "targets": {"ko": "킬 리더", "ja": "キルリーダー", "zh": "击杀王"}}
]
}

View File

@@ -1,53 +1,375 @@
{
"key": "fps-common",
"name": "FPS 공통 (배그·CS·에이펙스)",
"description": "총기·교전·파티 콜처럼 슈터 장르 전반에서 공통으로 쓰는 말.",
"name": "FPS 공통",
"description": "장르 전반에서 두루 쓰는 총기·교전·파티 콜. 게임별 팩과 같이 켜세요.",
"entries": [
{"source": "enemy", "targets": {"ko": "적", "ja": "敵", "zh": "敌人"}},
{"source": "enemy spotted", "targets": {"ko": "적 발견", "ja": "敵発見", "zh": "发现敌人"}},
{"source": "contact", "targets": {"ko": "교전", "ja": "接敵", "zh": "接敌"}},
{"source": "reloading", "targets": {"ko": "재장전 중", "ja": "リロード中", "zh": "换弹中"}},
{"source": "cover me", "targets": {"ko": "엄호해줘", "ja": "援護して", "zh": "掩护我"}},
{"source": "covering", "targets": {"ko": "엄호 중", "ja": "援護中", "zh": "掩护中"}},
{"source": "push", "targets": {"ko": "밀자", "ja": "押そう", "zh": "推进"}},
{"source": "fall back", "targets": {"ko": "후퇴", "ja": "後退", "zh": "撤退"}},
{"source": "hold", "targets": {"ko": "대기", "ja": "ホールド", "zh": "守住"}},
{"source": "knocked", "targets": {"ko": "기절", "ja": "ダウン", "zh": "被击倒"}},
{"source": "down", "targets": {"ko": "다운", "ja": "ダウン", "zh": "倒地"}},
{"source": "revive", "targets": {"ko": "부활", "ja": "リヴァイヴ", "zh": "复活"}},
{"source": "res", "targets": {"ko": "살려줘", "ja": "蘇生して", "zh": "救我"}},
{"source": "heal up", "targets": {"ko": "회복하자", "ja": "回復しよう", "zh": "回血"}},
{"source": "loot", "targets": {"ko": "파밍", "ja": "ルート", "zh": "搜物资"}},
{"source": "looting", "targets": {"ko": "파밍 중", "ja": "ルート中", "zh": "搜物资中"}},
{"source": "third party", "targets": {"ko": "어부", "ja": "漁夫", "zh": "第三方"}},
{"source": "zone", "targets": {"ko": "자기장", "ja": "安全地帯", "zh": "毒圈"}},
{"source": "circle", "targets": {"ko": "자기장", "ja": "サークル", "zh": "圈"}},
{"source": "storm", "targets": {"ko": "폭풍", "ja": "ストーム", "zh": "风暴"}},
{"source": "high ground", "targets": {"ko": "고지", "ja": "高所", "zh": "高地"}},
{"source": "flank", "targets": {"ko": "측면", "ja": "側面", "zh": "侧翼"}},
{"source": "behind us", "targets": {"ko": "뒤에 있다", "ja": "後ろにいる", "zh": "背后有人"}},
{"source": "on me", "targets": {"ko": "나한테 붙어", "ja": "ついてきて", "zh": "跟着我"}},
{"source": "grenade", "targets": {"ko": "수류탄", "ja": "グレネード", "zh": "手雷"}},
{"source": "nade", "targets": {"ko": "수류탄", "ja": "グレネード", "zh": "手雷"}},
{"source": "frag", "targets": {"ko": "파편탄", "ja": "フラグ", "zh": "破片雷"}},
{"source": "smoke", "targets": {"ko": "연막", "ja": "スモーク", "zh": "烟雾弹"}},
{"source": "flashbang", "targets": {"ko": "섬광탄", "ja": "フラッシュ", "zh": "闪光弹"}},
{"source": "scope", "targets": {"ko": "조준경", "ja": "スコープ", "zh": "瞄准镜"}},
{"source": "ADS", "targets": {"ko": "정조준", "ja": "ADS", "zh": "开镜"}},
{"source": "recoil", "targets": {"ko": "반동", "ja": "リコイル", "zh": "后坐力"}},
{"source": "spray control", "targets": {"ko": "반동 제어", "ja": "リコイル制御", "zh": "压枪"}},
{"source": "aim", "targets": {"ko": "에임", "ja": "エイム", "zh": "枪法"}},
{"source": "headshot", "targets": {"ko": "헤드샷", "ja": "ヘッドショット", "zh": "爆头"}},
{"source": "wall bang", "targets": {"ko": "관통샷", "ja": "ウォールバン", "zh": "穿墙"}},
{"source": "prefire", "targets": {"ko": "선샷", "ja": "プリファイア", "zh": "预瞄"}},
{"source": "camping", "targets": {"ko": "캠핑", "ja": "キャンプ", "zh": "蹲点"}},
{"source": "respawn", "targets": {"ko": "리스폰", "ja": "リスポーン", "zh": "重生"}},
{"source": "kill streak", "targets": {"ko": "연속 킬", "ja": "キルストリーク", "zh": "连杀"}},
{"source": "ammo", "targets": {"ko": "탄약", "ja": "弾薬", "zh": "子弹"}},
{"source": "out of ammo", "targets": {"ko": "탄 없음", "ja": "弾切れ", "zh": "没子弹"}},
{"source": "backup", "targets": {"ko": "지원", "ja": "バックアップ", "zh": "支援"}},
{"source": "good game", "targets": {"ko": "잘 했다", "ja": "GG", "zh": "打得好"}},
{"source": "nice shot", "targets": {"ko": "잘 쐈다", "ja": "ナイスショット", "zh": "好枪"}},
{"source": "my bad", "targets": {"ko": "내 실수", "ja": "ごめん", "zh": "我的错"}}
{
"source": "enemy",
"targets": {
"ko": "적",
"ja": "敵",
"zh": "敌人"
}
},
{
"source": "enemy spotted",
"targets": {
"ko": "적 발견",
"ja": "敵発見",
"zh": "发现敌人"
}
},
{
"source": "contact",
"targets": {
"ko": "교전",
"ja": "接敵",
"zh": "接敌"
}
},
{
"source": "reloading",
"targets": {
"ko": "재장전 중",
"ja": "リロード中",
"zh": "换弹中"
}
},
{
"source": "cover me",
"targets": {
"ko": "엄호해줘",
"ja": "援護して",
"zh": "掩护我"
}
},
{
"source": "covering",
"targets": {
"ko": "엄호 중",
"ja": "援護中",
"zh": "掩护中"
}
},
{
"source": "push",
"targets": {
"ko": "밀자",
"ja": "押そう",
"zh": "推进"
}
},
{
"source": "fall back",
"targets": {
"ko": "후퇴",
"ja": "後退",
"zh": "撤退"
}
},
{
"source": "hold",
"targets": {
"ko": "대기",
"ja": "ホールド",
"zh": "守住"
}
},
{
"source": "knocked",
"targets": {
"ko": "기절",
"ja": "ダウン",
"zh": "被击倒"
}
},
{
"source": "down",
"targets": {
"ko": "다운",
"ja": "ダウン",
"zh": "倒地"
}
},
{
"source": "revive",
"targets": {
"ko": "부활",
"ja": "リヴァイヴ",
"zh": "复活"
}
},
{
"source": "res",
"targets": {
"ko": "살려줘",
"ja": "蘇生して",
"zh": "救我"
}
},
{
"source": "heal up",
"targets": {
"ko": "회복하자",
"ja": "回復しよう",
"zh": "回血"
}
},
{
"source": "loot",
"targets": {
"ko": "파밍",
"ja": "ルート",
"zh": "搜物资"
}
},
{
"source": "looting",
"targets": {
"ko": "파밍 중",
"ja": "ルート中",
"zh": "搜物资中"
}
},
{
"source": "third party",
"targets": {
"ko": "어부",
"ja": "漁夫",
"zh": "第三方"
}
},
{
"source": "zone",
"targets": {
"ko": "자기장",
"ja": "安全地帯",
"zh": "毒圈"
}
},
{
"source": "circle",
"targets": {
"ko": "자기장",
"ja": "サークル",
"zh": "圈"
}
},
{
"source": "storm",
"targets": {
"ko": "폭풍",
"ja": "ストーム",
"zh": "风暴"
}
},
{
"source": "high ground",
"targets": {
"ko": "고지",
"ja": "高所",
"zh": "高地"
}
},
{
"source": "flank",
"targets": {
"ko": "측면",
"ja": "側面",
"zh": "侧翼"
}
},
{
"source": "behind us",
"targets": {
"ko": "뒤에 있다",
"ja": "後ろにいる",
"zh": "背后有人"
}
},
{
"source": "on me",
"targets": {
"ko": "나한테 붙어",
"ja": "ついてきて",
"zh": "跟着我"
}
},
{
"source": "grenade",
"targets": {
"ko": "수류탄",
"ja": "グレネード",
"zh": "手雷"
}
},
{
"source": "nade",
"targets": {
"ko": "수류탄",
"ja": "グレネード",
"zh": "手雷"
}
},
{
"source": "frag",
"targets": {
"ko": "파편탄",
"ja": "フラグ",
"zh": "破片雷"
}
},
{
"source": "smoke",
"targets": {
"ko": "연막",
"ja": "スモーク",
"zh": "烟雾弹"
}
},
{
"source": "flashbang",
"targets": {
"ko": "섬광탄",
"ja": "フラッシュ",
"zh": "闪光弹"
}
},
{
"source": "scope",
"targets": {
"ko": "조준경",
"ja": "スコープ",
"zh": "瞄准镜"
}
},
{
"source": "ADS",
"targets": {
"ko": "정조준",
"ja": "ADS",
"zh": "开镜"
}
},
{
"source": "recoil",
"targets": {
"ko": "반동",
"ja": "リコイル",
"zh": "后坐力"
}
},
{
"source": "spray control",
"targets": {
"ko": "반동 제어",
"ja": "リコイル制御",
"zh": "压枪"
}
},
{
"source": "aim",
"targets": {
"ko": "에임",
"ja": "エイム",
"zh": "枪法"
}
},
{
"source": "headshot",
"targets": {
"ko": "헤드샷",
"ja": "ヘッドショット",
"zh": "爆头"
}
},
{
"source": "wall bang",
"targets": {
"ko": "관통샷",
"ja": "ウォールバン",
"zh": "穿墙"
}
},
{
"source": "prefire",
"targets": {
"ko": "선샷",
"ja": "プリファイア",
"zh": "预瞄"
}
},
{
"source": "camping",
"targets": {
"ko": "캠핑",
"ja": "キャンプ",
"zh": "蹲点"
}
},
{
"source": "respawn",
"targets": {
"ko": "리스폰",
"ja": "リスポーン",
"zh": "重生"
}
},
{
"source": "kill streak",
"targets": {
"ko": "연속 킬",
"ja": "キルストリーク",
"zh": "连杀"
}
},
{
"source": "ammo",
"targets": {
"ko": "탄약",
"ja": "弾薬",
"zh": "子弹"
}
},
{
"source": "out of ammo",
"targets": {
"ko": "탄 없음",
"ja": "弾切れ",
"zh": "没子弹"
}
},
{
"source": "backup",
"targets": {
"ko": "지원",
"ja": "バックアップ",
"zh": "支援"
}
},
{
"source": "good game",
"targets": {
"ko": "잘 했다",
"ja": "GG",
"zh": "打得好"
}
},
{
"source": "nice shot",
"targets": {
"ko": "잘 쐈다",
"ja": "ナイスショット",
"zh": "好枪"
}
},
{
"source": "my bad",
"targets": {
"ko": "내 실수",
"ja": "ごめん",
"zh": "我的错"
}
}
]
}

View File

@@ -0,0 +1,73 @@
{
"key": "pubg",
"name": "배틀그라운드 (PUBG)",
"description": "자기장·파밍·스쿼드 콜. 배틀로얄 공통 용어도 같이 들어 있습니다.",
"entries": [
{"source": "chicken dinner", "targets": {"ko": "치킨", "ja": "ドン勝", "zh": "吃鸡"}},
{"source": "winner winner chicken dinner", "targets": {"ko": "이겼닭! 오늘 저녁은 치킨이닭!", "ja": "ドン勝つ!", "zh": "大吉大利,今晚吃鸡"}},
{"source": "blue zone", "targets": {"ko": "자기장", "ja": "ブルーゾーン", "zh": "蓝圈"}},
{"source": "the blue", "targets": {"ko": "자기장", "ja": "ブルーゾーン", "zh": "蓝圈"}},
{"source": "circle", "targets": {"ko": "자기장", "ja": "サークル", "zh": "圈"}},
{"source": "red zone", "targets": {"ko": "폭격 지역", "ja": "レッドゾーン", "zh": "红区"}},
{"source": "safe zone", "targets": {"ko": "안전 구역", "ja": "セーフゾーン", "zh": "安全区"}},
{"source": "zone is closing", "targets": {"ko": "자기장 좁혀진다", "ja": "ゾーンが縮まる", "zh": "圈要缩了"}},
{"source": "final circle", "targets": {"ko": "막자", "ja": "最終サークル", "zh": "决赛圈"}},
{"source": "drop", "targets": {"ko": "낙하", "ja": "降下", "zh": "跳伞"}},
{"source": "hot drop", "targets": {"ko": "핫드랍", "ja": "ホットドロップ", "zh": "热门点"}},
{"source": "landing", "targets": {"ko": "착지", "ja": "着地", "zh": "落地"}},
{"source": "where are we dropping", "targets": {"ko": "어디 내릴까", "ja": "どこ降りる", "zh": "跳哪里"}},
{"source": "loot", "targets": {"ko": "파밍", "ja": "物資", "zh": "物资"}},
{"source": "looting", "targets": {"ko": "파밍 중", "ja": "漁り中", "zh": "搜物资"}},
{"source": "care package", "targets": {"ko": "보급", "ja": "補給物資", "zh": "空投"}},
{"source": "airdrop", "targets": {"ko": "보급 상자", "ja": "エアドロップ", "zh": "空投"}},
{"source": "third party", "targets": {"ko": "어부", "ja": "漁夫", "zh": "第三方"}},
{"source": "third partied", "targets": {"ko": "어부 당했다", "ja": "漁夫られた", "zh": "被第三方了"}},
{"source": "squad", "targets": {"ko": "스쿼드", "ja": "スクワッド", "zh": "四排"}},
{"source": "duo", "targets": {"ko": "듀오", "ja": "デュオ", "zh": "双排"}},
{"source": "solo", "targets": {"ko": "솔로", "ja": "ソロ", "zh": "单排"}},
{"source": "knocked", "targets": {"ko": "눕혔다", "ja": "ダウンさせた", "zh": "打倒了"}},
{"source": "knocked down", "targets": {"ko": "기절", "ja": "ダウン", "zh": "倒地"}},
{"source": "finish him", "targets": {"ko": "마무리해", "ja": "とどめ刺して", "zh": "补掉他"}},
{"source": "revive", "targets": {"ko": "살리기", "ja": "蘇生", "zh": "救人"}},
{"source": "reviving", "targets": {"ko": "살리는 중", "ja": "蘇生中", "zh": "救人中"}},
{"source": "res me", "targets": {"ko": "살려줘", "ja": "起こして", "zh": "救我"}},
{"source": "med kit", "targets": {"ko": "구급상자", "ja": "救急箱", "zh": "医疗箱"}},
{"source": "first aid", "targets": {"ko": "구급상자", "ja": "応急手当", "zh": "急救包"}},
{"source": "bandage", "targets": {"ko": "붕대", "ja": "包帯", "zh": "绷带"}},
{"source": "energy drink", "targets": {"ko": "에너지 드링크", "ja": "エナドリ", "zh": "饮料"}},
{"source": "painkiller", "targets": {"ko": "진통제", "ja": "鎮痛剤", "zh": "止痛药"}},
{"source": "boost", "targets": {"ko": "부스트", "ja": "ブースト", "zh": "能量"}},
{"source": "level 3 helmet", "targets": {"ko": "3렙 헬멧", "ja": "レベル3ヘルメット", "zh": "三级头"}},
{"source": "level 3 vest", "targets": {"ko": "3렙 조끼", "ja": "レベル3アーマー", "zh": "三级甲"}},
{"source": "backpack", "targets": {"ko": "가방", "ja": "バックパック", "zh": "背包"}},
{"source": "scope", "targets": {"ko": "배율", "ja": "スコープ", "zh": "倍镜"}},
{"source": "8x", "targets": {"ko": "8배율", "ja": "8倍", "zh": "八倍镜"}},
{"source": "4x", "targets": {"ko": "4배율", "ja": "4倍", "zh": "四倍镜"}},
{"source": "red dot", "targets": {"ko": "레드닷", "ja": "レッドドット", "zh": "红点"}},
{"source": "suppressor", "targets": {"ko": "소음기", "ja": "サプレッサー", "zh": "消音器"}},
{"source": "compensator", "targets": {"ko": "보정기", "ja": "コンペンセイター", "zh": "补偿器"}},
{"source": "grip", "targets": {"ko": "손잡이", "ja": "グリップ", "zh": "握把"}},
{"source": "extended mag", "targets": {"ko": "확장 탄창", "ja": "拡張マガジン", "zh": "扩容弹匣"}},
{"source": "ammo", "targets": {"ko": "탄약", "ja": "弾薬", "zh": "子弹"}},
{"source": "need ammo", "targets": {"ko": "탄 필요해", "ja": "弾ちょうだい", "zh": "要子弹"}},
{"source": "frag grenade", "targets": {"ko": "수류탄", "ja": "フラグ", "zh": "手雷"}},
{"source": "molotov", "targets": {"ko": "화염병", "ja": "モロトフ", "zh": "燃烧瓶"}},
{"source": "smoke", "targets": {"ko": "연막", "ja": "スモーク", "zh": "烟雾弹"}},
{"source": "stun", "targets": {"ko": "섬광", "ja": "スタン", "zh": "闪光"}},
{"source": "prone", "targets": {"ko": "엎드려", "ja": "伏せろ", "zh": "趴下"}},
{"source": "take cover", "targets": {"ko": "엄폐해", "ja": "隠れて", "zh": "找掩体"}},
{"source": "cover", "targets": {"ko": "엄폐물", "ja": "遮蔽物", "zh": "掩体"}},
{"source": "compound", "targets": {"ko": "건물 단지", "ja": "建物群", "zh": "房区"}},
{"source": "ridge", "targets": {"ko": "능선", "ja": "尾根", "zh": "山脊"}},
{"source": "high ground", "targets": {"ko": "고지", "ja": "高所", "zh": "高地"}},
{"source": "vehicle", "targets": {"ko": "차량", "ja": "車両", "zh": "载具"}},
{"source": "get in the car", "targets": {"ko": "차 타", "ja": "車乗って", "zh": "上车"}},
{"source": "fuel", "targets": {"ko": "연료", "ja": "燃料", "zh": "油"}},
{"source": "footsteps", "targets": {"ko": "발소리", "ja": "足音", "zh": "脚步声"}},
{"source": "I hear footsteps", "targets": {"ko": "발소리 들린다", "ja": "足音する", "zh": "听到脚步"}},
{"source": "sniper", "targets": {"ko": "저격수", "ja": "スナイパー", "zh": "狙击手"}},
{"source": "kar98", "targets": {"ko": "카구팔", "ja": "Kar98k", "zh": "98K"}},
{"source": "spectate", "targets": {"ko": "관전", "ja": "観戦", "zh": "观战"}},
{"source": "rank push", "targets": {"ko": "티어 올리기", "ja": "ランク上げ", "zh": "上分"}}
]
}

View File

@@ -0,0 +1,74 @@
{
"key": "r6siege",
"name": "레인보우 식스 시즈",
"description": "역할·보강·파밸·콜아웃. 한국 서버에서 실제로 쓰는 말로 맞췄습니다.",
"entries": [
{"source": "operator", "targets": {"ko": "오퍼레이터", "ja": "オペレーター", "zh": "干员"}},
{"source": "op", "targets": {"ko": "오퍼", "ja": "オペ", "zh": "干员"}},
{"source": "attacker", "targets": {"ko": "공격팀", "ja": "攻撃側", "zh": "进攻方"}},
{"source": "defender", "targets": {"ko": "수비팀", "ja": "防衛側", "zh": "防守方"}},
{"source": "drone", "targets": {"ko": "드론", "ja": "ドローン", "zh": "无人机"}},
{"source": "droning", "targets": {"ko": "드론 정찰", "ja": "ドローン偵察", "zh": "无人机侦察"}},
{"source": "prep phase", "targets": {"ko": "준비 시간", "ja": "準備フェーズ", "zh": "准备阶段"}},
{"source": "roam", "targets": {"ko": "로밍", "ja": "ローミング", "zh": "游走"}},
{"source": "roamer", "targets": {"ko": "로머", "ja": "ローマー", "zh": "游走位"}},
{"source": "anchor", "targets": {"ko": "앵커", "ja": "アンカー", "zh": "守点位"}},
{"source": "anchoring", "targets": {"ko": "앵커링", "ja": "アンカリング", "zh": "守点"}},
{"source": "site", "targets": {"ko": "거점", "ja": "サイト", "zh": "据点"}},
{"source": "bomb site", "targets": {"ko": "폭탄 거점", "ja": "爆弾サイト", "zh": "炸弹点"}},
{"source": "defuser", "targets": {"ko": "디퓨저", "ja": "ディフューザー", "zh": "拆弹器"}},
{"source": "plant", "targets": {"ko": "설치", "ja": "設置", "zh": "安装"}},
{"source": "planted", "targets": {"ko": "설치됐다", "ja": "設置された", "zh": "已安装"}},
{"source": "defuse", "targets": {"ko": "해체", "ja": "解除", "zh": "拆除"}},
{"source": "reinforcement", "targets": {"ko": "보강", "ja": "補強", "zh": "加固"}},
{"source": "reinforce", "targets": {"ko": "보강하다", "ja": "補強する", "zh": "加固"}},
{"source": "hard breach", "targets": {"ko": "하드 브리치", "ja": "ハードブリーチ", "zh": "硬破"}},
{"source": "hard breacher", "targets": {"ko": "하드 브리처", "ja": "ハードブリーチャー", "zh": "硬破手"}},
{"source": "soft breach", "targets": {"ko": "소프트 브리치", "ja": "ソフトブリーチ", "zh": "软破"}},
{"source": "breach charge", "targets": {"ko": "브리치 차지", "ja": "ブリーチチャージ", "zh": "破门炸药"}},
{"source": "rotate hole", "targets": {"ko": "로테 구멍", "ja": "ローテ穴", "zh": "转点洞"}},
{"source": "murder hole", "targets": {"ko": "총구멍", "ja": "マーダーホール", "zh": "射击孔"}},
{"source": "hatch", "targets": {"ko": "해치", "ja": "ハッチ", "zh": "天花板洞"}},
{"source": "rappel", "targets": {"ko": "레펠", "ja": "ラペル", "zh": "速降"}},
{"source": "vault", "targets": {"ko": "창넘기", "ja": "乗り越え", "zh": "翻窗"}},
{"source": "run out", "targets": {"ko": "런아웃", "ja": "ランアウト", "zh": "冲出"}},
{"source": "spawn peek", "targets": {"ko": "스폰킬", "ja": "スポーンピーク", "zh": "出生点偷袭"}},
{"source": "gadget", "targets": {"ko": "장비", "ja": "ガジェット", "zh": "道具"}},
{"source": "utility", "targets": {"ko": "유틸", "ja": "ユーティリティ", "zh": "道具"}},
{"source": "trap", "targets": {"ko": "함정", "ja": "トラップ", "zh": "陷阱"}},
{"source": "nitro cell", "targets": {"ko": "니트로", "ja": "ニトロセル", "zh": "C4"}},
{"source": "impact", "targets": {"ko": "임팩트", "ja": "インパクト", "zh": "碰撞雷"}},
{"source": "flashbang", "targets": {"ko": "섬광탄", "ja": "フラッシュ", "zh": "闪光弹"}},
{"source": "smoke grenade", "targets": {"ko": "연막탄", "ja": "スモーク", "zh": "烟雾弹"}},
{"source": "claymore", "targets": {"ko": "클레이모어", "ja": "クレイモア", "zh": "阔剑雷"}},
{"source": "barbed wire", "targets": {"ko": "철조망", "ja": "鉄条網", "zh": "铁丝网"}},
{"source": "deployable shield", "targets": {"ko": "방패", "ja": "展開シールド", "zh": "可部署盾"}},
{"source": "bulletproof camera", "targets": {"ko": "방탄 카메라", "ja": "防弾カメラ", "zh": "防弹摄像头"}},
{"source": "cam", "targets": {"ko": "카메라", "ja": "カメラ", "zh": "摄像头"}},
{"source": "destroy the cam", "targets": {"ko": "카메라 깨줘", "ja": "カメラ壊して", "zh": "打掉摄像头"}},
{"source": "prefire", "targets": {"ko": "선샷", "ja": "プリファイア", "zh": "预瞄"}},
{"source": "peek", "targets": {"ko": "픽", "ja": "ピーク", "zh": "架点"}},
{"source": "lean", "targets": {"ko": "린", "ja": "リーン", "zh": "侧身"}},
{"source": "crouch", "targets": {"ko": "앉기", "ja": "しゃがみ", "zh": "蹲"}},
{"source": "prone", "targets": {"ko": "엎드리기", "ja": "伏せ", "zh": "趴下"}},
{"source": "trade", "targets": {"ko": "트레이드", "ja": "トレード", "zh": "换人"}},
{"source": "entry frag", "targets": {"ko": "선취점", "ja": "エントリーキル", "zh": "首杀"}},
{"source": "clutch", "targets": {"ko": "클러치", "ja": "クラッチ", "zh": "残局"}},
{"source": "ace", "targets": {"ko": "에이스", "ja": "エース", "zh": "一穿五"}},
{"source": "down", "targets": {"ko": "다운", "ja": "ダウン", "zh": "倒地"}},
{"source": "dbno", "targets": {"ko": "기절", "ja": "ダウン状態", "zh": "濒死"}},
{"source": "revive", "targets": {"ko": "살리기", "ja": "蘇生", "zh": "扶起"}},
{"source": "callout", "targets": {"ko": "콜", "ja": "コール", "zh": "报点"}},
{"source": "rotate", "targets": {"ko": "로테", "ja": "ローテ", "zh": "转点"}},
{"source": "flank", "targets": {"ko": "측면", "ja": "フランク", "zh": "绕后"}},
{"source": "watch flank", "targets": {"ko": "측면 봐줘", "ja": "フランク見て", "zh": "看侧面"}},
{"source": "above you", "targets": {"ko": "위에 있다", "ja": "上にいる", "zh": "在你上面"}},
{"source": "below you", "targets": {"ko": "아래에 있다", "ja": "下にいる", "zh": "在你下面"}},
{"source": "basement", "targets": {"ko": "지하", "ja": "地下", "zh": "地下室"}},
{"source": "top floor", "targets": {"ko": "최상층", "ja": "最上階", "zh": "顶层"}},
{"source": "outside", "targets": {"ko": "바깥", "ja": "外", "zh": "外面"}},
{"source": "ranked", "targets": {"ko": "랭크", "ja": "ランク", "zh": "排位"}},
{"source": "overtime", "targets": {"ko": "연장", "ja": "オーバータイム", "zh": "加时"}},
{"source": "ban", "targets": {"ko": "밴", "ja": "バン", "zh": "禁用"}}
]
}

View File

@@ -0,0 +1,66 @@
{
"key": "watchdogs",
"name": "워치독스 (Watch Dogs)",
"description": "1·2·리전 공통. 조직명과 해킹 용어는 고유명사라 번역기가 특히 잘 틀립니다.",
"entries": [
{"source": "DedSec", "targets": {"ko": "데드섹", "ja": "デッドセック", "zh": "DedSec"}},
{"source": "ctOS", "targets": {"ko": "ctOS", "ja": "ctOS", "zh": "ctOS"}},
{"source": "Blume", "targets": {"ko": "블룸", "ja": "ブルーム", "zh": "布鲁姆"}},
{"source": "Albion", "targets": {"ko": "알비온", "ja": "アルビオン", "zh": "阿尔比恩"}},
{"source": "Clan Kelley", "targets": {"ko": "켈리 클랜", "ja": "ケリー一家", "zh": "凯利帮"}},
{"source": "Zero Day", "targets": {"ko": "제로 데이", "ja": "ゼロデイ", "zh": "零日"}},
{"source": "Bratva", "targets": {"ko": "브라트바", "ja": "ブラトヴァ", "zh": "兄弟会"}},
{"source": "Viceroys", "targets": {"ko": "바이스로이", "ja": "ヴァイスロイ", "zh": "总督帮"}},
{"source": "the Fixer", "targets": {"ko": "해결사", "ja": "フィクサー", "zh": "中间人"}},
{"source": "fixer contract", "targets": {"ko": "해결사 의뢰", "ja": "フィクサー依頼", "zh": "中间人任务"}},
{"source": "operative", "targets": {"ko": "요원", "ja": "オペレーティブ", "zh": "特工"}},
{"source": "recruit", "targets": {"ko": "영입", "ja": "勧誘", "zh": "招募"}},
{"source": "permadeath", "targets": {"ko": "영구 사망", "ja": "パーマデス", "zh": "永久死亡"}},
{"source": "hack", "targets": {"ko": "해킹", "ja": "ハッキング", "zh": "黑入"}},
{"source": "hacked", "targets": {"ko": "해킹됐다", "ja": "ハックされた", "zh": "被黑了"}},
{"source": "remote hack", "targets": {"ko": "원격 해킹", "ja": "リモートハック", "zh": "远程黑入"}},
{"source": "backdoor", "targets": {"ko": "백도어", "ja": "バックドア", "zh": "后门"}},
{"source": "firewall", "targets": {"ko": "방화벽", "ja": "ファイアウォール", "zh": "防火墙"}},
{"source": "exploit", "targets": {"ko": "익스플로잇", "ja": "エクスプロイト", "zh": "漏洞利用"}},
{"source": "payload", "targets": {"ko": "페이로드", "ja": "ペイロード", "zh": "载荷"}},
{"source": "botnet", "targets": {"ko": "봇넷", "ja": "ボットネット", "zh": "僵尸网络"}},
{"source": "server farm", "targets": {"ko": "서버 팜", "ja": "サーバーファーム", "zh": "服务器农场"}},
{"source": "data breach", "targets": {"ko": "정보 유출", "ja": "情報漏洩", "zh": "数据泄露"}},
{"source": "encryption", "targets": {"ko": "암호화", "ja": "暗号化", "zh": "加密"}},
{"source": "profiler", "targets": {"ko": "프로파일러", "ja": "プロファイラー", "zh": "分析器"}},
{"source": "profiling", "targets": {"ko": "신원 조회", "ja": "プロファイリング", "zh": "身份分析"}},
{"source": "surveillance", "targets": {"ko": "감시", "ja": "監視", "zh": "监控"}},
{"source": "security camera", "targets": {"ko": "감시 카메라", "ja": "防犯カメラ", "zh": "监控摄像头"}},
{"source": "jump to camera", "targets": {"ko": "카메라 이동", "ja": "カメラに移動", "zh": "切换摄像头"}},
{"source": "NetHack", "targets": {"ko": "넷핵", "ja": "ネットハック", "zh": "网络视野"}},
{"source": "spiderbot", "targets": {"ko": "스파이더봇", "ja": "スパイダーボット", "zh": "蜘蛛机器人"}},
{"source": "quadcopter", "targets": {"ko": "쿼드콥터", "ja": "クアッドコプター", "zh": "四轴飞行器"}},
{"source": "jumper", "targets": {"ko": "점퍼", "ja": "ジャンパー", "zh": "跳跳车"}},
{"source": "RC car", "targets": {"ko": "RC카", "ja": "ラジコン", "zh": "遥控车"}},
{"source": "cargo drone", "targets": {"ko": "화물 드론", "ja": "カーゴドローン", "zh": "货运无人机"}},
{"source": "turret", "targets": {"ko": "터렛", "ja": "タレット", "zh": "炮塔"}},
{"source": "guard", "targets": {"ko": "경비원", "ja": "警備員", "zh": "守卫"}},
{"source": "restricted area", "targets": {"ko": "제한 구역", "ja": "立ち入り禁止区域", "zh": "禁区"}},
{"source": "detected", "targets": {"ko": "발각됐다", "ja": "見つかった", "zh": "被发现了"}},
{"source": "stay hidden", "targets": {"ko": "숨어 있어", "ja": "隠れてろ", "zh": "别暴露"}},
{"source": "take down", "targets": {"ko": "제압", "ja": "テイクダウン", "zh": "制服"}},
{"source": "non lethal", "targets": {"ko": "비살상", "ja": "非殺傷", "zh": "非致命"}},
{"source": "lethal", "targets": {"ko": "살상", "ja": "殺傷", "zh": "致命"}},
{"source": "heat level", "targets": {"ko": "수배 단계", "ja": "指名手配レベル", "zh": "通缉等级"}},
{"source": "wanted", "targets": {"ko": "수배 중", "ja": "指名手配", "zh": "被通缉"}},
{"source": "lose the cops", "targets": {"ko": "경찰 따돌려", "ja": "警察撒いて", "zh": "甩掉警察"}},
{"source": "traffic light", "targets": {"ko": "신호등", "ja": "信号機", "zh": "红绿灯"}},
{"source": "steam pipe", "targets": {"ko": "증기관", "ja": "蒸気管", "zh": "蒸汽管道"}},
{"source": "blocker", "targets": {"ko": "차단봉", "ja": "ブロッカー", "zh": "路障"}},
{"source": "escape", "targets": {"ko": "도주", "ja": "逃走", "zh": "逃脱"}},
{"source": "mission", "targets": {"ko": "임무", "ja": "ミッション", "zh": "任务"}},
{"source": "side mission", "targets": {"ko": "서브 임무", "ja": "サブミッション", "zh": "支线任务"}},
{"source": "checkpoint", "targets": {"ko": "체크포인트", "ja": "チェックポイント", "zh": "检查点"}},
{"source": "borough", "targets": {"ko": "자치구", "ja": "区", "zh": "行政区"}},
{"source": "uprising", "targets": {"ko": "봉기", "ja": "蜂起", "zh": "起义"}},
{"source": "resistance", "targets": {"ko": "저항군", "ja": "レジスタンス", "zh": "抵抗组织"}},
{"source": "whistleblower", "targets": {"ko": "내부 고발자", "ja": "内部告発者", "zh": "举报人"}},
{"source": "privacy", "targets": {"ko": "사생활", "ja": "プライバシー", "zh": "隐私"}},
{"source": "the city is watching", "targets": {"ko": "도시가 지켜보고 있다", "ja": "街が見ている", "zh": "城市在注视"}}
]
}

View File

@@ -6,7 +6,11 @@ from livesub.constants import LANGUAGE_CODES
from livesub.models.glossary import Glossary, GlossaryEntry
from livesub.models.packs import available_packs, build_glossary, get_pack
EXPECTED_PACKS = {"lol", "valorant", "overwatch", "fps-common", "minecraft", "streaming"}
#: 사용자가 "필수 게임"으로 지정한 것 — 빠지면 테스트가 잡아낸다.
REQUIRED_GAMES = {"overwatch", "watchdogs", "pubg", "r6siege"}
EXPECTED_PACKS = REQUIRED_GAMES | {
"lol", "valorant", "apex", "fps-common", "minecraft", "streaming",
}
def test_bundled_packs_are_loadable():
@@ -14,6 +18,12 @@ def test_bundled_packs_are_loadable():
assert keys >= EXPECTED_PACKS, f"빠진 팩: {EXPECTED_PACKS - keys}"
def test_required_games_are_bundled():
"""사용자가 직접 지정한 게임은 반드시 들어 있어야 한다."""
keys = {p.key for p in available_packs()}
assert keys >= REQUIRED_GAMES, f"필수 게임 팩 누락: {REQUIRED_GAMES - keys}"
def test_every_pack_has_entries_and_metadata():
for pack in available_packs():
assert pack.name, pack.key
@@ -43,13 +53,15 @@ def test_no_duplicate_sources_inside_a_pack():
def test_known_terms_are_present():
lol = get_pack("lol")
sources = {e.source.casefold() for e in lol.entries}
assert {"baron", "gank", "nexus", "ult"} <= sources
def sources_of(key: str) -> set[str]:
return {e.source.casefold() for e in get_pack(key).entries}
valorant = get_pack("valorant")
sources = {e.source.casefold() for e in valorant.entries}
assert {"spike", "defuse", "eco", "retake"} <= sources
assert {"baron", "gank", "nexus", "ult"} <= sources_of("lol")
assert {"spike", "defuse", "eco", "retake"} <= sources_of("valorant")
assert {"drone", "anchor", "roamer", "defuser", "hard breach"} <= sources_of("r6siege")
assert {"blue zone", "third party", "chicken dinner", "knocked"} <= sources_of("pubg")
assert {"dedsec", "ctos", "blume", "backdoor"} <= sources_of("watchdogs")
assert {"ring", "banner", "respawn beacon"} <= sources_of("apex")
def test_get_pack_returns_none_for_unknown():