Skip to content

text adjustments

Jinwoo Lee edited this page May 16, 2026 · 2 revisions

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.

Section format

[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.

Conditions

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.

Parameters

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.

Real-world examples

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,0

How to find the path of a misbehaving label

The fastest way to write a correct condition is to read the actual GameObject path for the text you want to adjust:

  1. Install Developer Toolset III.
  2. Open the Developer Toolset inspector and locate the GameObject hosting the problem text.
  3. Copy the full path — for example PERAPORTTI/ATMs/MoneyATM/Screen/InfoArea/Text.
  4. Use it in a Contains(...) or EndsWith(...) clause.

More details and other debug tactics live in Testing & Debugging.

Reload

Adjustments respond to F8 the same way translations do. Edit config.txt, save, press F8, and the new offsets apply immediately.

Clone this wiki locally