设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 6936|回复: 20
打印 上一主题 下一主题

[已经解决] [求脚本] 针对英文的一次性自动换行脚本

[复制链接]

Lv4.逐梦者

梦石
7
星屑
650
在线时间
130 小时
注册时间
2011-5-12
帖子
135
跳转到指定楼层
1
发表于 2019-3-20 12:06:21 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
86星屑
近期游戏准备上架在制作英文版本. 采用了用RPGMAKER Trans工具进行"文本导出→翻译→再导入"的方式翻译, 但发现了一个问题,

英文文本翻译出来后, 译文的每一行总是比原文要长的. 这就导致了翻译后的版本总会有一些太长的句子显示不全(如图)





  虽然站里有很多自动换行的脚本插件, 但是要么是RMXP里无法使用的, 要么是仅对中文有效的. (英文必须是一整个单词连在一起的, 用中文版的自动换行的话, 很多时候最后一个单词会被切成两半分到下一行显示...)

"使用带自动换行功能的对话框插件"这个方案也得排除......因为我现在已经在用着RB重制的那个"对话增强"脚本了, 游戏开发到了中期也不方便换...  



综上所述: 目前求一个一次性的自动换行脚本, 插入运行一次后会自动把所有[显示文章] [选项]里的文本进行自动换行!
(目前我自己想过写个从rxdata里读出文本→自动换行→覆盖回rxdata里 的脚本但技术力太低写不出来.....)


最佳答案

查看完整内容

刚刚那个只是对"末尾单词会隔开"问题进行修复。。 太长换行执行下面这个试试。

Lv4.逐梦者

梦石
0
星屑
19488
在线时间
3111 小时
注册时间
2013-1-11
帖子
1292
2
发表于 2019-3-20 12:06:22 | 只看该作者
龙夫三拳tan 发表于 2019-3-20 21:29
似乎不行...成功插入运行了, "修改完毕"的提示也出来了, 然后关掉工程再进去点开事件看发现
依 ...


刚刚那个只是对"末尾单词会隔开"问题进行修复。。
太长换行执行下面这个试试。


  1. $data_mapinfos = load_data("Data/MapInfos.rxdata")

  2. num = 0

  3. for id in $data_mapinfos.keys
  4.   map = load_data(sprintf("Data/Map%03d.rxdata", id))
  5.   for e in map.events.values # 遍历事件
  6.     next if e.nil?
  7.    
  8.     for p in e.pages # 遍历事件页
  9.       next if p.nil?
  10.       
  11.       p.list.each_with_index do |list, index| # 遍历事件内容
  12.         next if list.nil? or (list.code != 101 and list.code != 401)
  13.         
  14.         str = list.parameters[0]
  15.         next if str.length <= 30 # 小于30的不进行换行
  16.         
  17.         str =~ /(.{0,30}) (.*)/
  18.         next unless ($1 and $2)
  19.         
  20.         list.parameters[0] = $1
  21.         newEV = proc{|code, indent, msg|
  22.           ev = RPG::EventCommand.new
  23.           ev.code = code
  24.           ev.indent = indent
  25.           ev.parameters = [msg]
  26.           return ev
  27.         }
  28.         
  29.         # 101和401很头疼,不想每个换行都用单独的行,算是解决了。。
  30.         if list.code == 101 # 101首行
  31.           r = 3
  32.           3.times{|i| p.list[index+i+1].code == 401 ? r -= 1 : break }
  33.           p.list.insert index+1,newEV.call(401, list.indent, $2)
  34.           if r <= 0 # 换行为101
  35.             p.list[index+4].code = 101 if p.list[index+4].code == 401
  36.           end
  37.         else # 401续行
  38.           r = 3
  39.           3.times{|i| (index-i >= 0 and p.list[index-i].code == 401) ? r -= 1 : break }
  40.           2.times{|i| p.list[index+i+1].code == 401 ? r -= 1 : break }
  41.           if r <= 0 # 新行
  42.             if p.list[index+1].code == 101
  43.               p.list.insert index+1,newEV.call(101, list.indent, $2)
  44.               3.times{|i| (p.list[index+2+i].code = 401;break) if p.list[index+2+i].code == 101 }
  45.             else
  46.               p.list.insert index+1,newEV.call(401, list.indent, $2)
  47.               p.list[index+2].code = 101
  48.               3.times{|i| (p.list[index+3+i].code = 401;break) if p.list[index+3+i].code == 101 }
  49.             end
  50.           else
  51.             p.list.insert index+1,newEV.call(401, list.indent, $2)
  52.           end
  53.         end
  54.         
  55.         num += 1
  56.       end
  57.       
  58.     end
  59.   end
  60.   save_data(map, sprintf("Data/Map%03d.rxdata", id))
  61. end

  62. print "换行#{num}次, 重启工程查看"
  63. exit
复制代码

评分

参与人数 1星屑 +100 +1 收起 理由
guoxiaomi + 100 + 1 认可答案

查看全部评分

回复

使用道具 举报

Lv5.捕梦者 (版主)

梦石
1
星屑
23999
在线时间
3339 小时
注册时间
2011-7-8
帖子
3926

