MIT License

项目介绍

SolicenTEAM/UEExtractor 是一个托管在 GitHub 上的开源项目,主要使用 C# 编写,采用 MIT License 许可证,目前获得 51 个 Star、2 次 Fork。

仓库全名
SolicenTEAM/UEExtractor
开源许可证
MIT License
Star 数
51
Fork 数
2

README 摘要

Solicen.UEExtractor English | Русский Made with ❤️ for all translators and translation developers. This a tool on .NET 10.0 to extract text from any game on Unreal Engine (4.0 - 5.8). Using CUE4Parse to work with Unreal Engine archives .pak and .utoc. With it, you will receive a locresCSV file for localization of the game based on its resources. [!IMPORTANT] Now available fully functional extraction of DataTable,…

完整内容见 GitHub 原始 README 或本页 。

常见问题

UEExtractor 用什么语言开发?

主要使用 C# 编写,采用 MIT License 许可证,目前有 51 个 Star。

UEExtractor 可以免费商用吗?

仓库采用 MIT License 许可证,可免费使用与修改,商业使用请遵守许可证条款(例如保留版权声明与许可声明)。

如何获取 UEExtractor 的源码?

可以直接克隆仓库:git clone https://github.com/SolicenTEAM/UEExtractor.git;安装与运行步骤见仓库 README。

UEExtractor 最近还在维护吗?

仓库最近一次更新为 6月9日,当前没有未关闭的 Issue;Star 数为 51,可作为社区活跃度的参考。

关于

GitHub 原始描述(英文)

Extracts text from Unreal Engine: .pak or .ucas archive files to localize the game.

描述取自 GitHub 官方 API,保持仓库作者书写的原文。

简要分析

热度分
106
价值分
36
活跃状态
活跃

语言占比

C#
Python

README

Solicen.UEExtractor

English | Русский

Made with ❤️ for all translators and translation developers.

This a tool on .NET 10.0 to extract text from any game on Unreal Engine (4.0 - 5.8).
Using CUE4Parse to work with Unreal Engine archives .pak and .utoc.

With it, you will receive a locresCSV file for localization of the game based on its resources.

Important 重要

Now available fully functional extraction of DataTable, StringTable and direct .locres reading for games that ship pre-compiled localization binaries.

LocresCSV Structure:

Will be imported or converted to .locres file.

  • key = unique string of 32 characters.
  • source = string from decoded text data
  • Translation = null from unpacked resources
key,source,Translation
4A6FDB1549E45F6C5D8D739129686E2F,Default,

Importing a Translation column from CSV also possible via UE4localizationsTool.

Preparation:

For games running on Unreal Engine 4 before ZenLoader.

Find out if your game requires an AES key or not, as it may not be needed and the steps can be skipped.

Tip 提示

The engine version and game type are detected automatically from the game executable.

  • For many well-known games (see Supported games) no -v flag is needed at all.
  • You can still override with -v=UE5_1 if auto-detection gives wrong results.
  • All UE version values come from the CUE4Parse library; find the right one via FModel.
  1. You will need to have an AES key to view the archives and retrieve data from them.
    • You can find it online if you don’t have it, or find it yourself from the resources.
    • You can also get it using the --aes:auto argument if the game does not have special encryption.
  2. Place aes.txt in the main game directory with one line as 32-character hex string.
    • Or provide it with the argument --aes=<key>. Key must start with 0x.

For games running on Unreal Engine 4-5 with ZenLoader.

First, follow the steps described above, and only then continue.

Important 重要

You need to get the .usmap file to access the game’s resources and archives.

  1. Place the .usmap file in the main directory of the game (or a subdir), and the tool will find it automatically.
  2. The preparation for the work is completed.

Supported games

The following games are auto-detected by folder or executable name — no -v flag required. Game-specific pak formats, index offsets, and custom encryption are applied automatically via CUE4Parse.

Game Notes
Neverness To Everness Custom pak index offset; .locres files are encrypted
Ash Echoes Custom file provider
Wuthering Waves / KuroGames Partial-encryption pak format
inZOI Custom FPakInfo offset
Marvel Rivals Custom encryption (auto-configured by CUE4Parse)
Dead by Daylight Custom encryption (auto-configured by CUE4Parse)
FragPunk Custom global IoStore handling
Infinity Nikki Custom encryption (auto-configured by CUE4Parse)
Snowbreak: Containment Zone —

[!TIP] Detection works on the game folder name and the main .exe name (spaces, hyphens and underscores are ignored). If your game is not listed, use -v=<UE_version> to specify the version manually.

Merging CSV

Note 注意

It happens automatically when you re-run the extraction of the same game (in the same folder).

  • Very useful when the game is being updated and you need to get new lines without losing the translation.

Exactly how it works:

  • If the row contains values in only 2 columns (key & source) and the Source value in the Key does not match — the Source value from the past is added as a Translation. (As an example when exporting from UE4localizationsTool)
  • Otherwise, if it matches, the value from the Translation column is written to Translation.
  • Lines present in the previous file but not in the new one are preserved.

Using:

  • Download and drag & drop a folder onto UEExtractor.exe to parse the whole game directory and get <dir_name>.csv.
  • Or use UEExtractor.exe in the command line with arguments.

UEExtractor - Unreal Engine (Text) Extractor

  • Drag & drop the game folder onto UEExtractor.exe to get <dir_name>_locres.csv.
  • Drag & drop a locresCSV file onto UEExtractor.exe to get a .locres file.
  • Or use the advanced options below via CMD.
