Apps SDK — Unreal Engine

Translate your Unreal Engine 5 game's UI into 90 languages — from C++ or straight from Blueprints. Translations are cached on disk for instant offline startup, and nothing here ever throws into your game code: every failure falls back to the original text.

Experimental preview. This is an early C++ plugin (0.1.0-preview.2). It compiles and links clean against Unreal Engine 5.7, but the public API may change between preview releases, and it is not on Fab yet — install it from the download below. Not recommended for a shipping title yet — we'd love your feedback.

Install

  1. Download the plugin: transable-unreal-0.1.0-preview.2.zip
  2. Unzip it into your project's Plugins/ folder so you get Plugins/Transable/. (This is a C++ plugin, so your project must be a C++ project — add any C++ class once if it is Blueprint-only.)
  3. Right-click your .uprojectGenerate Visual Studio project files, then build (or just open the project and let the editor compile the plugin).
  4. Enable Transable under Edit → Plugins → Localization if it isn't already.
  5. Create an app project in the dashboard and copy your API key.

Blueprint start

On Event BeginPlay (e.g. in your Game Instance or first HUD), call the Transable Init node with your API key; set Default Language on the Options pin, or leave it empty to detect the OS language. Then translate any text with the Transable T node (Key + Fallback → the translated string):

Event BeginPlay ─► Transable Init  (Api Key = "tk_live_yourKeyHere",
                                     Options.Default Language = "de")

Get Text ◄─ Transable T  (Key = "menu.play", Fallback = "Play")

C++ start

The same surface as static UTransableBPL calls (thin wrappers over the UTransableSubsystem). All take a world-context object:

#include "TransableBlueprintLibrary.h"
#include "TransableSubsystem.h"

void AMyHUD::BeginPlay()
{
    Super::BeginPlay();

    FTransableOptions Options;
    Options.DefaultLanguage = TEXT("de");           // empty = detect from the OS
    UTransableBPL::Init(this, TEXT("tk_live_yourKeyHere"), Options);

    PlayButton->SetText(FText::FromString(
        UTransableBPL::T(this, TEXT("menu.play"), TEXT("Play"))));
}

Switch language at runtime and react to changes via the subsystem's delegates:

UTransableBPL::SetLanguage(this, TEXT("fr"));
const FString Lang = UTransableBPL::CurrentLanguage(this);

if (UTransableSubsystem* T = GetGameInstance()->GetSubsystem<UTransableSubsystem>())
{
    T->OnLanguageChanged.AddDynamic(this, &AMyHUD::HandleLanguageChanged);
}

For lists and menus, the latent Transable Translate Batch node (or UTransableBPL::TranslateBatch) translates an array of strings and continues when the results are ready.

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-entered text is never read or sent.

Every translation is cached on disk under <Project>/Saved/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: nothing here throws into your game code or blocks the game thread. 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 UE version and the plugin version. Other engines: Godot, or any language via the REST API.