ArmorPaint lets you personalize both its visual style and its display language without restarting. Themes control every color, size, and typographic value in the UI through a single JSON file, while localization maps the interface strings to your preferred language. Both settings are managed from the Preferences dialog (Ctrl+K) — themes in the Theme tab and language in the Interface tab.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/armory3d/armorpaint/llms.txt
Use this file to discover all available pages before exploring further.
Built-in Themes
ArmorPaint ships with three pre-built themes in addition to the built-in Default theme (dark grey, defined in source).default
The built-in dark theme generated directly from source defaults. A balanced dark grey palette suitable for long painting sessions under studio lighting.
black
A deeper dark theme with near-black backgrounds (
WINDOW_BG_COL: #F05789 in 32-bit ARGB). Higher contrast between panels and the viewport, with drop-shadow effects enabled (SHADOWS: 1). Stored in black.json.darker
A medium-dark theme with slightly lighter panel backgrounds than black. Uses the same text color family but provides softer hover and button states. Stored in
darker.json.light
A light theme with bright panel backgrounds and dark text — useful for well-lit environments or accessibility needs. Stored in
light.json.Theme File Format
Every theme is a flat JSON object. Each key corresponds to a UI property — colors are stored as 32-bit signed integers (ARGB), while size values are stored as integers in logical pixels. The following example is taken directly fromblack.json:
Theme Property Reference
| Key | Type | Description |
|---|---|---|
WINDOW_BG_COL | color (ARGB i32) | Main panel and window background |
HOVER_COL | color | Element hover highlight background |
BUTTON_COL | color | Button default background |
PRESSED_COL | color | Button pressed / active background |
TEXT_COL | color | Primary text color |
LABEL_COL | color | Secondary / label text color |
SEPARATOR_COL | color | Divider line color |
HIGHLIGHT_COL | color | Selection and accent highlight color |
VIEWPORT_COL | color | 3D viewport background fill color |
FONT_SIZE | integer | Base font size in logical pixels |
ELEMENT_W | integer | Default element width in logical pixels |
ELEMENT_H | integer | Default element height in logical pixels |
ELEMENT_OFFSET | integer | Vertical gap between elements |
ARROW_SIZE | integer | Dropdown arrow icon size |
BUTTON_H | integer | Button height in logical pixels |
CHECK_SIZE | integer | Checkbox outer box size |
CHECK_SELECT_SIZE | integer | Checkbox inner fill size when checked |
SCROLL_W | integer | Scrollbar track width |
SCROLL_MINI_W | integer | Mini scrollbar track width |
TEXT_OFFSET | integer | Horizontal text padding inside elements |
TAB_W | integer | Tab header width padding |
FILL_BUTTON_BG | bool (0/1) | Fill button backgrounds (1) or use outline style (0) |
FULL_TABS | bool (0/1) | Stretch tabs to fill the full tab bar width |
SHADOWS | bool (0/1) | Enable drop shadows on panels and menus |
LINK_STYLE | enum (0/1) | Node link style: 0 = Straight, 1 = Curved |
Color values use the signed 32-bit ARGB encoding. For example, fully opaque white is
‑1 (0xFFFFFFFF as a signed integer) and fully opaque black is ‑16777216 (0xFF000000). When editing a theme in the Theme tab, ArmorPaint displays a colour wheel picker for any field ending in _COL.Custom Themes
Create a new theme
In Preferences → Theme, click New. Enter a name (e.g.
my_theme) and click OK. ArmorPaint duplicates the current active theme into a new JSON file inside the themes/ data folder and switches to it immediately.Edit color and size values
Every theme field is listed in the Theme tab. Click a colored swatch next to any
_COL field to open an inline color wheel. For numeric fields, click the field and type a new value. Changes are reflected in the UI in real time.Export the theme file
Click Export to save the theme JSON to any location on disk. This is useful for sharing themes or keeping version-controlled backups.
Supported Languages
ArmorPaint ships with locale files for 14 languages in addition to the default English source strings. Locale files are stored inpaint/assets/locale/.
| Code | Language |
|---|---|
en | English (default — source strings, no file needed) |
cs | Czech |
de | German |
el | Greek |
es | Spanish |
fr | French |
hu | Hungarian |
id | Indonesian |
ja | Japanese |
ko | Korean |
pl | Polish |
pt | Portuguese |
ru | Russian |
zh_cn | Chinese (Simplified) |
system is a special pseudo-locale that instructs ArmorPaint to detect and use the operating system language at startup.
Locale Configuration
The active locale is stored as thelocale field in config.json and can be changed at any time from Preferences → Interface → Language without restarting.
- Setting a specific language
- Auto-detect OS language
- Fallback behavior
Select a language from the Language dropdown in Preferences → Interface. The UI is re-translated immediately using the matching
<code>.json file from the locale/ folder.The underlying config value is an ISO 639-1 language code, optionally with a region suffix (e.g. zh_cn):Using
"system" as the locale value tells ArmorPaint to auto-detect the OS language on every launch. If you want to pin a language regardless of OS settings, set the code explicitly (e.g. "fr").Locale File Format
Each locale file is a flat JSON object mapping English source strings to their translated equivalents.\n in both the key and the value. Placeholder variables use the {variable_name} format.
Generating New Locale Files
To create a translation file for a new language, run the locale extraction script from the repository root:tr() calls) and writes a JSON skeleton with the English source strings as both keys and values. Replace the values with the target-language translations to complete the locale file.
Example — generating a Turkish locale: