背景#
目前市面上的 renpy 翻譯軟體有一個問題,可能是為了平行化,送去翻譯的時候是一句一句送。這會讓翻譯軟體失去上下文,沒辦法精準知道要如何連貫翻譯會比較好。
剛好生成式 AI 最擅長的就是理解 context,renpy 的翻譯字串又非常結構化,於是就想說是不是能夠弄一個 skill 直接把整份文件一起翻譯。
使用前聲明
- 絕對會很慢,因為整段讀入,會需要理解 context,取代回來的時候也需要精準替代,不能像翻譯機無腦翻出就好。
- 絕對很燒 token,請盡量用最便宜的 (eg: gpt5.4-mini) 來執行。
BTW: 這是練習,探索一下 AI 能力的邊界,以及 skill 可以做到什麼事。整篇會比較像流水帳。
事前準備#
翻譯字串需要先自行抽取,我是使用 Renpy Translator,裡面有中文說明。
大致上會用到
- 高級選項=>官方提取:把字串檔全部抓出來
- 高級選項=>替換字體:沒換字體中文有時候會變亂碼
- 高級選項=>添加更改語言入口:切換語言用
再來就是把 tl/語言 的內容單獨複製出來當作 codex 的專案文件夾。
Skill#
用法#
從用法講起,可以參考完整 Skill。
使用時先初始化進度檔,batch 數量可按照個人財力自行調整,影響的是平行處理要素。
$renpy-tl 初始化為 2 個 batch$字號是使用 skill 的意思。過後會出現 progress/batch-001.md 之類的檔案,這是進度表。接下來
$renpy-tl 翻譯 @batch-001.md 在 codex 中加上 @ 可以引用文件。codex 就會開始讀取 batch-001.md 找到翻譯到一半的內容並接續。如果要平行化處理記得開不同 thread 來做事。
如果檔案很少的話也可以直接使用
$renpy-tl 翻譯 @script.rpy直接指定要翻譯的檔案,不過這樣人工介入的程度就會高一點。
codex 執行一次大約會用 3~10 分鐘不等 (視模型和他的心情)。如果不想要頻頻檢視是否需要繼續的話,codex 本身有排程指令的功能,只要在對話框疊三五個「繼續」,應該就能工作十到二十分鐘。至於要疊多少就看個人喜好。
不建議說太多次「繼續」,開新 session 重新請他翻譯會比較乾淨,context 疊太長有時會影響他的判斷力。下面為繼續示意圖

成果#
仍然需要人工介入。也許是我 prompt 下的還不夠精準,在處理大塊文本時,仍然會遇到下列狀況
- 不小心把註解(原文)也進行翻譯
- 不小心翻譯人名
- 把翻譯文字放到文本最底下。
- 漏掉一整段沒翻譯 (但 batch 檔已經顯示 completed)
人工稍微瞄過有沒有問題還是必要的。
也許是機械化的流程應該考慮更自動化的作法,而不是靠生成式 AI 來硬幹。
改進市面上的翻譯軟體效果可能會更好(也更省 token)。
過程#
最開始我的 skill 寫得很簡單
---
name: renpy-tl
description: 翻譯 Renpy。
---
.rpy 檔為 Renpy 腳本檔。請按照下列規則
1. 不要修改到註解或是字串編號。
2. 專有名詞 (如人名) 請保留,不要進行翻譯。
3. 翻譯成繁體中文。
4. 不要調用外部翻譯工具,直接翻譯文本即可。對於短文本也蠻夠用的,AI 本身已經有足夠的背景知識了解什麼叫做 renpy script,所以不一定要給範例或是教他什麼是 renpy 特殊停頓字元,他會自行理解。
問題出在長文本,AI 不會記得上次翻到哪裡。所以就必須不斷下 $renpy-tl 翻譯 @ooo.rpy 等指令,且如果剛好 rpy 檔很長,還需要告訴他從哪行開始。
雖然可以只下 $renpy-tl @ooo.rpy 仍有文字未翻譯,請幫我處理。,但有時 AI 也笨笨的,抓不到正確的行數。
另外,當單一檔案過長的時候,有時候 AI 會試圖讀入所有 context 並重新回寫文件,但過長的 context 會導致 AI 抓錯位置回寫。
雖然沒有出現 A 句接到 B 句的狀況,但文件格式會跑掉,然後 AI 就會發現他搞亂了,又再次試圖修復。
這之間的毫無生產力過程也是會持續耗損 token 的。
改進#
兩個比較需要改進的問題點
- 當翻譯文本較為大量時,需要讓 AI 知道從哪邊接續。
- 要限制 AI 一次能做的量,我目前是抓最多一次處理 50 句翻譯。
進度紀錄#
要讓 ai 知道要從哪邊繼續下去,最好的方法就是請他做完一個批次就紀錄一次進度。
且這個進度紀錄不能只是「幫我紀錄在 ooxx」,需要給 AI 精準的格式。
我第一次沒給格式的時候,他紀錄未完成內容,有時用行號,有時用 translation label,這會讓不精確性提高。
最好在 skill 內寫死格式。
| Status | File | Resume Point |
| --- | --- | --- |
| not started | `game/day1.rpy` | line 1 |
| in progress | `game/day2.rpy` | line 240 |
| completed | `game/day3.rpy` | completed |然後在下面補充 not started / in progress / completed 的意義。
限制 AI 一次翻譯量#
這點比較特殊,但 AI 一次想讀入大量 context 反而會一直出問題。要嘛回寫失敗,要嘛會告訴你說「我要讀完全部才開始翻」,但這個 rpy 檔有一萬行,根本不可能完全理解。所以盡可能的加上限制要他一段一段翻會是比較理想的。
只是 prompt 的遣詞用字也需要考慮一下。如果只寫「一次最多翻譯五十句」很容易被 ai 理解為翻 50 句就停下來問一次是否要繼續。這樣會導致 30 秒就要打一次「繼續」,很煩。
所以需要在 agent 中明確提示這只是 chunk size,請翻到文件結束再中止。目前是這樣寫:
首先明確提示這只是一個內部處理單位
Translation Chunk Size
1. For dialogue or scene translation, process one coherent scene or up to 50 target strings per translation chunk, whichever comes first.
2. For short UI or system-text entries in translate ... strings: blocks, process up to 100 new values per translation chunk.
3. A translation chunk is an internal progress unit, not a stopping point that requires user confirmation.再來在翻譯過程的地方說明,請他不要中途停下來
5. Do not pause to ask whether to continue after completing a chunk or a file.雖然這樣還是會中斷,但是中斷頻率會低一點點。
