Ren'Py游戏解包与汉化完全手册

3394 字
17 分钟
Ren'Py游戏解包与汉化完全手册

第一章:Ren’Py引擎基础#

1.1 Ren’Py游戏文件结构解析#

Ren’Py游戏采用模块化的目录结构设计,核心逻辑与资源文件分离,便于开发维护和二次创作。典型游戏目录结构如下:

游戏目录/
├── game/ # 游戏核心资源目录
│ ├── script.rpyc # 加密脚本文件(运行时使用)
│ ├── script.rpy # 源代码脚本(如果开发者未删除)
│ ├── images/ # 图片资源(CG、立绘、背景等)
│ ├── audio/ # 音频资源(BGM、音效、语音)
│ ├── fonts/ # 字体文件
│ ├── tl/ # 翻译文件目录
│ └── persistent/ # 存档数据
└── renpy/ # 引擎核心文件

关键文件说明:

  • script.rpyc:编译后的脚本文件,采用Ren’Py专用格式加密,需通过解包工具才能还原为可读的.rpy源码

  • images/ :通常包含jpg、png、webp等格式图片,部分游戏可能采用.rpa打包压缩

  • tl/ :翻译文件目录,遵循Ren’Py的翻译规范,汉化成果主要存放于此

1.2 rpy与rpyc文件格式详解#

rpy文件(Ren’Py Script):

label start:
"这是开场白"
e "你好,欢迎来到这个世界!"
menu:
"选项A":
"你选择了A"
"选项B":
"你选择了B"

rpyc文件(Ren’Py Compiled):

  • 二进制格式,包含编译后的Python字节码和元数据

  • 文件头标识: RENPY RPC

  • 加密级别因版本而异,7.x和8.x采用不同的加密算法

1.3 Ren’Py版本差异(7.x vs 8.x)#

表格

特性Ren’Py 7.xRen’Py 8.x
Python版本Python 2.7Python 3.8+
脚本编码UTF-8UTF-8(强制)
rpyc加密算法简单XORAES混合加密
翻译系统旧版tl格式支持更复杂的变量翻译
文本引擎基础渲染支持高级文本特效

1.4 加密识别与判断方法#

方法一:查看游戏根目录的 game/tl/common.rpyc 文件

# 使用file命令识别文件类型
file script.rpyc
# 输出示例:script.rpyc: data

方法二:检查游戏版本号

# 查找版本配置
cat game/tl/common.rpyc | strings | grep "version"

方法三:通过 unrpyc 工具尝试解密

python unrpyc.py game/script.rpyc
# 如果输出"Unknown encryption",说明版本不匹配或加密强度较高

第二章:工具安装与准备#

2.1 解包工具安装#

unrpyc工具#

unrpyc是社区开发的通用解包工具,支持Ren’Py 6.18至8.2.x版本。

安装步骤:

# 1. 克隆项目仓库
git clone https://github.com/CensoredUsername/unrpyc.git
cd unrpyc
# 2. 安装Python依赖
pip install -r requirements.txt
# 3. 验证安装
python unrpyc.py --help

解密命令:

