A set of helper tools to convert Fallout 1/2 MSG and WeiDU TRA into GNU gettext PO and back.
Project description
MSG2PO
A set of tools to convert Fallout 1/2 MSG and WeiDU TRA into GNU gettext PO and back, used in BGforge Hive. Ask questions here.
Table of Contents
Installation
pipx install msg2po
Also install Gettext tools, and make sure they are in PATH.
Configuration
Create a .bgforge.yml file in your project root to configure the tool:
translation:
encoding: cp1252 # source encoding (cp1252 default, cp1251/ru, cp1250/pl, cp1258/vi)
tra_dir: "." # translation root directory
src_lang: "english" # source language (used for poify)
extract_format: "" # "" (default), "sfall" for Fallout
no_female: false # skip female translations
extract_fuzzy: false # include fuzzy entries
Commands
poify
Converts game translation files (MSG, SVE, TXT, TRA) from a source language directory into a single .pot (PO Template) file.
poify [DIR] [-e ENC] [-v] [-q] [-t]
| Argument | Description | Default |
|---|---|---|
DIR |
Source language directory | ./english |
-e ENC |
Source encoding | cp1252 |
-v, --verbose |
Enable verbose output | - |
-q, --quiet |
Suppress info messages | - |
-t, --timestamps |
Show timestamps in log output | - |
Example:
poify ./english -e cp1252
This scans the ./english directory for all translation files and creates ./po/english.pot.
unpoify
Extracts translated files from PO files back into the game's directory structure. Used after translation is done in Weblate/PO editor.
unpoify [DIR] [-v] [-q] [-t]
| Argument | Description | Default |
|---|---|---|
DIR |
Directory with PO files | ./po |
-v, --verbose |
Enable verbose output | - |
-q, --quiet |
Suppress info messages | - |
-t, --timestamps |
Show timestamps in log output | - |
Example:
unpoify ./po
This reads PO files from ./po and extracts translations back into language-specific directories (e.g., ./french/).
file2po
Converts a single game translation file (MSG, SVE, TXT, TRA) into a PO file. Useful for extracting from individual files.
file2po INPUT_SOURCE OUTPUT_PO [-e ENC] [-v] [-q] [-t]
| Argument | Description | Default |
|---|---|---|
INPUT_SOURCE |
Input translation file | - |
OUTPUT_PO |
Output PO file | - |
-e ENC |
Source encoding | cp1252 |
-v, --verbose |
Enable verbose output | - |
-q, --quiet |
Suppress info messages | - |
-t, --timestamps |
Show timestamps in log output | - |
Example:
file2po ./english/dialog.msg ./output.pot -e cp1252
po2file
Converts PO entries back into a single game translation file. The reverse of file2po.
po2file INPUT_FILE OUTPUT_FILE [-e ENC] [--path PATH] [-v] [-q] [-t]
| Argument | Description | Default |
|---|---|---|
INPUT_FILE |
Input PO file | - |
OUTPUT_FILE |
Output translation file | - |
-e ENC |
Output encoding | cp1252 |
--path PATH |
File occurrence in PO (relative path) | Output filename |
-v, --verbose |
Enable verbose output | - |
-q, --quiet |
Suppress info messages | - |
-t, --timestamps |
Show timestamps in log output | - |
Example:
po2file ./french.po ./french/dialog.msg -e cp1252
file2msgstr
Loads translations from a game translation file into the msgstr fields of an existing PO file. Useful for reloading edited translations.
file2msgstr INPUT_FILE OUTPUT_FILE [-e ENC] [--path PATH] [--overwrite] [--same] [-v] [-q] [-t]
| Argument | Description | Default |
|---|---|---|
INPUT_FILE |
Input translation file | - |
OUTPUT_FILE |
Output PO file (must exist) | - |
-e ENC |
Source encoding | cp1252 |
--path PATH |
PO occurrence path | Input filename |
--overwrite |
Overwrite existing translations | - |
--same |
Load translations identical to original strings | - |
-v, --verbose |
Enable verbose output | - |
-q, --quiet |
Suppress info messages | - |
-t, --timestamps |
Show timestamps in log output | - |
Example:
file2msgstr ./french/dialog.msg ./french.po --overwrite
dir2msgstr
Batch loads translations from all files in a directory into corresponding PO files. Reverse of unpoify - used when translators edit files directly instead of PO.
dir2msgstr [--auto] [-s SRC_DIR] [-o OUTPUT_FILE] [--ext EXT] [--same] [--overwrite] [-v] [-q] [-t]
| Argument | Description | Default |
|---|---|---|
--auto |
Auto-find POs and language dirs, process all valid extensions | - |
-s SRC_DIR |
Directory to load from | . |
-o OUTPUT_FILE |
Existing PO file | - |
--ext EXT |
Load files with this extension | - |
--same |
Load translations identical to original strings | - |
--overwrite |
Overwrite existing translations | - |
-v, --verbose |
Enable verbose output | - |
-q, --quiet |
Suppress info messages | - |
-t, --timestamps |
Show timestamps in log output | - |
Example:
dir2msgstr --auto
Or manually:
dir2msgstr -s ./french -o ./french.po --ext msg --overwrite
msgmerge-female
Updates PO files from a POT template using GNU gettext's msgmerge, with special handling to keep female translations. Requires Gettext tools in PATH.
msgmerge-female [PO POT] [-v] [-q] [-t]
| Argument | Description | Default |
|---|---|---|
PO |
PO file to update | - |
POT |
POT template file | - |
-v, --verbose |
Enable verbose output | - |
-q, --quiet |
Suppress info messages | - |
-t, --timestamps |
Show timestamps in log output | - |
Single file:
msgmerge-female french.po english.pot
Batch (uses .bgforge.yml config):
msgmerge-female
resave-po
Resaves a PO file using the polib API to correct formatting. Useful for normalizing PO file structure.
resave-po INPUT_FILE [-v] [-q] [-t]
| Argument | Description | Default |
|---|---|---|
INPUT_FILE |
PO file to resave | - |
-v, --verbose |
Enable verbose output | - |
-q, --quiet |
Suppress info messages | - |
-t, --timestamps |
Show timestamps in log output | - |
Example:
resave-po ./french.po
lowercase
Recursively renames files and directories to lowercase. Useful for preparing case-insensitive file systems.
lowercase DIR [-v] [-q] [-t]
| Argument | Description | Default |
|---|---|---|
DIR |
Directory to process | - |
-v, --verbose |
Enable verbose output | - |
-q, --quiet |
Suppress info messages | - |
-t, --timestamps |
Show timestamps in log output | - |
Example:
lowercase ./french
Note: Excludes .git, .svn, .hg, .github directories, .po files, and README.md.
unfuzzy
Removes fuzzy flags from PO entries where the previous msgid matches the current msgid after applying string replacements. Used to reduce diff noise after source language spelling changes.
Create unfuzzy.yml with replacements:
- ["Nuka Cola", "Nuka-Cola"]
- ["nuka cola", "Nuka-Cola"]
unfuzzy INPUT_FILE [-w] [-v] [-q] [-t]
| Argument | Description | Default |
|---|---|---|
INPUT_FILE |
PO file to process | - |
-w |
Write changes to file (without this, previews only) | - |
-v, --verbose |
Enable verbose output | - |
-q, --quiet |
Suppress info messages | - |
-t, --timestamps |
Show timestamps in log output | - |
Example:
unfuzzy ./french.po -w
bgforge-config
Reads values from .bgforge.yml configuration. Primarily used by GitHub Actions.
bgforge-config STANZA KEY
| Argument | Description |
|---|---|
STANZA |
Config section (e.g., translation) |
KEY |
Config key (e.g., encoding) |
Example:
bgforge-config translation encoding
GitHub Action
A GitHub Action is available for automatic processing. See docs/action.md for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file msg2po-1.5.3.tar.gz.
File metadata
- Download URL: msg2po-1.5.3.tar.gz
- Upload date:
- Size: 60.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.9 {"installer":{"name":"uv","version":"0.11.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2a702fdf7a6003bf497804a217baab4662bf4c10c411ff1eb597f76489095a90
|
|
| MD5 |
6685eaf2b755158337440407cfcee547
|
|
| BLAKE2b-256 |
6f6fc5659a33016604b35e8a8f790881ed5783aec6d4e868168382de3d49f7c9
|
File details
Details for the file msg2po-1.5.3-py3-none-any.whl.
File metadata
- Download URL: msg2po-1.5.3-py3-none-any.whl
- Upload date:
- Size: 39.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.9 {"installer":{"name":"uv","version":"0.11.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7404d86b1ddf43fffedcf7e95fa6363936d6309da1bf16e7e0463adba5a85dd3
|
|
| MD5 |
aa7182b3d32e134cf0f7415ec81f3bc0
|
|
| BLAKE2b-256 |
d0b15b7d2e4b062cbd2acca3790c945aedf8ab30a9ad4fe1fb5b684458f38974
|