diff --git a/README.md b/README.md index 7a0dbf0..ddcfb97 100644 --- a/README.md +++ b/README.md @@ -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) ### 직접 추가하기 diff --git a/docs/images/glossary.png b/docs/images/glossary.png index 07d128e..9e620a4 100644 Binary files a/docs/images/glossary.png and b/docs/images/glossary.png differ diff --git a/src/livesub/resources/glossaries/apex.json b/src/livesub/resources/glossaries/apex.json new file mode 100644 index 0000000..061c122 --- /dev/null +++ b/src/livesub/resources/glossaries/apex.json @@ -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": "击杀王"}} + ] +} diff --git a/src/livesub/resources/glossaries/fps-common.json b/src/livesub/resources/glossaries/fps-common.json index 87c51e5..c0b8b8d 100644 --- a/src/livesub/resources/glossaries/fps-common.json +++ b/src/livesub/resources/glossaries/fps-common.json @@ -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": "我的错" + } + } ] } diff --git a/src/livesub/resources/glossaries/pubg.json b/src/livesub/resources/glossaries/pubg.json new file mode 100644 index 0000000..9b3bbb8 --- /dev/null +++ b/src/livesub/resources/glossaries/pubg.json @@ -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": "上分"}} + ] +} diff --git a/src/livesub/resources/glossaries/r6siege.json b/src/livesub/resources/glossaries/r6siege.json new file mode 100644 index 0000000..e89fd7b --- /dev/null +++ b/src/livesub/resources/glossaries/r6siege.json @@ -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": "禁用"}} + ] +} diff --git a/src/livesub/resources/glossaries/watchdogs.json b/src/livesub/resources/glossaries/watchdogs.json new file mode 100644 index 0000000..a961d3f --- /dev/null +++ b/src/livesub/resources/glossaries/watchdogs.json @@ -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": "城市在注视"}} + ] +} diff --git a/tests/test_packs.py b/tests/test_packs.py index 7969cd8..db677fd 100644 --- a/tests/test_packs.py +++ b/tests/test_packs.py @@ -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():