fix: 필수 팩 기본 활성화 + 저부하 모드 토글 반영 + 용어 겹침 수정

리뷰 지적 2건과, 그것을 고치다 드러난 용어집 버그 1건을 함께 처리했다.

1) 저부하 모드 토글이 모델에 반영되지 않던 버그
   ModelManager 는 생성 시점의 low_power 로 정밀도를 정하는데 설정에서
   토글해도 갱신되지 않았고, stop() 은 모델을 내리지 않아 이전 정밀도
   모델이 그대로 남았다. TranslationEngine.sync_performance() 를 추가해
   값이 바뀌면 언로드 후 갱신하고, _bootstrap 과 재시작 경로에서 부른다.

2) 필수 게임 팩이 기본으로 꺼져 있던 문제
   새 설치 기본값을 fps-common + 오버워치 + 배그 + R6 + 워독스로 켰다.

3) (1)(2)를 고치며 드러난 것: 팩 여러 개를 켜면 결과가 체크 순서에
   휘둘렸다. knocked 가 FPS공통 "기절" / 배그 "눕혔다" 로 갈리는 식으로
   19개 용어가 충돌하는데, 사용자는 그 순서를 볼 수도 바꿀 수도 없었다.
   팩에 scope(generic/game) 를 두고 범용 -> 게임 전용 -> 사용자 항목
   순으로 적용해 결정적으로 만들었다. 게임 팩끼리 갈리는 것은 사람이
   판단할 문제라 find_conflicts() 로 뽑아 용어집 화면에 표시한다.

4) 용어 겹침 버그: "the blue"(조각)가 "blue zone" 보다 앞 위치라는
   이유로 먼저 잡혀 "자기장 자기장" 이 됐다. 최장일치 정렬은 같은 시작
   위치에서만 통한다. 조각 항목을 제거하고, 모든 팩을 켠 상태로 각
   용어가 정확히 한 번만 치환되는지 검사하는 테스트를 추가했다.

검증: pytest 110개 통과 (저부하 6 + 팩 계층/충돌/겹침 12 신규), ruff clean

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
EJClaw
2026-09-21 18:05:22 +09:00
parent a7eafd03e1
commit e4a048c8d5
19 changed files with 4266 additions and 506 deletions

View File

@@ -2,73 +2,543 @@
"key": "r6siege",
"name": "레인보우 식스 시즈",
"description": "역할·보강·파밸·콜아웃. 한국 서버에서 실제로 쓰는 말로 맞췄습니다.",
"scope": "game",
"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": "禁用"}}
{
"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": "禁用"
}
}
]
}