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,65 +2,479 @@
"key": "watchdogs",
"name": "워치독스 (Watch Dogs)",
"description": "1·2·리전 공통. 조직명과 해킹 용어는 고유명사라 번역기가 특히 잘 틀립니다.",
"scope": "game",
"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": "城市在注视"}}
{
"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": "城市在注视"
}
}
]
}