请选择 进入手机版 | 继续访问电脑版

星界边境中文论坛-StarboundForum

查看: 333|回复: 0

A Review of the Solution of Tricky Localization Problem in Starbound

[复制链接]
  • TA的每日心情
    难过
    前天 09:00
  • 签到天数: 999 天

    连续签到: 3 天

    [LV.10]物质枪

    227

    主题

    1512

    帖子

    6989

    积分

    封测会员

    【数据删除】

    Rank: 12Rank: 12Rank: 12

    积分
    6989

    突出贡献

    发表于 2017-8-25 14:51:30 | 显示全部楼层 |阅读模式
    本帖最后由 印斯茅斯:温馨 于 2017-10-18 15:11 编辑

    本文罗列的是一般汉化无法解决的技术问题解决方案,并不是一般的汉化方法。
    虽然有的问题解决方案不只一种,有的未解决问题存在解决方案,但是为了降低使用/未使用汉化状态间切换/联机的安全性,有的方式是无法接受的。这个问题需要在解决过程中考虑到。

    1.隐藏在程序之中的文本
    总的来说,SB的文本大都很正常地存在于各个json文件中,可以很轻易地通过patch方式解决,这些文本的翻译不存在多大技术难度。
    但是,总有些文本会在程序部分中,也许是lua脚本,也许是exe引擎之中。这些文本的本地化,不管是诊断还是解决,基本上都需要从lua入手,因此团队中能读代码的技术人员是不可或缺的(其实无论什么时候“高级技术人员”都必不可少),了解lua与SB的一些基础mod知识,才能更好地理解下面的解决方案。
    不过,修改lua需要注意的问题有二:①lua文件显然不支持patch,只能够替换文件。这就给跨版本更新留下了隐患,在版本更替时需要详加检查;②与json一样,lua文件需要把编码改为UTF-8。一般而言,这两个问题还是可以接受的。

    程序中的文本有下面几类:

    首先,有一部分文本是简单粗暴地在lua文件中存在的。这类文本可以直接修改lua即可。
    这一类的文本如下:
    interface\scripted\collections\collectionsgui.lua   widget.setText("selectLabel", "收藏")
    items\buildscripts 中的各个buldXXX.lua,有
        config.tooltipFields.primaryAbilityTitleLabel = "主要:"
        config.tooltipFields.altAbilityTitleLabel = "特殊:"
        config.tooltipFields.comboFinisherTitleLabel = "终结技:"
        等类型。虽然法杖元素相关技能也在这,但留在后面一点讲
    objects\ancient\challengedoor         
        destinations = { {
              name = "出口传送门",
              planetName = "回到原来的世界…但愿如此!",
        等。
    quests\scripts\generated\capture_pet.lua  description = textGenerator:substituteTags("这是一份礼物,来自<questGiver>。")
    scripts\companions\capturable.lua    monster.setName("宠物")
    scripts\companions\util.lua  
        tooltipFields = {
                  subtitle = pet.name or "不明生物",


    接下来提出的是迄今为止唯一一个可以通过json汉化的exe中的文本。环境保护背包的插件栏,在未安装插件的时候会显示未安装插件的提示,但这部分文本存在于exe之中,并且在lua中也找不到组建代码,无法在脚本层拦截。
    而解决方案很简单:在背包的json文件中加入 "currentAugment" :   { "displayName" : "^gray;未安装插件^reset;"} 即可(注意json格式问题)
    (思路提供:我在看完json后,发现背包不调用lua,故无法从lua下手,人工调用lua确实可行,但是容易导致不兼容。但是我们却可以通过调用lua来获得item的json信息,利用buildscript的 function build(directory, config, parameters, level, seed),可以发现未安装插件的背包其parameters是空的{},安装之后插件的信息会填入parameters。虽然我们无法直接修改parameters,但是可以考虑直接把信息填入config,也就是直接从json读取来的信息里。因此按照对应的格式加入json文件中,即可成功汉化。加入的buildscript仅仅用于调试,找到格式之后就可以删掉了。当然也许把存档文件转成json也可以看到,未测试。)

    然后特别提及前面提到的法杖元素相关技能。这里呵呵鱼用了一个取巧的方法,将元素名和技能字符串拼接,因此是找不到完整的字符串的。自己重写下,判断元素类型就好。原始语句是replacePatternInData(config, nil, "<elementalName>", elementalType:gsub("^%l", string.upper)),位置在items\buildscripts\buildweapon.lua,怎么改自己想吧


    最后是exe中的文本。这些文本隐藏在exe中,要修改exe将会使汉化易用性与跨版本稳定性打折扣。尽管我们还不能完全解决所有exe中的文本,但终究还是通过在lua中覆盖,解决了几个。(参见http://starboundcn.com/forum.php?mod=viewthread&tid=1028&fromuid=11
    如下:
    随机怪的描述Some Indescribable Horror->scripts\companions\util.lua,位于function modifySomeTags(inputDescription),判断inputDescription是否是Some Indescribable Horror,是则替换即可。(若不是,载入的是monster的描述,那个在json里就有,因此此处不必处理了)

    武器的1-Handed和2-Handed->items\buildscripts中的buildweapon.lua与buildunrandweapon.lua。这个东西呵呵鱼没写在lua里,但其实可以算作忘记了……在有大段config.tooltipFields.的地方,通过判断config.twoHanded,是则是双手,设config.tooltipFields.handednessLabel = "双手",否则写单手即可。这个是通过研究武器的interface\itemdescriptions\sword.itemdescription获得的变量名,但是你可能还是需要到那文件里去调整这个label的位置以居中。


    2.奇葩bug
    尽管呵呵鱼尽力支持了UTF-8,但显然没有对游戏所有功能进行严格测试,留下了bug——其实有的从lua上一看就不是按照UTF-8支持的思维写的。当然了lua原生并不支持UTF-8,但呵呵鱼你这么写显然就是没有想过本地化了……啊吐槽吐早了。总之这些坑一度给我们带来了巨大的苦难……

    首当其冲的就是截断bug。
    在翻译过程中,我们会看到一些带有<XXX>的文本,这些<XXX>的部分在后面会被替换为其它文本,称之为tags。然而在测试翻译过程中却经常发现,一个拥有多个tags的文本,在某个tag之后所有文本都消失了。在尝试过各种方法都不能解决后,我们只能认为呵呵鱼实现的tags替换有bug。(我向呵呵鱼报过,然而并没有回应)。不幸的是,这个替换是在引擎层执行的,怎么动手?在得到了贴吧的 双黄连_副本 的帮助下,我们在lua脚本中重实现了一个tags替换功能,在所有调用到tags替换的函数前,首先用我们的函数进行替换,然后再塞给呵呵鱼自己的函数去继续其它处理。也正因如此,此处牵涉比较广。涉及到的函数有
    #### `bool` monster.say(`String` line, [`Map<String, String>` tags])
    #### `bool` monster.sayPortrait(`String` line, `String` portrait, [`Map<String, String>` tags])
    #### `bool` npc.say(`String` line, [`Map<String,String>` tags], [`Json` config])
    #### `bool` npc.sayPortrait(`String` line, `String` portrait, [`Map<String, String>` tags], [`Json` config])
    #### `bool` object.say(`String` line, [`Map<String, String>` tags], [`Json` config])
    #### `bool` object.sayPortrait(`String` line, `String` portrait, [`Map<String, String>` tags], [`Json` config])
    #### `String` sb.replaceTags(`String` string, `Map<String, String>` tags)

    其中除了最后一个是单纯的替换tags外其他的还兼有说话功能,所以处理完了的文本还得塞回给呵呵鱼。因此所有涉及到这几个函数的地方都要改,我这里就不一一列举了。(当然tags给的nil的自然无所谓)我们实现的tags替换函数位于scripts\replaceTags.lua,供参考。


    第二个大坑是内置gal引擎,也就是sbvn。
    内置gal使用了一个极其奇葩的方式来实现文字渐入,不知道为何不用其他地方用的。怎么实现的?每秒重新刷新显示的字,这秒该显示多少字就在原字符串截多少……由于是在lua里实现的,这个奇葩的方式完全不支持utf-8。因此当你汉化完gal文本,一载入就会直接跳出。
    既然说是不支持utf-8有问题,那么、引入一个utf-8库解决就是。我们引入了https://github.com/pangliang/pangliang.github.com/blob/master/_posts/2014-08-23-UTF8%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%9C%A8lua%E7%9A%84%E6%88%AA%E5%8F%96%E5%92%8C%E5%AD%97%E6%95%B0%E7%BB%9F%E8%AE%A1.md
    这里的一个utf-8库,把原始的interface\scripted\sbvn\sbvngui.lua里字符串处理函数换成这个库里的即可。我也不知道这样有没有版权问题,有需要的话找人用净室法另写一个233

    3.图片转文本问题
    有的图片太小,字很难改上去,这时候图片字转文本就很有必要。
    我依稀记得之前受其他人指导把宠物信息那的图片改成了文本,肯定是改的interface啦。但是我手头已经没有汉化文件了,懒得找2333

    4.其它非文本类问题
    中文标点在SB里显示总是怪怪的,需要调整位置。方案参见http://starboundcn.com/forum.php?mod=viewthread&tid=1043&fromuid=11
    当然图片汉化你们也要记得统一字体233


    单纯汉化上的技术坑大概就这些吧,剩下的都不算技术坑吧。至于管理啊美工啊工具等等问题就是汉化组共享的了,这里就懒得提了




    We Secure. We Contain. We Protect. And We Never Forget.
    我的心属于你,可你什么时候才能空出属于我的位置……能早一点么……
    也许,那时侯我就已经失去了最后的机会了吧
    0 0.5 0.7 i 2i -10 0.6 0.8 0.9 10i -10 -100/1 我的你,你的我
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|星界边境中文论坛-StarboundForum  

    GMT+8, 2017-12-15 04:56 , Processed in 0.095082 second(s), 27 queries .

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表