<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>游戏汉化 on September的个人空间</title><link>https://blog.september.win/tags/%E6%B8%B8%E6%88%8F%E6%B1%89%E5%8C%96/</link><description>Recent content in 游戏汉化 on September的个人空间</description><generator>Hugo -- gohugo.io</generator><language>zh</language><lastBuildDate>Sat, 23 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.september.win/tags/%E6%B8%B8%E6%88%8F%E6%B1%89%E5%8C%96/index.xml" rel="self" type="application/rss+xml"/><item><title>把 Ren'Py 游戏翻译流程写成一个可复用 Skill</title><link>https://blog.september.win/p/renpy-game-translation-skill/</link><pubDate>Sat, 23 May 2026 00:00:00 +0000</pubDate><guid>https://blog.september.win/p/renpy-game-translation-skill/</guid><description>&lt;p&gt;最近把一套 Ren&amp;rsquo;Py 游戏翻译流程整理成了一个 Codex Skill。它的作用不是“教 AI 怎么随便翻译几句文本”，而是把 Ren&amp;rsquo;Py 汉化里那些很容易被忽略的规则，变成一份可以反复执行的检查清单。&lt;/p&gt;
&lt;p&gt;Ren&amp;rsquo;Py 游戏翻译看起来很简单：找到文本，翻成中文，保存。但真正做起来会发现，问题经常不在“这句话怎么翻”，而在“这句话到底会不会被 Ren&amp;rsquo;Py 正确匹配、正确加载、正确显示”。&lt;/p&gt;
&lt;p&gt;所以这个 Skill 的核心思路是：不要把翻译当成纯文本替换，而要把它当成一个小型补丁工程。&lt;/p&gt;
&lt;h2 id="为什么要写成-skill"&gt;为什么要写成 Skill
&lt;/h2&gt;&lt;p&gt;单次翻译靠经验可以做完，但下一次换一个游戏，很多坑还会再踩一遍。&lt;/p&gt;
&lt;p&gt;比如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;old&lt;/code&gt; 字符串被改了一个空格，导致翻译完全匹配不上&lt;/li&gt;
&lt;li&gt;菜单选项带了文字标签或状态后缀，生成的翻译没有覆盖真实显示内容&lt;/li&gt;
&lt;li&gt;变量插值里的人名、阵营名仍然显示英文&lt;/li&gt;
&lt;li&gt;字体不支持中文，结果游戏里全是方块&lt;/li&gt;
&lt;li&gt;直接改原脚本，更新游戏后补丁很难迁移&lt;/li&gt;
&lt;li&gt;批量脚本写文件时编码错了，中文变成乱码或问号&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些不是“翻译水平”问题，而是流程问题。Skill 适合处理的正是这种流程：每次遇到 Ren&amp;rsquo;Py 项目，都按同一套顺序检查、修改和验证。&lt;/p&gt;
&lt;h2 id="工作区应该放在哪里"&gt;工作区应该放在哪里
&lt;/h2&gt;&lt;p&gt;Ren&amp;rsquo;Py 翻译最重要的目录是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;game/tl/&amp;lt;language&amp;gt;/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Skill 里的第一条规则就是：优先在翻译目录里工作，能不改原始脚本就不改原始脚本。&lt;/p&gt;
&lt;p&gt;原因很现实。原脚本是游戏本体的一部分，直接改它虽然快，但后续更新、分发、回滚都会变麻烦。更稳的方式是把翻译、字体、界面覆盖、语言按钮、默认语言设置等内容尽量放进 &lt;code&gt;game/tl/&amp;lt;language&amp;gt;/&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;这样做的好处是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;删除语言文件夹就能恢复原版&lt;/li&gt;
&lt;li&gt;游戏更新时更容易迁移&lt;/li&gt;
&lt;li&gt;补丁边界清楚&lt;/li&gt;
&lt;li&gt;不容易误伤原游戏逻辑&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果原游戏没有 &lt;code&gt;.rpy&lt;/code&gt;，只有 &lt;code&gt;.rpyc&lt;/code&gt; 或资源包，那就先处理解包、反编译或生成翻译文件的问题，而不是直接乱改。&lt;/p&gt;
&lt;h2 id="oldnew-不能乱动"&gt;old/new 不能乱动
&lt;/h2&gt;&lt;p&gt;Ren&amp;rsquo;Py 里常见的翻译形式有两种。&lt;/p&gt;
&lt;p&gt;一种是对话块：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;translate chinese start_abc123:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;这里写翻译后的台词&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;另一种是字符串表：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;translate chinese strings:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; old &amp;#34;Start&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; new &amp;#34;开始&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这里最容易犯的错是改 &lt;code&gt;old&lt;/code&gt;。&lt;br&gt;
&lt;code&gt;old&lt;/code&gt; 不是给你润色的原文，它是 Ren&amp;rsquo;Py 用来匹配原始文本的钥匙。空格、标点、文本标签、大小写、换行都可能影响匹配。&lt;/p&gt;
&lt;p&gt;所以规则很简单：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;old 保持原样
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;new 写翻译
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果一个 &lt;code&gt;old&lt;/code&gt; 看起来有点怪，比如带着 &lt;code&gt;{size=}&lt;/code&gt;、颜色标签、状态后缀，也不要顺手清理。真实运行时显示出来的字符串很可能就是这么匹配的。&lt;/p&gt;
&lt;h2 id="菜单和-ui-要单独查"&gt;菜单和 UI 要单独查
&lt;/h2&gt;&lt;p&gt;Ren&amp;rsquo;Py 自动生成翻译文件很有用，但它不一定能覆盖所有运行时可见文本。&lt;/p&gt;
&lt;p&gt;除了对话，还要主动搜索这些位置：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Character&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;...&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;textbutton&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;tooltip&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;renpy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;...&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;renpy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;notify&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;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;default&lt;/span&gt; &lt;span class="n"&gt;xxx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;define&lt;/span&gt; &lt;span class="n"&gt;xxx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="n"&gt;xxx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;menu&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;尤其是菜单选项。它们经常带条件、标签、样式或自定义 screen 处理。你在翻译文件里看到的 &lt;code&gt;old &amp;quot;Yes&amp;quot;&lt;/code&gt;，不一定覆盖了运行时真正显示的 &lt;code&gt;{color=#fff}Yes{/color}&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;如果某个选项死活不翻译，别先怀疑 Ren&amp;rsquo;Py。先把运行时原文和 &lt;code&gt;old&lt;/code&gt; 逐字节对一下，包括空格和标签。&lt;/p&gt;
&lt;h2 id="变量插值是隐藏大坑"&gt;变量插值是隐藏大坑
&lt;/h2&gt;&lt;p&gt;这次整理 Skill 时，最值得单独记下的是变量插值。&lt;/p&gt;
&lt;p&gt;Ren&amp;rsquo;Py 里常见写法是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#34;Welcome to [tribe_name], [player_name].&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果 &lt;code&gt;tribe_name&lt;/code&gt; 的值是 &lt;code&gt;&amp;quot;Wartribe&amp;quot;&lt;/code&gt;，即使你在字符串表里写了：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;old &amp;#34;Wartribe&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;new &amp;#34;战族&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;最终显示时也不一定会自动变成中文。因为普通的 &lt;code&gt;[tribe_name]&lt;/code&gt; 插值只是把变量当前值拿出来显示，不会必然再走一遍翻译表。&lt;/p&gt;
&lt;p&gt;这种情况下要用翻译感知插值：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#34;欢迎来到 [tribe_name!t]，[player_name!t]。&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果变量翻译后还需要继续插值，可以看情况用：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;variable&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;ti&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这个坑很隐蔽，因为外面的句子已经翻译了，只有嵌进去的人名、地名、阵营名还保留英文。看起来像漏翻，其实是插值方式不对。&lt;/p&gt;
&lt;h2 id="高级补丁放-zzzrpy"&gt;高级补丁放 zzz.rpy
&lt;/h2&gt;&lt;p&gt;有些问题不是一句 &lt;code&gt;old/new&lt;/code&gt; 能解决的，比如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;添加语言切换按钮&lt;/li&gt;
&lt;li&gt;设置默认语言&lt;/li&gt;
&lt;li&gt;替换字体&lt;/li&gt;
&lt;li&gt;调整中文 UI 样式&lt;/li&gt;
&lt;li&gt;覆盖 screen&lt;/li&gt;
&lt;li&gt;修正少量源代码层面的文本&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这类内容可以放到翻译目录里的补丁文件，例如：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;game/tl/chinese/zzz.rpy
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;常见做法是加：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;init offset = 1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;让补丁比原定义更晚加载。这样可以覆盖 screen、style、define 等内容，又不会直接动原文件。&lt;/p&gt;
&lt;p&gt;默认语言也要分清：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;define config.default_language = &amp;#34;chinese&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这更适合“首次启动默认中文”。&lt;br&gt;
如果用 &lt;code&gt;config.language&lt;/code&gt; 强行指定语言，就可能变成每次启动都锁死语言，不一定符合玩家预期。&lt;/p&gt;
&lt;h2 id="字体不是最后再想的事"&gt;字体不是最后再想的事
&lt;/h2&gt;&lt;p&gt;中文翻译里，字体问题经常到最后才暴露：文本已经翻好了，进游戏一看全是方块。&lt;/p&gt;
&lt;p&gt;Skill 里把字体和样式也放进检查范围。一般有几种处理方式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在 &lt;code&gt;translate &amp;lt;language&amp;gt; style&lt;/code&gt; 里覆盖样式&lt;/li&gt;
&lt;li&gt;在 &lt;code&gt;translate &amp;lt;language&amp;gt; python&lt;/code&gt; 里设置 GUI 变量&lt;/li&gt;
&lt;li&gt;在 &lt;code&gt;game/tl/&amp;lt;language&amp;gt;/&lt;/code&gt; 下镜像放置字体资源&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;zzz.rpy&lt;/code&gt; 做语言限定的字体覆盖&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;关键是尽量让字体修复只影响目标语言，不要全局改坏原版 UI。&lt;/p&gt;
&lt;h2 id="不要信任批量替换"&gt;不要信任批量替换
&lt;/h2&gt;&lt;p&gt;批量脚本很诱人，尤其是翻译量大的时候。但 Ren&amp;rsquo;Py 文件里有很多结构性内容：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;缩进&lt;/li&gt;
&lt;li&gt;引号&lt;/li&gt;
&lt;li&gt;转义符&lt;/li&gt;
&lt;li&gt;文本标签&lt;/li&gt;
&lt;li&gt;插值变量&lt;/li&gt;
&lt;li&gt;&lt;code&gt;%&lt;/code&gt;、&lt;code&gt;\&lt;/code&gt;、&lt;code&gt;/&lt;/code&gt; 这类特殊符号&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果脚本没有严格按 UTF-8 读写，中文很容易变成乱码、问号或损坏标签。&lt;/p&gt;
&lt;p&gt;所以 Skill 里明确写了：在 Windows 上做批量编辑时，要使用明确的 UTF-8 读写方式。改完后要扫一遍：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;乱码
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;???? 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;� 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;损坏的 {tag}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;损坏的 [variable]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;翻译文件不是普通 Markdown，不能只看文本大概对不对。&lt;/p&gt;
&lt;h2 id="验证要看三个文件"&gt;验证要看三个文件
&lt;/h2&gt;&lt;p&gt;改完之后，不要只打开一两句台词看看。至少要检查：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;errors.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;traceback.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;text_overflow.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;它们分别对应不同问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;errors.txt&lt;/code&gt;：生成或启动阶段的问题&lt;/li&gt;
&lt;li&gt;&lt;code&gt;traceback.txt&lt;/code&gt;：运行时崩溃&lt;/li&gt;
&lt;li&gt;&lt;code&gt;text_overflow.txt&lt;/code&gt;：文本溢出、排版放不下&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;还要实际测试：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;主菜单&lt;/li&gt;
&lt;li&gt;设置界面&lt;/li&gt;
&lt;li&gt;语言切换&lt;/li&gt;
&lt;li&gt;存档读档&lt;/li&gt;
&lt;li&gt;代表性对话&lt;/li&gt;
&lt;li&gt;选项菜单&lt;/li&gt;
&lt;li&gt;字体显示&lt;/li&gt;
&lt;li&gt;被覆盖的 label 或 screen&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ren&amp;rsquo;Py 翻译不是“文件能保存就完成”，而是“游戏运行时每条路径都能正确显示”。&lt;/p&gt;
&lt;h2 id="这个-skill-最有用的地方"&gt;这个 Skill 最有用的地方
&lt;/h2&gt;&lt;p&gt;我觉得它最有用的不是告诉 AI “请翻译成中文”，而是强迫 AI 先尊重 Ren&amp;rsquo;Py 的工程规则。&lt;/p&gt;
&lt;p&gt;它会提醒我：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不要乱改 &lt;code&gt;old&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;不要直接动原脚本&lt;/li&gt;
&lt;li&gt;不要忽略菜单和 UI&lt;/li&gt;
&lt;li&gt;不要忘记变量插值的 &lt;code&gt;!t&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;不要把字体和排版当成收尾小事&lt;/li&gt;
&lt;li&gt;不要跳过运行验证&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这比单纯提高翻译文风重要得多。&lt;/p&gt;
&lt;h2 id="总结"&gt;总结
&lt;/h2&gt;&lt;p&gt;Ren&amp;rsquo;Py 游戏汉化本质上不是文本替换，而是一套围绕运行时匹配、语言加载、界面覆盖和补丁分发的工程流程。&lt;/p&gt;
&lt;p&gt;把这套流程写成 Skill 之后，AI 就不只是“会翻译”，而是会按固定步骤处理项目结构、翻译文件、UI 字符串、变量插值、字体、补丁和验证。&lt;/p&gt;
&lt;p&gt;下一次再做 Ren&amp;rsquo;Py 游戏翻译时，就不用从零回忆哪些坑要避开。直接让 Skill 接管检查清单，人只需要把关翻译质量和最终体验。&lt;/p&gt;</description></item></channel></rss>