Extract LocresCSV from game:
UEExtractor.exe <dir_path> [output_csv] [arguments...]
Create .locres from csv file:
UEExtractor.exe <csv_path> <output_locres>
Patch mode — perfect locres reconstruction for NTE-encrypted games:
UEExtractor.exe <original.locres> <translations.csv> -v=GAME_NevernessToEverness

The patch mode is the recommended approach for games like Neverness to Everness that use NTE-encrypted v3 .locres files.

Instead of rebuilding the locres from scratch (which can miss entries), it:

  1. Reads the original game .locres as a structural template (preserving every namespace, hash, key and their exact order).
  2. Replaces each string with the translated text from the CSV (Translation column, or Source as fallback).
  3. Re-encrypts the strings and writes the output as <original>_patched.locres.

The output is structurally identical to the original — same entry count, same namespace hashes, same key order — guaranteeing correct in-game lookup.

Full NTE translation workflow:

:: Step 1 – Extract and translate to Italian using an OpenRouter model
UEExtractor.exe "L:\Game" K:\output\ --path=HT/Content/Localization/Game/en/ ^
    --lang:from=en --lang:to=it ^
    --api:key=<your_key> --api:model=<model> --batch-size=50

:: Step 2 – Dump the original encrypted locres for use as template
UEExtractor.exe "L:\Game" K:\output\ --path=HT/Content/Localization/Game/en/ --extract-locres

:: Step 3 – Patch the original locres with Italian translations
UEExtractor.exe Game.locres K:\output\Game.csv -v=GAME_NevernessToEverness
:: → produces Game_patched.locres (deploy this to the game's Localization/it/ folder)

[!TIP] The hash sidecar (.locreshashes) is saved automatically during extraction and loaded during import. It preserves the game-original CityHash64 key hashes so the game’s TMap lookup succeeds even for games that use non-standard hash truncation (like NTE).

Translate with a local LLM (Ollama, LM Studio, vLLM, …):
UEExtractor.exe <dir_path> --api:url=http://localhost:11434/v1/ --api:model=llama3 --lang:from=en --lang:to=it

Any server that exposes an OpenAI-compatible /v1/chat/completions endpoint works. No --api:key is required for local servers.

Extract to a directory — one CSV per locres file:
UEExtractor.exe <dir_path> K:\output\ --path=HT/Content/Localization/Game/en/

When the second argument is a directory path (ends with \ or /), each .locres file gets its own CSV named after it (e.g. Game.csv). If two locres files share the same name (from different pak chunks), the pak chunk name is appended: Game_pakchunk0-Windows.csv.

Scan only a known internal path (much faster):
UEExtractor.exe <dir_path> --path=HT/Content/Localization

If you already know where the localization lives (e.g. from FModel), use --path to skip scanning the entire game.

Arguments

Argument Short Description
--version=<ver> -v Set the engine version or game name. Auto-detected when omitted. Use -v=GAME_NevernessToEverness (or -v=NTE) to enable NTE encrypted locres output. Examples: -v=UE5_6, -v=Stalker2.
--aes=<key> -a 32-character hex AES key (must start with 0x).
--aes:auto -a:auto Automatic extraction AES key into aes.txt at the root of the game (for directories only)
--path=<virtual_path> -p Restrict processing to assets under a specific internal path (e.g. --path=HT/Content/Localization). Case-insensitive substring match.
--verbose -vb Show per-file processing details and diagnostic info instead of the progress bar.
--skip-uexp -s:xp Skip .uexp files during processing.
--skip-uasset -s:et Skip .uasset files during processing.
--locres -l Write a .locres file after parsing.
--extract-locres Dump the raw .locres binaries from the pak to the output directory (useful for inspection or as patch template).
--all -all Process all folders in the archive (including effects, meshes, sounds, etc.).
--no-underscore -n:un Skip lines with underscores: ex_string
--no-uppercase -n:up Skip lines with ALL UPPERCASE: EXAMPLE
--no-parallel -n:p Disable parallel processing (slower; may surface additional data).
--table-format -tf Replace the standard , separator with |.
--headmark -m Include header and footer in the .csv.
--auto-exit -exit Exit automatically after all processes complete.
--invalid -i Include invalid data in the output.
--qmarks -q Forcibly add quotation marks around text strings.
--hash -h Include hash in the key: [key][hash],<string>.
--url -url Include file path in the key: [url][key],<string>.
--picky Picky mode — displays more detailed per-file information.
--table:only:key=<name> -t:o:k Include only entries whose key/name matches the given value.
--lang:from=<code> -l:f Source language for translation (e.g. en).
--lang:to=<code> -l:t Target language for translation (e.g. ru).
--api:key=<key> -a:key API key for OpenRouter or any server that requires authentication.
--api:url=<url> -a:url Custom OpenAI-compatible base URL for a local model (e.g. http://localhost:11434/v1/ for Ollama). Omit for OpenRouter.
--api:model=<model> -a:model Model name to use (e.g. tngtech/deepseek-r1t2-chimera:free for OpenRouter or llama3 for Ollama).
--batch-size=<n> -bs Number of segments sent per translation request (default: 150). Lower for models with small context.
--parallel=<n> -par Number of concurrent translation requests (default: 1). Increase for faster translation with local models.
--translate-only -t:o Skip extraction entirely and translate the existing CSV file(s) from a previous run. Resumes from where translation stopped.
--update Check for a new version on GitHub and update if available.
--help Show help information.

Contributions:

  • You can create your own fork of this project and contribute to its development.
  • You can also contribute via the Issues and Pull Request tabs by suggesting your code changes.

Thanks:

  • Ambi for his original script and idea to research.
  • Saipan for help in researching the creation of a locres file.
  • FabianFG for CUE4Parse library and FModel code example.
  • Nuked88 for excellent work and changes in his fork.

评论

暂无评论