<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://dmvergasov.github.io/LocHub/feed.xml" rel="self" type="application/atom+xml" /><link href="https://dmvergasov.github.io/LocHub/" rel="alternate" type="text/html" /><updated>2026-10-05T12:30:07+00:00</updated><id>https://dmvergasov.github.io/LocHub/feed.xml</id><title type="html">LocHub</title><subtitle>AI-assisted localization for Unreal Engine 5.6–5.8. Translate your project&apos;s text with your own AI (Claude, GPT, Gemini, DeepSeek or a local model), catch broken placeholders and plurals automatically, review everything in the editor.</subtitle><author><name>Dmitry Vergasov</name></author><entry><title type="html">Localize an Unreal Engine 5 game with a local LLM (Ollama or LM Studio)</title><link href="https://dmvergasov.github.io/LocHub/2026/10/05/localize-unreal-with-a-local-llm.html" rel="alternate" type="text/html" title="Localize an Unreal Engine 5 game with a local LLM (Ollama or LM Studio)" /><published>2026-10-05T00:00:00+00:00</published><updated>2026-10-05T00:00:00+00:00</updated><id>https://dmvergasov.github.io/LocHub/2026/10/05/localize-unreal-with-a-local-llm</id><content type="html" xml:base="https://dmvergasov.github.io/LocHub/2026/10/05/localize-unreal-with-a-local-llm.html"><![CDATA[<p>A model running on your own machine is the cheapest way to get a first translation of an Unreal Engine game:
there is no API key, no per-token bill, and your text never leaves your computer. This guide sets that up with
<a href="https://github.com/DmVergasov/LocHub">LocHub</a>, an editor plugin for UE 5.6–5.8, and either Ollama or LM Studio.</p>

<p>A small local model can make more mistakes than a large hosted one — a dropped <code class="language-plaintext highlighter-rouge">{PlayerName}</code> here, a lost plural
form there. That is the part LocHub is for: every translation is checked for broken format arguments, plural forms and
rich-text tags before you can approve it, so a weaker model costs you review time, not a broken build.</p>

<h2 id="what-you-need">What you need</h2>

<ul>
  <li>Unreal Engine 5.6, 5.7 or 5.8 (LocHub is tested on Windows).</li>
  <li><a href="https://nodejs.org/">Node.js</a> 22.11 or newer — LocHub runs a small local service on <code class="language-plaintext highlighter-rouge">127.0.0.1</code>.</li>
  <li><a href="https://ollama.com/">Ollama</a> or <a href="https://lmstudio.ai/">LM Studio</a> with a model you have downloaded.</li>
  <li>LocHub, from <a href="https://www.fab.com/listings/aaf6a7ae-e02e-4975-91b4-129e2456e491">Fab</a> or cloned from
<a href="https://github.com/DmVergasov/LocHub">GitHub</a> into your project’s <code class="language-plaintext highlighter-rouge">Plugins/LocHub</code>, then enabled in
<strong>Edit &gt; Plugins</strong>. It is free for non-commercial projects (personal projects, education, game jams, free games).</li>
</ul>

<h2 id="1-start-the-model--and-give-it-enough-context">1. Start the model — and give it enough context</h2>

<p>With Ollama, pull a model, for example:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ollama pull qwen3:8b
</code></pre></div></div>

<p><strong>Raise Ollama’s context window before you translate anything.</strong> Ollama’s default context (<code class="language-plaintext highlighter-rouge">num_ctx</code>, 4096 tokens
on current builds) is smaller than a full translate request — 40 strings plus the system prompt, glossary and
brief — and Ollama silently truncates what does not fit instead of returning an error. That is the most common
reason a local job comes back garbled or incomplete. Start the server with a larger window:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>OLLAMA_CONTEXT_LENGTH=16384 ollama serve
</code></pre></div></div>

<p>or set <code class="language-plaintext highlighter-rouge">PARAMETER num_ctx 16384</code> in the model’s <code class="language-plaintext highlighter-rouge">Modelfile</code>. LM Studio and llama.cpp server have the same setting
under their own launch options.</p>

<h2 id="2-point-lochub-at-it">2. Point LocHub at it</h2>

<p>Open <strong>Project Settings &gt; Plugins &gt; LocHub &gt; AI</strong> and set <strong>AI Provider</strong> to <strong>Custom (OpenAI-compatible)</strong>:</p>

<table>
  <thead>
    <tr>
      <th>Setting</th>
      <th>Ollama</th>
      <th>LM Studio</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Base URL</td>
      <td><code class="language-plaintext highlighter-rouge">http://localhost:11434/v1</code></td>
      <td><code class="language-plaintext highlighter-rouge">http://localhost:1234/v1</code></td>
    </tr>
    <tr>
      <td>API Key</td>
      <td>empty</td>
      <td>empty</td>
    </tr>
    <tr>
      <td>Key Header</td>
      <td>Authorization: Bearer</td>
      <td>Authorization: Bearer</td>
    </tr>
    <tr>
      <td>Translate Model</td>
      <td>the name <code class="language-plaintext highlighter-rouge">ollama list</code> shows, e.g. <code class="language-plaintext highlighter-rouge">qwen3:8b</code></td>
      <td>the ID LM Studio shows for the loaded model</td>
    </tr>
  </tbody>
