AboutPostsGithub

Renpy生成翻译文件报错'expected '' not found.'的问题解决方案

版本:Ren'py 7.5.3 python2

问题描述

当label包含中文的时候,使用renpy生成翻译会在翻译文件生成后,编辑器会提示:

启动工程失败。在执行此命令之前,请确保您的工程可正常运行。

此时重启游戏,会报错:expected ':' not found.

解决方法

打开编辑器中/renpy/parser.py文件,修改hash方法如下:

def hash(self):
        """
        Matches the characters in an md5 hash, and then some.
        """
        # raise Exception(self.match(r'\w+[\u4e00-\u9fa5]*'))
        return self.match(r'[\w\u4e00-\u9fa5]+')

再次启动游戏,此时问题解决不再报错。

问题原因

因为Ren'py 7.5.3使用 python2 版本,原本 hash 方法的正则r'\w+'无法匹配到中文,因此报错。(此问题到python3应该就能修复,即升级Renpy8)

解决思路

当看见报错信息expected ':' not found.,明显是一个字符串的截取或是正则问题,但由于Renpy报错没有调用栈(可能是我没找到怎么看),在外层绕了半天,总算想到在代码中直接抛出错误。

先是来到/renpy/parser.pyrequire方法(这里是抛出"expected '%s' not found." % name错误的地方),直接抛出错误,如下:

if rv is None:
            raise Exception(dir(self))
            self.error("expected '%s' not found." % name)

终于得到了调用栈

Full traceback:
  File "renpy/bootstrap.py", line 331, in bootstrap
    renpy.main.main()
  File "renpy/main.py", line 492, in main
    renpy.game.script.load_script() # sets renpy.game.script.
  File "renpy/script.py", line 283, in load_script
    self.load_appropriate_file(".rpyc", ".rpy", dir, fn, initcode)
  File "renpy/script.py", line 781, in load_appropriate_file
    data, stmts = self.load_file(dir, fn + source)
  File "renpy/script.py", line 594, in load_file
    stmts = renpy.parser.parse(fullfn)
  File "renpy/parser.py", line 2962, in parse
    rv = parse_block(l)
  File "renpy/parser.py", line 2924, in parse_block
    stmt = parse_statement(l)
  File "renpy/parser.py", line 2908, in parse_statement
    return pf(l, loc)
  File "renpy/parser.py", line 2647, in translate_statement
    l.require(':')
  File "renpy/parser.py", line 1329, in require
    raise Exception(dir(self))

translate_statement方法中打印identifier,明显发现字符串只截取到了中文前面,到此处就很容易了,找到hash方法,补完其中的正则就行了。