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

Project1

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

[交流讨论] 制作多语言支持插件时遇到一些技术问题

[复制链接]

Lv1.梦旅人

梦石
0
星屑
112
在线时间
376 小时
注册时间
2015-1-26
帖子
203
跳转到指定楼层
1
发表于 2016-7-20 19:52:58 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
插件的基本思路是用全局变量记录当前语言,用编辑器中的字符串做索引,在DrawText函数里根据当前语言从json里调用对应的显示用字符串。

菜单显示一切正常,但剧情对话完全不能正常显示。
排查之后发现:剧情对话里每一个字符被单独视为一个字符串,例如“TEST”不会被视为一条索引,而是被分别视为“T” “E” “S” “T”4段索引。

本人JS水平属于说二把刀都抬举的那种,请问有什么方法可以让对话里的全部内容被视为一个完整的字符串?


脚本(因为怕冲突,目前是直接在YEP Core Engine上改的。等功能完善了再提取出来做独立插件)
[pre lang="javascript"  file="字符串范例"]
Yanfly.Core.Bitmap_drawText = Bitmap.prototype.drawText;
Bitmap.prototype.drawText = function(text, x, y, mW, l, align) {
    x = Math.floor(x);
    y = Math.floor(y);
    mW = Math.floor(mW);
    l = Math.floor(l);

    string = text;
    language = $gameVariables.value(1);
                if ( language == 1){
                        Table = StringTable_CNS;
                }
                else if        (language == 2){
                        Table = StringTable_CNT;
                }
                else if        (language == 3){
                        Table = StringTable_JP;
                }
                else if        (language == 4){
                        Table = StringTable_FR;
                }
                else {
                        Table = StringTable_EN;
                }

                if (Table[string] != null){
                        text = Table[string];
                }

    Yanfly.Core.Bitmap_drawText.call(this, text, x, y, mW, l, align);
};[/pre]

[pre lang="javascript" file="字符串脚本"]
StringTable_EN = {
"New Game" :  "New Game",
"Continue"  :  "Continue",
"Options"  :  "Options",
"Status" : "Status",
"Item" : "Item",
"Skill" : "Skill",
"Equip" : "Equip",
"Save" : "Save",
"Formation" : "Formation",
"Game End" : "Game End",
"TEST" : "English",
"T" : "Error",
};

StringTable_CNS = {
"New Game" :  "新游戏",
"Continue"  :  "继续游戏",
"Options"  :  "系统",
"Status" : "状态",
"Item" : "道具",
"Skill" : "技能",
"Equip" : "装备",
"Save" : "存档",
"Formation" : "队形",
"Game End" : "结束",
"TEST" : "简体中文",
"T" : "错误",
};

StringTable_JP = {
"New Game" :  "はじめから",
"Continue"  :  "つづきから",
"Options"  :  "オプション",
"Status" : "ステータス",
"Item" : "アイテム",
"Skill" : "スキル",
"Equip" : "装備",
"Save" : "セーフ",
"Formation" : "編成",
"Game End" : "終了",
"TEST" : "日本語",
"T" : "エラー",
};
[/pre]


1.png (99.22 KB, 下载次数: 24)

菜单一切正常

菜单一切正常

2.png (61.87 KB, 下载次数: 19)

对话无法正常显示

对话无法正常显示

3.png (20.1 KB, 下载次数: 15)

测试用事件,字符串为“TEST”

测试用事件,字符串为“TEST”

Lv5.捕梦者

梦石
0
星屑
22953
在线时间
8638 小时
注册时间
2011-12-31
帖子
3367
2
发表于 2016-7-20 21:03:49 | 只看该作者
本帖最后由 tseyik 于 2016-7-20 21:08 编辑

這個有数個做了
你可參考一下

https://github.com/yamachan/jgss ... 1_Option_EnJa.ja.md

点评

https://en.wikipedia.org/wiki/JSON#Samples  发表于 2016-7-21 09:33
External Text  发表于 2016-7-21 09:31
有没有啥关键字,我去查查  发表于 2016-7-21 00:04
对话有個外語插件,是個英文插件,要找一找  发表于 2016-7-20 22:18
这个我看了,他解决对话问题的方法是用事件……  发表于 2016-7-20 21:20
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1232
在线时间
1017 小时
注册时间
2011-4-30
帖子
1516
3
发表于 2016-7-21 01:03:12 | 只看该作者
本帖最后由 汪汪 于 2016-7-21 02:06 编辑

请问有什么方法可以让对话里的全部内容被视为一个完整的字符串
对话的全部内容确实是字符串,但这个字符串在被绘制时使用的
是 drawTextEx ,通过这个方法处理后,对每一个字符使用 drawText 方法,所以导致了上面的问题.
或许你可以在这里改
//添加
Game_Message.prototype.add = function(text) {
    this._texts.push(text);
};


对于显示文本,感觉还是用事件分歧比较好,当然你也可以用脚本来代替条件分歧,


JAVASCRIPT 代码复制
  1. $lgs = ["c","ja","t"]
  2. $lg = "c"
  3. $mlg = "c"
  4.  
  5. //添加
  6. Game_Message.prototype.add = function(text) {
  7.         var push = true
  8.         var i1 = text.indexOf("[l=")
  9.         if(i1>=0){
  10.                 var text = text.slice(i1+3)
  11.                 i1 = text.indexOf("]")
  12.                 var l = text.slice(0,i1)
  13.                 text = text.slice(i1+1)
  14.                 if($lgs.indexOf(l) >= 0){
  15.                         $lg = l
  16.                 }
  17.                 if(text === ""){
  18.                         push = false
  19.                 }
  20.         }
  21.         if($mlg !== $lg ){
  22.                 push = false
  23.         }
  24.         //文本组 添加(文本)
  25.         if(push){
  26.             this._texts.push(text);
  27.         }
  28. };


点评

是的。。。万一要他人帮忙翻译。。没独立文件咋行。。总不能整个工程直接丢出去?  发表于 2020-8-21 00:45
不不不,把所有文本在excel里罗列好,翻译完直接导出成json就行了。我之前做商业项目都是这个方法  发表于 2016-7-21 11:20
把文本集中在一个json里不方便制作吧, 而且翻译的话,因为句子长度不一样,也是很困扰的吧。  发表于 2016-7-21 07:08
根本目的还是要把所有文本内容集中在一个json里以便管理  发表于 2016-7-21 02:30
用事件没法批量翻译,更新的时候也非常容易遗漏。无论增加语种还是更新内容都太浪费工作量了。  发表于 2016-7-21 02:29
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
112
在线时间
376 小时
注册时间
2015-1-26
帖子
203
4
 楼主| 发表于 2016-7-21 02:12:45 | 只看该作者
本帖最后由 raketenfaust02 于 2016-7-21 03:02 编辑
汪汪 发表于 2016-7-21 01:03
请问有什么方法可以让对话里的全部内容被视为一个完整的字符串
对话的全部内容确实是字符串,但这个字符串 ...



一定程度上解决了

我在Game_Message.prototype.add里也调用了一遍判断语言的函数,现在对话可以正常转换了
不过还有其他很多地方得一个一个手动添加,比如选项,看来只能一个一个穷举了。

回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
22953
在线时间
8638 小时
注册时间
2011-12-31
帖子
3367
5
发表于 2016-7-21 09:44:21 | 只看该作者
External Text
範本
https://yunpan.cn/cBiwYhXChCyv9  访问密码 0d63

点评

谢谢!  发表于 2016-7-21 11:20
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-16 11:57

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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