| Crates.io | esp_extractor |
| lib.rs | esp_extractor |
| version | 0.3.0 |
| created_at | 2025-06-08 23:14:53.592113+00 |
| updated_at | 2025-06-25 01:06:20.261748+00 |
| description | A Rust library for extracting and applying translations to Bethesda ESP/ESM/ESL files |
| homepage | https://github.com/Orcax-1399/esp-string-parser |
| repository | https://github.com/Orcax-1399/esp-string-parser |
| max_upload_size | |
| id | 1705321 |
| size | 171,522 |
一个用于处理Bethesda游戏引擎(ESP/ESM/ESL)文件和字符串文件的Rust库。支持字符串提取、翻译应用、字符串文件解析和文件结构调试。
将以下内容添加到你的 Cargo.toml 文件中:
[dependencies]
esp_extractor = "0.2.0"
cargo install esp_extractor --features cli
或者从源码构建:
git clone https://github.com/yourusername/esp-string-parser.git
cd esp-string-parser
cargo build --release --features cli
.STRINGS、.ILSTRINGS、.DLSTRINGS 文件详细的字符串文件使用说明请参考:STRING_FILE_USAGE.md
esp_extractor -i "MyMod.esp" -o "MyMod_strings.json"
输出示例:
正在解析插件: "MyMod.esp"
扫描到 15 个组(包含子组)
扫描到 1250 个记录
提取到 324 个有效字符串
结果已写入: "MyMod_strings.json"
样例字符串:
1. [00012BB7|Skyrim.esm] WEAP FULL: "Iron Sword"
2. [00013BB9|MyMod.esp] NPC_ FULL: "神秘商人"
...
直接修改JSON文件中的 original_text 字段为翻译文本:
修改前:
{
"editor_id": "IronSword",
"form_id": "00012BB7|Skyrim.esm",
"original_text": "Iron Sword",
"record_type": "WEAP",
"subrecord_type": "FULL",
}
修改后:
{
"editor_id": "IronSword",
"form_id": "00012BB7|Skyrim.esm",
"original_text": "铁剑",
"record_type": "WEAP",
"subrecord_type": "FULL"
}
esp_extractor -i "Data/MyMod.esp" --apply-file "MyMod_CN.json" -o "Data/MyMod_CN.esp"
esp_extractor -i "Data/MyMod.esp" --apply-jsonstr '[{"editor_id":"IronSword","form_id":"00012BB7|Skyrim.esm","original_text":"铁剑","record_type":"WEAP","subrecord_type":"FULL"}]' -o "Data/MyMod_CN.esp"
cat MyMod_translations.json | esp_extractor -i "Data/MyMod.esp" --apply-partial-stdin -o "Data/MyMod_CN.esp"
esp_extractor -i "Data/MyMod.esp" --apply-file "MyMod_CN.json"
# 输出: MyMod.esp (覆盖原文件,会自动创建备份)
esp_extractor -i "Data/MyMod.esp" --apply-jsonstr '[...]'
# 输出: MyMod.esp (覆盖原文件,会自动创建备份)
翻译应用输出示例:
准备应用 1 个翻译条目
翻译条目 1: [00012BB7|Skyrim.esm] WEAP FULL -> "铁剑"
翻译应用完成,输出到: "MyMod_CN.esp"
-i, --input <FILE>: 输入文件路径(ESP/ESM/ESL或字符串文件)(必需)-o, --output <FILE>: 输出文件路径 (可选)--stats: 显示文件统计信息--quiet: 静默模式--include-localized: 包含本地化字符串(显示为StringID)--unfiltered: 包含所有字符串,跳过智能过滤--parse-strings <FILE>: 明确指定解析字符串文件(也可以通过文件扩展名自动检测)--apply-file <JSON_FILE>: 从JSON文件应用翻译到ESP文件--apply-jsonstr <JSON_STRING>: 从JSON字符串应用指定的翻译对象--apply-partial-stdin: 从标准输入读取JSON翻译对象--test-rebuild: 测试模式,解析文件后直接重建(不做任何修改),用于验证解析和重建逻辑--compare-files <ESP_FILE>: 对比两个ESP文件的结构差异# 提取字符串到JSON文件
esp_extractor -i "Data/MyMod.esp"
# 指定输出文件名
esp_extractor -i "Data/MyMod.esp" -o "translations.json"
# 解析字符串文件(自动检测)
esp_extractor -i "Dragonborn_english.ILSTRINGS"
# 明确指定解析字符串文件
esp_extractor --parse-strings "Dragonborn_english.ILSTRINGS" -o "dragonborn_strings.json"
# 查看字符串文件统计信息
esp_extractor -i "Dragonborn_english.ILSTRINGS" --stats
esp_extractor -i "Data/Skyrim.esm" --stats
# 包含本地化字符串
esp_extractor -i "Data/MyMod.esp" --include-localized
# 包含所有字符串(不过滤)
esp_extractor -i "Data/MyMod.esp" --unfiltered
# 完整文件翻译
esp_extractor -i "Data/MyMod.esp" --apply-file "MyMod_CN.json" -o "Data/MyMod_CN.esp"
# JSON字符串翻译(推荐用于少量翻译)
esp_extractor -i "Data/MyMod.esp" --apply-jsonstr '[{"editor_id":"IronSword","form_id":"00012BB7|Skyrim.esm","original_text":"铁剑","record_type":"WEAP","subrecord_type":"FULL"}]' -o "Data/MyMod_CN.esp"
# 从标准输入读取翻译
cat MyMod_translations.json | esp_extractor -i "Data/MyMod.esp" --apply-partial-stdin -o "Data/MyMod_CN.esp"
# 自动命名输出文件(覆盖原文件)
esp_extractor -i "Data/MyMod.esp" --apply-file "MyMod_CN.json"
# 输出: MyMod.esp (覆盖原文件,会自动创建备份)
esp_extractor -i "Data/MyMod.esp" --apply-jsonstr '[...]'
# 输出: MyMod.esp (覆盖原文件,会自动创建备份)
# 测试解析和重建逻辑(用于调试)
esp_extractor -i "Data/MyMod.esp" --test-rebuild
# 指定输出文件
esp_extractor -i "Data/MyMod.esp" --test-rebuild -o "MyMod_test.esp"
# 对比两个ESP文件的结构差异
esp_extractor -i "Data/MyMod_Original.esp" --compare-files "Data/MyMod_Modified.esp"
# 静默模式对比(仅显示差异)
esp_extractor -i "Data/MyMod_Original.esp" --compare-files "Data/MyMod_Modified.esp" --quiet
程序输出 JSON 格式的字符串数组:
{
"editor_id": "IronSword",
"form_id": "00012BB7|Skyrim.esm",
"original_text": "Iron Sword",
"record_type": "WEAP",
"subrecord_type": "FULL"
}
editor_id: 编辑器IDform_id: FormID|主文件名original_text: 原始文本(提取时为原文,应用翻译时修改为译文)record_type: 记录类型subrecord_type: 子记录类型应用翻译时使用三重匹配确保精确性:
editor_id + form_id + record_type + " " + subrecord_typedata/string_records.json)自动过滤的内容:
MyVariable)my_variable)<p>)支持的字符:
editor_id + form_id + record_type + " " + subrecord_type 匹配正确.bak 备份文件# 1. 提取所有字符串
esp_extractor -i "MyMod.esp" -o "all_strings.json"
# 2. 选择需要翻译的条目,复制到单独文件或直接使用
# 3. 修改 original_text 字段为翻译文本
# 4. 应用翻译
esp_extractor -i "MyMod.esp" --apply-jsonstr '[翻译的JSON对象]' -o "MyMod_CN.esp"
# 或者从文件应用
esp_extractor -i "MyMod.esp" --apply-file "selected_translations.json" -o "MyMod_CN.esp"
# 或者从标准输入应用(适合脚本处理)
cat selected_translations.json | esp_extractor -i "MyMod.esp" --apply-partial-stdin -o "MyMod_CN.esp"
"Invalid file format" 错误
"Insufficient data" 错误
编码问题
翻译应用失败
详细的API文档可以在 docs.rs 上查看。
# 构建库
cargo build
# 构建命令行工具
cargo build --features cli
# 运行测试
cargo test
# 生成文档
cargo doc --open
src/
├── lib.rs # 库的主入口
├── main.rs # 命令行工具入口
├── datatypes.rs # 基础数据类型定义
├── record.rs # 记录解析逻辑
├── group.rs # 组解析逻辑
├── plugin.rs # 插件主类
├── subrecord.rs # 子记录解析
├── string_types.rs # 字符串类型定义
├── utils.rs # 工具函数
└── debug.rs # 调试工具
data/
└── string_records.json # 字符串记录定义
欢迎贡献代码!请查看 CONTRIBUTING.md 了解详细信息。
本项目采用 MIT 或 Apache-2.0 双重许可证。详情请查看 LICENSE-MIT 和 LICENSE-APACHE 文件。