查看: 4466|回复: 15

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

[复制链接]
梦石
0
星屑
112
在线时间
376 小时
注册时间
2015-1-26
回帖
194
发表于 2016-7-20 19:52:58 | 显示全部楼层 |阅读模式

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

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

×
插件的基本思路是用全局变量记录当前语言,用编辑器中的字符串做索引,在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]


菜单一切正常

菜单一切正常

对话无法正常显示

对话无法正常显示

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

测试用事件,字符串为“TEST”
梦石
0
星屑
22879
在线时间
8598 小时
注册时间
2011-12-31
回帖
3270
发表于 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
回复

使用道具 举报

梦石
0
星屑
1232
在线时间
1017 小时
注册时间
2011-4-30
回帖
1464
发表于 2016-7-21 01:03:12 | 显示全部楼层
本帖最后由 汪汪 于 2016-7-21 02:06 编辑

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


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


[pre lang="javascript"]
$lgs = ["c","ja","t"]
$lg = "c"
$mlg = "c"

//添加
Game_Message.prototype.add = function(text) {
        var push = true
        var i1 = text.indexOf("[l=")
        if(i1>=0){
                var text = text.slice(i1+3)
                i1 = text.indexOf("]")
                var l = text.slice(0,i1)
                text = text.slice(i1+1)
                if($lgs.indexOf(l) >= 0){
                        $lg = l
                }
                if(text === ""){
                        push = false
                }
        }
        if($mlg !== $lg ){
                push = false
        }
        //文本组 添加(文本)
        if(push){
            this._texts.push(text);
        }
};

[/pre]

BaiduShurufa_2016-7-21_2-4-2.png

点评

是的。。。万一要他人帮忙翻译。。没独立文件咋行。。总不能整个工程直接丢出去?  发表于 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
回复

使用道具 举报

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



一定程度上解决了

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

回复

使用道具 举报

梦石
0
星屑
22879
在线时间
8598 小时
注册时间
2011-12-31
回帖
3270
发表于 2016-7-21 09:44:21 | 显示全部楼层
External Text
範本
https://yunpan.cn/cBiwYhXChCyv9  访问密码 0d63

点评

谢谢!  发表于 2016-7-21 11:20
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部