Hydralisk 发表于 2005-6-24 09:25:50

AMX中翻译器(translator)的使用

AMX的Translator是为了插件在AMX中更好的支持多语言而在0.9.9版本中新添入的功能。引入Translator大大的方便了使用者将插件中的文字翻译成自己国家的语言。下面我来教大家如何使用Translator。

1、编程中的使用:
如果一个插件能够用translator翻译,这个插件必须对translator支持。想使用它,必须在代码的#include 队列中加入 #include <translator>。一点需要注意,#include <translator>必须加在#include 队列的最上方,例如:
正确的例子:

#include <translator>
#include <amxmod>
#include <vexd_utilities>

错误的例子:
#include <amxmod>
#include <translator>    //这个放在了队列的第2行,不是最上方,会引起编译错误。
#include <vexd_utilities>


这样,Translator就被引入了。当然,这仅仅是被引入,您还需要作更具体的工作。
下面,我们来拿一个简单的程序Hello World做一个范例
首先,在plugin_init()过程中加入这样一行
load_translations("hello_world")
load_translations的作用是装载翻译文件,例如上述例子就是载入amx\lang\hello_world.txt翻译文件,于是本插件的翻译都需要调用hello_world.txt中的内容。

目前的源代码为:
#include <translator>
#include <amxmod>
#include <amxmisc>

plugin_init(){
load_translations("hello_world")
}

