<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Pokémon Following Renegade Platinum on Christian Martínez De La Rosa</title><link>https://christt105.github.io/ca/categories/pok%C3%A9mon-following-renegade-platinum/</link><description>Recent content in Pokémon Following Renegade Platinum on Christian Martínez De La Rosa</description><generator>Hugo -- gohugo.io</generator><language>ca</language><lastBuildDate>Sun, 30 Aug 2026 00:00:00 +0200</lastBuildDate><atom:link href="https://christt105.github.io/ca/categories/pok%C3%A9mon-following-renegade-platinum/index.xml" rel="self" type="application/rss+xml"/><item><title>Com vaig traduir Pokémon Following Renegade Platinum</title><link>https://christt105.github.io/ca/blog/translating-pokemon-following-renegade-platinum/</link><pubDate>Sun, 30 Aug 2026 00:00:00 +0200</pubDate><guid>https://christt105.github.io/ca/blog/translating-pokemon-following-renegade-platinum/</guid><enclosure url="https://christt105.github.io/blog/translating-pokemon-following-renegade-platinum/cover.webp" length="61886" type="image/webp"/><description>&lt;p&gt;Anem a recuperar un projecte de fa uns quants anys del qual estic força orgullós.&lt;/p&gt;&#10;&lt;h2 id="com-va-començar-tot"&gt;Com va començar tot&#10;&lt;/h2&gt;&lt;p&gt;Em venia de gust jugar a la quarta generació de Pokémon, però volia que fos una mica diferent i amb mecàniques de qualitat de vida. Investigant vaig trobar Pokémon Renegade Platinum, una modificació de Pokémon Platí amb més dificultat i moltes més millores, feta per Drayano. També vaig trobar un projecte de dos espanyols, Mikelan98 i AdAstra, anomenat Pokémon Following Platinum, una modificació de Pokémon Platí que afegia la mecànica tan característica de Pokémon HeartGold i SoulSilver que els Pokémon et segueixen pel món. També afegia alguna millora com el tipus fada i una mica més. Finalment, hi havia algú que havia ajuntat els dos pedaços i havia fet un pedaç que incloïa els Pokémon que et segueixen al Renegade Platinum. Jo volia això. Hi havia un problema: estava en anglès i em feia molta mandra jugar-hi amb els atacs en anglès.&lt;/p&gt;&#10;&lt;p&gt;El Pokémon Renegade Platinum el va traduir Drakyem, va fer una feina excel·lent. D&amp;rsquo;altra banda, tot i que els que van fer el Pokémon Following Platinum són espanyols, el van treure únicament en anglès. Així que em vaig proposar traduir el Following Platinum i després combinar les dues traduccions al Pokémon Following Renegade Platinum, sense tenir ni idea de per on començar.&lt;/p&gt;&#10;&lt;p&gt;Vaig trobar un programa força antic i amagat que exportava tots els diàlegs d&amp;rsquo;una ROM. Després els podies editar i tornar-los a introduir al joc. Flux completat, podia començar. La meva idea era senzilla: extreure els diàlegs d&amp;rsquo;una ROM del Pokémon Platí en espanyol i anglès, fer coincidir tots els diàlegs, extreure els fitxers del Following Platinum i sobreescriure&amp;rsquo;ls amb els del joc original en espanyol, traduir els pocs diàlegs que tenia el Following Platinum i finalment, agafar els del Renegade Platinum en castellà, sobreescriure&amp;rsquo;ls al Following Renegade Platinum i afegir-hi els del Following Platinum. Això em donaria una ROM amb les traduccions de Drakyem i la meva. Mans a l&amp;rsquo;obra.&lt;/p&gt;&#10;&lt;h2 id="el-procés-de-traducció"&gt;El procés de traducció&#10;&lt;/h2&gt;&lt;p&gt;Aquí és on volia arribar, amb els diàlegs ja en espanyol i el Pokémon seguint-me pel mapa:&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="Diàleg en espanyol amb un Pokémon a l’overworld en una escena al laboratori" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="192" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://christt105.github.io/blog/translating-pokemon-following-renegade-platinum/following-veamos.png" width="256"&gt;&lt;/p&gt;&#10;&lt;p&gt;Abans de res tocava muntar totes les ROMs que necessitaria: Pokémon Platí en anglès i espanyol, Pokémon Renegade Platinum en anglès i espanyol (pedaçades amb el hack de Drayano) i Pokémon Following Platinum, que només existia en anglès, així que en vaig fer una còpia per treballar-hi en espanyol. Tot això amb thenewpoketext, l&amp;rsquo;eina que exporta i importa els textos de les ROMs de Pokémon de DS. Vaig anar escrivint un script de Python per a cada pas del procés, així que explicaré què feia cadascun.&lt;/p&gt;&#10;&lt;p&gt;Amb tantes ROMs i scripts movent-se alhora, així és com encaixava tot el procés:&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart TD&#10; A["Platinum EN + ES&lt;br/&gt;Renegade EN + ES&lt;br/&gt;Following EN"] --&gt;|export.py| B["XML per&lt;br/&gt;cada ROM"]&#10; B --&gt;|comparer.py| C["Diffs EN↔ES&lt;br/&gt;per parelles"]&#10; C --&gt;|replace.py| D["Following ES&lt;br/&gt;(text reciclat&lt;br/&gt;del Platinum)"]&#10; D --&gt;|"translate_following.py&lt;br/&gt;+ revisió manual"| E["Following ES&lt;br/&gt;(traduït)"]&#10; E --&gt;|"import_following_into_&lt;br/&gt;followingrenegade.py"| F["Following&lt;br/&gt;Renegade ES"]&#10; C --&gt;|"Renegade ES&lt;br/&gt;(Drakyem)"| F&#10; F --&gt;|"thenewpoketext:&lt;br/&gt;patch + mkrom"| G["ROMs jugables&lt;br/&gt;en castellà"]&lt;/pre&gt;&lt;h3 id="exportar-i-comparar-els-diàlegs"&gt;Exportar i comparar els diàlegs&#10;&lt;/h3&gt;&lt;p&gt;El primer pas era treure el text de dins les ROMs. &lt;code&gt;export.py&lt;/code&gt; cridava thenewpoketext per bolcar els diàlegs de cada ROM a un XML, i de pas feia servir &lt;code&gt;msg_name_changer.py&lt;/code&gt; per renombrar un parell d&amp;rsquo;arxius &lt;code&gt;.narc&lt;/code&gt; de missatges que al Platí surten mal ordenats si no es toquen a mà. Em va costar força trobar aquesta informació en el seu moment.&lt;/p&gt;&#10;&lt;p&gt;Amb tot en XML, entrava &lt;code&gt;comparer.py&lt;/code&gt;. Aquest script agafava parelles de ROMs (Platí anglès contra Platí espanyol, Renegade anglès contra Renegade espanyol, Following anglès contra Following Renegade anglès, etc.) i, recolzant-se en &lt;code&gt;xml_parser.py&lt;/code&gt; per llegir cada XML a un diccionari, comparava diàleg a diàleg pel seu id. El resultat el desava en dos formats de JSON: un amb tots els canvis junts i un altre separat en tres blocs, els textos que canvien entre les dues ROMs, els que falten a la primera i els que falten a la segona. Aquesta comparació és la base de tot el projecte: em permetia saber exactament quin diàleg en anglès corresponia a quin diàleg en espanyol, i quins diàlegs eren nous i no existien al joc original.&lt;/p&gt;&#10;&lt;p&gt;Així és, més o menys, la part que fa el repartiment en aquests tres blocs:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;span class="lnt"&gt;11&#10;&lt;/span&gt;&lt;span class="lnt"&gt;12&#10;&lt;/span&gt;&lt;span class="lnt"&gt;13&#10;&lt;/span&gt;&lt;span class="lnt"&gt;14&#10;&lt;/span&gt;&lt;span class="lnt"&gt;15&#10;&lt;/span&gt;&lt;span class="lnt"&gt;16&#10;&lt;/span&gt;&lt;span class="lnt"&gt;17&#10;&lt;/span&gt;&lt;span class="lnt"&gt;18&#10;&lt;/span&gt;&lt;span class="lnt"&gt;19&#10;&lt;/span&gt;&lt;span class="lnt"&gt;20&#10;&lt;/span&gt;&lt;span class="lnt"&gt;21&#10;&lt;/span&gt;&lt;span class="lnt"&gt;22&#10;&lt;/span&gt;&lt;span class="lnt"&gt;23&#10;&lt;/span&gt;&lt;span class="lnt"&gt;24&#10;&lt;/span&gt;&lt;span class="lnt"&gt;25&#10;&lt;/span&gt;&lt;span class="lnt"&gt;26&#10;&lt;/span&gt;&lt;span class="lnt"&gt;27&#10;&lt;/span&gt;&lt;span class="lnt"&gt;28&#10;&lt;/span&gt;&lt;span class="lnt"&gt;29&#10;&lt;/span&gt;&lt;span class="lnt"&gt;30&#10;&lt;/span&gt;&lt;span class="lnt"&gt;31&#10;&lt;/span&gt;&lt;span class="lnt"&gt;32&#10;&lt;/span&gt;&lt;span class="lnt"&gt;33&#10;&lt;/span&gt;&lt;span class="lnt"&gt;34&#10;&lt;/span&gt;&lt;span class="lnt"&gt;35&#10;&lt;/span&gt;&lt;span class="lnt"&gt;36&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;compare_files_split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;files_dict1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;files_dict2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;changed&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;missing_in_1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;missing_in_2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;file_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;texts_dict1&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;files_dict1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;file_id&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;files_dict2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;text_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text1&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;texts_dict1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;missing_in_2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setdefault&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{})[&lt;/span&gt;&lt;span class="n"&gt;text_id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;text1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;text1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;text2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;continue&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;texts_dict2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;files_dict2&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;file_id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;text_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text1&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;texts_dict1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;text_id&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;texts_dict2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;missing_in_2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setdefault&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{})[&lt;/span&gt;&lt;span class="n"&gt;text_id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;text1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;text1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;text2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;continue&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;text2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;texts_dict2&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;text_id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;text1&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;text2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;changed&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setdefault&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{})[&lt;/span&gt;&lt;span class="n"&gt;text_id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;text1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;text1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;text2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;text2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# ... i el mateix bucle a la inversa per omplir &amp;#34;missing_in_1&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;També vaig fer un parell d&amp;rsquo;scripts de suport per revisar tot això a ull: &lt;code&gt;export_csv.py&lt;/code&gt;, que bolca tots els XML a una única taula en CSV amb una columna per ROM per poder comparar ràpid, i &lt;code&gt;check_max_newline.py&lt;/code&gt;, que recorre els diàlegs originals per calcular quants caràcters caben en una línia del quadre de text abans que el joc hi posi un salt de línia automàtic.&lt;/p&gt;&#10;&lt;h3 id="reaprofitar-la-traducció-de-pokémon-platí"&gt;Reaprofitar la traducció de Pokémon Platí&#10;&lt;/h3&gt;&lt;p&gt;Amb la comparació feta, &lt;code&gt;replace.py&lt;/code&gt; agafava els textos en anglès de Following Platinum i Following Renegade Platinum i, allà on coincidien amb un diàleg del Platí o Renegade Platinum original, els substituïa pel seu equivalent en espanyol. El resultat era una ROM gairebé completament en espanyol, tret dels diàlegs nous que Mikelan98 i AdAstra havien escrit per al Following Platinum, que no existien al joc original i per tant no tenien cap traducció amb què fer coincidència.&lt;/p&gt;&#10;&lt;h3 id="traduir-el-contingut-nou-del-following-platinum"&gt;Traduir el contingut nou del Following Platinum&#10;&lt;/h3&gt;&lt;p&gt;Aquests diàlegs nous estaven pràcticament tots concentrats en un únic arxiu, el 724. No recordo si aleshores ja existia alguna IA com ChatGPT, m&amp;rsquo;imagino que sí però ni de lluny al nivell d&amp;rsquo;ara, així que tot això va ser força artesanal. La meva idea des del principi era escriure els scripts necessaris per traduir les dues ROMs sense haver-ho de fer tot a mà, així que vaig recórrer a la traducció automàtica de tota la vida: &lt;code&gt;translate_following.py&lt;/code&gt; recorria aquell arxiu amb la llibreria &lt;code&gt;deep_translator&lt;/code&gt;, que no és més que un embolcall en Python de traductors com Google Translate o MyMemory, i generava un CSV amb el text original i la seva traducció. Abans d&amp;rsquo;enviar cada text a traduir havia de substituir variables com el nom del jugador o d&amp;rsquo;un Pokémon per text de farciment, si no el traductor es menjava o deformava aquestes marques.&lt;/p&gt;&#10;&lt;p&gt;Així de senzill era el CSV que en sortia, amb l&amp;rsquo;id del diàleg dins l&amp;rsquo;arxiu 724, el text original i la traducció automàtica (la línia 5 és, de fet, la mateixa frase que surt en una de les captures de més avall):&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csv" data-lang="csv"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;id;original;translated&lt;/span&gt;&lt;span class="p"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;2;......\nYour Pokémon won’t look you in the eye.;...... Tu Pokémon no te mira a los ojos.&lt;/span&gt;&lt;span class="p"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;5;...Your Pokémon is so very angry!;... ¡Tu Pokémon está muy enfadado!&lt;/span&gt;&lt;span class="p"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;20;Your Pokémon is dancing with you!;¡Tu Pokémon está bailando contigo!&lt;/span&gt;&lt;span class="p"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;Aquell CSV el vaig repassar entrada per entrada a mà per polir la traducció automàtica, que per a diàlegs curts de videojoc s&amp;rsquo;equivocava força. Amb &lt;code&gt;import_translation_following.py&lt;/code&gt; tornava a ficar aquell CSV ja revisat dins l&amp;rsquo;XML, desfent el farciment de les variables, retallant les línies massa llargues perquè no sortissin del quadre de text i traduint a mà un grapat de textos que quedaven fora de l&amp;rsquo;arxiu 724 i que no valia la pena automatitzar.&lt;/p&gt;&#10;&lt;h3 id="combinar-following-platinum-amb-renegade-platinum"&gt;Combinar Following Platinum amb Renegade Platinum&#10;&lt;/h3&gt;&lt;p&gt;Amb el Following Platinum ja traduït, vaig passar al Following Renegade Platinum. Aquí no calia traduir res de nou: els diàlegs del Renegade Platinum ja estaven traduïts per Drakyem, i els del Following Platinum els acabava de traduir jo, només calia combinar-los. &lt;code&gt;import_following_into_followingrenegade.py&lt;/code&gt; agafava la comparació entre Renegade Platinum anglès i Following Platinum anglès per saber exactament quins diàlegs afegia aquest últim, i per cadascun copiava la seva traducció ja feta des de l&amp;rsquo;XML del Following Platinum espanyol al del Following Renegade Platinum espanyol. El resultat era l&amp;rsquo;XML complet del Following Renegade Platinum en espanyol.&lt;/p&gt;&#10;&lt;h3 id="tornar-a-ficar-ho-tot-a-la-rom"&gt;Tornar a ficar-ho tot a la ROM&#10;&lt;/h3&gt;&lt;p&gt;L&amp;rsquo;últim pas, per a les tres ROMs, era tornar a ficar l&amp;rsquo;XML traduït dins el joc amb thenewpoketext, pedaçant la ROM i reordenant altre cop aquells arxius &lt;code&gt;.narc&lt;/code&gt; de missatges. Amb això ja tenia les ROMs jugables en espanyol. Pel camí vaig anar trobant algun bug curiós, com el diàleg de Regigigas trencat, que també vaig arreglar i vaig deixar documentat al mateix repositori.&lt;/p&gt;&#10;&lt;p&gt;Va quedar alguna cosa sense traduir, com els textos que van ficats dins d&amp;rsquo;imatges en comptes de diàlegs, per exemple el nom dels tipus de Pokémon en alguna pantalla, però són detalls menors que no afecten jugar al joc en espanyol.&lt;/p&gt;&#10;&lt;p&gt;Mirant els commits, tampoc vaig trigar tant. El primer és del 19 de febrer de 2023, el pedaç del Following Platinum el vaig publicar el 13 de març i el del Following Renegade Platinum va arribar tot just tres dies després, el 16 de març, perquè ja tenia tota la traducció feta i només calia combinar-la. No van ser tres setmanes seguides dedicant-hi tots els dies, hi va haver parades de diversos dies entre commits, però per a l&amp;rsquo;artesanal que era el procés, es va fer força ràpid.&lt;/p&gt;&#10;&lt;a class="github-repo-card" href="https://github.com/christt105/PokemonFollowingRenegadePlatinumTranslation" target="_blank" rel="noopener"&gt;&#10; &lt;img src="https://avatars.githubusercontent.com/u/36189169?v=4" alt="christt105 avatar" class="repo-avatar"&gt;&#10; &lt;h3&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-github" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"&gt;&#10; &lt;path stroke="none" d="M0 0h24v24H0z" fill="none"/&gt;&#10; &lt;path d="M9 19c-4.3 1.4 -4.3 -2.5 -6 -3m12 5v-3.5c0 -1 .1 -1.4 -.5 -2c2.8 -.3 5.5 -1.4 5.5 -6a4.6 4.6 0 0 0 -1.3 -3.2a4.2 4.2 0 0 0 -.1 -3.2s-1.1 -.3 -3.5 1.3a12.3 12.3 0 0 0 -6.2 0c-2.4 -1.6 -3.5 -1.3 -3.5 -1.3a4.2 4.2 0 0 0 -.1 3.2a4.6 4.6 0 0 0 -1.3 3.2c0 4.6 2.7 5.7 5.5 6c-.6 .6 -.6 1.2 -.5 2v3.5" /&gt;&#10;&lt;/svg&gt;&#10;&#10;&#10; christt105/PokemonFollowingRenegadePlatinumTranslation&lt;/h3&gt;&#10; &lt;p&gt;&lt;/p&gt;&#10; &lt;div class="repo-stats"&gt;&#10; &lt;span&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" class="icon icon-tabler icons-tabler-filled icon-tabler-star"&gt;&lt;path stroke="none" d="M0 0h24v24H0z" fill="none"/&gt;&lt;path d="M8.243 7.34l-6.38 .925l-.113 .023a1 1 0 0 0 -.44 1.684l4.622 4.499l-1.09 6.355l-.013 .11a1 1 0 0 0 1.464 .944l5.706 -3l5.693 3l.1 .046a1 1 0 0 0 1.352 -1.1l-1.091 -6.355l4.624 -4.5l.078 -.085a1 1 0 0 0 -.633 -1.62l-6.38 -.926l-2.852 -5.78a1 1 0 0 0 -1.794 0l-2.853 5.78z" /&gt;&lt;/svg&gt; 3&lt;/span&gt;&#10; &lt;span&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-git-fork"&gt;&lt;path stroke="none" d="M0 0h24v24H0z" fill="none"/&gt;&lt;path d="M10 18a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" /&gt;&lt;path d="M5 6a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" /&gt;&lt;path d="M15 6a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" /&gt;&lt;path d="M7 8v2a2 2 0 0 0 2 2h6a2 2 0 0 0 2 -2v-2" /&gt;&lt;path d="M12 12l0 4" /&gt;&lt;/svg&gt; 0&lt;/span&gt;&#10; &lt;span&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-calendar-event"&gt;&lt;path stroke="none" d="M0 0h24v24H0z" fill="none"/&gt;&lt;path d="M4 7a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2l0 -12" /&gt;&lt;path d="M16 3l0 4" /&gt;&lt;path d="M8 3l0 4" /&gt;&lt;path d="M4 11l16 0" /&gt;&lt;path d="M8 15h2v2h-2l0 -2" /&gt;&lt;/svg&gt; 2026-05-12&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;h2 id="classic-mode-i-ràtio-de-shiny"&gt;Classic Mode i ràtio de shiny&#10;&lt;/h2&gt;&lt;p&gt;El repositori no es va quedar aturat el 2023. Més endavant vaig afegir variants del pedaç de Following Renegade Platinum sense tocar res del procés de traducció: unes &amp;ldquo;Classic&amp;rdquo;, que reverteixen el canvi de tipus que introdueix Drayano al Renegade Platinum per a qui prefereixi els tipus originals de cada Pokémon, i unes altres que canvien la ràtio d&amp;rsquo;aparició de shiny a 1/4096 o 1/512 en comptes de l'1/8192 de base, combinables entre elles. Sincerament, la de la modificació de la ràtio de shiny no l&amp;rsquo;he sabut testejar bé, no tinc una manera fiable de comprovar la probabilitat real sense jugar milers d&amp;rsquo;hores o fer força bruta amb un emulador, així que la vaig publicar confiant en el canvi dels valors i sense poder-ho confirmar del tot.&lt;/p&gt;&#10;&lt;h2 id="com-li-ha-anat"&gt;Com li ha anat&#10;&lt;/h2&gt;&lt;p&gt;Més exemples del resultat final:&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="Diàleg en espanyol amb un altre Pokémon seguint el protagonista davant d’una casa" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="192" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://christt105.github.io/blog/translating-pokemon-following-renegade-platinum/following-enfadado.png" width="256"&gt;&#10;&lt;img alt="Diàleg en espanyol dins la casa del protagonista" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="192" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://christt105.github.io/blog/translating-pokemon-following-renegade-platinum/following-laboratorio.png" width="256"&gt;&lt;/p&gt;&#10;&lt;p&gt;Comptant només les descàrregues de GitHub, sense comptar el formulari de Google ni les pàgines de tercers on ha acabat pujat, el pedaç de Following Platinum té més de 3700 descàrregues entre el pedaç i la ROM ja pedaçada, i el de Following Renegade Platinum gairebé 2900 comptant totes les seves variants (normal, Classic Mode i shiny). Més de 6500 descàrregues entre els dos, per a un projecte que vaig fer pensant únicament en mi mateix.&lt;/p&gt;&#10;&lt;p&gt;Estic content perquè molta gent ho ha gaudit, jo inclòs, els meus amics i la meva germana. En realitat l&amp;rsquo;ha descarregat més gent del que reflecteixen aquestes xifres, perquè ha acabat pujat en pàgines de tercers, on en alguns casos no han donat crèdits. Ho van arribar a jugar Xamork i Folagor, tot i que cap dels dos va donar crèdits i van publicar la descàrrega directa ells mateixos. Jo hi vaig jugar i me&amp;rsquo;l vaig passar amb un equip monotype psíquic.&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="Hall of Fame de Pokémon Following Renegade Platinum completat amb un equip monotype psíquic" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="800" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://christt105.github.io/blog/translating-pokemon-following-renegade-platinum/PokemonFollowingRenegadePlatinumMonotypeHallOfFame.png" srcset="https://christt105.github.io/blog/translating-pokemon-following-renegade-platinum/PokemonFollowingRenegadePlatinumMonotypeHallOfFame_hu_164864e17107a9b8.png 800w, https://christt105.github.io/blog/translating-pokemon-following-renegade-platinum/PokemonFollowingRenegadePlatinumMonotypeHallOfFame.png 1067w" width="1067"&gt;&lt;/p&gt;&#10;&lt;p&gt;No vaig posar la descàrrega directa de la ROM perquè em feia una mica de por i tinc molt d&amp;rsquo;apreci pel meu compte de GitHub. Igualment es pot descarregar el pedaç des del repositori o directament en &lt;a class="link" href="https://forms.gle/YwseURAufk9wccrJ9" target="_blank" rel="noopener"&#10; &gt;aquest formulari&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;He gaudit molt fent-ho i que més gent ho hagi gaudit. És un gra de sorra que he aportat a la comunitat d&amp;rsquo;aquesta franquícia que tant em va marcar de petit.&lt;/p&gt;&#10;&lt;p&gt;La meva germana se&amp;rsquo;l va passar al 100%, completant una Living Dex.&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="Living Dex completa de la meva germana, amb tots els Pokémon organitzats per número de Pokédex" class="gallery-image" data-flex-basis="633px" data-flex-grow="263" height="1524" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://christt105.github.io/blog/translating-pokemon-following-renegade-platinum/livingdex_collage.png" srcset="https://christt105.github.io/blog/translating-pokemon-following-renegade-platinum/livingdex_collage_hu_279ab6461f32449c.png 800w, https://christt105.github.io/blog/translating-pokemon-following-renegade-platinum/livingdex_collage_hu_52c3bef070ebf40c.png 1600w, https://christt105.github.io/blog/translating-pokemon-following-renegade-platinum/livingdex_collage_hu_752860622831a4f9.png 2400w, https://christt105.github.io/blog/translating-pokemon-following-renegade-platinum/livingdex_collage.png 4020w" width="4020"&gt;&#10;&lt;img alt="Targeta d’entrenadora de la meva germana" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="492" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://christt105.github.io/blog/translating-pokemon-following-renegade-platinum/sister-trainer-card.png" width="656"&gt;&#10;&lt;img alt="Diploma per completar la Pokédex Nacional" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="492" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://christt105.github.io/blog/translating-pokemon-following-renegade-platinum/sister-diploma.png" width="656"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;A la targeta d&amp;rsquo;entrenadora posa que va començar l&amp;rsquo;aventura el 2011, però això és perquè no va canviar la data de la consola, els qui heu jugat a Animal Crossing ho entendreu.&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;I fins aquí el post d&amp;rsquo;avui. Estic molt content que hi hagi gent, a part de mi, que gaudeixi del que faig. Fins la propera!&lt;/p&gt;&#10;</description></item><item><title>Pokémon Following Renegade Platinum Traducció</title><link>https://christt105.github.io/ca/projects/pokemonfollowingrenegadeplatinum/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://christt105.github.io/ca/projects/pokemonfollowingrenegadeplatinum/</guid><enclosure url="https://christt105.github.io/projects/pokemonfollowingrenegadeplatinum/PokemonFollowingPlatinum.webp" length="45500" type="image/webp"/><description>&lt;p&gt;Aquest projecte proporciona pegats de traducció per als ROM hacks Pokémon Following Platinum i Pokémon Following Renegade Platinum, fent-los totalment jugables en castellà.&#10;Es va desenvolupar utilitzant Python juntament amb l&amp;rsquo;eina thenewpoketext, que permet extreure, editar i reinserir text del joc a les ROMs.&lt;/p&gt;&#10;&lt;p&gt;Per a Following Platinum, la traducció combina el text original en castellà de Pokémon Platinum amb contingut nou traduït introduït pel hack.&#10;Per a Following Renegade Platinum, es basa en la traducció al castellà de Drakyem de Renegade Platinum, afegint tot el contingut addicional de Following Platinum també.&lt;/p&gt;&#10;</description></item></channel></rss>