我的世界地图的多语言化 关于json里的translate命令教程。那下面给大家分享的这个则是我的世界命令方块教程之一,是关于json里translate的一点乱弹的教程哦~那有感兴趣的家不妨点我进来查看该教程吧!希望对大家有所帮助。
游戏园我的世界官方群:325049520 或 256070479 欢迎各路喜爱我的世界的小伙伴们加入讨论!
玩服务器的小伙伴们可以加入:141931866 群一起联机玩游戏哦!
如果你是腐竹的话可以给我们投稿你的服务器哦~投稿地址:点我进入
如果你有心仪的作品或者心得分享的话,欢迎来游戏园投稿,大家可以点击>>>投稿<<<进行投稿哦~ 有奖品哦~
今天也是无意间又(噫为什么是又)被提到tellraw里的translate功能。
然后众所周知的,这东西用的可以说很少了,平常可能会想到用这东西来做的,也就是多语言地图里的翻译项目了——应该来说,这个功能的初衷就是能方便地图的多语言化(虽说实际实现来看到底是方便了还是麻烦还是很难说啊[笑])。
wiki里也有关于translate这个项目的描述。
translate: The translation identifier of text to be displayed using the player's selected language. This identifier is the same as the identifiers found in lang files from assets or resource packs. The translated text will only be displayed if the text string is not used.
with: A list of chat component arguments and/or string arguments to be used by translate.
The arguments are text corresponding to the arguments used by the translation string in the current language, in order (for example, the first list element corresponds to "%1$s" in a translation string).
translate:使用玩家选择的语言来显示的翻译识别器。此识别器和 assets 档案夹或资源包里的 lang files 可以找到的识别器是一样的。翻译过的文字只会在 text 字串 未 被使用时显示。
with:translate所使用的聊天组件参数列表和/或字串参数。
该参数对应于在当前的语言中翻译字符串使用的参数文本,并依序排列(例如,列表中的第一个元素将被匹配翻译字串中的"%1$s")。
欢迎中英对照食用
通过这段描述,我们可以得知translate项的结构为{"translate":""(,"with":[])}。举两个很简单的例子:当一个语言项目不需求另外的参数时,with是不需要写的,例如/tellraw @e [{"translate":"chat.link.warning"}];而需要其他的参数时,则需要补齐with项目,否则本来参数所指向的位置都会一片空白……唔,连空白都没有,例子则是/tellraw @a {"translate":"chat.type.announcement","with":["<说话的人>","<说的话>"]}。
translate的“识别器”可以在.lang即语言文件(通常在.minecraft/assets文件夹,虽然可能你需要通过版本号.json去查找对应的hash作为文件名搜索)下找到。如果你实在找不到的话,这里(链接:https://pan.baidu.com/s/1i47yKfj 密码:cyxq)也提供一份扒下来的原模原样的1.10版本中文语言文件,可以正常使用。
对,就是这玩意儿:
是不是很失望?只能用游戏中本身出现的语句,虽然拥有了随语言而改变的特性,但是看起来还是很没用对不对?
那么,玩坏lang大作战,现在开始??!
初级篇——你口说我心[原版语言文件的使用说明]
首先,我们需要知道语言文件里都有些什么东西。
如果仔细看了一遍的话……等等我相信你不会仔细看的,因为我也不会。
我之前所扒的这份中文语言文件,一共有2898行。每行有多少个字显然我是不会去数的啦,但是就凭行数来看显然认真看完需要很长一段时间……那么如何去快速的找到你所希望查找的内容呢?从语言文件的结构可以看出,每一行中,等号前面为游戏内用于识别的“识别器”,而等号后面就是相应的翻译文本。如果你知道翻译文本是什么,你可以直接在文件里查找文本;或是你能猜到大概它属于什么分类,也可以通过猜测它的识别名进行查找。
通过大致浏览分类名,你会发现它已经包含了平时我们会接触到的方方面面的文本显示内容,光凭这个文本库就可以玩些花样了,不是么?
最初的例子,是一个我相信会tellraw的人基本都玩过的小花招:
做到它很简单:
tellraw @a ["xuan_su掉出了这个世界"]
这已经足够骗过一些不仔细的人了。然而呢…………总有一部分人啊,会用和你不一样的语言在玩游戏。
这意味着什么?在一个以英文为游戏文本的人眼中,你这句tellraw可谓是漏洞百出:至少最基本的,在一片英文里出现了一串汉语,别人就可以直接黑人问号砸上来了。
显然这是整蛊别人的人(没错我说的就是你)不想看到的嘛~
这时候,通过查找,我们会找到这样一条lang……
death.attack.outOfWorld=%1$s掉出了这个世界
先来分析一下:
前半句death.attack.outOfWorld是翻译的识别语句,后面的掉出了这个世界谁都知道是什么意思对吧(笑),那么……%1$s是什么意思呢?对照我们平时的游戏体验,可以知道这个地方是玩家名的放置位置。那么,补一个玩家名的参数上去就好了(在后面我会详细介绍%1$s的含义)。
然后显然就有得玩了,嘻嘻嘻~
tellraw @a {"translate":"death.attack.outOfWorld","with":["xuan_su"]}
这时候,不管你切换为什么语言,你所看到的都将是对应语言下“xuan_su掉出了这个世界”的翻译文本。恩……一瞬间破绽少了很多对不对!
但是熟悉真正聊天框提示文本的人(或者说被tellraw玩疯掉过的人)是知道上面这个做法的另一个破绽的……将鼠标放在聊天栏中游戏提示语句涉及到玩家名的位置,你会看到显示出玩家的uuid和玩家名,而单击玩家名处,你的聊天框中会出现/smg <玩家名>的字样!
这点知道的人显然也是不少的,甚至pm还写过专门用来模仿别人说话的命令生成器hhhhhhhh
当然虽然我们有一大堆方式去查玩家的uuid,但是有的时候想整蛊个人还不至于需要uuid查询器和命令方块(加上clickEvent和hoverEvent之后显然超过了聊天框的字符上限)随身携带对不对!这很不爽!
这时候别忘了,translate的with项目接受的,可不只是单纯的文本………………
想想看正常情况下游戏在一个玩家死亡的时候做了什么?
游戏发现了这个玩家死了,于是将这个玩家的存在告诉负责输出聊天框的函数,“嘿老兄这里有一个人打出了gg你帮我显示一下咯?”于是你看到了死亡消息的文本。
这时候,我们通过with,用同为tellraw接收的文本的selector项,传一个玩家的参回去,会发生什么呢?
命令将会变成这样:
tellraw @a {"translate":"death.attack.outOfWorld","with":[{"selector":"@p"}]}
来试试看,你看到了什么?
对,这回聊天框所显示的信息,就和真的你掉出世界所显示的文本一模一样!
在这个过程中,你所做的事情,就是代替了游戏本身的判断机制,告诉输出函数该输出的是你死亡的信息。于是游戏很乖的输出了,于是结果就是正常所显示的东西咯~
哈哈哈哈哈哈哈哈我讲完这个东西会不会有人想打死我(跑
实际上,with所接受的内容,是全部tellraw允许输入的内容……意味着你可以一个translate套另一个translate,比如想显示个物品名啥的(笑),不过一般不会有这样的需求就是了。最常用的,大概就是selector吧。这时候不要忘记了,selector毕竟接受的是实体选择器,如果你要用这个方法做一个玩家上线的效果,显然就会失败恩。
这时候会玩的人已经搞出了一大堆千奇百怪的整蛊方式,比如想想看最开始提到的chat.类项目……
(抬头看到) 我懒癌好了我要填坑
(转身夹人)嘿你等着,我才没说过这话!
强行点题完毕
translate可以做到的功能其实很强大,可是务必慎用哦……否则我们都知道,友谊的小船,可是会说翻就翻的……
高级篇——你见均我愿[关于自定义lang文件以及一些特殊的用法]
上面的做法都是可以在纯粹的原版环境下使用的一些小贴士,而下面的内容,就需要涉及到对lang文件进行编辑修改了。
mojang显然是不希望assets里的文件被我们乱动的,但是我们依旧有一个非常强大的工具在手:资源包。通过资源包,我们依旧可以进行对lang文件的修改,并且让游戏很淡定的接受被你乱涂乱写了一大堆东西的新的lang文件
如果你不会制作一个资源包的话……
你可以去游戏里扒下来一个:用解压的姿势打开任何一个版本的版本jar文件,assets文件夹里的东西就是你所需求。当然依旧要对它进行必要的加层皮的工作,以让游戏认为它是个资源包——如果不愿意去wiki找相应资料自己写资源包描述文件的话,你也可以用任何一个现成的资源包的格式照着抄。
然后没有别的需求的话,你可以删掉里面几乎所有的东西,只留下路径/assets/minecraft/lang这条目录。你所编辑的lang文件,对应名字放置进其中即可生效。当然资源包也可以建立新语言,也就是不依附于原本的中英文语言文件,不过相对来说就属于进阶内容啦,这里也一般不会用到,故略过不表。
接下来就是正题:如何通过修改lang来对游戏世界进行进一步的膜改。
有的时候我们可能会见到这样的地图:它允许你用多种语言进行游戏,而且游戏里的提示语句所显示的都会是相应的语言。初见可能会觉得很神奇,但这才是translate这个项最初的用法——用来进行地图的多语言适配。
首先,回想一下涉及json的命令相关内容有哪些?
title,tellraw,书本json,牌子json。
这些东西基本就已经构成了一个地图的大部分文本内容。对它们加以translate,自然就可以做到多语言适配。
这里就有一个问题:游戏本身提供的语句,对于日常活动可能还够,但对于相对于一张地图所需要的剧情和提示来说,又显得有些少了,对吧……
这时候,我们可以自己改写lang文件,来让游戏显示我们需要显示的东西。
translate在收到了一个识别器参数的时候,会去当前使用语言的lang中查找相应的代换式。这意味着,如果你在lang中提前自定义了类似“customlang.talk.1=%s,我是你的破壁人”之类的语句时,游戏依旧能找到相应的代换内容,并将之显示出来。而当游戏在当前语言文件下找不到这个代换的时候,会尝试去en_US.lang里查找;如果还找不到,会直接显示你写在"translate":""里的字符。
如果你在多种语言里同时设置了相应的代换式,并将游戏中的文本全部都用translate的方式表现,你的地图自然就多语言适配了。唯一的缺憾就是当玩家使用一个你没写lang的语言打开地图时,看到的将会是一片很诡异的东西…………
你之所见,我之所愿。我所没写,你看不见哈哈哈哈哈哈哈哈哈哈哈哈(傲娇脸)
那么,如何正确的写一条文本代换式呢?
其实和本身提供给你的内容相差不大,细心观察的话很容易就能搞清楚写法。当然,有编程基础的话显然会更快,因为对其实就是正常的文本输出样式……
首先,你需要给你这条文本内容起一个让mc认识的名字。原则上起成什么都无所谓,但不要和原本的语言条目重复,也不要故意去用一些乱七八糟的自己都认不出来的自带混淆的文本……如果你不听劝告不嫌头疼也不怕出问题的话,就去用吧(扶额)。
而后你需要给它一个代换内容,也就是等号后面的文字。那将是最后会显示给玩家看的翻译文本。§是被允许的,所以你也可以直接给你需要用到的文字上色。请务必记得用完了§之后§r一下是个好习惯。
这里就用一条我以前写的测试用lang做例子:
customlang.player.move
这就是它的识别符了。通过这条识别符,可以猜出来内容是和玩家移动有关的对不对(笑)
而它的代换内容,则是“%s 跑得太快以至于撞倒了 %s”。%s是提醒mc,这里的%s要被替换为一个字符串(string),至于换成什么……你给什么,mc就换成什么,特别听话233!
之前你所见到的%1$s之类的写法又是什么意思呢?其实它同样是提醒游戏进行代换的占位符,但是和之前的%s不同之处在于,多出来的"1$"代表的是所占的位将被替换为with串中的第一个参数,同理%n$s(n为正整数)亦然。不过一般来说,由于自定义lang是由我们自己传参数,我们可以不需要特意将参数修改位置;而游戏本身的lang里面,有些返回的参数和语序就是颠倒着的……那就只好用这种方式给它强行换个位置咯?
最后写出来的就是这么一条东西:
customlang.player.move=%s 跑的太快以至于撞倒了 %s
是的,这就是一条可以用的自定义语言代换式了。
小彩蛋——语言即钥匙[通过自定义语言文件来强制资源包]
除此之外,通过对自定义lang的使用,你可以强制一个玩家必须使用你的资源包(其实是必须使用你的lang文件)进行游戏。之前chyx提出过一个修改实体名称然后检测实体的思路,而这里我讲一个基于translate的思路好了。
please.use.right.language=%s
/tellraw @a {"translate":"please.use.right.language","with":[{"text":"点此开始游戏","clickEvent":{"action":"run_command","value":"/say 1"}}]}
相信大家已经看懂了。通过一条全空的lang自行填入内容进行clickEvent,用了正确语言的玩家可以正常的点击显示出来的“点此开始游戏”来进行之后的操作,而语言错误的玩家则只能看着一句please.use.right.language干瞪眼23333!
好了,讲到这里,希望大家能够对translate的了解更深一层。
PS:在此非常感谢我的世界MCBBS玩家玄素的分享。
以上就是我的世界地图的多语言化 关于json里的translate命令教程。更多精彩尽在游戏园我的世界专区。
相关攻略推荐:
我的世界关于新版json的使用方法 冒险地图制作者必看攻略
我的世界Json指令详解 怎么使用Json指令制作悬浮彩字
我的世界1.9不使用json的悬浮彩字指令教程
15w43a新增Json解析 有关自定义实体掉落Json的研究
19游戏网整理报道