Hasan Alp Güngör

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

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 result

Nø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.

ProsjektsideLocaGenLokaliseringsverktøy for spill

Flere innlegg