开拓者

3
发表于 2019-3-20 12:31:58 | 只看该作者
第一次听说RPGMAKER Trans工具,看介绍好像异常的好用呢……
似乎只要把 patch 里的 txt 文件中的输入的英文翻译进行换行就好了?

点评

郭兄大人无敌!!!  发表于 2019-3-21 07:56
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
19488
在线时间
3111 小时
注册时间
2013-1-11
帖子
1292
4
发表于 2019-3-20 18:56:04 | 只看该作者
备份工程后试一下

  1. $data_mapinfos = load_data("Data/MapInfos.rxdata")

  2. for id in $data_mapinfos.keys
  3.   map = load_data(sprintf("Data/Map%03d.rxdata", id))
  4.   for e in map.events.values # 遍历事件
  5.     next if e.nil?
  6.    
  7.     for p in e.pages # 遍历事件页
  8.       next if p.nil?
  9.       
  10.       p.list.each_with_index do |list, index| # 遍历事件内容
  11.         next if list.nil? or (list.code != 101 and list.code != 401)
  12.         
  13.         $arr = [] if list.code == 101
  14.         
  15.         $arr += list.parameters
  16.         
  17.         if list.code == 401 and p.list[index+1].nil? or p.list[index+1].code != 401
  18.           f = "\r\n"
  19.           arr = $arr.join(f).gsub(/ ([A-Za-z]+)#{f}([A-Za-z])/){|s| "#{f}#{$1}#{$2}" }.split(f)
  20.           arr.reverse.each_with_index{|s, i| p.list[index-i].parameters = [s] }
  21.           # p arr
  22.         end
  23.         
  24.       end
  25.     end
  26.   end
  27.   save_data(map, sprintf("Data/Map%03d.rxdata", id))
  28. end

  29. print "修改完毕, 重启工程查看"
  30. exit
复制代码
回复

使用道具 举报

Lv4.逐梦者

梦石
7
星屑
650
在线时间
130 小时
注册时间
2011-5-12
帖子
135
5
 楼主| 发表于 2019-3-20 21:14:55 | 只看该作者
guoxiaomi 发表于 2019-3-20 12:31
第一次听说RPGMAKER Trans工具,看介绍好像异常的好用呢……
似乎只要把 patch 里的 txt 文件中的输入的英 ...

是的, 很好用, 可是现在问题就是在翻译后的换行, 默认的话需要人为检查长度是否超过然后手动回车换行, 但文本量大了后就会有点麻烦了.
回复

使用道具 举报

Lv4.逐梦者

梦石
7
星屑
650
在线时间
130 小时
注册时间
2011-5-12
帖子
135
6
 楼主| 发表于 2019-3-20 21:15:37 | 只看该作者
张咚咚 发表于 2019-3-20 18:56
备份工程后试一下

感谢!我先去测试一下!
回复

使用道具 举报

Lv4.逐梦者

梦石
7
星屑
650
在线时间
130 小时
注册时间
2011-5-12
帖子
135
7
 楼主| 发表于 2019-3-20 21:29:18 | 只看该作者
张咚咚 发表于 2019-3-20 18:56
备份工程后试一下


似乎不行...成功插入运行了, "修改完毕"的提示也出来了, 然后关掉工程再进去点开事件看发现
依旧还是超过了长度限制.

点评

好像是的...还有个难点是得判断下一个单词是否还塞的进本行,塞不下的话就把整个单词换到下一行去. 估计得检测空格来实现.  发表于 2019-3-20 22:07
我觉得他好像忘了加上每行限制多少个字符。。。  发表于 2019-3-20 21:37
回复

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
14629
在线时间
2152 小时
注册时间
2016-9-20
帖子
861
8
发表于 2019-3-20 22:05:00 | 只看该作者
我覺得中文字好像占用3個字节,那样要把文字化為字节集,計算字节數量 (別打我,是错的)
我发的贴子大多未经整理是草稿抱歉
回复

使用道具 举报

Lv4.逐梦者

梦石
7
星屑
650
在线时间
130 小时
注册时间
2011-5-12
帖子
135
9
 楼主| 发表于 2019-3-21 07:39:36 | 只看该作者
张咚咚 发表于 2019-3-20 22:26
刚刚那个只是对"末尾单词会隔开"问题进行修复。。
太长换行执行下面这个试试。

感谢!!顺利运作了!
回复

使用道具 举报

Lv4.逐梦者

梦石
7
星屑
650
在线时间
130 小时
注册时间
2011-5-12
帖子
135
10
 楼主| 发表于 2019-5-9 06:49:19 | 只看该作者
张咚咚 发表于 2019-3-20 12:06
刚刚那个只是对"末尾单词会隔开"问题进行修复。。
太长换行执行下面这个试试。

抱歉隔这么久后回来挖坟, 最近翻译文本才完成了, 不过导入文本后再执行该脚本发现会报错:
17行发生了NoMethod Error, undefined method 'length' for 1:Fixnum

似乎在某种情况下,list.parameters[0]的值会变成1. 但暂时不知道该如何排除该问题, 请问大佬有什么头绪么
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-27 08:38

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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