# 基础解密
python unrpyc.py 游戏目录/game/ -o 解包输出目录/
# 批量处理
python unrpyc.py 游戏目录/game/*.rpyc -o 解包输出目录/
# 跳过加密验证(慎用)
python unrpyc.py --no-preserve 游戏目录/game/ -o 解包输出目录/

Ren’Py SDK官方工具#

Ren’Py官方SDK提供完整的开发环境,包含 rcc(Ren’Py Command Compiler)工具。

下载与安装:

# 下载Ren'Py SDK(以8.2.1版本为例)
wget https://www.renpy.org/dl/8.2.1/renpy-8.2.1-sdk.tar.bz2
# 解压
tar -xjf renpy-8.2.1-sdk.tar.bz2
cd renpy-8.2.1-sdk
# 启动Ren'Py(可选)
./renpy.sh

解密rpyc文件:

# 单文件解密
./rcc --decrypt 游戏文件.rpyc
# 批量解密
./rcc --decrypt game/*.rpyc
# 指定输出目录
./rcc --decrypt game/script.rpyc -o output/

2.2 文本提取工具#

rpatool(提取rpa资源包)#

rpa(Ren’Py Archive)是Ren’Py的打包格式,将多个资源文件打包成单个文件以节省空间。

安装:

# 下载rpatool
wget https://github.com/shizmob/rpatool/raw/master/rpatool.py

提取rpa文件:

# 基础提取
python rpatool.py extract game.rpa 输出目录/
# 列出rpa内容
python rpatool.py list game.rpa
# 创建rpa文件
python rpatool.py create output.rpa 输入目录/

Ren’Py文本提取GUI工具#

推荐使用Ren’Py TranslatorRPG Maker Trans(支持Ren’Py),提供图形化界面简化操作流程。

配置说明:

  1. 批量提取配置

    • 设置输入目录为游戏 game/ 文件夹

    • 勾选”提取所有rpy文件”

    • 选择输出编码为UTF-8

  2. 中文编码识别设置

    • 自动检测:UTF-8、GBK、Shift-JIS

    • 手动指定: —encoding=utf-8 参数

第三章:解包实战#

3.1 基础解包流程#

以下是一个完整的自动化解包脚本,涵盖文件复制、解密、资源提取和验证全流程。

#!/bin/bash
# 完整解包脚本
GAME_DIR="/path/to/game"
OUTPUT_DIR="./unpacked_game"
# 1. 复制游戏文件(避免破坏原文件)
echo "复制游戏文件..."
cp -r "$GAME_DIR" "$OUTPUT_DIR"
# 2. 解密rpyc文件
echo "解密rpyc文件..."
python unrpyc.py "$OUTPUT_DIR/game/" -o "$OUTPUT_DIR/game/"
# 3. 提取rpa资源包
echo "提取rpa资源包..."
for rpa_file in "$OUTPUT_DIR/game/"*.rpa; do
if [ -f "$rpa_file" ]; then
python rpatool.py extract "$rpa_file" "$OUTPUT_DIR/resources/"
fi
done
# 4. 验证解包结果
echo "验证解包结果..."
rpy_count=$(find "$OUTPUT_DIR" -name "*.rpy" | wc -l)
rpa_count=$(find "$OUTPUT_DIR/game/" -name "*.rpa" | wc -l)
echo "解包完成!"
echo "- 获得rpy文件:$rpy_count 个"
echo "- 处理rpa文件:$rpa_count 个"

执行权限与运行:

chmod +x unpack_game.sh
./unpack_game.sh

3.2 常见问题解决#

表格

问题原因解决方案
解包后仍然是rpycunrpyc版本不匹配升级unrpyc到最新版,或使用Ren’Py SDK解密
文本乱码编码识别错误在unrpyc命令中添加 —encoding=utf-8 参数
无法解密游戏采用自定义加密保护使用Ren’Py SDK的 rcc —decrypt 工具
部分文件解包失败文件权限或路径问题添加 —no-preserve 参数,或使用管理员权限运行
rpa提取失败rpa文件损坏或版本不兼容尝试多个rpatool版本,或手动解析rpa头信息

第四章:文本提取与修改#

4.1 提取文本内容#

方法一:使用正则表达式提取

# 提取文本内容脚本
import re
from pathlib import Path
def extract_text(rpy_file):
"""从rpy文件中提取对话文本"""
with open(rpy_file, 'r', encoding='utf-8') as f:
content = f.read()
# 提取对话文本(双引号或单引号包裹的内容)
dialogues = re.findall(r'["\']([^"\']+)["\']', content)
# 过滤掉非对话文本(如变量名、标签等)
filtered_dialogues = [
text for text in dialogues
if len(text) > 1 # 忽略单个字符
and not text.startswith('_') # 忽略变量
]
return filtered_dialogues
# 批量提取
game_dir = Path("unpacked_game/game")
all_texts = []
for rpy_file in game_dir.glob("*.rpy"):
texts = extract_text(rpy_file)
all_texts.extend(texts)
print(f"从 {rpy_file.name} 提取了 {len(texts)} 条文本")
# 保存到翻译文件
with open("texts_to_translate.txt", 'w', encoding='utf-8') as f:
for i, text in enumerate(all_texts, 1):
f.write(f"{i}. {text}\n")

方法二:使用Ren’Py SDK内置提取

from renpy import game, script
def extract_with_sdk():
"""使用Ren'Py SDK提取文本"""
game.init()
# 遍历所有脚本标签
texts = {}
for label, node in script.script.nodes.items():
if hasattr(node, 'what'): # 对话节点
texts[label] = node.what
return texts

4.2 文本格式解析#

Ren’Py脚本格式相对简单,主要由标签、对话、菜单等构成。

Ren’Py脚本格式示例:

label start:
"这是开场白"
e "角色名说:这是对话内容"
menu:
"选项1":
jump option_1
"选项2":
jump option_2
label option_1:
"你选择了选项1,接下来发生了一些事情..."
jump end
label option_2:
"你选择了选项2,这是另一条路线..."
jump end
label end:
"游戏结束"
return

语法解析要点:

  1. label:脚本入口点,用于跳转和流程控制

  2. 对话: 角色名 “对话内容” 或 “独立对话”

  3. menu:选项分支,支持嵌套

  4. jump/return:流程跳转控制

汉化注意事项:

  • 保留原有标签名( label start:),避免破坏游戏逻辑

  • 变量名( $ variable = value)通常不需要翻译

  • 保留格式控制字符(如 \n 换行符)

第五章:汉化入门#

5.1 汉化流程图#

解包游戏
提取文本
翻译文本
打包成tl文件
测试汉化效果
打包发布

5.2 翻译文件格式#

Ren’Py的翻译系统采用独立的翻译文件,存放在 game/tl/<语言代码>/ 目录下。

翻译文件结构:

game/
└── tl/
└── chinese/
├── common.rpy # 通用翻译
├── script.rpy # 主脚本翻译
└── [其他rpy文件].rpy

翻译文件格式示例:

game/tl/chinese/script.rpy
translate chinese start_1:
# "This is the opening."
"这是开场白。"
translate chinese start_2:
# old "Character Name"
# new "角色名"
"角色名" "这是对话内容"
translate chinese menu_1:
# "Option 1"
"选项1"
translate chinese menu_2:
# "Option 2"
"选项2"

关键说明:

  • translate chinese <label名>:翻译块标识

  • 注释中的原文:保留原文便于对照

  • 翻译内容:直接替换为中文

  • 角色名翻译: “新角色名” “对话内容”

5.3 汉化工具推荐#

Ren’Py Translation Editor#

功能特点:

  • 图形化界面,支持拖拽式翻译

  • 实时预览翻译效果

  • 自动备份和版本控制

  • 支持多语言项目管理

使用流程:

  1. 导入解包后的游戏目录

  2. 自动扫描所有rpy文件

  3. 逐句翻译,支持搜索和替换

  4. 导出为tl文件

TLTools(批量翻译工具)#

集成API支持:

  • Google Translate API

  • DeepL API

  • 百度翻译API

  • OpenAI GPT-4(需要配置)

示例配置:

tltools_config.json
{
"source_language": "en",
"target_language": "zh-CN",
"api_provider": "google",
"api_key": "your-api-key",
"batch_size": 100,
"output_encoding": "utf-8"
}

第六章:进阶技巧#

6.1 图片资源修改#

步骤一:替换图片

# 1. 解包图片资源
python rpatool.py extract game/images.rpa extracted_images/
# 2. 使用Photoshop/GIMP编辑图片
# 保持原始分辨率和格式(推荐PNG)
# 3. 替换原图
cp edited_image.png extracted_images/original_name.png
# 4. 重新打包为rpa
python rpatool.py create new_images.rpa extracted_images/

注意事项:

  • 保持图片尺寸一致,避免UI错位

  • 透明通道(Alpha)必须保留

  • 文件名不可修改(硬编码引用)

6.2 字体替换#

汉化字体配置:

# game/tl/chinese/字体配置.rpy
init python:
# 字体替换映射
config.font_replacement_map = {
'DejaVuSans': ('NotoSansCJKsc.ttc', True, True),
'SourceHanSansCN': ('NotoSansCJKsc.ttc', True, True),
'Arial': ('SimHei.ttf', True, True),
}
# 自定义字体设置
style.default.font = "fonts/NotoSansCJKsc.ttc"

字体文件放置:

game/
└── fonts/
├── NotoSansCJKsc.ttc # 思源黑体(推荐)
├── SimHei.ttf # 黑体(备选)
└── custom_font.ttf # 自定义字体

字体选择建议:

  • 中文字体:思源黑体(开源、免费)

  • 特殊字体:用于标题、UI元素

  • 字重匹配:保持原字体的视觉风格

6.3 打包发布#

创建汉化补丁包:

#!/bin/bash
# 创建汉化补丁包脚本
PATCH_DIR="game_patch"
GAME_DIR="unpacked_game/game"
# 1. 创建补丁目录
mkdir -p "$PATCH_DIR"
# 2. 复制翻译文件
if [ -d "$GAME_DIR/tl/chinese" ]; then
cp -r "$GAME_DIR/tl/chinese" "$PATCH_DIR/"
fi
# 3. 复制字体文件
if [ -d "$GAME_DIR/fonts" ]; then
cp -r "$GAME_DIR/fonts" "$PATCH_DIR/"
fi
# 4. 创建安装说明
cat > "$PATCH_DIR/README.txt" << EOF
Ren'Py游戏汉化补丁包
安装方法:
1. 将tl/文件夹复制到游戏game/目录下
2. 将fonts/文件夹复制到游戏game/目录下(如果存在)
3. 启动游戏,在设置中切换语言为Chinese
卸载方法:
删除game/tl/chinese/文件夹即可
EOF
# 5. 压缩发布
zip -r "game_patch_$(date +%Y%m%d).zip" "$PATCH_DIR"
echo "汉化补丁包已生成:game_patch_$(date +%Y%m%d).zip"

版本控制:

  • 在补丁包中包含 version.txt 记录版本信息

  • 使用语义化版本号(如 v1.0.0)

第七章:实战案例#

案例1:英文游戏汉化#

工具选择:

  • 解包:unrpyc + Ren’Py SDK

  • 翻译:Ren’Py Translation Editor + Google Translate API

  • 打包:自定义脚本

流程演示:

步骤1:解包游戏

# 假设游戏名称为"EnglishGame"
python unrpyc.py EnglishGame/game/ -o EnglishGame/unpacked/
python rpatool.py extract EnglishGame/game/images.rpa extracted_images/

步骤2:提取文本

# 使用Ren'Py Translation Editor导入
# 导出为texts.txt

步骤3:翻译文本

# 使用Google Translate API批量翻译
python translate_tool.py --input texts.txt --output translated.txt --api-key your-key

步骤4:生成翻译文件

game/tl/chinese/script.rpy
translate chinese start:
"欢迎来到游戏世界"

步骤5:测试与发布

# 测试
cd EnglishGame
python renpy.py tl/chinese
# 打包
./create_patch.sh

常见坑点:

  1. 文本分割问题

    • 英文句子可能被分割成多个文本块

    • 解决方案:人工合并相关句子

  2. 变量替换

    • 部分文本包含游戏变量( {player_name})

    • 解决方案:保留变量占位符,仅翻译固定文本

案例2:日文游戏汉化#

编码问题:

# 自动识别并转换编码
import chardet
def convert_encoding(input_file, output_file):
with open(input_file, 'rb') as f:
raw = f.read()
encoding = chardet.detect(raw)['encoding']
# 转换为UTF-8
with open(output_file, 'w', encoding='utf-8') as f:
f.write(raw.decode(encoding))
convert_encoding('script.rpy', 'script_utf8.rpy')

文本提取:

# 处理日文特殊字符
def clean_japanese_text(text):
# 移除注音标记
import re
text = re.sub(r'《[^》]+》', '', text)
text = re.sub(r'|([^|]+)《[^》]+》', r'\1', text)
return text

字体配置:

# 日文字体集成
init python:
config.font_replacement_map = {
'Meiryo': ('NotoSansJP-Regular.otf', True, True),
'MS Gothic': ('NotoSansJP-Regular.otf', True, True),
}

第八章:常见问题排查#

8.1 解包失败#

检查Ren’Py版本:

# 查看游戏版本
cat game/tl/common.rpyc | strings | grep -E "version|renpy"
# 检查unrpyc支持的版本
python -c "import sys; print(sys.version)"

强制解密:

# 使用--no-preserve跳过验证
python unrpyc.py --no-preserve game/ -o output/
# 如果仍失败,尝试指定版本
python unrpyc.py --version 8.0 game/ -o output/

8.2 文本乱码#

识别编码:

# 自动检测文件编码
import chardet
def detect_encoding(file_path):
with open(file_path, 'rb') as f:
raw = f.read()
result = chardet.detect(raw)
return result['encoding']
encoding = detect_encoding('script.rpy')
print(f"检测到的编码:{encoding}")

指定编码重写:

# 转换为UTF-8
def convert_to_utf8(file_path, target_encoding='utf-8'):
# 读取原始编码
source_encoding = detect_encoding(file_path)
with open(file_path, 'r', encoding=source_encoding) as f:
content = f.read()
# 写入UTF-8
with open(file_path, 'w', encoding=target_encoding) as f:
f.write(content)

8.3 打包后无法运行#

检查文件结构:

# 验证tl文件目录结构
tree game/tl/
# 输出示例:
# game/tl/
# ├── chinese/
# │ ├── common.rpy
# │ └── script.rpy

验证tl文件格式:

# 检查翻译文件语法
python -m py_compile game/tl/chinese/script.rpy
# 或使用Ren'Py启动测试
cd game
python ../renpy.sh tl chinese

测试翻译完整性:

# 检查翻译覆盖率
import os
from pathlib import Path
def check_translation_coverage(game_dir):
"""检查翻译覆盖率"""
tl_dir = Path(game_dir) / "tl/chinese"
if not tl_dir.exists():
print("未找到翻译目录")
return 0
rpy_files = list(tl_dir.glob("*.rpy"))
total_lines = 0
for rpy_file in rpy_files:
with open(rpy_file, 'r', encoding='utf-8') as f:
lines = f.readlines()
total_lines += len([l for l in lines if 'translate' in l])
print(f"找到 {len(rpy_files)} 个翻译文件")
print(f"翻译条目数:{total_lines}")
return total_lines
check_translation_coverage("game/")

附录:工具下载链接#

官方工具#

工具名称下载地址说明
unrpychttps://github.com/CensoredUsername/unrpyc社区解包工具
Ren’Py SDKhttps://www.renpy.org/latest.html官方开发环境
rpatoolhttps://github.com/shizmob/rpatoolRPA打包工具

第三方工具#

工具名称下载地址说明
Ren’Py Translation Editorhttps://github.com/renpy/renpy官方翻译工具
RPG Maker Transhttps://github.com/marz-end/RPG-Maker-Trans支持多引擎翻译
TLToolshttps://github.com/RenPyTeam/TLTools批量翻译工具

学习资源#

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Ren'Py游戏解包与汉化完全手册
https://www.kshare.top/posts/renpy游戏解包与汉化完全手册/
作者
Kshare
发布于
2026-03-18
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
Kshare
Hello, I'm Kshare.
公告
欢迎来到Kshare站点!近期站点进行升级,欢迎访问和收藏站点!
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
137
分类
12
标签
59
总字数
333,011
运行时长
0
最后活动
0 天前

文章目录