| Crates.io | esp_extractor |
| lib.rs | esp_extractor |
| version | 0.7.0 |
| created_at | 2025-06-08 23:14:53.592113+00 |
| updated_at | 2025-11-26 15:11:50.180098+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 | 452,738 |
一个用于处理 Bethesda 游戏引擎(ESP/ESM/ESL)文件和字符串文件的 高性能 Rust 库。支持 Skyrim、Fallout 等游戏的 Mod 翻译工作流。
[dependencies]
esp_extractor = "0.7.0"
cargo install esp_extractor --features cli
# 1. 提取字符串到 JSON
esp_extractor -i "MyMod.esp" -o "strings.json"
# 2. 编辑 JSON 文件中的 text 字段为翻译文本
# 3. 应用翻译
esp_extractor -i "MyMod.esp" --apply-file "strings_cn.json" -o "MyMod_CN.esp"
use esp_extractor::LoadedPlugin;
// 自动加载插件(包括 STRING 文件)
let loaded = LoadedPlugin::load_auto("MyMod.esp".into(), Some("english"))?;
// 提取字符串
let strings = loaded.extract_strings();
println!("提取到 {} 个字符串", strings.len());
// 保存到 JSON
let json = serde_json::to_string_pretty(&strings)?;
std::fs::write("strings.json", json)?;
.STRINGS、.ILSTRINGS、.DLSTRINGS 文件cargo build --release)examples/performance_comparison.rs| 版本 | 技术方案 | 加载时间 | 相对提升 |
|---|---|---|---|
| v0.4.0 | fs::read + 克隆 |
240秒 | 基线 |
| v0.5.0 阶段1 | memmap2 + Cow |
120秒 | 2x |
| v0.5.0 | rayon 并行化 |
9秒 | 26x |
# 基础提取
esp_extractor -i "MyMod.esp" -o "strings.json"
# 包含本地化字符串(显示为 StringID)
esp_extractor -i "MyMod.esp" --include-localized -o "all_strings.json"
# 显示统计信息
esp_extractor -i "Skyrim.esm" --stats
# 自动检测文件类型
esp_extractor -i "Dragonborn_english.ILSTRINGS" -o "dragonborn.json"
# 查看统计信息
esp_extractor -i "Skyrim_english.STRINGS" --stats
# 从 JSON 文件应用翻译
esp_extractor -i "MyMod.esp" --apply-file "translations.json" -o "MyMod_CN.esp"
# 从 JSON 字符串应用部分翻译(适合少量修改)
esp_extractor -i "MyMod.esp" --apply-jsonstr '[{"editor_id":"IronSword","form_id":"00012BB7|Skyrim.esm","text":"铁剑","record_type":"WEAP","subrecord_type":"FULL","index":0}]' -o "MyMod_CN.esp"
# 从标准输入读取翻译(适合脚本处理)
cat translations.json | esp_extractor -i "MyMod.esp" --apply-partial-stdin -o "MyMod_CN.esp"
# 将 ESP 转换为 ESL(FormID 重编号)
esp_extractor -i "MyMod.esp" --eslify -o "MyMod.esl"
# 注意:最多支持 2048 条新记录
JSON 格式的字符串数组:
{
"editor_id": "IronSword",
"form_id": "00012BB7|Skyrim.esm",
"text": "Iron Sword",
"record_type": "WEAP",
"subrecord_type": "FULL",
"index": 0
}
editor_id: 编辑器 IDform_id: FormID|主文件名text: 文本内容(提取时为原文,应用翻译时为译文)record_type: 记录类型(如 WEAP、NPC_、BOOK)subrecord_type: 子记录类型(如 FULL、DESC)index: 同类型子记录索引(从 0 开始)应用翻译时使用 四重匹配 确保精确性:
editor_id + form_id + record_type + subrecord_type + index(可选)-i, --input <FILE>: 输入文件路径(必需)-o, --output <FILE>: 输出文件路径(可选)--stats: 显示文件统计信息--quiet: 静默模式--include-localized: 包含本地化字符串(显示为 StringID)--unfiltered: 包含所有字符串,跳过智能过滤--apply-file <JSON_FILE>: 从 JSON 文件应用翻译--apply-jsonstr <JSON_STRING>: 从 JSON 字符串应用指定翻译--apply-partial-stdin: 从标准输入读取 JSON 翻译--eslify: 转换为 ESL 插件(FormID 重编号)--test-rebuild: 测试解析和重建逻辑--compare-files <FILE>: 对比两个 ESP 文件的结构差异完整选项请运行 esp_extractor --help。
提取字符串
esp_extractor -i "MyMod.esp" -o "strings.json"
编辑翻译
original_text 字段应用翻译
esp_extractor -i "MyMod.esp" --apply-file "strings_cn.json" -o "MyMod_CN.esp"
质量控制
.bak)use esp_extractor::LoadedPlugin;
// 自动检测 LOCALIZED 标志并加载 STRING 文件
let loaded = LoadedPlugin::load_auto("MyMod.esp".into(), Some("english"))?;
// 提取字符串
let strings = loaded.extract_strings();
use esp_extractor::{Plugin, PluginEditor, DefaultEspWriter};
// 加载插件
let plugin = Plugin::load("MyMod.esp".into())?;
// 创建编辑器
let mut editor = PluginEditor::new(plugin);
// 应用翻译
editor.apply_translations(translations)?;
// 保存修改
let writer = DefaultEspWriter;
editor.save(&writer, "MyMod_CN.esp".as_ref())?;
use esp_extractor::LocalizedPluginContext;
// 显式加载本地化插件(ESP + STRING 文件)
let context = LocalizedPluginContext::load("DLC.esm".into(), "english")?;
// 访问插件和 STRING 文件
println!("插件: {}", context.plugin().get_name());
println!("STRING 文件数: {}", context.string_files().files.len());
// 提取字符串(包含 STRING 文件内容)
let strings = context.plugin().extract_strings();
详细 API 文档请访问 docs.rs。
# 构建库
cargo build
# 构建命令行工具
cargo build --features cli
# 运行测试
cargo test
# 生成文档
cargo doc --open
欢迎贡献代码!请查看 CONTRIBUTING.md 了解详细信息。
本项目采用 MIT 或 Apache-2.0 双重许可证。详情请查看 LICENSE-MIT 和 LICENSE-APACHE 文件。
模块化重构
重构效果
新增功能
ba2 crate 实现 TES4 格式 BSA 读取Skyrim - Interface.bsa)string_records.json 中添加 AMMO 的 DESC 支持字段命名优化
original_text → text
测试验证
架构改进
src/bsa/ 模块:
BsaArchive: 底层 BSA 文件访问BsaStringsProvider: STRING 文件专用提取器LoadedPlugin::load_auto() 工作流依赖更新
ba2 = "3" - Bethesda 归档文件解析关键修复
LoadedPlugin::load_auto() 对本地化插件会加载 ESP 文件两次LocalizedPluginContext::new_with_plugin() 复用已加载的 Plugin架构改进
LocalizedPluginContext::new_with_plugin() APIexamples/performance_comparison.rs重要修复
提取率提升
测试覆盖
性能优化
功能完善
测试验证
架构升级
核心功能
当前版本: v0.7.0 推荐用途: Mod 翻译、数据提取、批量处理、BSA 归档字符串提取