Export & Import¶
Use these commands when you are ready to share translations with collaborators or fold translated strings back into XML.
Export PO¶
export-po writes a single .po file from the source language of a mod. Combine it with scan and validate to hand off a clean bundle to translators.
Usage
rimloc-cli export-po --root <MOD> --out-po <FILE> \
[--lang <CODE>] [--source-lang <CODE>] [--source-lang-dir <DIR>] \
[--tm-root <PATH>]... [--game-version <VER>] [--include-all-versions]
Options
| Option | Description | Required |
|---|---|---|
-r, --root <MOD> |
Path to the RimWorld mod or Languages/<locale> directory to export from. |
Yes |
--out-po <FILE> |
Destination .po file. Existing files are overwritten. |
Yes |
--lang <CODE> |
Target translation language (used in the PO header, e.g. ru, ja). |
No |
--source-lang <CODE> |
ISO code of the source language to export (defaults to en). |
No |
--source-lang-dir <DIR> |
Explicit source language folder name (e.g. English). Overrides --source-lang. |
No |
--tm-root <PATH> |
Path to a translation memory root. Repeatable; each root may be Languages/<lang> or a mod root. Prefills msgstr and marks entries as fuzzy. |
No |
--game-version <VER> |
Version folder to export from (e.g., 1.4, v1.4). Auto-detected if omitted. |
No |
--include-all-versions |
Export from all version subfolders under the root. | No |
Examples
Export the bundled fixture in Russian (quiet to keep stdout clean):
rimloc-cli --quiet export-po --root ./test/TestMod --out-po ./logs/TestMod.po --lang ru
Export Japanese strings that live under Languages/Japanese:
rimloc-cli export-po \
--root ./Mods/MyMod \
--out-po ./build/MyMod.ja.po \
--lang ja \
--source-lang ja
Point to a custom source folder (useful if you renamed English):
rimloc-cli export-po --root ./Mods/MyMod --source-lang-dir Original --out-po ./out/mymod.po
Use multiple translation memory roots (last wins on conflicts):
rimloc-cli export-po \
--root ./Mods/MyMod \
--out-po ./out/mymod.po \
--lang ru \
--tm-root ./Mods/OldMod/Languages/Russian \
--tm-root ./MyTeamGlossary
Tips
- Without
--lang, the exported PO header keeps the default target code (ru). Pass your actual locale to avoid post-editing. --source-langtranslates ISO codes into RimWorld folder names (for example,ru→Russian). If your directory name is custom, use--source-lang-dirinstead.- Combine with
validatebefore exporting to keep broken keys out of the PO hand-off.
Import PO¶
import-po reads a PO file and writes the translated content back into XML. You can import into a single XML file, update an existing mod structure, or preview the changes first.
Usage
rimloc-cli import-po --po <FILE> [--out-xml <XML> | --mod-root <MOD>] [--game-version <VER>] [options]
Options
| Option | Description | Required |
|---|---|---|
--po <FILE> |
Path to the PO file to import. | Yes |
--out-xml <XML> |
Write into a single LanguageData XML file (mutually exclusive with --mod-root). |
No |
--mod-root <MOD> |
Update files under the given mod root based on PO references. | No |
--lang <CODE> |
Target language code, used to resolve Languages/<lang> (defaults to ru). |
No |
--lang-dir <DIR> |
Explicit language folder name (overrides --lang). |
No |
--keep-empty |
Keep empty strings instead of dropping them during import. | No |
--dry-run |
Print the planned writes without touching the filesystem. | No |
--backup |
Create .bak copies before overwriting existing XML files. |
No |
--single-file |
When used with --mod-root, write everything into Keyed/_Imported.xml. |
No |
--game-version <VER> |
If used with --mod-root, target a specific version subfolder (e.g., 1.4). |
No |
--format text|json |
Output format for dry-run and reports (default: text). |
No |
--report |
After import, print a summary (created/updated/skipped files, total keys). | No |
--incremental |
Skip writing files whose content would be identical (byte-for-byte). | No |
--only-diff |
For existing files, write only keys that changed or are new; unchanged keys are skipped. | No |
Examples
Preview the files that would change inside an existing mod:
rimloc-cli --quiet import-po \
--po ./build/MyMod.ja.po \
--mod-root ./Mods/MyMod \
--lang ja \
--dry-run
Write a single XML file for manual review (quiet to keep stdout minimal):
rimloc-cli --quiet import-po --po ./logs/TestMod.po --out-xml ./out/TestMod.ru.xml --keep-empty
Update a mod in-place while keeping backups:
rimloc-cli --quiet import-po \
--po ./build/MyMod.ja.po \
--mod-root ./Mods/MyMod \
--lang ja \
--backup --report --format json
Route everything into _Imported.xml (for translators without the full mod):
rimloc-cli --quiet import-po --po ./logs/TestMod.po --mod-root ./Mods/MyMod --single-file
Only write changed/new keys for each existing file:
```bash
rimloc-cli import-po \
--po ./build/MyMod.ja.po \
--mod-root ./Mods/MyMod \
--only-diff --report --format json | jq .
```
Tips
--dry-runshows the exact paths and key counts RimLoc would touch—great for CI or PR reviews.- Use
--backupwhen importing into a working copy you cannot easily recreate. --lang-dirlets you match non-standard folder names such asGerman (Formal).- Empty translations are skipped by default; pass
--keep-emptyif you want placeholder entries written as-is. - Use
--incrementalto skip rewriting files whose content would not change. - Use
--only-diffto update only changed/new keys in each file (faster diffs, safer merges).
See also¶
- Scan XML — Extract Keyed entries to work with.
- Validate — Check duplicates, empty values, and placeholders in RimWorld mod XML files.
- Validate PO — Compare placeholders inside PO files before importing.
- Build Mod — Package the final PO file into a standalone translation mod.
Troubleshooting¶
- Missing keys on import – run
scanfirst and ensure the PO file was generated from the same mod structure. - Nothing written after import – confirm the language folder exists and the PO references point to files under
Languages/<lang>. - PO encoding issues – PO files must be UTF-8; run
msgconv --output=utf-8if a translator tool saved another encoding.