查看: 255|回复: 4

[已解决] config.say_menu_text_filter传递的文本与文档描述不符的情况

[复制链接]
发表于 2026-8-5 02:49:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 SlanKi 于 2026-8-7 21:54 编辑

起因是这样的,在制作游戏本地化时发现作者写了
[RenPy] 纯文本查看 复制代码
    def alter_say_strings( str_to_test ):
        str_map = {
            ". " : ". {w=0.27}",
            ".' " : ".' {w=0.2}",
            ", " : ", {w=0.15}",
            ",' " : ",' {w=0.15}",
            "! " : "! {w=0.27}",
            "? " : "? {w=0.27}",
            "— " : "— {w=0.27}",
            ": " : ": {w=0.27}",
            "; " : "; {w=0.27}",
            " (" : "{w=0.2} (",
            ") " : "){w=0.2} ",
        }
        for key in str_map:
            str_to_test = str_to_test.replace( key, str_map[ key ] )
        return str_to_test
config.say_menu_text_filter = alter_say_strings


以这样的方式来实现句子的自动停顿,但因为config.say_menu_text_filter在官方文档中写的会传入menu,且运行在翻译层之前,string被修改跟翻译匹配不上导致选项丢翻译。
折腾了好几个小时无果后,在尝试修改时在alter_say_strings( str_to_test )函数头部加上print(str(str_to_test))发现传入的say是翻译后的文本,而menu是未翻译的文本。百思不得其解,按官方文档写的
“A list of functions that are given the text found in strings in the say and menu statements. Each is expected to return new (or the same) strings to replace them.
These run very early in the say and menu statement processing, before translation and substitutions are applied. For a filter that runs later, see config.replace_text.”
无论say还是menu应该都是传入翻译前的文本,但莫名其妙偏偏say是没绕过翻译的,menu是绕过翻译的。导致现在写了一串很抽象的代码塞在alter_say_strings( str_to_test )来解决,求大佬支招,以及这个say没绕过翻译层又是什么情况。
Ren'Py 8.3.7.25031702和Ren'Py 7.5.0.22062402都有这个问题,也试过改用config.replace_text但会直接把插入的{w=0.xx}当文字显示出来。以下是我目前在alter_say_strings( str_to_test )函数里插入的代码:
[RenPy] 纯文本查看 复制代码
 force_trans = renpy.translate_string(
str_to_test,
renpy.game.preferences.language
)
if force_trans != str_to_test:
return force_trans

发表于 2026-8-5 10:12:37 | 显示全部楼层
8.5.3 的变更日志中提到,使用新的 config.say_menu_text_filters 替换了原来的 config.say_menu_text_filter 。

可以尝试使用 8.5.3 版本,并把 config.say_menu_text_filter 改为 config.say_menu_text_filters 。
回复 支持 抱歉

使用道具 举报

 楼主| 发表于 2026-8-5 16:53:50 | 显示全部楼层
被诅咒的章鱼 发表于 2026-8-5 10:12
8.5.3 的变更日志中提到,使用新的 config.say_menu_text_filters 替换了原来的 config.say_menu_text_filt ...

游戏是基于renpy7.5的我也没法随便换新版本,会出现各种神秘问题
回复 支持 抱歉

使用道具 举报

发表于 2026-8-6 00:54:02 | 显示全部楼层
本帖最后由 Maz马 于 2026-8-6 00:58 编辑

用config.replace_text是对的,鉴于你所说的问题,我认为你应该在config.replace_text的回调里对文本进行处理?
也许过一遍renpy.translate_string()改成renpy.transform_text()可以帮到你,可能是config.replace_text的处理时点是已经格式化后的文本

renpy.transform_text(s, function)
转换字符串s,但保留s的文本标签和内插文本不变。
function
一个转换函数,将文本进行转换并返回转换后的文本。
init python:
    def upper(s):
        return s.upper()
$ upper_string = renpy.transform_text("{b}Not Upper{/b}", upper)
回复 支持 抱歉

使用道具 举报

 楼主| 发表于 2026-8-7 21:54:37 | 显示全部楼层
Maz马 发表于 2026-8-6 00:54
用config.replace_text是对的,鉴于你所说的问题,我认为你应该在config.replace_text的回调里对文本进行处 ...

哇哦,学到了,这个很有用,谢谢🌹。
回复 支持 抱歉

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

相关侵权、举报、投诉及建议等,欢迎加入QQ交流群:1028986456

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.|苏ICP备17067825号

在本版发帖返回顶部