<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://i18n-rosetta.com/ar/blog</id>
    <title>i18n-rosetta Blog</title>
    <updated>2026-05-14T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://i18n-rosetta.com/ar/blog"/>
    <subtitle>i18n-rosetta Blog</subtitle>
    <icon>https://i18n-rosetta.com/ar/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[v3.2.0: Industrial-Grade Quality Infrastructure]]></title>
        <id>https://i18n-rosetta.com/ar/blog/v3-2-quality-infrastructure</id>
        <link href="https://i18n-rosetta.com/ar/blog/v3-2-quality-infrastructure"/>
        <updated>2026-05-14T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[v3.2.0 is the quality release. 702 tests, 163 test suites, zero tolerance for silent failures.]]></summary>
        <content type="html"><![CDATA[<p>v3.2.0 is the quality release. 702 tests, 163 test suites, zero tolerance for silent failures.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-changed">What Changed<a href="https://i18n-rosetta.com/ar/blog/v3-2-quality-infrastructure#what-changed" class="hash-link" aria-label="إرتباط مُبـاشر بالعنوان What Changed" title="إرتباط مُبـاشر بالعنوان What Changed" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="quality-gate-5-checks">Quality Gate (5 checks)<a href="https://i18n-rosetta.com/ar/blog/v3-2-quality-infrastructure#quality-gate-5-checks" class="hash-link" aria-label="إرتباط مُبـاشر بالعنوان Quality Gate (5 checks)" title="إرتباط مُبـاشر بالعنوان Quality Gate (5 checks)" translate="no">​</a></h3>
<p>Every translation now passes through five deterministic validation checks before it's written to disk:</p>
<ol>
<li class=""><strong>Empty/blank</strong> — Model returned nothing</li>
<li class=""><strong>Source echo</strong> — Model returned the English input</li>
<li class=""><strong>Hallucination loop</strong> — Repeated trigram patterns</li>
<li class=""><strong>Length inflation</strong> — Output 4×+ longer than source</li>
<li class=""><strong>Script compliance</strong> — Wrong script for the locale</li>
</ol>
<p>No translation is written without passing all five checks. Failed translations are logged and retried.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="retry-cascade">Retry Cascade<a href="https://i18n-rosetta.com/ar/blog/v3-2-quality-infrastructure#retry-cascade" class="hash-link" aria-label="إرتباط مُبـاشر بالعنوان Retry Cascade" title="إرتباط مُبـاشر بالعنوان Retry Cascade" translate="no">​</a></h3>
<p>When a batch fails, rosetta retries with progressively smaller batches:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">Full batch (30 keys) → parse error</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  └→ Half batch (15 keys) → 2 failures</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      └→ Individual keys (1 each) → isolates the problem keys</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="security-hardening">Security Hardening<a href="https://i18n-rosetta.com/ar/blog/v3-2-quality-infrastructure#security-hardening" class="hash-link" aria-label="إرتباط مُبـاشر بالعنوان Security Hardening" title="إرتباط مُبـاشر بالعنوان Security Hardening" translate="no">​</a></h3>
<ul>
<li class=""><strong>Prototype pollution guard</strong> — <code>__proto__</code>, <code>constructor</code> keys rejected at parse time</li>
<li class=""><strong>Path traversal guard</strong> — Crafted locale codes can't write outside configured directories</li>
<li class=""><strong>Response validation</strong> — Only keys that were sent are accepted back</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="test-infrastructure">Test Infrastructure<a href="https://i18n-rosetta.com/ar/blog/v3-2-quality-infrastructure#test-infrastructure" class="hash-link" aria-label="إرتباط مُبـاشر بالعنوان Test Infrastructure" title="إرتباط مُبـاشر بالعنوان Test Infrastructure" translate="no">​</a></h3>



































<table><thead><tr><th>Suite</th><th>Tests</th><th>What It Covers</th></tr></thead><tbody><tr><td>Core (8 suites)</td><td>280+</td><td>Config, sync, CLI, watch, audit, pairs, format, init</td></tr><tr><td>Red team</td><td>89</td><td>Adversarial inputs, encoding attacks</td></tr><tr><td>Contract</td><td>120</td><td>API integration contracts</td></tr><tr><td>Performance</td><td>36</td><td>Batch optimization, throughput regression</td></tr><tr><td>Coverage</td><td>702 total</td><td>Full pipeline</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prompt-caching">Prompt Caching<a href="https://i18n-rosetta.com/ar/blog/v3-2-quality-infrastructure#prompt-caching" class="hash-link" aria-label="إرتباط مُبـاشر بالعنوان Prompt Caching" title="إرتباط مُبـاشر بالعنوان Prompt Caching" translate="no">​</a></h3>
<p>System messages are now split from user messages, enabling prompt cache hits on providers like Anthropic and Google. This significantly reduces token costs for multi-batch syncs.</p>
<p>See the <a class="" href="https://i18n-rosetta.com/ar/docs/concepts/quality-gate">Quality Gate docs</a> and <a class="" href="https://i18n-rosetta.com/ar/docs/concepts/security">Security docs</a> for the full technical details.</p>]]></content>
        <author>
            <name>Curtis Forbes</name>
            <uri>https://github.com/gamedaysuits</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[v3.1.0: Hugo Markdown Content Translation]]></title>
        <id>https://i18n-rosetta.com/ar/blog/v3-1-content-translation</id>
        <link href="https://i18n-rosetta.com/ar/blog/v3-1-content-translation"/>
        <updated>2026-04-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[v3.1.0 adds full Hugo Markdown content translation — front matter fields and body content, with automatic protection for code blocks, shortcodes, and interpolation variables.]]></summary>
        <content type="html"><![CDATA[<p>v3.1.0 adds full Hugo Markdown content translation — front matter fields and body content, with automatic protection for code blocks, shortcodes, and interpolation variables.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="content-aware-translation">Content-Aware Translation<a href="https://i18n-rosetta.com/ar/blog/v3-1-content-translation#content-aware-translation" class="hash-link" aria-label="إرتباط مُبـاشر بالعنوان Content-Aware Translation" title="إرتباط مُبـاشر بالعنوان Content-Aware Translation" translate="no">​</a></h2>
<p>When translating Markdown, you can't just send the raw file to an LLM. Code blocks get translated. Shortcodes get corrupted. Hugo template variables get mangled.</p>
<p>Rosetta v3.1.0 solves this with <strong>Unicode sentinel shielding</strong>:</p>
<ol>
<li class="">Before translation, structured blocks (code fences, shortcodes, inline code, HTML) are replaced with unique sentinel tokens</li>
<li class="">The LLM receives only translatable text</li>
<li class="">After translation, sentinels are restored with the original content</li>
</ol>
<p>The LLM never sees your code blocks. It can't corrupt them.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="front-matter-support">Front Matter Support<a href="https://i18n-rosetta.com/ar/blog/v3-1-content-translation#front-matter-support" class="hash-link" aria-label="إرتباط مُبـاشر بالعنوان Front Matter Support" title="إرتباط مُبـاشر بالعنوان Front Matter Support" translate="no">​</a></h2>
<p>Both YAML (<code>---</code>) and TOML (<code>+++</code>) front matter delimiters are supported. By default, <code>title</code>, <code>description</code>, <code>summary</code>, <code>subtitle</code>, <code>caption</code>, and <code>linkTitle</code> are translated. All other fields (date, draft, tags, weight) are preserved.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="setup">Setup<a href="https://i18n-rosetta.com/ar/blog/v3-1-content-translation#setup" class="hash-link" aria-label="إرتباط مُبـاشر بالعنوان Setup" title="إرتباط مُبـاشر بالعنوان Setup" translate="no">​</a></h2>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">i18n-rosetta.config.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"contentDir"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"./content"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">npx i18n-rosetta </span><span class="token function" style="color:rgb(80, 250, 123)">sync</span><span class="token plain">   </span><span class="token comment" style="color:rgb(98, 114, 164)"># now translates content too</span><br></div></code></pre></div></div>
<p>See the <a class="" href="https://i18n-rosetta.com/ar/docs/guides/content-translation">Content Translation guide</a> for details.</p>]]></content>
        <author>
            <name>Curtis Forbes</name>
            <uri>https://github.com/gamedaysuits</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[i18n-rosetta v3.0.0: Per-Pair Translation Architecture]]></title>
        <id>https://i18n-rosetta.com/ar/blog/v3-release</id>
        <link href="https://i18n-rosetta.com/ar/blog/v3-release"/>
        <updated>2026-04-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[i18n-rosetta v3.0.0 introduces the per-pair translation architecture — the defining feature of the entire system.]]></summary>
        <content type="html"><![CDATA[<p>i18n-rosetta v3.0.0 introduces the per-pair translation architecture — the defining feature of the entire system.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-changed">What Changed<a href="https://i18n-rosetta.com/ar/blog/v3-release#what-changed" class="hash-link" aria-label="إرتباط مُبـاشر بالعنوان What Changed" title="إرتباط مُبـاشر بالعنوان What Changed" translate="no">​</a></h2>
<p>Prior versions used a single translation method for all language pairs. v3.0.0 breaks that coupling: each source→target pair can use a different method, model, and quality configuration.</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"version"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">3</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"pairs"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"en:fr"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"method"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"google-translate"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"en:ja"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"method"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"llm"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"model"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"google/gemini-2.5-pro"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"en:crk"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"methodPlugin"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"crk-coached-v1"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-per-pair">Why Per-Pair?<a href="https://i18n-rosetta.com/ar/blog/v3-release#why-per-pair" class="hash-link" aria-label="إرتباط مُبـاشر بالعنوان Why Per-Pair?" title="إرتباط مُبـاشر بالعنوان Why Per-Pair?" translate="no">​</a></h2>
<p>This architecture exists because one project needed Google Translate for French and a coached FST pipeline for an Indigenous language, running side by side in the same sync command.</p>
<p>Google Translate supports ~130 languages. There are over 7,000. The per-pair system means rosetta can scale to any language — you just need a method that works for that pair.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="other-highlights">Other Highlights<a href="https://i18n-rosetta.com/ar/blog/v3-release#other-highlights" class="hash-link" aria-label="إرتباط مُبـاشر بالعنوان Other Highlights" title="إرتباط مُبـاشر بالعنوان Other Highlights" translate="no">​</a></h2>
<ul>
<li class=""><strong>Plugin system</strong> — Install pre-packaged translation methods from the eval harness</li>
<li class=""><strong>Config version 3</strong> — New schema with pair-level overrides</li>
<li class=""><strong>Quality tiers</strong> — Standard, High, Research, Verified — displayed per pair in <code>status</code></li>
</ul>
<p>See the <a class="" href="https://i18n-rosetta.com/ar/docs/concepts/architecture">Architecture docs</a> for the full ecosystem design.</p>]]></content>
        <author>
            <name>Curtis Forbes</name>
            <uri>https://github.com/gamedaysuits</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
</feed>