这样,翻译的准备工作就做完了。细节工作开始。
翻译器的命令为
_T("翻译内容","玩家Index")
这里尤其需要注意的是玩家Index,这是个可选参数,但是很多人容易在这里犯错误。
如果在下列过程中使用_T进行翻译,玩家Index必须忽略,也就只写成_T("翻译内容"):
register_plugin
register_srvcmd
register_clcmd
register_concmd
例如
register_plugin(_T("Hello World"),"0.1","Example")
register_concmd("hello","hello",ADMIN_CFG,_T("Say Hello world"))
而且,_T不能用在register_concmd, register_clcmd, register_srvcmd的第一或第二个参数上,例如如下是错误的:
register_concmd(_T("hello"),"hello")
register_clcmd("hello",_T("hello"))
如果在下列过程中使用_T,玩家Index可以忽略,也可以不忽略,不过建议忽略。
client_print
engclient_print
console_print
server_print
show_hudmessage
client_cmd
例如:
client_print(id,print_center,_T("Hello world"))
client_print(id,print_chat,_T("Hello world",id)
// Both OK
如果在下列过程中使用_T,玩家Index一定不能忽略
format
copy
add
equal
equali
例如:

new trs
format(trs,32,_T("Hello World",id))
错误的例子:
new trs
format(trs,32,_T("Hello World"))    //忘记了输入玩家Index
而且,在format, copy, add这三个函数中,_T不能用在“目的地参数上”,例如format的第一个参数叫做目的地参数,因为format是将处理好的字符串放置在format的第一个参数上,故称之为“目的地参数”。例如,如下是错误的:
new trs
format(_T(trs,id),32,"Hello World")

需要注意的主要是这么些,下面我们开始着手编写Hello World. Hello World的功能是将翻译好的Hello World显示到所有玩家的屏幕中央。为了能够显示Hello World,我们需要注册(创建)一个控制台命令。于是,我们在plugin_init()中加入这样一行:
register_concmd("hello","d_hello",ADMIN_CFG,_T("Say Hello World"))
这样,是要有ADMIN_CFG权限的管理员,在控制台中输入hello,就调用脚本中的d_hello过程。于是我们开始编写d_hello过程:

public d_hello(id,level,cid){
if (!cmd_access(id,level,cid,1)) return PLUGIN_HANDLED
client_print(0,print_center,_T("Hello World"))
return PLUGIN_HANDLED
}

if (!cmd_access(id,level,cid,1)) return PLUGIN_HANDLED
这行命令是检验调用该过程的人的权限的,与主题无关,不过我还是解释一下,这里需要程序员改动的只有一个地方,就是cid,后面的1,这个数字代表玩家在控制台输入命令后面的参数数目+1,例如插件编写者希望别人输如控制台命令的时候,命令后面带着3个参数,例如格式为 hello <参数1> <参数2> <参数3>, 那么这个数字就应该设置为4,这样,输入3个参数而且有足够权限的人就可以调用这个命令,如果他只输入了2个参数,就不能调用。这里设置为1,因为不需要后面有参数。
client_print(0,print_center,_T("Hello World")
这个是本插件最核心的部分了,client_print的格式是:client_print(玩家Index,显示位置,"显示内容")
显示位置有:print_centerprint_chatprint_notifyprint_console几种,这里因为规定显示在屏幕中央,所以选择了print_center。玩家Index如果设置成0,就是向所有玩家显示,_T("Hello World") 这个就是调用翻译了。

所有程序如下:
#include <translator>
#include <amxmod>
#include <amxmisc>

plugin_init(){
load_translations("hello_world")
register_plugin(_T("Hello World"),"0.1","Example")
register_concmd("hello","d_hello",ADMIN_CFG,_T("Say Hello World"))
}

public d_hello(id,level,cid){
if (!cmd_access(id,level,cid,1)) return PLUGIN_HANDLED
client_print(0,print_center,_T("Hello World"))
return PLUGIN_HANDLED
}

这样,Hello World脚本就编写完了。
下面进入第2步
2、翻译文件的创建。
还是以Hello World为例子。因为Hello World中调用的翻译文件是hello_world(由load_translations决定),所以,我们打开cstrike\addons\amx\lang文件夹,创建一个文件名为hello_world.txt的文件。
因为Hello World一共有2处需要翻译的地方,一处在register_concmd的"Say Hello World",另一处在register_plugin 和 client_print的 "Hello World",所以我们先在hello_world.txt中加入这两行,文件内容为:
"Say Hello World"
"Hello World"
于是,我们开始翻译。翻译的格式为:
"需要翻译的内容"
语言符号1:"翻译的内容1"
语言符号2:"翻译的内容2"
语言符号3:"翻译的内容3"
(......)
由于我们使用的是中文,简体中文的语言符号是chs(ch代表中国,s代表简体),繁体中文的语言符号是ch,所以我们应加入chs:"翻译内容" 和 ch:"翻译的内容"。于是,翻译好的文件内容是:
"Say Hello World"
chs:"说 您好,世界"
ch:"f 您好,世界"
"Hello World"
chs:"您好,世界"
ch:"您好,世界"

这样,翻译文件就做好了,用UTF-8格式保存文本文件。大功告成。

3、在AMX中调整语言的方法。
在控制台中输入如下各式的命令:
amx_language 语言符号
例如 amx_language chs
这样,您的语言就被调整成了“简体中文”


我就教这写,如果我有表意不清,或者有打错的地方,请大家纠正,谢谢。

denfajun 发表于 2005-6-24 11:05:27

你真是高手啊,我虽知道了一点点,但编程我早呢,有什么专业编AMX的书或教程给俺开开眼?

Hydralisk 发表于 2005-6-24 11:36:43

Post by denfajun
你真是高手啊,我虽知道了一点点,但编程我早呢,有什么专业编AMX的书或教程给俺开开眼? 没有什么专业的AMX熟记。您可以先学一点C语言入个门(别学多,否则起反作用),然后去http://djeyl.net/forum 继续学习,当然,得有一定英语基础。

undoer 发表于 2005-6-24 17:43:33

代码:
if (!cmd_access(id,level,cid,1)) return PLUGIN_HANDLED


这行命令是检验调用该过程的人的权限的,与主题无关,不过我还是解释一下,这里需要程序员改动的只有一个地方,就是cid,后面的1,这个数字代表玩家在控制台输入命令后面的参数数目+1,例如插件编写者希望别人输如控制台命令的时候,命令后面带着3个参数,例如格式为 hello <参数1> <参数2> <参数3>, 那么这个数字就应该设置为4,这样,输入3个参数而且有足够权限的人就可以调用这个命令,如果他只输入了2个参数,就不能调用。这里设置为1,因为不需要后面有参数。



嗯,终于明白cid后面的1代表什么了。:D

"Say Hello World"
chs:"说 您好,世界"
ch:"f 您好,世界"
"Hello World"
chs:"您好,世界"
ch:"您好,世界"

如果汉字是第一个字符,应该加一个空格。否则,当执行命令时,服务器就立即crash。

Hydralisk 发表于 2005-6-24 17:54:39

Post by undoer
如果汉字是第一个字符,应该加一个空格。否则,当执行命令时,服务器就立即crash。
有的地方用,有的地方不用,如果跟hudmessage有点关系的,尽量加个空格。(我试过的)

WeeVee 发表于 2005-6-25 22:04:09

原来“Hello World”的意思是“你好 世界”啊~ :cold: 俺不会鹰语。。。

Hydralisk 发表于 2005-6-25 22:14:20

:sweat:
页: [1]
查看完整版本: AMX中翻译器(translator)的使用