From ca5748821cec2461c50fc08928347e61b9d8cfb9 Mon Sep 17 00:00:00 2001 From: DragonHD Date: Sun, 20 Sep 2026 10:44:10 +0800 Subject: [PATCH] Translate Strings.dat to Simplified Chinese (479/496) - cn_strings.py: full GB2312 translation table; make_cn_strings.py is now escape-aware so values containing escaped-quote formats survive. - dump_all_strings.py + check_translations.py: dump the English table and verify the printf specifier sequence matches the source (0 mismatches). - Skipped: pure-format/empty strings, the tutorial texture path, ambiguous key labels. - DEVLOG notes the remaining engine-layout caveats. --- docs/DEVLOG.md | 16 ++ tools/check_translations.py | 33 +++ tools/cn_strings.py | 510 ++++++++++++++++++++++++++++++++++-- tools/dump_all_strings.py | 16 ++ 4 files changed, 558 insertions(+), 17 deletions(-) create mode 100644 tools/check_translations.py create mode 100644 tools/dump_all_strings.py diff --git a/docs/DEVLOG.md b/docs/DEVLOG.md index 7b28129..f4e23d4 100644 --- a/docs/DEVLOG.md +++ b/docs/DEVLOG.md @@ -3,6 +3,22 @@ Working log for the *The I of the Dragon* localization / HD project. Newest entries on top. +## 2026-09-20 — Full `Strings.dat` translation + +- Translated the `English` column for **479 / 496** entries (the rest are pure-format + strings, empty/whitespace values, the tutorial texture *path*, and a few odd key labels). +- `tools/check_translations.py` verifies the printf specifier sequence (`%s`/`%d`/`%i`/`%%`) + matches the English source exactly (0 mismatches) and that every value GB2312-encodes. +- `tools/dump_all_strings.py` dumps the source table to `build/strings_en.json`. + +### Known layout caveats (engine UI is tuned for the small Latin pixel font) + +- Some engine UI positions tab/button labels against a box sized for English, so short + Chinese labels can look left/right-aligned; a couple of centred dialogs jitter while a + teletype reveal is running. +- In-game HUD button labels wrap and can overlap the shortcut hint because the boxes are + small; to revisit via a smaller CJK cell/advance if needed. + ## 2026-09-20 — Chinese in the main menu (first playable) - Built `tools/build_cjk.py`: renders the full GB2312 set (7445 double-byte codes) as **12x12** diff --git a/tools/check_translations.py b/tools/check_translations.py new file mode 100644 index 0000000..61e9a5f --- /dev/null +++ b/tools/check_translations.py @@ -0,0 +1,33 @@ +import json +import re +import sys + +sys.path.insert(0, r"E:\DragonHD\tools") +from cn_strings import CN_STRINGS + +j = json.load(open(r"E:\DragonHD\build\strings_en.json", encoding="utf-8")) +en = {k: v for k, v in j} + +SPEC = re.compile(r"%%|%[-+ #0]*[\d*]*(?:\.[\d*]+)?[hlL]?[diouxXeEfgGcs%]") + +bad = [] +for sid, cn in CN_STRINGS.items(): + if sid not in en: + bad.append((sid, "id not in file")) + continue + se = SPEC.findall(en[sid]) + sc = SPEC.findall(cn) + if se != sc: + bad.append((sid, "spec %r != %r" % (se, sc))) + +print("translated:", len(CN_STRINGS)) +print("spec mismatches:", len(bad)) +for sid, why in bad: + print(" !", sid, why) + +# specifiers present in English but missing translation +missing_spec = [sid for sid in en if sid not in CN_STRINGS and SPEC.findall(en[sid]) and en[sid].strip()] +print() +print("English entries with format specifiers left untranslated:", len(missing_spec)) +for s in missing_spec: + print(" -", s, "=", repr(en[s])) diff --git a/tools/cn_strings.py b/tools/cn_strings.py index 858bacb..b35c8ef 100644 --- a/tools/cn_strings.py +++ b/tools/cn_strings.py @@ -1,16 +1,119 @@ """Simplified Chinese UI strings for The I of the Dragon. -Only *display* values are translated here (the `English` column of +Only *display* values are translated (the `English` column of `Data\\Misc\\Strings.dat`). Never translate `Id`s, event names, commands or unit types -- doing so is what breaks mission triggers. -`\\a` is an in-engine text control prefix; keep it verbatim. -Format specifiers (`%s`, `%d`, ...) must survive untouched. +Conventions: + * `\\a`, `\\b`, `\\r`, `\\n`, `\\f`, `\\v` are engine text-control escapes and are + kept verbatim (in this Python source they are written as `\\\\a` etc.). + * printf specifiers (`%s`, `%d`, `%i`, `%.1f`, `%%`) must be preserved in the + same order/count, otherwise the engine's argument list shifts and crashes. + * Entries deliberately left untranslated: the tutorial texture *path* + (`TutorialButtonsTexture`), pure-format strings (`Help_Shortcut_*`, + `Overhead_Tooltip_Shortcut_*`, `Overhead_TownInfo`), empty/whitespace + strings and the three ambiguous `KEYBOARD_C/4A/4E` key names. """ CN_STRINGS = { - # window / main menu + # ---------------------------------------------------------------- general "WindowCaption": "龙之眼", + "InsertDisk": "请插入光盘 %s", + + # ------------------------------------------------------- spell tooltips + "Ravine": "峡谷\\r\\n%s一道峡谷沿直线向前,摧毁沿途的一切。适合攻击排成一列的敌人。", + "StoneStrike": "落石\\r\\n%s巨石覆盖大片区域,对范围内的一切造成伤害。", + "Aid": "援助\\r\\n%s恢复除施法者外任何生物的生命值。有助于延长召唤生物的存活时间。", + "AddBlackSkin": "黑肤术\\r\\n%s提高除施法者外任何生物的抗伤害能力。", + "Hast": "疾速\\r\\n%s提高除施法者外任何生物的速度。", + "Infuriate": "激怒\\r\\n%s提高除施法者外任何生物的速度与攻击力。", + "Summon Swarm": "召唤虫群\\r\\n%s召唤一群愤怒的飞虫攻击你的敌人。", + "Knock": "落石打击\\r\\n%s一块巨石从天而降砸向敌人。威力强大且精准。", + "Summon Giant Insect": "召唤巨虫\\r\\n%s召唤一只巨虫攻击你的敌人。法术失效后巨虫即会死亡。", + "Slow Death": "缓死\\r\\n%s你的敌人会缓慢死去,除非其再生能力高于法术威力。", + "Raise Zombie": "复活僵尸\\r\\n%s复活一只僵尸为你作战,持续到法术结束。它拥有自导魔法飞弹和强壮的双手。", + "Raise Dead": "亡者复生\\r\\n%s复活任何生物,它会为你而战,法术失效后即会死亡。", + "LongStar": "长星\\r\\n%s一支魔法箭矢,可冻结目标。射程极远。", + "LongStarRed": "长星\\r\\n%s一支魔法箭矢,可冻结目标。射程极远。", + "LongStarBlack": "长星\\r\\n%s一支魔法箭矢,可冻结目标。射程极远。", + "Summon Dark Star": "绝望之星\\r\\n%s从异次元召唤一颗能量之星。它频繁释放能量弹,对付飞行敌人非常有效。", + "Summon Bright Star": "希望之星\\r\\n%s从异次元召唤一颗能量之星。它释放能量弹,并能治疗友方与召唤生物。", + "Fear": "恐惧\\r\\n%s使敌人心中充满恐惧,惊慌逃窜。", + "Rise": "隆起山脉\\r\\n%s一座巨山凭空出现,对范围内所有生物造成伤害。", + "Slow": "迟缓\\r\\n%s一定半径内所有生物的速度大幅降低。对快速射击的怪物尤其有效。", + "Wasteland": "荒芜\\r\\n%s地面化为荒芜之地,伤害附近所有生物。", + "PoisonTrail": "毒迹\\r\\n%s对自己施放,移动时留下一条剧毒轨迹。", + "SmallCrater": "小陨坑\\r\\n%s在地面制造一个小陨坑造成伤害。其边缘尤其危险。", + "BigCrater": "大陨坑\\r\\n%s在地面制造一个大陨坑造成伤害。其边缘尤其危险。", + "Raise Several Zombies": "群体复生\\r\\n%s复活五只僵尸为你作战,持续到法术结束。对付飞行目标非常有效--僵尸拥有自导魔法飞弹。", + "PoisonNova": "剧毒新星\\r\\n%s对自己施放,爆发一场剧毒爆炸。", + "EarthSkin": "大地之肤\\r\\n%s对自己施放,使皮肤吸收部分受到的伤害。", + "DeathSkin": "死亡之肤\\r\\n%s对自己施放,使皮肤吸收大部分受到的伤害。", + "SummonEarthElemental": "召唤土元素\\r\\n%s召唤一个土元素攻击你的敌人。法术失效后元素即会消散。", + "LightningStorm": "闪电风暴\\r\\n%s道道闪电从天而降。", + "QuickStar": "疾速之星\\r\\n%s召唤三颗魔法星追踪你的目标。", + "Freeze": "冰冻\\r\\n%s冻结任何生物,使其在一段时间内无法行动。", + "DemolitionSphere": "爆破球\\r\\n%s一颗能量球,对建筑非常有效。", + "PowerArrow": "强力箭\\r\\n%s一支魔法箭矢,速度极快且射程很远。", + "Loss of Aim": "失准\\r\\n%s受影响的敌人会暂时失去准头,你可以相对安全地从它们上方飞过。", + "Blind": "致盲\\r\\n%s法术附近的所有生物都会暂时失明。", + "Lump of ice": "冰块\\r\\n%s一块寒冰暂时冻结你的敌人,并造成一定伤害。", + "LightingBreath": "闪电吐息\\r\\n%s让你向敌人吐出闪电。瞬间命中的武器,威力可观。", + "Dispel": "净化\\r\\n%s移除施加在你身上的持续法术效果,如中毒、燃烧等。", + "Invisibility": "隐身\\r\\n%s对自己施放,在法术持续期间对敌人隐身。一旦攻击就会显形。", + "Strength of Wing": "翼之力量\\r\\n%s将你的耐力恢复至最大。", + "ExtendedInvisibility": "强化隐身\\r\\n%s对自己施放,在法术持续期间对敌人隐身,一旦攻击就会显形。与隐身术相同,但持续时间更长。", + "InstantReturn": "瞬间回城\\r\\n%s将你传送回城镇;若尚无城镇,则传送至能量柱。", + "Spirits of wind": "风之精灵\\r\\n%s对自己施放,提高你的速度。", + "Convert": "感化\\r\\n%s感化一些较弱的怪物,让它们在一段时间内为你作战。", + "AdvancedConvert": "强效感化\\r\\n%s能感化大多数怪物,让它们在法术持续期间为你作战。", + "Teleport": "传送\\r\\n%s让你瞬间传送到视野内的任意位置。", + "MagicStones": "魔法石\\r\\n%s向敌人头顶投下一阵石雨。", + "Mirror": "镜像\\r\\n%s对自己施放,将所有攻击反弹给敌人。", + "AdvancedInvisibility": "高级隐身\\r\\n%s让你即使在攻击时也保持隐身。", + "WarSphere": "战争之球\\r\\n%s制造一个能量球,用闪电攻击范围内的一切。", + "HeavenDefense": "天界防御\\r\\n%s吸收你受到的部分伤害。", + "Blink": "闪现\\r\\n%s在致命一击时救你一命。自动将你传送到随机方向,然后失效。", + "ExtendedBlink": "强化闪现\\r\\n%s在致命一击时救你一命,自动将你传送到随机方向。在其持续时间内可多次触发。", + "EnergeticMissile": "能量飞弹\\r\\n%s快速蓄力的飞弹,造成中等伤害。幼龙的最佳武器。", + "UltimateWarSphere": "终极战争之球\\r\\n%s制造一个超强能量球,用闪电攻击范围内的一切。", + "Super Mirror": "超级镜像\\r\\n%s对自己施放,将所有攻击反弹给攻击者并保护自己免受伤害。", + "MassFreeze": "群体冰冻\\r\\n%s冻结范围内所有生物一段时间。", + "Invade": "侵入\\r\\n%s将你传送到最近的怪物巢穴。", + "Raise geysers": "喷泉\\r\\n%s制造魔法喷泉,喷射火焰攻击附近所有生物。", + "Heaven Rage": "天怒\\r\\n%s雷球与闪电!敌人脚下的大地翻涌,从下方重创你的敌人。", + "Ridge": "山脊\\r\\n%s分而治之。隆起的山脊对敌方建筑和邪恶生物都有效。", + "Column": "石柱\\r\\n%s一根巨柱从地面升起,送你的敌人去见天神。", + "Pyro Blast": "烈焰冲击\\r\\n%s轰出去!点燃它们!用来烧毁森林和敌人同样有效。", + "Fog Cloud": "雾云\\r\\n%s制造一团迷雾,使其中所有生物在法术持续期间失明。", + "Hound": "猎犬\\r\\n%s一只愤怒的灵魂会追击你的敌人。虽然速度不快,但攻击力相当强。", + "Create Fire": "纵火\\r\\n%s用这一强大的火系法术使生物和建筑持续燃烧。", + "FireStar": "火焰之星\\r\\n%s一颗旋转的自导之星追踪你的敌人。缓慢但强大,带范围效果。", + "FireBall": "火球\\r\\n%s向敌人投掷一块燃烧的巨石。", + "BigFireBall": "大火球\\r\\n%s一块巨大的燃烧巨石,命中时分裂成致命的燃烧碎块。", + "Aim": "瞄准\\r\\n%s对自己施放,在法术持续期间提高命中。", + "Force of Regeneration": "再生之力\\r\\n%s对自己施放,在法术持续期间提高你的再生速度。", + "Rage": "狂暴\\r\\n%s对自己施放,进入狂暴状态,提高自然攻击的速度与威力。", + "FireSpectre": "火焰幽灵\\r\\n%s一群愤怒的火焰精灵追击你的目标。", + "FireRain": "火雨\\r\\n%s召唤火焰如雨般落在敌人头顶。用于摧毁多个目标的范围效果很好。", + "Meteor": "陨石\\r\\n%s一块巨石从天而降。", + "Volcano": "火山\\r\\n%s升起一座喷发的火山,抛出毒烟与燃烧的巨石。大范围毁灭!", + "DetectLairs": "侦测巢穴\\r\\n%s侦测附近所有怪物巢穴。对自己施放后,巢穴会被淡红色光芒标记。", + "DetectMission": "侦测特殊魔法\\r\\n%s帮助你找到与任务相关的物品。", + "DetectMonsters": "侦测怪物\\r\\n%s对自己施放,侦测附近的任何怪物。", + "MinorCure": "初级治疗\\r\\n%s为自己或任何其他生物恢复少量生命值。", + "Cure": "治疗\\r\\n%s为自己或任何其他生物恢复一些生命值。", + "MajorCure": "强效治疗\\r\\n%s为自己或任何其他生物恢复大量生命值。", + "FireStoneTumbaUmba": "火焰石\\r\\n%s运用昆戈尔的魔法向敌人投掷燃烧的石块。", + "ArrowHunter": "长弓\\r\\n弓箭是猎手从安全距离外攻击的最佳方式之一。拉弦越满,伤害越高。", + "Summon Sinisterwing": "召唤邪翼\\r\\n%s你可以召唤强大的飞行生物。", + "KnightPower": "圣骑士之力\\r\\n%s真正英雄的信仰赐予他的武器远不止一把剑。", + "Slash": "猛击\\r\\n只要击中敌人,它终会死去。不过别期望太高……", + "FireStone": "火焰炮弹\\r\\n非常精准的武器,可在敌人发现你之前从远处将其消灭。", + "ZealotFireMissile": "狂信徒火焰飞弹\\r\\n自导火焰飞弹", + "ZealotHarvest": "灵魂收割\\r\\n%s一种特殊的魔法--从尸体上收集灵魂。", + + # ------------------------------------------------------------- main menu "MainMenu_StartNewGame": "开始新游戏", "MainMenu_SaveLoadGame": "保存或载入游戏", "MainMenu_LoadGame": "载入游戏", @@ -23,7 +126,19 @@ CN_STRINGS = { "MainMenu_Credits": "制作人员", "MainMenu_Exit": "退出", - # options + # ------------------------------------------------------------- save/load + "SaveLoadMenu_SaveGame": "保存游戏", + "SaveLoadMenu_CannotSaveGame": "无法保存游戏", + "SaveLoadMenu_LoadGame": "载入游戏", + "SaveLoadMenu_CannotLoadGame": "请先选择一个存档", + "SaveLoadMenu_Back": "返回", + "SaveLoadMenu_Delete": "删除", + "SaveLoadMenu_CannotDelete": "无法删除", + "SaveLoadMenu_Cancel": "取消", + "SaveLoadMenu_ReplaceDialog": "\\a替换?", + "SaveLoadMenu_DeleteDialog": "\\a删除?", + + # --------------------------------------------------------------- options "OptionsMenu_ApplyDialog": "\\a应用更改?", "OptionsMenu_Audio": "音频", "OptionsMenu_Video": "视频", @@ -37,20 +152,190 @@ CN_STRINGS = { "OptionsMenu_Back": "返回", "OptionsMenu_Okey": "应用", "OptionsMenu_Reset": "重置", + "Options_Applied": "已应用", - # save / load - "SaveLoadMenu_SaveGame": "保存游戏", - "SaveLoadMenu_CannotSaveGame": "无法保存游戏", - "SaveLoadMenu_LoadGame": "载入游戏", - "SaveLoadMenu_CannotLoadGame": "请先选择一个存档", - "SaveLoadMenu_Back": "返回", - "SaveLoadMenu_Delete": "删除", - "SaveLoadMenu_CannotDelete": "无法删除", - "SaveLoadMenu_Cancel": "取消", - "SaveLoadMenu_ReplaceDialog": "\\a替换?", - "SaveLoadMenu_DeleteDialog": "\\a删除?", + # --------------------------------------------------------- video options + "VideoOptions_Res": "分辨率", + "VideoOptions_Refr": "刷新率", + "VideoOptions_RefrHz": "Hz", + "VideoOptions_RefrDefault": "默认", + "VideoOptions_Quality": "画质", + "VideoOptions_Quality0": "低", + "VideoOptions_Quality1": "中", + "VideoOptions_Quality2": "高", + "VideoOptions_CustomQuality": "自定义", + "VideoOptions_Gamma": "伽马", + "VideoOptions_Custom": "自定义", + "VideoOptions_Geometry": "几何", + "VideoOptions_Geometry0": "低", + "VideoOptions_Geometry1": "中", + "VideoOptions_Geometry2": "高", + "VideoOptions_Effects": "效果", + "VideoOptions_Effects0": "低", + "VideoOptions_Effects1": "中", + "VideoOptions_Effects2": "高", + "VideoOptions_Sky": "天空", + "VideoOptions_Clouds": "云层", + "VideoOptions_Clouds0": "无云", + "VideoOptions_Clouds1": "单层", + "VideoOptions_Clouds2": "双层", + "VideoOptions_Koka": "阴影", + "VideoOptions_Koka0": "普通", + "VideoOptions_Koka1": "较好", + "VideoOptions_Koka2": "最佳", + "VideoOptions_ResChanged1": "保留?", + "VideoOptions_ResChanged2": "还原倒计时", + "VideoOptions_ResChanged3": "%d 秒。", + "VideoOptions_Revert": "\\a保留此分辨率?%d 秒后还原。", - # multiplayer / tutorial + # --------------------------------------------------------- audio options + "AudioOptions_SoundLevel": "音效", + "AudioOptions_MusicLevel": "音乐", + "AudioOptions_VoiceLevel": "语音", + "AudioOptions_InterfaceLevel": "界面", + "AudioOptions_3DSound": "3D", + "AudioOptions_DirectionalSound": "方向感", + "AudioOptions_SoundMode": "声音模式", + "AudioOptions_SoundMode0": "立体声", + "AudioOptions_SoundMode1": "3D", + "AudioOptions_SoundMode2": "高级 3D", + "AudioOptions_Ambient": "环境音", + + # ---------------------------------------------------------- game options + "GameOptions_CineCamera": "过场镜头", + "GameOptions_Tooltips": "提示", + "GameOptions_Autotips": "自动提示", + "GameOptions_TextDelay": "文字延迟", + "GameOptions_TextDelayValue": "%d 秒", + "GameOptions_Difficulty": "难度", + "GameOptions_DifficultyValue": "等级 %d", + "GameOptions_InvertCameraY": "反转 Y", + "GameOptions_CameraOrHeight": "滚轮:%s", + "GameOptions_CameraOrHeight0": "镜头", + "GameOptions_CameraOrHeight1": "高度", + + # ------------------------------------------------------- control options + "ControlOptions_MSens": "鼠标", + "ControlOptions_InvertCameraX": "反转 X", + "ControlOptions_AutoHideCursor": "自动隐藏光标", + "ControlOptions_JoystickMode": "摇杆", + "ControlOptions_JoystickMode0": "关", + "ControlOptions_JoystickMode1": "Y-前进/停止", + "ControlOptions_JoystickMode2": "Y-上下", + "ControlOptions_Press": "请按键", + "ControlOptions_Bind": "绑定", + + # ------------------------------------------------------- input actions + "DIA_GAME_MENU": "菜单", + "DIA_GAME_HELP": "帮助", + "DIA_GAME_CAMERACONTROL": "镜头", + "DIA_GAME_LEFT": "左", + "DIA_GAME_RIGHT": "右", + "DIA_GAME_UP": "上", + "DIA_GAME_DOWN": "下", + "DIA_GAME_AIMED_FIRE": "瞄准射击", + "DIA_GAME_FORWARD": "前进", + "DIA_GAME_PAUSE": "暂停", + "DIA_GAME_SELECT": "移动", + "DIA_GAME_ALT_SELECT": "攻击", + "DIA_GAME_CENTERCAMERA": "镜头归中", + "DIA_GAME_CAMERA_TURN_LEFT": "镜头左转", + "DIA_GAME_CAMERA_TURN_RIGHT": "镜头右转", + "DIA_GAME_CAMERA_TURN_UP": "镜头上抬", + "DIA_GAME_CAMERA_TURN_DOWN": "镜头下压", + "DIA_GAME_SPEED_PLUS": "游戏速度+", + "DIA_GAME_SPEED_MINUS": "游戏速度-", + "DIA_GAME_STATISTICS": "属性", + "DIA_GAME_MAP": "地图", + "DIA_GAME_OPTIONS": "选项", + "DIA_GAME_SHOW_UNIT_MARKERS": "标记", + "DIA_GAME_NEXT_CAMERA": "下一镜头", + "DIA_GAME_PLAYER_CATCH": "抓取", + "DIA_GAME_PLAYER_DEVOUR": "吞噬", + "DIA_GAME_PLAYER_TRANSMUTE": "转化", + "DIA_GAME_PLAYER_STOP": "停止", + "DIA_GAME_PLAYER_ATTACK_STATE": "攻击状态", + "DIA_GAME_CAMERA_ZOOM": "缩放", + "DIA_GAME_PLAYER_SPEED_PLUS": "速度+", + "DIA_GAME_PLAYER_SPEED_MINUS": "速度-", + "DIA_GAME_PLAYER_HEIGHT_PLUS": "高度+", + "DIA_GAME_PLAYER_HEIGHT_MINUS": "高度-", + "DIA_GAME_CANCEL_TUTORIAL": "取消教程", + "DIA_GAME_QUEUE_SPELLS": "法术队列", + "DIA_GAME_MISSION_DESCRIPTION": "当前任务", + "DIA_GAME_BUILD": "建造/修理/升级", + "DIA_GAME_SCREENSHOT": "截图", + "DIA_GAME_CAMERA_ZOOM_IN": "镜头拉近", + "DIA_GAME_CAMERA_ZOOM_OUT": "镜头拉远", + "DIA_GAME_MINMAP": "小地图", + "DIA_GAME_NEXT_TARGET": "下一目标", + "DIA_GAME_PREV_TARGET": "上一目标", + "DIA_GAME_AUTO_TARGET": "自动锁定", + "DIA_GAME_WEAPON1": "第一武器", + "DIA_GAME_WEAPON2": "第二武器", + "DIA_GAME_WEAPON3": "第三武器", + + # ------------------------------------------------------- mouse and keys + "MOUSE_3": "鼠标左键", + "MOUSE_4": "鼠标右键", + "MOUSE_5": "滚轮", + "MOUSE_6": "后退键", + "MOUSE_7": "前进键", + "KEYBOARD_39": "空格", + "KEYBOARD_C8": "上箭头", + "KEYBOARD_D0": "下箭头", + "KEYBOARD_CD": "右箭头", + "KEYBOARD_CB": "左箭头", + "KEYBOARD_45": "数字锁定", + "KEYBOARD_0E": "退格", + "KEYBOARD_C9": "上一页", + "KEYBOARD_D1": "下一页", + + # --------------------------------------------------------- help markers + "Help_Markers_Breath_Capacity": "吐息储量", + "Help_Markers_Breath_Charge": "吐息蓄力", + "Help_Markers_Blast_Attack": "冲击攻击", + "Help_Markers_Breath_Attack": "吐息攻击", + "Help_Markers_Missile_Attack": "飞弹攻击", + "Help_Markers_Catch_Eat": "抓取/进食", + "Help_Markers_Empty_Spell_Slot": "空法术槽", + "Help_Markers_Spell_Charge_Level_Indicator": "法术蓄力指示", + "Help_Markers_Spell_Shortcut": "法术快捷键", + "Help_Markers_Spell_Queue": "法术队列", + "Help_Markers_Selected_Spell_Marker": "已选法术标记", + "Help_Markers_Toggle_Spell_Storage": "切换法术储备开/关", + "Help_Markers_Inactive_Spell": "未激活法术", + "Help_Markers_Empty_Spell_Storage_Slot": "空法术储备槽", + "Help_Markers_Change_Altitude": "改变高度", + "Help_Markers_Health": "生命", + "Help_Markers_Stamina": "耐力", + "Help_Markers_Hunger": "饥饿", + "Help_Markers_Statistics": "属性", + "Help_Markers_Speed": "速度", + "Help_Markers_Experience": "经验", + "Help_Markers_Magic_Stones": "魔法石", + "Help_Markers_Toggle_Minimap": "切换小地图", + "Help_Markers_Map": "地图", + "Help_Markers_Build_Upgrade_Repair_Town": "建造/升级/修理城镇", + "Help_Markers_Game_Speed": "游戏速度", + "Help_Markers_Options": "选项", + "Help_Markers_Camera": "镜头", + "Help_Markers_Current_Quest": "当前任务", + "Help_SaveLoad_Shortcuts": "快速保存:Ctrl-S,快速读取:Ctrl-L", + "Help_Control_Header": "\\a操作", + + # --------------------------------------------------------- dragon select + "RedDragonCaption": "安诺斯--吐火者", + "RedDragonText": "安诺斯是一头强大的战斗巨兽。强壮,且相当敏捷。它不偏好使用魔法,但其天生能力足以弥补。\\n\t飞行速度 = 80 火焰威力 = 50\\n\t生命 = 55 吐息储量 = 30\\n\t再生 = 25 魔力流入 = 25", + "BlackDragonCaption": "莫罗格--亡灵法师", + "BlackDragonText": "莫罗格的魔法属于黑暗一脉。他掌控死亡,能让最凶猛的生物获得半生之躯,且唯有他能操控它们。他行动迟缓,但再生极快。\\n\t飞行速度 = 75 火焰威力 = 40\\n\t生命 = 40 吐息储量 = 55\\n\t再生 = 45 魔力流入 = 35", + "BlueDragonCaption": "巴洛斯--魔法师", + "BlueDragonText": "巴洛斯喷吐液态寒冰冻结敌人。他是最擅长魔法的一条。敏捷而迅速,但防护不足。虽然天生能力平平,但庞大的法术库足以弥补。\\n\t飞行速度 = 85 火焰威力 = 25\\n\t生命 = 35 吐息储量 = 25\\n\t再生 = 20 魔力流入 = 60", + "RedDragonTip": "安诺斯--吐火者", + "BlackDragonTip": "莫罗格--亡灵法师", + "BlueDragonTip": "巴洛斯--魔法师", + + # ----------------------------------------------------------- multiplayer "Multiplayer_Players": "玩家", "Multiplayer_Host": "主机", "Multiplayer_Join": "加入", @@ -62,4 +347,195 @@ CN_STRINGS = { "Multiplayer_IP": "IP:", "Multiplayer_PlayerStateDescription": "%s - %d 经验值", "Multiplayer_ClientSessionTerminated": "\\a游戏已被主机终止。", + + # ------------------------------------------------------------- overhead + "Overhead_TimeSpeed": "\\a时间速度:%d%%\\r\\n\\f慢动作,如同电影般;或加速,来点额外的肾上腺素。", + "Overhead_Life": "\\a生命:%d / %d\\r\\n\\f虽然巨龙的身体凭借坚韧的装甲皮肤、再生能力和魔法防护能承受惊人的伤害,但你远非不死之身。", + "Overhead_Stamina": "\\a耐力:%d%%\\r\\n\\f影响生命恢复速度、最高速度等。", + "Overhead_Hunger": "\\a饥饿:%d%%\\r\\n\\f与普遍看法相反,巨龙能长时间不进食,有时可达数年。但为了快速恢复(如果还能恢复的话),你必须保持健康的饮食。大型怪物无法被吞食。", + "Overhead_BreathCapacity": "\\a吐息储量:%d%%\\r\\n\\f用光标指向目标并按下鼠标右键攻击。按住越久,攻击越强。", + "Overhead_FireBlastCapacity": "\\a火焰冲击威力:%d%%\\r\\n\\f按住鼠标右键时,此指示器显示你不断增长的攻击力。松开按钮即发动攻击。", + "Overhead_SpellsChargeLevel": "\\a法术蓄力等级:%d%%\\r\\n\\f显示可用于为当前激活法术蓄力的魔法能量。蓄力速度还取决于同时蓄力的法术数量和等级。", + "Overhead_CharacterStatistics": "\\a角色属性\\n\\b升级所需经验:%i(已完成 %i%%)。", + "Overhead_CharacterStatistics_DisabledForThisUnit": "\\a角色属性\\n\\b此角色不可用。", + "Overhead_AvailableSpells": "\\a可用法术\\n切换法术池显示开/关。", + "Overhead_Minimap": "\\a小地图\\n切换小地图显示开/关。", + "Overhead_FireBreathFireBlast": "\\a火焰吐息/火焰冲击(切换)\\r\\n\\f点击此按钮在两种基本攻击模式间切换。", + "Overhead_Options": "\\a游戏选项\\r\\n\\f更改游戏、音频、视频和输入设置。", + "Overhead_Pause": "\\a暂停\\r\\n\\f游戏暂停,但你仍可环顾四周并向角色下达指令。花点时间想想策略。", + "Overhead_CannotCatch": "不饿!", + "Overhead_Catch": "抓取", + "Overhead_CannotSwallow": "无法吞噬", + "Overhead_Swallow": "吞噬", + "Overhead_Up": "上", + "Overhead_Down": "下", + "Overhead_Stop": "停止", + "Overhead_Slow": "慢", + "Overhead_Fast": "快", + "Overhead_DragonCamera": "巨龙镜头 <<<\\n视角镜头\\n跟随镜头", + "Overhead_EyesCamera": "巨龙镜头\\n视角镜头 <<<\\n跟随镜头", + "Overhead_MissileCamera": "巨龙镜头\\n视角镜头\\n跟随镜头 <<<", + "Overhead_TownInfo_NoTown": "无城镇", + "Overhead_TownInfo_TownLevel": "城镇等级 %i(完好度 %i%%)", + "Overhead_TownRepair_EnergyForRepair": "\\n修理所需能量:%i / %i(%i%%)", + "Overhead_TownRepairUpgrade_UnderAttack": "\\n正遭受攻击", + "Overhead_TownRepairUpgrade_FarFromTown": "\\n离城镇太远", + "Overhead_TownRepair": "修理", + "Overhead_TownRepair_CannotRepair": "无法修理%s%s%s%s", + "Overhead_TownUpgrade_CannotUpgrade": "无法升级%s%s%s%s", + "Overhead_TownUpgrade": "升级城镇", + "Overhead_EnergyForUpgrade": "\\n升级所需能量:%i / %i(%i%%)", + "Overhead_NoUpgrade": "没有更多可用的升级", + "Overhead_BuildTown": "建造城镇", + "Overhead_BuildProgress": "已完成 %i%%", + "Overhead_TooFarFromTownPlace": "离城镇中心太远", + "Overhead_BuildTown_NoPlace": "此区域没有适合建城的位置", + "Overhead_BuildTown_NoSkill": "没有建造技能", + "Overhead_TownRepair_NoSkill": "\\n没有修理技能", + "Overhead_TownUpgrade_NoSkill": "\\n没有升级技能", + "Overhead_TownBuildRepairUpgrade_DisabledForThisUnit": "\\n此角色不可用", + "Overhead_TownRepair_HostileTown": " 敌对城镇", + "Overhead_TownUpgrade_HostileTown": " 敌对城镇", + "Overhead_GlobalMap": "\\a世界地图", + "Overhead_ExpBar": "\\a升级所需经验:%i(已完成 %i%%)", + "Overhead_NewLevel": "新等级", + "Overhead_Zoom": "缩放:%.1f 倍", + "Overhead_Hungry": "饥饿", + "Overhead_DeadDialog_Header": "你的角色已死亡", + "Overhead_DeadDialog_Text": "是否载入上次保存的游戏 \\\"%s\\\"?", + "Overhead_DeadDialog_Multiplayer_Text": "\\a已重生", + "Overhead_Multiplayer_GameOver": "\\a游戏结束", + "Overhead_Multiplayer_MainMenu": "\\a确定 - 退出,取消 - 继续游戏。", + "Overhead_Tutorial_MainMenu": "\\a确定 - 退出,取消 - 继续教程。", + "Overhead_StoneType0": "\\a红色魔法石\\r\\n\\f在劫掠城市时,一些怪物获得了若干神圣水晶。它们通常把宝物藏在巢穴中。将这些水晶集齐,便会成为相当强大的力量源泉。若能收集齐一整套,这股力量便可用来对抗邪恶。", + "Overhead_StoneType1": "\\a绿色魔法石\\r\\n\\f在劫掠城市时,一些怪物获得了若干神圣水晶。它们通常把宝物藏在巢穴中。将这些水晶集齐,便会成为相当强大的力量源泉。若能收集齐一整套,这股力量便可用来对抗邪恶。", + "Overhead_StoneType2": "\\a蓝色魔法石\\r\\n\\f在劫掠城市时,一些怪物获得了若干神圣水晶。它们通常把宝物藏在巢穴中。将这些水晶集齐,便会成为相当强大的力量源泉。若能收集齐一整套,这股力量便可用来对抗邪恶。", + "Overhead_CurrentMission": "当前任务", + "Overhead_MissionButton": "当前任务", + "Overhead_SpellTooltipDescription": "等级 %i\\n威力:%i\\n储量:%i\\n距离:%i\\n施法时间:%s\\n持续时间:%s\\n", + "Overhead_ContinueTutorialButton": "继续教程", + "Overhead_FinishTutorialButton": "完成教程", + + # ------------------------------------------------------------- stats UI + "Stats_DragonStatistics": "巨龙属性。你可以用经验点提升它们。", + "Stats_FlySpeed": "\\a飞行速度\\r\\n\\f也有助于躲避敌人的火力。", + "Stats_Life": "\\a生命\\r\\n\\f你的角色在不死亡的情况下能承受多少伤害。", + "Stats_Regeneration": "\\a再生\\r\\n\\f生命恢复速度让你存活更久,并更快重返战斗。", + "Stats_FirePower": "\\a火焰威力\\r\\n\\f自然攻击(冲击、吐息)的威力。当火焰威力足够高时,某些巨龙会获得新的攻击方式。", + "Stats_BreathCapacity": "\\a吐息储量\\r\\n\\f决定你能连续发出多少次自然冲击。若吐息耗尽为零,你必须等待其重新蓄满,只能依靠魔法和敏捷来求生。", + "Stats_ManaInflow": "\\a魔力流入\\r\\n\\f巨龙用魔力为法术蓄力。它有一股魔力流来填充法术,并在所有正在蓄力的法术间平均分配。魔力流入越高,所有法术蓄力越快。", + "Stats_SpellSlots": "\\a法术槽\\r\\n\\f可用的法术槽数量。你同一时间只能为这个数量的法术蓄力。从巢穴中收集绿色魔法水晶可以增加此数量。", + "Stats_Value": "当前数值", + "Stats_SpellSlots_Value": "法术槽数量", + "Stats_Cost": "\\a升级消耗\\r\\n\\f此参数每点属性的升级消耗。不同巨龙在每个参数上的升级消耗各不相同。", + "Stats_Experience": "\\a经验\\r\\n\\f巨龙通过击杀怪物和完成任务获得经验。每升一级都会获得若干属性点,可分配到参数和法术上。", + "Stats_ExperienceForNextLevel": "\\a距离下一级还需:%i 点经验\\r\\n\\f当巨龙获得这些经验后,将得到更多可分配的属性点。", + "Stats_Level": "\\a等级\\r\\n\\f巨龙通过击杀怪物和完成任务提升等级。某些法术只有达到特定等级才可使用。", + "Stats_PointsLeft": "\\a属性点\\r\\n\\f巨龙每升一级都会获得一定数量的属性点,可用于提升属性或学习新法术。", + "Stats_NewSpells": "新法术列表", + "Stats_SpellsSelected": "已选法术", + "Stats_SpellCost": "法术消耗", + "Stats_NextLevelSpell": "下一级法术\\n%s", + "Stats_OK": "确定", + "Stats_Cancel": "取消", + + # ------------------------------------------------------------- dialogs + "DialogButton_Load": "载入上次保存的游戏", + "DialogButton_Quit": "退出到主菜单", + "DialogButton_Cancel": "取消", + "GoToArea_DialogText_TooSick": "你会在旅途中丧命!留在这里治疗自己吧。", + "GoToArea_DialogText_TooFar": "你还不能去那里!你需要先在相邻区域建一座城镇,并摧毁那里的所有巢穴。", + "GoToArea_DialogText_NoAdmission": "你不能去那里!请查看当前任务信息。", + "GoToArea_DialogHeader_GoTo": "前往 ", + "GoToArea_DialogHeader_CantGoTo": "无法前往 ", + "GoToArea_DialogText_GoToAreaQuestion": "确定要离开当前区域吗?", + + # ------------------------------------------------------------ teletypes + "Teletype_TownIsUnderAttack": "城镇正遭受攻击", + "Teletype_TownDamage75": "城镇损伤:75%", + "Teletype_TownDamage50": "城镇损伤:50%", + "Teletype_TownDamage25": "城镇损伤:25%", + "Teletype_TownDestroyed": "城镇已被摧毁!", + "Teletype_TownRepairIsEnabled": "城镇修理已可用", + "Teletype_TownUpgradeIsEnabled": "城镇升级已可用", + "Teletype_NoMonstersCurrent": "本区域已无怪物", + "Teletype_NoMonsters": "守军击退了进攻", + "Teletype_NoLairs": "本区域已无巢穴", + "Teletype_NewLair": "新巢穴!", + "Teletype_Invasion_Small": "小规模入侵!", + "Teletype_Invasion_Medium": "中等规模入侵!", + "Teletype_Invasion_Big": "大规模入侵!", + "Teletype_AreaIsAvailableNow": "新区域已开放。", + + # ----------------------------------------------------- natural attacks + "BlueDragonBreath": "冰霜吐息\\r\\n冻结目标并造成伤害。仅能近距离使用。", + "IceBlast": "寒冰冲击\\r\\n从远处对敌人造成伤害的寒冰冲击。", + "FreezeBlast": "冰封冲击\\r\\n冻结敌人的冲击。", + "FireBlast": "火焰冲击\\r\\n从远处伤害敌人的火球。", + "FireBreath": "火焰吐息\\r\\n伤害敌人,仅能近距离使用。", + "RedDragonFireMissile": "火焰飞弹\\r\\n自导火焰飞弹。", + "AdvancedFireBlast": "高级火焰冲击\\r\\n更大更强的火球,从远处伤害敌人。", + "RedDragonAdvancedFireMissile": "高级火焰飞弹\\r\\n高级自导火焰飞弹。", + "SuperFireBlast": "超级火焰冲击\\r\\n从远处伤害敌人的最佳火球。", + "RedDragonSuperFireMissile": "超级火焰飞弹\\r\\n超级自导火焰飞弹。", + "BlackDragonBlast": "黑暗冲击\\r\\n从远处伤害敌人的黑暗能量球。", + "BlackDragonBreath": "黑暗吐息\\r\\n伤害敌人,仅能近距离使用。", + "BlackDragonBlastAcid": "酸液冲击\\r\\n从远处伤害敌人的毒酸团块。", + "BlackDragonBreathAcid": "酸液吐息\\r\\n伤害敌人,仅能近距离使用。", + "BlackDragonBlastSuperAcid": "超级酸液冲击\\r\\n从远处伤害敌人的超强毒酸团块。", + "BlackDragonBreathSuperAcid": "超级酸液吐息\\r\\n伤害敌人,仅能近距离使用。", + "FireMissile": "火焰飞弹", + "GreenAcidBlast": "绿色酸液冲击", + "Canyon": "峡谷", + + # ----------------------------------------------------------- map screen + "Map_Exit": "退出地图界面。", + "Map_Status": "\\a%s\\n\\b%s,%i 个巢穴%s。\\n%i 个怪物%s,%i 个人类%s。\\n%s%s", + "Map_Status_NoTown": "无城镇", + "Map_Status_TownLevelHeath": "城镇等级 %i(完好度 %i%%)", + "Map_Status_YouAreHere": " 你在这里。", + "Map_Status_Accessible": " 可进入。", + "Map_Status_TooFar": "你不能去那里!你需要先在相邻区域建一座城镇,并摧毁那里的所有巢穴。", + "Map_Status_NoAdmission": " 禁止进入。", + + # ----------------------------------------------------- misc / messages + "ScriptScenePauseText": "暂停", + "GameSaved": "游戏 \\\"%s\\\" 已保存", + "GameLoaded": "游戏 \\\"%s\\\" 已载入", + "SaveFailed": "保存失败", + "LoadFailed": "载入失败", + "ScreenshotSavedText": "\\\"%s\\\" 已保存。", + "FlyingHits_Experience": "经验: ", + "AddAbility_SpellSlot": "你获得了一个额外的法术槽。", + "AddAbility_Source": "你获得了 %i 点魔力流入。", + "AddAbility_FirePower": "你获得了 %i 点火焰威力。", + "AddAbility_Regeneration": "你获得了 %i 点再生。", + "AddAbility_Life": "你获得了 %i 点生命。", + "AddAbility_Speed": "你获得了 %i 点速度。", + "AddAbility_Experience": "你获得了 %i 点经验。", + "AddAbility_Spell": "你获得了新法术:%s。", + "AddAbility_Weapon": "你获得了新武器:%s。", + "AddAbility_WeaponReplace": "你的武器已从 %s 升级为 %s。", + "TipPrefix": "你知道吗……\\n", + "Savegame_Filename_Quicksave": "快速存档", + "Savegame_Filename_Auto_Leaving": "自动-离开", + "Savegame_Filename_Auto_NewGame": "自动-新游戏", + "Savegame_Filename_Auto_Level": "自动-升级", + "Savegame_Filename_New": "<新建>", + "Savegame_Filename_Template": "存档", + + # ------------------------------------------------------------ area names + "Mediterrano": "地中海", + "Golden Woods": "黄金森林", + "Hole": "陷坑", + "North Star": "北极星", + "Ferra": "费拉", + "Wonderland": "奇境", + "Rockwood": "石林", + "Earthskull": "大地之颅", + "Forest": "森林", + "Terra": "泰拉", + "Crimea": "克里米亚", + "Turf": "草甸", + "Gerra": "杰拉", } diff --git a/tools/dump_all_strings.py b/tools/dump_all_strings.py new file mode 100644 index 0000000..81300f8 --- /dev/null +++ b/tools/dump_all_strings.py @@ -0,0 +1,16 @@ +import json +import re +import sys + +raw = open(r"E:\DragonHD\backup_game\Strings.dat", "rb").read() +pat = re.compile( + rb'Id\s*=\s*"([^"]*)"\s*[\r\n]+\s*English\s*=\s*"((?:[^"\\]|\\.)*)"', + re.S, +) +out = [] +for m in pat.finditer(raw): + out.append([m.group(1).decode("latin1"), m.group(2).decode("latin1")]) +print("entries:", len(out)) +dst = r"E:\DragonHD\build\strings_en.json" +open(dst, "w", encoding="utf-8").write(json.dumps(out, ensure_ascii=False, indent=0)) +print("wrote", dst)