Apps SDK — Godot

Translate your Godot 4 game's UI into 90 languages with one line of GDScript. The add-on caches translations on disk for instant offline startup and never crashes your game — every failure falls back to the original text.

Experimental preview. This is an early GDScript add-on (0.1.0-preview.2). It compiles clean and runs in Godot 4.7, but the public API may change between preview releases, and it is not on the Godot Asset Library yet — install it from the download below. Not recommended for a shipping title yet — we'd love your feedback.

Install

  1. Download the add-on: transable-godot-0.1.0-preview.2.zip
  2. Unzip it into your project folder so you get addons/transable/.
  3. Enable it in Project → Project Settings → Plugins — tick Transable. That registers the Transable autoload singleton, callable from anywhere.
  4. Create an app project in the dashboard and copy your API key.

Godot with C#/Mono? You can use the tested Transable.Sdk .NET core from C# directly instead of this GDScript add-on — see the .NET docs.

One-line start

Initialize once (e.g. in an autoload of your own, or your main scene's _ready):

func _ready() -> void:
    Transable.init("tk_live_yourKeyHere", { "default_language": "de" })
    # "default_language" is optional — omit it to detect the OS language.

Then translate text anywhere. The call is synchronous and never blocks: it returns the cached translation if present, otherwise the fallback while it fetches in the background (the next call returns the translation, and the translations_updated signal fires).

$Title.text = Transable.t("menu.play", "Play")
$Quit.text  = Transable.t("menu.quit", "Quit")

Auto-translating labels

Drop-in node: change a Label's type to TransableLabel (it extends Label). It translates its own authored text and re-applies when translations arrive — no code needed. It only ever touches its own string, never user input from LineEdit/TextEdit.

Switching language

Transable.set_language("fr")
var lang := Transable.current_language()     # note: a method, not a property
Transable.language_changed.connect(func(code): print("now in ", code))

The choice is persisted and restored on the next launch. Batch API for lists/menus you build in code:

var labels := await Transable.translate_batch(["New game", "Continue", "Options"], "de")

Safe mode & offline cache

Safe mode is on by default and runs before anything leaves the machine: emails, URLs, file paths, GUIDs, version numbers, pure numbers, log lines, and code-like identifiers (PascalCaseNames) are never sent — while single words like "Save" or "Play" translate normally. User input is never read or sent.

Every translation is cached on disk under user://transable/, per language, content-addressed (change one string, only that string is retranslated). The second launch is translated instantly — even fully offline.

It never crashes your game

One rule: no method here ever throws or blocks. Missing key, no network, HTTP 4xx/5xx, quota exhausted — the UI stays in the source language and translation retries quietly. Rate limits (429) honor Retry-After; an invalid key disables translation for the session with a single optional log line.

Questions or something broke? Contact us — include your Godot version and the add-on version. Other engines: Unreal Engine, or any language via the REST API.