</table>

<p><img src="/LocHub/assets/08_custom_endpoint_settings.png" alt="Custom (OpenAI-compatible) selected in Project Settings" /></p>

<p>A few more fields matter for a local model:</p>

<ul>
  <li><strong>Judge Model</strong> — leave it empty to let the same model review its own translations, or name a second model.</li>
  <li><strong>Structured Output</strong> — start with <strong>JSON Schema</strong>. If the server rejects it or the answers come back broken,
switch to <strong>JSON Object</strong>, then to <strong>Prompt Only</strong>.</li>
  <li><strong>Max Parallel Requests</strong> — how many requests LocHub sends at once (default 2). Keep it low on a single GPU.</li>
  <li><strong>Input Price</strong> / <strong>Output Price</strong> — leave both at <code class="language-plaintext highlighter-rouge">0</code> for a free local model. The estimate then shows no dollar
amount, and there is no spending cap to set.</li>
</ul>

<p>At the top of the LocHub tab, the AI pill should now say <strong>endpoint OK</strong>. If it says <strong>model missing</strong>, the model
ID does not match what the server lists; <strong>unreachable</strong> means LocHub cannot reach the server at all.</p>

<p><img src="/LocHub/assets/09_custom_endpoint_status.png" alt="The AI pill and a Jobs estimate with a local endpoint" /></p>

<h2 id="3-push-estimate-translate">3. Push, estimate, translate</h2>

<ol>
  <li><strong>Tools &gt; LocHub &gt; Set Up Localization Target</strong> configures your project’s <code class="language-plaintext highlighter-rouge">Game</code> target the way LocHub expects.</li>
  <li>Gather text with Unreal’s own <strong>Localization Dashboard</strong>, then run <strong>Tools &gt; LocHub &gt; Push (Dry Run)</strong> and
<strong>Push</strong> to send the gathered strings to LocHub.</li>
  <li>Open <strong>Tools &gt; LocHub &gt; Open LocHub</strong>, go to <strong>Jobs</strong>, pick a culture, click <strong>Estimate</strong> to see how many
strings and requests the job needs, then <strong>Run</strong>.</li>
</ol>

<p>If a request runs out of time on a slow model, LocHub does not just retry it: it splits the batch in two and
sends the smaller halves, so the job still finishes, one smaller request at a time.</p>

<h2 id="4-review-what-the-model-got-wrong">4. Review what the model got wrong</h2>

<p>Open the <strong>Review</strong> tab. The queue puts the riskiest strings first, and every card is checked as you look at it:</p>

<ul>
  <li>a <strong>hard</strong> issue — a broken format argument, a dropped rich-text tag, invalid syntax — blocks Approve and Save
outright;</li>
  <li>a <strong>confirm</strong> issue — a lost plural modifier, a possibly missing argument — needs a human to look at it and
approve it anyway, or fix it.</li>
</ul>

<p>Fix the text in place, press <kbd>A</kbd> to approve, <kbd>J</kbd>/<kbd>K</kbd> to move, <kbd>R</kbd> to reject.
Human edits are never overwritten by a later AI pass.</p>

<h2 id="5-pull-it-back-into-unreal">5. Pull it back into Unreal</h2>

<p><strong>Tools &gt; LocHub &gt; Pull</strong> writes the approved translations into your project’s <code class="language-plaintext highlighter-rouge">.archive</code> files and compiles
<code class="language-plaintext highlighter-rouge">.locres</code>. These are ordinary Unreal localization files, so nothing in your game depends on LocHub at runtime.</p>

<h2 id="when-to-use-a-hosted-model-instead">When to use a hosted model instead</h2>

<p>A local model is a good first pass and keeps your text private. When you need fewer fixes per hundred strings,
the same setup works with Anthropic, OpenAI, xAI, DeepSeek or Gemini under your own key — or a router such as
OpenRouter through the same Custom endpoint — and the <strong>Estimate</strong> button then shows a dollar figure and a
<strong>Max USD</strong> cap before you spend anything.</p>

<hr />

<p>LocHub is source-available on <a href="https://github.com/DmVergasov/LocHub">GitHub</a> and sold for commercial use on
<a href="https://www.fab.com/listings/aaf6a7ae-e02e-4975-91b4-129e2456e491">Fab</a>. Full setup details:
<a href="https://github.com/DmVergasov/LocHub/blob/main/Docs/05_AI_Providers_and_Keys.md">AI providers and keys</a>.</p>

<p><em>Drafted by LocHub’s AI assistant; every step and setting is checked against the LocHub documentation.</em></p>]]></content><author><name>Dmitry Vergasov</name></author><summary type="html"><![CDATA[Translate your Unreal Engine 5.6–5.8 project's text with a model running on your own machine — no API key, no per-token cost, nothing leaves your computer — and catch broken placeholders before they ship.]]></summary></entry></feed>