搜索
查看: 2661|回复: 6

AMX中翻译器(translator)的使用

[复制链接]
发表于 2005-6-24 09:25:50 | 显示全部楼层 |阅读模式 来自 辽宁沈阳
AMX的Translator是为了插件在AMX中更好的支持多语言而在0.9.9版本中新添入的功能。引入Translator大大的方便了使用者将插件中的文字翻译成自己国家的语言。下面我来教大家如何使用Translator。

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

  1. #include <translator>
  2. #include <amxmod>
  3. #include <vexd_utilities>
复制代码

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



这样,Translator就被引入了。当然,这仅仅是被引入,您还需要作更具体的工作。
下面,我们来拿一个简单的程序Hello World做一个范例
首先,在plugin_init()过程中加入这样一行
  1. load_translations("hello_world")
复制代码

load_translations的作用是装载翻译文件,例如上述例子就是载入amx\lang\hello_world.txt翻译文件,于是本插件的翻译都需要调用hello_world.txt中的内容。

目前的源代码为:
  1. #include <translator>
  2. #include <amxmod>
  3. #include <amxmisc>

  4. plugin_init(){
  5. load_translations("hello_world")
  6. }
复制代码


这样,翻译的准备工作就做完了。细节工作开始。
翻译器的命令为  
  1. _T("翻译内容","玩家Index")
复制代码

这里尤其需要注意的是玩家Index,这是个可选参数,但是很多人容易在这里犯错误。
如果在下列过程中使用_T进行翻译,玩家Index必须忽略,也就只写成_T("翻译内容"):
  1. register_plugin
  2. register_srvcmd
  3. register_clcmd
  4. register_concmd
复制代码

例如
  1. register_plugin(_T("Hello World"),"0.1","Example")
  2. register_concmd("hello","hello",ADMIN_CFG,_T("Say Hello world"))
复制代码

而且,_T不能用在register_concmd, register_clcmd, register_srvcmd的第一或第二个参数上,例如如下是错误的:
  1. register_concmd(_T("hello"),"hello")
  2. register_clcmd("hello",_T("hello"))
复制代码

如果在下列过程中使用_T,玩家Index可以忽略,也可以不忽略,不过建议忽略。
  1. client_print
  2. engclient_print
  3. console_print
  4. server_print
  5. show_hudmessage
  6. client_cmd
复制代码

例如:
  1. client_print(id,print_center,_T("Hello world"))
  2. client_print(id,print_chat,_T("Hello world",id)
  3. // Both OK
复制代码

如果在下列过程中使用_T,玩家Index一定不能忽略
  1. format
  2. copy
  3. add
  4. equal
  5. equali
复制代码

例如:

  1. new trs[33]
  2. format(trs,32,_T("Hello World",id))
复制代码

错误的例子:
  1. new trs[33]
  2. format(trs,32,_T("Hello World"))    //忘记了输入玩家Index
复制代码

而且,在format, copy, add这三个函数中,_T不能用在“目的地参数上”,例如format的第一个参数叫做目的地参数,因为format是将处理好的字符串放置在format的第一个参数上,故称之为“目的地参数”。例如,如下是错误的:
  1. new trs[33]
  2. format(_T(trs,id),32,"Hello World")
复制代码


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

这样,是要有ADMIN_CFG权限的管理员,在控制台中输入hello,就调用脚本中的d_hello过程。于是我们开始编写d_hello过程:

  1. public d_hello(id,level,cid){
  2.   if (!cmd_access(id,level,cid,1)) return PLUGIN_HANDLED
  3.   client_print(0,print_center,_T("Hello World"))
  4.   return PLUGIN_HANDLED
  5. }
复制代码

  1. if (!cmd_access(id,level,cid,1)) return PLUGIN_HANDLED
复制代码

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

这个是本插件最核心的部分了,client_print的格式是:client_print(玩家Index,显示位置,"显示内容")
显示位置有:print_center  print_chat  print_notify  print_console几种,这里因为规定显示在屏幕中央,所以选择了print_center。玩家Index如果设置成0,就是向所有玩家显示,_T("Hello World") 这个就是调用翻译了。

所有程序如下:
  1. #include <translator>
  2. #include <amxmod>
  3. #include <amxmisc>

  4. plugin_init(){
  5. load_translations("hello_world")
  6. register_plugin(_T("Hello World"),"0.1","Example")
  7. register_concmd("hello","d_hello",ADMIN_CFG,_T("Say Hello World"))
  8. }

  9. public d_hello(id,level,cid){
  10.   if (!cmd_access(id,level,cid,1)) return PLUGIN_HANDLED
  11.   client_print(0,print_center,_T("Hello World"))
  12.   return PLUGIN_HANDLED
  13. }
复制代码


这样,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. "需要翻译的内容"
  2. 语言符号1:"翻译的内容1"
  3. 语言符号2:"翻译的内容2"
  4. 语言符号3:"翻译的内容3"
  5. (......)
复制代码

由于我们使用的是中文,简体中文的语言符号是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
这样,您的语言就被调整成了“简体中文”


我就教这写,如果我有表意不清,或者有打错的地方,请大家纠正,谢谢。
发表于 2005-6-24 11:05:27 | 显示全部楼层 来自 江苏南京
你真是高手啊,我虽知道了一点点,但编程我早呢,有什么专业编AMX的书或教程给俺开开眼?
回复

使用道具 举报

 楼主| 发表于 2005-6-24 11:36:43 | 显示全部楼层 来自 辽宁沈阳
Post by denfajun
你真是高手啊,我虽知道了一点点,但编程我早呢,有什么专业编AMX的书或教程给俺开开眼?
没有什么专业的AMX熟记。您可以先学一点C语言入个门(别学多,否则起反作用),然后去http://djeyl.net/forum 继续学习,当然,得有一定英语基础。
回复

使用道具 举报

发表于 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。
回复

使用道具 举报

 楼主| 发表于 2005-6-24 17:54:39 | 显示全部楼层 来自 辽宁沈阳
Post by undoer
如果汉字是第一个字符,应该加一个空格。否则,当执行命令时,服务器就立即crash。

有的地方用,有的地方不用,如果跟hudmessage有点关系的,尽量加个空格。(我试过的)
回复

使用道具 举报

发表于 2005-6-25 22:04:09 | 显示全部楼层 来自 广西玉林
原来“Hello World”的意思是“你好 世界”啊~ :cold: 俺不会鹰语。。。
回复

使用道具 举报

 楼主| 发表于 2005-6-25 22:14:20 | 显示全部楼层 来自 辽宁沈阳
:sweat:
回复

使用道具 举报

游客
回复
您需要登录后才可以回帖 登录 | 注个册吧

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