· Hasan Alp Güngör
Oversette spilltekst uten å ødelegge {plassholdere}: slik fungerer LocaGen
Maskinoversettelse ødelegger plassholdere som {player} og %d i spillfiler. Her er hvordan jeg løste det i LocaGen, og hvordan PRO-versjonen bruker Gemini.
- Python
- PHP
- Gemini API
- Localization

Spilltekst ligger som regel i en JSON-fil som nøkler og verdier, og å oversette et spill ser like enkelt ut som å oversette de verdiene. Det trodde jeg også først, helt til jeg støtte på plassholdere.
json{
"welcome": "Welcome back, {player}!",
"coins": "You have %d coins",
"warning": "<b>Danger:</b> low health"
}Sender du det rett til en oversettelsestjeneste, kommer {player} av og til tilbake oversatt, %d blir til "% d" og <b>-taggen forsvinner. Da finner ikke spillet plassholderne sine, og enten viser det feil tekst eller så kaster det en feil.
Gjemme plassholderne
Løsningen min er enkel: før jeg oversetter, finner jeg alle plassholderne og bytter dem ut med en markør som [VAR_0] eller [VAR_1], som oversetteren lar være i fred. Når oversettelsen kommer tilbake, bytter jeg markørene tilbake. Oversettere gjør av og til markøren om til små bokstaver, så jeg sjekker også etter [var_0].
pythonPATTERN = re.compile(r'(\{.*?\}|<.*?>|%[sd])')
def translate(text, target):
placeholders = {}
for i, match in enumerate(PATTERN.findall(text)):
marker = f"[VAR_{i}]"
placeholders[marker] = match
text = text.replace(match, marker)
result = GoogleTranslator(source="auto", target=target).translate(text)
for marker, original in placeholders.items():
result = result.replace(marker, original).replace(marker.lower(), original)
return resultNøklene rører jeg aldri; det er bare verdiene som blir oversatt. Filen kan være en flat liste med nøkler og verdier eller en liste med objekter, og begge deler fungerer.
Gratisversjonen
Gratisversjonen er en desktop-app skrevet i Python. Jeg lagde grensesnittet i terminalstil med CustomTkinter og bruker Google Translate gjennom deep-translator. Oversettelsen kjører i en egen tråd, så grensesnittet fryser ikke, og fremdriftslinjen fylles opp mens det skjer. Når appen starter, sjekker den GitHub etter siste versjon og laster den ned hvis det finnes en ny.
PRO-versjonen: Gemini som snakker som en gamer
Google Translate får ordene riktig, men skjønner ikke hvordan spill snakker; uttrykk som "health potion" blir helt robotaktige. I PRO-versjonen er det Gemini 2.5 Flash som oversetter. Jeg ber den opptre som ekspert på spillokalisering, oversette uttrykk slik en spiller faktisk ville sagt dem, aldri røre nøklene og ikke sende tilbake noe annet enn gyldig JSON.
Det viktigste jeg lærte av å jobbe med en AI-modell, var å ikke stole blindt på svaret. Jeg prøver alltid å parse det Gemini sender tilbake som JSON, og er det ugyldig, viser jeg en feilmelding i stedet for å gi brukeren en ødelagt fil. PRO-versjonen kjører på PHP og MySQL, med brukerkontoer, oversettelseshistorikk og et adminpanel.

