Repository navigation
text adjustments
Translations rarely have the same dimensions as the English original. A button label that fits in 12 characters might need 20 in your language; a serif font from your fonts.unity3d might sit slightly lower than the original; a HUD label might overflow into the icon next to it.
The [POSITION_ADJUSTMENTS] section in Configuration lets you nudge any TextMesh in the game by path. No code, no recompilation.
[POSITION_ADJUSTMENTS]
<conditions> = X,Y,Z[,FontSize,LineSpacing,WidthScale]Each line is a single adjustment rule: a set of path conditions on the left, a comma-separated value list on the right.
The left-hand side matches against the GameObject path of a TextMesh in the scene. You can combine multiple conditions with & (all must match); prefix a condition with ! to negate it.
| Condition | Matches when |
|---|---|
Contains(path) |
Path contains the substring |
EndsWith(path) |
Path ends with the substring |
StartsWith(path) |
Path starts with the substring |
Equals(path) |
Path is exactly equal to the substring |
GameObjectEquals(path) |
Parent GameObject path is exactly equal — adjusts the GameObject's transform directly, not just the TextMesh on it |
!Contains(path) etc. |
Negation of any of the above |
Equals and GameObjectEquals look similar but do different things: Equals matches the TextMesh path, GameObjectEquals targets a parent GameObject and moves the whole thing (useful for sheets where you want every label on a piece of paper to shift together). Most rules use Contains + EndsWith and don't need either.
X,Y,Z[,FontSize,LineSpacing,WidthScale]
| Parameter | Required | Purpose | Example values |
|---|---|---|---|
X |
Yes | Horizontal offset (positive = right) |
0, 0.5, -0.3
|
Y |
Yes | Vertical offset (positive = up) |
0, 0.25, -0.05
|
Z |
Yes | Depth offset (rarely needed) | 0 |
FontSize |
No | TextMesh characterSize
|
0.1, 0.15, 0.2
|
LineSpacing |
No | Line spacing multiplier |
1.0, 1.2, 0.8
|
WidthScale |
No | Horizontal character width scale via transform.localScale.x
|
1.0, 1.2 (wider), 0.8 (narrower) |
Leave optional parameters empty by adding empty commas — the plugin will skip them. So 0,0,0,,1.2 sets position to origin, skips FontSize, and sets LineSpacing = 1.2. 0,0,0,,,1.2 skips both FontSize and LineSpacing and sets WidthScale = 1.2.
Note
Some elements in the game have inverted Y axes by design. If raising Y shifts text downward, just flip the sign. Trust your eyes, not the math.
These all come from the shipping Korean pack's config.txt:
# Shift HUD labels down a touch
Contains(GUI/HUD/) & EndsWith(/HUDLabel) = 0,-0.05,0
# Money ATM screen, all the non-row text
Contains(PERAPORTTI/ATMs/MoneyATM/Screen) & !Contains(/Row) & EndsWith(/Text) = 0,0.25,0
# Fuel ATM screen header vs. rows — different rules
Contains(PERAPORTTI/ATMs/FuelATM/Screen) & !Contains(/Row) & EndsWith(/Text) = 0,0.45,0
Contains(PERAPORTTI/ATMs/FuelATM/Screen) & Contains(/Row) & EndsWith(/Text) = 0,-0.25,0
# Teletext temperature page, two specific labels
Contains(Systems/TV/Teletext/VKTekstiTV/PAGES/188/Texts/Updater/Ennuste/Temp) & EndsWith(/Short) = 1,-0.2,0
Contains(Systems/TV/Teletext/VKTekstiTV/PAGES/188/Texts/Updater/Nyt) & EndsWith(/Short) = -1,0,0
# TV Chat — keep position, just narrow the characters
Contains(Systems/TV/TVGraphics/CHAT/Generated/Lines) = 0,0,0,,,0.07
# Options menu — only adjust font size, leave position alone
Contains(Systems/OptionsMenu) & Contains(/GUITextlabel) = 0,0,0,0.07
Contains(Systems/OptionsMenu) & Contains(/GUITextLabel) = 0,0,0,0.07
Contains(Systems/OptionsMenu) & Contains(/GUITextHeader) = 0,0,0,0.08
# Fleetari Service Payment sheet — different rules for two label depths
Contains(Sheets/ServicePayment) & EndsWith(ServicePayment/Text) = 0,-0.01,0,0.005
Contains(Sheets/ServicePayment) & EndsWith(ServicePayment/Text/Text) = 0,0.01,0
Contains(Sheets/ServicePayment/Line) = 0,0.002,0
# Unemployment sheet — exact-path GameObject moves
GameObjectEquals(Sheets/UnemployCancelPaper/CheatedDays) = -0.07,0.005,0
GameObjectEquals(Sheets/UnemployCancelPaper/CheatedDays/CheatedCost) = 0.02,-0.005,0
GameObjectEquals(Sheets/UnemployCancelPaper/CheatedDays/PayButton) = 0.07,-0.005,0
# Computer screens — bump font size by 2x
Contains(COMPUTER/SYSTEM/POS/) & EndsWith(/BIOS) = 0,0,0,2,
Contains(COMPUTER/SYSTEM/POS/) & EndsWith(/Text) = 0,0,0,2,
# Parts Magazine product list — shrink font, nudge whole list up
Contains(Sheets/Magazine/Products) = 0,0,0,0.0024
GameObjectEquals(Sheets/Magazine/List) = 0,-0.002,0The fastest way to write a correct condition is to read the actual GameObject path for the text you want to adjust:
- Install Developer Toolset III.
- Open the Developer Toolset inspector and locate the GameObject hosting the problem text.
- Copy the full path — for example
PERAPORTTI/ATMs/MoneyATM/Screen/InfoArea/Text. - Use it in a
Contains(...)orEndsWith(...)clause.
More details and other debug tactics live in Testing & Debugging.
Adjustments respond to F8 the same way translations do. Edit config.txt, save, press F8, and the new offsets apply immediately.
Getting Started
Translation Files
- Configuration
- translate.txt
- translate_magazine.txt
- translate_teletext.txt
- Optional Files
- Translation Patterns
Advanced
- Text Adjustments
- Testing & Debugging
- Creating font assetbundle
- Creating texture pack
- Setting up development environment
Community