리뷰 지적(포터블에서 transformers 제외 -> NLLB 로드 실패)을 고치려고 실제
NLLB 를 받아 돌려봤고, 그 과정에서 용어집이 사실상 동작하지 않고 있었다는
것을 발견했다. 단위 테스트는 "모델이 자리표시자를 통과시킨다"는 틀린 전제
위에 서 있었다.
1) 포터블 패키징 (리뷰 지적)
transformers 를 제외 목록에서 빼고 hiddenimports 에 넣었다. NLLB
토크나이저가 AutoTokenizer 를 쓰기 때문이다. transformers 는 torch 가
없으면 토크나이저 전용 모드로 뜨며 그게 우리 용도와 정확히 맞는다.
torch 없는 환경에서 ctranslate2/transformers/faster-whisper import 와
앱 기동을 검증하는 test_portable.py 를 추가했다.
2) 자리표시자 형식 (실측으로 발견)
`⟦0⟧` 는 NLLB 가 괄호를 날려 생존률 0/3 이었다. 용어가 자막에서 그냥
사라지고 있었다 ("Third party incoming" -> "0 들어오는"). 후보 8종을
실제 모델로 비교해 `#0#` 로 교체 (3/3, 다중 4/5).
3) 소실 대비
모델이 문장 일부를 누락하면 자리표시자도 사라진다. 그대로 복원하면
용어가 증발하므로, 하나라도 없으면 보호 없이 재번역한다.
4) 서술어는 문장 전체일 때만 (whole_only)
절/서술어를 문장 중간에서 치환하면 문법이 무너진다.
before: "탄 필요해와 구급상자"
after : "탄약과 구급상자가 필요합니다"
해당 56개 항목을 whole_only 로 지정해 단독 발화일 때만 적용한다.
("Cover me!" -> "엄호해줘" 는 그대로 유지)
5) 조사 교정
역어 받침이 달라 "자기장를" 이 남던 것을 fix_particles() 로 고친다.
을/를, 이/가, 은/는, 과/와, (으)로 — 한글 코드에서 받침을 읽어 판정.
검증: pytest 189개 통과, ruff clean
실제 NLLB-600M(torch 없이 CPU)로 번역 품질 직접 확인
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
488 lines
9.5 KiB
JSON
488 lines
9.5 KiB
JSON
{
|
|
"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": "被黑了"
|
|
},
|
|
"whole_only": true
|
|
},
|
|
{
|
|
"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": "被发现了"
|
|
},
|
|
"whole_only": true
|
|
},
|
|
{
|
|
"source": "stay hidden",
|
|
"targets": {
|
|
"ko": "숨어 있어",
|
|
"ja": "隠れてろ",
|
|
"zh": "别暴露"
|
|
},
|
|
"whole_only": true
|
|
},
|
|
{
|
|
"source": "take down",
|
|
"targets": {
|
|
"ko": "제압",
|
|
"ja": "テイクダウン",
|
|
"zh": "制服"
|
|
},
|
|
"whole_only": true
|
|
},
|
|
{
|
|
"source": "non lethal",
|
|
"targets": {
|
|
"ko": "비살상",
|
|
"ja": "非殺傷",
|
|
"zh": "非致命"
|
|
}
|
|
},
|
|
{
|
|
"source": "lethal",
|
|
"targets": {
|
|
"ko": "살상",
|
|
"ja": "殺傷",
|
|
"zh": "致命"
|
|
},
|
|
"whole_only": true
|
|
},
|
|
{
|
|
"source": "heat level",
|
|
"targets": {
|
|
"ko": "수배 단계",
|
|
"ja": "指名手配レベル",
|
|
"zh": "通缉等级"
|
|
}
|
|
},
|
|
{
|
|
"source": "wanted",
|
|
"targets": {
|
|
"ko": "수배 중",
|
|
"ja": "指名手配",
|
|
"zh": "被通缉"
|
|
}
|
|
},
|
|
{
|
|
"source": "lose the cops",
|
|
"targets": {
|
|
"ko": "경찰 따돌려",
|
|
"ja": "警察撒いて",
|
|
"zh": "甩掉警察"
|
|
},
|
|
"whole_only": true
|
|
},
|
|
{
|
|
"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": "城市在注视"
|
|
},
|
|
"whole_only": true
|
|
}
|
|
]
|
|
}
|