<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.secondlife.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Perry+Mizin</id>
	<title>Second Life Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.secondlife.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Perry+Mizin"/>
	<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/wiki/Special:Contributions/Perry_Mizin"/>
	<updated>2026-07-27T04:19:29Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=File:WE-830S.jpg&amp;diff=1021282</id>
		<title>File:WE-830S.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=File:WE-830S.jpg&amp;diff=1021282"/>
		<updated>2010-09-01T00:48:44Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: Welcom WE-830S Gamepad&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcom WE-830S Gamepad&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=995572</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=995572"/>
		<updated>2010-08-06T11:36:24Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribución al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente código fué originálmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mí manera...&lt;br /&gt;
No ós riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;OK&#039;&#039; ===&lt;br /&gt;
Bueno, despues de respiñar todo lo que pude, creo que el uso de memoria y la velocidad están prácticamente igual qué en la versión original pero bueno... en la variedad está el gusto no?&lt;br /&gt;
Ya he probado un poco el código, y parece que funciona aunque estoy teniendo algunos problemas... Por ejemplo creo que el sistema de traduccion no funciona corréctamente, y no me refiero al sistema de traduccion de Google (en mi opinion, si no es el mejor, es uno de los mejores del mundo), sino a que aún queda mucho trabajo por hacer en el script...&lt;br /&gt;
&lt;br /&gt;
El siguiente paso sera intentar dividir el script en dos, o si es posible en tres para repartir el uso de memoria. Tambien me gustaria probar un truco que uso a menudo para traducir páginas en un idioma que no entiendo, lo que hago es que en vez de traducir diréctamente al español, primero se traduce a inglés, y luego desde inglés al español. Parece una tontería y un gasto innecesario, pero si lo hago es porque así suelo entender mejor las traducciones.&lt;br /&gt;
Quiero por un lado el sistema de comunicacion y evaluacion entre traductores, y por otro el sistema de traduccion entre avatares, ¿es muy dificil? no sé ya lo veremos...&lt;br /&gt;
&lt;br /&gt;
Well, after saving as much as I could, I think the memory usage and the speed are technically the same as in the original script, but well, in the variety is the taste, isnt it?. &lt;br /&gt;
I have tested a bit the code above already, and it seems to work altought i´m having some problems...&lt;br /&gt;
For instance i think the translation system is not working properly, and i dont mean the Google´s translation system (in my opinion, if is not the best, one of the bests), but that there is still much work to do in the script...&lt;br /&gt;
&lt;br /&gt;
The next step will be to try to divide the script in 2, or 3 if is possible, so we can spread the memory usage. Also I would like to test a trick i use often for to translate languages that i dont understand, what I do first is to translate that language into English, and then from English to Spanish, it seems a nonsense and unnecesary waste, but if i do it is becouse so i usually understand the translations better.&lt;br /&gt;
I want by one part the translators communications and evaluation system, and by other the translation system between avatars, is it very difficult? I don´t know , we will see...&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Es dificil... me está costando pero ya veremos...&lt;br /&gt;
Its difficult... i am struggling but we will see...&lt;br /&gt;
&lt;br /&gt;
chu chu chu&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
De Güatemala a Güatepeor, Sin comentarios...&lt;br /&gt;
&lt;br /&gt;
From Güatebad to Güateworse, No comments...&lt;br /&gt;
&lt;br /&gt;
Buscando en Internet he encontrado este [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html API de Yahoo] comprobador de ortografía, aunque creo que por ahora sólo soporta el lenguage inglés pero sería interesante añadirlo al proyecto&lt;br /&gt;
&lt;br /&gt;
Searching on the web I crossed in my way with this spell checker [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html Yahoo´s API] , I think that it only supports English language by now althought it would be interesting to add it to the project&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Estoy probando el comprobador de deletreo de Yahoo aunque la verdad es que no estoy teniendo buenos resultados, parece que Google es mucho más rapido y necesito corregir antes de traducir. También estoy intentando solucionar el error que aparece con el símbolo (apostrofe) ´ en las frases con genitivo sajon traducidas al inglés y tampoco doy con la tecla... Ya que esto me está dando muchos dolores de cabeza quizás deje el proyecto en standby hasta después de navidades.&lt;br /&gt;
&lt;br /&gt;
I am testing the Yahoo´s spell checker althought to be honest I´m not having good success, it seems Google is much faster and I need to correct before translate. Also I am triying to fix the error showed in the phrases translated to English with the saxons genitive apostrophe ´ and still triying and triying. As this is driving me nuts, maybe I will leave the project in standby until new year.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ESTO ES EL TRADUCTOR &amp;quot;un lío&amp;quot; por ahora... Necesito rehacer algunas cosas&lt;br /&gt;
&lt;br /&gt;
THIS IS THE TRANSLATOR &amp;quot;mess&amp;quot; by now... I need to redo some things&lt;br /&gt;
&#039;&#039;&#039;THE CODE BELOW IS WORKING AND BEING TESTED&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
THIS IS AN ALPHA VERSION OF THE PERRYSONAL TRANSLATOR...&lt;br /&gt;
NOTHING MORE TO SAY&lt;br /&gt;
&lt;br /&gt;
Menu&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Mod Made in Perry Mizin&lt;br /&gt;
//This is the interface, or menu-system of the translator.&lt;br /&gt;
//Menu System&lt;br /&gt;
//Copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Variables&lt;br /&gt;
integer randomDialogChannel;&lt;br /&gt;
//Options&lt;br /&gt;
integer enabled = TRUE;&lt;br /&gt;
integer isShowTran = FALSE;&lt;br /&gt;
integer tranObjects = TRUE;&lt;br /&gt;
//Functions&lt;br /&gt;
showMainMenu(key id)&lt;br /&gt;
{&lt;br /&gt;
	list buttonList = [];&lt;br /&gt;
	string dialogMsg = &amp;quot;Options Menu.&amp;quot;;&lt;br /&gt;
	if (id == llGetOwner())&lt;br /&gt;
	{&lt;br /&gt;
		if (enabled)&lt;br /&gt;
		{&lt;br /&gt;
			buttonList = (buttonList=[]) + buttonList + [&amp;quot;Turn OFF&amp;quot;];&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			buttonList = (buttonList=[]) + buttonList + [&amp;quot;Turn ON&amp;quot;];&lt;br /&gt;
		}&lt;br /&gt;
		if (isShowTran)&lt;br /&gt;
		{&lt;br /&gt;
			buttonList = (buttonList=[]) + buttonList + [&amp;quot;Echo OFF&amp;quot;];&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			buttonList = (buttonList=[]) + buttonList + [&amp;quot;Echo ON&amp;quot;];&lt;br /&gt;
		}&lt;br /&gt;
		buttonList = (buttonList=[]) + buttonList + [&amp;quot;RESET&amp;quot;];&lt;br /&gt;
		dialogMsg = (dialogMsg=&amp;quot;&amp;quot;) + dialogMsg + &amp;quot;\nECHO: show translations of your chat sent to others.&amp;quot;;&lt;br /&gt;
		if (tranObjects)&lt;br /&gt;
		{&lt;br /&gt;
			buttonList = (buttonList=[]) + buttonList + [&amp;quot;Objects OFF&amp;quot;];&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			buttonList = (buttonList=[]) + buttonList + [&amp;quot;Objects ON&amp;quot;];&lt;br /&gt;
		}&lt;br /&gt;
		dialogMsg = (dialogMsg=&amp;quot;&amp;quot;) + dialogMsg + &amp;quot;\nOBJECTS: translate chat of scripted objects&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	llDialog(id, dialogMsg, buttonList, randomDialogChannel);&lt;br /&gt;
}&lt;br /&gt;
processListen(string name, key id, string message)&lt;br /&gt;
{&lt;br /&gt;
	if (id == llGetOwner())&lt;br /&gt;
	{&lt;br /&gt;
		else if (message == &amp;quot;Turn ON&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			enabled  = TRUE;&lt;br /&gt;
			llMessageLinked(LINK_THIS, 8439932,&amp;quot;enable&amp;quot;, id);&lt;br /&gt;
		}&lt;br /&gt;
		else if (message == &amp;quot;Turn OFF&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			enabled  = FALSE;&lt;br /&gt;
			llMessageLinked(LINK_THIS, 8439932,&amp;quot;disable&amp;quot;, id);&lt;br /&gt;
		}&lt;br /&gt;
		else if (message == &amp;quot;Echo ON&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			isShowTran = TRUE;&lt;br /&gt;
			llMessageLinked(LINK_THIS, 8872932,&amp;quot;echon&amp;quot;, id);&lt;br /&gt;
		}&lt;br /&gt;
		else if (message == &amp;quot;Echo OFF&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			isShowTran = FALSE;&lt;br /&gt;
			llMessageLinked(LINK_THIS, 8872932,&amp;quot;echoff&amp;quot;, id);&lt;br /&gt;
		}&lt;br /&gt;
		else if (message == &amp;quot;Objects OFF&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			tranObjects = FALSE;&lt;br /&gt;
			llMessageLinked(LINK_THIS, 8439742,&amp;quot;objoff&amp;quot;, id);&lt;br /&gt;
		}&lt;br /&gt;
		else if (message == &amp;quot;Objects ON&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			tranObjects = TRUE;&lt;br /&gt;
			llMessageLinked(LINK_THIS, 8439742,&amp;quot;objon&amp;quot;, id);&lt;br /&gt;
		}&lt;br /&gt;
		else if (message == &amp;quot;RESET&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			llResetOtherScript(&amp;quot;agents&amp;quot;);&lt;br /&gt;
			llResetOtherScript(&amp;quot;form&amp;quot;);&lt;br /&gt;
			llResetOtherScript(&amp;quot;trans&amp;quot;);&lt;br /&gt;
			llResetOtherScript(&amp;quot;list&amp;quot;);&lt;br /&gt;
			llResetOtherScript(&amp;quot;lan&amp;quot;);&lt;br /&gt;
			llOwnerSay(&amp;quot;All Scripts are Resetted now...&amp;quot;);&lt;br /&gt;
			llResetScript();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
//&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		llOwnerSay(&amp;quot;Welcome to the Perrysonal Translator, probably the worst FREE translator in SL!&amp;quot;);&lt;br /&gt;
		randomDialogChannel = (integer)llFrand(2147483647);&lt;br /&gt;
		llMessageLinked(LINK_SET, 7563297, &amp;quot;XTRNSL&amp;quot;, NULL_KEY);&lt;br /&gt;
		//Other Setup&lt;br /&gt;
		llListen(randomDialogChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
		showMainMenu(llGetOwner());&lt;br /&gt;
	}&lt;br /&gt;
	on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
        // Reset script when the object is rezzed&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
	touch_start(integer total_number)&lt;br /&gt;
	{&lt;br /&gt;
		if(llDetectedKey(0) == llGetOwner())&lt;br /&gt;
		{&lt;br /&gt;
			showMainMenu(llGetOwner());&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	listen(integer channel, string name, key id, string message)&lt;br /&gt;
	{&lt;br /&gt;
		processListen(name,id,message);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Listener&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// www.lsleditor.org  by Alphons van der Heijden (SL: Alphons Jano)&lt;br /&gt;
//(Mod made in Perry Mizin) I want to succeed with this translator... ;) call me day or night&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//listener&lt;br /&gt;
integer tranObjects = TRUE;&lt;br /&gt;
integer enabled = TRUE;&lt;br /&gt;
key restricted;&lt;br /&gt;
key owner;&lt;br /&gt;
//&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		owner = llGetOwner();&lt;br /&gt;
		llListen(0,&amp;quot;&amp;quot;,NULL_KEY,&amp;quot;&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
        // Reset script when the object is rezzed&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
	link_message(integer sender_num, integer num, string str, key id)&lt;br /&gt;
	{&lt;br /&gt;
		if (num == 8439932)&lt;br /&gt;
		{&lt;br /&gt;
			if(str==&amp;quot;enable&amp;quot;)&lt;br /&gt;
			{&lt;br /&gt;
				enabled = TRUE;&lt;br /&gt;
			}&lt;br /&gt;
			else if(str==&amp;quot;disable&amp;quot;)&lt;br /&gt;
			{&lt;br /&gt;
				enabled = FALSE;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if (num == 8439742)&lt;br /&gt;
		{&lt;br /&gt;
			if(str==&amp;quot;objon&amp;quot;)&lt;br /&gt;
			{&lt;br /&gt;
				tranObjects = TRUE;&lt;br /&gt;
			}&lt;br /&gt;
			else if(str==&amp;quot;objoff&amp;quot;)&lt;br /&gt;
			{&lt;br /&gt;
				tranObjects = FALSE;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	listen(integer channel, string name, key id, string message)&lt;br /&gt;
	{&lt;br /&gt;
		if(channel==PUBLIC_CHANNEL)&lt;br /&gt;
		{&lt;br /&gt;
			if (!enabled)&lt;br /&gt;
			{&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			if (restricted==id)&lt;br /&gt;
			{&lt;br /&gt;
				llSetTimerEvent(0.0);&lt;br /&gt;
				restricted = id;&lt;br /&gt;
				llSetTimerEvent(0.7);&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			if (!tranObjects)&lt;br /&gt;
			{&lt;br /&gt;
				if (llGetAgentSize(id) == ZERO_VECTOR)&lt;br /&gt;
				{&lt;br /&gt;
					return;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			if (llStringLength(message) &amp;lt; 12)&lt;br /&gt;
			{&lt;br /&gt;
				llMessageLinked(LINK_THIS,98745920,message,id);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				llMessageLinked(LINK_THIS,7686795,message,id);&lt;br /&gt;
				llMessageLinked(LINK_THIS,98745920,message,id);&lt;br /&gt;
			}&lt;br /&gt;
			llSetTimerEvent(0.7);&lt;br /&gt;
			restricted = id;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	timer()&lt;br /&gt;
	{&lt;br /&gt;
		restricted = NULL_KEY;&lt;br /&gt;
		llSetTimerEvent(0.0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
agentsinTranslation&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
key owner;&lt;br /&gt;
key speaker;&lt;br /&gt;
key sid;&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
list tmrli;&lt;br /&gt;
list newList;&lt;br /&gt;
integer listenID;&lt;br /&gt;
integer tmpavliPos;&lt;br /&gt;
integer ownerliPos;&lt;br /&gt;
vector tmrVct;&lt;br /&gt;
string actlan;&lt;br /&gt;
string tmplan;&lt;br /&gt;
string spkLan;&lt;br /&gt;
string SEPARATOR = &amp;quot;|%&amp;amp;|&amp;quot;;&lt;br /&gt;
string mylanguage;&lt;br /&gt;
string checkLanguage(string chklantmpStr)&lt;br /&gt;
{&lt;br /&gt;
	if (chklantmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;en&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	else if (chklantmpStr == &amp;quot;und&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;el&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	else if (chklantmpStr == &amp;quot;Gh&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;en&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	if (llGetSubString(chklantmpStr, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = llGetSubString(chklantmpStr, 0, 1);&lt;br /&gt;
	}&lt;br /&gt;
	return chklantmpStr;&lt;br /&gt;
}&lt;br /&gt;
string addNewAgent(key newavid)&lt;br /&gt;
{&lt;br /&gt;
	string speakerLan;&lt;br /&gt;
	if (llGetAgentSize(newavid) == ZERO_VECTOR)&lt;br /&gt;
	{&lt;br /&gt;
		speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		speakerLan  = checkLanguage(llGetAgentLanguage(newavid));&lt;br /&gt;
		if (speakerLan == &amp;quot;&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
			addAgent(newavid, speakerLan, 0);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			addAgent(newavid, speakerLan, 0);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return speakerLan;&lt;br /&gt;
}&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
	if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
	{&lt;br /&gt;
		integer gkliPos = llListFindList(agentsInTranslation, (list)agentID);&lt;br /&gt;
		return llList2Key(agentsInTranslation, gkliPos - 4);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		return NULL_KEY;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
string List2TypeSep(list input2) {&lt;br /&gt;
	integer w;&lt;br /&gt;
	list output2;&lt;br /&gt;
	for (w = 0; w &amp;lt; llGetListLength(input2); w++) {&lt;br /&gt;
		output2 += [llGetListEntryType(input2, w)] + llList2List(input2, w, w);&lt;br /&gt;
	}&lt;br /&gt;
	return llDumpList2String(output2, SEPARATOR);&lt;br /&gt;
}&lt;br /&gt;
list TypeSep2List(string inputstring) {&lt;br /&gt;
	integer v;&lt;br /&gt;
	list input;&lt;br /&gt;
	list output;&lt;br /&gt;
	input = llParseString2List(inputstring, [SEPARATOR], []);&lt;br /&gt;
	for (v = 0; v &amp;lt; llGetListLength(input); v += 2) {&lt;br /&gt;
		if (llList2Integer(input, v) == TYPE_INTEGER) output += (integer)llList2String(input, v + 1);&lt;br /&gt;
		else if (llList2Integer(input, v) == TYPE_FLOAT) output += (float)llList2String(input, v + 1);&lt;br /&gt;
		else if (llList2Integer(input, v) == TYPE_STRING) output += llList2String(input, v + 1);&lt;br /&gt;
		else if (llList2Integer(input, v) == TYPE_KEY) output += (key)llList2String(input, v + 1);&lt;br /&gt;
	}&lt;br /&gt;
	return output;&lt;br /&gt;
}&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
	integer avliPos;&lt;br /&gt;
	integer idNum;&lt;br /&gt;
	if (~llListFindList(agentsInTranslation, (list)avid))&lt;br /&gt;
	{&lt;br /&gt;
		avliPos = llListFindList(agentsInTranslation, (list)avid);&lt;br /&gt;
		agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, avlan, chklan], avliPos + 1, avliPos + 3);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		@at;&lt;br /&gt;
		idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
		if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
		{&lt;br /&gt;
			jump at;&lt;br /&gt;
		}&lt;br /&gt;
		agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, avlan, chklan, idNum];&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
//&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		owner = llGetOwner();&lt;br /&gt;
		listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
		mylanguage = llGetAgentLanguage(owner);&lt;br /&gt;
		if (llStringLength(mylanguage) &amp;lt; 1)&lt;br /&gt;
		{&lt;br /&gt;
			mylanguage = &amp;quot;en&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		if(~llListFindList(agentsInTranslation, (list)owner))&lt;br /&gt;
		{&lt;br /&gt;
			ownerliPos = llListFindList(agentsInTranslation, (list)owner);&lt;br /&gt;
			agentsInTranslation = llListReplaceList(agentsInTranslation, [mylanguage] , ownerliPos + 1, ownerliPos + 1);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [owner, mylanguage, mylanguage, 0, llRound(llFrand(2000000)) + 1];&lt;br /&gt;
		}&lt;br /&gt;
		llSetTimerEvent(1.0);&lt;br /&gt;
	}&lt;br /&gt;
	link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
	{&lt;br /&gt;
		if (num == 6349160)&lt;br /&gt;
		{&lt;br /&gt;
			speaker = lid;&lt;br /&gt;
			spkLan = lstr;&lt;br /&gt;
			if (~llListFindList(agentsInTranslation, (list)speaker))&lt;br /&gt;
			{&lt;br /&gt;
				tmpavliPos = llListFindList(agentsInTranslation, (list)speaker);&lt;br /&gt;
				actlan = llList2String(agentsInTranslation, tmpavliPos + 1);&lt;br /&gt;
				tmplan = llList2String(agentsInTranslation, tmpavliPos + 2);&lt;br /&gt;
				if (llList2Integer(agentsInTranslation, tmpavliPos + 3) &amp;gt;= 2)&lt;br /&gt;
				{   // if anyone speaks on any different language 3 times in a row&lt;br /&gt;
					addAgent(lid, lstr, 0);&lt;br /&gt;
				}&lt;br /&gt;
				if (actlan == lstr)&lt;br /&gt;
				{   // reset language checker for speaker&lt;br /&gt;
					agentsInTranslation = llListReplaceList(agentsInTranslation, [actlan, 0], tmpavliPos + 2, tmpavliPos + 3);&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					if (lstr == tmplan)&lt;br /&gt;
					{   // if language of speaker is not the same as detected language&lt;br /&gt;
						agentsInTranslation = llListReplaceList(agentsInTranslation,[llList2Integer(agentsInTranslation,tmpavliPos + 3) + 1] , tmpavliPos + 3, tmpavliPos + 3);&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						agentsInTranslation = llListReplaceList(agentsInTranslation,[lstr, 0] , tmpavliPos + 2, tmpavliPos + 3);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if (num == 9876754)&lt;br /&gt;
		{&lt;br /&gt;
			llMessageLinked(LINK_THIS,7659759,List2TypeSep(agentsInTranslation),NULL_KEY);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	listen(integer channel, string name, key id, string message)&lt;br /&gt;
	{&lt;br /&gt;
		if(~llListFindList(agentsInTranslation, (list)id))&lt;br /&gt;
		{ }&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			addNewAgent(id);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	sensor(integer num_detected)&lt;br /&gt;
	{&lt;br /&gt;
		integer s;&lt;br /&gt;
		for (s = 0; s &amp;lt; num_detected; s += 1)&lt;br /&gt;
		{&lt;br /&gt;
			sid = llDetectedKey(s);&lt;br /&gt;
			if (~llListFindList(agentsInTranslation, (list)sid))&lt;br /&gt;
			{ }&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				addNewAgent(sid);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	no_sensor()&lt;br /&gt;
	{ }&lt;br /&gt;
	timer()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(0.0);&lt;br /&gt;
		integer r;&lt;br /&gt;
		for (r = 0; r &amp;lt; llGetListLength(agentsInTranslation); r += 5)&lt;br /&gt;
		{&lt;br /&gt;
			tmrli = llGetObjectDetails(llList2Key(agentsInTranslation, r), [OBJECT_POS]);&lt;br /&gt;
			tmrVct = llList2Vector(tmrli, 0);&lt;br /&gt;
			if (tmrVct == ZERO_VECTOR)&lt;br /&gt;
			{  }&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				if (llVecDist(llGetPos(), tmrVct) &amp;lt;= 20.0)&lt;br /&gt;
				{&lt;br /&gt;
					newList = (newList=[]) + newList + llList2List(agentsInTranslation, r, r + 4);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		agentsInTranslation = newList;&lt;br /&gt;
		newList = [];&lt;br /&gt;
		llSensor(&amp;quot;&amp;quot;,NULL_KEY,AGENT,20.0,PI);&lt;br /&gt;
		llSetTimerEvent(6.0);   // restart timer&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
DetectLanguage&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
key dtcValue;&lt;br /&gt;
key speakerID;&lt;br /&gt;
string htttmpStr;&lt;br /&gt;
list tempDetections;&lt;br /&gt;
list newList;&lt;br /&gt;
float timeElapsed;&lt;br /&gt;
integer tmpliPos;&lt;br /&gt;
integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex&lt;br /&gt;
{&lt;br /&gt;
	return ~llSubStringIndex(haystack, needle);&lt;br /&gt;
}&lt;br /&gt;
DetectLanguage(string dtcmsg, key dtcid)&lt;br /&gt;
{&lt;br /&gt;
	dtcValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&amp;amp;q=&amp;quot; + llEscapeURL(dtcmsg), [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot; &amp;quot;);&lt;br /&gt;
	if (dtcValue != NULL_KEY)&lt;br /&gt;
	{&lt;br /&gt;
		tempDetections = (tempDetections=[]) + tempDetections + [dtcValue, dtcid, llGetTime()];&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		llSleep(10.0); // Something has gone horribly wrong, sleep 10 seconds clear throttle&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
//&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(5.0);&lt;br /&gt;
	}&lt;br /&gt;
	link_message(integer sender, integer num, string msg, key id)&lt;br /&gt;
	{&lt;br /&gt;
		if (num == 7686795)&lt;br /&gt;
		{&lt;br /&gt;
			DetectLanguage(msg, id);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
	{   // Process Response Code&lt;br /&gt;
		if (~llListFindList(tempDetections, (list)request_id))&lt;br /&gt;
		{   // Language Detection&lt;br /&gt;
			tmpliPos = llListFindList(tempDetections, (list)request_id);&lt;br /&gt;
			speakerID = llList2Key(tempDetections, tmpliPos + 1);&lt;br /&gt;
			tempDetections = llDeleteSubList(tempDetections, tmpliPos, tmpliPos + 2);&lt;br /&gt;
			htttmpStr = llToLower(llGetSubString(body, llSubStringIndex(body, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(body, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
			if (contains(htttmpStr, &amp;quot;err&amp;quot;) == 0 &amp;amp;&amp;amp; contains(htttmpStr, &amp;quot;unn&amp;quot;) == 0)&lt;br /&gt;
			{   // We Trust the Google system, the Google´s guys are good and I am sure they will keep improving :-)&lt;br /&gt;
				if(llStringLength(htttmpStr) &amp;lt;= 3)&lt;br /&gt;
				{&lt;br /&gt;
					llMessageLinked(LINK_THIS,6349160,htttmpStr,speakerID);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	timer()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(0.0);&lt;br /&gt;
		integer r;&lt;br /&gt;
		integer TliLen = llGetListLength(tempDetections);&lt;br /&gt;
		for (r = 0; r &amp;lt; TliLen; r += 3)&lt;br /&gt;
		{&lt;br /&gt;
			timeElapsed = llGetTime() - llList2Float(tempDetections, r + 2);&lt;br /&gt;
			if (timeElapsed &amp;gt; 10.0)&lt;br /&gt;
			{&lt;br /&gt;
				newList = (newList=[]) + newList + llList2List(tempDetections, r, r + 2);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		tempDetections = newList;&lt;br /&gt;
		newList = [];&lt;br /&gt;
		llSetTimerEvent(5.0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Formulator&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//Formulator Script&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
list txli;&lt;br /&gt;
list translationCache;&lt;br /&gt;
list tomali;&lt;br /&gt;
string SEPARATOR = &amp;quot;|%&amp;amp;|&amp;quot;;&lt;br /&gt;
string recepientLanguage;&lt;br /&gt;
string speakerLanguage;&lt;br /&gt;
string txmessage;&lt;br /&gt;
string  spkrLan;&lt;br /&gt;
string recep;&lt;br /&gt;
string  recepLan;&lt;br /&gt;
string  lanpair;&lt;br /&gt;
string request;&lt;br /&gt;
integer M = 1;&lt;br /&gt;
integer rxID;&lt;br /&gt;
integer recepID;&lt;br /&gt;
integer lstliPos;&lt;br /&gt;
integer lstliPos2;&lt;br /&gt;
integer txPos;&lt;br /&gt;
integer lint;&lt;br /&gt;
key recepientID;&lt;br /&gt;
float cacheTime;&lt;br /&gt;
sendIM(key imid, string imstr)&lt;br /&gt;
{&lt;br /&gt;
	if (M == 8)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_ALL_OTHERS,2334420,imstr,imid);&lt;br /&gt;
		M = 1;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 7)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_ALL_OTHERS,2334430,imstr,imid);&lt;br /&gt;
		M = 8;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 6)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_ALL_OTHERS,2334440,imstr,imid);&lt;br /&gt;
		M = 7;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 5)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_ALL_OTHERS,2334450,imstr,imid);&lt;br /&gt;
		M = 6;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 4)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_ALL_OTHERS,2334460,imstr,imid);&lt;br /&gt;
		M = 5;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 3)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_ALL_OTHERS,2334470,imstr,imid);&lt;br /&gt;
		M = 4;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 2)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_ALL_OTHERS,2334480,imstr,imid);&lt;br /&gt;
		M = 3;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 1)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_ALL_OTHERS,2334490,imstr,imid);&lt;br /&gt;
		M = 2;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
	if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
	{&lt;br /&gt;
		integer gkliPos = llListFindList(agentsInTranslation, (list)agentID);&lt;br /&gt;
		return llList2Key(agentsInTranslation, gkliPos - 4);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		return NULL_KEY;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
list TypeSep2List(string inputstring)&lt;br /&gt;
{&lt;br /&gt;
	integer h;&lt;br /&gt;
	list input;&lt;br /&gt;
	list output;&lt;br /&gt;
	input = llParseString2List(inputstring, [SEPARATOR], []);&lt;br /&gt;
	for (h = 0; h &amp;lt; llGetListLength(input); h += 2)&lt;br /&gt;
	{&lt;br /&gt;
		if (llList2Integer(input, h) == TYPE_INTEGER) output += (integer)llList2String(input, h + 1);&lt;br /&gt;
		else if (llList2Integer(input, h) == TYPE_FLOAT) output += (float)llList2String(input, h + 1);&lt;br /&gt;
		else if (llList2Integer(input, h) == TYPE_STRING) output += llList2String(input, h + 1);&lt;br /&gt;
		else if (llList2Integer(input, h) == TYPE_KEY) output += (key)llList2String(input, h + 1);&lt;br /&gt;
	}&lt;br /&gt;
	return output;&lt;br /&gt;
}&lt;br /&gt;
string List2TypeSep(list input2)&lt;br /&gt;
{&lt;br /&gt;
	integer l;&lt;br /&gt;
	list output2;&lt;br /&gt;
	for (l = 0; l &amp;lt; llGetListLength(input2); l++)&lt;br /&gt;
	{&lt;br /&gt;
		output2 += [llGetListEntryType(input2, l)] + llList2List(input2, l, l);&lt;br /&gt;
	}&lt;br /&gt;
	return llDumpList2String(output2, SEPARATOR);&lt;br /&gt;
}&lt;br /&gt;
//&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(1.0);&lt;br /&gt;
	}&lt;br /&gt;
	link_message(integer sender_num, integer num, string lstr, key id)&lt;br /&gt;
	{&lt;br /&gt;
		if (num == 7659759)&lt;br /&gt;
		{&lt;br /&gt;
			agentsInTranslation = TypeSep2List(lstr);&lt;br /&gt;
		}&lt;br /&gt;
		if (num == 9827491)&lt;br /&gt;
		{&lt;br /&gt;
			txli = TypeSep2List(lstr);&lt;br /&gt;
			rxID = llList2Integer(txli,0);&lt;br /&gt;
			speakerLanguage = llList2String(txli,1);&lt;br /&gt;
			txmessage = llList2String(txli,2);&lt;br /&gt;
			lint = llListFindList(agentsInTranslation, (list)rxID);&lt;br /&gt;
			recepientLanguage = llList2String(agentsInTranslation, lint - 3);&lt;br /&gt;
			recepientID = getAgentKey(rxID);&lt;br /&gt;
			if (recepientID != NULL_KEY)&lt;br /&gt;
			{&lt;br /&gt;
				if (recepientLanguage == speakerLanguage)&lt;br /&gt;
				{ }&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					sendIM(recepientID,txmessage);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if (num == 98745920)&lt;br /&gt;
		{&lt;br /&gt;
			txPos = llListFindList(agentsInTranslation, (list)id);&lt;br /&gt;
			cacheTime = llGetTime();&lt;br /&gt;
			if(id==llGetOwner())&lt;br /&gt;
			{&lt;br /&gt;
				integer v;&lt;br /&gt;
				integer agentslilen = llGetListLength(agentsInTranslation);&lt;br /&gt;
				for (v = 0; v &amp;lt; agentslilen; v += 5)&lt;br /&gt;
				{&lt;br /&gt;
					spkrLan = llList2String(agentsInTranslation, txPos + 1);&lt;br /&gt;
					recepID = llList2Integer(agentsInTranslation, v + 4);&lt;br /&gt;
					recepLan = llList2String(agentsInTranslation, v + 1);&lt;br /&gt;
					if (spkrLan == recepLan)&lt;br /&gt;
					{ }&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
						if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
						{&lt;br /&gt;
							lstliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
							translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
						}&lt;br /&gt;
						else&lt;br /&gt;
						{&lt;br /&gt;
							translationCache = (translationCache=[]) + translationCache + [lanpair, recepID, cacheTime];&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				if (translationCache != [])&lt;br /&gt;
				{&lt;br /&gt;
					integer w;&lt;br /&gt;
					for (w = 0; w &amp;lt; llGetListLength(translationCache); w += 3)&lt;br /&gt;
					{&lt;br /&gt;
						lanpair = llList2String(translationCache, w);&lt;br /&gt;
						recep = llList2String(translationCache, w + 1);&lt;br /&gt;
						tomali = [lstr, lanpair, recep];&lt;br /&gt;
						request = List2TypeSep(tomali);&lt;br /&gt;
						llMessageLinked(LINK_THIS,2346017,request,id);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				lstliPos2 = llListFindList(agentsInTranslation, (list)llGetOwner());&lt;br /&gt;
				if (~llListFindList(agentsInTranslation, (list)id))&lt;br /&gt;
				{&lt;br /&gt;
					spkrLan = llList2String(agentsInTranslation, txPos + 1);&lt;br /&gt;
					recepID = llList2Integer(agentsInTranslation, lstliPos2 + 4);&lt;br /&gt;
					recepLan = llList2String(agentsInTranslation, lstliPos2 + 1);&lt;br /&gt;
					if (spkrLan == recepLan)&lt;br /&gt;
					{ }&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
						if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
						{&lt;br /&gt;
							lstliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
							translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
						}&lt;br /&gt;
						else&lt;br /&gt;
						{&lt;br /&gt;
							translationCache = (translationCache=[]) + translationCache + [ lanpair, recepID, cacheTime ];&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				if (translationCache != [])&lt;br /&gt;
				{    // Process Requests&lt;br /&gt;
					tomali = [lstr, lanpair, recepID];&lt;br /&gt;
					request = List2TypeSep(tomali);&lt;br /&gt;
					llMessageLinked(LINK_THIS,2346017,request,id);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	timer()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(0.0);&lt;br /&gt;
		float timeElapsed;&lt;br /&gt;
		list newList;&lt;br /&gt;
		integer r;&lt;br /&gt;
		for (r = 0; r &amp;lt; llGetListLength(translationCache); r += 3)&lt;br /&gt;
		{&lt;br /&gt;
			timeElapsed = llGetTime() - llList2Float(translationCache, r + 2);&lt;br /&gt;
			if (timeElapsed &amp;lt; 10.0)&lt;br /&gt;
			{&lt;br /&gt;
				newList = (newList=[]) + newList + llList2List(translationCache, r, r + 2);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		translationCache = newList;&lt;br /&gt;
		newList = [];&lt;br /&gt;
		llMessageLinked(LINK_THIS,9876754,&amp;quot;&amp;quot;,NULL_KEY);&lt;br /&gt;
		llSetTimerEvent(12.0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Translator&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
list paramtmpli;&lt;br /&gt;
list recepientList;&lt;br /&gt;
list requestedTranslations;&lt;br /&gt;
list forli;&lt;br /&gt;
list txli;&lt;br /&gt;
list txli2;&lt;br /&gt;
list lkli;&lt;br /&gt;
string SEPARATOR = &amp;quot;|%&amp;amp;|&amp;quot;;&lt;br /&gt;
string recepientLanguage;&lt;br /&gt;
string languagePair;&lt;br /&gt;
string speakerName;&lt;br /&gt;
string speakerLanguage;&lt;br /&gt;
string translatedText;&lt;br /&gt;
string lantmpStr;&lt;br /&gt;
string lmsg;&lt;br /&gt;
string llan;&lt;br /&gt;
string sendim;&lt;br /&gt;
string request;&lt;br /&gt;
string llid;&lt;br /&gt;
key speakerID;&lt;br /&gt;
key returnValue;&lt;br /&gt;
key tid;&lt;br /&gt;
integer tranObjects = TRUE;&lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
integer httliPos;&lt;br /&gt;
integer lmPos;&lt;br /&gt;
integer httbusy;&lt;br /&gt;
Translate(string chkmsg, list chkli)&lt;br /&gt;
{&lt;br /&gt;
	returnValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&amp;amp;q=&amp;quot; + llEscapeURL(chkmsg) + &amp;quot;&amp;amp;langpair=&amp;quot; + llList2String(chkli,2), [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot;&amp;quot;);&lt;br /&gt;
	if (returnValue != NULL_KEY)&lt;br /&gt;
	{&lt;br /&gt;
		requestedTranslations = (requestedTranslations=[]) + requestedTranslations + [returnValue];&lt;br /&gt;
		requestedTranslations = (requestedTranslations=[]) + requestedTranslations + chkli;&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		llOwnerSay(&amp;quot;ERROR ERROR ERROR ERROR ERRORR ERROOOORRRRR&amp;quot;);&lt;br /&gt;
		llOwnerSay(&amp;quot;All Go!&amp;quot;);&lt;br /&gt;
		llSleep(25.0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
string List2TypeSep(list input) {&lt;br /&gt;
	integer v;&lt;br /&gt;
	list output;&lt;br /&gt;
	for (v = 0; v &amp;lt; llGetListLength(input); v++) {&lt;br /&gt;
		output += [llGetListEntryType(input, v)] + llList2List(input, v, v);&lt;br /&gt;
	}&lt;br /&gt;
	return llDumpList2String(output, SEPARATOR);&lt;br /&gt;
}&lt;br /&gt;
list TypeSep2List(string inputstring)&lt;br /&gt;
{&lt;br /&gt;
	integer w;&lt;br /&gt;
	list input2;&lt;br /&gt;
	list output2;&lt;br /&gt;
	input2 = llParseString2List(inputstring, [SEPARATOR], []);&lt;br /&gt;
	for (w = 0; w &amp;lt; llGetListLength(input2); w += 2) {&lt;br /&gt;
		if (llList2Integer(input2, w) == TYPE_INTEGER) output2 += (integer)llList2String(input2, w + 1);&lt;br /&gt;
		else if (llList2Integer(input2, w) == TYPE_FLOAT) output2 += (float)llList2String(input2, w + 1);&lt;br /&gt;
		else if (llList2Integer(input2, w) == TYPE_STRING) output2 += llList2String(input2, w + 1);&lt;br /&gt;
		else if (llList2Integer(input2, w) == TYPE_KEY) output2 += (key)llList2String(input2, w + 1);&lt;br /&gt;
	}&lt;br /&gt;
	return output2;&lt;br /&gt;
}&lt;br /&gt;
//&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		httbusy=FALSE;&lt;br /&gt;
		llSetTimerEvent(1.0);&lt;br /&gt;
	}&lt;br /&gt;
	link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
	{&lt;br /&gt;
		if (num == 2346017)&lt;br /&gt;
		{&lt;br /&gt;
			if(httbusy==FALSE)&lt;br /&gt;
			{&lt;br /&gt;
				httbusy = TRUE;&lt;br /&gt;
				if (~llListFindList(txli2, (list)lstr))&lt;br /&gt;
				{&lt;br /&gt;
					lmPos = llListFindList(txli2, (list)lstr);&lt;br /&gt;
					txli2 = llDeleteSubList(txli2, lmPos, lmPos + 1);&lt;br /&gt;
					txli = TypeSep2List(lstr);&lt;br /&gt;
					lmsg = llList2String(txli,0);&lt;br /&gt;
					llan = llList2String(txli,1);&lt;br /&gt;
					llid = llList2String(txli,2);&lt;br /&gt;
					lkli = [ llGetTime(), lid, llan, llid ];&lt;br /&gt;
					Translate(lmsg,lkli);&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					txli = TypeSep2List(lstr);&lt;br /&gt;
					lmsg = llList2String(txli,0);&lt;br /&gt;
					llan = llList2String(txli,1);&lt;br /&gt;
					llid = llList2String(txli,2);&lt;br /&gt;
					lkli = [ llGetTime(), lid, llan, llid ];&lt;br /&gt;
					Translate(lmsg,lkli);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				if (~llListFindList(txli2, (list)lstr))&lt;br /&gt;
				{ }&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					txli2 = (txli2=[]) + txli2 + [lstr];&lt;br /&gt;
					txli2 = (txli2=[]) + txli2 + [lid];&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
	{   // Process Response Code&lt;br /&gt;
		if (~llListFindList(requestedTranslations, (list)request_id))&lt;br /&gt;
		{   // Translation&lt;br /&gt;
			httliPos = llListFindList(requestedTranslations, (list)request_id);&lt;br /&gt;
			speakerID  = llList2Key(requestedTranslations, httliPos + 2);&lt;br /&gt;
			speakerName = llKey2Name(speakerID);&lt;br /&gt;
			if (llStringLength(speakerName) &amp;lt; 3)&lt;br /&gt;
			{&lt;br /&gt;
				speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
			}&lt;br /&gt;
			recepientList = llParseString2List(llList2String(requestedTranslations, httliPos + 4),[&amp;quot;@&amp;quot;],[]);&lt;br /&gt;
			paramtmpli = llParseStringKeepNulls(llList2String(requestedTranslations, httliPos + 3),[&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
			speakerLanguage = llList2String(paramtmpli, 0);&lt;br /&gt;
			recepientLanguage = llList2String(paramtmpli, 1);&lt;br /&gt;
			languagePair = llDumpList2String(paramtmpli, &amp;quot;&amp;gt;&amp;gt;&amp;quot;);&lt;br /&gt;
			// Perform Text Cleanup&lt;br /&gt;
			translatedText = llGetSubString(body, llSubStringIndex(body, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(body, &amp;quot;}, \&amp;quot;responseDetails\&amp;quot;&amp;quot;) -1);&lt;br /&gt;
			// Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
			if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
			{&lt;br /&gt;
				lantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
				integer q;&lt;br /&gt;
				for(q = llStringLength(translatedText);q &amp;gt;= 0; q--)&lt;br /&gt;
				{&lt;br /&gt;
					lantmpStr = (lantmpStr=&amp;quot;&amp;quot;) + lantmpStr + llGetSubString(translatedText, q, q);&lt;br /&gt;
				}&lt;br /&gt;
				translatedText = lantmpStr;&lt;br /&gt;
			}&lt;br /&gt;
			lantmpStr = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
			integer z;&lt;br /&gt;
			integer reclen = llGetListLength(recepientList);&lt;br /&gt;
			for (z = 0; z &amp;lt; reclen; z += 1)&lt;br /&gt;
			{&lt;br /&gt;
				forli = [llList2Integer(recepientList, z), speakerLanguage , lantmpStr];&lt;br /&gt;
				sendim = List2TypeSep(forli);&lt;br /&gt;
				llMessageLinked(LINK_THIS,9827491,sendim,NULL_KEY);&lt;br /&gt;
			}&lt;br /&gt;
			requestedTranslations = llDeleteSubList(requestedTranslations, httliPos, httliPos + 4);&lt;br /&gt;
			httbusy = FALSE;&lt;br /&gt;
			llSetTimerEvent(1.0);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	timer()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(0.0);&lt;br /&gt;
		if(txli2 != [])&lt;br /&gt;
		{&lt;br /&gt;
			integer m;&lt;br /&gt;
			integer lleng = llGetListLength(txli2);&lt;br /&gt;
			for (m = 0; m &amp;lt; lleng; m += 2)&lt;br /&gt;
			{&lt;br /&gt;
				request = llList2String(txli2, m);&lt;br /&gt;
				tid = llList2Key(txli2, m + 1);&lt;br /&gt;
				llMessageLinked(LINK_THIS,2346017,request,tid);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		float timeElapsed;&lt;br /&gt;
		list newList;&lt;br /&gt;
		integer r;&lt;br /&gt;
		for (r = 0; r &amp;lt; llGetListLength(requestedTranslations); r += 6)&lt;br /&gt;
		{&lt;br /&gt;
			timeElapsed = llGetTime() - llList2Float(requestedTranslations, r + 1);&lt;br /&gt;
			if (timeElapsed &amp;lt; 20.0)&lt;br /&gt;
			{&lt;br /&gt;
				newList = (newList=[]) + newList + llList2List(requestedTranslations, r, r + 5);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		requestedTranslations = newList;&lt;br /&gt;
		newList = [];&lt;br /&gt;
		llSetTimerEvent(5.0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
IM handler&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// www.lsleditor.org  by Alphons van der Heijden (SL: Alphons Jano)&lt;br /&gt;
//(Mod made in Perry Mizin) I want to succeed with this translator... ;) call me day or night&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
integer echo;&lt;br /&gt;
list escape=[&amp;quot;\\u0026#39;&amp;quot; , &amp;quot;&#039;&amp;quot; , &amp;quot;\\u003d&amp;quot; , &amp;quot;=&amp;quot; , &amp;quot;\\u0026amp;&amp;quot; , &amp;quot;&amp;amp;&amp;quot; , &amp;quot;\\u0026lt;&amp;quot; , &amp;quot;&amp;lt;&amp;quot; , &amp;quot;\\u0026gt;&amp;quot; , &amp;quot;&amp;gt;&amp;quot; , &amp;quot;\\u0026quot;&amp;quot; , &amp;quot;\&amp;quot;&amp;quot;];&lt;br /&gt;
string Escape(string text)&lt;br /&gt;
{&lt;br /&gt;
    integer i; string result;&lt;br /&gt;
    list t=llParseString2List(text,[],[&amp;quot;\\u0026#39;&amp;quot;,&amp;quot;\\u003d&amp;quot;,&amp;quot;\\u0026amp;&amp;quot;,&amp;quot;\\u0026lt;&amp;quot;,&amp;quot;\\u0026gt;&amp;quot;,&amp;quot;\\u0026quot;&amp;quot;]);&lt;br /&gt;
    for(i=0;i&amp;lt;llGetListLength(t);i++)&lt;br /&gt;
    {&lt;br /&gt;
        integer ii=llListFindList(escape,[llList2String(t,i)]);&lt;br /&gt;
        if(ii!=-1)&lt;br /&gt;
        {&lt;br /&gt;
            t=llListReplaceList(t,[llList2String(escape,ii+1)],i,i);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    result=llDumpList2String(t,&amp;quot;&amp;quot;);&lt;br /&gt;
    return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sendim(string mess, key target)&lt;br /&gt;
{&lt;br /&gt;
    if (llGetAgentSize(target) == ZERO_VECTOR)&lt;br /&gt;
    { }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llInstantMessage(target, llUnescapeURL(mess));&lt;br /&gt;
        if(echo==TRUE)&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(mess + &amp;quot; @&amp;quot; + llKey2Name(target));&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        echo=FALSE;&lt;br /&gt;
        llSleep(0.1);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    link_message(integer sender_num, integer num, string str, key id)&lt;br /&gt;
    {&lt;br /&gt;
        if (num == 2334420)&lt;br /&gt;
        {&lt;br /&gt;
            sendim(Escape(str),id);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if (num == 8872932)&lt;br /&gt;
        {&lt;br /&gt;
            if(str==&amp;quot;echon&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                echo=TRUE;&lt;br /&gt;
            }&lt;br /&gt;
            if(str==&amp;quot;echoff&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                echo=FALSE;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=995562</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=995562"/>
		<updated>2010-08-06T11:30:13Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribución al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente código fué originálmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mí manera...&lt;br /&gt;
No ós riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;OK&#039;&#039; ===&lt;br /&gt;
Bueno, despues de respiñar todo lo que pude, creo que el uso de memoria y la velocidad están prácticamente igual qué en la versión original pero bueno... en la variedad está el gusto no?&lt;br /&gt;
Ya he probado un poco el código, y parece que funciona aunque estoy teniendo algunos problemas... Por ejemplo creo que el sistema de traduccion no funciona corréctamente, y no me refiero al sistema de traduccion de Google (en mi opinion, si no es el mejor, es uno de los mejores del mundo), sino a que aún queda mucho trabajo por hacer en el script...&lt;br /&gt;
&lt;br /&gt;
El siguiente paso sera intentar dividir el script en dos, o si es posible en tres para repartir el uso de memoria. Tambien me gustaria probar un truco que uso a menudo para traducir páginas en un idioma que no entiendo, lo que hago es que en vez de traducir diréctamente al español, primero se traduce a inglés, y luego desde inglés al español. Parece una tontería y un gasto innecesario, pero si lo hago es porque así suelo entender mejor las traducciones.&lt;br /&gt;
Quiero por un lado el sistema de comunicacion y evaluacion entre traductores, y por otro el sistema de traduccion entre avatares, ¿es muy dificil? no sé ya lo veremos...&lt;br /&gt;
&lt;br /&gt;
Well, after saving as much as I could, I think the memory usage and the speed are technically the same as in the original script, but well, in the variety is the taste, isnt it?. &lt;br /&gt;
I have tested a bit the code above already, and it seems to work altought i´m having some problems...&lt;br /&gt;
For instance i think the translation system is not working properly, and i dont mean the Google´s translation system (in my opinion, if is not the best, one of the bests), but that there is still much work to do in the script...&lt;br /&gt;
&lt;br /&gt;
The next step will be to try to divide the script in 2, or 3 if is possible, so we can spread the memory usage. Also I would like to test a trick i use often for to translate languages that i dont understand, what I do first is to translate that language into English, and then from English to Spanish, it seems a nonsense and unnecesary waste, but if i do it is becouse so i usually understand the translations better.&lt;br /&gt;
I want by one part the translators communications and evaluation system, and by other the translation system between avatars, is it very difficult? I don´t know , we will see...&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Es dificil... me está costando pero ya veremos...&lt;br /&gt;
Its difficult... i am struggling but we will see...&lt;br /&gt;
&lt;br /&gt;
chu chu chu&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
De Güatemala a Güatepeor, Sin comentarios...&lt;br /&gt;
&lt;br /&gt;
From Güatebad to Güateworse, No comments...&lt;br /&gt;
&lt;br /&gt;
Buscando en Internet he encontrado este [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html API de Yahoo] comprobador de ortografía, aunque creo que por ahora sólo soporta el lenguage inglés pero sería interesante añadirlo al proyecto&lt;br /&gt;
&lt;br /&gt;
Searching on the web I crossed in my way with this spell checker [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html Yahoo´s API] , I think that it only supports English language by now althought it would be interesting to add it to the project&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Estoy probando el comprobador de deletreo de Yahoo aunque la verdad es que no estoy teniendo buenos resultados, parece que Google es mucho más rapido y necesito corregir antes de traducir. También estoy intentando solucionar el error que aparece con el símbolo (apostrofe) ´ en las frases con genitivo sajon traducidas al inglés y tampoco doy con la tecla... Ya que esto me está dando muchos dolores de cabeza quizás deje el proyecto en standby hasta después de navidades.&lt;br /&gt;
&lt;br /&gt;
I am testing the Yahoo´s spell checker althought to be honest I´m not having good success, it seems Google is much faster and I need to correct before translate. Also I am triying to fix the error showed in the phrases translated to English with the saxons genitive apostrophe ´ and still triying and triying. As this is driving me nuts, maybe I will leave the project in standby until new year.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ESTO ES EL TRADUCTOR &amp;quot;un lío&amp;quot; por ahora... Necesito rehacer algunas cosas&lt;br /&gt;
&lt;br /&gt;
THIS IS THE TRANSLATOR &amp;quot;mess&amp;quot; by now... I need to redo some things&lt;br /&gt;
&#039;&#039;&#039;THE CODE BELOW IS WORKING AND BEING TESTED&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
THIS IS AN ALPHA VERSION OF THE PERRYSONAL TRANSLATOR...&lt;br /&gt;
NOTHING MORE TO SAY&lt;br /&gt;
&lt;br /&gt;
Menu&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Mod Made in Perry Mizin&lt;br /&gt;
//This is the interface, or menu-system of the translator.&lt;br /&gt;
//Menu System&lt;br /&gt;
//Copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Variables&lt;br /&gt;
integer randomDialogChannel;&lt;br /&gt;
//Options&lt;br /&gt;
integer enabled = TRUE;&lt;br /&gt;
integer isShowTran = FALSE;&lt;br /&gt;
integer tranObjects = TRUE;&lt;br /&gt;
//Functions&lt;br /&gt;
showMainMenu(key id)&lt;br /&gt;
{&lt;br /&gt;
	list buttonList = [];&lt;br /&gt;
	string dialogMsg = &amp;quot;Options Menu.&amp;quot;;&lt;br /&gt;
	if (id == llGetOwner())&lt;br /&gt;
	{&lt;br /&gt;
		if (enabled)&lt;br /&gt;
		{&lt;br /&gt;
			buttonList = (buttonList=[]) + buttonList + [&amp;quot;Turn OFF&amp;quot;];&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			buttonList = (buttonList=[]) + buttonList + [&amp;quot;Turn ON&amp;quot;];&lt;br /&gt;
		}&lt;br /&gt;
		if (isShowTran)&lt;br /&gt;
		{&lt;br /&gt;
			buttonList = (buttonList=[]) + buttonList + [&amp;quot;Echo OFF&amp;quot;];&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			buttonList = (buttonList=[]) + buttonList + [&amp;quot;Echo ON&amp;quot;];&lt;br /&gt;
		}&lt;br /&gt;
		buttonList = (buttonList=[]) + buttonList + [&amp;quot;RESET&amp;quot;];&lt;br /&gt;
		dialogMsg = (dialogMsg=&amp;quot;&amp;quot;) + dialogMsg + &amp;quot;\nECHO: show translations of your chat sent to others.&amp;quot;;&lt;br /&gt;
		if (tranObjects)&lt;br /&gt;
		{&lt;br /&gt;
			buttonList = (buttonList=[]) + buttonList + [&amp;quot;Objects OFF&amp;quot;];&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			buttonList = (buttonList=[]) + buttonList + [&amp;quot;Objects ON&amp;quot;];&lt;br /&gt;
		}&lt;br /&gt;
		dialogMsg = (dialogMsg=&amp;quot;&amp;quot;) + dialogMsg + &amp;quot;\nOBJECTS: translate chat of scripted objects&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	llDialog(id, dialogMsg, buttonList, randomDialogChannel);&lt;br /&gt;
}&lt;br /&gt;
processListen(string name, key id, string message)&lt;br /&gt;
{&lt;br /&gt;
	if (id == llGetOwner())&lt;br /&gt;
	{&lt;br /&gt;
		else if (message == &amp;quot;Turn ON&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			enabled  = TRUE;&lt;br /&gt;
			llMessageLinked(LINK_THIS, 8439932,&amp;quot;enable&amp;quot;, id);&lt;br /&gt;
		}&lt;br /&gt;
		else if (message == &amp;quot;Turn OFF&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			enabled  = FALSE;&lt;br /&gt;
			llMessageLinked(LINK_THIS, 8439932,&amp;quot;disable&amp;quot;, id);&lt;br /&gt;
		}&lt;br /&gt;
		else if (message == &amp;quot;Echo ON&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			isShowTran = TRUE;&lt;br /&gt;
			llMessageLinked(LINK_THIS, 8872932,&amp;quot;echon&amp;quot;, id);&lt;br /&gt;
		}&lt;br /&gt;
		else if (message == &amp;quot;Echo OFF&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			isShowTran = FALSE;&lt;br /&gt;
			llMessageLinked(LINK_THIS, 8872932,&amp;quot;echoff&amp;quot;, id);&lt;br /&gt;
		}&lt;br /&gt;
		else if (message == &amp;quot;Objects OFF&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			tranObjects = FALSE;&lt;br /&gt;
			llMessageLinked(LINK_THIS, 8439742,&amp;quot;objoff&amp;quot;, id);&lt;br /&gt;
		}&lt;br /&gt;
		else if (message == &amp;quot;Objects ON&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			tranObjects = TRUE;&lt;br /&gt;
			llMessageLinked(LINK_THIS, 8439742,&amp;quot;objon&amp;quot;, id);&lt;br /&gt;
		}&lt;br /&gt;
		else if (message == &amp;quot;RESET&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			llResetOtherScript(&amp;quot;agents&amp;quot;);&lt;br /&gt;
			llResetOtherScript(&amp;quot;form&amp;quot;);&lt;br /&gt;
			llResetOtherScript(&amp;quot;trans&amp;quot;);&lt;br /&gt;
			llResetOtherScript(&amp;quot;list&amp;quot;);&lt;br /&gt;
			llResetOtherScript(&amp;quot;lan&amp;quot;);&lt;br /&gt;
			llOwnerSay(&amp;quot;All Scripts are Resetted now...&amp;quot;);&lt;br /&gt;
			llResetScript();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
//&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		llOwnerSay(&amp;quot;Welcome to the Perrysonal Translator, probably the worst FREE translator in SL!&amp;quot;);&lt;br /&gt;
		randomDialogChannel = (integer)llFrand(2147483647);&lt;br /&gt;
		llMessageLinked(LINK_SET, 7563297, &amp;quot;XTRNSL&amp;quot;, NULL_KEY);&lt;br /&gt;
		//Other Setup&lt;br /&gt;
		llListen(randomDialogChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
		showMainMenu(llGetOwner());&lt;br /&gt;
	}&lt;br /&gt;
	on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
        // Reset script when the object is rezzed&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
	touch_start(integer total_number)&lt;br /&gt;
	{&lt;br /&gt;
		if(llDetectedKey(0) == llGetOwner())&lt;br /&gt;
		{&lt;br /&gt;
			showMainMenu(llGetOwner());&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	listen(integer channel, string name, key id, string message)&lt;br /&gt;
	{&lt;br /&gt;
		processListen(name,id,message);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Listener&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// www.lsleditor.org  by Alphons van der Heijden (SL: Alphons Jano)&lt;br /&gt;
//(Mod made in Perry Mizin) I want to succeed with this translator... ;) call me day or night&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//listener&lt;br /&gt;
integer tranObjects = TRUE;&lt;br /&gt;
integer enabled = TRUE;&lt;br /&gt;
key restricted;&lt;br /&gt;
key owner;&lt;br /&gt;
//&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		owner = llGetOwner();&lt;br /&gt;
		llListen(0,&amp;quot;&amp;quot;,NULL_KEY,&amp;quot;&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
        // Reset script when the object is rezzed&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
	link_message(integer sender_num, integer num, string str, key id)&lt;br /&gt;
	{&lt;br /&gt;
		if (num == 8439932)&lt;br /&gt;
		{&lt;br /&gt;
			if(str==&amp;quot;enable&amp;quot;)&lt;br /&gt;
			{&lt;br /&gt;
				enabled = TRUE;&lt;br /&gt;
			}&lt;br /&gt;
			else if(str==&amp;quot;disable&amp;quot;)&lt;br /&gt;
			{&lt;br /&gt;
				enabled = FALSE;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if (num == 8439742)&lt;br /&gt;
		{&lt;br /&gt;
			if(str==&amp;quot;objon&amp;quot;)&lt;br /&gt;
			{&lt;br /&gt;
				tranObjects = TRUE;&lt;br /&gt;
			}&lt;br /&gt;
			else if(str==&amp;quot;objoff&amp;quot;)&lt;br /&gt;
			{&lt;br /&gt;
				tranObjects = FALSE;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	listen(integer channel, string name, key id, string message)&lt;br /&gt;
	{&lt;br /&gt;
		if(channel==PUBLIC_CHANNEL)&lt;br /&gt;
		{&lt;br /&gt;
			if (!enabled)&lt;br /&gt;
			{&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			if (restricted==id)&lt;br /&gt;
			{&lt;br /&gt;
				llSetTimerEvent(0.0);&lt;br /&gt;
				restricted = id;&lt;br /&gt;
				llSetTimerEvent(0.7);&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			if (!tranObjects)&lt;br /&gt;
			{&lt;br /&gt;
				if (llGetAgentSize(id) == ZERO_VECTOR)&lt;br /&gt;
				{&lt;br /&gt;
					return;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			if (llStringLength(message) &amp;lt; 12)&lt;br /&gt;
			{&lt;br /&gt;
				llMessageLinked(LINK_THIS,98745920,message,id);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				llMessageLinked(LINK_THIS,7686795,message,id);&lt;br /&gt;
				llMessageLinked(LINK_THIS,98745920,message,id);&lt;br /&gt;
			}&lt;br /&gt;
			llSetTimerEvent(0.7);&lt;br /&gt;
			restricted = id;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	timer()&lt;br /&gt;
	{&lt;br /&gt;
		restricted = NULL_KEY;&lt;br /&gt;
		llSetTimerEvent(0.0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
agentsinTranslation&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
key owner;&lt;br /&gt;
key speaker;&lt;br /&gt;
key sid;&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
list tmrli;&lt;br /&gt;
list newList;&lt;br /&gt;
integer listenID;&lt;br /&gt;
integer tmpavliPos;&lt;br /&gt;
integer ownerliPos;&lt;br /&gt;
vector tmrVct;&lt;br /&gt;
string actlan;&lt;br /&gt;
string tmplan;&lt;br /&gt;
string spkLan;&lt;br /&gt;
string SEPARATOR = &amp;quot;|%&amp;amp;|&amp;quot;;&lt;br /&gt;
string mylanguage;&lt;br /&gt;
string checkLanguage(string chklantmpStr)&lt;br /&gt;
{&lt;br /&gt;
	if (chklantmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;en&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	else if (chklantmpStr == &amp;quot;und&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;el&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	else if (chklantmpStr == &amp;quot;Gh&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;en&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	if (llGetSubString(chklantmpStr, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = llGetSubString(chklantmpStr, 0, 1);&lt;br /&gt;
	}&lt;br /&gt;
	return chklantmpStr;&lt;br /&gt;
}&lt;br /&gt;
string addNewAgent(key newavid)&lt;br /&gt;
{&lt;br /&gt;
	string speakerLan;&lt;br /&gt;
	if (llGetAgentSize(newavid) == ZERO_VECTOR)&lt;br /&gt;
	{&lt;br /&gt;
		speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		speakerLan  = checkLanguage(llGetAgentLanguage(newavid));&lt;br /&gt;
		if (speakerLan == &amp;quot;&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
			addAgent(newavid, speakerLan, 0);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			addAgent(newavid, speakerLan, 0);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return speakerLan;&lt;br /&gt;
}&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
	if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
	{&lt;br /&gt;
		integer gkliPos = llListFindList(agentsInTranslation, (list)agentID);&lt;br /&gt;
		return llList2Key(agentsInTranslation, gkliPos - 4);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		return NULL_KEY;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
string List2TypeSep(list input2) {&lt;br /&gt;
	integer w;&lt;br /&gt;
	list output2;&lt;br /&gt;
	for (w = 0; w &amp;lt; llGetListLength(input2); w++) {&lt;br /&gt;
		output2 += [llGetListEntryType(input2, w)] + llList2List(input2, w, w);&lt;br /&gt;
	}&lt;br /&gt;
	return llDumpList2String(output2, SEPARATOR);&lt;br /&gt;
}&lt;br /&gt;
list TypeSep2List(string inputstring) {&lt;br /&gt;
	integer v;&lt;br /&gt;
	list input;&lt;br /&gt;
	list output;&lt;br /&gt;
	input = llParseString2List(inputstring, [SEPARATOR], []);&lt;br /&gt;
	for (v = 0; v &amp;lt; llGetListLength(input); v += 2) {&lt;br /&gt;
		if (llList2Integer(input, v) == TYPE_INTEGER) output += (integer)llList2String(input, v + 1);&lt;br /&gt;
		else if (llList2Integer(input, v) == TYPE_FLOAT) output += (float)llList2String(input, v + 1);&lt;br /&gt;
		else if (llList2Integer(input, v) == TYPE_STRING) output += llList2String(input, v + 1);&lt;br /&gt;
		else if (llList2Integer(input, v) == TYPE_KEY) output += (key)llList2String(input, v + 1);&lt;br /&gt;
	}&lt;br /&gt;
	return output;&lt;br /&gt;
}&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
	integer avliPos;&lt;br /&gt;
	integer idNum;&lt;br /&gt;
	if (~llListFindList(agentsInTranslation, (list)avid))&lt;br /&gt;
	{&lt;br /&gt;
		avliPos = llListFindList(agentsInTranslation, (list)avid);&lt;br /&gt;
		agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, avlan, chklan], avliPos + 1, avliPos + 3);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		@at;&lt;br /&gt;
		idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
		if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
		{&lt;br /&gt;
			jump at;&lt;br /&gt;
		}&lt;br /&gt;
		agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, avlan, chklan, idNum];&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
//&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		owner = llGetOwner();&lt;br /&gt;
		listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
		mylanguage = llGetAgentLanguage(owner);&lt;br /&gt;
		if (llStringLength(mylanguage) &amp;lt; 1)&lt;br /&gt;
		{&lt;br /&gt;
			mylanguage = &amp;quot;en&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		if(~llListFindList(agentsInTranslation, (list)owner))&lt;br /&gt;
		{&lt;br /&gt;
			ownerliPos = llListFindList(agentsInTranslation, (list)owner);&lt;br /&gt;
			agentsInTranslation = llListReplaceList(agentsInTranslation, [mylanguage] , ownerliPos + 1, ownerliPos + 1);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [owner, mylanguage, mylanguage, 0, llRound(llFrand(2000000)) + 1];&lt;br /&gt;
		}&lt;br /&gt;
		llSetTimerEvent(1.0);&lt;br /&gt;
	}&lt;br /&gt;
	link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
	{&lt;br /&gt;
		if (num == 6349160)&lt;br /&gt;
		{&lt;br /&gt;
			speaker = lid;&lt;br /&gt;
			spkLan = lstr;&lt;br /&gt;
			if (~llListFindList(agentsInTranslation, (list)speaker))&lt;br /&gt;
			{&lt;br /&gt;
				tmpavliPos = llListFindList(agentsInTranslation, (list)speaker);&lt;br /&gt;
				actlan = llList2String(agentsInTranslation, tmpavliPos + 1);&lt;br /&gt;
				tmplan = llList2String(agentsInTranslation, tmpavliPos + 2);&lt;br /&gt;
				if (llList2Integer(agentsInTranslation, tmpavliPos + 3) &amp;gt;= 2)&lt;br /&gt;
				{   // if anyone speaks on any different language 3 times in a row&lt;br /&gt;
					addAgent(lid, lstr, 0);&lt;br /&gt;
				}&lt;br /&gt;
				if (actlan == lstr)&lt;br /&gt;
				{   // reset language checker for speaker&lt;br /&gt;
					agentsInTranslation = llListReplaceList(agentsInTranslation, [actlan, 0], tmpavliPos + 2, tmpavliPos + 3);&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					if (lstr == tmplan)&lt;br /&gt;
					{   // if language of speaker is not the same as detected language&lt;br /&gt;
						agentsInTranslation = llListReplaceList(agentsInTranslation,[llList2Integer(agentsInTranslation,tmpavliPos + 3) + 1] , tmpavliPos + 3, tmpavliPos + 3);&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						agentsInTranslation = llListReplaceList(agentsInTranslation,[lstr, 0] , tmpavliPos + 2, tmpavliPos + 3);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if (num == 9876754)&lt;br /&gt;
		{&lt;br /&gt;
			llMessageLinked(LINK_THIS,7659759,List2TypeSep(agentsInTranslation),NULL_KEY);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	listen(integer channel, string name, key id, string message)&lt;br /&gt;
	{&lt;br /&gt;
		if(~llListFindList(agentsInTranslation, (list)id))&lt;br /&gt;
		{ }&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			addNewAgent(id);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	sensor(integer num_detected)&lt;br /&gt;
	{&lt;br /&gt;
		integer s;&lt;br /&gt;
		for (s = 0; s &amp;lt; num_detected; s += 1)&lt;br /&gt;
		{&lt;br /&gt;
			sid = llDetectedKey(s);&lt;br /&gt;
			if (~llListFindList(agentsInTranslation, (list)sid))&lt;br /&gt;
			{ }&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				addNewAgent(sid);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	no_sensor()&lt;br /&gt;
	{ }&lt;br /&gt;
	timer()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(0.0);&lt;br /&gt;
		integer r;&lt;br /&gt;
		for (r = 0; r &amp;lt; llGetListLength(agentsInTranslation); r += 5)&lt;br /&gt;
		{&lt;br /&gt;
			tmrli = llGetObjectDetails(llList2Key(agentsInTranslation, r), [OBJECT_POS]);&lt;br /&gt;
			tmrVct = llList2Vector(tmrli, 0);&lt;br /&gt;
			if (tmrVct == ZERO_VECTOR)&lt;br /&gt;
			{  }&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				if (llVecDist(llGetPos(), tmrVct) &amp;lt;= 20.0)&lt;br /&gt;
				{&lt;br /&gt;
					newList = (newList=[]) + newList + llList2List(agentsInTranslation, r, r + 4);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		agentsInTranslation = newList;&lt;br /&gt;
		newList = [];&lt;br /&gt;
		llSensor(&amp;quot;&amp;quot;,NULL_KEY,AGENT,20.0,PI);&lt;br /&gt;
		llSetTimerEvent(6.0);   // restart timer&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
DetectLanguage&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
key dtcValue;&lt;br /&gt;
key speakerID;&lt;br /&gt;
string htttmpStr;&lt;br /&gt;
list tempDetections;&lt;br /&gt;
list newList;&lt;br /&gt;
float timeElapsed;&lt;br /&gt;
integer tmpliPos;&lt;br /&gt;
integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex&lt;br /&gt;
{&lt;br /&gt;
	return ~llSubStringIndex(haystack, needle);&lt;br /&gt;
}&lt;br /&gt;
DetectLanguage(string dtcmsg, key dtcid)&lt;br /&gt;
{&lt;br /&gt;
	dtcValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&amp;amp;q=&amp;quot; + llEscapeURL(dtcmsg), [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot; &amp;quot;);&lt;br /&gt;
	if (dtcValue != NULL_KEY)&lt;br /&gt;
	{&lt;br /&gt;
		tempDetections = (tempDetections=[]) + tempDetections + [dtcValue, dtcid, llGetTime()];&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		llSleep(10.0); // Something has gone horribly wrong, sleep 10 seconds clear throttle&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
//&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(5.0);&lt;br /&gt;
	}&lt;br /&gt;
	link_message(integer sender, integer num, string msg, key id)&lt;br /&gt;
	{&lt;br /&gt;
		if (num == 7686795)&lt;br /&gt;
		{&lt;br /&gt;
			DetectLanguage(msg, id);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
	{   // Process Response Code&lt;br /&gt;
		if (~llListFindList(tempDetections, (list)request_id))&lt;br /&gt;
		{   // Language Detection&lt;br /&gt;
			tmpliPos = llListFindList(tempDetections, (list)request_id);&lt;br /&gt;
			speakerID = llList2Key(tempDetections, tmpliPos + 1);&lt;br /&gt;
			tempDetections = llDeleteSubList(tempDetections, tmpliPos, tmpliPos + 2);&lt;br /&gt;
			htttmpStr = llToLower(llGetSubString(body, llSubStringIndex(body, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(body, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
			if (contains(htttmpStr, &amp;quot;err&amp;quot;) == 0 &amp;amp;&amp;amp; contains(htttmpStr, &amp;quot;unn&amp;quot;) == 0)&lt;br /&gt;
			{   // We Trust the Google system, the Google´s guys are good and I am sure they will keep improving :-)&lt;br /&gt;
				if(llStringLength(htttmpStr) &amp;lt;= 3)&lt;br /&gt;
				{&lt;br /&gt;
					llMessageLinked(LINK_THIS,6349160,htttmpStr,speakerID);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	timer()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(0.0);&lt;br /&gt;
		integer r;&lt;br /&gt;
		integer TliLen = llGetListLength(tempDetections);&lt;br /&gt;
		for (r = 0; r &amp;lt; TliLen; r += 3)&lt;br /&gt;
		{&lt;br /&gt;
			timeElapsed = llGetTime() - llList2Float(tempDetections, r + 2);&lt;br /&gt;
			if (timeElapsed &amp;gt; 10.0)&lt;br /&gt;
			{&lt;br /&gt;
				newList = (newList=[]) + newList + llList2List(tempDetections, r, r + 2);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		tempDetections = newList;&lt;br /&gt;
		newList = [];&lt;br /&gt;
		llSetTimerEvent(5.0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Formulator&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//Formulator Script&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
list txli;&lt;br /&gt;
list translationCache;&lt;br /&gt;
list tomali;&lt;br /&gt;
string SEPARATOR = &amp;quot;|%&amp;amp;|&amp;quot;;&lt;br /&gt;
string recepientLanguage;&lt;br /&gt;
string speakerLanguage;&lt;br /&gt;
string txmessage;&lt;br /&gt;
string  spkrLan;&lt;br /&gt;
string recep;&lt;br /&gt;
string  recepLan;&lt;br /&gt;
string  lanpair;&lt;br /&gt;
string request;&lt;br /&gt;
integer M = 1;&lt;br /&gt;
integer rxID;&lt;br /&gt;
integer recepID;&lt;br /&gt;
integer lstliPos;&lt;br /&gt;
integer lstliPos2;&lt;br /&gt;
integer txPos;&lt;br /&gt;
integer lint;&lt;br /&gt;
key recepientID;&lt;br /&gt;
float cacheTime;&lt;br /&gt;
sendIM(key imid, string imstr)&lt;br /&gt;
{&lt;br /&gt;
	if (M == 8)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_ALL_OTHERS,2334420,imstr,imid);&lt;br /&gt;
		M = 1;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 7)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_ALL_OTHERS,2334430,imstr,imid);&lt;br /&gt;
		M = 8;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 6)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_ALL_OTHERS,2334440,imstr,imid);&lt;br /&gt;
		M = 7;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 5)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_ALL_OTHERS,2334450,imstr,imid);&lt;br /&gt;
		M = 6;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 4)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_ALL_OTHERS,2334460,imstr,imid);&lt;br /&gt;
		M = 5;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 3)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_ALL_OTHERS,2334470,imstr,imid);&lt;br /&gt;
		M = 4;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 2)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_ALL_OTHERS,2334480,imstr,imid);&lt;br /&gt;
		M = 3;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 1)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_ALL_OTHERS,2334490,imstr,imid);&lt;br /&gt;
		M = 2;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
	if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
	{&lt;br /&gt;
		integer gkliPos = llListFindList(agentsInTranslation, (list)agentID);&lt;br /&gt;
		return llList2Key(agentsInTranslation, gkliPos - 4);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		return NULL_KEY;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
list TypeSep2List(string inputstring)&lt;br /&gt;
{&lt;br /&gt;
	integer h;&lt;br /&gt;
	list input;&lt;br /&gt;
	list output;&lt;br /&gt;
	input = llParseString2List(inputstring, [SEPARATOR], []);&lt;br /&gt;
	for (h = 0; h &amp;lt; llGetListLength(input); h += 2)&lt;br /&gt;
	{&lt;br /&gt;
		if (llList2Integer(input, h) == TYPE_INTEGER) output += (integer)llList2String(input, h + 1);&lt;br /&gt;
		else if (llList2Integer(input, h) == TYPE_FLOAT) output += (float)llList2String(input, h + 1);&lt;br /&gt;
		else if (llList2Integer(input, h) == TYPE_STRING) output += llList2String(input, h + 1);&lt;br /&gt;
		else if (llList2Integer(input, h) == TYPE_KEY) output += (key)llList2String(input, h + 1);&lt;br /&gt;
	}&lt;br /&gt;
	return output;&lt;br /&gt;
}&lt;br /&gt;
string List2TypeSep(list input2)&lt;br /&gt;
{&lt;br /&gt;
	integer l;&lt;br /&gt;
	list output2;&lt;br /&gt;
	for (l = 0; l &amp;lt; llGetListLength(input2); l++)&lt;br /&gt;
	{&lt;br /&gt;
		output2 += [llGetListEntryType(input2, l)] + llList2List(input2, l, l);&lt;br /&gt;
	}&lt;br /&gt;
	return llDumpList2String(output2, SEPARATOR);&lt;br /&gt;
}&lt;br /&gt;
//&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(1.0);&lt;br /&gt;
	}&lt;br /&gt;
	link_message(integer sender_num, integer num, string lstr, key id)&lt;br /&gt;
	{&lt;br /&gt;
		if (num == 7659759)&lt;br /&gt;
		{&lt;br /&gt;
			agentsInTranslation = TypeSep2List(lstr);&lt;br /&gt;
		}&lt;br /&gt;
		if (num == 9827491)&lt;br /&gt;
		{&lt;br /&gt;
			txli = TypeSep2List(lstr);&lt;br /&gt;
			rxID = llList2Integer(txli,0);&lt;br /&gt;
			speakerLanguage = llList2String(txli,1);&lt;br /&gt;
			txmessage = llList2String(txli,2);&lt;br /&gt;
			lint = llListFindList(agentsInTranslation, (list)rxID);&lt;br /&gt;
			recepientLanguage = llList2String(agentsInTranslation, lint - 3);&lt;br /&gt;
			recepientID = getAgentKey(rxID);&lt;br /&gt;
			if (recepientID != NULL_KEY)&lt;br /&gt;
			{&lt;br /&gt;
				if (recepientLanguage == speakerLanguage)&lt;br /&gt;
				{ }&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					sendIM(recepientID,txmessage);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if (num == 98745920)&lt;br /&gt;
		{&lt;br /&gt;
			txPos = llListFindList(agentsInTranslation, (list)id);&lt;br /&gt;
			cacheTime = llGetTime();&lt;br /&gt;
			if(id==llGetOwner())&lt;br /&gt;
			{&lt;br /&gt;
				integer v;&lt;br /&gt;
				integer agentslilen = llGetListLength(agentsInTranslation);&lt;br /&gt;
				for (v = 0; v &amp;lt; agentslilen; v += 5)&lt;br /&gt;
				{&lt;br /&gt;
					spkrLan = llList2String(agentsInTranslation, txPos + 1);&lt;br /&gt;
					recepID = llList2Integer(agentsInTranslation, v + 4);&lt;br /&gt;
					recepLan = llList2String(agentsInTranslation, v + 1);&lt;br /&gt;
					if (spkrLan == recepLan)&lt;br /&gt;
					{ }&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
						if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
						{&lt;br /&gt;
							lstliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
							translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
						}&lt;br /&gt;
						else&lt;br /&gt;
						{&lt;br /&gt;
							translationCache = (translationCache=[]) + translationCache + [lanpair, recepID, cacheTime];&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				if (translationCache != [])&lt;br /&gt;
				{&lt;br /&gt;
					integer w;&lt;br /&gt;
					for (w = 0; w &amp;lt; llGetListLength(translationCache); w += 3)&lt;br /&gt;
					{&lt;br /&gt;
						lanpair = llList2String(translationCache, w);&lt;br /&gt;
						recep = llList2String(translationCache, w + 1);&lt;br /&gt;
						tomali = [lstr, lanpair, recep];&lt;br /&gt;
						request = List2TypeSep(tomali);&lt;br /&gt;
						llMessageLinked(LINK_THIS,2346017,request,id);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				lstliPos2 = llListFindList(agentsInTranslation, (list)llGetOwner());&lt;br /&gt;
				if (~llListFindList(agentsInTranslation, (list)id))&lt;br /&gt;
				{&lt;br /&gt;
					spkrLan = llList2String(agentsInTranslation, txPos + 1);&lt;br /&gt;
					recepID = llList2Integer(agentsInTranslation, lstliPos2 + 4);&lt;br /&gt;
					recepLan = llList2String(agentsInTranslation, lstliPos2 + 1);&lt;br /&gt;
					if (spkrLan == recepLan)&lt;br /&gt;
					{ }&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
						if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
						{&lt;br /&gt;
							lstliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
							translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
						}&lt;br /&gt;
						else&lt;br /&gt;
						{&lt;br /&gt;
							translationCache = (translationCache=[]) + translationCache + [ lanpair, recepID, cacheTime ];&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				if (translationCache != [])&lt;br /&gt;
				{    // Process Requests&lt;br /&gt;
					tomali = [lstr, lanpair, recepID];&lt;br /&gt;
					request = List2TypeSep(tomali);&lt;br /&gt;
					llMessageLinked(LINK_THIS,2346017,request,id);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	timer()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(0.0);&lt;br /&gt;
		float timeElapsed;&lt;br /&gt;
		list newList;&lt;br /&gt;
		integer r;&lt;br /&gt;
		for (r = 0; r &amp;lt; llGetListLength(translationCache); r += 3)&lt;br /&gt;
		{&lt;br /&gt;
			timeElapsed = llGetTime() - llList2Float(translationCache, r + 2);&lt;br /&gt;
			if (timeElapsed &amp;lt; 10.0)&lt;br /&gt;
			{&lt;br /&gt;
				newList = (newList=[]) + newList + llList2List(translationCache, r, r + 2);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		translationCache = newList;&lt;br /&gt;
		newList = [];&lt;br /&gt;
		llMessageLinked(LINK_THIS,9876754,&amp;quot;&amp;quot;,NULL_KEY);&lt;br /&gt;
		llSetTimerEvent(12.0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Translator&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
list paramtmpli;&lt;br /&gt;
list recepientList;&lt;br /&gt;
list requestedTranslations;&lt;br /&gt;
list forli;&lt;br /&gt;
list txli;&lt;br /&gt;
list txli2;&lt;br /&gt;
list lkli;&lt;br /&gt;
string SEPARATOR = &amp;quot;|%&amp;amp;|&amp;quot;;&lt;br /&gt;
string recepientLanguage;&lt;br /&gt;
string languagePair;&lt;br /&gt;
string speakerName;&lt;br /&gt;
string speakerLanguage;&lt;br /&gt;
string translatedText;&lt;br /&gt;
string lantmpStr;&lt;br /&gt;
string lmsg;&lt;br /&gt;
string llan;&lt;br /&gt;
string sendim;&lt;br /&gt;
string request;&lt;br /&gt;
string llid;&lt;br /&gt;
key speakerID;&lt;br /&gt;
key returnValue;&lt;br /&gt;
key tid;&lt;br /&gt;
integer tranObjects = TRUE;&lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
integer httliPos;&lt;br /&gt;
integer lmPos;&lt;br /&gt;
integer httbusy;&lt;br /&gt;
Translate(string chkmsg, list chkli)&lt;br /&gt;
{&lt;br /&gt;
	returnValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&amp;amp;q=&amp;quot; + llEscapeURL(chkmsg) + &amp;quot;&amp;amp;langpair=&amp;quot; + llList2String(chkli,2), [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot;&amp;quot;);&lt;br /&gt;
	if (returnValue != NULL_KEY)&lt;br /&gt;
	{&lt;br /&gt;
		requestedTranslations = (requestedTranslations=[]) + requestedTranslations + [returnValue];&lt;br /&gt;
		requestedTranslations = (requestedTranslations=[]) + requestedTranslations + chkli;&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		llOwnerSay(&amp;quot;ERROR ERROR ERROR ERROR ERRORR ERROOOORRRRR&amp;quot;);&lt;br /&gt;
		llOwnerSay(&amp;quot;All Go!&amp;quot;);&lt;br /&gt;
		llSleep(25.0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
string List2TypeSep(list input) {&lt;br /&gt;
	integer v;&lt;br /&gt;
	list output;&lt;br /&gt;
	for (v = 0; v &amp;lt; llGetListLength(input); v++) {&lt;br /&gt;
		output += [llGetListEntryType(input, v)] + llList2List(input, v, v);&lt;br /&gt;
	}&lt;br /&gt;
	return llDumpList2String(output, SEPARATOR);&lt;br /&gt;
}&lt;br /&gt;
list TypeSep2List(string inputstring)&lt;br /&gt;
{&lt;br /&gt;
	integer w;&lt;br /&gt;
	list input2;&lt;br /&gt;
	list output2;&lt;br /&gt;
	input2 = llParseString2List(inputstring, [SEPARATOR], []);&lt;br /&gt;
	for (w = 0; w &amp;lt; llGetListLength(input2); w += 2) {&lt;br /&gt;
		if (llList2Integer(input2, w) == TYPE_INTEGER) output2 += (integer)llList2String(input2, w + 1);&lt;br /&gt;
		else if (llList2Integer(input2, w) == TYPE_FLOAT) output2 += (float)llList2String(input2, w + 1);&lt;br /&gt;
		else if (llList2Integer(input2, w) == TYPE_STRING) output2 += llList2String(input2, w + 1);&lt;br /&gt;
		else if (llList2Integer(input2, w) == TYPE_KEY) output2 += (key)llList2String(input2, w + 1);&lt;br /&gt;
	}&lt;br /&gt;
	return output2;&lt;br /&gt;
}&lt;br /&gt;
//&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		httbusy=FALSE;&lt;br /&gt;
		llSetTimerEvent(1.0);&lt;br /&gt;
	}&lt;br /&gt;
	link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
	{&lt;br /&gt;
		if (num == 2346017)&lt;br /&gt;
		{&lt;br /&gt;
			if(httbusy==FALSE)&lt;br /&gt;
			{&lt;br /&gt;
				httbusy = TRUE;&lt;br /&gt;
				if (~llListFindList(txli2, (list)lstr))&lt;br /&gt;
				{&lt;br /&gt;
					lmPos = llListFindList(txli2, (list)lstr);&lt;br /&gt;
					txli2 = llDeleteSubList(txli2, lmPos, lmPos + 1);&lt;br /&gt;
					txli = TypeSep2List(lstr);&lt;br /&gt;
					lmsg = llList2String(txli,0);&lt;br /&gt;
					llan = llList2String(txli,1);&lt;br /&gt;
					llid = llList2String(txli,2);&lt;br /&gt;
					lkli = [ llGetTime(), lid, llan, llid ];&lt;br /&gt;
					Translate(lmsg,lkli);&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					txli = TypeSep2List(lstr);&lt;br /&gt;
					lmsg = llList2String(txli,0);&lt;br /&gt;
					llan = llList2String(txli,1);&lt;br /&gt;
					llid = llList2String(txli,2);&lt;br /&gt;
					lkli = [ llGetTime(), lid, llan, llid ];&lt;br /&gt;
					Translate(lmsg,lkli);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				if (~llListFindList(txli2, (list)lstr))&lt;br /&gt;
				{ }&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					txli2 = (txli2=[]) + txli2 + [lstr];&lt;br /&gt;
					txli2 = (txli2=[]) + txli2 + [lid];&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
	{   // Process Response Code&lt;br /&gt;
		if (~llListFindList(requestedTranslations, (list)request_id))&lt;br /&gt;
		{   // Translation&lt;br /&gt;
			httliPos = llListFindList(requestedTranslations, (list)request_id);&lt;br /&gt;
			speakerID  = llList2Key(requestedTranslations, httliPos + 2);&lt;br /&gt;
			speakerName = llKey2Name(speakerID);&lt;br /&gt;
			if (llStringLength(speakerName) &amp;lt; 3)&lt;br /&gt;
			{&lt;br /&gt;
				speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
			}&lt;br /&gt;
			recepientList = llParseString2List(llList2String(requestedTranslations, httliPos + 4),[&amp;quot;@&amp;quot;],[]);&lt;br /&gt;
			paramtmpli = llParseStringKeepNulls(llList2String(requestedTranslations, httliPos + 3),[&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
			speakerLanguage = llList2String(paramtmpli, 0);&lt;br /&gt;
			recepientLanguage = llList2String(paramtmpli, 1);&lt;br /&gt;
			languagePair = llDumpList2String(paramtmpli, &amp;quot;&amp;gt;&amp;gt;&amp;quot;);&lt;br /&gt;
			// Perform Text Cleanup&lt;br /&gt;
			translatedText = llGetSubString(body, llSubStringIndex(body, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(body, &amp;quot;}, \&amp;quot;responseDetails\&amp;quot;&amp;quot;) -1);&lt;br /&gt;
			// Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
			if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
			{&lt;br /&gt;
				lantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
				integer q;&lt;br /&gt;
				for(q = llStringLength(translatedText);q &amp;gt;= 0; q--)&lt;br /&gt;
				{&lt;br /&gt;
					lantmpStr = (lantmpStr=&amp;quot;&amp;quot;) + lantmpStr + llGetSubString(translatedText, q, q);&lt;br /&gt;
				}&lt;br /&gt;
				translatedText = lantmpStr;&lt;br /&gt;
			}&lt;br /&gt;
			lantmpStr = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
			integer z;&lt;br /&gt;
			integer reclen = llGetListLength(recepientList);&lt;br /&gt;
			for (z = 0; z &amp;lt; reclen; z += 1)&lt;br /&gt;
			{&lt;br /&gt;
				forli = [llList2Integer(recepientList, z), speakerLanguage , lantmpStr];&lt;br /&gt;
				sendim = List2TypeSep(forli);&lt;br /&gt;
				llMessageLinked(LINK_THIS,9827491,sendim,NULL_KEY);&lt;br /&gt;
			}&lt;br /&gt;
			requestedTranslations = llDeleteSubList(requestedTranslations, httliPos, httliPos + 4);&lt;br /&gt;
			httbusy = FALSE;&lt;br /&gt;
			llSetTimerEvent(1.0);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	timer()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(0.0);&lt;br /&gt;
		if(txli2 != [])&lt;br /&gt;
		{&lt;br /&gt;
			integer m;&lt;br /&gt;
			integer lleng = llGetListLength(txli2);&lt;br /&gt;
			for (m = 0; m &amp;lt; lleng; m += 2)&lt;br /&gt;
			{&lt;br /&gt;
				request = llList2String(txli2, m);&lt;br /&gt;
				tid = llList2Key(txli2, m + 1);&lt;br /&gt;
				llMessageLinked(LINK_THIS,2346017,request,tid);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		float timeElapsed;&lt;br /&gt;
		list newList;&lt;br /&gt;
		integer r;&lt;br /&gt;
		for (r = 0; r &amp;lt; llGetListLength(requestedTranslations); r += 6)&lt;br /&gt;
		{&lt;br /&gt;
			timeElapsed = llGetTime() - llList2Float(requestedTranslations, r + 1);&lt;br /&gt;
			if (timeElapsed &amp;lt; 20.0)&lt;br /&gt;
			{&lt;br /&gt;
				newList = (newList=[]) + newList + llList2List(requestedTranslations, r, r + 5);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		requestedTranslations = newList;&lt;br /&gt;
		newList = [];&lt;br /&gt;
		llSetTimerEvent(5.0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=995552</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=995552"/>
		<updated>2010-08-06T11:28:39Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribución al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente código fué originálmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mí manera...&lt;br /&gt;
No ós riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;OK&#039;&#039; ===&lt;br /&gt;
Bueno, despues de respiñar todo lo que pude, creo que el uso de memoria y la velocidad están prácticamente igual qué en la versión original pero bueno... en la variedad está el gusto no?&lt;br /&gt;
Ya he probado un poco el código, y parece que funciona aunque estoy teniendo algunos problemas... Por ejemplo creo que el sistema de traduccion no funciona corréctamente, y no me refiero al sistema de traduccion de Google (en mi opinion, si no es el mejor, es uno de los mejores del mundo), sino a que aún queda mucho trabajo por hacer en el script...&lt;br /&gt;
&lt;br /&gt;
El siguiente paso sera intentar dividir el script en dos, o si es posible en tres para repartir el uso de memoria. Tambien me gustaria probar un truco que uso a menudo para traducir páginas en un idioma que no entiendo, lo que hago es que en vez de traducir diréctamente al español, primero se traduce a inglés, y luego desde inglés al español. Parece una tontería y un gasto innecesario, pero si lo hago es porque así suelo entender mejor las traducciones.&lt;br /&gt;
Quiero por un lado el sistema de comunicacion y evaluacion entre traductores, y por otro el sistema de traduccion entre avatares, ¿es muy dificil? no sé ya lo veremos...&lt;br /&gt;
&lt;br /&gt;
Well, after saving as much as I could, I think the memory usage and the speed are technically the same as in the original script, but well, in the variety is the taste, isnt it?. &lt;br /&gt;
I have tested a bit the code above already, and it seems to work altought i´m having some problems...&lt;br /&gt;
For instance i think the translation system is not working properly, and i dont mean the Google´s translation system (in my opinion, if is not the best, one of the bests), but that there is still much work to do in the script...&lt;br /&gt;
&lt;br /&gt;
The next step will be to try to divide the script in 2, or 3 if is possible, so we can spread the memory usage. Also I would like to test a trick i use often for to translate languages that i dont understand, what I do first is to translate that language into English, and then from English to Spanish, it seems a nonsense and unnecesary waste, but if i do it is becouse so i usually understand the translations better.&lt;br /&gt;
I want by one part the translators communications and evaluation system, and by other the translation system between avatars, is it very difficult? I don´t know , we will see...&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Es dificil... me está costando pero ya veremos...&lt;br /&gt;
Its difficult... i am struggling but we will see...&lt;br /&gt;
&lt;br /&gt;
chu chu chu&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
De Güatemala a Güatepeor, Sin comentarios...&lt;br /&gt;
&lt;br /&gt;
From Güatebad to Güateworse, No comments...&lt;br /&gt;
&lt;br /&gt;
Buscando en Internet he encontrado este [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html API de Yahoo] comprobador de ortografía, aunque creo que por ahora sólo soporta el lenguage inglés pero sería interesante añadirlo al proyecto&lt;br /&gt;
&lt;br /&gt;
Searching on the web I crossed in my way with this spell checker [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html Yahoo´s API] , I think that it only supports English language by now althought it would be interesting to add it to the project&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Estoy probando el comprobador de deletreo de Yahoo aunque la verdad es que no estoy teniendo buenos resultados, parece que Google es mucho más rapido y necesito corregir antes de traducir. También estoy intentando solucionar el error que aparece con el símbolo (apostrofe) ´ en las frases con genitivo sajon traducidas al inglés y tampoco doy con la tecla... Ya que esto me está dando muchos dolores de cabeza quizás deje el proyecto en standby hasta después de navidades.&lt;br /&gt;
&lt;br /&gt;
I am testing the Yahoo´s spell checker althought to be honest I´m not having good success, it seems Google is much faster and I need to correct before translate. Also I am triying to fix the error showed in the phrases translated to English with the saxons genitive apostrophe ´ and still triying and triying. As this is driving me nuts, maybe I will leave the project in standby until new year.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ESTO ES EL TRADUCTOR &amp;quot;un lío&amp;quot; por ahora... Necesito rehacer algunas cosas&lt;br /&gt;
&lt;br /&gt;
THIS IS THE TRANSLATOR &amp;quot;mess&amp;quot; by now... I need to redo some things&lt;br /&gt;
&#039;&#039;&#039;THE CODE BELOW IS WORKING AND BEING TESTED&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
THIS IS AN ALPHA VERSION OF THE PERRYSONAL TRANSLATOR...&lt;br /&gt;
NOTHING MORE TO SAY&lt;br /&gt;
&lt;br /&gt;
Menu&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//This is the interface, or menu-system of the translator.&lt;br /&gt;
//Menu System&lt;br /&gt;
//Copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Variables&lt;br /&gt;
integer randomDialogChannel;&lt;br /&gt;
integer isInitialized = FALSE;&lt;br /&gt;
//Options&lt;br /&gt;
integer enabled = TRUE;&lt;br /&gt;
integer isShowTran = FALSE;&lt;br /&gt;
integer showAgents = TRUE;&lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer tranObjects = TRUE;&lt;br /&gt;
//Functions&lt;br /&gt;
showMainMenu(key id)&lt;br /&gt;
{&lt;br /&gt;
	list buttonList = [&amp;quot;Everyone&amp;quot;, &amp;quot;One2One&amp;quot; ,&amp;quot;Options&amp;quot;, &amp;quot;Help&amp;quot;];&lt;br /&gt;
	string dialogMsg = &amp;quot;Main Menu\nTarget languages are detected automatically\nHELP: get help notecard&amp;quot;;&lt;br /&gt;
	dialogMsg = (dialogMsg=&amp;quot;&amp;quot;) + dialogMsg + &amp;quot;\nRESET: reset all scripts in translator&amp;quot;;&lt;br /&gt;
	llDialog(id, dialogMsg, buttonList, randomDialogChannel);&lt;br /&gt;
}&lt;br /&gt;
showOptionsMenu(key id)&lt;br /&gt;
{&lt;br /&gt;
	list buttonList = [];&lt;br /&gt;
	string dialogMsg = &amp;quot;Options Menu.&amp;quot;;&lt;br /&gt;
	if (id == llGetOwner())&lt;br /&gt;
	{&lt;br /&gt;
		buttonList = (buttonList=[]) + buttonList + [&amp;quot;Main Menu&amp;quot;];&lt;br /&gt;
		if (isShowTran)&lt;br /&gt;
		{&lt;br /&gt;
			buttonList = (buttonList=[]) + buttonList + [&amp;quot;Echo OFF&amp;quot;];&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			buttonList = (buttonList=[]) + buttonList + [&amp;quot;Echo ON&amp;quot;];&lt;br /&gt;
		}&lt;br /&gt;
		dialogMsg = (dialogMsg=&amp;quot;&amp;quot;) + dialogMsg + &amp;quot;\nECHO: show translations of your chat sent to others.&amp;quot;;&lt;br /&gt;
		if (tranObjects)&lt;br /&gt;
		{&lt;br /&gt;
			buttonList = (buttonList=[]) + buttonList + [&amp;quot;Objects OFF&amp;quot;];&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			buttonList = (buttonList=[]) + buttonList + [&amp;quot;Objects ON&amp;quot;];&lt;br /&gt;
		}&lt;br /&gt;
		dialogMsg = (dialogMsg=&amp;quot;&amp;quot;) + dialogMsg + &amp;quot;\nOBJECTS: translate chat of scripted objects&amp;quot;;&lt;br /&gt;
		if (showAgents)&lt;br /&gt;
		{&lt;br /&gt;
			buttonList = (buttonList=[]) + buttonList + [&amp;quot;Agents OFF&amp;quot;];&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			buttonList = (buttonList=[]) + buttonList + [&amp;quot;Agents ON&amp;quot;];&lt;br /&gt;
		}&lt;br /&gt;
		dialogMsg = (dialogMsg=&amp;quot;&amp;quot;) + dialogMsg +  &amp;quot;\nAGENTS: show list of agents translated.&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	llDialog(id, dialogMsg, buttonList, randomDialogChannel);&lt;br /&gt;
}&lt;br /&gt;
processListen(string name, key id, string message)&lt;br /&gt;
{&lt;br /&gt;
	if (id == llGetOwner())&lt;br /&gt;
	{&lt;br /&gt;
		if (llToLower(message) == &amp;quot;help&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			llGiveInventory(id, &amp;quot;Universal Translator Help&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
		else if (message == &amp;quot;Main Menu&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			showMainMenu(id);&lt;br /&gt;
		}&lt;br /&gt;
		else if (message == &amp;quot;Options&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			showOptionsMenu(id);&lt;br /&gt;
		}&lt;br /&gt;
		else if (message == &amp;quot;One2One&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			llMessageLinked(LINK_THIS, 8168324, &amp;quot;XTRSRCH&amp;quot;, NULL_KEY);&lt;br /&gt;
			//llSensor(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,AGENT,50,PI);&lt;br /&gt;
		}&lt;br /&gt;
		else if (message == &amp;quot;Reset&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			llResetScript();&lt;br /&gt;
		}&lt;br /&gt;
		else if (message == &amp;quot;Enable&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			//JC ESTO NUNCA LO ESCUCHARA PORQUE LO BORRASTE DEL MENU&lt;br /&gt;
			enabled  = TRUE;&lt;br /&gt;
			llMessageLinked(LINK_THIS, 8434532, (string)enabled, id);&lt;br /&gt;
		}&lt;br /&gt;
		else if (message == &amp;quot;Disable&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			enabled  = FALSE;&lt;br /&gt;
			llMessageLinked(LINK_THIS, 8434532, (string)enabled, id);&lt;br /&gt;
		}&lt;br /&gt;
		else if (message == &amp;quot;Echo ON&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			isShowTran = TRUE;&lt;br /&gt;
			//llMessageLinked(LINK_THIS, 2734322, (string)isShowTran, id);&lt;br /&gt;
		}&lt;br /&gt;
		else if (message == &amp;quot;Echo OFF&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			isShowTran = FALSE;&lt;br /&gt;
		}&lt;br /&gt;
		else if (message == &amp;quot;Objects OFF&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			tranObjects = FALSE;&lt;br /&gt;
		}&lt;br /&gt;
		else if (message == &amp;quot;Objects ON&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			tranObjects = TRUE;&lt;br /&gt;
		}&lt;br /&gt;
		else if (message == &amp;quot;Agents OFF&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			showAgents = FALSE;&lt;br /&gt;
			llMessageLinked(LINK_THIS, 455832, (string)showAgents, id);&lt;br /&gt;
		}&lt;br /&gt;
		else if (message == &amp;quot;Agents ON&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			showAgents = TRUE;&lt;br /&gt;
			llMessageLinked(LINK_THIS, 455832, (string)showAgents, id);&lt;br /&gt;
		}&lt;br /&gt;
		else if (message == &amp;quot;Scan ON&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			showMainMenu(id);&lt;br /&gt;
		}&lt;br /&gt;
		else if (message == &amp;quot;Scan OFF&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			showMainMenu(id);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
//&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		llSleep(0.1);&lt;br /&gt;
	}&lt;br /&gt;
	link_message(integer sender_num, integer num, string str, key id)&lt;br /&gt;
	{&lt;br /&gt;
		if (num == 67982876)&lt;br /&gt;
		{&lt;br /&gt;
			if(str==&amp;quot;TRANSL&amp;quot;)&lt;br /&gt;
			{&lt;br /&gt;
				state upar;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
//&lt;br /&gt;
state upar&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		llOwnerSay(&amp;quot;Welcome to the Perrysonal Translator, probably the worst FREE translator in SL!&amp;quot;);&lt;br /&gt;
		randomDialogChannel = (integer)llFrand(2147483647);&lt;br /&gt;
		llMessageLinked(LINK_SET, 7563297, &amp;quot;XTRNSL&amp;quot;, NULL_KEY);&lt;br /&gt;
		//Other Setup&lt;br /&gt;
		llListen(randomDialogChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
		showMainMenu(llGetOwner());&lt;br /&gt;
	}&lt;br /&gt;
	link_message(integer sender_num, integer num, string str, key id)&lt;br /&gt;
	{&lt;br /&gt;
		if (num == 10)&lt;br /&gt;
		{&lt;br /&gt;
			if(str==&amp;quot;STOP&amp;quot;)&lt;br /&gt;
			{&lt;br /&gt;
				llResetScript();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if (num == 67982876)&lt;br /&gt;
		{&lt;br /&gt;
			if(str==&amp;quot;TRANSL&amp;quot;)&lt;br /&gt;
			{&lt;br /&gt;
				showMainMenu(llGetOwner());&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	listen(integer channel, string name, key id, string message)&lt;br /&gt;
	{&lt;br /&gt;
		processListen(name,id,message);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Listener&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// www.lsleditor.org  by Alphons van der Heijden (SL: Alphons Jano)&lt;br /&gt;
//(Mod made in Perry Mizin) I want to succeed with this translator... ;) call me day or night&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//listener&lt;br /&gt;
integer tranObjects = TRUE;&lt;br /&gt;
integer enabled = TRUE;&lt;br /&gt;
key restricted;&lt;br /&gt;
key owner;&lt;br /&gt;
//&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		owner = llGetOwner();&lt;br /&gt;
		llListen(0,&amp;quot;&amp;quot;,NULL_KEY,&amp;quot;&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
        // Reset script when the object is rezzed&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
	link_message(integer sender_num, integer num, string str, key id)&lt;br /&gt;
	{&lt;br /&gt;
		if (num == 8439932)&lt;br /&gt;
		{&lt;br /&gt;
			if(str==&amp;quot;enable&amp;quot;)&lt;br /&gt;
			{&lt;br /&gt;
				enabled = TRUE;&lt;br /&gt;
			}&lt;br /&gt;
			else if(str==&amp;quot;disable&amp;quot;)&lt;br /&gt;
			{&lt;br /&gt;
				enabled = FALSE;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if (num == 8439742)&lt;br /&gt;
		{&lt;br /&gt;
			if(str==&amp;quot;objon&amp;quot;)&lt;br /&gt;
			{&lt;br /&gt;
				tranObjects = TRUE;&lt;br /&gt;
			}&lt;br /&gt;
			else if(str==&amp;quot;objoff&amp;quot;)&lt;br /&gt;
			{&lt;br /&gt;
				tranObjects = FALSE;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	listen(integer channel, string name, key id, string message)&lt;br /&gt;
	{&lt;br /&gt;
		if(channel==PUBLIC_CHANNEL)&lt;br /&gt;
		{&lt;br /&gt;
			if (!enabled)&lt;br /&gt;
			{&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			if (restricted==id)&lt;br /&gt;
			{&lt;br /&gt;
				llSetTimerEvent(0.0);&lt;br /&gt;
				restricted = id;&lt;br /&gt;
				llSetTimerEvent(0.7);&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			if (!tranObjects)&lt;br /&gt;
			{&lt;br /&gt;
				if (llGetAgentSize(id) == ZERO_VECTOR)&lt;br /&gt;
				{&lt;br /&gt;
					return;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			if (llStringLength(message) &amp;lt; 12)&lt;br /&gt;
			{&lt;br /&gt;
				llMessageLinked(LINK_THIS,98745920,message,id);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				llMessageLinked(LINK_THIS,7686795,message,id);&lt;br /&gt;
				llMessageLinked(LINK_THIS,98745920,message,id);&lt;br /&gt;
			}&lt;br /&gt;
			llSetTimerEvent(0.7);&lt;br /&gt;
			restricted = id;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	timer()&lt;br /&gt;
	{&lt;br /&gt;
		restricted = NULL_KEY;&lt;br /&gt;
		llSetTimerEvent(0.0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
agentsinTranslation&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
key owner;&lt;br /&gt;
key speaker;&lt;br /&gt;
key sid;&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
list tmrli;&lt;br /&gt;
list newList;&lt;br /&gt;
integer listenID;&lt;br /&gt;
integer tmpavliPos;&lt;br /&gt;
integer ownerliPos;&lt;br /&gt;
vector tmrVct;&lt;br /&gt;
string actlan;&lt;br /&gt;
string tmplan;&lt;br /&gt;
string spkLan;&lt;br /&gt;
string SEPARATOR = &amp;quot;|%&amp;amp;|&amp;quot;;&lt;br /&gt;
string mylanguage;&lt;br /&gt;
string checkLanguage(string chklantmpStr)&lt;br /&gt;
{&lt;br /&gt;
	if (chklantmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;en&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	else if (chklantmpStr == &amp;quot;und&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;el&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	else if (chklantmpStr == &amp;quot;Gh&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;en&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	if (llGetSubString(chklantmpStr, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = llGetSubString(chklantmpStr, 0, 1);&lt;br /&gt;
	}&lt;br /&gt;
	return chklantmpStr;&lt;br /&gt;
}&lt;br /&gt;
string addNewAgent(key newavid)&lt;br /&gt;
{&lt;br /&gt;
	string speakerLan;&lt;br /&gt;
	if (llGetAgentSize(newavid) == ZERO_VECTOR)&lt;br /&gt;
	{&lt;br /&gt;
		speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		speakerLan  = checkLanguage(llGetAgentLanguage(newavid));&lt;br /&gt;
		if (speakerLan == &amp;quot;&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
			addAgent(newavid, speakerLan, 0);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			addAgent(newavid, speakerLan, 0);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return speakerLan;&lt;br /&gt;
}&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
	if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
	{&lt;br /&gt;
		integer gkliPos = llListFindList(agentsInTranslation, (list)agentID);&lt;br /&gt;
		return llList2Key(agentsInTranslation, gkliPos - 4);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		return NULL_KEY;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
string List2TypeSep(list input2) {&lt;br /&gt;
	integer w;&lt;br /&gt;
	list output2;&lt;br /&gt;
	for (w = 0; w &amp;lt; llGetListLength(input2); w++) {&lt;br /&gt;
		output2 += [llGetListEntryType(input2, w)] + llList2List(input2, w, w);&lt;br /&gt;
	}&lt;br /&gt;
	return llDumpList2String(output2, SEPARATOR);&lt;br /&gt;
}&lt;br /&gt;
list TypeSep2List(string inputstring) {&lt;br /&gt;
	integer v;&lt;br /&gt;
	list input;&lt;br /&gt;
	list output;&lt;br /&gt;
	input = llParseString2List(inputstring, [SEPARATOR], []);&lt;br /&gt;
	for (v = 0; v &amp;lt; llGetListLength(input); v += 2) {&lt;br /&gt;
		if (llList2Integer(input, v) == TYPE_INTEGER) output += (integer)llList2String(input, v + 1);&lt;br /&gt;
		else if (llList2Integer(input, v) == TYPE_FLOAT) output += (float)llList2String(input, v + 1);&lt;br /&gt;
		else if (llList2Integer(input, v) == TYPE_STRING) output += llList2String(input, v + 1);&lt;br /&gt;
		else if (llList2Integer(input, v) == TYPE_KEY) output += (key)llList2String(input, v + 1);&lt;br /&gt;
	}&lt;br /&gt;
	return output;&lt;br /&gt;
}&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
	integer avliPos;&lt;br /&gt;
	integer idNum;&lt;br /&gt;
	if (~llListFindList(agentsInTranslation, (list)avid))&lt;br /&gt;
	{&lt;br /&gt;
		avliPos = llListFindList(agentsInTranslation, (list)avid);&lt;br /&gt;
		agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, avlan, chklan], avliPos + 1, avliPos + 3);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		@at;&lt;br /&gt;
		idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
		if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
		{&lt;br /&gt;
			jump at;&lt;br /&gt;
		}&lt;br /&gt;
		agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, avlan, chklan, idNum];&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
//&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		owner = llGetOwner();&lt;br /&gt;
		listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
		mylanguage = llGetAgentLanguage(owner);&lt;br /&gt;
		if (llStringLength(mylanguage) &amp;lt; 1)&lt;br /&gt;
		{&lt;br /&gt;
			mylanguage = &amp;quot;en&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		if(~llListFindList(agentsInTranslation, (list)owner))&lt;br /&gt;
		{&lt;br /&gt;
			ownerliPos = llListFindList(agentsInTranslation, (list)owner);&lt;br /&gt;
			agentsInTranslation = llListReplaceList(agentsInTranslation, [mylanguage] , ownerliPos + 1, ownerliPos + 1);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [owner, mylanguage, mylanguage, 0, llRound(llFrand(2000000)) + 1];&lt;br /&gt;
		}&lt;br /&gt;
		llSetTimerEvent(1.0);&lt;br /&gt;
	}&lt;br /&gt;
	link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
	{&lt;br /&gt;
		if (num == 6349160)&lt;br /&gt;
		{&lt;br /&gt;
			speaker = lid;&lt;br /&gt;
			spkLan = lstr;&lt;br /&gt;
			if (~llListFindList(agentsInTranslation, (list)speaker))&lt;br /&gt;
			{&lt;br /&gt;
				tmpavliPos = llListFindList(agentsInTranslation, (list)speaker);&lt;br /&gt;
				actlan = llList2String(agentsInTranslation, tmpavliPos + 1);&lt;br /&gt;
				tmplan = llList2String(agentsInTranslation, tmpavliPos + 2);&lt;br /&gt;
				if (llList2Integer(agentsInTranslation, tmpavliPos + 3) &amp;gt;= 2)&lt;br /&gt;
				{   // if anyone speaks on any different language 3 times in a row&lt;br /&gt;
					addAgent(lid, lstr, 0);&lt;br /&gt;
				}&lt;br /&gt;
				if (actlan == lstr)&lt;br /&gt;
				{   // reset language checker for speaker&lt;br /&gt;
					agentsInTranslation = llListReplaceList(agentsInTranslation, [actlan, 0], tmpavliPos + 2, tmpavliPos + 3);&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					if (lstr == tmplan)&lt;br /&gt;
					{   // if language of speaker is not the same as detected language&lt;br /&gt;
						agentsInTranslation = llListReplaceList(agentsInTranslation,[llList2Integer(agentsInTranslation,tmpavliPos + 3) + 1] , tmpavliPos + 3, tmpavliPos + 3);&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						agentsInTranslation = llListReplaceList(agentsInTranslation,[lstr, 0] , tmpavliPos + 2, tmpavliPos + 3);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if (num == 9876754)&lt;br /&gt;
		{&lt;br /&gt;
			llMessageLinked(LINK_THIS,7659759,List2TypeSep(agentsInTranslation),NULL_KEY);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	listen(integer channel, string name, key id, string message)&lt;br /&gt;
	{&lt;br /&gt;
		if(~llListFindList(agentsInTranslation, (list)id))&lt;br /&gt;
		{ }&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			addNewAgent(id);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	sensor(integer num_detected)&lt;br /&gt;
	{&lt;br /&gt;
		integer s;&lt;br /&gt;
		for (s = 0; s &amp;lt; num_detected; s += 1)&lt;br /&gt;
		{&lt;br /&gt;
			sid = llDetectedKey(s);&lt;br /&gt;
			if (~llListFindList(agentsInTranslation, (list)sid))&lt;br /&gt;
			{ }&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				addNewAgent(sid);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	no_sensor()&lt;br /&gt;
	{ }&lt;br /&gt;
	timer()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(0.0);&lt;br /&gt;
		integer r;&lt;br /&gt;
		for (r = 0; r &amp;lt; llGetListLength(agentsInTranslation); r += 5)&lt;br /&gt;
		{&lt;br /&gt;
			tmrli = llGetObjectDetails(llList2Key(agentsInTranslation, r), [OBJECT_POS]);&lt;br /&gt;
			tmrVct = llList2Vector(tmrli, 0);&lt;br /&gt;
			if (tmrVct == ZERO_VECTOR)&lt;br /&gt;
			{  }&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				if (llVecDist(llGetPos(), tmrVct) &amp;lt;= 20.0)&lt;br /&gt;
				{&lt;br /&gt;
					newList = (newList=[]) + newList + llList2List(agentsInTranslation, r, r + 4);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		agentsInTranslation = newList;&lt;br /&gt;
		newList = [];&lt;br /&gt;
		llSensor(&amp;quot;&amp;quot;,NULL_KEY,AGENT,20.0,PI);&lt;br /&gt;
		llSetTimerEvent(6.0);   // restart timer&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
DetectLanguage&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
key dtcValue;&lt;br /&gt;
key speakerID;&lt;br /&gt;
string htttmpStr;&lt;br /&gt;
list tempDetections;&lt;br /&gt;
list newList;&lt;br /&gt;
float timeElapsed;&lt;br /&gt;
integer tmpliPos;&lt;br /&gt;
integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex&lt;br /&gt;
{&lt;br /&gt;
	return ~llSubStringIndex(haystack, needle);&lt;br /&gt;
}&lt;br /&gt;
DetectLanguage(string dtcmsg, key dtcid)&lt;br /&gt;
{&lt;br /&gt;
	dtcValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&amp;amp;q=&amp;quot; + llEscapeURL(dtcmsg), [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot; &amp;quot;);&lt;br /&gt;
	if (dtcValue != NULL_KEY)&lt;br /&gt;
	{&lt;br /&gt;
		tempDetections = (tempDetections=[]) + tempDetections + [dtcValue, dtcid, llGetTime()];&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		llSleep(10.0); // Something has gone horribly wrong, sleep 10 seconds clear throttle&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
//&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(5.0);&lt;br /&gt;
	}&lt;br /&gt;
	link_message(integer sender, integer num, string msg, key id)&lt;br /&gt;
	{&lt;br /&gt;
		if (num == 7686795)&lt;br /&gt;
		{&lt;br /&gt;
			DetectLanguage(msg, id);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
	{   // Process Response Code&lt;br /&gt;
		if (~llListFindList(tempDetections, (list)request_id))&lt;br /&gt;
		{   // Language Detection&lt;br /&gt;
			tmpliPos = llListFindList(tempDetections, (list)request_id);&lt;br /&gt;
			speakerID = llList2Key(tempDetections, tmpliPos + 1);&lt;br /&gt;
			tempDetections = llDeleteSubList(tempDetections, tmpliPos, tmpliPos + 2);&lt;br /&gt;
			htttmpStr = llToLower(llGetSubString(body, llSubStringIndex(body, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(body, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
			if (contains(htttmpStr, &amp;quot;err&amp;quot;) == 0 &amp;amp;&amp;amp; contains(htttmpStr, &amp;quot;unn&amp;quot;) == 0)&lt;br /&gt;
			{   // We Trust the Google system, the Google´s guys are good and I am sure they will keep improving :-)&lt;br /&gt;
				if(llStringLength(htttmpStr) &amp;lt;= 3)&lt;br /&gt;
				{&lt;br /&gt;
					llMessageLinked(LINK_THIS,6349160,htttmpStr,speakerID);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	timer()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(0.0);&lt;br /&gt;
		integer r;&lt;br /&gt;
		integer TliLen = llGetListLength(tempDetections);&lt;br /&gt;
		for (r = 0; r &amp;lt; TliLen; r += 3)&lt;br /&gt;
		{&lt;br /&gt;
			timeElapsed = llGetTime() - llList2Float(tempDetections, r + 2);&lt;br /&gt;
			if (timeElapsed &amp;gt; 10.0)&lt;br /&gt;
			{&lt;br /&gt;
				newList = (newList=[]) + newList + llList2List(tempDetections, r, r + 2);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		tempDetections = newList;&lt;br /&gt;
		newList = [];&lt;br /&gt;
		llSetTimerEvent(5.0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Formulator&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//Formulator Script&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
list txli;&lt;br /&gt;
list translationCache;&lt;br /&gt;
list tomali;&lt;br /&gt;
string SEPARATOR = &amp;quot;|%&amp;amp;|&amp;quot;;&lt;br /&gt;
string recepientLanguage;&lt;br /&gt;
string speakerLanguage;&lt;br /&gt;
string txmessage;&lt;br /&gt;
string  spkrLan;&lt;br /&gt;
string recep;&lt;br /&gt;
string  recepLan;&lt;br /&gt;
string  lanpair;&lt;br /&gt;
string request;&lt;br /&gt;
integer M = 1;&lt;br /&gt;
integer rxID;&lt;br /&gt;
integer recepID;&lt;br /&gt;
integer lstliPos;&lt;br /&gt;
integer lstliPos2;&lt;br /&gt;
integer txPos;&lt;br /&gt;
integer lint;&lt;br /&gt;
key recepientID;&lt;br /&gt;
float cacheTime;&lt;br /&gt;
sendIM(key imid, string imstr)&lt;br /&gt;
{&lt;br /&gt;
	if (M == 8)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_ALL_OTHERS,2334420,imstr,imid);&lt;br /&gt;
		M = 1;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 7)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_ALL_OTHERS,2334430,imstr,imid);&lt;br /&gt;
		M = 8;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 6)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_ALL_OTHERS,2334440,imstr,imid);&lt;br /&gt;
		M = 7;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 5)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_ALL_OTHERS,2334450,imstr,imid);&lt;br /&gt;
		M = 6;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 4)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_ALL_OTHERS,2334460,imstr,imid);&lt;br /&gt;
		M = 5;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 3)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_ALL_OTHERS,2334470,imstr,imid);&lt;br /&gt;
		M = 4;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 2)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_ALL_OTHERS,2334480,imstr,imid);&lt;br /&gt;
		M = 3;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 1)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_ALL_OTHERS,2334490,imstr,imid);&lt;br /&gt;
		M = 2;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
	if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
	{&lt;br /&gt;
		integer gkliPos = llListFindList(agentsInTranslation, (list)agentID);&lt;br /&gt;
		return llList2Key(agentsInTranslation, gkliPos - 4);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		return NULL_KEY;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
list TypeSep2List(string inputstring)&lt;br /&gt;
{&lt;br /&gt;
	integer h;&lt;br /&gt;
	list input;&lt;br /&gt;
	list output;&lt;br /&gt;
	input = llParseString2List(inputstring, [SEPARATOR], []);&lt;br /&gt;
	for (h = 0; h &amp;lt; llGetListLength(input); h += 2)&lt;br /&gt;
	{&lt;br /&gt;
		if (llList2Integer(input, h) == TYPE_INTEGER) output += (integer)llList2String(input, h + 1);&lt;br /&gt;
		else if (llList2Integer(input, h) == TYPE_FLOAT) output += (float)llList2String(input, h + 1);&lt;br /&gt;
		else if (llList2Integer(input, h) == TYPE_STRING) output += llList2String(input, h + 1);&lt;br /&gt;
		else if (llList2Integer(input, h) == TYPE_KEY) output += (key)llList2String(input, h + 1);&lt;br /&gt;
	}&lt;br /&gt;
	return output;&lt;br /&gt;
}&lt;br /&gt;
string List2TypeSep(list input2)&lt;br /&gt;
{&lt;br /&gt;
	integer l;&lt;br /&gt;
	list output2;&lt;br /&gt;
	for (l = 0; l &amp;lt; llGetListLength(input2); l++)&lt;br /&gt;
	{&lt;br /&gt;
		output2 += [llGetListEntryType(input2, l)] + llList2List(input2, l, l);&lt;br /&gt;
	}&lt;br /&gt;
	return llDumpList2String(output2, SEPARATOR);&lt;br /&gt;
}&lt;br /&gt;
//&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(1.0);&lt;br /&gt;
	}&lt;br /&gt;
	link_message(integer sender_num, integer num, string lstr, key id)&lt;br /&gt;
	{&lt;br /&gt;
		if (num == 7659759)&lt;br /&gt;
		{&lt;br /&gt;
			agentsInTranslation = TypeSep2List(lstr);&lt;br /&gt;
		}&lt;br /&gt;
		if (num == 9827491)&lt;br /&gt;
		{&lt;br /&gt;
			txli = TypeSep2List(lstr);&lt;br /&gt;
			rxID = llList2Integer(txli,0);&lt;br /&gt;
			speakerLanguage = llList2String(txli,1);&lt;br /&gt;
			txmessage = llList2String(txli,2);&lt;br /&gt;
			lint = llListFindList(agentsInTranslation, (list)rxID);&lt;br /&gt;
			recepientLanguage = llList2String(agentsInTranslation, lint - 3);&lt;br /&gt;
			recepientID = getAgentKey(rxID);&lt;br /&gt;
			if (recepientID != NULL_KEY)&lt;br /&gt;
			{&lt;br /&gt;
				if (recepientLanguage == speakerLanguage)&lt;br /&gt;
				{ }&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					sendIM(recepientID,txmessage);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if (num == 98745920)&lt;br /&gt;
		{&lt;br /&gt;
			txPos = llListFindList(agentsInTranslation, (list)id);&lt;br /&gt;
			cacheTime = llGetTime();&lt;br /&gt;
			if(id==llGetOwner())&lt;br /&gt;
			{&lt;br /&gt;
				integer v;&lt;br /&gt;
				integer agentslilen = llGetListLength(agentsInTranslation);&lt;br /&gt;
				for (v = 0; v &amp;lt; agentslilen; v += 5)&lt;br /&gt;
				{&lt;br /&gt;
					spkrLan = llList2String(agentsInTranslation, txPos + 1);&lt;br /&gt;
					recepID = llList2Integer(agentsInTranslation, v + 4);&lt;br /&gt;
					recepLan = llList2String(agentsInTranslation, v + 1);&lt;br /&gt;
					if (spkrLan == recepLan)&lt;br /&gt;
					{ }&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
						if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
						{&lt;br /&gt;
							lstliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
							translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
						}&lt;br /&gt;
						else&lt;br /&gt;
						{&lt;br /&gt;
							translationCache = (translationCache=[]) + translationCache + [lanpair, recepID, cacheTime];&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				if (translationCache != [])&lt;br /&gt;
				{&lt;br /&gt;
					integer w;&lt;br /&gt;
					for (w = 0; w &amp;lt; llGetListLength(translationCache); w += 3)&lt;br /&gt;
					{&lt;br /&gt;
						lanpair = llList2String(translationCache, w);&lt;br /&gt;
						recep = llList2String(translationCache, w + 1);&lt;br /&gt;
						tomali = [lstr, lanpair, recep];&lt;br /&gt;
						request = List2TypeSep(tomali);&lt;br /&gt;
						llMessageLinked(LINK_THIS,2346017,request,id);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				lstliPos2 = llListFindList(agentsInTranslation, (list)llGetOwner());&lt;br /&gt;
				if (~llListFindList(agentsInTranslation, (list)id))&lt;br /&gt;
				{&lt;br /&gt;
					spkrLan = llList2String(agentsInTranslation, txPos + 1);&lt;br /&gt;
					recepID = llList2Integer(agentsInTranslation, lstliPos2 + 4);&lt;br /&gt;
					recepLan = llList2String(agentsInTranslation, lstliPos2 + 1);&lt;br /&gt;
					if (spkrLan == recepLan)&lt;br /&gt;
					{ }&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
						if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
						{&lt;br /&gt;
							lstliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
							translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
						}&lt;br /&gt;
						else&lt;br /&gt;
						{&lt;br /&gt;
							translationCache = (translationCache=[]) + translationCache + [ lanpair, recepID, cacheTime ];&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				if (translationCache != [])&lt;br /&gt;
				{    // Process Requests&lt;br /&gt;
					tomali = [lstr, lanpair, recepID];&lt;br /&gt;
					request = List2TypeSep(tomali);&lt;br /&gt;
					llMessageLinked(LINK_THIS,2346017,request,id);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	timer()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(0.0);&lt;br /&gt;
		float timeElapsed;&lt;br /&gt;
		list newList;&lt;br /&gt;
		integer r;&lt;br /&gt;
		for (r = 0; r &amp;lt; llGetListLength(translationCache); r += 3)&lt;br /&gt;
		{&lt;br /&gt;
			timeElapsed = llGetTime() - llList2Float(translationCache, r + 2);&lt;br /&gt;
			if (timeElapsed &amp;lt; 10.0)&lt;br /&gt;
			{&lt;br /&gt;
				newList = (newList=[]) + newList + llList2List(translationCache, r, r + 2);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		translationCache = newList;&lt;br /&gt;
		newList = [];&lt;br /&gt;
		llMessageLinked(LINK_THIS,9876754,&amp;quot;&amp;quot;,NULL_KEY);&lt;br /&gt;
		llSetTimerEvent(12.0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Translator&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
list paramtmpli;&lt;br /&gt;
list recepientList;&lt;br /&gt;
list requestedTranslations;&lt;br /&gt;
list forli;&lt;br /&gt;
list txli;&lt;br /&gt;
list txli2;&lt;br /&gt;
list lkli;&lt;br /&gt;
string SEPARATOR = &amp;quot;|%&amp;amp;|&amp;quot;;&lt;br /&gt;
string recepientLanguage;&lt;br /&gt;
string languagePair;&lt;br /&gt;
string speakerName;&lt;br /&gt;
string speakerLanguage;&lt;br /&gt;
string translatedText;&lt;br /&gt;
string lantmpStr;&lt;br /&gt;
string lmsg;&lt;br /&gt;
string llan;&lt;br /&gt;
string sendim;&lt;br /&gt;
string request;&lt;br /&gt;
string llid;&lt;br /&gt;
key speakerID;&lt;br /&gt;
key returnValue;&lt;br /&gt;
key tid;&lt;br /&gt;
integer tranObjects = TRUE;&lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
integer httliPos;&lt;br /&gt;
integer lmPos;&lt;br /&gt;
integer httbusy;&lt;br /&gt;
Translate(string chkmsg, list chkli)&lt;br /&gt;
{&lt;br /&gt;
	returnValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&amp;amp;q=&amp;quot; + llEscapeURL(chkmsg) + &amp;quot;&amp;amp;langpair=&amp;quot; + llList2String(chkli,2), [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot;&amp;quot;);&lt;br /&gt;
	if (returnValue != NULL_KEY)&lt;br /&gt;
	{&lt;br /&gt;
		requestedTranslations = (requestedTranslations=[]) + requestedTranslations + [returnValue];&lt;br /&gt;
		requestedTranslations = (requestedTranslations=[]) + requestedTranslations + chkli;&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		llOwnerSay(&amp;quot;ERROR ERROR ERROR ERROR ERRORR ERROOOORRRRR&amp;quot;);&lt;br /&gt;
		llOwnerSay(&amp;quot;All Go!&amp;quot;);&lt;br /&gt;
		llSleep(25.0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
string List2TypeSep(list input) {&lt;br /&gt;
	integer v;&lt;br /&gt;
	list output;&lt;br /&gt;
	for (v = 0; v &amp;lt; llGetListLength(input); v++) {&lt;br /&gt;
		output += [llGetListEntryType(input, v)] + llList2List(input, v, v);&lt;br /&gt;
	}&lt;br /&gt;
	return llDumpList2String(output, SEPARATOR);&lt;br /&gt;
}&lt;br /&gt;
list TypeSep2List(string inputstring)&lt;br /&gt;
{&lt;br /&gt;
	integer w;&lt;br /&gt;
	list input2;&lt;br /&gt;
	list output2;&lt;br /&gt;
	input2 = llParseString2List(inputstring, [SEPARATOR], []);&lt;br /&gt;
	for (w = 0; w &amp;lt; llGetListLength(input2); w += 2) {&lt;br /&gt;
		if (llList2Integer(input2, w) == TYPE_INTEGER) output2 += (integer)llList2String(input2, w + 1);&lt;br /&gt;
		else if (llList2Integer(input2, w) == TYPE_FLOAT) output2 += (float)llList2String(input2, w + 1);&lt;br /&gt;
		else if (llList2Integer(input2, w) == TYPE_STRING) output2 += llList2String(input2, w + 1);&lt;br /&gt;
		else if (llList2Integer(input2, w) == TYPE_KEY) output2 += (key)llList2String(input2, w + 1);&lt;br /&gt;
	}&lt;br /&gt;
	return output2;&lt;br /&gt;
}&lt;br /&gt;
//&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		httbusy=FALSE;&lt;br /&gt;
		llSetTimerEvent(1.0);&lt;br /&gt;
	}&lt;br /&gt;
	link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
	{&lt;br /&gt;
		if (num == 2346017)&lt;br /&gt;
		{&lt;br /&gt;
			if(httbusy==FALSE)&lt;br /&gt;
			{&lt;br /&gt;
				httbusy = TRUE;&lt;br /&gt;
				if (~llListFindList(txli2, (list)lstr))&lt;br /&gt;
				{&lt;br /&gt;
					lmPos = llListFindList(txli2, (list)lstr);&lt;br /&gt;
					txli2 = llDeleteSubList(txli2, lmPos, lmPos + 1);&lt;br /&gt;
					txli = TypeSep2List(lstr);&lt;br /&gt;
					lmsg = llList2String(txli,0);&lt;br /&gt;
					llan = llList2String(txli,1);&lt;br /&gt;
					llid = llList2String(txli,2);&lt;br /&gt;
					lkli = [ llGetTime(), lid, llan, llid ];&lt;br /&gt;
					Translate(lmsg,lkli);&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					txli = TypeSep2List(lstr);&lt;br /&gt;
					lmsg = llList2String(txli,0);&lt;br /&gt;
					llan = llList2String(txli,1);&lt;br /&gt;
					llid = llList2String(txli,2);&lt;br /&gt;
					lkli = [ llGetTime(), lid, llan, llid ];&lt;br /&gt;
					Translate(lmsg,lkli);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				if (~llListFindList(txli2, (list)lstr))&lt;br /&gt;
				{ }&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					txli2 = (txli2=[]) + txli2 + [lstr];&lt;br /&gt;
					txli2 = (txli2=[]) + txli2 + [lid];&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
	{   // Process Response Code&lt;br /&gt;
		if (~llListFindList(requestedTranslations, (list)request_id))&lt;br /&gt;
		{   // Translation&lt;br /&gt;
			httliPos = llListFindList(requestedTranslations, (list)request_id);&lt;br /&gt;
			speakerID  = llList2Key(requestedTranslations, httliPos + 2);&lt;br /&gt;
			speakerName = llKey2Name(speakerID);&lt;br /&gt;
			if (llStringLength(speakerName) &amp;lt; 3)&lt;br /&gt;
			{&lt;br /&gt;
				speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
			}&lt;br /&gt;
			recepientList = llParseString2List(llList2String(requestedTranslations, httliPos + 4),[&amp;quot;@&amp;quot;],[]);&lt;br /&gt;
			paramtmpli = llParseStringKeepNulls(llList2String(requestedTranslations, httliPos + 3),[&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
			speakerLanguage = llList2String(paramtmpli, 0);&lt;br /&gt;
			recepientLanguage = llList2String(paramtmpli, 1);&lt;br /&gt;
			languagePair = llDumpList2String(paramtmpli, &amp;quot;&amp;gt;&amp;gt;&amp;quot;);&lt;br /&gt;
			// Perform Text Cleanup&lt;br /&gt;
			translatedText = llGetSubString(body, llSubStringIndex(body, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(body, &amp;quot;}, \&amp;quot;responseDetails\&amp;quot;&amp;quot;) -1);&lt;br /&gt;
			// Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
			if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
			{&lt;br /&gt;
				lantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
				integer q;&lt;br /&gt;
				for(q = llStringLength(translatedText);q &amp;gt;= 0; q--)&lt;br /&gt;
				{&lt;br /&gt;
					lantmpStr = (lantmpStr=&amp;quot;&amp;quot;) + lantmpStr + llGetSubString(translatedText, q, q);&lt;br /&gt;
				}&lt;br /&gt;
				translatedText = lantmpStr;&lt;br /&gt;
			}&lt;br /&gt;
			lantmpStr = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
			integer z;&lt;br /&gt;
			integer reclen = llGetListLength(recepientList);&lt;br /&gt;
			for (z = 0; z &amp;lt; reclen; z += 1)&lt;br /&gt;
			{&lt;br /&gt;
				forli = [llList2Integer(recepientList, z), speakerLanguage , lantmpStr];&lt;br /&gt;
				sendim = List2TypeSep(forli);&lt;br /&gt;
				llMessageLinked(LINK_THIS,9827491,sendim,NULL_KEY);&lt;br /&gt;
			}&lt;br /&gt;
			requestedTranslations = llDeleteSubList(requestedTranslations, httliPos, httliPos + 4);&lt;br /&gt;
			httbusy = FALSE;&lt;br /&gt;
			llSetTimerEvent(1.0);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	timer()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(0.0);&lt;br /&gt;
		if(txli2 != [])&lt;br /&gt;
		{&lt;br /&gt;
			integer m;&lt;br /&gt;
			integer lleng = llGetListLength(txli2);&lt;br /&gt;
			for (m = 0; m &amp;lt; lleng; m += 2)&lt;br /&gt;
			{&lt;br /&gt;
				request = llList2String(txli2, m);&lt;br /&gt;
				tid = llList2Key(txli2, m + 1);&lt;br /&gt;
				llMessageLinked(LINK_THIS,2346017,request,tid);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		float timeElapsed;&lt;br /&gt;
		list newList;&lt;br /&gt;
		integer r;&lt;br /&gt;
		for (r = 0; r &amp;lt; llGetListLength(requestedTranslations); r += 6)&lt;br /&gt;
		{&lt;br /&gt;
			timeElapsed = llGetTime() - llList2Float(requestedTranslations, r + 1);&lt;br /&gt;
			if (timeElapsed &amp;lt; 20.0)&lt;br /&gt;
			{&lt;br /&gt;
				newList = (newList=[]) + newList + llList2List(requestedTranslations, r, r + 5);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		requestedTranslations = newList;&lt;br /&gt;
		newList = [];&lt;br /&gt;
		llSetTimerEvent(5.0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=969792</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=969792"/>
		<updated>2010-07-20T13:04:24Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=704243</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=704243"/>
		<updated>2010-01-13T23:10:17Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: /* OK */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribución al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente código fué originálmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mí manera...&lt;br /&gt;
No ós riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;OK&#039;&#039; ===&lt;br /&gt;
Bueno, despues de respiñar todo lo que pude, creo que el uso de memoria y la velocidad están prácticamente igual qué en la versión original pero bueno... en la variedad está el gusto no?&lt;br /&gt;
Ya he probado un poco el código, y parece que funciona aunque estoy teniendo algunos problemas... Por ejemplo creo que el sistema de traduccion no funciona corréctamente, y no me refiero al sistema de traduccion de Google (en mi opinion, si no es el mejor, es uno de los mejores del mundo), sino a que aún queda mucho trabajo por hacer en el script...&lt;br /&gt;
&lt;br /&gt;
El siguiente paso sera intentar dividir el script en dos, o si es posible en tres para repartir el uso de memoria. Tambien me gustaria probar un truco que uso a menudo para traducir páginas en un idioma que no entiendo, lo que hago es que en vez de traducir diréctamente al español, primero se traduce a inglés, y luego desde inglés al español. Parece una tontería y un gasto innecesario, pero si lo hago es porque así suelo entender mejor las traducciones.&lt;br /&gt;
Quiero por un lado el sistema de comunicacion y evaluacion entre traductores, y por otro el sistema de traduccion entre avatares, ¿es muy dificil? no sé ya lo veremos...&lt;br /&gt;
&lt;br /&gt;
Well, after saving as much as I could, I think the memory usage and the speed are technically the same as in the original script, but well, in the variety is the taste, isnt it?. &lt;br /&gt;
I have tested a bit the code above already, and it seems to work altought i´m having some problems...&lt;br /&gt;
For instance i think the translation system is not working properly, and i dont mean the Google´s translation system (in my opinion, if is not the best, one of the bests), but that there is still much work to do in the script...&lt;br /&gt;
&lt;br /&gt;
The next step will be to try to divide the script in 2, or 3 if is possible, so we can spread the memory usage. Also I would like to test a trick i use often for to translate languages that i dont understand, what I do first is to translate that language into English, and then from English to Spanish, it seems a nonsense and unnecesary waste, but if i do it is becouse so i usually understand the translations better.&lt;br /&gt;
I want by one part the translators communications and evaluation system, and by other the translation system between avatars, is it very difficult? I don´t know , we will see...&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Es dificil... me está costando pero ya veremos...&lt;br /&gt;
Its difficult... i am struggling but we will see...&lt;br /&gt;
&lt;br /&gt;
chu chu chu&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
De Güatemala a Güatepeor, Sin comentarios...&lt;br /&gt;
&lt;br /&gt;
From Güatebad to Güateworse, No comments...&lt;br /&gt;
&lt;br /&gt;
Buscando en Internet he encontrado este [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html API de Yahoo] comprobador de ortografía, aunque creo que por ahora sólo soporta el lenguage inglés pero sería interesante añadirlo al proyecto&lt;br /&gt;
&lt;br /&gt;
Searching on the web I crossed in my way with this spell checker [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html Yahoo´s API] , I think that it only supports English language by now althought it would be interesting to add it to the project&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Estoy probando el comprobador de deletreo de Yahoo aunque la verdad es que no estoy teniendo buenos resultados, parece que Google es mucho más rapido y necesito corregir antes de traducir. También estoy intentando solucionar el error que aparece con el símbolo (apostrofe) ´ en las frases con genitivo sajon traducidas al inglés y tampoco doy con la tecla... Ya que esto me está dando muchos dolores de cabeza quizás deje el proyecto en standby hasta después de navidades.&lt;br /&gt;
&lt;br /&gt;
I am testing the Yahoo´s spell checker althought to be honest I´m not having good success, it seems Google is much faster and I need to correct before translate. Also I am triying to fix the error showed in the phrases translated to English with the saxons genitive apostrophe ´ and still triying and triying. As this is driving me nuts, maybe I will leave the project in standby until new year.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ESTO ES EL TRADUCTOR &amp;quot;un lío&amp;quot; por ahora... Necesito rehacer algunas cosas&lt;br /&gt;
&lt;br /&gt;
THIS IS THE TRANSLATOR &amp;quot;mess&amp;quot; by now... I need to redo some things&lt;br /&gt;
&#039;&#039;&#039;THE CODE BELOW IS WORKING AND BEING TESTED&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
agentsinTranslation&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//Spell Checker Web Services powered by Yahoo&lt;br /&gt;
key owner;&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
integer isInitialized = FALSE;&lt;br /&gt;
integer listenID;&lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
string SEPARATOR = &amp;quot;|%&amp;amp;|&amp;quot;; // for transmitting lists via linked messages&lt;br /&gt;
&lt;br /&gt;
string checkLanguage(string chklantmpStr)&lt;br /&gt;
{&lt;br /&gt;
    if (chklantmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;en&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else if (chklantmpStr == &amp;quot;und&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;el&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if (llGetSubString(chklantmpStr, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = llGetSubString(chklantmpStr, 0, 1);&lt;br /&gt;
    }&lt;br /&gt;
    return chklantmpStr;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
    integer avliPos;&lt;br /&gt;
    integer idNum;&lt;br /&gt;
    if (~llListFindList(agentsInTranslation, (list)avid))&lt;br /&gt;
    {&lt;br /&gt;
        avliPos = llListFindList(agentsInTranslation, (list)avid);&lt;br /&gt;
        agentsInTranslation = llListReplaceList(agentsInTranslation, [ avlan, avlan, chklan ], avliPos + 1, avliPos + 3);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        @at;&lt;br /&gt;
        idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
        if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
        {&lt;br /&gt;
            jump at;&lt;br /&gt;
        }&lt;br /&gt;
        agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [ avid, avlan, avlan, chklan, idNum ];        // llMessageLinked(LINK_THIS, 64562349, avlan, avid);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string addNewAgent(key newavid)&lt;br /&gt;
{&lt;br /&gt;
    string speakerLan;&lt;br /&gt;
    if (llGetAgentSize(newavid) == ZERO_VECTOR)&lt;br /&gt;
    {&lt;br /&gt;
        speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
//        addAgent(newavid, speakerLan, 4);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        speakerLan  = checkLanguage(llGetAgentLanguage(newavid));&lt;br /&gt;
        if (speakerLan == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
            addAgent(newavid, speakerLan, 0);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            addAgent(newavid, speakerLan, 0);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return speakerLan;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
    if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
    {&lt;br /&gt;
        integer gkliPos = llListFindList(agentsInTranslation, (list)agentID);&lt;br /&gt;
        return llList2Key(agentsInTranslation, gkliPos - 4);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return NULL_KEY;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string List2TypeSep(list input) { // converts a list to a separated string with type information prepended to each item&lt;br /&gt;
    integer     i;&lt;br /&gt;
    list        output;&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; llGetListLength(input); i++) {&lt;br /&gt;
        output += [llGetListEntryType(input, i)] + llList2List(input, i, i);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return llDumpList2String(output, SEPARATOR);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list TypeSep2List(string inputstring) { // converts a separated string created with List2TypeSep back to a list with the correct type information&lt;br /&gt;
    integer     i;&lt;br /&gt;
    list        input;&lt;br /&gt;
    list        output;&lt;br /&gt;
    &lt;br /&gt;
    input = llParseString2List(inputstring, [SEPARATOR], []);&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; llGetListLength(input); i += 2) {&lt;br /&gt;
        if (llList2Integer(input, i) == TYPE_INTEGER) output += (integer)llList2String(input, i + 1);&lt;br /&gt;
        else if (llList2Integer(input, i) == TYPE_FLOAT) output += (float)llList2String(input, i + 1);&lt;br /&gt;
        else if (llList2Integer(input, i) == TYPE_STRING) output += llList2String(input, i + 1);&lt;br /&gt;
        else if (llList2Integer(input, i) == TYPE_KEY) output += (key)llList2String(input, i + 1);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return output;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        owner = llGetOwner();&lt;br /&gt;
        llSetTimerEvent(1.0);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
    {&lt;br /&gt;
        if (num == 9876754)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS,7659759,List2TypeSep(agentsInTranslation),NULL_KEY);&lt;br /&gt;
        }&lt;br /&gt;
        if (num == 6349160)&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            key speaker;&lt;br /&gt;
            string spkLan;&lt;br /&gt;
            speaker = lid;&lt;br /&gt;
            spkLan = lstr;&lt;br /&gt;
            if (~llListFindList(agentsInTranslation, (list)speaker))&lt;br /&gt;
            {&lt;br /&gt;
                integer tmpavliPos = llListFindList(agentsInTranslation, (list)speaker);&lt;br /&gt;
                string actlan = llList2String(agentsInTranslation, tmpavliPos + 1);&lt;br /&gt;
                string tmplan = llList2String(agentsInTranslation, tmpavliPos + 2);&lt;br /&gt;
                if (llList2Integer(agentsInTranslation, tmpavliPos + 3) &amp;gt;= 2)&lt;br /&gt;
                {   // if anyone speaks on any different language 3 times in a row&lt;br /&gt;
                    addAgent(lid, lstr, 0);&lt;br /&gt;
                }&lt;br /&gt;
                if (actlan == lstr)&lt;br /&gt;
                {   // reset language checker for speaker&lt;br /&gt;
                    agentsInTranslation = llListReplaceList(agentsInTranslation, [actlan, 0], tmpavliPos + 2, tmpavliPos + 3);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    if (lstr == tmplan)&lt;br /&gt;
                    {   // if language of speaker is not the same as detected language&lt;br /&gt;
                        agentsInTranslation = llListReplaceList(agentsInTranslation,[llList2Integer(agentsInTranslation,tmpavliPos + 3) + 1] , tmpavliPos + 3, tmpavliPos + 3);&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        agentsInTranslation = llListReplaceList(agentsInTranslation,[lstr, 0] , tmpavliPos + 2, tmpavliPos + 3);&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    sensor(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        integer s;&lt;br /&gt;
        key sid;&lt;br /&gt;
        for (s = 0; s &amp;lt; num_detected; s += 1)&lt;br /&gt;
        {&lt;br /&gt;
            sid = llDetectedKey(s);&lt;br /&gt;
            if (~llListFindList(agentsInTranslation, (list)sid))&lt;br /&gt;
            { }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                addNewAgent(sid);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    no_sensor()&lt;br /&gt;
    { }&lt;br /&gt;
&lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        if(~llListFindList(agentsInTranslation, (list)id))&lt;br /&gt;
        { }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            addNewAgent(id);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        integer r;&lt;br /&gt;
        vector  tmrVct;&lt;br /&gt;
        list tmrli;&lt;br /&gt;
        list  newList;&lt;br /&gt;
        llSetTimerEvent(0.0);   // we better reset timer by way of precaution&lt;br /&gt;
        if (isInitialized == FALSE)&lt;br /&gt;
        {&lt;br /&gt;
            string mylanguage;&lt;br /&gt;
            enabled = TRUE;&lt;br /&gt;
            listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
            llMessageLinked(LINK_THIS, 6877259, (string)enabled, NULL_KEY);&lt;br /&gt;
            isInitialized = TRUE;&lt;br /&gt;
            mylanguage = llGetAgentLanguage(owner);&lt;br /&gt;
            if (llStringLength(mylanguage) &amp;lt; 1)&lt;br /&gt;
            {&lt;br /&gt;
                mylanguage = &amp;quot;en&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            if(~llListFindList(agentsInTranslation, (list)owner))&lt;br /&gt;
            {&lt;br /&gt;
                integer ownerliPos;&lt;br /&gt;
                ownerliPos = llListFindList(agentsInTranslation, (list)owner);&lt;br /&gt;
                agentsInTranslation = llListReplaceList(agentsInTranslation, [mylanguage] , ownerliPos + 1, ownerliPos + 1);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [ owner , mylanguage, mylanguage , 0 , llRound(llFrand(2000000)) + 1];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            for (r = 0; r &amp;lt; llGetListLength(agentsInTranslation); r += 5)&lt;br /&gt;
            {&lt;br /&gt;
                tmrli = llGetObjectDetails(llList2Key(agentsInTranslation, r), [OBJECT_POS]);&lt;br /&gt;
                tmrVct = llList2Vector(tmrli, 0);&lt;br /&gt;
                if (tmrVct == ZERO_VECTOR)&lt;br /&gt;
                {  }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    if (llVecDist(llGetPos(), tmrVct) &amp;lt;= 20.0)&lt;br /&gt;
                    {&lt;br /&gt;
                        newList = (newList=[]) + newList + llList2List(agentsInTranslation, r, r + 4);&lt;br /&gt;
                    }&lt;br /&gt;
                }                   &lt;br /&gt;
            }&lt;br /&gt;
            agentsInTranslation = newList;&lt;br /&gt;
            newList = [];&lt;br /&gt;
        }&lt;br /&gt;
        if (autoLanguage == TRUE &amp;amp;&amp;amp; isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            llSensor(&amp;quot;&amp;quot;, NULL_KEY, AGENT, 20.0, PI);&lt;br /&gt;
        }&lt;br /&gt;
        llSetTimerEvent(4.0);   // restart timer&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
CheckSpell-DetectLanguage&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//Spell Checker Web Services powered by Yahoo&lt;br /&gt;
key splValue;&lt;br /&gt;
key dtcValue;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer enabled = TRUE;&lt;br /&gt;
integer showTranslation = TRUE;&lt;br /&gt;
integer tranObjects = TRUE;&lt;br /&gt;
integer SpellChecker = 0;&lt;br /&gt;
list tempDetections;&lt;br /&gt;
list spellchecks;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex&lt;br /&gt;
{&lt;br /&gt;
    return ~llSubStringIndex(haystack, needle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
DetectLanguage(string dtcmsg, key dtcid)&lt;br /&gt;
{&lt;br /&gt;
    llSleep(0.2);&lt;br /&gt;
    dtcValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&amp;amp;q=&amp;quot; + llEscapeURL(dtcmsg), [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot; &amp;quot;);&lt;br /&gt;
    if (dtcValue != NULL_KEY)&lt;br /&gt;
    {&lt;br /&gt;
        tempDetections = (tempDetections=[]) + tempDetections + [ dtcValue, dtcid, llGetTime() ];&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llSleep(10.0); // Something has gone horribly wrong, sleep 10 seconds clear throttle&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
CheckSpell(string splmsg, key splid)&lt;br /&gt;
{&lt;br /&gt;
    splValue = llHTTPRequest(&amp;quot;http://search.yahooapis.com/WebSearchService/V1/spellingSuggestion?appid=DNPjiabV34EOgXQ3kAu6.d7kf6v.JUGCn1bFUcSTFMSGCyCy_ALzbepYstlI7DrOGP0-&amp;amp;query=&amp;quot; + llEscapeURL(splmsg), [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot;&amp;quot;);&lt;br /&gt;
    if (splValue != NULL_KEY)&lt;br /&gt;
    {    // Translation&lt;br /&gt;
        spellchecks = (spellchecks=[]) + spellchecks + [ splValue, splid, splmsg, llGetTime() ];&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llSleep(10.0); // Something has gone horribly wrong, sleep 10 seconds clear throttle&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llListen(0,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        if ((!enabled) &amp;amp;&amp;amp; (isMaster == 1))&lt;br /&gt;
        {&lt;br /&gt;
            return;&lt;br /&gt;
        }       &lt;br /&gt;
        if (llStringLength(message) &amp;gt; 10)&lt;br /&gt;
        {&lt;br /&gt;
            if (!tranObjects)&lt;br /&gt;
            {&lt;br /&gt;
                if (llGetAgentSize(id) == ZERO_VECTOR)&lt;br /&gt;
                {&lt;br /&gt;
                    return;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    if (SpellChecker == 1)&lt;br /&gt;
                    {&lt;br /&gt;
                        CheckSpell(message, id);&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        llMessageLinked(LINK_THIS,98745920,message,id);&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                if (SpellChecker == 1)&lt;br /&gt;
                {&lt;br /&gt;
                    CheckSpell(message, id);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    llMessageLinked(LINK_THIS,98745920,message,id);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            DetectLanguage(message, id);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS,98745920,message,id);          &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
    {   // Process Response Code&lt;br /&gt;
        if (~llListFindList(spellchecks, (list)request_id))&lt;br /&gt;
        {&lt;br /&gt;
            string httmsg;&lt;br /&gt;
            key httkey;&lt;br /&gt;
            integer splliPos = llListFindList(spellchecks, (list)request_id);&lt;br /&gt;
            httkey = llList2Key(spellchecks, splliPos + 1);&lt;br /&gt;
            if(contains(body, &amp;quot;&amp;lt;Result&amp;gt;&amp;quot;) == 0)&lt;br /&gt;
            {   // Yahoo Spell Checker correction&lt;br /&gt;
                httmsg = llList2String(spellchecks, splliPos + 2);&lt;br /&gt;
                llMessageLinked(LINK_THIS,98745920,httmsg,httkey);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                httmsg = llGetSubString(body, llSubStringIndex(body, &amp;quot;&amp;lt;Result&amp;gt;&amp;quot;) + 8, llSubStringIndex(body, &amp;quot;&amp;lt;/Result&amp;gt;&amp;quot;) - 1);&lt;br /&gt;
                llMessageLinked(LINK_THIS, 98745920,httmsg,httkey);                               &lt;br /&gt;
            }&lt;br /&gt;
            spellchecks = llDeleteSubList(spellchecks,splliPos, splliPos + 3);&lt;br /&gt;
        }&lt;br /&gt;
        if (~llListFindList(tempDetections, (list)request_id))&lt;br /&gt;
        {   // Language Detection&lt;br /&gt;
            integer tmpliPos = llListFindList(tempDetections, (list)request_id);&lt;br /&gt;
            key speakerID = llList2Key(tempDetections, tmpliPos + 1);&lt;br /&gt;
            tempDetections = llDeleteSubList(tempDetections, tmpliPos, tmpliPos + 2);&lt;br /&gt;
            string htttmpStr = llToLower(llGetSubString(body, llSubStringIndex(body, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(body, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
            if (contains(htttmpStr, &amp;quot;err&amp;quot;) == 0 &amp;amp;&amp;amp; contains(htttmpStr, &amp;quot;unn&amp;quot;) == 0)&lt;br /&gt;
            {   // We Trust the Google system, the Google´s guys are good and I am sure they will keep improving :-)&lt;br /&gt;
                // Language Detected&lt;br /&gt;
                if(llStringLength(htttmpStr) &amp;lt;= 3)&lt;br /&gt;
                {&lt;br /&gt;
                    llMessageLinked(LINK_THIS,6349160,htttmpStr,speakerID);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
        integer r;&lt;br /&gt;
        list newList;&lt;br /&gt;
        float timeElapsed;&lt;br /&gt;
        for (r = 0; r &amp;lt; llGetListLength(spellchecks); r += 4)&lt;br /&gt;
        {&lt;br /&gt;
            timeElapsed = llGetTime() - llList2Float(spellchecks, r + 3);&lt;br /&gt;
            if (timeElapsed &amp;lt; 10.0)&lt;br /&gt;
            {&lt;br /&gt;
                newList = (newList=[]) + newList + llList2List(spellchecks, r, r + 3);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        spellchecks = newList;&lt;br /&gt;
        newList = [];&lt;br /&gt;
        for (r = 0; r &amp;lt; llGetListLength(tempDetections); r += 3)&lt;br /&gt;
        {&lt;br /&gt;
            timeElapsed = llGetTime() - llList2Float(tempDetections, r + 2);&lt;br /&gt;
            if (timeElapsed &amp;lt; 10.0)&lt;br /&gt;
            {&lt;br /&gt;
                newList = (newList=[]) + newList + llList2List(tempDetections, r, r + 2);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        tempDetections = newList;&lt;br /&gt;
        newList = [];&lt;br /&gt;
        llSetTimerEvent(5.0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Formulator&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//Spell Checker Web Services powered by Yahoo&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
string SEPARATOR = &amp;quot;|%&amp;amp;|&amp;quot;; // for transmitting lists via linked messages&lt;br /&gt;
&lt;br /&gt;
integer M = 1;&lt;br /&gt;
integer ShowTranslations = TRUE;&lt;br /&gt;
&lt;br /&gt;
sendIM(key imid, string imstr)&lt;br /&gt;
{&lt;br /&gt;
    // llInstantMessage(key id , string message) causes the script to sleep for 2 seconds&lt;br /&gt;
        if (imid != llGetOwner())&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(imstr + &amp;quot; @&amp;quot; + llKey2Name(imid));  // llOwnerSay(string message) has no delay&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (M == 8)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_ALL_OTHERS,2334420,imstr,imid);&lt;br /&gt;
            M = 1;&lt;br /&gt;
        }&lt;br /&gt;
        else if (M == 7)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_ALL_OTHERS,2334430,imstr,imid);&lt;br /&gt;
            M = 8;&lt;br /&gt;
        }&lt;br /&gt;
        else if (M == 6)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_ALL_OTHERS,2334440,imstr,imid);&lt;br /&gt;
            M = 7;&lt;br /&gt;
        }&lt;br /&gt;
        else if (M == 5)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_ALL_OTHERS,2334450,imstr,imid);&lt;br /&gt;
            M = 6;&lt;br /&gt;
        }&lt;br /&gt;
        else if (M == 4)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_ALL_OTHERS,2334460,imstr,imid);&lt;br /&gt;
            M = 5;&lt;br /&gt;
        }&lt;br /&gt;
        else if (M == 3)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_ALL_OTHERS,2334470,imstr,imid);&lt;br /&gt;
            M = 4;&lt;br /&gt;
        }&lt;br /&gt;
        else if (M == 2)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_ALL_OTHERS,2334480,imstr,imid);&lt;br /&gt;
            M = 3;&lt;br /&gt;
        }&lt;br /&gt;
        else if (M == 1)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_ALL_OTHERS,2334490,imstr,imid);&lt;br /&gt;
            M = 2;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
    if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
    {&lt;br /&gt;
        integer gkliPos = llListFindList(agentsInTranslation, (list)agentID);&lt;br /&gt;
        return llList2Key(agentsInTranslation, gkliPos - 4);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return NULL_KEY;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list TypeSep2List(string inputstring) &lt;br /&gt;
{ // converts a separated string created with List2TypeSep back to a list with the correct type information&lt;br /&gt;
    integer i;&lt;br /&gt;
    list input;&lt;br /&gt;
    list output;&lt;br /&gt;
    input = llParseString2List(inputstring, [SEPARATOR], []);&lt;br /&gt;
    for (i = 0; i &amp;lt; llGetListLength(input); i += 2)&lt;br /&gt;
    {&lt;br /&gt;
        if (llList2Integer(input, i) == TYPE_INTEGER) output += (integer)llList2String(input, i + 1);&lt;br /&gt;
        else if (llList2Integer(input, i) == TYPE_FLOAT) output += (float)llList2String(input, i + 1);&lt;br /&gt;
        else if (llList2Integer(input, i) == TYPE_STRING) output += llList2String(input, i + 1);&lt;br /&gt;
        else if (llList2Integer(input, i) == TYPE_KEY) output += (key)llList2String(input, i + 1);&lt;br /&gt;
    }    &lt;br /&gt;
    return output;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string List2TypeSep(list input)&lt;br /&gt;
{ // converts a list to a separated string with type information prepended to each item&lt;br /&gt;
    integer i;&lt;br /&gt;
    list output;&lt;br /&gt;
    for (i = 0; i &amp;lt; llGetListLength(input); i++)&lt;br /&gt;
    {&lt;br /&gt;
        output += [llGetListEntryType(input, i)] + llList2List(input, i, i);&lt;br /&gt;
    }&lt;br /&gt;
    return llDumpList2String(output, SEPARATOR);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(1.0);&lt;br /&gt;
    }&lt;br /&gt;
    link_message(integer sender_num, integer num, string lstr, key id)&lt;br /&gt;
    {&lt;br /&gt;
        if (num == 7659759)&lt;br /&gt;
        {&lt;br /&gt;
            agentsInTranslation = TypeSep2List(lstr);&lt;br /&gt;
        }&lt;br /&gt;
        if (num == 9827491)&lt;br /&gt;
        {&lt;br /&gt;
            llSetTimerEvent(0.0);&lt;br /&gt;
            list txli;&lt;br /&gt;
            key recepientID;&lt;br /&gt;
            key txID;&lt;br /&gt;
            integer rxID;&lt;br /&gt;
            string recepientLanguage;&lt;br /&gt;
            string speakerLanguage;&lt;br /&gt;
            string txmessage;&lt;br /&gt;
            txID = id;&lt;br /&gt;
            txli = TypeSep2List(lstr);&lt;br /&gt;
            rxID = llList2Integer(txli,0);&lt;br /&gt;
            speakerLanguage = llList2String(txli,1);&lt;br /&gt;
            txmessage = llList2String(txli,2);&lt;br /&gt;
            recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, (list)rxID) - 3);&lt;br /&gt;
            recepientID = getAgentKey(rxID);&lt;br /&gt;
//            llOwnerSay(&amp;quot;Formulator line 137: \nrxID: &amp;quot; + (string)rxID + &amp;quot;\nspeakerLanguage: &amp;quot; + speakerLanguage + &amp;quot;\nRecepientID: &amp;quot; + (string)recepientID);&lt;br /&gt;
            if (recepientID != NULL_KEY)&lt;br /&gt;
            {&lt;br /&gt;
                if (recepientLanguage == speakerLanguage)&lt;br /&gt;
                { }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    sendIM(recepientID,txmessage);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            llSetTimerEvent(5.0);&lt;br /&gt;
        }&lt;br /&gt;
        if (num == 98745920)&lt;br /&gt;
        {&lt;br /&gt;
            llSetTimerEvent(0.0);&lt;br /&gt;
            list translationCache;&lt;br /&gt;
            integer w;&lt;br /&gt;
            string  spkrLan;&lt;br /&gt;
            string  recepLan;&lt;br /&gt;
            integer recepID;&lt;br /&gt;
            integer lstliPos;&lt;br /&gt;
            string  lanpair;&lt;br /&gt;
            string txtchat;&lt;br /&gt;
            key txID;&lt;br /&gt;
            float cacheTime;&lt;br /&gt;
            txID = id;&lt;br /&gt;
            txtchat = lstr;&lt;br /&gt;
            if (~llListFindList(agentsInTranslation, (list)txID))&lt;br /&gt;
            {&lt;br /&gt;
                spkrLan = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, (list)txID ) + 1 );&lt;br /&gt;
                cacheTime = llGetTime();&lt;br /&gt;
                //===============================&lt;br /&gt;
                // Formulate Translation Requests&lt;br /&gt;
                //===============================&lt;br /&gt;
                for (w = 0; w &amp;lt; llGetListLength(agentsInTranslation); w += 5)&lt;br /&gt;
                {    // Loop through translation group and do appropriate translations as needed&lt;br /&gt;
                    recepID = llList2Integer(agentsInTranslation, w + 4);&lt;br /&gt;
                    recepLan = llList2String(agentsInTranslation, w + 1);&lt;br /&gt;
                    if (spkrLan == recepLan)&lt;br /&gt;
                    { }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
                        if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
                        {&lt;br /&gt;
                            lstliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
                            translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
                        }&lt;br /&gt;
                        else&lt;br /&gt;
                        {&lt;br /&gt;
                            translationCache = (translationCache=[]) + translationCache + [ lanpair, recepID, cacheTime ];&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                if (translationCache != [])&lt;br /&gt;
                {    // Process Requests&lt;br /&gt;
                    for (w = 0; w &amp;lt; llGetListLength(translationCache); w += 3)&lt;br /&gt;
                    {   //====================================&lt;br /&gt;
                        //Translation&lt;br /&gt;
                        //====================================&lt;br /&gt;
                        //Forumulate and Send Translation Request&lt;br /&gt;
                        lanpair = llList2String(llParseStringKeepNulls(llList2String(translationCache, w), [&amp;quot;|&amp;quot;],[]), 1);&lt;br /&gt;
                        list tomali = [ txtchat, lanpair, llList2String(translationCache, w + 1), llList2String(translationCache, w)];&lt;br /&gt;
                        llMessageLinked(LINK_THIS, 2346017, List2TypeSep(tomali), txID);&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            llSetTimerEvent(1.0);&lt;br /&gt;
        } &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
        llMessageLinked(LINK_THIS,9876754,&amp;quot;&amp;quot;,NULL_KEY);&lt;br /&gt;
        llSetTimerEvent(9.0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Translator&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//Spell Checker Web Services powered by Yahoo&lt;br /&gt;
integer tranObjects = TRUE;&lt;br /&gt;
integer SpellChecker = TRUE;&lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
key returnValue;&lt;br /&gt;
list requestedTranslations;&lt;br /&gt;
string SEPARATOR = &amp;quot;|%&amp;amp;|&amp;quot;; // for transmitting lists via linked messages&lt;br /&gt;
&lt;br /&gt;
Translate(string chkmsg, list chkli)&lt;br /&gt;
{&lt;br /&gt;
    list txli;&lt;br /&gt;
    returnValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&amp;amp;q=&amp;quot; + llEscapeURL(chkmsg) + &amp;quot;&amp;amp;langpair=%7C&amp;quot; + llList2String(chkli,4), [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot;&amp;quot;);&lt;br /&gt;
    if (returnValue != NULL_KEY)&lt;br /&gt;
    {    // Translation&lt;br /&gt;
        txli = (txli=[]) + txli + [returnValue];&lt;br /&gt;
        txli = (txli=[]) + txli + chkli;&lt;br /&gt;
        requestedTranslations = (requestedTranslations=[]) + requestedTranslations + txli;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llSleep(25.0); // Something has gone horribly wrong, sleep 25 seconds to clear throttle&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
processHTTPResponse(string bodyStr, list httli)&lt;br /&gt;
{&lt;br /&gt;
    llSetTimerEvent(0.0);&lt;br /&gt;
    key     recepientID;&lt;br /&gt;
    key     speakerID;&lt;br /&gt;
    list processli;&lt;br /&gt;
    list    paramtmpli;&lt;br /&gt;
    list    recepientList;&lt;br /&gt;
    string  recepientLanguage;&lt;br /&gt;
    string  languagePair;&lt;br /&gt;
    string  speakerName;&lt;br /&gt;
    string  speakerLanguage;&lt;br /&gt;
    string  translatedText;&lt;br /&gt;
    string  lantmpStr;&lt;br /&gt;
    integer z;&lt;br /&gt;
    //===================&lt;br /&gt;
    // Process Translation&lt;br /&gt;
    //===================&lt;br /&gt;
    processli = httli;&lt;br /&gt;
    speakerID  = llList2Key(processli, 1);&lt;br /&gt;
    speakerName = llKey2Name(speakerID);&lt;br /&gt;
    if (speakerName == &amp;quot;&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
    }&lt;br /&gt;
    recepientList = llParseString2List(llList2String(processli, 2), [&amp;quot;@&amp;quot;], []);&lt;br /&gt;
    paramtmpli = llParseStringKeepNulls(llList2String(processli, 3), [&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
    speakerLanguage = llList2String(paramtmpli, 0);&lt;br /&gt;
    recepientLanguage = llList2String(paramtmpli, 1);&lt;br /&gt;
    languagePair = llDumpList2String(paramtmpli, &amp;quot;&amp;gt;&amp;gt;&amp;quot;);&lt;br /&gt;
//    llOwnerSay(&amp;quot;Tanslator ProcessHttResponse\nFrom: &amp;quot; + speakerName + &amp;quot;\nTo: &amp;quot; + llList2CSV(recepientList) + &amp;quot;\nParams: &amp;quot; + llList2CSV(paramtmpli) + &amp;quot;\nRx Lan: &amp;quot; + recepientLanguage + &amp;quot;\nLanguage Pair: &amp;quot; + languagePair);&lt;br /&gt;
    // Perform Text Cleanup&lt;br /&gt;
    translatedText = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;detectedSourceLanguage\&amp;quot;:\&amp;quot;&amp;quot;));&lt;br /&gt;
    // Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
    if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
    {&lt;br /&gt;
        lantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
        for(z = llStringLength(translatedText);z &amp;gt;= 0; z--)&lt;br /&gt;
        {&lt;br /&gt;
            lantmpStr = (lantmpStr=&amp;quot;&amp;quot;) + lantmpStr + llGetSubString(translatedText, z, z);&lt;br /&gt;
        }&lt;br /&gt;
        translatedText = lantmpStr;&lt;br /&gt;
    }&lt;br /&gt;
    lantmpStr = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
    for (z = 0; z &amp;lt; llGetListLength(recepientList); z += 1)&lt;br /&gt;
    {&lt;br /&gt;
        list forli;&lt;br /&gt;
        forli = [ llList2Integer(recepientList, z), speakerLanguage , lantmpStr ];&lt;br /&gt;
        llMessageLinked(LINK_THIS,9827491, List2TypeSep(forli) , speakerID);&lt;br /&gt;
    }&lt;br /&gt;
    llSetTimerEvent(4.0);&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string List2TypeSep(list input) { // converts a list to a separated string with type information prepended to each item&lt;br /&gt;
    integer     i;&lt;br /&gt;
    list        output;&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; llGetListLength(input); i++) {&lt;br /&gt;
        output += [llGetListEntryType(input, i)] + llList2List(input, i, i);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return llDumpList2String(output, SEPARATOR);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list TypeSep2List(string inputstring) &lt;br /&gt;
{ &lt;br /&gt;
    integer     i;&lt;br /&gt;
    list        input;&lt;br /&gt;
    list        output;&lt;br /&gt;
    &lt;br /&gt;
    input = llParseString2List(inputstring, [SEPARATOR], []);&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; llGetListLength(input); i += 2) {&lt;br /&gt;
        if (llList2Integer(input, i) == TYPE_INTEGER) output += (integer)llList2String(input, i + 1);&lt;br /&gt;
        else if (llList2Integer(input, i) == TYPE_FLOAT) output += (float)llList2String(input, i + 1);&lt;br /&gt;
        else if (llList2Integer(input, i) == TYPE_STRING) output += llList2String(input, i + 1);&lt;br /&gt;
        else if (llList2Integer(input, i) == TYPE_KEY) output += (key)llList2String(input, i + 1);&lt;br /&gt;
    }   &lt;br /&gt;
    return output;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(1.0);&lt;br /&gt;
    }&lt;br /&gt;
    link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
    {&lt;br /&gt;
        if (num == 2346017)&lt;br /&gt;
        {            &lt;br /&gt;
            list txli;&lt;br /&gt;
            key txID;&lt;br /&gt;
            txli = TypeSep2List(lstr);&lt;br /&gt;
//            llOwnerSay(&amp;quot;Translator, link_message received: &amp;quot; + llList2CSV(txli));&lt;br /&gt;
            txID = lid;            &lt;br /&gt;
            Translate( llList2String(txli,0),[ llGetTime(), txID, llList2String(txli,2), llList2String(txli,3), llList2String(txli,1) ] );&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
    {   // Process Response Code&lt;br /&gt;
        if (~llListFindList(requestedTranslations, (list)request_id))&lt;br /&gt;
        {   // Translation&lt;br /&gt;
            integer httliPos;&lt;br /&gt;
            string httmsg;&lt;br /&gt;
            httliPos = llListFindList(requestedTranslations, (list)request_id);&lt;br /&gt;
            httmsg = body;&lt;br /&gt;
            processHTTPResponse(httmsg, llList2List(requestedTranslations, httliPos + 1, httliPos + 4 ));&lt;br /&gt;
            requestedTranslations = llDeleteSubList(requestedTranslations, httliPos, httliPos + 4);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
        integer r;&lt;br /&gt;
        float timeElapsed;&lt;br /&gt;
        list newList;&lt;br /&gt;
        for (r = 0; r &amp;lt; llGetListLength(requestedTranslations); r += 6)&lt;br /&gt;
        {&lt;br /&gt;
            timeElapsed = llGetTime() - llList2Float(requestedTranslations, r + 1);&lt;br /&gt;
            if (timeElapsed &amp;lt; 20.0)&lt;br /&gt;
            {&lt;br /&gt;
                newList = (newList=[]) + newList + llList2List(requestedTranslations, r, r + 5);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        requestedTranslations = newList;&lt;br /&gt;
        newList = [];&lt;br /&gt;
        llSetTimerEvent(5.0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=695222</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=695222"/>
		<updated>2009-12-31T15:21:33Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: /* OK */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribución al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente código fué originálmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mí manera...&lt;br /&gt;
No ós riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;OK&#039;&#039; ===&lt;br /&gt;
Bueno, despues de respiñar todo lo que pude, creo que el uso de memoria y la velocidad están prácticamente igual qué en la versión original pero bueno... en la variedad está el gusto no?&lt;br /&gt;
Ya he probado un poco el código, y parece que funciona aunque estoy teniendo algunos problemas... Por ejemplo creo que el sistema de traduccion no funciona corréctamente, y no me refiero al sistema de traduccion de Google (en mi opinion, si no es el mejor, es uno de los mejores del mundo), sino a que aún queda mucho trabajo por hacer en el script...&lt;br /&gt;
&lt;br /&gt;
El siguiente paso sera intentar dividir el script en dos, o si es posible en tres para repartir el uso de memoria. Tambien me gustaria probar un truco que uso a menudo para traducir páginas en un idioma que no entiendo, lo que hago es que en vez de traducir diréctamente al español, primero se traduce a inglés, y luego desde inglés al español. Parece una tontería y un gasto innecesario, pero si lo hago es porque así suelo entender mejor las traducciones.&lt;br /&gt;
Quiero por un lado el sistema de comunicacion y evaluacion entre traductores, y por otro el sistema de traduccion entre avatares, ¿es muy dificil? no sé ya lo veremos...&lt;br /&gt;
&lt;br /&gt;
Well, after saving as much as I could, I think the memory usage and the speed are technically the same as in the original script, but well, in the variety is the taste, isnt it?. &lt;br /&gt;
I have tested a bit the code above already, and it seems to work altought i´m having some problems...&lt;br /&gt;
For instance i think the translation system is not working properly, and i dont mean the Google´s translation system (in my opinion, if is not the best, one of the bests), but that there is still much work to do in the script...&lt;br /&gt;
&lt;br /&gt;
The next step will be to try to divide the script in 2, or 3 if is possible, so we can spread the memory usage. Also I would like to test a trick i use often for to translate languages that i dont understand, what I do first is to translate that language into English, and then from English to Spanish, it seems a nonsense and unnecesary waste, but if i do it is becouse so i usually understand the translations better.&lt;br /&gt;
I want by one part the translators communications and evaluation system, and by other the translation system between avatars, is it very difficult? I don´t know , we will see...&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Es dificil... me está costando pero ya veremos...&lt;br /&gt;
Its difficult... i am struggling but we will see...&lt;br /&gt;
&lt;br /&gt;
chu chu chu&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
De Güatemala a Güatepeor, Sin comentarios...&lt;br /&gt;
&lt;br /&gt;
From Güatebad to Güateworse, No comments...&lt;br /&gt;
&lt;br /&gt;
Buscando en Internet he encontrado este [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html API de Yahoo] comprobador de ortografía, aunque creo que por ahora sólo soporta el lenguage inglés pero sería interesante añadirlo al proyecto&lt;br /&gt;
&lt;br /&gt;
Searching on the web I crossed in my way with this spell checker [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html Yahoo´s API] , I think that it only supports English language by now althought it would be interesting to add it to the project&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Estoy probando el comprobador de deletreo de Yahoo aunque la verdad es que no estoy teniendo buenos resultados, parece que Google es mucho más rapido y necesito corregir antes de traducir. También estoy intentando solucionar el error que aparece con el símbolo (apostrofe) ´ en las frases con genitivo sajon traducidas al inglés y tampoco doy con la tecla... Ya que esto me está dando muchos dolores de cabeza quizás deje el proyecto en standby hasta después de navidades.&lt;br /&gt;
&lt;br /&gt;
I am testing the Yahoo´s spell checker althought to be honest I´m not having good success, it seems Google is much faster and I need to correct before translate. Also I am triying to fix the error showed in the phrases translated to English with the saxons genitive apostrophe ´ and still triying and triying. As this is driving me nuts, maybe I will leave the project in standby until new year.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ESTO ES EL TRADUCTOR &amp;quot;un lío&amp;quot; por ahora... Necesito rehacer algunas cosas&lt;br /&gt;
&lt;br /&gt;
THIS IS THE TRANSLATOR &amp;quot;mess&amp;quot; by now... I need to redo some things&lt;br /&gt;
&#039;&#039;&#039;THE CODE BELOW IS WORKING AND BEING TESTED&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
agentsinTranslation&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//Spell Checker Web Services powered by Yahoo&lt;br /&gt;
key owner;&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
integer isInitialized = FALSE;&lt;br /&gt;
integer listenID;&lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
string SEPARATOR = &amp;quot;|%&amp;amp;|&amp;quot;; // for transmitting lists via linked messages&lt;br /&gt;
&lt;br /&gt;
string checkLanguage(string chklantmpStr)&lt;br /&gt;
{&lt;br /&gt;
    if (chklantmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;en&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else if (chklantmpStr == &amp;quot;und&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;el&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if (llGetSubString(chklantmpStr, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = llGetSubString(chklantmpStr, 0, 1);&lt;br /&gt;
    }&lt;br /&gt;
    return chklantmpStr;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
    integer avliPos;&lt;br /&gt;
    integer idNum;&lt;br /&gt;
    if (~llListFindList(agentsInTranslation, (list)avid))&lt;br /&gt;
    {&lt;br /&gt;
        avliPos = llListFindList(agentsInTranslation, (list)avid);&lt;br /&gt;
        agentsInTranslation = llListReplaceList(agentsInTranslation, [ avlan, avlan, chklan ], avliPos + 1, avliPos + 3);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        @at;&lt;br /&gt;
        idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
        if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
        {&lt;br /&gt;
            jump at;&lt;br /&gt;
        }&lt;br /&gt;
        agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [ avid, avlan, avlan, chklan, idNum ];        // llMessageLinked(LINK_THIS, 64562349, avlan, avid);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string addNewAgent(key newavid)&lt;br /&gt;
{&lt;br /&gt;
    string speakerLan;&lt;br /&gt;
    if (llGetAgentSize(newavid) == ZERO_VECTOR)&lt;br /&gt;
    {&lt;br /&gt;
        speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
        addAgent(newavid, speakerLan, 4);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        speakerLan  = checkLanguage(llGetAgentLanguage(newavid));&lt;br /&gt;
        if (speakerLan == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
            addAgent(newavid, speakerLan, 0);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            addAgent(newavid, speakerLan, 0);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return speakerLan;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
    if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
    {&lt;br /&gt;
        integer gkliPos = llListFindList(agentsInTranslation, (list)agentID);&lt;br /&gt;
        return llList2Key(agentsInTranslation, gkliPos - 4);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return NULL_KEY;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string List2TypeSep(list input) { // converts a list to a separated string with type information prepended to each item&lt;br /&gt;
    integer     i;&lt;br /&gt;
    list        output;&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; llGetListLength(input); i++) {&lt;br /&gt;
        output += [llGetListEntryType(input, i)] + llList2List(input, i, i);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return llDumpList2String(output, SEPARATOR);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list TypeSep2List(string inputstring) { // converts a separated string created with List2TypeSep back to a list with the correct type information&lt;br /&gt;
    integer     i;&lt;br /&gt;
    list        input;&lt;br /&gt;
    list        output;&lt;br /&gt;
    &lt;br /&gt;
    input = llParseString2List(inputstring, [SEPARATOR], []);&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; llGetListLength(input); i += 2) {&lt;br /&gt;
        if (llList2Integer(input, i) == TYPE_INTEGER) output += (integer)llList2String(input, i + 1);&lt;br /&gt;
        else if (llList2Integer(input, i) == TYPE_FLOAT) output += (float)llList2String(input, i + 1);&lt;br /&gt;
        else if (llList2Integer(input, i) == TYPE_STRING) output += llList2String(input, i + 1);&lt;br /&gt;
        else if (llList2Integer(input, i) == TYPE_KEY) output += (key)llList2String(input, i + 1);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return output;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        owner = llGetOwner();&lt;br /&gt;
        llSetTimerEvent(1.0);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
    {&lt;br /&gt;
        if (num == 9876754)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS,7659759,List2TypeSep(agentsInTranslation),NULL_KEY);&lt;br /&gt;
        }&lt;br /&gt;
        if (num == 6349160)&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            key speaker;&lt;br /&gt;
            string spkLan;&lt;br /&gt;
            speaker = lid;&lt;br /&gt;
            spkLan = lstr;&lt;br /&gt;
            if (~llListFindList(agentsInTranslation, (list)speaker))&lt;br /&gt;
            {&lt;br /&gt;
                integer tmpavliPos = llListFindList(agentsInTranslation, (list)speaker);&lt;br /&gt;
                string actlan = llList2String(agentsInTranslation, tmpavliPos + 1);&lt;br /&gt;
                string tmplan = llList2String(agentsInTranslation, tmpavliPos + 2);&lt;br /&gt;
                if (llList2Integer(agentsInTranslation, tmpavliPos + 3) &amp;gt;= 2)&lt;br /&gt;
                {   // if anyone speaks on any different language 3 times in a row&lt;br /&gt;
                    addAgent(lid, lstr, 0);&lt;br /&gt;
                }&lt;br /&gt;
                if (actlan == lstr)&lt;br /&gt;
                {   // reset language checker for speaker&lt;br /&gt;
                    agentsInTranslation = llListReplaceList(agentsInTranslation, [actlan, 0], tmpavliPos + 2, tmpavliPos + 3);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    if (lstr == tmplan)&lt;br /&gt;
                    {   // if language of speaker is not the same as detected language&lt;br /&gt;
                        agentsInTranslation = llListReplaceList(agentsInTranslation,[llList2Integer(agentsInTranslation,tmpavliPos + 3) + 1] , tmpavliPos + 3, tmpavliPos + 3);&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        agentsInTranslation = llListReplaceList(agentsInTranslation,[lstr, 0] , tmpavliPos + 2, tmpavliPos + 3);&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    sensor(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        integer s;&lt;br /&gt;
        key sid;&lt;br /&gt;
        for (s = 0; s &amp;lt; num_detected; s += 1)&lt;br /&gt;
        {&lt;br /&gt;
            sid = llDetectedKey(s);&lt;br /&gt;
            if (~llListFindList(agentsInTranslation, (list)sid))&lt;br /&gt;
            { }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                addNewAgent(sid);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    no_sensor()&lt;br /&gt;
    { }&lt;br /&gt;
&lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        if(~llListFindList(agentsInTranslation, (list)id))&lt;br /&gt;
        { }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            addNewAgent(id);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        integer r;&lt;br /&gt;
        vector  tmrVct;&lt;br /&gt;
        list tmrli;&lt;br /&gt;
        list  newList;&lt;br /&gt;
        llSetTimerEvent(0.0);   // we better reset timer by way of precaution&lt;br /&gt;
        if (isInitialized == FALSE)&lt;br /&gt;
        {&lt;br /&gt;
            string mylanguage;&lt;br /&gt;
            enabled = TRUE;&lt;br /&gt;
            listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
            llMessageLinked(LINK_THIS, 6877259, (string)enabled, NULL_KEY);&lt;br /&gt;
            isInitialized = TRUE;&lt;br /&gt;
            mylanguage = llGetAgentLanguage(owner);&lt;br /&gt;
            if (llStringLength(mylanguage) &amp;lt; 1)&lt;br /&gt;
            {&lt;br /&gt;
                mylanguage = &amp;quot;en&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            if(~llListFindList(agentsInTranslation, (list)owner))&lt;br /&gt;
            {&lt;br /&gt;
                integer ownerliPos;&lt;br /&gt;
                ownerliPos = llListFindList(agentsInTranslation, (list)owner);&lt;br /&gt;
                agentsInTranslation = llListReplaceList(agentsInTranslation, [mylanguage] , ownerliPos + 1, ownerliPos + 1);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [ owner , mylanguage, mylanguage , 0 , llRound(llFrand(2000000)) + 1];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            for (r = 0; r &amp;lt; llGetListLength(agentsInTranslation); r += 5)&lt;br /&gt;
            {&lt;br /&gt;
                tmrli = llGetObjectDetails(llList2Key(agentsInTranslation, r), [OBJECT_POS]);&lt;br /&gt;
                tmrVct = llList2Vector(tmrli, 0);&lt;br /&gt;
                if (tmrVct == ZERO_VECTOR)&lt;br /&gt;
                {  }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    if (llVecDist(llGetPos(), tmrVct) &amp;lt;= 20.0)&lt;br /&gt;
                    {&lt;br /&gt;
                        newList = (newList=[]) + newList + llList2List(agentsInTranslation, r, r + 4);&lt;br /&gt;
                    }&lt;br /&gt;
                }                   &lt;br /&gt;
            }&lt;br /&gt;
            agentsInTranslation = newList;&lt;br /&gt;
            newList = [];&lt;br /&gt;
        }&lt;br /&gt;
        if (autoLanguage == TRUE &amp;amp;&amp;amp; isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            llSensor(&amp;quot;&amp;quot;, NULL_KEY, AGENT, 20.0, PI);&lt;br /&gt;
        }&lt;br /&gt;
        llSetTimerEvent(4.0);   // restart timer&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
CheckSpell-DetectLanguage&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//Spell Checker Web Services powered by Yahoo&lt;br /&gt;
key splValue;&lt;br /&gt;
key dtcValue;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer enabled = TRUE;&lt;br /&gt;
integer showTranslation = TRUE;&lt;br /&gt;
integer tranObjects = TRUE;&lt;br /&gt;
integer SpellChecker = 1;&lt;br /&gt;
list tempDetections;&lt;br /&gt;
list spellchecks;&lt;br /&gt;
&lt;br /&gt;
string strReplace(string str, string search, string replace) {&lt;br /&gt;
    return llDumpList2String(llParseStringKeepNulls((str = &amp;quot;&amp;quot;) + str, [search], []), replace);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex&lt;br /&gt;
{&lt;br /&gt;
    return ~llSubStringIndex(haystack, needle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
DetectLanguage(string dtcmsg, key dtcid)&lt;br /&gt;
{&lt;br /&gt;
    llSleep(0.2);&lt;br /&gt;
    dtcValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&amp;amp;q=&amp;quot; + llEscapeURL(dtcmsg), [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot; &amp;quot;);&lt;br /&gt;
    if (dtcValue != NULL_KEY)&lt;br /&gt;
    {&lt;br /&gt;
        tempDetections = (tempDetections=[]) + tempDetections + [ dtcValue, dtcid, llGetTime() ];&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llSleep(10.0); // Something has gone horribly wrong, sleep 10 seconds clear throttle&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
CheckSpell(string splmsg, key splid)&lt;br /&gt;
{&lt;br /&gt;
    splValue = llHTTPRequest(&amp;quot;http://search.yahooapis.com/WebSearchService/V1/spellingSuggestion?appid=DNPjiabV34EOgXQ3kAu6.d7kf6v.JUGCn1bFUcSTFMSGCyCy_ALzbepYstlI7DrOGP0-&amp;amp;query=&amp;quot; + llEscapeURL(splmsg), [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot;&amp;quot;);&lt;br /&gt;
    if (splValue != NULL_KEY)&lt;br /&gt;
    {    // Translation&lt;br /&gt;
        spellchecks = (spellchecks=[]) + spellchecks + [ splValue, splid, strReplace(splmsg,&amp;quot;,&amp;quot;,&amp;quot;^ñ^&amp;quot;), llGetTime() ];&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llSleep(10.0); // Something has gone horribly wrong, sleep 10 seconds clear throttle&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llListen(0,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        if ((!enabled) &amp;amp;&amp;amp; (isMaster == 1))&lt;br /&gt;
        {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if (!tranObjects)&lt;br /&gt;
        {&lt;br /&gt;
            if (llGetAgentSize(id) == ZERO_VECTOR)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                if (SpellChecker == 1)&lt;br /&gt;
                {&lt;br /&gt;
                    CheckSpell(message, id);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    llMessageLinked(LINK_THIS,98745920,message,id);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            if (SpellChecker == 1)&lt;br /&gt;
            {&lt;br /&gt;
                CheckSpell(message, id);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                llMessageLinked(LINK_THIS,98745920,message,id);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        DetectLanguage(message, id);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
    {   // Process Response Code&lt;br /&gt;
        if (~llListFindList(spellchecks, (list)request_id))&lt;br /&gt;
        {&lt;br /&gt;
            string httmsg;&lt;br /&gt;
            key httkey;&lt;br /&gt;
            integer splliPos = llListFindList(spellchecks, (list)request_id);&lt;br /&gt;
            httkey = llList2Key(spellchecks, splliPos + 1);&lt;br /&gt;
            if(contains(body, &amp;quot;&amp;lt;Result&amp;gt;&amp;quot;) == 0)&lt;br /&gt;
            {   // Yahoo Spell Checker correction&lt;br /&gt;
                httmsg = llList2String(spellchecks, splliPos + 2);&lt;br /&gt;
                llMessageLinked(LINK_THIS,98745920,strReplace(httmsg,&amp;quot;^ñ^&amp;quot;,&amp;quot;,&amp;quot;),httkey);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                httmsg = llGetSubString(body, llSubStringIndex(body, &amp;quot;&amp;lt;Result&amp;gt;&amp;quot;) + 8, llSubStringIndex(body, &amp;quot;&amp;lt;/Result&amp;gt;&amp;quot;) - 1);&lt;br /&gt;
                llMessageLinked(LINK_THIS, 98745920,httmsg,httkey);                               &lt;br /&gt;
            }&lt;br /&gt;
            spellchecks = llDeleteSubList(spellchecks,splliPos, splliPos + 3);&lt;br /&gt;
        }&lt;br /&gt;
        if (~llListFindList(tempDetections, (list)request_id))&lt;br /&gt;
        {   // Language Detection&lt;br /&gt;
            integer tmpliPos = llListFindList(tempDetections, (list)request_id);&lt;br /&gt;
            key speakerID = llList2Key(tempDetections, tmpliPos + 1);&lt;br /&gt;
            tempDetections = llDeleteSubList(tempDetections, tmpliPos, tmpliPos + 2);&lt;br /&gt;
            string htttmpStr = llToLower(llGetSubString(body, llSubStringIndex(body, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(body, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
            if (contains(htttmpStr, &amp;quot;err&amp;quot;) == 0 &amp;amp;&amp;amp; contains(htttmpStr, &amp;quot;unn&amp;quot;) == 0)&lt;br /&gt;
            {   // We Trust the Google system, the Google´s guys are good and I am sure they will keep improving :-)&lt;br /&gt;
                // Language Detected&lt;br /&gt;
                if(llStringLength(htttmpStr) &amp;lt;= 2)&lt;br /&gt;
                {&lt;br /&gt;
                    llMessageLinked(LINK_THIS,6349160,htttmpStr,speakerID);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
        integer r;&lt;br /&gt;
        list newList;&lt;br /&gt;
        float timeElapsed;&lt;br /&gt;
        for (r = 0; r &amp;lt; llGetListLength(spellchecks); r += 4)&lt;br /&gt;
        {&lt;br /&gt;
            timeElapsed = llGetTime() - llList2Float(spellchecks, r + 3);&lt;br /&gt;
            if (timeElapsed &amp;lt; 10.0)&lt;br /&gt;
            {&lt;br /&gt;
                newList = (newList=[]) + newList + llList2List(spellchecks, r, r + 3);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        spellchecks = newList;&lt;br /&gt;
        newList = [];&lt;br /&gt;
        for (r = 0; r &amp;lt; llGetListLength(tempDetections); r += 3)&lt;br /&gt;
        {&lt;br /&gt;
            timeElapsed = llGetTime() - llList2Float(tempDetections, r + 2);&lt;br /&gt;
            if (timeElapsed &amp;lt; 10.0)&lt;br /&gt;
            {&lt;br /&gt;
                newList = (newList=[]) + newList + llList2List(tempDetections, r, r + 2);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        tempDetections = newList;&lt;br /&gt;
        newList = [];&lt;br /&gt;
        llSetTimerEvent(5.0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Formulator&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//Spell Checker Web Services powered by Yahoo&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
string SEPARATOR = &amp;quot;|%&amp;amp;|&amp;quot;; // for transmitting lists via linked messages&lt;br /&gt;
list translationCache;&lt;br /&gt;
integer M = 1;&lt;br /&gt;
integer ShowTranslations = TRUE;&lt;br /&gt;
&lt;br /&gt;
sendIM(key imid, string imstr)&lt;br /&gt;
{&lt;br /&gt;
    // llInstantMessage(key id , string message) causes the script to sleep for 2 seconds&lt;br /&gt;
        if (imid != llGetOwner())&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(imstr + &amp;quot; @&amp;quot; + llKey2Name(imid));  // llOwnerSay(string message) has no delay&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (M == 8)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_ALL_OTHERS,2334420,imstr,imid);&lt;br /&gt;
            M = 1;&lt;br /&gt;
        }&lt;br /&gt;
        else if (M == 7)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_ALL_OTHERS,2334430,imstr,imid);&lt;br /&gt;
            M = 8;&lt;br /&gt;
        }&lt;br /&gt;
        else if (M == 6)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_ALL_OTHERS,2334440,imstr,imid);&lt;br /&gt;
            M = 7;&lt;br /&gt;
        }&lt;br /&gt;
        else if (M == 5)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_ALL_OTHERS,2334450,imstr,imid);&lt;br /&gt;
            M = 6;&lt;br /&gt;
        }&lt;br /&gt;
        else if (M == 4)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_ALL_OTHERS,2334460,imstr,imid);&lt;br /&gt;
            M = 5;&lt;br /&gt;
        }&lt;br /&gt;
        else if (M == 3)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_ALL_OTHERS,2334470,imstr,imid);&lt;br /&gt;
            M = 4;&lt;br /&gt;
        }&lt;br /&gt;
        else if (M == 2)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_ALL_OTHERS,2334480,imstr,imid);&lt;br /&gt;
            M = 3;&lt;br /&gt;
        }&lt;br /&gt;
        else if (M == 1)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_ALL_OTHERS,2334490,imstr,imid);&lt;br /&gt;
            M = 2;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
    if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
    {&lt;br /&gt;
        integer gkliPos = llListFindList(agentsInTranslation, (list)agentID);&lt;br /&gt;
        return llList2Key(agentsInTranslation, gkliPos - 4);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return NULL_KEY;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list TypeSep2List(string inputstring) &lt;br /&gt;
{ // converts a separated string created with List2TypeSep back to a list with the correct type information&lt;br /&gt;
    integer i;&lt;br /&gt;
    list input;&lt;br /&gt;
    list output;&lt;br /&gt;
    input = llParseString2List(inputstring, [SEPARATOR], []);&lt;br /&gt;
    for (i = 0; i &amp;lt; llGetListLength(input); i += 2)&lt;br /&gt;
    {&lt;br /&gt;
        if (llList2Integer(input, i) == TYPE_INTEGER) output += (integer)llList2String(input, i + 1);&lt;br /&gt;
        else if (llList2Integer(input, i) == TYPE_FLOAT) output += (float)llList2String(input, i + 1);&lt;br /&gt;
        else if (llList2Integer(input, i) == TYPE_STRING) output += llList2String(input, i + 1);&lt;br /&gt;
        else if (llList2Integer(input, i) == TYPE_KEY) output += (key)llList2String(input, i + 1);&lt;br /&gt;
    }    &lt;br /&gt;
    return output;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string List2TypeSep(list input)&lt;br /&gt;
{ // converts a list to a separated string with type information prepended to each item&lt;br /&gt;
    integer i;&lt;br /&gt;
    list output;&lt;br /&gt;
    for (i = 0; i &amp;lt; llGetListLength(input); i++)&lt;br /&gt;
    {&lt;br /&gt;
        output += [llGetListEntryType(input, i)] + llList2List(input, i, i);&lt;br /&gt;
    }&lt;br /&gt;
    return llDumpList2String(output, SEPARATOR);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string strReplace(string str, string search, string replace)&lt;br /&gt;
{&lt;br /&gt;
    return llDumpList2String(llParseStringKeepNulls((str = &amp;quot;&amp;quot;) + str, [search], []), replace);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(1.0);&lt;br /&gt;
    }&lt;br /&gt;
    link_message(integer sender_num, integer num, string lstr, key id)&lt;br /&gt;
    {&lt;br /&gt;
        if (num == 7659759)&lt;br /&gt;
        {&lt;br /&gt;
            agentsInTranslation = TypeSep2List(lstr);&lt;br /&gt;
        }&lt;br /&gt;
        if (num == 9827491)&lt;br /&gt;
        {&lt;br /&gt;
            llSetTimerEvent(0.0);&lt;br /&gt;
            list txli;&lt;br /&gt;
            key recepientID;&lt;br /&gt;
            key txID;&lt;br /&gt;
            integer rxID;&lt;br /&gt;
            string recepientLanguage;&lt;br /&gt;
            string speakerLanguage;&lt;br /&gt;
            string txmessage;&lt;br /&gt;
            txID = id;&lt;br /&gt;
            txli = TypeSep2List(lstr);&lt;br /&gt;
            rxID = llList2Integer(txli,0);&lt;br /&gt;
            speakerLanguage = llList2String(txli,1);&lt;br /&gt;
            txmessage = llList2String(txli,2);&lt;br /&gt;
            recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, (list)rxID) - 3);&lt;br /&gt;
            recepientID = getAgentKey(rxID);&lt;br /&gt;
//            llOwnerSay(&amp;quot;Formulator line 137: \nrxID: &amp;quot; + (string)rxID + &amp;quot;\nspeakerLanguage: &amp;quot; + speakerLanguage + &amp;quot;\nRecepientID: &amp;quot; + (string)recepientID);&lt;br /&gt;
            if (recepientID != NULL_KEY)&lt;br /&gt;
            {&lt;br /&gt;
                if (recepientLanguage == speakerLanguage)&lt;br /&gt;
                { }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    sendIM(recepientID,txmessage);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            llSetTimerEvent(5.0);&lt;br /&gt;
        }&lt;br /&gt;
        if (num == 98745920)&lt;br /&gt;
        {&lt;br /&gt;
            llSetTimerEvent(0.0);&lt;br /&gt;
            integer w;&lt;br /&gt;
            string  spkrLan;&lt;br /&gt;
            string  recepLan;&lt;br /&gt;
            integer recepID;&lt;br /&gt;
            integer lstliPos;&lt;br /&gt;
            string  lanpair;&lt;br /&gt;
            string txtchat;&lt;br /&gt;
            key txID;&lt;br /&gt;
            float cacheTime;&lt;br /&gt;
            txID = id;&lt;br /&gt;
            txtchat = strReplace(lstr,&amp;quot;,&amp;quot;,&amp;quot;^ñ^&amp;quot;);&lt;br /&gt;
            if (~llListFindList(agentsInTranslation, (list)txID))&lt;br /&gt;
            {&lt;br /&gt;
                spkrLan = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, (list)txID ) + 1 );&lt;br /&gt;
                cacheTime = llGetTime();&lt;br /&gt;
                //===============================&lt;br /&gt;
                // Formulate Translation Requests&lt;br /&gt;
                //===============================&lt;br /&gt;
                for (w = 0; w &amp;lt; llGetListLength(agentsInTranslation); w += 5)&lt;br /&gt;
                {    // Loop through translation group and do appropriate translations as needed&lt;br /&gt;
                    recepID = llList2Integer(agentsInTranslation, w + 4);&lt;br /&gt;
                    recepLan = llList2String(agentsInTranslation, w + 1);&lt;br /&gt;
                    if (spkrLan == recepLan)&lt;br /&gt;
                    { }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
                        if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
                        {&lt;br /&gt;
                            lstliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
                            translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
                        }&lt;br /&gt;
                        else&lt;br /&gt;
                        {&lt;br /&gt;
                            translationCache = (translationCache=[]) + translationCache + [ lanpair, recepID, cacheTime ];&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                if (translationCache != [])&lt;br /&gt;
                {    // Process Requests&lt;br /&gt;
                    for (w = 0; w &amp;lt; llGetListLength(translationCache); w += 3)&lt;br /&gt;
                    {   //====================================&lt;br /&gt;
                        //Translation&lt;br /&gt;
                        //====================================&lt;br /&gt;
                        //Forumulate and Send Translation Request&lt;br /&gt;
                        lanpair = llList2String(llParseStringKeepNulls(llList2String(translationCache, w), [&amp;quot;|&amp;quot;],[]), 1);&lt;br /&gt;
                        list tomali = [ txtchat, lanpair, llList2String(translationCache, w + 1), llList2String(translationCache, w)];&lt;br /&gt;
                        llMessageLinked(LINK_THIS, 2346017, List2TypeSep(tomali), txID);&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            llSetTimerEvent(5.0);&lt;br /&gt;
        } &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
        integer r;&lt;br /&gt;
        float timeElapsed;&lt;br /&gt;
        list newList;&lt;br /&gt;
        for (r = 0; r &amp;lt; llGetListLength(translationCache); r += 3)&lt;br /&gt;
        {&lt;br /&gt;
            timeElapsed = llGetTime() - llList2Float(translationCache, r + 2);&lt;br /&gt;
            if (timeElapsed &amp;lt; 8.0)&lt;br /&gt;
            {&lt;br /&gt;
                newList = (newList=[]) + newList + llList2List(translationCache, r, r + 2);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        translationCache = newList;&lt;br /&gt;
        newList = [];&lt;br /&gt;
        llMessageLinked(LINK_THIS,9876754,&amp;quot;&amp;quot;,NULL_KEY);&lt;br /&gt;
        llSetTimerEvent(9.0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Translator&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//Spell Checker Web Services powered by Yahoo&lt;br /&gt;
integer tranObjects = TRUE;&lt;br /&gt;
integer SpellChecker = TRUE;&lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
key returnValue;&lt;br /&gt;
list requestedTranslations;&lt;br /&gt;
string SEPARATOR = &amp;quot;|%&amp;amp;|&amp;quot;; // for transmitting lists via linked messages&lt;br /&gt;
&lt;br /&gt;
string strReplace(string str, string search, string replace) {&lt;br /&gt;
    return llDumpList2String(llParseStringKeepNulls((str = &amp;quot;&amp;quot;) + str, [search], []), replace);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Translate(string chkmsg, list chkli)&lt;br /&gt;
{&lt;br /&gt;
    string txmsg;&lt;br /&gt;
    list txli;&lt;br /&gt;
    txmsg = strReplace(chkmsg,&amp;quot;^ñ^&amp;quot;,&amp;quot;,&amp;quot;);&lt;br /&gt;
    returnValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&amp;amp;q=&amp;quot; + llEscapeURL(txmsg) + &amp;quot;&amp;amp;langpair=%7C&amp;quot; + llList2String(chkli,4), [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot;&amp;quot;);&lt;br /&gt;
    if (returnValue != NULL_KEY)&lt;br /&gt;
    {    // Translation&lt;br /&gt;
        txli = (txli=[]) + txli + [returnValue];&lt;br /&gt;
        txli = (txli=[]) + txli + chkli;&lt;br /&gt;
        requestedTranslations = (requestedTranslations=[]) + requestedTranslations + txli;&lt;br /&gt;
        llSleep(0.6);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llSleep(25.0); // Something has gone horribly wrong, sleep 25 seconds to clear throttle&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
processHTTPResponse(string bodyStr, list httli)&lt;br /&gt;
{&lt;br /&gt;
    llSetTimerEvent(0.0);&lt;br /&gt;
    key     recepientID;&lt;br /&gt;
    key     speakerID;&lt;br /&gt;
    list processli;&lt;br /&gt;
    list    paramtmpli;&lt;br /&gt;
    list    recepientList;&lt;br /&gt;
    string  recepientLanguage;&lt;br /&gt;
    string  languagePair;&lt;br /&gt;
    string  speakerName;&lt;br /&gt;
    string  speakerLanguage;&lt;br /&gt;
    string  translatedText;&lt;br /&gt;
    string  lantmpStr;&lt;br /&gt;
    integer z;&lt;br /&gt;
    //===================&lt;br /&gt;
    // Process Translation&lt;br /&gt;
    //===================&lt;br /&gt;
    processli = httli;&lt;br /&gt;
    speakerID  = llList2Key(processli, 1);&lt;br /&gt;
    speakerName = llKey2Name(speakerID);&lt;br /&gt;
    if (speakerName == &amp;quot;&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
    }&lt;br /&gt;
    recepientList = llParseString2List(llList2String(processli, 2), [&amp;quot;@&amp;quot;], []);&lt;br /&gt;
    paramtmpli = llParseStringKeepNulls(llList2String(processli, 3), [&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
    speakerLanguage = llList2String(paramtmpli, 0);&lt;br /&gt;
    recepientLanguage = llList2String(paramtmpli, 1);&lt;br /&gt;
    languagePair = llDumpList2String(paramtmpli, &amp;quot;&amp;gt;&amp;gt;&amp;quot;);&lt;br /&gt;
    llOwnerSay(&amp;quot;Tanslator ProcessHttResponse\nFrom: &amp;quot; + speakerName + &amp;quot;\nTo: &amp;quot; + llList2CSV(recepientList) + &amp;quot;\nParams: &amp;quot; + llList2CSV(paramtmpli) + &amp;quot;\nRx Lan: &amp;quot; + recepientLanguage + &amp;quot;\nLanguage Pair: &amp;quot; + languagePair);&lt;br /&gt;
    // Perform Text Cleanup&lt;br /&gt;
    translatedText = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;detectedSourceLanguage\&amp;quot;:\&amp;quot;&amp;quot;));&lt;br /&gt;
    // Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
    if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
    {&lt;br /&gt;
        lantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
        for(z = llStringLength(translatedText);z &amp;gt;= 0; z--)&lt;br /&gt;
        {&lt;br /&gt;
            lantmpStr = (lantmpStr=&amp;quot;&amp;quot;) + lantmpStr + llGetSubString(translatedText, z, z);&lt;br /&gt;
        }&lt;br /&gt;
        translatedText = lantmpStr;&lt;br /&gt;
    }&lt;br /&gt;
    lantmpStr = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
    for (z = 0; z &amp;lt; llGetListLength(recepientList); z += 1)&lt;br /&gt;
    {&lt;br /&gt;
        list forli;&lt;br /&gt;
        forli = [ llList2Integer(recepientList, z), speakerLanguage , lantmpStr ];&lt;br /&gt;
        llMessageLinked(LINK_THIS,9827491, List2TypeSep(forli) , speakerID);&lt;br /&gt;
    }&lt;br /&gt;
    llSetTimerEvent(4.0);&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string List2TypeSep(list input) { // converts a list to a separated string with type information prepended to each item&lt;br /&gt;
    integer     i;&lt;br /&gt;
    list        output;&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; llGetListLength(input); i++) {&lt;br /&gt;
        output += [llGetListEntryType(input, i)] + llList2List(input, i, i);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return llDumpList2String(output, SEPARATOR);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list TypeSep2List(string inputstring) &lt;br /&gt;
{ &lt;br /&gt;
    integer     i;&lt;br /&gt;
    list        input;&lt;br /&gt;
    list        output;&lt;br /&gt;
    &lt;br /&gt;
    input = llParseString2List(inputstring, [SEPARATOR], []);&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; llGetListLength(input); i += 2) {&lt;br /&gt;
        if (llList2Integer(input, i) == TYPE_INTEGER) output += (integer)llList2String(input, i + 1);&lt;br /&gt;
        else if (llList2Integer(input, i) == TYPE_FLOAT) output += (float)llList2String(input, i + 1);&lt;br /&gt;
        else if (llList2Integer(input, i) == TYPE_STRING) output += llList2String(input, i + 1);&lt;br /&gt;
        else if (llList2Integer(input, i) == TYPE_KEY) output += (key)llList2String(input, i + 1);&lt;br /&gt;
    }   &lt;br /&gt;
    return output;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(1.0);&lt;br /&gt;
    }&lt;br /&gt;
    link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
    {&lt;br /&gt;
        if (num == 2346017)&lt;br /&gt;
        {            &lt;br /&gt;
            list txli;&lt;br /&gt;
            key txID;&lt;br /&gt;
            txli = TypeSep2List(lstr);&lt;br /&gt;
            llOwnerSay(&amp;quot;Translator, link_message received: &amp;quot; + llList2CSV(txli));&lt;br /&gt;
            txID = lid;            &lt;br /&gt;
            Translate( llList2String(txli,0),[ llGetTime(), txID, llList2String(txli,2), llList2String(txli,3), llList2String(txli,1) ] );&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
    {   // Process Response Code&lt;br /&gt;
        if (~llListFindList(requestedTranslations, (list)request_id))&lt;br /&gt;
        {   // Translation&lt;br /&gt;
            integer httliPos;&lt;br /&gt;
            string httmsg;&lt;br /&gt;
            httliPos = llListFindList(requestedTranslations, (list)request_id);&lt;br /&gt;
            httmsg = body;&lt;br /&gt;
            processHTTPResponse(httmsg, llList2List(requestedTranslations, httliPos + 1, httliPos + 4 ));&lt;br /&gt;
            requestedTranslations = llDeleteSubList(requestedTranslations, httliPos, httliPos + 4);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
        integer r;&lt;br /&gt;
        float timeElapsed;&lt;br /&gt;
        list newList;&lt;br /&gt;
        for (r = 0; r &amp;lt; llGetListLength(requestedTranslations); r += 6)&lt;br /&gt;
        {&lt;br /&gt;
            timeElapsed = llGetTime() - llList2Float(requestedTranslations, r + 1);&lt;br /&gt;
            if (timeElapsed &amp;lt; 20.0)&lt;br /&gt;
            {&lt;br /&gt;
                newList = (newList=[]) + newList + llList2List(requestedTranslations, r, r + 5);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        requestedTranslations = newList;&lt;br /&gt;
        newList = [];&lt;br /&gt;
        llSetTimerEvent(5.0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=694362</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=694362"/>
		<updated>2009-12-30T16:30:07Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: /* OK */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribución al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente código fué originálmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mí manera...&lt;br /&gt;
No ós riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;OK&#039;&#039; ===&lt;br /&gt;
Bueno, despues de respiñar todo lo que pude, creo que el uso de memoria y la velocidad están prácticamente igual qué en la versión original pero bueno... en la variedad está el gusto no?&lt;br /&gt;
Ya he probado un poco el código, y parece que funciona aunque estoy teniendo algunos problemas... Por ejemplo creo que el sistema de traduccion no funciona corréctamente, y no me refiero al sistema de traduccion de Google (en mi opinion, si no es el mejor, es uno de los mejores del mundo), sino a que aún queda mucho trabajo por hacer en el script...&lt;br /&gt;
&lt;br /&gt;
El siguiente paso sera intentar dividir el script en dos, o si es posible en tres para repartir el uso de memoria. Tambien me gustaria probar un truco que uso a menudo para traducir páginas en un idioma que no entiendo, lo que hago es que en vez de traducir diréctamente al español, primero se traduce a inglés, y luego desde inglés al español. Parece una tontería y un gasto innecesario, pero si lo hago es porque así suelo entender mejor las traducciones.&lt;br /&gt;
Quiero por un lado el sistema de comunicacion y evaluacion entre traductores, y por otro el sistema de traduccion entre avatares, ¿es muy dificil? no sé ya lo veremos...&lt;br /&gt;
&lt;br /&gt;
Well, after saving as much as I could, I think the memory usage and the speed are technically the same as in the original script, but well, in the variety is the taste, isnt it?. &lt;br /&gt;
I have tested a bit the code above already, and it seems to work altought i´m having some problems...&lt;br /&gt;
For instance i think the translation system is not working properly, and i dont mean the Google´s translation system (in my opinion, if is not the best, one of the bests), but that there is still much work to do in the script...&lt;br /&gt;
&lt;br /&gt;
The next step will be to try to divide the script in 2, or 3 if is possible, so we can spread the memory usage. Also I would like to test a trick i use often for to translate languages that i dont understand, what I do first is to translate that language into English, and then from English to Spanish, it seems a nonsense and unnecesary waste, but if i do it is becouse so i usually understand the translations better.&lt;br /&gt;
I want by one part the translators communications and evaluation system, and by other the translation system between avatars, is it very difficult? I don´t know , we will see...&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Es dificil... me está costando pero ya veremos...&lt;br /&gt;
Its difficult... i am struggling but we will see...&lt;br /&gt;
&lt;br /&gt;
chu chu chu&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
De Güatemala a Güatepeor, Sin comentarios...&lt;br /&gt;
&lt;br /&gt;
From Güatebad to Güateworse, No comments...&lt;br /&gt;
&lt;br /&gt;
Buscando en Internet he encontrado este [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html API de Yahoo] comprobador de ortografía, aunque creo que por ahora sólo soporta el lenguage inglés pero sería interesante añadirlo al proyecto&lt;br /&gt;
&lt;br /&gt;
Searching on the web I crossed in my way with this spell checker [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html Yahoo´s API] , I think that it only supports English language by now althought it would be interesting to add it to the project&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Estoy probando el comprobador de deletreo de Yahoo aunque la verdad es que no estoy teniendo buenos resultados, parece que Google es mucho más rapido y necesito corregir antes de traducir. También estoy intentando solucionar el error que aparece con el símbolo (apostrofe) ´ en las frases con genitivo sajon traducidas al inglés y tampoco doy con la tecla... Ya que esto me está dando muchos dolores de cabeza quizás deje el proyecto en standby hasta después de navidades.&lt;br /&gt;
&lt;br /&gt;
I am testing the Yahoo´s spell checker althought to be honest I´m not having good success, it seems Google is much faster and I need to correct before translate. Also I am triying to fix the error showed in the phrases translated to English with the saxons genitive apostrophe ´ and still triying and triying. As this is driving me nuts, maybe I will leave the project in standby until new year.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ESTO ES EL TRADUCTOR &amp;quot;un lío&amp;quot; por ahora... Necesito rehacer algunas cosas&lt;br /&gt;
&lt;br /&gt;
THIS IS THE TRANSLATOR &amp;quot;mess&amp;quot; by now... I need to redo some things&lt;br /&gt;
&#039;&#039;&#039;THE CODE BELOW IS NOT TESTED&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
agentsinTranslation&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//Spell Checker Web Services powered by Yahoo&lt;br /&gt;
key owner;&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
integer isInitialized = FALSE;&lt;br /&gt;
integer listenID;&lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
string SEPARATOR = &amp;quot;|%&amp;amp;|&amp;quot;; // for transmitting lists via linked messages&lt;br /&gt;
&lt;br /&gt;
string checkLanguage(string chklantmpStr)&lt;br /&gt;
{&lt;br /&gt;
    if (chklantmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;en&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else if (chklantmpStr == &amp;quot;und&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;el&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if (llGetSubString(chklantmpStr, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = llGetSubString(chklantmpStr, 0, 1);&lt;br /&gt;
    }&lt;br /&gt;
    return chklantmpStr;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
    integer avliPos;&lt;br /&gt;
    integer idNum;&lt;br /&gt;
    if (~llListFindList(agentsInTranslation, (list)avid))&lt;br /&gt;
    {&lt;br /&gt;
        avliPos = llListFindList(agentsInTranslation, (list)avid);&lt;br /&gt;
        agentsInTranslation = llListReplaceList(agentsInTranslation, [ avlan, avlan, chklan ], avliPos + 1, avliPos + 3);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        @at;&lt;br /&gt;
        idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
        if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
        {&lt;br /&gt;
            jump at;&lt;br /&gt;
        }&lt;br /&gt;
        agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [ avid, avlan, avlan, chklan, idNum ];        // llMessageLinked(LINK_THIS, 64562349, avlan, avid);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string addNewAgent(key newavid)&lt;br /&gt;
{&lt;br /&gt;
    string speakerLan;&lt;br /&gt;
    if (llGetAgentSize(newavid) == ZERO_VECTOR)&lt;br /&gt;
    {&lt;br /&gt;
        speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
        addAgent(newavid, speakerLan, 4);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        speakerLan  = checkLanguage(llGetAgentLanguage(newavid));&lt;br /&gt;
        if (speakerLan == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
            addAgent(newavid, speakerLan, 0);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            addAgent(newavid, speakerLan, 0);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return speakerLan;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
    if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
    {&lt;br /&gt;
        integer gkliPos = llListFindList(agentsInTranslation, (list)agentID);&lt;br /&gt;
        return llList2Key(agentsInTranslation, gkliPos - 4);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return NULL_KEY;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string List2TypeSep(list input) { // converts a list to a separated string with type information prepended to each item&lt;br /&gt;
    integer     i;&lt;br /&gt;
    list        output;&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; llGetListLength(input); i++) {&lt;br /&gt;
        output += [llGetListEntryType(input, i)] + llList2List(input, i, i);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return llDumpList2String(output, SEPARATOR);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list TypeSep2List(string inputstring) { // converts a separated string created with List2TypeSep back to a list with the correct type information&lt;br /&gt;
    integer     i;&lt;br /&gt;
    list        input;&lt;br /&gt;
    list        output;&lt;br /&gt;
    &lt;br /&gt;
    input = llParseString2List(inputstring, [SEPARATOR], []);&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; llGetListLength(input); i += 2) {&lt;br /&gt;
        if (llList2Integer(input, i) == TYPE_INTEGER) output += (integer)llList2String(input, i + 1);&lt;br /&gt;
        else if (llList2Integer(input, i) == TYPE_FLOAT) output += (float)llList2String(input, i + 1);&lt;br /&gt;
        else if (llList2Integer(input, i) == TYPE_STRING) output += llList2String(input, i + 1);&lt;br /&gt;
        else if (llList2Integer(input, i) == TYPE_KEY) output += (key)llList2String(input, i + 1);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return output;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        owner = llGetOwner();&lt;br /&gt;
        llSetTimerEvent(1.0);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
    {&lt;br /&gt;
        if (num == 9876754)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS,7659759,List2TypeSep(agentsInTranslation),NULL_KEY);&lt;br /&gt;
        }&lt;br /&gt;
        if (num == 6349160)&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            key speaker;&lt;br /&gt;
            string spkLan;&lt;br /&gt;
            speaker = lid;&lt;br /&gt;
            spkLan = lstr;&lt;br /&gt;
            if (~llListFindList(agentsInTranslation, (list)speaker))&lt;br /&gt;
            {&lt;br /&gt;
                integer tmpavliPos = llListFindList(agentsInTranslation, (list)speaker);&lt;br /&gt;
                string actlan = llList2String(agentsInTranslation, tmpavliPos + 1);&lt;br /&gt;
                string tmplan = llList2String(agentsInTranslation, tmpavliPos + 2);&lt;br /&gt;
                if (llList2Integer(agentsInTranslation, tmpavliPos + 3) &amp;gt;= 2)&lt;br /&gt;
                {   // if anyone speaks on any different language 3 times in a row&lt;br /&gt;
                    addAgent(lid, lstr, 0);&lt;br /&gt;
                }&lt;br /&gt;
                if (actlan == lstr)&lt;br /&gt;
                {   // reset language checker for speaker&lt;br /&gt;
                    agentsInTranslation = llListReplaceList(agentsInTranslation, [actlan, 0], tmpavliPos + 2, tmpavliPos + 3);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    if (lstr == tmplan)&lt;br /&gt;
                    {   // if language of speaker is not the same as detected language&lt;br /&gt;
                        agentsInTranslation = llListReplaceList(agentsInTranslation,[llList2Integer(agentsInTranslation,tmpavliPos + 3) + 1] , tmpavliPos + 3, tmpavliPos + 3);&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        agentsInTranslation = llListReplaceList(agentsInTranslation,[lstr, 0] , tmpavliPos + 2, tmpavliPos + 3);&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    sensor(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        integer s;&lt;br /&gt;
        key sid;&lt;br /&gt;
        for (s = 0; s &amp;lt; num_detected; s += 1)&lt;br /&gt;
        {&lt;br /&gt;
            sid = llDetectedKey(s);&lt;br /&gt;
            if (~llListFindList(agentsInTranslation, (list)sid))&lt;br /&gt;
            { }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                addNewAgent(sid);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    no_sensor()&lt;br /&gt;
    { }&lt;br /&gt;
&lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        if(~llListFindList(agentsInTranslation, (list)id))&lt;br /&gt;
        { }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            addNewAgent(id);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        integer r;&lt;br /&gt;
        vector  tmrVct;&lt;br /&gt;
        list tmrli;&lt;br /&gt;
        list  newList;&lt;br /&gt;
        llSetTimerEvent(0.0);   // we better reset timer by way of precaution&lt;br /&gt;
        if (isInitialized == FALSE)&lt;br /&gt;
        {&lt;br /&gt;
            string mylanguage;&lt;br /&gt;
            enabled = TRUE;&lt;br /&gt;
            listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
            llMessageLinked(LINK_THIS, 6877259, (string)enabled, NULL_KEY);&lt;br /&gt;
            isInitialized = TRUE;&lt;br /&gt;
            mylanguage = llGetAgentLanguage(owner);&lt;br /&gt;
            if (llStringLength(mylanguage) &amp;lt; 1)&lt;br /&gt;
            {&lt;br /&gt;
                mylanguage = &amp;quot;en&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            if(~llListFindList(agentsInTranslation, (list)owner))&lt;br /&gt;
            {&lt;br /&gt;
                integer ownerliPos;&lt;br /&gt;
                ownerliPos = llListFindList(agentsInTranslation, (list)owner);&lt;br /&gt;
                agentsInTranslation = llListReplaceList(agentsInTranslation, [mylanguage] , ownerliPos + 1, ownerliPos + 1);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [ owner , mylanguage, mylanguage , 0 , llRound(llFrand(2000000)) + 1];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            for (r = 0; r &amp;lt; llGetListLength(agentsInTranslation); r += 5)&lt;br /&gt;
            {&lt;br /&gt;
                tmrli = llGetObjectDetails(llList2Key(agentsInTranslation, r), [OBJECT_POS]);&lt;br /&gt;
                tmrVct = llList2Vector(tmrli, 0);&lt;br /&gt;
                if (tmrVct == ZERO_VECTOR)&lt;br /&gt;
                {  }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    if (llVecDist(llGetPos(), tmrVct) &amp;lt;= 20.0)&lt;br /&gt;
                    {&lt;br /&gt;
                        newList = (newList=[]) + newList + llList2List(agentsInTranslation, r, r + 4);&lt;br /&gt;
                    }&lt;br /&gt;
                }                   &lt;br /&gt;
            }&lt;br /&gt;
            agentsInTranslation = newList;&lt;br /&gt;
            newList = [];&lt;br /&gt;
        }&lt;br /&gt;
        if (autoLanguage == TRUE &amp;amp;&amp;amp; isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            llSensor(&amp;quot;&amp;quot;, NULL_KEY, AGENT, 20.0, PI);&lt;br /&gt;
        }&lt;br /&gt;
        llSetTimerEvent(4.0);   // restart timer&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
CheckSpell-DetectLanguage&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//Spell Checker Web Services powered by Yahoo&lt;br /&gt;
key splValue;&lt;br /&gt;
key dtcValue;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer enabled = TRUE;&lt;br /&gt;
integer showTranslation = TRUE;&lt;br /&gt;
integer tranObjects = TRUE;&lt;br /&gt;
integer SpellChecker = 1;&lt;br /&gt;
list tempDetections;&lt;br /&gt;
list spellchecks;&lt;br /&gt;
&lt;br /&gt;
string strReplace(string str, string search, string replace) {&lt;br /&gt;
    return llDumpList2String(llParseStringKeepNulls((str = &amp;quot;&amp;quot;) + str, [search], []), replace);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex&lt;br /&gt;
{&lt;br /&gt;
    return ~llSubStringIndex(haystack, needle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
DetectLanguage(string dtcmsg, key dtcid)&lt;br /&gt;
{&lt;br /&gt;
    llSleep(0.2);&lt;br /&gt;
    dtcValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&amp;amp;q=&amp;quot; + llEscapeURL(dtcmsg), [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot; &amp;quot;);&lt;br /&gt;
    if (dtcValue != NULL_KEY)&lt;br /&gt;
    {&lt;br /&gt;
        tempDetections = (tempDetections=[]) + tempDetections + [ dtcValue, dtcid, llGetTime() ];&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llSleep(10.0); // Something has gone horribly wrong, sleep 10 seconds clear throttle&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
CheckSpell(string splmsg, key splid)&lt;br /&gt;
{&lt;br /&gt;
    splValue = llHTTPRequest(&amp;quot;http://search.yahooapis.com/WebSearchService/V1/spellingSuggestion?appid=DNPjiabV34EOgXQ3kAu6.d7kf6v.JUGCn1bFUcSTFMSGCyCy_ALzbepYstlI7DrOGP0-&amp;amp;query=&amp;quot; + llEscapeURL(splmsg), [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot;&amp;quot;);&lt;br /&gt;
    if (splValue != NULL_KEY)&lt;br /&gt;
    {    // Translation&lt;br /&gt;
        spellchecks = (spellchecks=[]) + spellchecks + [ splValue, splid, strReplace(splmsg,&amp;quot;,&amp;quot;,&amp;quot;^ñ^&amp;quot;), llGetTime() ];&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llSleep(10.0); // Something has gone horribly wrong, sleep 10 seconds clear throttle&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llListen(0,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        if ((!enabled) &amp;amp;&amp;amp; (isMaster == 1))&lt;br /&gt;
        {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if (!tranObjects)&lt;br /&gt;
        {&lt;br /&gt;
            if (llGetAgentSize(id) == ZERO_VECTOR)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                if (SpellChecker == 1)&lt;br /&gt;
                {&lt;br /&gt;
                    CheckSpell(message, id);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    llMessageLinked(LINK_THIS,98745920,message,id);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            if (SpellChecker == 1)&lt;br /&gt;
            {&lt;br /&gt;
                CheckSpell(message, id);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                llMessageLinked(LINK_THIS,98745920,message,id);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        DetectLanguage(message, id);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
    {   // Process Response Code&lt;br /&gt;
        if (~llListFindList(spellchecks, (list)request_id))&lt;br /&gt;
        {&lt;br /&gt;
            string httmsg;&lt;br /&gt;
            key httkey;&lt;br /&gt;
            integer splliPos = llListFindList(spellchecks, (list)request_id);&lt;br /&gt;
            httkey = llList2Key(spellchecks, splliPos + 1);&lt;br /&gt;
            if(contains(body, &amp;quot;&amp;lt;Result&amp;gt;&amp;quot;) == 0)&lt;br /&gt;
            {   // Yahoo Spell Checker correction&lt;br /&gt;
                httmsg = llList2String(spellchecks, splliPos + 2);&lt;br /&gt;
                llMessageLinked(LINK_THIS,98745920,strReplace(httmsg,&amp;quot;^ñ^&amp;quot;,&amp;quot;,&amp;quot;),httkey);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                httmsg = llGetSubString(body, llSubStringIndex(body, &amp;quot;&amp;lt;Result&amp;gt;&amp;quot;) + 8, llSubStringIndex(body, &amp;quot;&amp;lt;/Result&amp;gt;&amp;quot;) - 1);&lt;br /&gt;
                llMessageLinked(LINK_THIS, 98745920,httmsg,httkey);                               &lt;br /&gt;
            }&lt;br /&gt;
            spellchecks = llDeleteSubList(spellchecks,splliPos, splliPos + 3);&lt;br /&gt;
        }&lt;br /&gt;
        if (~llListFindList(tempDetections, (list)request_id))&lt;br /&gt;
        {   // Language Detection&lt;br /&gt;
            integer tmpliPos = llListFindList(tempDetections, (list)request_id);&lt;br /&gt;
            key speakerID = llList2Key(tempDetections, tmpliPos + 1);&lt;br /&gt;
            tempDetections = llDeleteSubList(tempDetections, tmpliPos, tmpliPos + 2);&lt;br /&gt;
            string htttmpStr = llToLower(llGetSubString(body, llSubStringIndex(body, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(body, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
            if (contains(htttmpStr, &amp;quot;err&amp;quot;) == 0 &amp;amp;&amp;amp; contains(htttmpStr, &amp;quot;unn&amp;quot;) == 0)&lt;br /&gt;
            {   // We Trust the Google system, the Google´s guys are good and I am sure they will keep improving :-)&lt;br /&gt;
                // Language Detected&lt;br /&gt;
                if(llStringLength(htttmpStr) &amp;lt;= 2)&lt;br /&gt;
                {&lt;br /&gt;
                    llMessageLinked(LINK_THIS,6349160,htttmpStr,speakerID);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
        integer r;&lt;br /&gt;
        list newList;&lt;br /&gt;
        float timeElapsed;&lt;br /&gt;
        for (r = 0; r &amp;lt; llGetListLength(spellchecks); r += 4)&lt;br /&gt;
        {&lt;br /&gt;
            timeElapsed = llGetTime() - llList2Float(spellchecks, r + 3);&lt;br /&gt;
            if (timeElapsed &amp;lt; 10.0)&lt;br /&gt;
            {&lt;br /&gt;
                newList = (newList=[]) + newList + llList2List(spellchecks, r, r + 3);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        spellchecks = newList;&lt;br /&gt;
        newList = [];&lt;br /&gt;
        for (r = 0; r &amp;lt; llGetListLength(tempDetections); r += 3)&lt;br /&gt;
        {&lt;br /&gt;
            timeElapsed = llGetTime() - llList2Float(tempDetections, r + 2);&lt;br /&gt;
            if (timeElapsed &amp;lt; 10.0)&lt;br /&gt;
            {&lt;br /&gt;
                newList = (newList=[]) + newList + llList2List(tempDetections, r, r + 2);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        tempDetections = newList;&lt;br /&gt;
        newList = [];&lt;br /&gt;
        llSetTimerEvent(5.0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Formulator&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//Spell Checker Web Services powered by Yahoo&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
string SEPARATOR = &amp;quot;|%&amp;amp;|&amp;quot;; // for transmitting lists via linked messages&lt;br /&gt;
list translationCache;&lt;br /&gt;
integer M = 1;&lt;br /&gt;
integer ShowTranslations = TRUE;&lt;br /&gt;
&lt;br /&gt;
sendIM(key imid, string imstr)&lt;br /&gt;
{&lt;br /&gt;
    // llInstantMessage(key id , string message) causes the script to sleep for 2 seconds&lt;br /&gt;
    if (llGetAgentSize(imid) == ZERO_VECTOR)&lt;br /&gt;
    { }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        if (imid != llGetOwner())&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(imstr + &amp;quot; @&amp;quot; + llKey2Name(imid));  // llOwnerSay(string message) has no delay&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (M == 8)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_ALL_OTHERS,2334420,imstr,imid);&lt;br /&gt;
            M = 1;&lt;br /&gt;
        }&lt;br /&gt;
        else if (M == 7)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_ALL_OTHERS,2334430,imstr,imid);&lt;br /&gt;
            M = 8;&lt;br /&gt;
        }&lt;br /&gt;
        else if (M == 6)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_ALL_OTHERS,2334440,imstr,imid);&lt;br /&gt;
            M = 7;&lt;br /&gt;
        }&lt;br /&gt;
        else if (M == 5)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_ALL_OTHERS,2334450,imstr,imid);&lt;br /&gt;
            M = 6;&lt;br /&gt;
        }&lt;br /&gt;
        else if (M == 4)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_ALL_OTHERS,2334460,imstr,imid);&lt;br /&gt;
            M = 5;&lt;br /&gt;
        }&lt;br /&gt;
        else if (M == 3)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_ALL_OTHERS,2334470,imstr,imid);&lt;br /&gt;
            M = 4;&lt;br /&gt;
        }&lt;br /&gt;
        else if (M == 2)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_ALL_OTHERS,2334480,imstr,imid);&lt;br /&gt;
            M = 3;&lt;br /&gt;
        }&lt;br /&gt;
        else if (M == 1)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_ALL_OTHERS,2334490,imstr,imid);&lt;br /&gt;
            M = 2;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
    if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
    {&lt;br /&gt;
        integer gkliPos = llListFindList(agentsInTranslation, (list)agentID);&lt;br /&gt;
        return llList2Key(agentsInTranslation, gkliPos - 4);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return NULL_KEY;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list TypeSep2List(string inputstring) &lt;br /&gt;
{ // converts a separated string created with List2TypeSep back to a list with the correct type information&lt;br /&gt;
    integer     i;&lt;br /&gt;
    list        input;&lt;br /&gt;
    list        output;&lt;br /&gt;
    &lt;br /&gt;
    input = llParseString2List(inputstring, [SEPARATOR], []);&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; llGetListLength(input); i += 2) {&lt;br /&gt;
        if (llList2Integer(input, i) == TYPE_INTEGER) output += (integer)llList2String(input, i + 1);&lt;br /&gt;
        else if (llList2Integer(input, i) == TYPE_FLOAT) output += (float)llList2String(input, i + 1);&lt;br /&gt;
        else if (llList2Integer(input, i) == TYPE_STRING) output += llList2String(input, i + 1);&lt;br /&gt;
        else if (llList2Integer(input, i) == TYPE_KEY) output += (key)llList2String(input, i + 1);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return output;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string List2TypeSep(list input) { // converts a list to a separated string with type information prepended to each item&lt;br /&gt;
    integer     i;&lt;br /&gt;
    list        output;&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; llGetListLength(input); i++) {&lt;br /&gt;
        output += [llGetListEntryType(input, i)] + llList2List(input, i, i);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return llDumpList2String(output, SEPARATOR);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string strReplace(string str, string search, string replace) {&lt;br /&gt;
    return llDumpList2String(llParseStringKeepNulls((str = &amp;quot;&amp;quot;) + str, [search], []), replace);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(1.0);&lt;br /&gt;
    }&lt;br /&gt;
    link_message(integer sender_num, integer num, string lstr, key id)&lt;br /&gt;
    {&lt;br /&gt;
        if (num == 7659759)&lt;br /&gt;
        {&lt;br /&gt;
            agentsInTranslation = TypeSep2List(lstr);&lt;br /&gt;
            llOwnerSay(&amp;quot;AgentsinTranslation List: \n&amp;quot; + llList2CSV(agentsInTranslation));&lt;br /&gt;
        }&lt;br /&gt;
        if (num == 9827491)&lt;br /&gt;
		{&lt;br /&gt;
			llSetTimerEvent(0.0);&lt;br /&gt;
            list txli;&lt;br /&gt;
            key recepientID;&lt;br /&gt;
            key txID;&lt;br /&gt;
            integer rxID;&lt;br /&gt;
            string recepientLanguage;&lt;br /&gt;
            string speakerLanguage;&lt;br /&gt;
            string txmessage;&lt;br /&gt;
            txID = id;&lt;br /&gt;
            txli = TypeSep2List(lstr);&lt;br /&gt;
            rxID = llList2Integer(txli,0);&lt;br /&gt;
            speakerLanguage = llList2String(txli,1);&lt;br /&gt;
            txmessage = llList2String(txli,2);&lt;br /&gt;
            recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, (list)txID) + 1);&lt;br /&gt;
            recepientID = getAgentKey(rxID);&lt;br /&gt;
            if (recepientID != NULL_KEY)&lt;br /&gt;
            {&lt;br /&gt;
                if (recepientLanguage == speakerLanguage)&lt;br /&gt;
                { }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    sendIM(txID,txmessage);&lt;br /&gt;
                }&lt;br /&gt;
		}&lt;br /&gt;
		llSetTimerEvent(6.0);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
        if (num == 98745920)&lt;br /&gt;
		{&lt;br /&gt;
			llSetTimerEvent(0.0);&lt;br /&gt;
            integer w;&lt;br /&gt;
            string  spkrLan;&lt;br /&gt;
            string  recepLan;&lt;br /&gt;
            integer recepID;&lt;br /&gt;
            integer lstliPos;&lt;br /&gt;
            string  lanpair;&lt;br /&gt;
            string txtchat;&lt;br /&gt;
            key txID;&lt;br /&gt;
			float cacheTime;&lt;br /&gt;
			list forli;&lt;br /&gt;
            txID = id;&lt;br /&gt;
            txtchat = strReplace(lstr,&amp;quot;,&amp;quot;,&amp;quot;^ñ^&amp;quot;);&lt;br /&gt;
            llOwnerSay(&amp;quot;Recibido mensaje de &amp;quot; + llKey2Name(id) + &amp;quot;, Mensaje: &amp;quot; + lstr);&lt;br /&gt;
            if (~llListFindList(agentsInTranslation, (list)txID))&lt;br /&gt;
            {&lt;br /&gt;
                spkrLan = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, (list)txID ) + 1 );&lt;br /&gt;
                llOwnerSay(&amp;quot;Formulator script line 170 speakerLanguage: &amp;quot; + spkrLan);&lt;br /&gt;
                cacheTime = llGetTime();&lt;br /&gt;
                //===============================&lt;br /&gt;
                // Formulate Translation Requests&lt;br /&gt;
                //===============================&lt;br /&gt;
                for (w = 0; w &amp;lt; llGetListLength(agentsInTranslation); w += 5)&lt;br /&gt;
                {    // Loop through translation group and do appropriate translations as needed&lt;br /&gt;
                    recepID = llList2Integer(agentsInTranslation, w + 4);&lt;br /&gt;
                    recepLan = llList2String(agentsInTranslation, w + 1);&lt;br /&gt;
                    if (spkrLan == recepLan)&lt;br /&gt;
                    { }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
                        if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
                        {&lt;br /&gt;
                            lstliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
                            translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
                        }&lt;br /&gt;
                        else&lt;br /&gt;
                        {&lt;br /&gt;
                            translationCache = (translationCache=[]) + translationCache + [ lanpair, recepID, cacheTime ];&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                if (translationCache != [])&lt;br /&gt;
                {    // Process Requests&lt;br /&gt;
                    for (w = 0; w &amp;lt; llGetListLength(translationCache); w += 3)&lt;br /&gt;
                    {   //====================================&lt;br /&gt;
                        //Translation&lt;br /&gt;
                        //====================================&lt;br /&gt;
						//Forumulate and Send Translation Request&lt;br /&gt;
						forli = [ txtchat + &amp;quot;&amp;amp;langpair=&amp;quot; + lanpair, llList2String(translationCache, w + 1), llList2String(translationCache, w)];&lt;br /&gt;
                        lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, w), [&amp;quot;|&amp;quot;],[]), 1);&lt;br /&gt;
                        llMessageLinked(LINK_THIS, 2346017, List2TypeSep( forli ), txID);&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
			}&lt;br /&gt;
			llSetTimerEvent(6.0);&lt;br /&gt;
        } &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
        integer r;&lt;br /&gt;
        float timeElapsed;&lt;br /&gt;
        list newList;&lt;br /&gt;
        for (r = 0; r &amp;lt; llGetListLength(translationCache); r += 3)&lt;br /&gt;
        {&lt;br /&gt;
            timeElapsed = llGetTime() - llList2Float(translationCache, r + 2);&lt;br /&gt;
            if (timeElapsed &amp;lt; 8.0)&lt;br /&gt;
            {&lt;br /&gt;
                newList = (newList=[]) + newList + llList2List(translationCache, r, r + 2);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        translationCache = newList;&lt;br /&gt;
        newList = [];&lt;br /&gt;
        llMessageLinked(LINK_THIS,9876754,&amp;quot;&amp;quot;,NULL_KEY);&lt;br /&gt;
        llSetTimerEvent(9.0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Translator&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//Spell Checker Web Services powered by Yahoo&lt;br /&gt;
integer tranObjects = TRUE;&lt;br /&gt;
integer SpellChecker = TRUE;&lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
key returnValue;&lt;br /&gt;
list requestedTranslations;&lt;br /&gt;
string SEPARATOR = &amp;quot;|%&amp;amp;|&amp;quot;; // for transmitting lists via linked messages&lt;br /&gt;
&lt;br /&gt;
string strReplace(string str, string search, string replace) {&lt;br /&gt;
    return llDumpList2String(llParseStringKeepNulls((str = &amp;quot;&amp;quot;) + str, [search], []), replace);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Translate(string chkmsg, list chkli)&lt;br /&gt;
{&lt;br /&gt;
    string txmsg;&lt;br /&gt;
    list txli;&lt;br /&gt;
    txmsg = strReplace(chkmsg,&amp;quot;^ñ^&amp;quot;,&amp;quot;,&amp;quot;);&lt;br /&gt;
    llOwnerSay(&amp;quot;Translate List: \n&amp;quot; + llList2CSV(chkli) + &amp;quot;\n&amp;quot;);&lt;br /&gt;
    returnValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&amp;amp;q=&amp;quot; + llEscapeURL(txmsg), [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot;&amp;quot;);&lt;br /&gt;
    if (returnValue != NULL_KEY)&lt;br /&gt;
    {    // Translation&lt;br /&gt;
        txli = (txli=[]) + txli + [returnValue];&lt;br /&gt;
        txli = (txli=[]) + txli + [chkli];&lt;br /&gt;
        requestedTranslations = (requestedTranslations=[]) + requestedTranslations + txli;&lt;br /&gt;
        llSleep(0.6);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llSleep(25.0); // Something has gone horribly wrong, sleep 25 seconds to clear throttle&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
processHTTPResponse(string bodyStr, list httli)&lt;br /&gt;
{&lt;br /&gt;
    llSetTimerEvent(0.0);&lt;br /&gt;
    key     recepientID;&lt;br /&gt;
    string     speakerID;&lt;br /&gt;
    list processli;&lt;br /&gt;
    list    paramtmpli;&lt;br /&gt;
    list    recepientList;&lt;br /&gt;
    string  recepientLanguage;&lt;br /&gt;
    string  languagePair;&lt;br /&gt;
    string  speakerName;&lt;br /&gt;
    string  speakerLanguage;&lt;br /&gt;
    string  translatedText;&lt;br /&gt;
    string  lantmpStr;&lt;br /&gt;
    integer z;&lt;br /&gt;
    //===================&lt;br /&gt;
    // Process Translation&lt;br /&gt;
    //===================&lt;br /&gt;
    processli = httli;&lt;br /&gt;
//    llOwnerSay(&amp;quot;Process list: \n&amp;quot; + llList2CSV(processli) + &amp;quot;\n&amp;quot;);&lt;br /&gt;
    speakerID  = llList2String(processli, 1);&lt;br /&gt;
    speakerName = llKey2Name((key)speakerID);&lt;br /&gt;
    if (speakerName == &amp;quot;&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        speakerName = llList2String(llGetObjectDetails((key)speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
    }&lt;br /&gt;
    recepientList = llParseString2List(llList2String(processli, 2), [&amp;quot;@&amp;quot;], []);&lt;br /&gt;
    paramtmpli = llParseStringKeepNulls(llList2String(processli, 3), [&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
    recepientLanguage = llList2String(paramtmpli, 1);&lt;br /&gt;
    languagePair = llDumpList2String(paramtmpli, &amp;quot;&amp;gt;&amp;gt;&amp;quot;);&lt;br /&gt;
    llOwnerSay(&amp;quot;Tanslator ProcessHttResponse\nFrom: &amp;quot; + speakerName + &amp;quot;\nTo: &amp;quot; + llList2CSV(recepientList) + &amp;quot;\nParams: &amp;quot; + llList2CSV(paramtmpli) + &amp;quot;\nRx Lan: &amp;quot; + recepientLanguage + &amp;quot;\nLanguage Pair: &amp;quot; + languagePair);&lt;br /&gt;
    // Perform Text Cleanup&lt;br /&gt;
    translatedText = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;detectedSourceLanguage\&amp;quot;:\&amp;quot;&amp;quot;));&lt;br /&gt;
    // Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
    if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
    {&lt;br /&gt;
        lantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
        for(z = llStringLength(translatedText);z &amp;gt;= 0; z--)&lt;br /&gt;
        {&lt;br /&gt;
            lantmpStr = (lantmpStr=&amp;quot;&amp;quot;) + lantmpStr + llGetSubString(translatedText, z, z);&lt;br /&gt;
        }&lt;br /&gt;
        translatedText = lantmpStr;&lt;br /&gt;
    }&lt;br /&gt;
    lantmpStr = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
    for (z = 0; z &amp;lt; llGetListLength(recepientList); z += 1)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_THIS,9827491, List2TypeSep( [ llList2Integer(recepientList, z), speakerLanguage , lantmpStr ] ) , recepientID);&lt;br /&gt;
    }&lt;br /&gt;
    llSetTimerEvent(4.0);&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string List2TypeSep(list input) { // converts a list to a separated string with type information prepended to each item&lt;br /&gt;
    integer     i;&lt;br /&gt;
    list        output;&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; llGetListLength(input); i++) {&lt;br /&gt;
        output += [llGetListEntryType(input, i)] + llList2List(input, i, i);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return llDumpList2String(output, SEPARATOR);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list TypeSep2List(string inputstring) { // converts a separated string created with List2TypeSep back to a list with the correct type information&lt;br /&gt;
    integer     i;&lt;br /&gt;
    list        input;&lt;br /&gt;
    list        output;&lt;br /&gt;
    &lt;br /&gt;
    input = llParseString2List(inputstring, [SEPARATOR], []);&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; llGetListLength(input); i += 2) {&lt;br /&gt;
        if (llList2Integer(input, i) == TYPE_INTEGER) output += (integer)llList2String(input, i + 1);&lt;br /&gt;
        else if (llList2Integer(input, i) == TYPE_FLOAT) output += (float)llList2String(input, i + 1);&lt;br /&gt;
        else if (llList2Integer(input, i) == TYPE_STRING) output += llList2String(input, i + 1);&lt;br /&gt;
        else if (llList2Integer(input, i) == TYPE_KEY) output += (key)llList2String(input, i + 1);&lt;br /&gt;
    }   &lt;br /&gt;
    return output;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(1.0);&lt;br /&gt;
    }&lt;br /&gt;
    link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
    {&lt;br /&gt;
        if (num == 2346017)&lt;br /&gt;
        {            &lt;br /&gt;
            list txli;&lt;br /&gt;
            key txID;&lt;br /&gt;
            txli = TypeSep2List(lstr);&lt;br /&gt;
            llOwnerSay(&amp;quot;Translator link_message list: &amp;quot; + llList2CSV(txli));&lt;br /&gt;
            txID = lid;            &lt;br /&gt;
            Translate(llList2String(txli,0),[ llGetTime(), txID, llList2String(txli,1), llList2String(txli,2) ] );&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
    {   // Process Response Code&lt;br /&gt;
        if (~llListFindList(requestedTranslations, (list)request_id))&lt;br /&gt;
        {   // Translation&lt;br /&gt;
            integer httliPos;&lt;br /&gt;
            string httmsg;&lt;br /&gt;
            httliPos = llListFindList(requestedTranslations, (list)request_id);&lt;br /&gt;
            httmsg = body;&lt;br /&gt;
            processHTTPResponse(httmsg, llList2List(requestedTranslations, httliPos + 1, httliPos + 4 ));&lt;br /&gt;
            requestedTranslations = llDeleteSubList(requestedTranslations, httliPos, httliPos + 4);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
        integer r;&lt;br /&gt;
        float timeElapsed;&lt;br /&gt;
        list newList;&lt;br /&gt;
        for (r = 0; r &amp;lt; llGetListLength(requestedTranslations); r += 6)&lt;br /&gt;
        {&lt;br /&gt;
            timeElapsed = llGetTime() - llList2Float(requestedTranslations, r + 1);&lt;br /&gt;
            if (timeElapsed &amp;lt; 20.0)&lt;br /&gt;
            {&lt;br /&gt;
                newList = (newList=[]) + newList + llList2List(requestedTranslations, r, r + 5);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        requestedTranslations = newList;&lt;br /&gt;
        newList = [];&lt;br /&gt;
        llSetTimerEvent(5.0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
IM Handler Example&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//Spell Checker Web Services powered by Yahoo&lt;br /&gt;
&lt;br /&gt;
string strReplace(string str, string search, string replace) {&lt;br /&gt;
    return llDumpList2String(llParseStringKeepNulls((str = &amp;quot;&amp;quot;) + str, [search], []), replace);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sendim(string mess, key target)&lt;br /&gt;
{&lt;br /&gt;
    if (llGetAgentSize(target) == ZERO_VECTOR)&lt;br /&gt;
    { }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llInstantMessage(target, llUnescapeURL(mess));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    link_message(integer sender_num, integer num, string str, key id)&lt;br /&gt;
    {&lt;br /&gt;
        if (num == 2334400)&lt;br /&gt;
        {&lt;br /&gt;
            sendim(strReplace(str,&amp;quot;\\u0026#39;&amp;quot;,&amp;quot;´&amp;quot;),id);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=692672</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=692672"/>
		<updated>2009-12-27T13:31:08Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: /* OK */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribución al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente código fué originálmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mí manera...&lt;br /&gt;
No ós riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;OK&#039;&#039; ===&lt;br /&gt;
Bueno, despues de respiñar todo lo que pude, creo que el uso de memoria y la velocidad están prácticamente igual qué en la versión original pero bueno... en la variedad está el gusto no?&lt;br /&gt;
Ya he probado un poco el código, y parece que funciona aunque estoy teniendo algunos problemas... Por ejemplo creo que el sistema de traduccion no funciona corréctamente, y no me refiero al sistema de traduccion de Google (en mi opinion, si no es el mejor, es uno de los mejores del mundo), sino a que aún queda mucho trabajo por hacer en el script...&lt;br /&gt;
&lt;br /&gt;
El siguiente paso sera intentar dividir el script en dos, o si es posible en tres para repartir el uso de memoria. Tambien me gustaria probar un truco que uso a menudo para traducir páginas en un idioma que no entiendo, lo que hago es que en vez de traducir diréctamente al español, primero se traduce a inglés, y luego desde inglés al español. Parece una tontería y un gasto innecesario, pero si lo hago es porque así suelo entender mejor las traducciones.&lt;br /&gt;
Quiero por un lado el sistema de comunicacion y evaluacion entre traductores, y por otro el sistema de traduccion entre avatares, ¿es muy dificil? no sé ya lo veremos...&lt;br /&gt;
&lt;br /&gt;
Well, after saving as much as I could, I think the memory usage and the speed are technically the same as in the original script, but well, in the variety is the taste, isnt it?. &lt;br /&gt;
I have tested a bit the code above already, and it seems to work altought i´m having some problems...&lt;br /&gt;
For instance i think the translation system is not working properly, and i dont mean the Google´s translation system (in my opinion, if is not the best, one of the bests), but that there is still much work to do in the script...&lt;br /&gt;
&lt;br /&gt;
The next step will be to try to divide the script in 2, or 3 if is possible, so we can spread the memory usage. Also I would like to test a trick i use often for to translate languages that i dont understand, what I do first is to translate that language into English, and then from English to Spanish, it seems a nonsense and unnecesary waste, but if i do it is becouse so i usually understand the translations better.&lt;br /&gt;
I want by one part the translators communications and evaluation system, and by other the translation system between avatars, is it very difficult? I don´t know , we will see...&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Es dificil... me está costando pero ya veremos...&lt;br /&gt;
Its difficult... i am struggling but we will see...&lt;br /&gt;
&lt;br /&gt;
chu chu chu&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
De Güatemala a Güatepeor, Sin comentarios...&lt;br /&gt;
&lt;br /&gt;
From Güatebad to Güateworse, No comments...&lt;br /&gt;
&lt;br /&gt;
Buscando en Internet he encontrado este [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html API de Yahoo] comprobador de ortografía, aunque creo que por ahora sólo soporta el lenguage inglés pero sería interesante añadirlo al proyecto&lt;br /&gt;
&lt;br /&gt;
Searching on the web I crossed in my way with this spell checker [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html Yahoo´s API] , I think that it only supports English language by now althought it would be interesting to add it to the project&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Estoy probando el comprobador de deletreo de Yahoo aunque la verdad es que no estoy teniendo buenos resultados, parece que Google es mucho más rapido y necesito corregir antes de traducir. También estoy intentando solucionar el error que aparece con el símbolo (apostrofe) ´ en las frases con genitivo sajon traducidas al inglés y tampoco doy con la tecla... Ya que esto me está dando muchos dolores de cabeza quizás deje el proyecto en standby hasta después de navidades.&lt;br /&gt;
&lt;br /&gt;
I am testing the Yahoo´s spell checker althought to be honest I´m not having good success, it seems Google is much faster and I need to correct before translate. Also I am triying to fix the error showed in the phrases translated to English with the saxons genitive apostrophe ´ and still triying and triying. As this is driving me nuts, maybe I will leave the project in standby until new year.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ESTO ES EL TRADUCTOR &amp;quot;un lío&amp;quot; por ahora... Necesito rehacer algunas cosas&lt;br /&gt;
&lt;br /&gt;
THIS IS THE TRANSLATOR &amp;quot;mess&amp;quot; by now... I need to redo some things&lt;br /&gt;
&#039;&#039;&#039;THE CODE BELOW IS NOT TESTED&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
agentsinTranslation&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//Spell Checker Web Services powered by Yahoo&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
integer isInitialized = FALSE;&lt;br /&gt;
integer listenID;&lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
string SEPARATOR = &amp;quot;|%&amp;amp;|&amp;quot;; // for transmitting lists via linked messages&lt;br /&gt;
integer M = 1;&lt;br /&gt;
integer ShowTranslations = TRUE;&lt;br /&gt;
&lt;br /&gt;
sendIM(key imid, string imstr)&lt;br /&gt;
{&lt;br /&gt;
    // llInstantMessage(key id , string message) causes the script to sleep for 2 seconds&lt;br /&gt;
    if (llGetAgentSize(imid) == ZERO_VECTOR)&lt;br /&gt;
    { }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        if (imid != llGetOwner())&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(imstr + &amp;quot; @&amp;quot; + llKey2Name(imid));  // llOwnerSay(string message) has no delay&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (M == 8)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_ALL_OTHERS,2334420,imstr,imid);&lt;br /&gt;
            M = 1;&lt;br /&gt;
        }&lt;br /&gt;
        else if (M == 7)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_ALL_OTHERS,2334430,imstr,imid);&lt;br /&gt;
            M = 8;&lt;br /&gt;
        }&lt;br /&gt;
        else if (M == 6)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_ALL_OTHERS,2334440,imstr,imid);&lt;br /&gt;
            M = 7;&lt;br /&gt;
        }&lt;br /&gt;
        else if (M == 5)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_ALL_OTHERS,2334450,imstr,imid);&lt;br /&gt;
            M = 6;&lt;br /&gt;
        }&lt;br /&gt;
        else if (M == 4)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_ALL_OTHERS,2334460,imstr,imid);&lt;br /&gt;
            M = 5;&lt;br /&gt;
        }&lt;br /&gt;
        else if (M == 3)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_ALL_OTHERS,2334470,imstr,imid);&lt;br /&gt;
            M = 4;&lt;br /&gt;
        }&lt;br /&gt;
        else if (M == 2)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_ALL_OTHERS,2334480,imstr,imid);&lt;br /&gt;
            M = 3;&lt;br /&gt;
        }&lt;br /&gt;
        else if (M == 1)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_ALL_OTHERS,2334490,imstr,imid);&lt;br /&gt;
            M = 2;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
string checkLanguage(string chklantmpStr)&lt;br /&gt;
{&lt;br /&gt;
    if (chklantmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;en&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else if (chklantmpStr == &amp;quot;und&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;el&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if (llGetSubString(chklantmpStr, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = llGetSubString(chklantmpStr, 0, 1);&lt;br /&gt;
    }&lt;br /&gt;
    return chklantmpStr;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
    integer avliPos;&lt;br /&gt;
    integer idNum;&lt;br /&gt;
    if (~llListFindList(agentsInTranslation, (list)avid))&lt;br /&gt;
    {&lt;br /&gt;
        avliPos = llListFindList(agentsInTranslation, (list)avid);&lt;br /&gt;
        agentsInTranslation = llListReplaceList(agentsInTranslation, [ avlan, avlan, chklan ], avliPos + 1, avliPos + 3);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        @at;&lt;br /&gt;
        idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
        if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
        {&lt;br /&gt;
            jump at;&lt;br /&gt;
        }&lt;br /&gt;
        agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [ avid, avlan, avlan, chklan, idNum ];        // llMessageLinked(LINK_THIS, 64562349, avlan, avid);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string addNewAgent(key newavid)&lt;br /&gt;
{&lt;br /&gt;
    string speakerLan;&lt;br /&gt;
    if (llGetAgentSize(newavid) == ZERO_VECTOR)&lt;br /&gt;
    {&lt;br /&gt;
        speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
        addAgent(newavid, speakerLan, 4);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        speakerLan  = checkLanguage(llGetAgentLanguage(newavid));&lt;br /&gt;
        if (speakerLan == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
            addAgent(newavid, speakerLan, 0);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            addAgent(newavid, speakerLan, 0);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return speakerLan;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
    if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
    {&lt;br /&gt;
        integer gkliPos = llListFindList(agentsInTranslation, (list)agentID);&lt;br /&gt;
        return llList2Key(agentsInTranslation, gkliPos - 4);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return NULL_KEY;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string List2String(list input)&lt;br /&gt;
{ // converts list to a string&lt;br /&gt;
    return llDumpList2String(input, SEPARATOR);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list String2List(string inputstring)&lt;br /&gt;
{ // converts a separated string created with List2String back to a list&lt;br /&gt;
    list output;&lt;br /&gt;
    output = llParseString2List(inputstring, [SEPARATOR], []);   &lt;br /&gt;
    return output;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {        &lt;br /&gt;
        llSetTimerEvent(1.0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
    {&lt;br /&gt;
        if (num == 9876754)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS,7659759,List2String(agentsInTranslation),NULL_KEY);&lt;br /&gt;
        }&lt;br /&gt;
        if (num == 9827491)&lt;br /&gt;
        {&lt;br /&gt;
            list txli;&lt;br /&gt;
			key recepientID;&lt;br /&gt;
			key txID;&lt;br /&gt;
			integer rxID;&lt;br /&gt;
			string recepientLanguage;&lt;br /&gt;
			string speakerLanguage;&lt;br /&gt;
			string txmessage;&lt;br /&gt;
			txID = lid;&lt;br /&gt;
			txli = String2List(lstr);&lt;br /&gt;
			rxID = llList2Integer(txli,0)&lt;br /&gt;
			speakerLanguage = llList2String(txli,1);&lt;br /&gt;
			txmessage = llList2String(txli,2);            		&lt;br /&gt;
			recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, (list)txID) + 1);&lt;br /&gt;
			recepientID = getAgentKey(rxID);&lt;br /&gt;
            if (recepientID != NULL_KEY)&lt;br /&gt;
            {&lt;br /&gt;
                if (recepientLanguage == speakerLanguage)&lt;br /&gt;
                { }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    sendIM(lid,txmessage);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (num == 6349160)&lt;br /&gt;
	{&lt;br /&gt;
		&lt;br /&gt;
            key speaker;&lt;br /&gt;
            string spkLan;&lt;br /&gt;
            speaker = lid;&lt;br /&gt;
            spkLan = lstr;&lt;br /&gt;
            if (~llListFindList(agentsInTranslation, (list)speaker))&lt;br /&gt;
            {&lt;br /&gt;
                integer tmpavliPos = llListFindList(agentsInTranslation, (list)speaker);&lt;br /&gt;
                string actlan = llList2String(agentsInTranslation, tmpavliPos + 1);&lt;br /&gt;
                string tmplan = llList2String(agentsInTranslation, tmpavliPos + 2);&lt;br /&gt;
                if (llList2Integer(agentsInTranslation, tmpavliPos + 3) &amp;gt;= 2)&lt;br /&gt;
                {   // if anyone speaks on any different language 3 times in a row&lt;br /&gt;
                    addAgent(lid, lstr, 0);&lt;br /&gt;
                }&lt;br /&gt;
                if (actlan == lstr)&lt;br /&gt;
                {   // reset language checker for speaker&lt;br /&gt;
                    agentsInTranslation = llListReplaceList(agentsInTranslation, [actlan, 0], tmpavliPos + 2, tmpavliPos + 3);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    if (lstr == tmplan)&lt;br /&gt;
                    {   // if language of speaker is not the same as detected language&lt;br /&gt;
                        agentsInTranslation = llListReplaceList(agentsInTranslation,[llList2Integer(agentsInTranslation,tmpavliPos + 3) + 1] , tmpavliPos + 3, tmpavliPos + 3);&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        agentsInTranslation = llListReplaceList(agentsInTranslation,[lstr, 0] , tmpavliPos + 2, tmpavliPos + 3);&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    sensor(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        integer s;&lt;br /&gt;
        key sid;&lt;br /&gt;
        for (s = 0; s &amp;lt; num_detected; s += 1)&lt;br /&gt;
        {&lt;br /&gt;
            sid = llDetectedKey(s);&lt;br /&gt;
            if (~llListFindList(agentsInTranslation, (list)sid))&lt;br /&gt;
            { }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                addNewAgent(sid);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    no_sensor()&lt;br /&gt;
    { }&lt;br /&gt;
&lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {        &lt;br /&gt;
        if(~llListFindList(agentsInTranslation, (list)id))&lt;br /&gt;
        { }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            addNewAgent(id);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        integer r;&lt;br /&gt;
        vector  tmrVct;&lt;br /&gt;
        list  newList;&lt;br /&gt;
        llSetTimerEvent(0.0);   // we better reset timer by way of precaution&lt;br /&gt;
        if (isInitialized == FALSE)&lt;br /&gt;
		{&lt;br /&gt;
			string mylanguage;&lt;br /&gt;
            enabled = TRUE;&lt;br /&gt;
            listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
            llMessageLinked(LINK_THIS, 6877259, (string)enabled, NULL_KEY);&lt;br /&gt;
            isInitialized = TRUE;&lt;br /&gt;
			mylanguage = llGetAgentLanguage(llGetOwner());&lt;br /&gt;
            if (llStringLength(mylanguage) &amp;lt; 1)&lt;br /&gt;
            {&lt;br /&gt;
                mylanguage = &amp;quot;en&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            if(~llListFindList(agentsInTranslation, (list)llGetOwner()))&lt;br /&gt;
            {&lt;br /&gt;
				integer ownerliPos;&lt;br /&gt;
				ownerliPos = llListFindList(agentsInTranslation, (list)llGetOwner());&lt;br /&gt;
                agentsInTranslation = llListReplaceList(agentsInTranslation, [mylanguage] , ownerliPos + 1, ownerliPos + 1);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [ llGetOwner() , mylanguage, mylanguage , 0 , llRound(llFrand(2000000)) + 1];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            for (r = 0; r &amp;lt; llGetListLength(agentsInTranslation); r += 5)&lt;br /&gt;
            {&lt;br /&gt;
                tmrVct = llList2Vector(llGetObjectDetails(llList2Key(agentsInTranslation, r), [OBJECT_POS]), 0);&lt;br /&gt;
                if (llVecDist(llGetPos(), tmrVct) &amp;lt;= 20.0)&lt;br /&gt;
                {&lt;br /&gt;
                    newList = (newList=[]) + newList + llList2List(agentsInTranslation, r, r + 4);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            agentsInTranslation = newList;&lt;br /&gt;
            newList = [];&lt;br /&gt;
        }&lt;br /&gt;
        if ((autoLanguage) &amp;amp;&amp;amp; isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            llSensor(&amp;quot;&amp;quot;, NULL_KEY, AGENT, 20.0, PI);&lt;br /&gt;
        }&lt;br /&gt;
        llSetTimerEvent(4.0);   // restart timer&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
CheckSpell-DetectLanguage&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//Spell Checker Web Services powered by Yahoo&lt;br /&gt;
key splValue;&lt;br /&gt;
key dtcValue;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer enabled = TRUE;&lt;br /&gt;
integer showTranslation = TRUE;&lt;br /&gt;
integer tranObjects = TRUE;&lt;br /&gt;
integer SpellChecker = 1;&lt;br /&gt;
list tempDetections;&lt;br /&gt;
list spellchecks;&lt;br /&gt;
&lt;br /&gt;
integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex&lt;br /&gt;
{&lt;br /&gt;
	return ~llSubStringIndex(haystack, needle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
DetectLanguage(string dtcmsg, key dtcid)&lt;br /&gt;
{&lt;br /&gt;
	llSleep(0.2);&lt;br /&gt;
	dtcValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&amp;amp;q=&amp;quot; + llEscapeURL(dtcmsg), [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot; &amp;quot;);&lt;br /&gt;
	if (dtcValue != NULL_KEY)&lt;br /&gt;
	{&lt;br /&gt;
		tempDetections = (tempDetections=[]) + tempDetections + [ dtcValue, dtcid, llGetTime() ];&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		llSleep(10.0); // Something has gone horribly wrong, sleep 10 seconds clear throttle&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
CheckSpell(string splmsg, key splid)&lt;br /&gt;
{&lt;br /&gt;
	splValue = llHTTPRequest(&amp;quot;http://search.yahooapis.com/WebSearchService/V1/spellingSuggestion?appid=DNPjiabV34EOgXQ3kAu6.d7kf6v.JUGCn1bFUcSTFMSGCyCy_ALzbepYstlI7DrOGP0-&amp;amp;query=&amp;quot; + llEscapeURL(splmsg), [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot;&amp;quot;);&lt;br /&gt;
	if (splValue != NULL_KEY)&lt;br /&gt;
	{    // Translation&lt;br /&gt;
		spellchecks = (spellchecks=[]) + spellchecks + [ splValue, splid, splmsg, llGetTime() ];&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		llSleep(10.0); // Something has gone horribly wrong, sleep 10 seconds clear throttle&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		llListen(0,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	listen(integer channel, string name, key id, string message)&lt;br /&gt;
	{&lt;br /&gt;
		if ((!enabled) &amp;amp;&amp;amp; (isMaster == 1))&lt;br /&gt;
		{&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (!tranObjects)&lt;br /&gt;
		{&lt;br /&gt;
			if (llGetAgentSize(id) == ZERO_VECTOR)&lt;br /&gt;
			{&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				if (SpellChecker == 1)&lt;br /&gt;
				{&lt;br /&gt;
					CheckSpell(message, id);&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					llMessageLinked(LINK_THIS,98745920,message,id);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			if (SpellChecker == 1)&lt;br /&gt;
			{&lt;br /&gt;
				CheckSpell(message, id);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				llMessageLinked(LINK_THIS,98745920,message,id);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		DetectLanguage(message, id);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
	{   // Process Response Code&lt;br /&gt;
		if (~llListFindList(spellchecks, (list)request_id))&lt;br /&gt;
		{&lt;br /&gt;
			integer splliPos = llListFindList(spellchecks, (list)request_id);&lt;br /&gt;
			if(contains(body, &amp;quot;lt&amp;gt;&amp;quot;) != 0)&lt;br /&gt;
			{   // Yahoo Spell Checker correction&lt;br /&gt;
				llMessageLinked(LINK_THIS, 98745920,llGetSubString(body, llSubStringIndex(body, &amp;quot;t&amp;gt;&amp;quot;) + 2, llSubStringIndex(body, &amp;quot;&amp;lt;/&amp;quot;) - 1),llList2Key(spellchecks, splliPos + 1));&lt;br /&gt;
				llOwnerSay(llGetSubString(body, llSubStringIndex(body, &amp;quot;t&amp;gt;&amp;quot;) + 2, llSubStringIndex(body, &amp;quot;&amp;lt;/&amp;quot;) - 1));&lt;br /&gt;
				spellchecks = llDeleteSubList(spellchecks,splliPos, splliPos + 3);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				llMessageLinked(LINK_THIS,98745920,llList2String(spellchecks, splliPos + 2),llList2Key(spellchecks, splliPos + 1));&lt;br /&gt;
				spellchecks = llDeleteSubList(spellchecks,splliPos, splliPos + 3);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if (~llListFindList(tempDetections, (list)request_id))&lt;br /&gt;
		{   // Language Detection&lt;br /&gt;
			integer tmpliPos = llListFindList(tempDetections, (list)request_id);&lt;br /&gt;
			key speakerID = llList2Key(tempDetections, tmpliPos + 1);&lt;br /&gt;
			tempDetections = llDeleteSubList(tempDetections, tmpliPos, tmpliPos + 2);&lt;br /&gt;
			string htttmpStr = llToLower(llGetSubString(body, llSubStringIndex(body, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(body, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
			if (contains(htttmpStr, &amp;quot;err&amp;quot;) == 0 &amp;amp;&amp;amp; contains(htttmpStr, &amp;quot;unn&amp;quot;) == 0)&lt;br /&gt;
			{   // We Trust the Google system, the Google´s guys are good and I am sure they will keep improving :-)&lt;br /&gt;
				// Language Detected&lt;br /&gt;
				llMessageLinked(LINK_THIS,6349160,htttmpStr,speakerID);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	timer()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(0.0);&lt;br /&gt;
		integer r;&lt;br /&gt;
		list newList;&lt;br /&gt;
		float timeElapsed;&lt;br /&gt;
		for (r = 0; r &amp;lt; llGetListLength(spellchecks); r += 4)&lt;br /&gt;
		{&lt;br /&gt;
			timeElapsed = llGetTime() - llList2Float(spellchecks, r + 3);&lt;br /&gt;
			if (timeElapsed &amp;lt; 10.0)&lt;br /&gt;
			{&lt;br /&gt;
				newList = (newList=[]) + newList + llList2List(spellchecks, r, r + 3);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		spellchecks = newList;&lt;br /&gt;
		newList = [];&lt;br /&gt;
		for (r = 0; r &amp;lt; llGetListLength(tempDetections); r += 3)&lt;br /&gt;
		{&lt;br /&gt;
			timeElapsed = llGetTime() - llList2Float(tempDetections, r + 2);&lt;br /&gt;
			if (timeElapsed &amp;lt; 10.0)&lt;br /&gt;
			{&lt;br /&gt;
				newList = (newList=[]) + newList + llList2List(tempDetections, r, r + 2);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		tempDetections = newList;&lt;br /&gt;
		newList = [];&lt;br /&gt;
		llSetTimerEvent(5.0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Formulator&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//Spell Checker Web Services powered by Yahoo&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
string SEPARATOR = &amp;quot;|%&amp;amp;|&amp;quot;; // for transmitting lists via linked messages&lt;br /&gt;
list translationCache;&lt;br /&gt;
&lt;br /&gt;
list String2List(string inputstring)&lt;br /&gt;
{    // converts a separated string created with List2String back to a list&lt;br /&gt;
	list output;&lt;br /&gt;
	output = llParseString2List(inputstring, [SEPARATOR], []);&lt;br /&gt;
	return output;&lt;br /&gt;
}&lt;br /&gt;
string List2String(list input)&lt;br /&gt;
{    // converts a list to a string&lt;br /&gt;
	return llDumpList2String(input, SEPARATOR);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(1.0);&lt;br /&gt;
	}&lt;br /&gt;
	link_message(integer sender_num, integer num, string lstr, key id)&lt;br /&gt;
	{&lt;br /&gt;
		if (num == 7659759)&lt;br /&gt;
		{&lt;br /&gt;
			agentsInTranslation = String2List(lstr);&lt;br /&gt;
		}&lt;br /&gt;
		if (num == 98745920)&lt;br /&gt;
		{&lt;br /&gt;
			integer w;&lt;br /&gt;
			string  spkrLan;&lt;br /&gt;
			string  recepLan;&lt;br /&gt;
			integer recepID;&lt;br /&gt;
			integer lstliPos;&lt;br /&gt;
			string  lanpair;&lt;br /&gt;
			//===============================&lt;br /&gt;
			// Formulate Translation Requests&lt;br /&gt;
			//===============================&lt;br /&gt;
			for (w = 0; w &amp;lt; llGetListLength(agentsInTranslation); w += 5)&lt;br /&gt;
			{    // Loop through translation group and do appropriate translations as needed&lt;br /&gt;
				recepID = llList2Integer(agentsInTranslation, w + 4);&lt;br /&gt;
				recepLan = llList2String(agentsInTranslation, w + 1);&lt;br /&gt;
				if (spkrLan == recepLan)&lt;br /&gt;
				{ }&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
					if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
					{&lt;br /&gt;
						lstliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
						translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						translationCache = (translationCache=[]) + translationCache + [lanpair, recepID, llGetTime()];&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			if (translationCache != [])&lt;br /&gt;
			{    // Process Requests&lt;br /&gt;
				for (w = 0; w &amp;lt; llGetListLength(translationCache); w += 3)&lt;br /&gt;
				{   //====================================&lt;br /&gt;
					//Translation&lt;br /&gt;
					//====================================&lt;br /&gt;
					//Forumulate and Send Translation Request&lt;br /&gt;
					lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, w), [&amp;quot;|&amp;quot;],[]), 1);&lt;br /&gt;
					llMessageLinked(LINK_THIS,2346017,List2String( [llEscapeURL(lstr) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), llList2String(translationCache, w + 1), llList2String(translationCache, w)] ),id);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	timer()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(0.0);&lt;br /&gt;
		integer r;&lt;br /&gt;
		float timeElapsed;&lt;br /&gt;
		list newList;&lt;br /&gt;
		for (r = 0; r &amp;lt; llGetListLength(translationCache); r += 3)&lt;br /&gt;
		{&lt;br /&gt;
			timeElapsed = llGetTime() - llList2Float(translationCache, r + 2);&lt;br /&gt;
			if (timeElapsed &amp;lt; 8.0)&lt;br /&gt;
			{&lt;br /&gt;
				newList = (newList=[]) + newList + llList2List(translationCache, r, r + 2);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		translationCache = newList;&lt;br /&gt;
		newList = [];&lt;br /&gt;
		llMessageLinked(LINK_THIS,9876754,&amp;quot;&amp;quot;,NULL_KEY);&lt;br /&gt;
		llSetTimerEvent(5.0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Translator&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//Spell Checker Web Services powered by Yahoo&lt;br /&gt;
integer tranObjects = TRUE;&lt;br /&gt;
integer SpellChecker = TRUE;&lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
key returnValue;&lt;br /&gt;
list requestedTranslations;&lt;br /&gt;
string SEPARATOR = &amp;quot;|%&amp;amp;|&amp;quot;; // for transmitting lists via linked messages&lt;br /&gt;
&lt;br /&gt;
Translate(string chkmsg, list chkli)&lt;br /&gt;
{&lt;br /&gt;
    returnValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&amp;amp;q=&amp;quot; + chkmsg, [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot;&amp;quot;);&lt;br /&gt;
    if (returnValue != NULL_KEY)&lt;br /&gt;
    {    // Translation&lt;br /&gt;
        requestedTranslations = (requestedTranslations=[]) + requestedTranslations + [returnValue, llList2CSV(chkli)];&lt;br /&gt;
        llSleep(0.6);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llSleep(25.0); // Something has gone horribly wrong, sleep 25 seconds to clear throttle&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
processHTTPResponse(string bodyStr, list httli)&lt;br /&gt;
{&lt;br /&gt;
    key     recepientID;&lt;br /&gt;
    key     speakerID;&lt;br /&gt;
    list    paramtmpli;&lt;br /&gt;
    list    recepientList;&lt;br /&gt;
    string  recepientLanguage;&lt;br /&gt;
    string  languagePair;&lt;br /&gt;
    string  speakerName;&lt;br /&gt;
    string  speakerLanguage;&lt;br /&gt;
    string  translatedText;&lt;br /&gt;
    string  lantmpStr;&lt;br /&gt;
    integer z;&lt;br /&gt;
    //===================&lt;br /&gt;
    // Process Translation&lt;br /&gt;
    //===================&lt;br /&gt;
    speakerID  = llList2Key(httli, 1);&lt;br /&gt;
    speakerName = llKey2Name(speakerID);&lt;br /&gt;
    if (speakerName == &amp;quot;&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
    }&lt;br /&gt;
    recepientList = llParseString2List(llList2String(httli, 2), [&amp;quot;@&amp;quot;], []);&lt;br /&gt;
    paramtmpli = llParseStringKeepNulls(llList2String(httli, 3), [&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
    recepientLanguage = llList2String(paramtmpli, 1);&lt;br /&gt;
    languagePair = llDumpList2String(paramtmpli, &amp;quot;&amp;gt;&amp;gt;&amp;quot;);&lt;br /&gt;
    // Perform Text Cleanup&lt;br /&gt;
    translatedText = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;detectedSourceLanguage\&amp;quot;:\&amp;quot;&amp;quot;));&lt;br /&gt;
    // Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
    if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
    {&lt;br /&gt;
        lantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
        for(z = llStringLength(translatedText);z &amp;gt;= 0; z--)&lt;br /&gt;
        {&lt;br /&gt;
            lantmpStr = (lantmpStr=&amp;quot;&amp;quot;) + lantmpStr + llGetSubString(translatedText, z, z);&lt;br /&gt;
        }&lt;br /&gt;
        translatedText = lantmpStr;&lt;br /&gt;
    }&lt;br /&gt;
    lantmpStr = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
    for (z = 0; z &amp;lt; llGetListLength(recepientList); z += 1)&lt;br /&gt;
    {&lt;br /&gt;
            llMessageLinked(LINK_THIS,9827491, List2String( [ llList2Integer(recepientList, z), speakerLanguage , lantmpStr ] ) , recepientID);&lt;br /&gt;
    }&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string List2String(list input)&lt;br /&gt;
{ // converts list to a string&lt;br /&gt;
    return llDumpList2String(input, SEPARATOR);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list String2List(string inputstring)&lt;br /&gt;
{ // converts a separated string created with List2String back to a list&lt;br /&gt;
    list output;&lt;br /&gt;
    output = llParseString2List(inputstring, [SEPARATOR], []);   &lt;br /&gt;
    return output;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(1.0);&lt;br /&gt;
    }&lt;br /&gt;
    link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
    {&lt;br /&gt;
        if (num == 2346017)&lt;br /&gt;
        {&lt;br /&gt;
            list txli;&lt;br /&gt;
            key txID;&lt;br /&gt;
            txli = String2List(lstr);&lt;br /&gt;
            txID = lid;&lt;br /&gt;
            Translate(llList2String(txli,0),[ llGetTime(), txID, llList2String(txli,1), llList2String(txli,2) ] );&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
    {   // Process Response Code&lt;br /&gt;
        if (~llListFindList(requestedTranslations, (list)request_id))&lt;br /&gt;
        {   // Translation&lt;br /&gt;
            integer httliPos;&lt;br /&gt;
            string httmsg;&lt;br /&gt;
            httliPos = llListFindList(requestedTranslations, (list)request_id);&lt;br /&gt;
            httmsg = body;&lt;br /&gt;
            processHTTPResponse(httmsg, llList2List(requestedTranslations, httliPos + 1, httliPos + 4 ));&lt;br /&gt;
            requestedTranslations = llDeleteSubList(requestedTranslations, httliPos, httliPos + 4);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
        integer r;&lt;br /&gt;
        float timeElapsed;&lt;br /&gt;
        list newList;&lt;br /&gt;
        for (r = 0; r &amp;lt; llGetListLength(requestedTranslations); r += 5)&lt;br /&gt;
        {&lt;br /&gt;
            timeElapsed = llGetTime() - llList2Float(requestedTranslations, r + 1);&lt;br /&gt;
            if (timeElapsed &amp;lt; 20.0)&lt;br /&gt;
            {&lt;br /&gt;
                newList = (newList=[]) + newList + llList2List(requestedTranslations, r, r + 4);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        requestedTranslations = newList;&lt;br /&gt;
        newList = [];&lt;br /&gt;
        llSetTimerEvent(5.0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
IM Handler Example&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//Spell Checker Web Services powered by Yahoo&lt;br /&gt;
&lt;br /&gt;
string strReplace(string str, string search, string replace) {&lt;br /&gt;
    return llDumpList2String(llParseStringKeepNulls((str = &amp;quot;&amp;quot;) + str, [search], []), replace);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sendim(string mess, key target)&lt;br /&gt;
{&lt;br /&gt;
    if (llGetAgentSize(target) == ZERO_VECTOR)&lt;br /&gt;
    { }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llInstantMessage(target, llUnescapeURL(mess));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    link_message(integer sender_num, integer num, string str, key id)&lt;br /&gt;
    {&lt;br /&gt;
        if (num == 2334400)&lt;br /&gt;
        {&lt;br /&gt;
            sendim(strReplace(str,&amp;quot;\\u0026#39;&amp;quot;,&amp;quot;´&amp;quot;),id);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=692662</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=692662"/>
		<updated>2009-12-27T13:05:05Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: /* OK */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribución al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente código fué originálmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mí manera...&lt;br /&gt;
No ós riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;OK&#039;&#039; ===&lt;br /&gt;
Bueno, despues de respiñar todo lo que pude, creo que el uso de memoria y la velocidad están prácticamente igual qué en la versión original pero bueno... en la variedad está el gusto no?&lt;br /&gt;
Ya he probado un poco el código, y parece que funciona aunque estoy teniendo algunos problemas... Por ejemplo creo que el sistema de traduccion no funciona corréctamente, y no me refiero al sistema de traduccion de Google (en mi opinion, si no es el mejor, es uno de los mejores del mundo), sino a que aún queda mucho trabajo por hacer en el script...&lt;br /&gt;
&lt;br /&gt;
El siguiente paso sera intentar dividir el script en dos, o si es posible en tres para repartir el uso de memoria. Tambien me gustaria probar un truco que uso a menudo para traducir páginas en un idioma que no entiendo, lo que hago es que en vez de traducir diréctamente al español, primero se traduce a inglés, y luego desde inglés al español. Parece una tontería y un gasto innecesario, pero si lo hago es porque así suelo entender mejor las traducciones.&lt;br /&gt;
Quiero por un lado el sistema de comunicacion y evaluacion entre traductores, y por otro el sistema de traduccion entre avatares, ¿es muy dificil? no sé ya lo veremos...&lt;br /&gt;
&lt;br /&gt;
Well, after saving as much as I could, I think the memory usage and the speed are technically the same as in the original script, but well, in the variety is the taste, isnt it?. &lt;br /&gt;
I have tested a bit the code above already, and it seems to work altought i´m having some problems...&lt;br /&gt;
For instance i think the translation system is not working properly, and i dont mean the Google´s translation system (in my opinion, if is not the best, one of the bests), but that there is still much work to do in the script...&lt;br /&gt;
&lt;br /&gt;
The next step will be to try to divide the script in 2, or 3 if is possible, so we can spread the memory usage. Also I would like to test a trick i use often for to translate languages that i dont understand, what I do first is to translate that language into English, and then from English to Spanish, it seems a nonsense and unnecesary waste, but if i do it is becouse so i usually understand the translations better.&lt;br /&gt;
I want by one part the translators communications and evaluation system, and by other the translation system between avatars, is it very difficult? I don´t know , we will see...&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Es dificil... me está costando pero ya veremos...&lt;br /&gt;
Its difficult... i am struggling but we will see...&lt;br /&gt;
&lt;br /&gt;
chu chu chu&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
De Güatemala a Güatepeor, Sin comentarios...&lt;br /&gt;
&lt;br /&gt;
From Güatebad to Güateworse, No comments...&lt;br /&gt;
&lt;br /&gt;
Buscando en Internet he encontrado este [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html API de Yahoo] comprobador de ortografía, aunque creo que por ahora sólo soporta el lenguage inglés pero sería interesante añadirlo al proyecto&lt;br /&gt;
&lt;br /&gt;
Searching on the web I crossed in my way with this spell checker [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html Yahoo´s API] , I think that it only supports English language by now althought it would be interesting to add it to the project&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Estoy probando el comprobador de deletreo de Yahoo aunque la verdad es que no estoy teniendo buenos resultados, parece que Google es mucho más rapido y necesito corregir antes de traducir. También estoy intentando solucionar el error que aparece con el símbolo (apostrofe) ´ en las frases con genitivo sajon traducidas al inglés y tampoco doy con la tecla... Ya que esto me está dando muchos dolores de cabeza quizás deje el proyecto en standby hasta después de navidades.&lt;br /&gt;
&lt;br /&gt;
I am testing the Yahoo´s spell checker althought to be honest I´m not having good success, it seems Google is much faster and I need to correct before translate. Also I am triying to fix the error showed in the phrases translated to English with the saxons genitive apostrophe ´ and still triying and triying. As this is driving me nuts, maybe I will leave the project in standby until new year.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ESTO ES EL TRADUCTOR &amp;quot;un lío&amp;quot; por ahora... Necesito rehacer algunas cosas&lt;br /&gt;
&lt;br /&gt;
THIS IS THE TRANSLATOR &amp;quot;mess&amp;quot; by now... I need to redo some things&lt;br /&gt;
&#039;&#039;&#039;THE CODE BELOW IS NOT TESTED&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
agentsinTranslation&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//Spell Checker Web Services powered by Yahoo&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
integer isInitialized = FALSE;&lt;br /&gt;
integer listenID;&lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
string SEPARATOR = &amp;quot;|%&amp;amp;|&amp;quot;; // for transmitting lists via linked messages&lt;br /&gt;
integer M = 1;&lt;br /&gt;
integer ShowTranslations = TRUE;&lt;br /&gt;
&lt;br /&gt;
sendIM(key imid, string imstr)&lt;br /&gt;
{&lt;br /&gt;
    // llInstantMessage(key id , string message) causes the script to sleep for 2 seconds&lt;br /&gt;
    if (llGetAgentSize(imid) == ZERO_VECTOR)&lt;br /&gt;
    { }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        if (imid != llGetOwner())&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(imstr + &amp;quot; @&amp;quot; + llKey2Name(imid));  // llOwnerSay(string message) has no delay&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (M == 8)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_ALL_OTHERS,2334420,imstr,imid);&lt;br /&gt;
            M = 1;&lt;br /&gt;
        }&lt;br /&gt;
        else if (M == 7)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_ALL_OTHERS,2334430,imstr,imid);&lt;br /&gt;
            M = 8;&lt;br /&gt;
        }&lt;br /&gt;
        else if (M == 6)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_ALL_OTHERS,2334440,imstr,imid);&lt;br /&gt;
            M = 7;&lt;br /&gt;
        }&lt;br /&gt;
        else if (M == 5)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_ALL_OTHERS,2334450,imstr,imid);&lt;br /&gt;
            M = 6;&lt;br /&gt;
        }&lt;br /&gt;
        else if (M == 4)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_ALL_OTHERS,2334460,imstr,imid);&lt;br /&gt;
            M = 5;&lt;br /&gt;
        }&lt;br /&gt;
        else if (M == 3)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_ALL_OTHERS,2334470,imstr,imid);&lt;br /&gt;
            M = 4;&lt;br /&gt;
        }&lt;br /&gt;
        else if (M == 2)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_ALL_OTHERS,2334480,imstr,imid);&lt;br /&gt;
            M = 3;&lt;br /&gt;
        }&lt;br /&gt;
        else if (M == 1)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_ALL_OTHERS,2334490,imstr,imid);&lt;br /&gt;
            M = 2;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
string checkLanguage(string chklantmpStr)&lt;br /&gt;
{&lt;br /&gt;
    if (chklantmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;en&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else if (chklantmpStr == &amp;quot;und&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;el&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if (llGetSubString(chklantmpStr, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = llGetSubString(chklantmpStr, 0, 1);&lt;br /&gt;
    }&lt;br /&gt;
    return chklantmpStr;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
    integer avliPos;&lt;br /&gt;
    integer idNum;&lt;br /&gt;
    if (~llListFindList(agentsInTranslation, (list)avid))&lt;br /&gt;
    {&lt;br /&gt;
        avliPos = llListFindList(agentsInTranslation, (list)avid);&lt;br /&gt;
        agentsInTranslation = llListReplaceList(agentsInTranslation, [ avlan, avlan, chklan ], avliPos + 1, avliPos + 3);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        @at;&lt;br /&gt;
        idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
        if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
        {&lt;br /&gt;
            jump at;&lt;br /&gt;
        }&lt;br /&gt;
        agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [ avid, avlan, avlan, chklan, idNum ];        // llMessageLinked(LINK_THIS, 64562349, avlan, avid);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string addNewAgent(key newavid)&lt;br /&gt;
{&lt;br /&gt;
    string speakerLan;&lt;br /&gt;
    if (llGetAgentSize(newavid) == ZERO_VECTOR)&lt;br /&gt;
    {&lt;br /&gt;
        speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
        addAgent(newavid, speakerLan, 4);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        speakerLan  = checkLanguage(llGetAgentLanguage(newavid));&lt;br /&gt;
        if (speakerLan == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
            addAgent(newavid, speakerLan, 0);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            addAgent(newavid, speakerLan, 0);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return speakerLan;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
    if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
    {&lt;br /&gt;
        integer gkliPos = llListFindList(agentsInTranslation, (list)agentID);&lt;br /&gt;
        return llList2Key(agentsInTranslation, gkliPos - 4);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return NULL_KEY;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string List2String(list input)&lt;br /&gt;
{ // converts list to a string&lt;br /&gt;
    return llDumpList2String(input, SEPARATOR);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list String2List(string inputstring)&lt;br /&gt;
{ // converts a separated string created with List2String back to a list&lt;br /&gt;
    list output;&lt;br /&gt;
    output = llParseString2List(inputstring, [SEPARATOR], []);   &lt;br /&gt;
    return output;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {        &lt;br /&gt;
        llSetTimerEvent(1.0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
    {&lt;br /&gt;
        if (num == 9876754)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS,7659759,List2String(agentsInTranslation),NULL_KEY);&lt;br /&gt;
        }&lt;br /&gt;
        if (num == 9827491)&lt;br /&gt;
        {&lt;br /&gt;
            list txli;&lt;br /&gt;
			key recepientID;&lt;br /&gt;
			key txID;&lt;br /&gt;
			integer rxID;&lt;br /&gt;
			string recepientLanguage;&lt;br /&gt;
			string speakerLanguage;&lt;br /&gt;
			string txmessage;&lt;br /&gt;
			txID = lid;&lt;br /&gt;
			txli = String2List(lstr);&lt;br /&gt;
			rxID = llList2Integer(txli,0)&lt;br /&gt;
			speakerLanguage = llList2String(txli,1);&lt;br /&gt;
			txmessage = llList2String(txli,2);            		&lt;br /&gt;
			recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, (list)txID) + 1);&lt;br /&gt;
			recepientID = getAgentKey(rxID);&lt;br /&gt;
            if (recepientID != NULL_KEY)&lt;br /&gt;
            {&lt;br /&gt;
                if (recepientLanguage == speakerLanguage)&lt;br /&gt;
                { }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    sendIM(lid,txmessage);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (num == 6349160)&lt;br /&gt;
	{&lt;br /&gt;
		&lt;br /&gt;
            key speaker;&lt;br /&gt;
            string spkLan;&lt;br /&gt;
            speaker = lid;&lt;br /&gt;
            spkLan = lstr;&lt;br /&gt;
            if (~llListFindList(agentsInTranslation, (list)speaker))&lt;br /&gt;
            {&lt;br /&gt;
                integer tmpavliPos = llListFindList(agentsInTranslation, (list)speaker);&lt;br /&gt;
                string actlan = llList2String(agentsInTranslation, tmpavliPos + 1);&lt;br /&gt;
                string tmplan = llList2String(agentsInTranslation, tmpavliPos + 2);&lt;br /&gt;
                if (llList2Integer(agentsInTranslation, tmpavliPos + 3) &amp;gt;= 2)&lt;br /&gt;
                {   // if anyone speaks on any different language 3 times in a row&lt;br /&gt;
                    addAgent(lid, lstr, 0);&lt;br /&gt;
                }&lt;br /&gt;
                if (actlan == lstr)&lt;br /&gt;
                {   // reset language checker for speaker&lt;br /&gt;
                    agentsInTranslation = llListReplaceList(agentsInTranslation, [actlan, 0], tmpavliPos + 2, tmpavliPos + 3);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    if (lstr == tmplan)&lt;br /&gt;
                    {   // if language of speaker is not the same as detected language&lt;br /&gt;
                        agentsInTranslation = llListReplaceList(agentsInTranslation,[llList2Integer(agentsInTranslation,tmpavliPos + 3) + 1] , tmpavliPos + 3, tmpavliPos + 3);&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        agentsInTranslation = llListReplaceList(agentsInTranslation,[lstr, 0] , tmpavliPos + 2, tmpavliPos + 3);&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    sensor(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        integer s;&lt;br /&gt;
        key sid;&lt;br /&gt;
        for (s = 0; s &amp;lt; num_detected; s += 1)&lt;br /&gt;
        {&lt;br /&gt;
            sid = llDetectedKey(s);&lt;br /&gt;
            if (~llListFindList(agentsInTranslation, (list)sid))&lt;br /&gt;
            { }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                addNewAgent(sid);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    no_sensor()&lt;br /&gt;
    { }&lt;br /&gt;
&lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {        &lt;br /&gt;
        if(~llListFindList(agentsInTranslation, (list)id))&lt;br /&gt;
        { }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            addNewAgent(id);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        integer r;&lt;br /&gt;
        vector  tmrVct;&lt;br /&gt;
        list  newList;&lt;br /&gt;
        llSetTimerEvent(0.0);   // we better reset timer by way of precaution&lt;br /&gt;
        if (isInitialized == FALSE)&lt;br /&gt;
		{&lt;br /&gt;
			string mylanguage;&lt;br /&gt;
            enabled = TRUE;&lt;br /&gt;
            listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
            llMessageLinked(LINK_THIS, 6877259, (string)enabled, NULL_KEY);&lt;br /&gt;
            isInitialized = TRUE;&lt;br /&gt;
			mylanguage = llGetAgentLanguage(llGetOwner());&lt;br /&gt;
            if (llStringLength(mylanguage) &amp;lt; 1)&lt;br /&gt;
            {&lt;br /&gt;
                mylanguage = &amp;quot;en&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            if(~llListFindList(agentsInTranslation, (list)llGetOwner()))&lt;br /&gt;
            {&lt;br /&gt;
				integer ownerliPos;&lt;br /&gt;
				ownerliPos = llListFindList(agentsInTranslation, (list)llGetOwner());&lt;br /&gt;
                agentsInTranslation = llListReplaceList(agentsInTranslation, [mylanguage] , ownerliPos + 1, ownerliPos + 1);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [ llGetOwner() , mylanguage, mylanguage , 0 , llRound(llFrand(2000000)) + 1];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            for (r = 0; r &amp;lt; llGetListLength(agentsInTranslation); r += 5)&lt;br /&gt;
            {&lt;br /&gt;
                tmrVct = llList2Vector(llGetObjectDetails(llList2Key(agentsInTranslation, r), [OBJECT_POS]), 0);&lt;br /&gt;
                if (llVecDist(llGetPos(), tmrVct) &amp;lt;= 20.0)&lt;br /&gt;
                {&lt;br /&gt;
                    newList = (newList=[]) + newList + llList2List(agentsInTranslation, r, r + 4);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            agentsInTranslation = newList;&lt;br /&gt;
            newList = [];&lt;br /&gt;
        }&lt;br /&gt;
        if ((autoLanguage) &amp;amp;&amp;amp; isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            llSensor(&amp;quot;&amp;quot;, NULL_KEY, AGENT, 20.0, PI);&lt;br /&gt;
        }&lt;br /&gt;
        llSetTimerEvent(4.0);   // restart timer&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
CheckSpell-DetectLanguage&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//Spell Checker Web Services powered by Yahoo&lt;br /&gt;
key splValue;&lt;br /&gt;
key dtcValue;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer enabled = TRUE;&lt;br /&gt;
integer showTranslation = TRUE;&lt;br /&gt;
integer tranObjects = TRUE;&lt;br /&gt;
integer SpellChecker = 1;&lt;br /&gt;
list tempDetections;&lt;br /&gt;
list spellchecks;&lt;br /&gt;
&lt;br /&gt;
integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex&lt;br /&gt;
{&lt;br /&gt;
	return ~llSubStringIndex(haystack, needle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
DetectLanguage(string dtcmsg, key dtcid)&lt;br /&gt;
{&lt;br /&gt;
	llSleep(0.2);&lt;br /&gt;
	dtcValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&amp;amp;q=&amp;quot; + llEscapeURL(dtcmsg), [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot; &amp;quot;);&lt;br /&gt;
	if (dtcValue != NULL_KEY)&lt;br /&gt;
	{&lt;br /&gt;
		tempDetections = (tempDetections=[]) + tempDetections + [ dtcValue, dtcid, llGetTime() ];&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		llSleep(10.0); // Something has gone horribly wrong, sleep 10 seconds clear throttle&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
CheckSpell(string splmsg, key splid)&lt;br /&gt;
{&lt;br /&gt;
	splValue = llHTTPRequest(&amp;quot;http://search.yahooapis.com/WebSearchService/V1/spellingSuggestion?appid=DNPjiabV34EOgXQ3kAu6.d7kf6v.JUGCn1bFUcSTFMSGCyCy_ALzbepYstlI7DrOGP0-&amp;amp;query=&amp;quot; + llEscapeURL(splmsg), [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot;&amp;quot;);&lt;br /&gt;
	if (splValue != NULL_KEY)&lt;br /&gt;
	{    // Translation&lt;br /&gt;
		spellchecks = (spellchecks=[]) + spellchecks + [ splValue, splid, splmsg, llGetTime() ];&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		llSleep(10.0); // Something has gone horribly wrong, sleep 10 seconds clear throttle&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		llListen(0,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	listen(integer channel, string name, key id, string message)&lt;br /&gt;
	{&lt;br /&gt;
		if ((!enabled) &amp;amp;&amp;amp; (isMaster == 1))&lt;br /&gt;
		{&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (!tranObjects)&lt;br /&gt;
		{&lt;br /&gt;
			if (llGetAgentSize(id) == ZERO_VECTOR)&lt;br /&gt;
			{&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				if (SpellChecker == 1)&lt;br /&gt;
				{&lt;br /&gt;
					CheckSpell(message, id);&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					llMessageLinked(LINK_THIS,98745920,message,id);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			if (SpellChecker == 1)&lt;br /&gt;
			{&lt;br /&gt;
				CheckSpell(message, id);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				llMessageLinked(LINK_THIS,98745920,message,id);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		DetectLanguage(message, id);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
	{   // Process Response Code&lt;br /&gt;
		if (~llListFindList(spellchecks, (list)request_id))&lt;br /&gt;
		{&lt;br /&gt;
			integer splliPos = llListFindList(spellchecks, (list)request_id);&lt;br /&gt;
			if(contains(body, &amp;quot;lt&amp;gt;&amp;quot;) != 0)&lt;br /&gt;
			{   // Yahoo Spell Checker correction&lt;br /&gt;
				llMessageLinked(LINK_THIS, 98745920,llGetSubString(body, llSubStringIndex(body, &amp;quot;t&amp;gt;&amp;quot;) + 2, llSubStringIndex(body, &amp;quot;&amp;lt;/&amp;quot;) - 1),llList2Key(spellchecks, splliPos + 1));&lt;br /&gt;
				llOwnerSay(llGetSubString(body, llSubStringIndex(body, &amp;quot;t&amp;gt;&amp;quot;) + 2, llSubStringIndex(body, &amp;quot;&amp;lt;/&amp;quot;) - 1));&lt;br /&gt;
				spellchecks = llDeleteSubList(spellchecks,splliPos, splliPos + 3);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				llMessageLinked(LINK_THIS,98745920,llList2String(spellchecks, splliPos + 2),llList2Key(spellchecks, splliPos + 1));&lt;br /&gt;
				spellchecks = llDeleteSubList(spellchecks,splliPos, splliPos + 3);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if (~llListFindList(tempDetections, (list)request_id))&lt;br /&gt;
		{   // Language Detection&lt;br /&gt;
			integer tmpliPos = llListFindList(tempDetections, (list)request_id);&lt;br /&gt;
			key speakerID = llList2Key(tempDetections, tmpliPos + 1);&lt;br /&gt;
			tempDetections = llDeleteSubList(tempDetections, tmpliPos, tmpliPos + 2);&lt;br /&gt;
			string htttmpStr = llToLower(llGetSubString(body, llSubStringIndex(body, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(body, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
			if (contains(htttmpStr, &amp;quot;err&amp;quot;) == 0 &amp;amp;&amp;amp; contains(htttmpStr, &amp;quot;unn&amp;quot;) == 0)&lt;br /&gt;
			{   // We Trust the Google system, the Google´s guys are good and I am sure they will keep improving :-)&lt;br /&gt;
				// Language Detected&lt;br /&gt;
				llMessageLinked(LINK_THIS,6349160,htttmpStr,speakerID);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	timer()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(0.0);&lt;br /&gt;
		integer r;&lt;br /&gt;
		list newList;&lt;br /&gt;
		float timeElapsed;&lt;br /&gt;
		for (r = 0; r &amp;lt; llGetListLength(spellchecks); r += 4)&lt;br /&gt;
		{&lt;br /&gt;
			timeElapsed = llGetTime() - llList2Float(spellchecks, r + 3);&lt;br /&gt;
			if (timeElapsed &amp;lt; 10.0)&lt;br /&gt;
			{&lt;br /&gt;
				newList = (newList=[]) + newList + llList2List(spellchecks, r, r + 3);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		spellchecks = newList;&lt;br /&gt;
		newList = [];&lt;br /&gt;
		for (r = 0; r &amp;lt; llGetListLength(tempDetections); r += 3)&lt;br /&gt;
		{&lt;br /&gt;
			timeElapsed = llGetTime() - llList2Float(tempDetections, r + 2);&lt;br /&gt;
			if (timeElapsed &amp;lt; 10.0)&lt;br /&gt;
			{&lt;br /&gt;
				newList = (newList=[]) + newList + llList2List(tempDetections, r, r + 2);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		tempDetections = newList;&lt;br /&gt;
		newList = [];&lt;br /&gt;
		llSetTimerEvent(5.0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Formulator&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//Spell Checker Web Services powered by Yahoo&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
string SEPARATOR = &amp;quot;|%&amp;amp;|&amp;quot;; // for transmitting lists via linked messages&lt;br /&gt;
list translationCache;&lt;br /&gt;
&lt;br /&gt;
list String2List(string inputstring)&lt;br /&gt;
{    // converts a separated string created with List2String back to a list&lt;br /&gt;
	list output;&lt;br /&gt;
	output = llParseString2List(inputstring, [SEPARATOR], []);&lt;br /&gt;
	return output;&lt;br /&gt;
}&lt;br /&gt;
string List2String(list input)&lt;br /&gt;
{    // converts a list to a string&lt;br /&gt;
	return llDumpList2String(input, SEPARATOR);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(1.0);&lt;br /&gt;
	}&lt;br /&gt;
	link_message(integer sender_num, integer num, string lstr, key id)&lt;br /&gt;
	{&lt;br /&gt;
		if (num == 7659759)&lt;br /&gt;
		{&lt;br /&gt;
			agentsInTranslation = String2List(lstr);&lt;br /&gt;
		}&lt;br /&gt;
		if (num == 98745920)&lt;br /&gt;
		{&lt;br /&gt;
			integer w;&lt;br /&gt;
			string  spkrLan;&lt;br /&gt;
			string  recepLan;&lt;br /&gt;
			integer recepID;&lt;br /&gt;
			integer lstliPos;&lt;br /&gt;
			string  lanpair;&lt;br /&gt;
			//===============================&lt;br /&gt;
			// Formulate Translation Requests&lt;br /&gt;
			//===============================&lt;br /&gt;
			for (w = 0; w &amp;lt; llGetListLength(agentsInTranslation); w += 5)&lt;br /&gt;
			{    // Loop through translation group and do appropriate translations as needed&lt;br /&gt;
				recepID = llList2Integer(agentsInTranslation, w + 4);&lt;br /&gt;
				recepLan = llList2String(agentsInTranslation, w + 1);&lt;br /&gt;
				if (spkrLan == recepLan)&lt;br /&gt;
				{ }&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
					if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
					{&lt;br /&gt;
						lstliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
						translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						translationCache = (translationCache=[]) + translationCache + [lanpair, recepID, llGetTime()];&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			if (translationCache != [])&lt;br /&gt;
			{    // Process Requests&lt;br /&gt;
				for (w = 0; w &amp;lt; llGetListLength(translationCache); w += 3)&lt;br /&gt;
				{   //====================================&lt;br /&gt;
					//Translation&lt;br /&gt;
					//====================================&lt;br /&gt;
					//Forumulate and Send Translation Request&lt;br /&gt;
					lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, w), [&amp;quot;|&amp;quot;],[]), 1);&lt;br /&gt;
					llMessageLinked(LINK_THIS,2346017,List2String( [llEscapeURL(lstr) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), llList2String(translationCache, w + 1), llList2String(translationCache, w)] ),id);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	timer()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(0.0);&lt;br /&gt;
		integer r;&lt;br /&gt;
		float timeElapsed;&lt;br /&gt;
		list newList;&lt;br /&gt;
		for (r = 0; r &amp;lt; llGetListLength(translationCache); r += 3)&lt;br /&gt;
		{&lt;br /&gt;
			timeElapsed = llGetTime() - llList2Float(translationCache, r + 2);&lt;br /&gt;
			if (timeElapsed &amp;lt; 8.0)&lt;br /&gt;
			{&lt;br /&gt;
				newList = (newList=[]) + newList + llList2List(translationCache, r, r + 2);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		translationCache = newList;&lt;br /&gt;
		newList = [];&lt;br /&gt;
		llMessageLinked(LINK_THIS,9876754,&amp;quot;&amp;quot;,NULL_KEY);&lt;br /&gt;
		llSetTimerEvent(5.0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Translator&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//Spell Checker Web Services powered by Yahoo&lt;br /&gt;
integer tranObjects = TRUE;&lt;br /&gt;
integer SpellChecker = TRUE;&lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
key returnValue;&lt;br /&gt;
list requestedTranslations;&lt;br /&gt;
string SEPARATOR = &amp;quot;|%&amp;amp;|&amp;quot;; // for transmitting lists via linked messages&lt;br /&gt;
&lt;br /&gt;
Translate(string chkmsg, list chkli)&lt;br /&gt;
{&lt;br /&gt;
    returnValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&amp;amp;q=&amp;quot; + chkmsg, [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot;&amp;quot;);&lt;br /&gt;
    if (returnValue != NULL_KEY)&lt;br /&gt;
    {    // Translation&lt;br /&gt;
        requestedTranslations = (requestedTranslations=[]) + requestedTranslations + [returnValue, llList2CSV(chkli)];&lt;br /&gt;
        llSleep(0.6);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llSleep(25.0); // Something has gone horribly wrong, sleep 25 seconds to clear throttle&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
processHTTPResponse(string bodyStr, list httli)&lt;br /&gt;
{&lt;br /&gt;
    key     recepientID;&lt;br /&gt;
    key     speakerID;&lt;br /&gt;
    list    paramtmpli;&lt;br /&gt;
    list    recepientList;&lt;br /&gt;
    string  recepientLanguage;&lt;br /&gt;
    string  languagePair;&lt;br /&gt;
    string  speakerName;&lt;br /&gt;
    string  speakerLanguage;&lt;br /&gt;
    string  translatedText;&lt;br /&gt;
    string  lantmpStr;&lt;br /&gt;
    integer z;&lt;br /&gt;
    //===================&lt;br /&gt;
    // Process Translation&lt;br /&gt;
    //===================&lt;br /&gt;
    speakerID  = llList2Key(httli, 1);&lt;br /&gt;
    speakerName = llKey2Name(speakerID);&lt;br /&gt;
    if (speakerName == &amp;quot;&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
    }&lt;br /&gt;
    recepientList = llParseString2List(llList2String(httli, 2), [&amp;quot;@&amp;quot;], []);&lt;br /&gt;
    paramtmpli = llParseStringKeepNulls(llList2String(httli, 3), [&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
    recepientLanguage = llList2String(paramtmpli, 1);&lt;br /&gt;
    languagePair = llDumpList2String(paramtmpli, &amp;quot;&amp;gt;&amp;gt;&amp;quot;);&lt;br /&gt;
    // Perform Text Cleanup&lt;br /&gt;
    translatedText = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;detectedSourceLanguage\&amp;quot;:\&amp;quot;&amp;quot;));&lt;br /&gt;
    // Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
    if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
    {&lt;br /&gt;
        lantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
        for(z = llStringLength(translatedText);z &amp;gt;= 0; z--)&lt;br /&gt;
        {&lt;br /&gt;
            lantmpStr = (lantmpStr=&amp;quot;&amp;quot;) + lantmpStr + llGetSubString(translatedText, z, z);&lt;br /&gt;
        }&lt;br /&gt;
        translatedText = lantmpStr;&lt;br /&gt;
    }&lt;br /&gt;
    lantmpStr = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
    for (z = 0; z &amp;lt; llGetListLength(recepientList); z += 1)&lt;br /&gt;
    {&lt;br /&gt;
            llMessageLinked(LINK_THIS,9827491, List2String( [ llList2Integer(recepientList, z), speakerLanguage , lantmpStr ] ) , recepientID);&lt;br /&gt;
    }&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string List2String(list input)&lt;br /&gt;
{ // converts list to a string&lt;br /&gt;
    return llDumpList2String(input, SEPARATOR);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list String2List(string inputstring)&lt;br /&gt;
{ // converts a separated string created with List2String back to a list&lt;br /&gt;
    list output;&lt;br /&gt;
    output = llParseString2List(inputstring, [SEPARATOR], []);   &lt;br /&gt;
    return output;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(1.0);&lt;br /&gt;
    }&lt;br /&gt;
    link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
    {&lt;br /&gt;
        if (num == 2346017)&lt;br /&gt;
        {&lt;br /&gt;
            list txli;&lt;br /&gt;
            key txID;&lt;br /&gt;
            txli = String2List(lstr);&lt;br /&gt;
            txID = lid;&lt;br /&gt;
            Translate(llList2String(txli,0),[ llGetTime(), txID, llList2String(txli,1), llList2String(txli,2) ] );&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
    {   // Process Response Code&lt;br /&gt;
        if (~llListFindList(requestedTranslations, (list)request_id))&lt;br /&gt;
        {   // Translation&lt;br /&gt;
            integer httliPos;&lt;br /&gt;
            string httmsg;&lt;br /&gt;
            httliPos = llListFindList(requestedTranslations, (list)request_id);&lt;br /&gt;
            httmsg = body;&lt;br /&gt;
            processHTTPResponse(httmsg, llList2List(requestedTranslations, httliPos + 1, httliPos + 4 ));&lt;br /&gt;
            requestedTranslations = llDeleteSubList(requestedTranslations, httliPos, httliPos + 4);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
        integer r;&lt;br /&gt;
        float timeElapsed;&lt;br /&gt;
        list newList;&lt;br /&gt;
        for (r = 0; r &amp;lt; llGetListLength(requestedTranslations); r += 5)&lt;br /&gt;
        {&lt;br /&gt;
            timeElapsed = llGetTime() - llList2Float(requestedTranslations, r + 1);&lt;br /&gt;
            if (timeElapsed &amp;lt; 20.0)&lt;br /&gt;
            {&lt;br /&gt;
                newList = (newList=[]) + newList + llList2List(requestedTranslations, r, r + 4);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        requestedTranslations = newList;&lt;br /&gt;
        newList = [];&lt;br /&gt;
        llSetTimerEvent(5.0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=692382</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=692382"/>
		<updated>2009-12-26T01:27:29Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: /* OK */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribución al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente código fué originálmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mí manera...&lt;br /&gt;
No ós riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;OK&#039;&#039; ===&lt;br /&gt;
Bueno, despues de respiñar todo lo que pude, creo que el uso de memoria y la velocidad están prácticamente igual qué en la versión original pero bueno... en la variedad está el gusto no?&lt;br /&gt;
Ya he probado un poco el código, y parece que funciona aunque estoy teniendo algunos problemas... Por ejemplo creo que el sistema de traduccion no funciona corréctamente, y no me refiero al sistema de traduccion de Google (en mi opinion, si no es el mejor, es uno de los mejores del mundo), sino a que aún queda mucho trabajo por hacer en el script...&lt;br /&gt;
&lt;br /&gt;
El siguiente paso sera intentar dividir el script en dos, o si es posible en tres para repartir el uso de memoria. Tambien me gustaria probar un truco que uso a menudo para traducir páginas en un idioma que no entiendo, lo que hago es que en vez de traducir diréctamente al español, primero se traduce a inglés, y luego desde inglés al español. Parece una tontería y un gasto innecesario, pero si lo hago es porque así suelo entender mejor las traducciones.&lt;br /&gt;
Quiero por un lado el sistema de comunicacion y evaluacion entre traductores, y por otro el sistema de traduccion entre avatares, ¿es muy dificil? no sé ya lo veremos...&lt;br /&gt;
&lt;br /&gt;
Well, after saving as much as I could, I think the memory usage and the speed are technically the same as in the original script, but well, in the variety is the taste, isnt it?. &lt;br /&gt;
I have tested a bit the code above already, and it seems to work altought i´m having some problems...&lt;br /&gt;
For instance i think the translation system is not working properly, and i dont mean the Google´s translation system (in my opinion, if is not the best, one of the bests), but that there is still much work to do in the script...&lt;br /&gt;
&lt;br /&gt;
The next step will be to try to divide the script in 2, or 3 if is possible, so we can spread the memory usage. Also I would like to test a trick i use often for to translate languages that i dont understand, what I do first is to translate that language into English, and then from English to Spanish, it seems a nonsense and unnecesary waste, but if i do it is becouse so i usually understand the translations better.&lt;br /&gt;
I want by one part the translators communications and evaluation system, and by other the translation system between avatars, is it very difficult? I don´t know , we will see...&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Es dificil... me está costando pero ya veremos...&lt;br /&gt;
Its difficult... i am struggling but we will see...&lt;br /&gt;
&lt;br /&gt;
chu chu chu&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
De Güatemala a Güatepeor, Sin comentarios...&lt;br /&gt;
&lt;br /&gt;
From Güatebad to Güateworse, No comments...&lt;br /&gt;
&lt;br /&gt;
Buscando en Internet he encontrado este [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html API de Yahoo] comprobador de ortografía, aunque creo que por ahora sólo soporta el lenguage inglés pero sería interesante añadirlo al proyecto&lt;br /&gt;
&lt;br /&gt;
Searching on the web I crossed in my way with this spell checker [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html Yahoo´s API] , I think that it only supports English language by now althought it would be interesting to add it to the project&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Estoy probando el comprobador de deletreo de Yahoo aunque la verdad es que no estoy teniendo buenos resultados, parece que Google es mucho más rapido y necesito corregir antes de traducir. También estoy intentando solucionar el error que aparece con el símbolo (apostrofe) ´ en las frases con genitivo sajon traducidas al inglés y tampoco doy con la tecla... Ya que esto me está dando muchos dolores de cabeza quizás deje el proyecto en standby hasta después de navidades.&lt;br /&gt;
&lt;br /&gt;
I am testing the Yahoo´s spell checker althought to be honest I´m not having good success, it seems Google is much faster and I need to correct before translate. Also I am triying to fix the error showed in the phrases translated to English with the saxons genitive apostrophe ´ and still triying and triying. As this is driving me nuts, maybe I will leave the project in standby until new year.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ESTO ES EL TRADUCTOR &amp;quot;un lío&amp;quot; por ahora... Necesito rehacer algunas cosas&lt;br /&gt;
&lt;br /&gt;
THIS IS THE TRANSLATOR &amp;quot;mess&amp;quot; by now... I need to redo some things&lt;br /&gt;
&#039;&#039;&#039;THE CODE BELOW IS NOT TESTED&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
agentsinTranslation&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//Spell Checker Web Services powered by Yahoo&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
integer isInitialized = FALSE;&lt;br /&gt;
integer listenID;&lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
string SEPARATOR = &amp;quot;|%&amp;amp;|&amp;quot;; // for transmitting lists via linked messages&lt;br /&gt;
integer M = 1;&lt;br /&gt;
&lt;br /&gt;
sendIM(key imid, string imstr)&lt;br /&gt;
{&lt;br /&gt;
	// llInstantMessage(key id , string message) causes the script to sleep for 2 seconds&lt;br /&gt;
	if (llGetAgentSize(imid) == ZERO_VECTOR)&lt;br /&gt;
	{ }&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		if(ShowTranslations)&lt;br /&gt;
		{&lt;br /&gt;
			if (imid != llGetOwner())&lt;br /&gt;
			{&lt;br /&gt;
				llOwnerSay(imstr + &amp;quot; @&amp;quot; + llKey2Name(imid));  // llOwnerSay(string message) has no delay&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if (M == 8)&lt;br /&gt;
		{&lt;br /&gt;
			llMessageLinked(LINK_ALL_CHILDREN,2334420,imstr,imid);&lt;br /&gt;
			M = 1;&lt;br /&gt;
		}&lt;br /&gt;
		else if (M == 7)&lt;br /&gt;
		{&lt;br /&gt;
			llMessageLinked(LINK_ALL_CHILDREN,2334430,imstr,imid);&lt;br /&gt;
			M = 8;&lt;br /&gt;
		}&lt;br /&gt;
		else if (M == 6)&lt;br /&gt;
		{&lt;br /&gt;
			llMessageLinked(LINK_ALL_CHILDREN,2334440,imstr,imid);&lt;br /&gt;
			M = 7;&lt;br /&gt;
		}&lt;br /&gt;
		else if (M == 5)&lt;br /&gt;
		{&lt;br /&gt;
			llMessageLinked(LINK_ALL_CHILDREN,2334450,imstr,imid);&lt;br /&gt;
			M = 6;&lt;br /&gt;
		}&lt;br /&gt;
		else if (M == 4)&lt;br /&gt;
		{&lt;br /&gt;
			llMessageLinked(LINK_ALL_CHILDREN,2334460,imstr,imid);&lt;br /&gt;
			M = 5;&lt;br /&gt;
		}&lt;br /&gt;
		else if (M == 3)&lt;br /&gt;
		{&lt;br /&gt;
			llMessageLinked(LINK_ALL_CHILDREN,2334470,imstr,imid);&lt;br /&gt;
			M = 4;&lt;br /&gt;
		}&lt;br /&gt;
		else if (M == 2)&lt;br /&gt;
		{&lt;br /&gt;
			llMessageLinked(LINK_ALL_CHILDREN,2334480,imstr,imid);&lt;br /&gt;
			M = 3;&lt;br /&gt;
		}&lt;br /&gt;
		else if (M == 1)&lt;br /&gt;
		{&lt;br /&gt;
			llMessageLinked(LINK_ALL_CHILDREN,2334490,imstr,imid);&lt;br /&gt;
			M = 2;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
string checkLanguage(string chklantmpStr)&lt;br /&gt;
{&lt;br /&gt;
	if (chklantmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;en&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	else if (chklantmpStr == &amp;quot;und&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;el&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	if (llGetSubString(chklantmpStr, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = llGetSubString(chklantmpStr, 0, 1);&lt;br /&gt;
	}&lt;br /&gt;
	return chklantmpStr;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
	integer avliPos;&lt;br /&gt;
	integer idNum;&lt;br /&gt;
	if (~llListFindList(agentsInTranslation, (list)avid))&lt;br /&gt;
	{&lt;br /&gt;
		avliPos = llListFindList(agentsInTranslation, (list)avid);&lt;br /&gt;
		agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, avlan, chklan], avliPos + 1, avliPos + 3);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		@at;&lt;br /&gt;
		idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
		if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
		{&lt;br /&gt;
			jump at;&lt;br /&gt;
		}&lt;br /&gt;
		agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [ avid, avlan, avlan, chklan, idNum ];		// llMessageLinked(LINK_THIS, 64562349, avlan, avid);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string addNewAgent(key newavid)&lt;br /&gt;
{&lt;br /&gt;
	string speakerLan;&lt;br /&gt;
	if (llGetAgentSize(newavid) == ZERO_VECTOR)&lt;br /&gt;
	{&lt;br /&gt;
		speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
		addAgent(newavid, speakerLan, 4);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		speakerLan  = checkLanguage(llGetAgentLanguage(newavid));&lt;br /&gt;
		if (speakerLan == &amp;quot;&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
			addAgent(newavid, speakerLan, 0);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			addAgent(newavid, speakerLan, 0);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return speakerLan;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
	if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
	{&lt;br /&gt;
		integer gkliPos = llListFindList(agentsInTranslation, (list)agentID);&lt;br /&gt;
		return llList2Key(agentsInTranslation, gkliPos - 4);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		return &amp;quot;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string List2String(list input)&lt;br /&gt;
{ // converts list to a string&lt;br /&gt;
    return llDumpList2String(input, SEPARATOR);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list String2List(string inputstring)&lt;br /&gt;
{ // converts a separated string created with List2String back to a list&lt;br /&gt;
	list output;&lt;br /&gt;
    output = llParseString2List(inputstring, [SEPARATOR], []);   &lt;br /&gt;
    return output;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{		&lt;br /&gt;
		llSetTimerEvent(1.0);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
	{&lt;br /&gt;
		integer w;&lt;br /&gt;
		string  spkrLan;&lt;br /&gt;
		string  recepLan;&lt;br /&gt;
		integer recepID;&lt;br /&gt;
		integer lnkliPos;&lt;br /&gt;
		string  lanpair;&lt;br /&gt;
		list    translationCache;&lt;br /&gt;
		if (num == 9876754)&lt;br /&gt;
		{&lt;br /&gt;
			llMessageLinked(LINK_THIS,7659759,List2String(agentsInTranslation),NULL_KEY);&lt;br /&gt;
		}&lt;br /&gt;
		if (num == 9827491)&lt;br /&gt;
		{&lt;br /&gt;
			list txli = String2List(lstr);&lt;br /&gt;
			key recepientID = getAgentKey(llList2Integer(txli,0));&lt;br /&gt;
			string recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, (list)lid) + 1);&lt;br /&gt;
			string speakerLanguage = llList2String(txli,1);&lt;br /&gt;
			string txmessage = llList2String(txli,2);&lt;br /&gt;
			if (recepientID != &amp;quot;&amp;quot;)&lt;br /&gt;
			{&lt;br /&gt;
				if (recepientLanguage == speakerLanguage)&lt;br /&gt;
				{ }&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					sendIM(lid,txmessage);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if (num == 6349160)&lt;br /&gt;
		{&lt;br /&gt;
			key speaker;&lt;br /&gt;
			string spkLan;&lt;br /&gt;
			speaker = lid;&lt;br /&gt;
			spkLan = lstr;&lt;br /&gt;
			if (~llListFindList(agentsInTranslation, (list)speaker))&lt;br /&gt;
			{&lt;br /&gt;
				integer tmpavliPos = llListFindList(agentsInTranslation, (list)speaker);&lt;br /&gt;
				string actlan = llList2String(agentsInTranslation, tmpavliPos + 1);&lt;br /&gt;
				string tmplan = llList2String(agentsInTranslation, tmpavliPos + 2);&lt;br /&gt;
				if (llList2Integer(agentsInTranslation, tmpavliPos + 3) &amp;gt;= 2)&lt;br /&gt;
				{   // if anyone speaks on any different language 3 times in a row&lt;br /&gt;
					addAgent(lid, lstr, 0);&lt;br /&gt;
				}&lt;br /&gt;
				if (actlan == lstr)&lt;br /&gt;
				{   // reset language checker for speaker&lt;br /&gt;
					agentsInTranslation = llListReplaceList(agentsInTranslation, [actlan, 0], tmpavliPos + 2, tmpavliPos + 3);&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					if (lstr == tmplan)&lt;br /&gt;
					{   // if language of speaker is not the same as detected language&lt;br /&gt;
						agentsInTranslation = llListReplaceList(agentsInTranslation,[llList2Integer(agentsInTranslation,tmpavliPos + 3) + 1] , tmpavliPos + 3, tmpavliPos + 3);&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						agentsInTranslation = llListReplaceList(agentsInTranslation,[lstr, 0] , tmpavliPos + 2, tmpavliPos + 3);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}			&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	sensor(integer num_detected)&lt;br /&gt;
	{&lt;br /&gt;
		integer s;&lt;br /&gt;
		key sid;&lt;br /&gt;
		for (s = 0; s &amp;lt; num_detected; s += 1)&lt;br /&gt;
		{&lt;br /&gt;
			sid = llDetectedKey(s);&lt;br /&gt;
			if (~llListFindList(agentsInTranslation, (list)sid))&lt;br /&gt;
			{ }&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				addNewAgent(sid);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	no_sensor()&lt;br /&gt;
	{ }&lt;br /&gt;
&lt;br /&gt;
	listen(integer channel, string name, key id, string message)&lt;br /&gt;
	{		&lt;br /&gt;
		if(~llListFindList(agentsInTranslation, (list)id))&lt;br /&gt;
		{ }&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			addNewAgent(id);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	timer()&lt;br /&gt;
	{&lt;br /&gt;
		integer r;&lt;br /&gt;
		vector  tmrVct;&lt;br /&gt;
		list  newList;&lt;br /&gt;
		llSetTimerEvent(0.0);   // we better reset timer by way of precaution&lt;br /&gt;
		if (isInitialized == FALSE)&lt;br /&gt;
		{&lt;br /&gt;
			enabled = TRUE;&lt;br /&gt;
			listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
			llMessageLinked(LINK_THIS, 6877259, (string)enabled, NULL_KEY);&lt;br /&gt;
			isInitialized = TRUE;&lt;br /&gt;
			string mylanguage = llGetAgentLanguage(llGetOwner());&lt;br /&gt;
			if (llStringLength(mylanguage) &amp;lt; 1)&lt;br /&gt;
			{&lt;br /&gt;
				mylanguage = &amp;quot;en&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			if(~llListFindList(agentsInTranslation, (list)llGetOwner()))&lt;br /&gt;
			{&lt;br /&gt;
				integer ownerliPos = llListFindList(agentsInTranslation, (list)llGetOwner());&lt;br /&gt;
				agentsInTranslation = llListReplaceList(agentsInTranslation, [mylanguage] , ownerliPos + 1, ownerliPos + 1);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [llGetOwner() , mylanguage, mylanguage , 0 , llRound(llFrand(2000000)) + 1];&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if (isMaster &amp;gt; 0)&lt;br /&gt;
		{&lt;br /&gt;
			for (r = 0; r &amp;lt; llGetListLength(agentsInTranslation); r += 5)&lt;br /&gt;
			{&lt;br /&gt;
				tmrVct = llList2Vector(llGetObjectDetails(llList2Key(agentsInTranslation, r), [OBJECT_POS]), 0);&lt;br /&gt;
				if (llVecDist(llGetPos(), tmrVct) &amp;lt;= 20.0)&lt;br /&gt;
				{&lt;br /&gt;
					newList = (newList=[]) + newList + llList2List(agentsInTranslation, r, r + 4);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			agentsInTranslation = newList;&lt;br /&gt;
			newList = [];&lt;br /&gt;
		}&lt;br /&gt;
		if ((autoLanguage) &amp;amp;&amp;amp; isMaster &amp;gt; 0)&lt;br /&gt;
		{&lt;br /&gt;
			llSensor(&amp;quot;&amp;quot;, NULL_KEY, AGENT, 20.0, PI);&lt;br /&gt;
		}&lt;br /&gt;
		llSetTimerEvent(4.0);   // restart timer&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
CheckSpell-DetectLanguage&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//Spell Checker Web Services powered by Yahoo&lt;br /&gt;
key splValue;&lt;br /&gt;
key dtcValue;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer enabled = TRUE;&lt;br /&gt;
integer showTranslation = TRUE;&lt;br /&gt;
integer tranObjects = TRUE;&lt;br /&gt;
integer SpellChecker = 1;&lt;br /&gt;
list tempDetections;&lt;br /&gt;
list spellchecks;&lt;br /&gt;
&lt;br /&gt;
integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex&lt;br /&gt;
{&lt;br /&gt;
	return ~llSubStringIndex(haystack, needle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
DetectLanguage(string dtcmsg, key dtcid)&lt;br /&gt;
{&lt;br /&gt;
	llSleep(0.2);&lt;br /&gt;
	dtcValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&amp;amp;q=&amp;quot; + llEscapeURL(dtcmsg), [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot; &amp;quot;);&lt;br /&gt;
	if (dtcValue != NULL_KEY)&lt;br /&gt;
	{&lt;br /&gt;
		tempDetections = (tempDetections=[]) + tempDetections + [ dtcValue, dtcid, llGetTime() ];&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		llSleep(10.0); // Something has gone horribly wrong, sleep 10 seconds clear throttle&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
CheckSpell(string splmsg, key splid)&lt;br /&gt;
{&lt;br /&gt;
	splValue = llHTTPRequest(&amp;quot;http://search.yahooapis.com/WebSearchService/V1/spellingSuggestion?appid=DNPjiabV34EOgXQ3kAu6.d7kf6v.JUGCn1bFUcSTFMSGCyCy_ALzbepYstlI7DrOGP0-&amp;amp;query=&amp;quot; + llEscapeURL(splmsg), [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot;&amp;quot;);&lt;br /&gt;
	if (splValue != NULL_KEY)&lt;br /&gt;
	{    // Translation&lt;br /&gt;
		spellchecks = (spellchecks=[]) + spellchecks + [ splValue, splid, splmsg, llGetTime() ];&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		llSleep(10.0); // Something has gone horribly wrong, sleep 10 seconds clear throttle&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		llListen(0,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	listen(integer channel, string name, key id, string message)&lt;br /&gt;
	{&lt;br /&gt;
		if ((!enabled) &amp;amp;&amp;amp; (isMaster == 1))&lt;br /&gt;
		{&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (!tranObjects)&lt;br /&gt;
		{&lt;br /&gt;
			if (llGetAgentSize(id) == ZERO_VECTOR)&lt;br /&gt;
			{&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				if (SpellChecker == 1)&lt;br /&gt;
				{&lt;br /&gt;
					CheckSpell(message, id);&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					llMessageLinked(LINK_THIS,98745920,message,id);&lt;br /&gt;
				}								&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			if (SpellChecker == 1)&lt;br /&gt;
			{&lt;br /&gt;
				CheckSpell(message, id);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				llMessageLinked(LINK_THIS,98745920,message,id);&lt;br /&gt;
			}						&lt;br /&gt;
		}&lt;br /&gt;
		DetectLanguage(message, id);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
	{   // Process Response Code&lt;br /&gt;
		if (~llListFindList(spellchecks, (list)request_id))&lt;br /&gt;
		{&lt;br /&gt;
			integer splliPos = llListFindList(spellchecks, (list)request_id);&lt;br /&gt;
			if(contains(body, &amp;quot;lt&amp;gt;&amp;quot;) != 0)&lt;br /&gt;
			{   // Yahoo Spell Checker correction&lt;br /&gt;
				llMessageLinked(LINK_THIS, 98745920,llGetSubString(body, llSubStringIndex(body, &amp;quot;t&amp;gt;&amp;quot;) + 2, llSubStringIndex(body, &amp;quot;&amp;lt;/&amp;quot;) - 1),llList2Key(spellchecks, splliPos + 1));&lt;br /&gt;
				llOwnerSay(llGetSubString(body, llSubStringIndex(body, &amp;quot;t&amp;gt;&amp;quot;) + 2, llSubStringIndex(body, &amp;quot;&amp;lt;/&amp;quot;) - 1));&lt;br /&gt;
				spellchecks = llDeleteSubList(spellchecks,splliPos, splliPos + 3);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				llMessageLinked(LINK_THIS,98745920,llList2String(spellchecks, splliPos + 2),llList2Key(spellchecks, splliPos + 1));&lt;br /&gt;
				spellchecks = llDeleteSubList(spellchecks,splliPos, splliPos + 3);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if (~llListFindList(tempDetections, (list)request_id))&lt;br /&gt;
		{   // Language Detection&lt;br /&gt;
			integer tmpliPos = llListFindList(tempDetections, (list)request_id);&lt;br /&gt;
			key speakerID = llList2Key(tempDetections, tmpliPos + 1);&lt;br /&gt;
			tempDetections = llDeleteSubList(tempDetections, tmpliPos, tmpliPos + 2);&lt;br /&gt;
			string htttmpStr = llToLower(llGetSubString(body, llSubStringIndex(body, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(body, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
			if (contains(htttmpStr, &amp;quot;err&amp;quot;) == 0 &amp;amp;&amp;amp; contains(htttmpStr, &amp;quot;unn&amp;quot;) == 0)&lt;br /&gt;
			{   // We Trust the Google system, the Google´s guys are good and I am sure they will keep improving :-)&lt;br /&gt;
				// Language Detected&lt;br /&gt;
				llMessageLinked(LINK_THIS,6349160,htttmpStr,speakerID);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	timer()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(0.0);&lt;br /&gt;
		integer r;&lt;br /&gt;
		list newList;&lt;br /&gt;
		for (r = 0; r &amp;lt; llGetListLength(spelchecks); r += 4)&lt;br /&gt;
		{&lt;br /&gt;
			timeElapsed = llGetTime() - llList2Float(spellchecks, r + 3);&lt;br /&gt;
			if (timeElapsed &amp;lt; 10.0)&lt;br /&gt;
			{&lt;br /&gt;
				newList = (newList=[]) + newList + llList2List(spellchecks, r, r + 3);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		spellchecks = newList;&lt;br /&gt;
		newList = [];&lt;br /&gt;
		for (r = 0; r &amp;lt; llGetListLength(tempDetections); r += 3)&lt;br /&gt;
		{&lt;br /&gt;
			timeElapsed = llGetTime() - llList2Float(tempDetections, r + 2);&lt;br /&gt;
			if (timeElapsed &amp;lt; 10.0)&lt;br /&gt;
			{&lt;br /&gt;
				newList = (newList=[]) + newList + llList2List(tempDetections, r, r + 2);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		tempDetections = newList;&lt;br /&gt;
		newList = [];&lt;br /&gt;
		llSetTimerEvent(5.0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Formulator&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//Spell Checker Web Services powered by Yahoo&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
string SEPARATOR = &amp;quot;|%&amp;amp;|&amp;quot;; // for transmitting lists via linked messages&lt;br /&gt;
&lt;br /&gt;
list String2List(string inputstring)&lt;br /&gt;
{	// converts a separated string created with List2String back to a list&lt;br /&gt;
	list output;&lt;br /&gt;
    output = llParseString2List(inputstring, [SEPARATOR], []);   &lt;br /&gt;
    return output;&lt;br /&gt;
}&lt;br /&gt;
string List2String(list input)&lt;br /&gt;
{	// converts a list to a string&lt;br /&gt;
    return llDumpList2String(input, SEPARATOR);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(1.0);&lt;br /&gt;
	}&lt;br /&gt;
	link_message(integer sender_num, integer num, string lstr, key id)&lt;br /&gt;
	{&lt;br /&gt;
		if (num == 7659759)&lt;br /&gt;
		{&lt;br /&gt;
			agentsInTranslation = String2List(lstr);&lt;br /&gt;
		}&lt;br /&gt;
		if (num == 98745920)&lt;br /&gt;
		{&lt;br /&gt;
			integer w;&lt;br /&gt;
			string  spkrLan;&lt;br /&gt;
			string  recepLan;&lt;br /&gt;
			integer recepID;&lt;br /&gt;
			integer lstliPos;&lt;br /&gt;
			string  lanpair;&lt;br /&gt;
			list    translationCache;&lt;br /&gt;
			//===============================&lt;br /&gt;
			// Formulate Translation Requests&lt;br /&gt;
			//===============================&lt;br /&gt;
			for (w = 0; w &amp;lt; llGetListLength(agentsInTranslation); w += 5)&lt;br /&gt;
			{	// Loop through translation group and do appropriate translations as needed&lt;br /&gt;
				recepID = llList2Integer(agentsInTranslation, w + 4);&lt;br /&gt;
				recepLan = llList2String(agentsInTranslation, w + 1);&lt;br /&gt;
				if (spkrLan == recepLan)&lt;br /&gt;
				{ }&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
					if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
					{&lt;br /&gt;
						lstliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
						translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						translationCache = (translationCache=[]) + translationCache + [lanpair, recepID, llGetTime()];&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			if (translationCache != [])&lt;br /&gt;
			{	// Process Requests				&lt;br /&gt;
				for (w = 0; w &amp;lt; llGetListLength(translationCache); w += 2)&lt;br /&gt;
				{   //====================================&lt;br /&gt;
					//Translation&lt;br /&gt;
					//====================================&lt;br /&gt;
					//Forumulate and Send Translation Request&lt;br /&gt;
					lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, w), [&amp;quot;|&amp;quot;],[]), 1);&lt;br /&gt;
					llMessageLinked(LINK_THIS,2346017,List2String( [llEscapeURL(lstr) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), llList2String(translationCache, w + 1), llList2String(translationCache, w)] ),id);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	timer()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(0.0);&lt;br /&gt;
		integer r;&lt;br /&gt;
		for (r = 0; r &amp;lt; llGetListLength(translationCache); r += 3)&lt;br /&gt;
		{&lt;br /&gt;
			timeElapsed = llGetTime() - llList2Float(translationCache, r + 2);&lt;br /&gt;
			if (timeElapsed &amp;lt; 8.0)&lt;br /&gt;
			{&lt;br /&gt;
				newList = (newList=[]) + newList + llList2List(translationCache, r, r + 2);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		translationCache = newList;&lt;br /&gt;
		newList = [];&lt;br /&gt;
		llMessageLinked(LINK_THIS,9876754,&amp;quot;&amp;quot;,NULL_KEY);&lt;br /&gt;
		llSetTimerEvent(5.0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Translator&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//Spell Checker Web Services powered by Yahoo&lt;br /&gt;
integer tranObjects = TRUE;&lt;br /&gt;
integer SpellChecker = TRUE;&lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
key returnValue;&lt;br /&gt;
list requestedTranslations;&lt;br /&gt;
string SEPARATOR = &amp;quot;|%&amp;amp;|&amp;quot;; // for transmitting lists via linked messages&lt;br /&gt;
&lt;br /&gt;
Translate(string chkmsg, list chkli)&lt;br /&gt;
{&lt;br /&gt;
	returnValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&amp;amp;q=&amp;quot; + chkmsg, [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot;&amp;quot;);&lt;br /&gt;
	if (returnValue != NULL_KEY)&lt;br /&gt;
	{    // Translation&lt;br /&gt;
		requestedTranslations = (requestedTranslations=[]) + requestedTranslations + [returnValue, llList2CSV(chkli)];&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		llSleep(25.0); // Something has gone horribly wrong, sleep 25 seconds to clear throttle&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
processHTTPResponse(string bodyStr, list httli)&lt;br /&gt;
{&lt;br /&gt;
	key     recepientID;&lt;br /&gt;
	key     speakerID;&lt;br /&gt;
	list    paramtmpli;&lt;br /&gt;
	list    recepientList;&lt;br /&gt;
	string  recepientLanguage;&lt;br /&gt;
	string  languagePair;&lt;br /&gt;
	string  speakerName;&lt;br /&gt;
	string  speakerLanguage;&lt;br /&gt;
	string  translatedText;&lt;br /&gt;
	string  lantmpStr;&lt;br /&gt;
	integer z;&lt;br /&gt;
	//===================&lt;br /&gt;
	// Process Translation&lt;br /&gt;
	//===================&lt;br /&gt;
	speakerID  = llList2Key(httli, 1);&lt;br /&gt;
	speakerName = llKey2Name(speakerID);&lt;br /&gt;
	if (speakerName == &amp;quot;&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
	}&lt;br /&gt;
	recepientList = llParseString2List(llList2String(httli, 2), [&amp;quot;@&amp;quot;], []);&lt;br /&gt;
	paramtmpli = llParseStringKeepNulls(llList2String(httli, 3), [&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
	recepientLanguage = llList2String(paramtmpli, 1);&lt;br /&gt;
	languagePair = llDumpList2String(paramtmpli, &amp;quot;&amp;gt;&amp;gt;&amp;quot;);&lt;br /&gt;
	// Perform Text Cleanup&lt;br /&gt;
	translatedText = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;detectedSourceLanguage\&amp;quot;:\&amp;quot;&amp;quot;));&lt;br /&gt;
	// Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
	if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
	{&lt;br /&gt;
		lantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
		for(z = llStringLength(translatedText);z &amp;gt;= 0; z--)&lt;br /&gt;
		{&lt;br /&gt;
			lantmpStr = (lantmpStr=&amp;quot;&amp;quot;) + lantmpStr + llGetSubString(translatedText, z, z);&lt;br /&gt;
		}&lt;br /&gt;
		translatedText = lantmpStr;&lt;br /&gt;
	}&lt;br /&gt;
	lantmpStr = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
	for (z = 0; z &amp;lt; llGetListLength(recepientList); z += 1)&lt;br /&gt;
	{&lt;br /&gt;
			llMessageLinked(LINK_THIS,9827491, List2String( [ llList2Integer(recepientList, z), speakerLanguage , lantmpStr ] ),recepientID);&lt;br /&gt;
	}&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string List2String(list input)&lt;br /&gt;
{ // converts list to a string&lt;br /&gt;
    return llDumpList2String(input, SEPARATOR);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list String2List(string inputstring)&lt;br /&gt;
{ // converts a separated string created with List2String back to a list&lt;br /&gt;
	list output;&lt;br /&gt;
    output = llParseString2List(inputstring, [SEPARATOR], []);   &lt;br /&gt;
    return output;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(1.0);&lt;br /&gt;
	}&lt;br /&gt;
	link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
	{&lt;br /&gt;
		if (num == 2346017)&lt;br /&gt;
		{&lt;br /&gt;
			list txli = String2List(lstr);&lt;br /&gt;
			Translate(llList2String(txli,0),[llGetTime(), lid, llList2String(txli,1),llList2Key(txli,2)]);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
	{   // Process Response Code&lt;br /&gt;
		if (~llListFindList(requestedTranslations, (list)request_id))&lt;br /&gt;
		{   // Translation&lt;br /&gt;
			integer httliPos = llListFindList(requestedTranslations, (list)request_id);&lt;br /&gt;
			processHTTPResponse(body, llCSV2List(llList2String(requestedTranslations, httliPos + 1)));&lt;br /&gt;
			requestedTranslations = llDeleteSubList(requestedTranslations, httliPos, httliPos + 1);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	timer()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(0.0);&lt;br /&gt;
		integer r;&lt;br /&gt;
		for (r = 0; r &amp;lt; llGetListLength(requestedTranslations); r += 2)&lt;br /&gt;
		{&lt;br /&gt;
			timeElapsed = llGetTime() - llList2Float(llCSV2List(llList2String(requestedTranslations, r + 1)), 0);&lt;br /&gt;
			if (timeElapsed &amp;lt; 20.0)&lt;br /&gt;
			{&lt;br /&gt;
				newList = (newList=[]) + newList + llList2List(requestedTranslations, r, r + 1);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		requestedTranslations = newList;&lt;br /&gt;
		newList = [];&lt;br /&gt;
		llSetTimerEvent(5.0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=692372</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=692372"/>
		<updated>2009-12-26T01:24:22Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: /* OK */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribución al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente código fué originálmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mí manera...&lt;br /&gt;
No ós riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;OK&#039;&#039; ===&lt;br /&gt;
Bueno, despues de respiñar todo lo que pude, creo que el uso de memoria y la velocidad están prácticamente igual qué en la versión original pero bueno... en la variedad está el gusto no?&lt;br /&gt;
Ya he probado un poco el código, y parece que funciona aunque estoy teniendo algunos problemas... Por ejemplo creo que el sistema de traduccion no funciona corréctamente, y no me refiero al sistema de traduccion de Google (en mi opinion, si no es el mejor, es uno de los mejores del mundo), sino a que aún queda mucho trabajo por hacer en el script...&lt;br /&gt;
&lt;br /&gt;
El siguiente paso sera intentar dividir el script en dos, o si es posible en tres para repartir el uso de memoria. Tambien me gustaria probar un truco que uso a menudo para traducir páginas en un idioma que no entiendo, lo que hago es que en vez de traducir diréctamente al español, primero se traduce a inglés, y luego desde inglés al español. Parece una tontería y un gasto innecesario, pero si lo hago es porque así suelo entender mejor las traducciones.&lt;br /&gt;
Quiero por un lado el sistema de comunicacion y evaluacion entre traductores, y por otro el sistema de traduccion entre avatares, ¿es muy dificil? no sé ya lo veremos...&lt;br /&gt;
&lt;br /&gt;
Well, after saving as much as I could, I think the memory usage and the speed are technically the same as in the original script, but well, in the variety is the taste, isnt it?. &lt;br /&gt;
I have tested a bit the code above already, and it seems to work altought i´m having some problems...&lt;br /&gt;
For instance i think the translation system is not working properly, and i dont mean the Google´s translation system (in my opinion, if is not the best, one of the bests), but that there is still much work to do in the script...&lt;br /&gt;
&lt;br /&gt;
The next step will be to try to divide the script in 2, or 3 if is possible, so we can spread the memory usage. Also I would like to test a trick i use often for to translate languages that i dont understand, what I do first is to translate that language into English, and then from English to Spanish, it seems a nonsense and unnecesary waste, but if i do it is becouse so i usually understand the translations better.&lt;br /&gt;
I want by one part the translators communications and evaluation system, and by other the translation system between avatars, is it very difficult? I don´t know , we will see...&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Es dificil... me está costando pero ya veremos...&lt;br /&gt;
Its difficult... i am struggling but we will see...&lt;br /&gt;
&lt;br /&gt;
chu chu chu&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
De Güatemala a Güatepeor, Sin comentarios...&lt;br /&gt;
&lt;br /&gt;
From Güatebad to Güateworse, No comments...&lt;br /&gt;
&lt;br /&gt;
Buscando en Internet he encontrado este [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html API de Yahoo] comprobador de ortografía, aunque creo que por ahora sólo soporta el lenguage inglés pero sería interesante añadirlo al proyecto&lt;br /&gt;
&lt;br /&gt;
Searching on the web I crossed in my way with this spell checker [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html Yahoo´s API] , I think that it only supports English language by now althought it would be interesting to add it to the project&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Estoy probando el comprobador de deletreo de Yahoo aunque la verdad es que no estoy teniendo buenos resultados, parece que Google es mucho más rapido y necesito corregir antes de traducir. También estoy intentando solucionar el error que aparece con el símbolo (apostrofe) ´ en las frases con genitivo sajon traducidas al inglés y tampoco doy con la tecla... Ya que esto me está dando muchos dolores de cabeza quizás deje el proyecto en standby hasta después de navidades.&lt;br /&gt;
&lt;br /&gt;
I am testing the Yahoo´s spell checker althought to be honest I´m not having good success, it seems Google is much faster and I need to correct before translate. Also I am triying to fix the error showed in the phrases translated to English with the saxons genitive apostrophe ´ and still triying and triying. As this is driving me nuts, maybe I will leave the project in standby until new year.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ESTO ES EL TRADUCTOR &amp;quot;un lío&amp;quot; por ahora... Necesito rehacer algunas cosas&lt;br /&gt;
&lt;br /&gt;
THIS IS THE TRANSLATOR &amp;quot;mess&amp;quot; by now... I need to redo some things&lt;br /&gt;
&#039;&#039;&#039;THE CODE BELOW IS NOT TESTED&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
agentsinTranslation&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//Spell Checker Web Services powered by Yahoo&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
integer isInitialized = FALSE;&lt;br /&gt;
integer listenID;&lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
string SEPARATOR = &amp;quot;|%&amp;amp;|&amp;quot;; // for transmitting lists via linked messages&lt;br /&gt;
integer M = 1;&lt;br /&gt;
&lt;br /&gt;
sendIM(key imid, string imstr)&lt;br /&gt;
{&lt;br /&gt;
	// llInstantMessage(key id , string message) causes the script to sleep for 2 seconds&lt;br /&gt;
	if (llGetAgentSize(imid) == ZERO_VECTOR)&lt;br /&gt;
	{ }&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		if(ShowTranslations)&lt;br /&gt;
		{&lt;br /&gt;
			if (imid != llGetOwner())&lt;br /&gt;
			{&lt;br /&gt;
				llOwnerSay(imstr + &amp;quot; @&amp;quot; + llKey2Name(imid));  // llOwnerSay(string message) has no delay&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if (M == 8)&lt;br /&gt;
		{&lt;br /&gt;
			llMessageLinked(LINK_ALL_CHILDREN,2334420,imstr,imid);&lt;br /&gt;
			M = 1;&lt;br /&gt;
		}&lt;br /&gt;
		else if (M == 7)&lt;br /&gt;
		{&lt;br /&gt;
			llMessageLinked(LINK_ALL_CHILDREN,2334430,imstr,imid);&lt;br /&gt;
			M = 8;&lt;br /&gt;
		}&lt;br /&gt;
		else if (M == 6)&lt;br /&gt;
		{&lt;br /&gt;
			llMessageLinked(LINK_ALL_CHILDREN,2334440,imstr,imid);&lt;br /&gt;
			M = 7;&lt;br /&gt;
		}&lt;br /&gt;
		else if (M == 5)&lt;br /&gt;
		{&lt;br /&gt;
			llMessageLinked(LINK_ALL_CHILDREN,2334450,imstr,imid);&lt;br /&gt;
			M = 6;&lt;br /&gt;
		}&lt;br /&gt;
		else if (M == 4)&lt;br /&gt;
		{&lt;br /&gt;
			llMessageLinked(LINK_ALL_CHILDREN,2334460,imstr,imid);&lt;br /&gt;
			M = 5;&lt;br /&gt;
		}&lt;br /&gt;
		else if (M == 3)&lt;br /&gt;
		{&lt;br /&gt;
			llMessageLinked(LINK_ALL_CHILDREN,2334470,imstr,imid);&lt;br /&gt;
			M = 4;&lt;br /&gt;
		}&lt;br /&gt;
		else if (M == 2)&lt;br /&gt;
		{&lt;br /&gt;
			llMessageLinked(LINK_ALL_CHILDREN,2334480,imstr,imid);&lt;br /&gt;
			M = 3;&lt;br /&gt;
		}&lt;br /&gt;
		else if (M == 1)&lt;br /&gt;
		{&lt;br /&gt;
			llMessageLinked(LINK_ALL_CHILDREN,2334490,imstr,imid);&lt;br /&gt;
			M = 2;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
string checkLanguage(string chklantmpStr)&lt;br /&gt;
{&lt;br /&gt;
	if (chklantmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;en&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	else if (chklantmpStr == &amp;quot;und&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;el&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	else if (chklantmpStr == &amp;quot;Gh&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;en&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	if (llGetSubString(chklantmpStr, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = llGetSubString(chklantmpStr, 0, 1);&lt;br /&gt;
	}&lt;br /&gt;
	return chklantmpStr;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
	integer avliPos;&lt;br /&gt;
	integer idNum;&lt;br /&gt;
	if (~llListFindList(agentsInTranslation, (list)avid))&lt;br /&gt;
	{&lt;br /&gt;
		avliPos = llListFindList(agentsInTranslation, (list)avid);&lt;br /&gt;
		agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, avlan, chklan], avliPos + 1, avliPos + 3);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		@at;&lt;br /&gt;
		idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
		if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
		{&lt;br /&gt;
			jump at;&lt;br /&gt;
		}&lt;br /&gt;
		agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [ avid, avlan, avlan, chklan, idNum ];		// llMessageLinked(LINK_THIS, 64562349, avlan, avid);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string addNewAgent(key newavid)&lt;br /&gt;
{&lt;br /&gt;
	string speakerLan;&lt;br /&gt;
	if (llGetAgentSize(newavid) == ZERO_VECTOR)&lt;br /&gt;
	{&lt;br /&gt;
		speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
		addAgent(newavid, speakerLan, 4);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		speakerLan  = checkLanguage(llGetAgentLanguage(newavid));&lt;br /&gt;
		if (speakerLan == &amp;quot;&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
			addAgent(newavid, speakerLan, 0);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			addAgent(newavid, speakerLan, 0);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return speakerLan;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
	if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
	{&lt;br /&gt;
		integer gkliPos = llListFindList(agentsInTranslation, (list)agentID);&lt;br /&gt;
		return llList2Key(agentsInTranslation, gkliPos - 4);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		return &amp;quot;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string List2String(list input)&lt;br /&gt;
{ // converts list to a string&lt;br /&gt;
    return llDumpList2String(input, SEPARATOR);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list String2List(string inputstring)&lt;br /&gt;
{ // converts a separated string created with List2String back to a list&lt;br /&gt;
	list output;&lt;br /&gt;
    output = llParseString2List(inputstring, [SEPARATOR], []);   &lt;br /&gt;
    return output;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{		&lt;br /&gt;
		llSetTimerEvent(1.0);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
	{&lt;br /&gt;
		integer w;&lt;br /&gt;
		string  spkrLan;&lt;br /&gt;
		string  recepLan;&lt;br /&gt;
		integer recepID;&lt;br /&gt;
		integer lnkliPos;&lt;br /&gt;
		string  lanpair;&lt;br /&gt;
		list    translationCache;&lt;br /&gt;
		if (num == 9876754)&lt;br /&gt;
		{&lt;br /&gt;
			llMessageLinked(LINK_THIS,7659759,List2String(agentsInTranslation),NULL_KEY);&lt;br /&gt;
		}&lt;br /&gt;
		if (num == 9827491)&lt;br /&gt;
		{&lt;br /&gt;
			list txli = String2List(lstr);&lt;br /&gt;
			key recepientID = getAgentKey(llList2Integer(txli,0));&lt;br /&gt;
			string recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, (list)lid) + 1);&lt;br /&gt;
			string speakerLanguage = llList2String(txli,1);&lt;br /&gt;
			string txmessage = llList2String(txli,2);&lt;br /&gt;
			if (recepientID != &amp;quot;&amp;quot;)&lt;br /&gt;
			{&lt;br /&gt;
				if (recepientLanguage == speakerLanguage)&lt;br /&gt;
				{ }&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					sendIM(lid,txmessage);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if (num == 6349160)&lt;br /&gt;
		{&lt;br /&gt;
			key speaker;&lt;br /&gt;
			string spkLan;&lt;br /&gt;
			speaker = lid;&lt;br /&gt;
			spkLan = lstr;&lt;br /&gt;
			if (~llListFindList(agentsInTranslation, (list)speaker))&lt;br /&gt;
			{&lt;br /&gt;
				integer tmpavliPos = llListFindList(agentsInTranslation, (list)speaker);&lt;br /&gt;
				string actlan = llList2String(agentsInTranslation, tmpavliPos + 1);&lt;br /&gt;
				string tmplan = llList2String(agentsInTranslation, tmpavliPos + 2);&lt;br /&gt;
				if (llList2Integer(agentsInTranslation, tmpavliPos + 3) &amp;gt;= 2)&lt;br /&gt;
				{   // if anyone speaks on any different language 3 times in a row&lt;br /&gt;
					addAgent(lid, lstr, 0);&lt;br /&gt;
				}&lt;br /&gt;
				if (actlan == lstr)&lt;br /&gt;
				{   // reset language checker for speaker&lt;br /&gt;
					agentsInTranslation = llListReplaceList(agentsInTranslation, [actlan, 0], tmpavliPos + 2, tmpavliPos + 3);&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					if (lstr == tmplan)&lt;br /&gt;
					{   // if language of speaker is not the same as detected language&lt;br /&gt;
						agentsInTranslation = llListReplaceList(agentsInTranslation,[llList2Integer(agentsInTranslation,tmpavliPos + 3) + 1] , tmpavliPos + 3, tmpavliPos + 3);&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						agentsInTranslation = llListReplaceList(agentsInTranslation,[lstr, 0] , tmpavliPos + 2, tmpavliPos + 3);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}			&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	sensor(integer num_detected)&lt;br /&gt;
	{&lt;br /&gt;
		integer s;&lt;br /&gt;
		key sid;&lt;br /&gt;
		for (s = 0; s &amp;lt; num_detected; s += 1)&lt;br /&gt;
		{&lt;br /&gt;
			sid = llDetectedKey(s);&lt;br /&gt;
			if (~llListFindList(agentsInTranslation, (list)sid))&lt;br /&gt;
			{ }&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				addNewAgent(sid);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	no_sensor()&lt;br /&gt;
	{ }&lt;br /&gt;
&lt;br /&gt;
	listen(integer channel, string name, key id, string message)&lt;br /&gt;
	{		&lt;br /&gt;
		if(~llListFindList(agentsInTranslation, (list)id))&lt;br /&gt;
		{ }&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			addNewAgent(id);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	timer()&lt;br /&gt;
	{&lt;br /&gt;
		integer r;&lt;br /&gt;
		vector  tmrVct;&lt;br /&gt;
		list  newList;&lt;br /&gt;
		llSetTimerEvent(0.0);   // we better reset timer by way of precaution&lt;br /&gt;
		if (isInitialized == FALSE)&lt;br /&gt;
		{&lt;br /&gt;
			enabled = TRUE;&lt;br /&gt;
			listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
			llMessageLinked(LINK_THIS, 6877259, (string)enabled, NULL_KEY);&lt;br /&gt;
			isInitialized = TRUE;&lt;br /&gt;
			string mylanguage = llGetAgentLanguage(llGetOwner());&lt;br /&gt;
			if (llStringLength(mylanguage) &amp;lt; 1)&lt;br /&gt;
			{&lt;br /&gt;
				mylanguage = &amp;quot;en&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			if(~llListFindList(agentsInTranslation, (list)llGetOwner()))&lt;br /&gt;
			{&lt;br /&gt;
				integer ownerliPos = llListFindList(agentsInTranslation, (list)llGetOwner());&lt;br /&gt;
				agentsInTranslation = llListReplaceList(agentsInTranslation, [mylanguage] , ownerliPos + 1, ownerliPos + 1);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [llGetOwner() , mylanguage, mylanguage , 0 , llRound(llFrand(2000000)) + 1];&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if (isMaster &amp;gt; 0)&lt;br /&gt;
		{&lt;br /&gt;
			for (r = 0; r &amp;lt; llGetListLength(agentsInTranslation); r += 5)&lt;br /&gt;
			{&lt;br /&gt;
				tmrVct = llList2Vector(llGetObjectDetails(llList2Key(agentsInTranslation, r), [OBJECT_POS]), 0);&lt;br /&gt;
				if (llVecDist(llGetPos(), tmrVct) &amp;lt;= 20.0)&lt;br /&gt;
				{&lt;br /&gt;
					newList = (newList=[]) + newList + llList2List(agentsInTranslation, r, r + 4);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			agentsInTranslation = newList;&lt;br /&gt;
			newList = [];&lt;br /&gt;
		}&lt;br /&gt;
		if ((autoLanguage) &amp;amp;&amp;amp; isMaster &amp;gt; 0)&lt;br /&gt;
		{&lt;br /&gt;
			llSensor(&amp;quot;&amp;quot;, NULL_KEY, AGENT, 20.0, PI);&lt;br /&gt;
		}&lt;br /&gt;
		llSetTimerEvent(4.0);   // restart timer&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
CheckSpell-DetectLanguage&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//Spell Checker Web Services powered by Yahoo&lt;br /&gt;
key splValue;&lt;br /&gt;
key dtcValue;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer enabled = TRUE;&lt;br /&gt;
integer showTranslation = TRUE;&lt;br /&gt;
integer tranObjects = TRUE;&lt;br /&gt;
integer SpellChecker = 1;&lt;br /&gt;
list tempDetections;&lt;br /&gt;
list spellchecks;&lt;br /&gt;
&lt;br /&gt;
integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex&lt;br /&gt;
{&lt;br /&gt;
	return ~llSubStringIndex(haystack, needle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
DetectLanguage(string dtcmsg, key dtcid)&lt;br /&gt;
{&lt;br /&gt;
	llSleep(0.2);&lt;br /&gt;
	dtcValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&amp;amp;q=&amp;quot; + llEscapeURL(dtcmsg), [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot; &amp;quot;);&lt;br /&gt;
	if (dtcValue != NULL_KEY)&lt;br /&gt;
	{&lt;br /&gt;
		tempDetections = (tempDetections=[]) + tempDetections + [ dtcValue, dtcid, llGetTime() ];&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		llSleep(10.0); // Something has gone horribly wrong, sleep 10 seconds clear throttle&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
CheckSpell(string splmsg, key splid)&lt;br /&gt;
{&lt;br /&gt;
	splValue = llHTTPRequest(&amp;quot;http://search.yahooapis.com/WebSearchService/V1/spellingSuggestion?appid=DNPjiabV34EOgXQ3kAu6.d7kf6v.JUGCn1bFUcSTFMSGCyCy_ALzbepYstlI7DrOGP0-&amp;amp;query=&amp;quot; + llEscapeURL(splmsg), [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot;&amp;quot;);&lt;br /&gt;
	if (splValue != NULL_KEY)&lt;br /&gt;
	{    // Translation&lt;br /&gt;
		spellchecks = (spellchecks=[]) + spellchecks + [ splValue, splid, splmsg, llGetTime() ];&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		llSleep(10.0); // Something has gone horribly wrong, sleep 10 seconds clear throttle&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		llListen(0,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	listen(integer channel, string name, key id, string message)&lt;br /&gt;
	{&lt;br /&gt;
		if ((!enabled) &amp;amp;&amp;amp; (isMaster == 1))&lt;br /&gt;
		{&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (!tranObjects)&lt;br /&gt;
		{&lt;br /&gt;
			if (llGetAgentSize(id) == ZERO_VECTOR)&lt;br /&gt;
			{&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				if (SpellChecker == 1)&lt;br /&gt;
				{&lt;br /&gt;
					CheckSpell(message, id);&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					llMessageLinked(LINK_THIS,98745920,message,id);&lt;br /&gt;
				}								&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			if (SpellChecker == 1)&lt;br /&gt;
			{&lt;br /&gt;
				CheckSpell(message, id);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				llMessageLinked(LINK_THIS,98745920,message,id);&lt;br /&gt;
			}						&lt;br /&gt;
		}&lt;br /&gt;
		DetectLanguage(message, id);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
	{   // Process Response Code&lt;br /&gt;
		if (~llListFindList(spellchecks, (list)request_id))&lt;br /&gt;
		{&lt;br /&gt;
			integer splliPos = llListFindList(spellchecks, (list)request_id);&lt;br /&gt;
			if(contains(body, &amp;quot;lt&amp;gt;&amp;quot;) != 0)&lt;br /&gt;
			{   // Yahoo Spell Checker correction&lt;br /&gt;
				llMessageLinked(LINK_THIS, 98745920,llGetSubString(body, llSubStringIndex(body, &amp;quot;t&amp;gt;&amp;quot;) + 2, llSubStringIndex(body, &amp;quot;&amp;lt;/&amp;quot;) - 1),llList2Key(spellchecks, splliPos + 1));&lt;br /&gt;
				llOwnerSay(llGetSubString(body, llSubStringIndex(body, &amp;quot;t&amp;gt;&amp;quot;) + 2, llSubStringIndex(body, &amp;quot;&amp;lt;/&amp;quot;) - 1));&lt;br /&gt;
				spellchecks = llDeleteSubList(spellchecks,splliPos, splliPos + 3);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				llMessageLinked(LINK_THIS,98745920,llList2String(spellchecks, splliPos + 2),llList2Key(spellchecks, splliPos + 1));&lt;br /&gt;
				spellchecks = llDeleteSubList(spellchecks,splliPos, splliPos + 3);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if (~llListFindList(tempDetections, (list)request_id))&lt;br /&gt;
		{   // Language Detection&lt;br /&gt;
			integer tmpliPos = llListFindList(tempDetections, (list)request_id);&lt;br /&gt;
			key speakerID = llList2Key(tempDetections, tmpliPos + 1);&lt;br /&gt;
			tempDetections = llDeleteSubList(tempDetections, tmpliPos, tmpliPos + 2);&lt;br /&gt;
			string htttmpStr = llToLower(llGetSubString(body, llSubStringIndex(body, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(body, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
			if (contains(htttmpStr, &amp;quot;err&amp;quot;) == 0 &amp;amp;&amp;amp; contains(htttmpStr, &amp;quot;unn&amp;quot;) == 0)&lt;br /&gt;
			{   // We Trust the Google system, the Google´s guys are good and I am sure they will keep improving :-)&lt;br /&gt;
				// Language Detected&lt;br /&gt;
				llMessageLinked(LINK_THIS,6349160,htttmpStr,speakerID);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	timer()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(0.0);&lt;br /&gt;
		integer r;&lt;br /&gt;
		list newList;&lt;br /&gt;
		for (r = 0; r &amp;lt; llGetListLength(spelchecks); r += 4)&lt;br /&gt;
		{&lt;br /&gt;
			timeElapsed = llGetTime() - llList2Float(spellchecks, r + 3);&lt;br /&gt;
			if (timeElapsed &amp;lt; 10.0)&lt;br /&gt;
			{&lt;br /&gt;
				newList = (newList=[]) + newList + llList2List(spellchecks, r, r + 3);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		spellchecks = newList;&lt;br /&gt;
		newList = [];&lt;br /&gt;
		for (r = 0; r &amp;lt; llGetListLength(tempDetections); r += 3)&lt;br /&gt;
		{&lt;br /&gt;
			timeElapsed = llGetTime() - llList2Float(tempDetections, r + 2);&lt;br /&gt;
			if (timeElapsed &amp;lt; 10.0)&lt;br /&gt;
			{&lt;br /&gt;
				newList = (newList=[]) + newList + llList2List(tempDetections, r, r + 2);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		tempDetections = newList;&lt;br /&gt;
		newList = [];&lt;br /&gt;
		llSetTimerEvent(5.0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Formulator&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//Spell Checker Web Services powered by Yahoo&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
string SEPARATOR = &amp;quot;|%&amp;amp;|&amp;quot;; // for transmitting lists via linked messages&lt;br /&gt;
&lt;br /&gt;
list String2List(string inputstring)&lt;br /&gt;
{	// converts a separated string created with List2String back to a list&lt;br /&gt;
	list output;&lt;br /&gt;
    output = llParseString2List(inputstring, [SEPARATOR], []);   &lt;br /&gt;
    return output;&lt;br /&gt;
}&lt;br /&gt;
string List2String(list input)&lt;br /&gt;
{	// converts a list to a string&lt;br /&gt;
    return llDumpList2String(input, SEPARATOR);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(1.0);&lt;br /&gt;
	}&lt;br /&gt;
	link_message(integer sender_num, integer num, string lstr, key id)&lt;br /&gt;
	{&lt;br /&gt;
		if (num == 7659759)&lt;br /&gt;
		{&lt;br /&gt;
			agentsInTranslation = String2List(lstr);&lt;br /&gt;
		}&lt;br /&gt;
		if (num == 98745920)&lt;br /&gt;
		{&lt;br /&gt;
			integer w;&lt;br /&gt;
			string  spkrLan;&lt;br /&gt;
			string  recepLan;&lt;br /&gt;
			integer recepID;&lt;br /&gt;
			integer lstliPos;&lt;br /&gt;
			string  lanpair;&lt;br /&gt;
			list    translationCache;&lt;br /&gt;
			//===============================&lt;br /&gt;
			// Formulate Translation Requests&lt;br /&gt;
			//===============================&lt;br /&gt;
			for (w = 0; w &amp;lt; llGetListLength(agentsInTranslation); w += 5)&lt;br /&gt;
			{	// Loop through translation group and do appropriate translations as needed&lt;br /&gt;
				recepID = llList2Integer(agentsInTranslation, w + 4);&lt;br /&gt;
				recepLan = llList2String(agentsInTranslation, w + 1);&lt;br /&gt;
				if (spkrLan == recepLan)&lt;br /&gt;
				{ }&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
					if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
					{&lt;br /&gt;
						lstliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
						translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						translationCache = (translationCache=[]) + translationCache + [lanpair, recepID, llGetTime()];&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			if (translationCache != [])&lt;br /&gt;
			{	// Process Requests				&lt;br /&gt;
				for (w = 0; w &amp;lt; llGetListLength(translationCache); w += 2)&lt;br /&gt;
				{   //====================================&lt;br /&gt;
					//Translation&lt;br /&gt;
					//====================================&lt;br /&gt;
					//Forumulate and Send Translation Request&lt;br /&gt;
					lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, w), [&amp;quot;|&amp;quot;],[]), 1);&lt;br /&gt;
					llMessageLinked(LINK_THIS,2346017,List2String( [llEscapeURL(lstr) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), llList2String(translationCache, w + 1), llList2String(translationCache, w)] ),id);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	timer()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(0.0);&lt;br /&gt;
		integer r;&lt;br /&gt;
		for (r = 0; r &amp;lt; llGetListLength(translationCache); r += 3)&lt;br /&gt;
		{&lt;br /&gt;
			timeElapsed = llGetTime() - llList2Float(translationCache, r + 2);&lt;br /&gt;
			if (timeElapsed &amp;lt; 8.0)&lt;br /&gt;
			{&lt;br /&gt;
				newList = (newList=[]) + newList + llList2List(translationCache, r, r + 2);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		translationCache = newList;&lt;br /&gt;
		newList = [];&lt;br /&gt;
		llMessageLinked(LINK_THIS,9876754,&amp;quot;&amp;quot;,NULL_KEY);&lt;br /&gt;
		llSetTimerEvent(5.0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Translator&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//(Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//Spell Checker Web Services powered by Yahoo&lt;br /&gt;
integer tranObjects = TRUE;&lt;br /&gt;
integer SpellChecker = TRUE;&lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
key returnValue;&lt;br /&gt;
list requestedTranslations;&lt;br /&gt;
string SEPARATOR = &amp;quot;|%&amp;amp;|&amp;quot;; // for transmitting lists via linked messages&lt;br /&gt;
&lt;br /&gt;
Translate(string chkmsg, list chkli)&lt;br /&gt;
{&lt;br /&gt;
	returnValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&amp;amp;q=&amp;quot; + chkmsg, [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot;&amp;quot;);&lt;br /&gt;
	if (returnValue != NULL_KEY)&lt;br /&gt;
	{    // Translation&lt;br /&gt;
		requestedTranslations = (requestedTranslations=[]) + requestedTranslations + [returnValue, llList2CSV(chkli)];&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		llSleep(25.0); // Something has gone horribly wrong, sleep 25 seconds to clear throttle&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
processHTTPResponse(string bodyStr, list httli)&lt;br /&gt;
{&lt;br /&gt;
	key     recepientID;&lt;br /&gt;
	key     speakerID;&lt;br /&gt;
	list    paramtmpli;&lt;br /&gt;
	list    recepientList;&lt;br /&gt;
	string  recepientLanguage;&lt;br /&gt;
	string  languagePair;&lt;br /&gt;
	string  speakerName;&lt;br /&gt;
	string  speakerLanguage;&lt;br /&gt;
	string  translatedText;&lt;br /&gt;
	string  lantmpStr;&lt;br /&gt;
	integer z;&lt;br /&gt;
	//===================&lt;br /&gt;
	// Process Translation&lt;br /&gt;
	//===================&lt;br /&gt;
	speakerID  = llList2Key(httli, 1);&lt;br /&gt;
	speakerName = llKey2Name(speakerID);&lt;br /&gt;
	if (speakerName == &amp;quot;&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
	}&lt;br /&gt;
	recepientList = llParseString2List(llList2String(httli, 2), [&amp;quot;@&amp;quot;], []);&lt;br /&gt;
	paramtmpli = llParseStringKeepNulls(llList2String(httli, 3), [&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
	recepientLanguage = llList2String(paramtmpli, 1);&lt;br /&gt;
	languagePair = llDumpList2String(paramtmpli, &amp;quot;&amp;gt;&amp;gt;&amp;quot;);&lt;br /&gt;
	// Perform Text Cleanup&lt;br /&gt;
	translatedText = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;detectedSourceLanguage\&amp;quot;:\&amp;quot;&amp;quot;));&lt;br /&gt;
	// Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
	if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
	{&lt;br /&gt;
		lantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
		for(z = llStringLength(translatedText);z &amp;gt;= 0; z--)&lt;br /&gt;
		{&lt;br /&gt;
			lantmpStr = (lantmpStr=&amp;quot;&amp;quot;) + lantmpStr + llGetSubString(translatedText, z, z);&lt;br /&gt;
		}&lt;br /&gt;
		translatedText = lantmpStr;&lt;br /&gt;
	}&lt;br /&gt;
	lantmpStr = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
	for (z = 0; z &amp;lt; llGetListLength(recepientList); z += 1)&lt;br /&gt;
	{&lt;br /&gt;
			llMessageLinked(LINK_THIS,9827491, List2String( [ llList2Integer(recepientList, z), speakerLanguage , lantmpStr ] ),recepientID);&lt;br /&gt;
	}&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string List2String(list input)&lt;br /&gt;
{ // converts list to a string&lt;br /&gt;
    return llDumpList2String(input, SEPARATOR);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list String2List(string inputstring)&lt;br /&gt;
{ // converts a separated string created with List2String back to a list&lt;br /&gt;
	list output;&lt;br /&gt;
    output = llParseString2List(inputstring, [SEPARATOR], []);   &lt;br /&gt;
    return output;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(1.0);&lt;br /&gt;
	}&lt;br /&gt;
	link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
	{&lt;br /&gt;
		if (num == 2346017)&lt;br /&gt;
		{&lt;br /&gt;
			list txli = String2List(lstr);&lt;br /&gt;
			Translate(llList2String(txli,0),[llGetTime(), lid, llList2String(txli,1),llList2Key(txli,2)]);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
	{   // Process Response Code&lt;br /&gt;
		if (~llListFindList(requestedTranslations, (list)request_id))&lt;br /&gt;
		{   // Translation&lt;br /&gt;
			integer httliPos = llListFindList(requestedTranslations, (list)request_id);&lt;br /&gt;
			processHTTPResponse(body, llCSV2List(llList2String(requestedTranslations, httliPos + 1)));&lt;br /&gt;
			requestedTranslations = llDeleteSubList(requestedTranslations, httliPos, httliPos + 1);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	timer()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(0.0);&lt;br /&gt;
		integer r;&lt;br /&gt;
		for (r = 0; r &amp;lt; llGetListLength(requestedTranslations); r += 2)&lt;br /&gt;
		{&lt;br /&gt;
			timeElapsed = llGetTime() - llList2Float(llCSV2List(llList2String(requestedTranslations, r + 1)), 0);&lt;br /&gt;
			if (timeElapsed &amp;lt; 20.0)&lt;br /&gt;
			{&lt;br /&gt;
				newList = (newList=[]) + newList + llList2List(requestedTranslations, r, r + 1);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		requestedTranslations = newList;&lt;br /&gt;
		newList = [];&lt;br /&gt;
		llSetTimerEvent(5.0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=691942</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=691942"/>
		<updated>2009-12-25T04:04:29Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: /* OK */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribución al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente código fué originálmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mí manera...&lt;br /&gt;
No ós riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;OK&#039;&#039; ===&lt;br /&gt;
Bueno, despues de respiñar todo lo que pude, creo que el uso de memoria y la velocidad están prácticamente igual qué en la versión original pero bueno... en la variedad está el gusto no?&lt;br /&gt;
Ya he probado un poco el código, y parece que funciona aunque estoy teniendo algunos problemas... Por ejemplo creo que el sistema de traduccion no funciona corréctamente, y no me refiero al sistema de traduccion de Google (en mi opinion, si no es el mejor, es uno de los mejores del mundo), sino a que aún queda mucho trabajo por hacer en el script...&lt;br /&gt;
&lt;br /&gt;
El siguiente paso sera intentar dividir el script en dos, o si es posible en tres para repartir el uso de memoria. Tambien me gustaria probar un truco que uso a menudo para traducir páginas en un idioma que no entiendo, lo que hago es que en vez de traducir diréctamente al español, primero se traduce a inglés, y luego desde inglés al español. Parece una tontería y un gasto innecesario, pero si lo hago es porque así suelo entender mejor las traducciones.&lt;br /&gt;
Quiero por un lado el sistema de comunicacion y evaluacion entre traductores, y por otro el sistema de traduccion entre avatares, ¿es muy dificil? no sé ya lo veremos...&lt;br /&gt;
&lt;br /&gt;
Well, after saving as much as I could, I think the memory usage and the speed are technically the same as in the original script, but well, in the variety is the taste, isnt it?. &lt;br /&gt;
I have tested a bit the code above already, and it seems to work altought i´m having some problems...&lt;br /&gt;
For instance i think the translation system is not working properly, and i dont mean the Google´s translation system (in my opinion, if is not the best, one of the bests), but that there is still much work to do in the script...&lt;br /&gt;
&lt;br /&gt;
The next step will be to try to divide the script in 2, or 3 if is possible, so we can spread the memory usage. Also I would like to test a trick i use often for to translate languages that i dont understand, what I do first is to translate that language into English, and then from English to Spanish, it seems a nonsense and unnecesary waste, but if i do it is becouse so i usually understand the translations better.&lt;br /&gt;
I want by one part the translators communications and evaluation system, and by other the translation system between avatars, is it very difficult? I don´t know , we will see...&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Es dificil... me está costando pero ya veremos...&lt;br /&gt;
Its difficult... i am struggling but we will see...&lt;br /&gt;
&lt;br /&gt;
chu chu chu&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
De Güatemala a Güatepeor, Sin comentarios...&lt;br /&gt;
&lt;br /&gt;
From Güatebad to Güateworse, No comments...&lt;br /&gt;
&lt;br /&gt;
Buscando en Internet he encontrado este [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html API de Yahoo] comprobador de ortografía, aunque creo que por ahora sólo soporta el lenguage inglés pero sería interesante añadirlo al proyecto&lt;br /&gt;
&lt;br /&gt;
Searching on the web I crossed in my way with this spell checker [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html Yahoo´s API] , I think that it only supports English language by now althought it would be interesting to add it to the project&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Estoy probando el comprobador de deletreo de Yahoo aunque la verdad es que no estoy teniendo buenos resultados, parece que Google es mucho más rapido y necesito corregir antes de traducir. También estoy intentando solucionar el error que aparece con el símbolo (apostrofe) ´ en las frases con genitivo sajon traducidas al inglés y tampoco doy con la tecla... Ya que esto me está dando muchos dolores de cabeza quizás deje el proyecto en standby hasta después de navidades.&lt;br /&gt;
&lt;br /&gt;
I am testing the Yahoo´s spell checker althought to be honest I´m not having good success, it seems Google is much faster and I need to correct before translate. Also I am triying to fix the error showed in the phrases translated to English with the saxons genitive apostrophe ´ and still triying and triying. As this is driving me nuts, maybe I will leave the project in standby until new year.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ESTO ES EL TRADUCTOR &amp;quot;un lío&amp;quot; por ahora... Necesito rehacer algunas cosas&lt;br /&gt;
&lt;br /&gt;
THIS IS THE TRANSLATOR &amp;quot;mess&amp;quot; by now... I need to redo some things&lt;br /&gt;
&#039;&#039;&#039;THE CODE BELOW IS NOT TESTED&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
agentsinTranslation&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Personal Translator (Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//Spell Checker Web Services powered by Yahoo&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
integer isInitialized = FALSE;&lt;br /&gt;
integer listenID;&lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
string SEPARATOR = &amp;quot;|%&amp;amp;|&amp;quot;; // for transmitting lists via linked messages&lt;br /&gt;
integer M = 1;&lt;br /&gt;
&lt;br /&gt;
sendIM(key imid, string imstr)&lt;br /&gt;
{&lt;br /&gt;
	// llInstantMessage(key id , string message) causes the script to sleep for 2 seconds&lt;br /&gt;
	if (llGetAgentSize(imid) == ZERO_VECTOR)&lt;br /&gt;
	{ }&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		if (imid != llGetOwner())&lt;br /&gt;
		{&lt;br /&gt;
			llOwnerSay(imstr + &amp;quot; @&amp;quot; + llKey2Name(imid));  // llOwnerSay(string message) has no delay&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if (M == 8)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334420, imstr, imid);&lt;br /&gt;
		M = 1;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 7)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334430, imstr, imid);&lt;br /&gt;
		M = 8;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 6)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334440, imstr, imid);&lt;br /&gt;
		M = 7;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 5)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334450, imstr, imid);&lt;br /&gt;
		M = 6;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 4)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334460, imstr, imid);&lt;br /&gt;
		M = 5;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 3)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334470, imstr, imid);&lt;br /&gt;
		M = 4;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 2)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334480, imstr, imid);&lt;br /&gt;
		M = 3;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 1)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334490, imstr, imid);&lt;br /&gt;
		M = 2;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
string checkLanguage(string chklantmpStr)&lt;br /&gt;
{&lt;br /&gt;
	if (chklantmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;en&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	else if (chklantmpStr == &amp;quot;und&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;el&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	else if (chklantmpStr == &amp;quot;Gh&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;en&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	if (llGetSubString(chklantmpStr, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = llGetSubString(chklantmpStr, 0, 1);&lt;br /&gt;
	}&lt;br /&gt;
	return chklantmpStr;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
	integer avliPos;&lt;br /&gt;
	integer idNum;&lt;br /&gt;
	if (~llListFindList(agentsInTranslation, (list)avid))&lt;br /&gt;
	{&lt;br /&gt;
		avliPos = llListFindList(agentsInTranslation, (list)avid);&lt;br /&gt;
		agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, avlan, chklan], avliPos + 1, avliPos + 3);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		@at;&lt;br /&gt;
		idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
		if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
		{&lt;br /&gt;
			jump at;&lt;br /&gt;
		}&lt;br /&gt;
		agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, avlan, chklan, idNum];		// llMessageLinked(LINK_THIS, 64562349, avlan, avid);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string addNewAgent(key newavid)&lt;br /&gt;
{&lt;br /&gt;
	string speakerLan;&lt;br /&gt;
	if (llGetAgentSize(newavid) == ZERO_VECTOR)&lt;br /&gt;
	{&lt;br /&gt;
		speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
		addAgent(newavid, speakerLan, 4);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		speakerLan  = checkLanguage(llGetAgentLanguage(newavid));&lt;br /&gt;
		if (speakerLan == &amp;quot;&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
			addAgent(newavid, speakerLan, 0);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			addAgent(newavid, speakerLan, 0);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return speakerLan;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
	if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
	{&lt;br /&gt;
		integer gkliPos = llListFindList(agentsInTranslation, (list)agentID);&lt;br /&gt;
		return llList2Key(agentsInTranslation, gkliPos - 4);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		return &amp;quot;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string List2String(list input)&lt;br /&gt;
{ // converts list to a string&lt;br /&gt;
    return llDumpList2String(input, SEPARATOR);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list String2List(string inputstring)&lt;br /&gt;
{ // converts a separated string created with List2String back to a list&lt;br /&gt;
	list output;&lt;br /&gt;
    output = llParseString2List(inputstring, [SEPARATOR], []);   &lt;br /&gt;
    return output;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		&lt;br /&gt;
		llSetTimerEvent(1.0);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
	{&lt;br /&gt;
		integer w;&lt;br /&gt;
		string  spkrLan;&lt;br /&gt;
		string  recepLan;&lt;br /&gt;
		integer recepID;&lt;br /&gt;
		integer lnkliPos;&lt;br /&gt;
		string  lanpair;&lt;br /&gt;
		list    translationCache;&lt;br /&gt;
		if (num == 6745676)&lt;br /&gt;
		{&lt;br /&gt;
			&lt;br /&gt;
		}&lt;br /&gt;
		if (num == 9827491)&lt;br /&gt;
		{&lt;br /&gt;
			list txli = String2List(lstr);&lt;br /&gt;
			key recepientID = getAgentKey(llList2Integer(txli,0));&lt;br /&gt;
			string recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, (list)lid) + 1);&lt;br /&gt;
			string speakerLanguage = llList2String(txli,1);&lt;br /&gt;
			string txmessage = llList2String(txli,2);&lt;br /&gt;
			if (recepientID != &amp;quot;&amp;quot;)&lt;br /&gt;
			{&lt;br /&gt;
				if (recepientLanguage == speakerLanguage)&lt;br /&gt;
				{ }&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					sendIM(lid,txmessage);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if (num == 6349160)&lt;br /&gt;
		{&lt;br /&gt;
			key speaker = lid;&lt;br /&gt;
			string spkLan = lstr;&lt;br /&gt;
			if (~llListFindList(agentsInTranslation, (list)speaker))&lt;br /&gt;
			{&lt;br /&gt;
				integer tmpavliPos = llListFindList(agentsInTranslation, (list)speaker);&lt;br /&gt;
				string actlan = llList2String(agentsInTranslation, tmpavliPos + 1);&lt;br /&gt;
				string tmplan = llList2String(agentsInTranslation, tmpavliPos + 2);&lt;br /&gt;
				if (llList2Integer(agentsInTranslation, tmpavliPos + 3) &amp;gt;= 2)&lt;br /&gt;
				{   // if anyone speaks on any different language 3 times in a row&lt;br /&gt;
					addAgent(lid, lstr, 0);&lt;br /&gt;
				}&lt;br /&gt;
				if (actlan == lstr)&lt;br /&gt;
				{   // reset language checker for speaker&lt;br /&gt;
					agentsInTranslation = llListReplaceList(agentsInTranslation, [actlan, 0], tmpavliPos + 2, tmpavliPos + 3);&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					if (lstr == tmplan)&lt;br /&gt;
					{   // if language of speaker is not the same as detected language&lt;br /&gt;
						agentsInTranslation = llListReplaceList(agentsInTranslation,[llList2Integer(agentsInTranslation,tmpavliPos + 3) + 1] , tmpavliPos + 3, tmpavliPos + 3);&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						agentsInTranslation = llListReplaceList(agentsInTranslation,[lstr, 0] , tmpavliPos + 2, tmpavliPos + 3);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			&lt;br /&gt;
		}&lt;br /&gt;
		if (num == 922)&lt;br /&gt;
		{&lt;br /&gt;
			for (w = 0; w &amp;lt; llGetListLength(agentsInTranslation); w += 5)&lt;br /&gt;
			{   // Loop through translation group and do appropriate translations as needed&lt;br /&gt;
				recepID = llList2Integer(agentsInTranslation, w + 4);&lt;br /&gt;
				recepLan =  checkLanguage(llList2String(agentsInTranslation, w + 1));&lt;br /&gt;
				if (spkrLan == recepLan)&lt;br /&gt;
				{ }&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
					if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
					{&lt;br /&gt;
						lnkliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
						translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lnkliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lnkliPos + 1, lnkliPos + 1);&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	sensor(integer num_detected)&lt;br /&gt;
	{&lt;br /&gt;
		integer s;&lt;br /&gt;
		key sid;&lt;br /&gt;
		for (s = 0; s &amp;lt; num_detected; s += 1)&lt;br /&gt;
		{&lt;br /&gt;
			sid = llDetectedKey(s);&lt;br /&gt;
			if (~llListFindList(agentsInTranslation, (list)sid))&lt;br /&gt;
			{ }&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				addNewAgent(sid);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	no_sensor()&lt;br /&gt;
	{ }&lt;br /&gt;
&lt;br /&gt;
	listen(integer channel, string name, key id, string message)&lt;br /&gt;
	{		&lt;br /&gt;
		if(~llListFindList(agentsInTranslation, (list)id))&lt;br /&gt;
		{ }&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			addNewAgent(id);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	timer()&lt;br /&gt;
	{&lt;br /&gt;
		integer r;&lt;br /&gt;
		vector  tmrVct;&lt;br /&gt;
		list  newList;&lt;br /&gt;
		llSetTimerEvent(0.0);   // we better reset timer by way of precaution&lt;br /&gt;
		if (isInitialized == FALSE)&lt;br /&gt;
		{&lt;br /&gt;
			enabled = TRUE;&lt;br /&gt;
			listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
			llMessageLinked(LINK_THIS, 6877259, (string)enabled, NULL_KEY);&lt;br /&gt;
			isInitialized = TRUE;&lt;br /&gt;
			string mylanguage = llGetAgentLanguage(llGetOwner());&lt;br /&gt;
			if (llStringLength(mylanguage) &amp;lt; 1)&lt;br /&gt;
			{&lt;br /&gt;
				mylanguage = &amp;quot;en&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			if(~llListFindList(agentsInTranslation, (list)llGetOwner()))&lt;br /&gt;
			{&lt;br /&gt;
				integer ownerliPos = llListFindList(agentsInTranslation, (list)llGetOwner());&lt;br /&gt;
				agentsInTranslation = llListReplaceList(agentsInTranslation, [mylanguage] , ownerliPos + 1, ownerliPos + 1);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [llGetOwner() , mylanguage, mylanguage , 0 , llRound(llFrand(2000000)) + 1];&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if (isMaster &amp;gt; 0)&lt;br /&gt;
		{&lt;br /&gt;
			for (r = 0; r &amp;lt; llGetListLength(agentsInTranslation); r += 5)&lt;br /&gt;
			{&lt;br /&gt;
				tmrVct = llList2Vector(llGetObjectDetails(llList2Key(agentsInTranslation, r), [OBJECT_POS]), 0);&lt;br /&gt;
				if (llVecDist(llGetPos(), tmrVct) &amp;lt;= 20.0)&lt;br /&gt;
				{&lt;br /&gt;
					newList = (newList=[]) + newList + llList2List(agentsInTranslation, r, r + 4);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			agentsInTranslation = newList;&lt;br /&gt;
			newList = [];&lt;br /&gt;
		}&lt;br /&gt;
		if ((autoLanguage) &amp;amp;&amp;amp; isMaster &amp;gt; 0)&lt;br /&gt;
		{&lt;br /&gt;
			llSensor(&amp;quot;&amp;quot;, NULL_KEY, AGENT, 20.0, PI);&lt;br /&gt;
		}&lt;br /&gt;
		llMessageLinked(LINK_THIS,7659759,List2String(agentsInTranslation),NULL_KEY);&lt;br /&gt;
		llSetTimerEvent(4.0);   // restart timer&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
CheckSpell-DetectLanguage&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Personal Translator (Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//Spell Checker Web Services powered by Yahoo&lt;br /&gt;
key splValue;&lt;br /&gt;
key dtcValue;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer enabled = TRUE;&lt;br /&gt;
integer showTranslation = TRUE;&lt;br /&gt;
integer tranObjects = TRUE;&lt;br /&gt;
integer SpellChecker = 1;&lt;br /&gt;
list tempDetections;&lt;br /&gt;
list spellchecks;&lt;br /&gt;
&lt;br /&gt;
integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex&lt;br /&gt;
{&lt;br /&gt;
	return ~llSubStringIndex(haystack, needle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
DetectLanguage(string dtcmsg, key dtcid)&lt;br /&gt;
{&lt;br /&gt;
	dtcValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&amp;amp;q=&amp;quot; + llEscapeURL(dtcmsg), [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot; &amp;quot;);&lt;br /&gt;
	llSleep(0.1);&lt;br /&gt;
	if (dtcValue != NULL_KEY)&lt;br /&gt;
	{&lt;br /&gt;
		tempDetections = (tempDetections=[]) + tempDetections + [dtcValue, dtcid];&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		llSleep(3.0); // Something has gone horribly wrong, sleep 3 seconds clear throttle&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
CheckSpell(string splmsg, key splid)&lt;br /&gt;
{&lt;br /&gt;
	splValue = llHTTPRequest(&amp;quot;http://search.yahooapis.com/WebSearchService/V1/spellingSuggestion?appid=DNPjiabV34EOgXQ3kAu6.d7kf6v.JUGCn1bFUcSTFMSGCyCy_ALzbepYstlI7DrOGP0-&amp;amp;query=&amp;quot; + llEscapeURL(splmsg), [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot;&amp;quot;);&lt;br /&gt;
	llSleep(0.1);&lt;br /&gt;
	if (splValue != NULL_KEY)&lt;br /&gt;
	{    // Translation&lt;br /&gt;
		spellchecks = (spellchecks=[]) + spellchecks + [splValue, splid, splmsg];&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		llSleep(3.0); // Something has gone horribly wrong, sleep 3 seconds clear throttle&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		llListen(0,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	listen(integer channel, string name, key id, string message)&lt;br /&gt;
	{&lt;br /&gt;
		if ((!enabled) &amp;amp;&amp;amp; (isMaster == 1))&lt;br /&gt;
		{&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (!tranObjects)&lt;br /&gt;
		{&lt;br /&gt;
			if (llGetAgentSize(id) == ZERO_VECTOR)&lt;br /&gt;
			{&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				if (SpellChecker == 1)&lt;br /&gt;
				{&lt;br /&gt;
					CheckSpell(message, id);&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					llMessageLinked(LINK_THIS,98745920,message,id);&lt;br /&gt;
				}&lt;br /&gt;
				DetectLanguage(message, id);								&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			if (SpellChecker == TRUE)&lt;br /&gt;
			{&lt;br /&gt;
				CheckSpell(message, id);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				llMessageLinked(LINK_THIS,98745920,message,id);&lt;br /&gt;
			}&lt;br /&gt;
			DetectLanguage(message, id);			&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
	{   // Process Response Code&lt;br /&gt;
		if (~llListFindList(spellchecks, (list)request_id))&lt;br /&gt;
		{&lt;br /&gt;
			integer splliPos = llListFindList(spellchecks, (list)request_id);&lt;br /&gt;
			if(contains(body, &amp;quot;lt&amp;gt;&amp;quot;) != 0)&lt;br /&gt;
			{   // Yahoo Spell Checker correction&lt;br /&gt;
				llMessageLinked(LINK_THIS, 98745920,llGetSubString(body, llSubStringIndex(body, &amp;quot;t&amp;gt;&amp;quot;) + 2, llSubStringIndex(body, &amp;quot;&amp;lt;/&amp;quot;) - 1),llList2Key(spellchecks, splliPos + 1));&lt;br /&gt;
				llOwnerSay(llGetSubString(body, llSubStringIndex(body, &amp;quot;t&amp;gt;&amp;quot;) + 2, llSubStringIndex(body, &amp;quot;&amp;lt;/&amp;quot;) - 1));&lt;br /&gt;
				spellchecks = llDeleteSubList(spellchecks,splliPos, splliPos + 2);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				llMessageLinked(LINK_THIS,98745920,llList2String(spellchecks, splliPos + 2),llList2Key(spellchecks, splliPos + 1));&lt;br /&gt;
				spellchecks = llDeleteSubList(spellchecks,splliPos, splliPos + 2);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if (~llListFindList(tempDetections, (list)request_id))&lt;br /&gt;
		{   // Language Detection&lt;br /&gt;
			integer tmpliPos = llListFindList(tempDetections, (list)request_id);&lt;br /&gt;
			key speakerID = llList2Key(tempDetections, tmpliPos + 1);&lt;br /&gt;
			tempDetections = llDeleteSubList(tempDetections, tmpliPos, tmpliPos + 3);&lt;br /&gt;
			string htttmpStr = llToLower(llGetSubString(body, llSubStringIndex(body, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(body, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
			if (contains(htttmpStr, &amp;quot;err&amp;quot;) == 0 &amp;amp;&amp;amp; contains(htttmpStr, &amp;quot;unn&amp;quot;) == 0)&lt;br /&gt;
			{   // We Trust the Google system, the Google´s guys are good and I am sure they will keep improving :-)&lt;br /&gt;
				// Language Detected&lt;br /&gt;
				llMessageLinked(LINK_THIS,6349160,htttmpStr,speakerID);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Translator&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Personal Translator (Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//Spell Checker Web Services powered by Yahoo&lt;br /&gt;
integer tranObjects = TRUE;&lt;br /&gt;
integer SpellChecker = TRUE;&lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
key returnValue;&lt;br /&gt;
list requestedTranslations;&lt;br /&gt;
string SEPARATOR = &amp;quot;|%&amp;amp;|&amp;quot;; // for transmitting lists via linked messages&lt;br /&gt;
&lt;br /&gt;
Translate(string chkmsg, list chkli)&lt;br /&gt;
{&lt;br /&gt;
	returnValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&amp;amp;q=&amp;quot; + chkmsg, [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot;&amp;quot;);&lt;br /&gt;
	if (returnValue != NULL_KEY)&lt;br /&gt;
	{    // Translation&lt;br /&gt;
		requestedTranslations = (requestedTranslations=[]) + requestedTranslations + [returnValue, llList2CSV(chkli)];&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		llSleep(25.0); // Something has gone horribly wrong, sleep 25 seconds to clear throttle&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
processHTTPResponse(string bodyStr, list httli)&lt;br /&gt;
{&lt;br /&gt;
	key     recepientID;&lt;br /&gt;
	key     speakerID;&lt;br /&gt;
	list    paramtmpli;&lt;br /&gt;
	list    recepientList;&lt;br /&gt;
	string  recepientLanguage;&lt;br /&gt;
	string  languagePair;&lt;br /&gt;
	string  speakerName;&lt;br /&gt;
	string  speakerLanguage;&lt;br /&gt;
	string  translatedText;&lt;br /&gt;
	string  lantmpStr;&lt;br /&gt;
	integer z;&lt;br /&gt;
	//===================&lt;br /&gt;
	// Process Translation&lt;br /&gt;
	//===================&lt;br /&gt;
	speakerID  = llList2Key(httli, 1);&lt;br /&gt;
	speakerName = llKey2Name(speakerID);&lt;br /&gt;
	if (speakerName == &amp;quot;&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
	}&lt;br /&gt;
	recepientList = llParseString2List(llList2String(httli, 2), [&amp;quot;@&amp;quot;], []);&lt;br /&gt;
	paramtmpli = llParseStringKeepNulls(llList2String(httli, 3), [&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
	recepientLanguage = llList2String(paramtmpli, 1);&lt;br /&gt;
	languagePair = llDumpList2String(paramtmpli, &amp;quot;&amp;gt;&amp;gt;&amp;quot;);&lt;br /&gt;
	// Perform Text Cleanup&lt;br /&gt;
	translatedText = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;detectedSourceLanguage\&amp;quot;:\&amp;quot;&amp;quot;));&lt;br /&gt;
	// Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
	if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
	{&lt;br /&gt;
		lantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
		for(z = llStringLength(translatedText);z &amp;gt;= 0; z--)&lt;br /&gt;
		{&lt;br /&gt;
			lantmpStr = (lantmpStr=&amp;quot;&amp;quot;) + lantmpStr + llGetSubString(translatedText, z, z);&lt;br /&gt;
		}&lt;br /&gt;
		translatedText = lantmpStr;&lt;br /&gt;
	}&lt;br /&gt;
	lantmpStr = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
	for (z = 0; z &amp;lt; llGetListLength(recepientList); z += 1)&lt;br /&gt;
	{&lt;br /&gt;
			llMessageLinked(LINK_THIS,9827491, List2String( [ llList2Integer(recepientList, z), speakerLanguage , lantmpStr ] ),recepientID);&lt;br /&gt;
	}&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string List2String(list input)&lt;br /&gt;
{ // converts list to a string&lt;br /&gt;
    return llDumpList2String(input, SEPARATOR);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list String2List(string inputstring)&lt;br /&gt;
{ // converts a separated string created with List2String back to a list&lt;br /&gt;
	list output;&lt;br /&gt;
    output = llParseString2List(inputstring, [SEPARATOR], []);   &lt;br /&gt;
    return output;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(1.0);&lt;br /&gt;
	}&lt;br /&gt;
	link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
	{&lt;br /&gt;
		if (num == 2346017)&lt;br /&gt;
		{&lt;br /&gt;
			list txli = String2List(lstr);&lt;br /&gt;
			Translate(llList2String(txli,0),[llGetTime(), lid, llList2String(txli,1),llList2Key(txli,2)]);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
	{   // Process Response Code&lt;br /&gt;
		if (~llListFindList(requestedTranslations, (list)request_id))&lt;br /&gt;
		{   // Translation&lt;br /&gt;
			integer httliPos = llListFindList(requestedTranslations, (list)request_id);&lt;br /&gt;
			processHTTPResponse(body, llCSV2List(llList2String(requestedTranslations, httliPos + 1)));&lt;br /&gt;
			requestedTranslations = llDeleteSubList(requestedTranslations, httliPos, httliPos + 1);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	timer()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(0.0);&lt;br /&gt;
		integer r;&lt;br /&gt;
		for (r = 0; r &amp;lt; llGetListLength(requestedTranslations); r += 2)&lt;br /&gt;
		{&lt;br /&gt;
			timeElapsed = llGetTime() - llList2Float(llCSV2List(llList2String(requestedTranslations, r + 1)), 0);&lt;br /&gt;
			if (timeElapsed &amp;lt; 20.0)&lt;br /&gt;
			{&lt;br /&gt;
				newList = (newList=[]) + newList + llList2List(requestedTranslations, r, r + 1);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		requestedTranslations = newList;&lt;br /&gt;
		newList = [];&lt;br /&gt;
		llSetTimerEvent(5.0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Formulator&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Personal Translator (Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//December 25, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//Spell Checker Web Services powered by Yahoo&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
string SEPARATOR = &amp;quot;|%&amp;amp;|&amp;quot;; // for transmitting lists via linked messages&lt;br /&gt;
list String2List(string inputstring)&lt;br /&gt;
{ // converts a separated string created with List2String back to a list&lt;br /&gt;
	list output;&lt;br /&gt;
    output = llParseString2List(inputstring, [SEPARATOR], []);   &lt;br /&gt;
    return output;&lt;br /&gt;
}&lt;br /&gt;
string List2String(list input)&lt;br /&gt;
{ // converts a list to a string&lt;br /&gt;
    return llDumpList2String(input, SEPARATOR);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		llSleep(0.5);&lt;br /&gt;
		llMessageLinked(LINK_THIS,6745676,&amp;quot;&amp;quot;,NULL_KEY);&lt;br /&gt;
	}&lt;br /&gt;
	link_message(integer sender_num, integer num, string lstr, key id)&lt;br /&gt;
	{&lt;br /&gt;
		if (num == 7659759)&lt;br /&gt;
		{&lt;br /&gt;
			agentsInTranslation = [];&lt;br /&gt;
			agentsInTranslation = String2List(lstr);&lt;br /&gt;
		}&lt;br /&gt;
		if (num == 98745920)&lt;br /&gt;
		{&lt;br /&gt;
			integer w;&lt;br /&gt;
			string  spkrLan;&lt;br /&gt;
			string  recepLan;&lt;br /&gt;
			integer recepID;&lt;br /&gt;
			integer lstliPos;&lt;br /&gt;
			string  lanpair;&lt;br /&gt;
			list    translationCache;&lt;br /&gt;
			//===============================&lt;br /&gt;
			// Formulate Translation Requests&lt;br /&gt;
			//===============================&lt;br /&gt;
			for (w = 0; w &amp;lt; llGetListLength(agentsInTranslation); w += 5)&lt;br /&gt;
			{    // Loop through translation group and do appropriate translations as needed&lt;br /&gt;
				recepID = llList2Integer(agentsInTranslation, w + 4);&lt;br /&gt;
				recepLan = llList2String(agentsInTranslation, w + 1);&lt;br /&gt;
				if (spkrLan == recepLan)&lt;br /&gt;
				{ }&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
					if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
					{&lt;br /&gt;
						lstliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
						translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			if (translationCache != [])&lt;br /&gt;
			{	// Process Requests				&lt;br /&gt;
				for (w = 0; w &amp;lt; llGetListLength(translationCache); w += 2)&lt;br /&gt;
				{   //====================================&lt;br /&gt;
					//Translation&lt;br /&gt;
					//====================================&lt;br /&gt;
					//Forumulate and Send Translation Request&lt;br /&gt;
					lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, w), [&amp;quot;|&amp;quot;],[]), 1);&lt;br /&gt;
					llMessageLinked(LINK_THIS,2346017,List2String( [llEscapeURL(lstr) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), llList2String(translationCache, w + 1), llList2String(translationCache, w)] ),id);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			translationCache = [];&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=691553</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=691553"/>
		<updated>2009-12-23T13:26:42Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: /* OK */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribución al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente código fué originálmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mí manera...&lt;br /&gt;
No ós riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;OK&#039;&#039; ===&lt;br /&gt;
Bueno, despues de respiñar todo lo que pude, creo que el uso de memoria y la velocidad están prácticamente igual qué en la versión original pero bueno... en la variedad está el gusto no?&lt;br /&gt;
Ya he probado un poco el código, y parece que funciona aunque estoy teniendo algunos problemas... Por ejemplo creo que el sistema de traduccion no funciona corréctamente, y no me refiero al sistema de traduccion de Google (en mi opinion, si no es el mejor, es uno de los mejores del mundo), sino a que aún queda mucho trabajo por hacer en el script...&lt;br /&gt;
&lt;br /&gt;
El siguiente paso sera intentar dividir el script en dos, o si es posible en tres para repartir el uso de memoria. Tambien me gustaria probar un truco que uso a menudo para traducir páginas en un idioma que no entiendo, lo que hago es que en vez de traducir diréctamente al español, primero se traduce a inglés, y luego desde inglés al español. Parece una tontería y un gasto innecesario, pero si lo hago es porque así suelo entender mejor las traducciones.&lt;br /&gt;
Quiero por un lado el sistema de comunicacion y evaluacion entre traductores, y por otro el sistema de traduccion entre avatares, ¿es muy dificil? no sé ya lo veremos...&lt;br /&gt;
&lt;br /&gt;
Well, after saving as much as I could, I think the memory usage and the speed are technically the same as in the original script, but well, in the variety is the taste, isnt it?. &lt;br /&gt;
I have tested a bit the code above already, and it seems to work altought i´m having some problems...&lt;br /&gt;
For instance i think the translation system is not working properly, and i dont mean the Google´s translation system (in my opinion, if is not the best, one of the bests), but that there is still much work to do in the script...&lt;br /&gt;
&lt;br /&gt;
The next step will be to try to divide the script in 2, or 3 if is possible, so we can spread the memory usage. Also I would like to test a trick i use often for to translate languages that i dont understand, what I do first is to translate that language into English, and then from English to Spanish, it seems a nonsense and unnecesary waste, but if i do it is becouse so i usually understand the translations better.&lt;br /&gt;
I want by one part the translators communications and evaluation system, and by other the translation system between avatars, is it very difficult? I don´t know , we will see...&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Es dificil... me está costando pero ya veremos...&lt;br /&gt;
Its difficult... i am struggling but we will see...&lt;br /&gt;
&lt;br /&gt;
chu chu chu&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
De Güatemala a Güatepeor, Sin comentarios...&lt;br /&gt;
&lt;br /&gt;
From Güatebad to Güateworse, No comments...&lt;br /&gt;
&lt;br /&gt;
Buscando en Internet he encontrado este [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html API de Yahoo] comprobador de ortografía, aunque creo que por ahora sólo soporta el lenguage inglés pero sería interesante añadirlo al proyecto&lt;br /&gt;
&lt;br /&gt;
Searching on the web I crossed in my way with this spell checker [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html Yahoo´s API] , I think that it only supports English language by now althought it would be interesting to add it to the project&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Estoy probando el comprobador de deletreo de Yahoo aunque la verdad es que no estoy teniendo buenos resultados, parece que Google es mucho más rapido y necesito corregir antes de traducir. También estoy intentando solucionar el error que aparece con el símbolo (apostrofe) ´ en las frases con genitivo sajon traducidas al inglés y tampoco doy con la tecla... Ya que esto me está dando muchos dolores de cabeza quizás deje el proyecto en standby hasta después de navidades.&lt;br /&gt;
&lt;br /&gt;
I am testing the Yahoo´s spell checker althought to be honest I´m not having good success, it seems Google is much faster and I need to correct before translate. Also I am triying to fix the error showed in the phrases translated to English with the saxons genitive apostrophe ´ and still triying and triying. As this is driving me nuts, maybe I will leave the project in standby until new year.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ESTO ES EL TRADUCTOR &amp;quot;un lío&amp;quot; por ahora... Necesito rehacer algunas cosas&lt;br /&gt;
&lt;br /&gt;
THIS IS THE TRANSLATOR &amp;quot;mess&amp;quot; by now... I need to redo some things&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Personal Translator (Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//November 12, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//Spell Checker Web Services powered by Yahoo&lt;br /&gt;
//Variables&lt;br /&gt;
list requestedTranslations;&lt;br /&gt;
list tempDetections;&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
list spellchecks;&lt;br /&gt;
list corrections;&lt;br /&gt;
integer M = 1;&lt;br /&gt;
integer listenID;&lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
integer showTranslation = FALSE;&lt;br /&gt;
integer tranObjects = TRUE;&lt;br /&gt;
integer isInitialized = FALSE;&lt;br /&gt;
string  options;&lt;br /&gt;
string tempcorrection;&lt;br /&gt;
key tempValue;&lt;br /&gt;
// Functions&lt;br /&gt;
integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex&lt;br /&gt;
{&lt;br /&gt;
    return ~llSubStringIndex(haystack, needle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sendIM(key imid, string imstr)&lt;br /&gt;
{&lt;br /&gt;
    // llInstantMessage(key id , string message) causes the script to sleep for 2 seconds&lt;br /&gt;
    if (llGetAgentSize(imid) == ZERO_VECTOR)&lt;br /&gt;
    { }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        if (imid != llGetOwner())&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(imstr + &amp;quot; @&amp;quot; + llKey2Name(imid));  // llOwnerSay(string message) has no delay&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if (M == 8)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_THIS, 2334420, imstr, imid);&lt;br /&gt;
        M = 1;&lt;br /&gt;
    }&lt;br /&gt;
    else if (M == 7)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_THIS, 2334430, imstr, imid);&lt;br /&gt;
        M = 8;&lt;br /&gt;
    }&lt;br /&gt;
    else if (M == 6)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_THIS, 2334440, imstr, imid);&lt;br /&gt;
        M = 7;&lt;br /&gt;
    }&lt;br /&gt;
    else if (M == 5)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_THIS, 2334450, imstr, imid);&lt;br /&gt;
        M = 6;&lt;br /&gt;
    }&lt;br /&gt;
    else if (M == 4)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_THIS, 2334460, imstr, imid);&lt;br /&gt;
        M = 5;&lt;br /&gt;
    }&lt;br /&gt;
    else if (M == 3)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_THIS, 2334470, imstr, imid);&lt;br /&gt;
        M = 4;&lt;br /&gt;
    }&lt;br /&gt;
    else if (M == 2)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_THIS, 2334480, imstr, imid);&lt;br /&gt;
        M = 3;&lt;br /&gt;
    }&lt;br /&gt;
    else if (M == 1)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_THIS, 2334490, imstr, imid);&lt;br /&gt;
        M = 2;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
DetectLanguage(string dtcmsg, key dtcid)&lt;br /&gt;
{&lt;br /&gt;
    tempValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&amp;amp;q=&amp;quot; + llEscapeURL(dtcmsg), [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot; &amp;quot;);&lt;br /&gt;
    if (tempValue != NULL_KEY)&lt;br /&gt;
    {&lt;br /&gt;
        tempDetections = (tempDetections=[]) + tempDetections + [tempValue, dtcid];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
CheckSpell(integer splnum, string splmsg)&lt;br /&gt;
{&lt;br /&gt;
    key spellValue;&lt;br /&gt;
    spellValue = llHTTPRequest(&amp;quot;http://search.yahooapis.com/WebSearchService/V1/spellingSuggestion?appid=DNPjiabV34EOgXQ3kAu6.d7kf6v.JUGCn1bFUcSTFMSGCyCy_ALzbepYstlI7DrOGP0-&amp;amp;query=&amp;quot; + splmsg, [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot;&amp;quot;);&lt;br /&gt;
    if (spellValue != NULL_KEY)&lt;br /&gt;
    {    // Translation&lt;br /&gt;
        spellchecks = (spellchecks=[]) + spellchecks + [spellValue, splnum];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Translate(integer chkn, string chkmsg, list chkli)&lt;br /&gt;
{&lt;br /&gt;
    key returnValue;&lt;br /&gt;
    returnValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&amp;amp;q=&amp;quot; + chkmsg, [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot;&amp;quot;);&lt;br /&gt;
    if (returnValue != NULL_KEY)&lt;br /&gt;
    {    // Translation&lt;br /&gt;
        requestedTranslations = (requestedTranslations=[]) + requestedTranslations + [returnValue, llList2CSV(chkli)];&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llSleep(25.0); // Something has gone horribly wrong, sleep 25 seconds to clear throttle&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string checkLanguage(string chklantmpStr)&lt;br /&gt;
{&lt;br /&gt;
    if (chklantmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;en&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else if (chklantmpStr == &amp;quot;und&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;el&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if (llGetSubString(chklantmpStr, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = llGetSubString(chklantmpStr, 0, 1);&lt;br /&gt;
    }&lt;br /&gt;
    return chklantmpStr;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
    integer avliPos;&lt;br /&gt;
    integer idNum;&lt;br /&gt;
    if (~llListFindList(agentsInTranslation, (list)avid))&lt;br /&gt;
    {&lt;br /&gt;
        avliPos = llListFindList(agentsInTranslation, (list)avid);&lt;br /&gt;
        agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, avlan, chklan], avliPos + 1, avliPos + 3);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        @at;&lt;br /&gt;
        idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
        if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
        {&lt;br /&gt;
            jump at;&lt;br /&gt;
        }&lt;br /&gt;
        agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, avlan, chklan, idNum];&lt;br /&gt;
        // llMessageLinked(LINK_THIS, 64562349, avlan, avid);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string addNewAgent(key newavid)&lt;br /&gt;
{&lt;br /&gt;
    string speakerLan;&lt;br /&gt;
    if (llGetAgentSize(newavid) == ZERO_VECTOR)&lt;br /&gt;
    {&lt;br /&gt;
        speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
        addAgent(newavid, speakerLan, 4);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        speakerLan  = checkLanguage(llGetAgentLanguage(newavid));&lt;br /&gt;
        if (speakerLan == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
            addAgent(newavid, speakerLan, 0);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            addAgent(newavid, speakerLan, 0);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return speakerLan;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
    if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
    {&lt;br /&gt;
        integer gkliPos = llListFindList(agentsInTranslation, (list)agentID);&lt;br /&gt;
        return llList2Key(agentsInTranslation, gkliPos - 4);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
processHTTPResponse(integer ntype, string bodyStr, list httli)&lt;br /&gt;
{&lt;br /&gt;
    key     recepientID;&lt;br /&gt;
    key     speakerID;&lt;br /&gt;
    list    paramtmpli;&lt;br /&gt;
    list    recepientList;&lt;br /&gt;
    string  recepientLanguage;&lt;br /&gt;
    string  languagePair;&lt;br /&gt;
    string  speakerName;&lt;br /&gt;
    string  speakerLanguage;&lt;br /&gt;
    string  translatedText;&lt;br /&gt;
    string  lantmpStr;&lt;br /&gt;
    integer z;&lt;br /&gt;
    //===================&lt;br /&gt;
    // Process Translation&lt;br /&gt;
    //===================&lt;br /&gt;
    speakerID  = llList2Key(httli, 1);&lt;br /&gt;
    speakerName = llKey2Name(speakerID);&lt;br /&gt;
    if (speakerName == &amp;quot;&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
    }&lt;br /&gt;
    recepientList = llParseString2List(llList2String(httli, 2), [&amp;quot;@&amp;quot;], []);&lt;br /&gt;
    paramtmpli = llParseStringKeepNulls(llList2String(httli, 3), [&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
    recepientLanguage = llList2String(paramtmpli, 1);&lt;br /&gt;
    languagePair = llDumpList2String(paramtmpli, &amp;quot;&amp;gt;&amp;gt;&amp;quot;);&lt;br /&gt;
    // Perform Text Cleanup&lt;br /&gt;
    translatedText = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;detectedSourceLanguage\&amp;quot;:\&amp;quot;&amp;quot;));&lt;br /&gt;
    // Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
    if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
    {&lt;br /&gt;
        lantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
        for(z = llStringLength(translatedText);z &amp;gt;= 0; z--)&lt;br /&gt;
        {&lt;br /&gt;
            lantmpStr = (lantmpStr=&amp;quot;&amp;quot;) + lantmpStr + llGetSubString(translatedText, z, z);&lt;br /&gt;
        }&lt;br /&gt;
        translatedText = lantmpStr;&lt;br /&gt;
    }&lt;br /&gt;
    lantmpStr = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
    for (z = 0; z &amp;lt; llGetListLength(recepientList); z += 1)&lt;br /&gt;
    {&lt;br /&gt;
        recepientID = getAgentKey(llList2Integer(recepientList, z));&lt;br /&gt;
        if (recepientID != &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, [recepientID]) + 1);&lt;br /&gt;
            if (recepientLanguage == speakerLanguage)&lt;br /&gt;
            { }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                sendIM(recepientID, lantmpStr);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(5);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
    {&lt;br /&gt;
        list ltmpli;&lt;br /&gt;
        if (num == 8434532)&lt;br /&gt;
        {&lt;br /&gt;
            enabled = (integer)lstr;&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 3342976)&lt;br /&gt;
        {    // Send Preferences&lt;br /&gt;
            options = lstr;&lt;br /&gt;
            if (isInitialized == FALSE)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            ltmpli = llCSV2List(options);&lt;br /&gt;
            showTranslation = llList2Integer(ltmpli, 0);&lt;br /&gt;
            tranObjects = llList2Integer(ltmpli, 1);&lt;br /&gt;
            autoLanguage = llList2Integer(ltmpli, 2);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    sensor(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        integer s;&lt;br /&gt;
        key sid;&lt;br /&gt;
        for (s = 0; s &amp;lt; num_detected; s += 1)&lt;br /&gt;
        {&lt;br /&gt;
            sid = llDetectedKey(s);&lt;br /&gt;
            if (~llListFindList(agentsInTranslation, (list)sid))&lt;br /&gt;
            { }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                addNewAgent(sid);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    no_sensor()&lt;br /&gt;
    { }&lt;br /&gt;
&lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        integer w;&lt;br /&gt;
        string  spkrLan;&lt;br /&gt;
        string  recepLan;&lt;br /&gt;
        integer recepID;&lt;br /&gt;
        integer lstliPos;&lt;br /&gt;
        string  lanpair;&lt;br /&gt;
        list    translationCache;&lt;br /&gt;
        // Translator Engine Code&lt;br /&gt;
        integer msgid = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
        CheckSpell(msgid , llEscapeURL(message));&lt;br /&gt;
        llSleep(1.0);&lt;br /&gt;
        if ((!enabled) &amp;amp;&amp;amp; (isMaster == 1))&lt;br /&gt;
        {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if (!tranObjects)&lt;br /&gt;
        {&lt;br /&gt;
            if (llGetAgentSize(id) == ZERO_VECTOR)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                DetectLanguage(message, id);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            DetectLanguage(message, id);&lt;br /&gt;
        }&lt;br /&gt;
        if (~llListFindList(agentsInTranslation, (list)id))&lt;br /&gt;
        {&lt;br /&gt;
            lstliPos = llListFindList(agentsInTranslation, (list)id);&lt;br /&gt;
            spkrLan = llList2String(agentsInTranslation, lstliPos + 1);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            spkrLan = addNewAgent(id);&lt;br /&gt;
        }&lt;br /&gt;
        //===============================&lt;br /&gt;
        // Formulate Translation Requests&lt;br /&gt;
        //===============================&lt;br /&gt;
        if (id == llGetOwner())&lt;br /&gt;
        {   // If speaker is owner&lt;br /&gt;
            // I will do this dirty cheat by now&lt;br /&gt;
            // There should exist another clean way to filter speakers &amp;amp; receivers, I need to think about this&lt;br /&gt;
            for (w = 0; w &amp;lt; llGetListLength(agentsInTranslation); w += 5)&lt;br /&gt;
            {    // Loop through translation group and do appropriate translations as needed&lt;br /&gt;
                recepID = llList2Integer(agentsInTranslation, w + 4);&lt;br /&gt;
                recepLan =  checkLanguage(llList2String(agentsInTranslation, w + 1));&lt;br /&gt;
                if (spkrLan == recepLan)&lt;br /&gt;
                { }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
                    if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
                    {&lt;br /&gt;
                        lstliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
                        translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            if (translationCache != [])&lt;br /&gt;
            {    // Process Requests&lt;br /&gt;
                if (~llListFindList(corrections, (list)msgid))&lt;br /&gt;
                {&lt;br /&gt;
                    message = llList2String(corrections, 1);&lt;br /&gt;
                    corrections = [];&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    corrections = [];&lt;br /&gt;
                }&lt;br /&gt;
                for (w = 0; w &amp;lt; llGetListLength(translationCache); w += 2)&lt;br /&gt;
                {   //====================================&lt;br /&gt;
                    //Translation&lt;br /&gt;
                    //====================================&lt;br /&gt;
                    //Forumulate and Send Translation Request&lt;br /&gt;
                    lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, w), [&amp;quot;|&amp;quot;],[]), 1);&lt;br /&gt;
                    Translate(0, llEscapeURL(message) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, w + 1), llList2String(translationCache, w)]);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {   // if speaker is not owner&lt;br /&gt;
            lstliPos = llListFindList(agentsInTranslation, (list)llGetOwner());&lt;br /&gt;
            recepID = llList2Integer(agentsInTranslation, lstliPos + 4);&lt;br /&gt;
            recepLan =  checkLanguage(llList2String(agentsInTranslation , lstliPos + 1 ));&lt;br /&gt;
            if (spkrLan == recepLan)&lt;br /&gt;
            { }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
                if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
                {&lt;br /&gt;
                    lstliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
                    translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];&lt;br /&gt;
                }&lt;br /&gt;
                if (translationCache != [])&lt;br /&gt;
                {   //====================================&lt;br /&gt;
                    //Translation&lt;br /&gt;
                    //====================================&lt;br /&gt;
                    //Forumulate and Send Translation Request&lt;br /&gt;
                    lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, lstliPos), [&amp;quot;|&amp;quot;],[]), 1);&lt;br /&gt;
                    Translate(0, llEscapeURL(message) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, lstliPos + 1), llList2String(translationCache, lstliPos)]);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
    {   // Process Response Code&lt;br /&gt;
        integer httliPos;&lt;br /&gt;
        if (~llListFindList(spellchecks, (list)request_id))&lt;br /&gt;
        {&lt;br /&gt;
            if(contains(body, &amp;quot;lt&amp;gt;&amp;quot;) != 0)&lt;br /&gt;
            {   // Yahoo Spell Checker correction&lt;br /&gt;
                integer httsplID = llList2Integer(spellchecks,  1);&lt;br /&gt;
                corrections = (corrections=[]) + corrections + [httsplID, llGetSubString(body, llSubStringIndex(body, &amp;quot;t&amp;gt;&amp;quot;) + 2, llSubStringIndex(body, &amp;quot;&amp;lt;/&amp;quot;) - 1)];&lt;br /&gt;
                llOwnerSay(llGetSubString(body, llSubStringIndex(body, &amp;quot;t&amp;gt;&amp;quot;) + 2, llSubStringIndex(body, &amp;quot;&amp;lt;/&amp;quot;) - 1));&lt;br /&gt;
                spellchecks = [];&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                spellchecks = [];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (~llListFindList(requestedTranslations, (list)request_id))&lt;br /&gt;
        {   // Translation&lt;br /&gt;
            httliPos = llListFindList(requestedTranslations, (list)request_id);&lt;br /&gt;
            processHTTPResponse(0, body, llCSV2List(llList2String(requestedTranslations, httliPos + 1)));&lt;br /&gt;
            requestedTranslations = llDeleteSubList(requestedTranslations, httliPos, httliPos + 1);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if (~llListFindList(tempDetections, (list)request_id))&lt;br /&gt;
        {   // Language Detection&lt;br /&gt;
            integer tmpliPos = llListFindList(tempDetections, (list)request_id);&lt;br /&gt;
            key speakerID = llList2Key(tempDetections, tmpliPos + 1);&lt;br /&gt;
            tempDetections = llDeleteSubList(tempDetections, tmpliPos, tmpliPos + 3);&lt;br /&gt;
            string htttmpStr = llToLower(llGetSubString(body, llSubStringIndex(body, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(body, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
            if (contains(htttmpStr, &amp;quot;err&amp;quot;) == 0 &amp;amp;&amp;amp; contains(htttmpStr, &amp;quot;unn&amp;quot;) == 0)&lt;br /&gt;
            {   // We Trust the Google system, the Google´s guys are good and I am sure they will keep improving :-)&lt;br /&gt;
                // Language Detected&lt;br /&gt;
                htttmpStr = checkLanguage(htttmpStr);&lt;br /&gt;
                if (~llListFindList(agentsInTranslation, (list)speakerID))&lt;br /&gt;
                {&lt;br /&gt;
                    integer tmpavliPos = llListFindList(agentsInTranslation, (list)speakerID);&lt;br /&gt;
					string actlan = llList2String(agentsInTranslation, tmpavliPos + 1);&lt;br /&gt;
					string tmplan = llList2String(agentsInTranslation, tmpavliPos + 2);&lt;br /&gt;
                    if (llList2Integer(agentsInTranslation, tmpavliPos + 3) &amp;gt;= 2)&lt;br /&gt;
                    {   // if anyone speaks on any different language 3 times in a row&lt;br /&gt;
                        addAgent(speakerID, htttmpStr, 0);&lt;br /&gt;
                    }&lt;br /&gt;
                    if (actlan == htttmpStr)&lt;br /&gt;
                    {   // reset language checker for speaker&lt;br /&gt;
                        agentsInTranslation = llListReplaceList(agentsInTranslation, [actlan, 0 ], tmpavliPos + 2, tmpavliPos + 3);&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        if ( htttmpStr == tmplan)&lt;br /&gt;
                        {   // if language of speaker is not the same as detected language&lt;br /&gt;
                            agentsInTranslation = llListReplaceList(agentsInTranslation,[llList2Integer(agentsInTranslation,tmpavliPos + 3) + 1] , tmpavliPos + 3, tmpavliPos + 3);&lt;br /&gt;
                        }&lt;br /&gt;
                        else&lt;br /&gt;
                        {&lt;br /&gt;
                            agentsInTranslation = llListReplaceList(agentsInTranslation,[htttmpStr, 0] , tmpavliPos + 2, tmpavliPos + 3);&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        integer r;&lt;br /&gt;
        vector  tmrVct;&lt;br /&gt;
        list  newList;&lt;br /&gt;
        float timeElapsed;&lt;br /&gt;
        llSetTimerEvent(0.0);   // we better reset timer by way of precaution&lt;br /&gt;
        if (isInitialized == FALSE)&lt;br /&gt;
        {&lt;br /&gt;
            enabled = TRUE;&lt;br /&gt;
            listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
            llMessageLinked(LINK_THIS, 6877259, (string)enabled, NULL_KEY);&lt;br /&gt;
            isInitialized = TRUE;&lt;br /&gt;
            string mylanguage = llGetAgentLanguage(llGetOwner());&lt;br /&gt;
            if (llStringLength(mylanguage) &amp;lt; 1)&lt;br /&gt;
            {&lt;br /&gt;
                mylanguage = &amp;quot;en&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            if(~llListFindList(agentsInTranslation, (list)llGetOwner()))&lt;br /&gt;
            {&lt;br /&gt;
                integer ownerliPos = llListFindList(agentsInTranslation, (list)llGetOwner());&lt;br /&gt;
                agentsInTranslation = llListReplaceList(agentsInTranslation, [mylanguage] , ownerliPos + 1, ownerliPos + 1);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [llGetOwner() , mylanguage, mylanguage , 0 , llRound(llFrand(2000000)) + 1];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        for (r = 0; r &amp;lt; llGetListLength(tempDetections); r += 2)&lt;br /&gt;
        {&lt;br /&gt;
            timeElapsed = llGetTime() - llList2Float(llCSV2List(llList2String(tempDetections, r + 1)), 0);&lt;br /&gt;
            if (timeElapsed &amp;lt; 20.0)&lt;br /&gt;
            {&lt;br /&gt;
                newList = (newList=[]) + newList + llList2List(tempDetections, r, r + 1);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        tempDetections = newList;&lt;br /&gt;
        newList = [];&lt;br /&gt;
        for (r = 0; r &amp;lt; llGetListLength(requestedTranslations); r += 2)&lt;br /&gt;
        {&lt;br /&gt;
            timeElapsed = llGetTime() - llList2Float(llCSV2List(llList2String(requestedTranslations, r + 1)), 0);&lt;br /&gt;
            if (timeElapsed &amp;lt; 20.0)&lt;br /&gt;
            {&lt;br /&gt;
                newList = (newList=[]) + newList + llList2List(requestedTranslations, r, r + 1);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        requestedTranslations = newList;&lt;br /&gt;
        newList = [];&lt;br /&gt;
        if (isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            for (r = 0; r &amp;lt; llGetListLength(agentsInTranslation); r += 5)&lt;br /&gt;
            {&lt;br /&gt;
                tmrVct = llList2Vector(llGetObjectDetails(llList2Key(agentsInTranslation, r), [OBJECT_POS]), 0);&lt;br /&gt;
                if (llVecDist(llGetPos(), tmrVct) &amp;lt;= 20.0)&lt;br /&gt;
                {&lt;br /&gt;
                    newList = (newList=[]) + newList + llList2List(agentsInTranslation, r, r + 4);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            agentsInTranslation = newList;&lt;br /&gt;
            newList = [];&lt;br /&gt;
        }&lt;br /&gt;
        if ((autoLanguage) &amp;amp;&amp;amp; isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            llSensor(&amp;quot;&amp;quot;, NULL_KEY, AGENT, 20.0, PI);&lt;br /&gt;
        }&lt;br /&gt;
        llSetTimerEvent(4.0);   // restart timer&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=691543</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=691543"/>
		<updated>2009-12-23T13:22:22Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: /* OK */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribución al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente código fué originálmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mí manera...&lt;br /&gt;
No ós riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;OK&#039;&#039; ===&lt;br /&gt;
Bueno, despues de respiñar todo lo que pude, creo que el uso de memoria y la velocidad están prácticamente igual qué en la versión original pero bueno... en la variedad está el gusto no?&lt;br /&gt;
Ya he probado un poco el código, y parece que funciona aunque estoy teniendo algunos problemas... Por ejemplo creo que el sistema de traduccion no funciona corréctamente, y no me refiero al sistema de traduccion de Google (en mi opinion, si no es el mejor, es uno de los mejores del mundo), sino a que aún queda mucho trabajo por hacer en el script...&lt;br /&gt;
&lt;br /&gt;
El siguiente paso sera intentar dividir el script en dos, o si es posible en tres para repartir el uso de memoria. Tambien me gustaria probar un truco que uso a menudo para traducir páginas en un idioma que no entiendo, lo que hago es que en vez de traducir diréctamente al español, primero se traduce a inglés, y luego desde inglés al español. Parece una tontería y un gasto innecesario, pero si lo hago es porque así suelo entender mejor las traducciones.&lt;br /&gt;
Quiero por un lado el sistema de comunicacion y evaluacion entre traductores, y por otro el sistema de traduccion entre avatares, ¿es muy dificil? no sé ya lo veremos...&lt;br /&gt;
&lt;br /&gt;
Well, after saving as much as I could, I think the memory usage and the speed are technically the same as in the original script, but well, in the variety is the taste, isnt it?. &lt;br /&gt;
I have tested a bit the code above already, and it seems to work altought i´m having some problems...&lt;br /&gt;
For instance i think the translation system is not working properly, and i dont mean the Google´s translation system (in my opinion, if is not the best, one of the bests), but that there is still much work to do in the script...&lt;br /&gt;
&lt;br /&gt;
The next step will be to try to divide the script in 2, or 3 if is possible, so we can spread the memory usage. Also I would like to test a trick i use often for to translate languages that i dont understand, what I do first is to translate that language into English, and then from English to Spanish, it seems a nonsense and unnecesary waste, but if i do it is becouse so i usually understand the translations better.&lt;br /&gt;
I want by one part the translators communications and evaluation system, and by other the translation system between avatars, is it very difficult? I don´t know , we will see...&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Es dificil... me está costando pero ya veremos...&lt;br /&gt;
Its difficult... i am struggling but we will see...&lt;br /&gt;
&lt;br /&gt;
chu chu chu&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
De Güatemala a Güatepeor, Sin comentarios...&lt;br /&gt;
&lt;br /&gt;
From Güatebad to Güateworse, No comments...&lt;br /&gt;
&lt;br /&gt;
Buscando en Internet he encontrado este [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html API de Yahoo] comprobador de ortografía, aunque creo que por ahora sólo soporta el lenguage inglés pero sería interesante añadirlo al proyecto&lt;br /&gt;
&lt;br /&gt;
Searching on the web I crossed in my way with this spell checker [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html Yahoo´s API] , I think that it only supports English language by now althought it would be interesting to add it to the project&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Estoy probando el comprobador de deletreo de Yahoo aunque la verdad es que no estoy teniendo buenos resultados, parece que Google es mucho más rapido y necesito corregir antes de traducir. También estoy intentando solucionar el error que aparece con el símbolo (apostrofe) ´ en las frases con genitivo sajon traducidas al inglés y tampoco doy con la tecla... Ya que esto me está dando muchos dolores de cabeza quizás deje el proyecto en standby hasta después de navidades.&lt;br /&gt;
&lt;br /&gt;
I am testing the Yahoo´s spell checker althought to be honest I´m not having good success, it seems Google is much faster and I need to correct before translate. Also I am triying to fix the error showed in the phrases translated to English with the saxons genitive apostrophe ´ and still triying and triying. As this is driving me nuts, maybe I will leave the project in standby until new year.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ESTO ES EL TRADUCTOR &amp;quot;un lío&amp;quot; por ahora... Necesito rehacer algunas cosas&lt;br /&gt;
&lt;br /&gt;
THIS IS THE TRANSLATOR &amp;quot;mess&amp;quot; by now... I need to redo some things&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Personal Translator (Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//November 12, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//Spell Checker Web Services powered by Yahoo&lt;br /&gt;
//Variables&lt;br /&gt;
list requestedTranslations;&lt;br /&gt;
list tempDetections;&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
list spellchecks;&lt;br /&gt;
list corrections;&lt;br /&gt;
integer M = 1;&lt;br /&gt;
integer listenID;&lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
integer showTranslation = FALSE;&lt;br /&gt;
integer tranObjects = TRUE;&lt;br /&gt;
integer isInitialized = FALSE;&lt;br /&gt;
string  options;&lt;br /&gt;
string tempcorrection;&lt;br /&gt;
key tempValue;&lt;br /&gt;
// Functions&lt;br /&gt;
integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex&lt;br /&gt;
{&lt;br /&gt;
    return ~llSubStringIndex(haystack, needle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sendIM(key imid, string imstr)&lt;br /&gt;
{&lt;br /&gt;
    // llInstantMessage(key id , string message) causes the script to sleep for 2 seconds&lt;br /&gt;
    if (llGetAgentSize(imid) == ZERO_VECTOR)&lt;br /&gt;
    { }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        if (imid != llGetOwner())&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(imstr + &amp;quot; @&amp;quot; + llKey2Name(imid));  // llOwnerSay(string message) has no delay&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if (M == 8)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_THIS, 2334420, imstr, imid);&lt;br /&gt;
        M = 1;&lt;br /&gt;
    }&lt;br /&gt;
    else if (M == 7)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_THIS, 2334430, imstr, imid);&lt;br /&gt;
        M = 8;&lt;br /&gt;
    }&lt;br /&gt;
    else if (M == 6)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_THIS, 2334440, imstr, imid);&lt;br /&gt;
        M = 7;&lt;br /&gt;
    }&lt;br /&gt;
    else if (M == 5)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_THIS, 2334450, imstr, imid);&lt;br /&gt;
        M = 6;&lt;br /&gt;
    }&lt;br /&gt;
    else if (M == 4)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_THIS, 2334460, imstr, imid);&lt;br /&gt;
        M = 5;&lt;br /&gt;
    }&lt;br /&gt;
    else if (M == 3)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_THIS, 2334470, imstr, imid);&lt;br /&gt;
        M = 4;&lt;br /&gt;
    }&lt;br /&gt;
    else if (M == 2)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_THIS, 2334480, imstr, imid);&lt;br /&gt;
        M = 3;&lt;br /&gt;
    }&lt;br /&gt;
    else if (M == 1)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_THIS, 2334490, imstr, imid);&lt;br /&gt;
        M = 2;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
DetectLanguage(string dtcmsg, key dtcid)&lt;br /&gt;
{&lt;br /&gt;
    tempValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&amp;amp;q=&amp;quot; + llEscapeURL(dtcmsg), [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot; &amp;quot;);&lt;br /&gt;
    if (tempValue != NULL_KEY)&lt;br /&gt;
    {&lt;br /&gt;
        tempDetections = (tempDetections=[]) + tempDetections + [tempValue, dtcid];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
CheckSpell(integer splnum, string splmsg)&lt;br /&gt;
{&lt;br /&gt;
    key spellValue;&lt;br /&gt;
    spellValue = llHTTPRequest(&amp;quot;http://search.yahooapis.com/WebSearchService/V1/spellingSuggestion?appid=DNPjiabV34EOgXQ3kAu6.d7kf6v.JUGCn1bFUcSTFMSGCyCy_ALzbepYstlI7DrOGP0-&amp;amp;query=&amp;quot; + splmsg, [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot;&amp;quot;);&lt;br /&gt;
    if (spellValue != NULL_KEY)&lt;br /&gt;
    {    // Translation&lt;br /&gt;
        spellchecks = (spellchecks=[]) + spellchecks + [spellValue, splnum];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Translate(integer chkn, string chkmsg, list chkli)&lt;br /&gt;
{&lt;br /&gt;
    key returnValue;&lt;br /&gt;
    returnValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&amp;amp;q=&amp;quot; + chkmsg, [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot;&amp;quot;);&lt;br /&gt;
    if (returnValue != NULL_KEY)&lt;br /&gt;
    {    // Translation&lt;br /&gt;
        requestedTranslations = (requestedTranslations=[]) + requestedTranslations + [returnValue, llList2CSV(chkli)];&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llSleep(25.0); // Something has gone horribly wrong, sleep 25 seconds to clear throttle&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string checkLanguage(string chklantmpStr)&lt;br /&gt;
{&lt;br /&gt;
    if (chklantmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;en&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else if (chklantmpStr == &amp;quot;und&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;el&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if (llGetSubString(chklantmpStr, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = llGetSubString(chklantmpStr, 0, 1);&lt;br /&gt;
    }&lt;br /&gt;
    return chklantmpStr;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
    integer avliPos;&lt;br /&gt;
    integer idNum;&lt;br /&gt;
    if (~llListFindList(agentsInTranslation, (list)avid))&lt;br /&gt;
    {&lt;br /&gt;
        avliPos = llListFindList(agentsInTranslation, (list)avid);&lt;br /&gt;
        agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, avlan, chklan], avliPos + 1, avliPos + 3);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        @at;&lt;br /&gt;
        idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
        if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
        {&lt;br /&gt;
            jump at;&lt;br /&gt;
        }&lt;br /&gt;
        agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, avlan, chklan, idNum];&lt;br /&gt;
        // llMessageLinked(LINK_THIS, 64562349, avlan, avid);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string addNewAgent(key newavid)&lt;br /&gt;
{&lt;br /&gt;
    string speakerLan;&lt;br /&gt;
    if (llGetAgentSize(newavid) == ZERO_VECTOR)&lt;br /&gt;
    {&lt;br /&gt;
        speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
        addAgent(newavid, speakerLan, 4);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        speakerLan  = checkLanguage(llGetAgentLanguage(newavid));&lt;br /&gt;
        if (speakerLan == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
            addAgent(newavid, speakerLan, 0);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            addAgent(newavid, speakerLan, 0);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return speakerLan;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
    if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
    {&lt;br /&gt;
        integer gkliPos = llListFindList(agentsInTranslation, (list)agentID);&lt;br /&gt;
        return llList2Key(agentsInTranslation, gkliPos - 4);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
processHTTPResponse(integer ntype, string bodyStr, list httli)&lt;br /&gt;
{&lt;br /&gt;
    key     recepientID;&lt;br /&gt;
    key     speakerID;&lt;br /&gt;
    list    paramtmpli;&lt;br /&gt;
    list    recepientList;&lt;br /&gt;
    string  recepientLanguage;&lt;br /&gt;
    string  languagePair;&lt;br /&gt;
    string  speakerName;&lt;br /&gt;
    string  speakerLanguage;&lt;br /&gt;
    string  translatedText;&lt;br /&gt;
    string  lantmpStr;&lt;br /&gt;
    integer z;&lt;br /&gt;
    //===================&lt;br /&gt;
    // Process Translation&lt;br /&gt;
    //===================&lt;br /&gt;
    speakerID  = llList2Key(httli, 1);&lt;br /&gt;
    speakerName = llKey2Name(speakerID);&lt;br /&gt;
    if (speakerName == &amp;quot;&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
    }&lt;br /&gt;
    recepientList = llParseString2List(llList2String(httli, 2), [&amp;quot;@&amp;quot;], []);&lt;br /&gt;
    paramtmpli = llParseStringKeepNulls(llList2String(httli, 3), [&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
    recepientLanguage = llList2String(paramtmpli, 1);&lt;br /&gt;
    languagePair = llDumpList2String(paramtmpli, &amp;quot;&amp;gt;&amp;gt;&amp;quot;);&lt;br /&gt;
    // Perform Text Cleanup&lt;br /&gt;
    translatedText = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;detectedSourceLanguage\&amp;quot;:\&amp;quot;&amp;quot;));&lt;br /&gt;
    // Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
    if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
    {&lt;br /&gt;
        lantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
        for(z = llStringLength(translatedText);z &amp;gt;= 0; z--)&lt;br /&gt;
        {&lt;br /&gt;
            lantmpStr = (lantmpStr=&amp;quot;&amp;quot;) + lantmpStr + llGetSubString(translatedText, z, z);&lt;br /&gt;
        }&lt;br /&gt;
        translatedText = lantmpStr;&lt;br /&gt;
    }&lt;br /&gt;
    lantmpStr = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
    for (z = 0; z &amp;lt; llGetListLength(recepientList); z += 1)&lt;br /&gt;
    {&lt;br /&gt;
        recepientID = getAgentKey(llList2Integer(recepientList, z));&lt;br /&gt;
        if (recepientID != &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, [recepientID]) + 1);&lt;br /&gt;
            if (recepientLanguage == speakerLanguage)&lt;br /&gt;
            { }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                sendIM(recepientID, lantmpStr);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(5);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
    {&lt;br /&gt;
        list ltmpli;&lt;br /&gt;
        if (num == 8434532)&lt;br /&gt;
        {&lt;br /&gt;
            enabled = (integer)lstr;&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 3342976)&lt;br /&gt;
        {    // Send Preferences&lt;br /&gt;
            options = lstr;&lt;br /&gt;
            if (isInitialized == FALSE)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            ltmpli = llCSV2List(options);&lt;br /&gt;
            showTranslation = llList2Integer(ltmpli, 0);&lt;br /&gt;
            tranObjects = llList2Integer(ltmpli, 1);&lt;br /&gt;
            autoLanguage = llList2Integer(ltmpli, 2);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    sensor(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        integer s;&lt;br /&gt;
        key sid;&lt;br /&gt;
        for (s = 0; s &amp;lt; num_detected; s += 1)&lt;br /&gt;
        {&lt;br /&gt;
            sid = llDetectedKey(s);&lt;br /&gt;
            if (~llListFindList(agentsInTranslation, (list)sid))&lt;br /&gt;
            { }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                addNewAgent(sid);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    no_sensor()&lt;br /&gt;
    { }&lt;br /&gt;
&lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        integer w;&lt;br /&gt;
        string  spkrLan;&lt;br /&gt;
        string  recepLan;&lt;br /&gt;
        integer recepID;&lt;br /&gt;
        integer lstliPos;&lt;br /&gt;
        string  lanpair;&lt;br /&gt;
        list    translationCache;&lt;br /&gt;
        // Translator Engine Code&lt;br /&gt;
        integer msgid = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
        CheckSpell(msgid , llEscapeURL(message));&lt;br /&gt;
        llSleep(1.0);&lt;br /&gt;
        if ((!enabled) &amp;amp;&amp;amp; (isMaster == 1))&lt;br /&gt;
        {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if (!tranObjects)&lt;br /&gt;
        {&lt;br /&gt;
            if (llGetAgentSize(id) == ZERO_VECTOR)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                DetectLanguage(message, id);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            DetectLanguage(message, id);&lt;br /&gt;
        }&lt;br /&gt;
        if (~llListFindList(agentsInTranslation, (list)id))&lt;br /&gt;
        {&lt;br /&gt;
            lstliPos = llListFindList(agentsInTranslation, (list)id);&lt;br /&gt;
            spkrLan = llList2String(agentsInTranslation, lstliPos + 1);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            spkrLan = addNewAgent(id);&lt;br /&gt;
        }&lt;br /&gt;
        //===============================&lt;br /&gt;
        // Formulate Translation Requests&lt;br /&gt;
        //===============================&lt;br /&gt;
        if (id == llGetOwner())&lt;br /&gt;
        {   // If speaker is owner&lt;br /&gt;
            // I will do this dirty cheat by now&lt;br /&gt;
            // There should exist another clean way to filter speakers &amp;amp; receivers, I need to think about this&lt;br /&gt;
            for (w = 0; w &amp;lt; llGetListLength(agentsInTranslation); w += 5)&lt;br /&gt;
            {    // Loop through translation group and do appropriate translations as needed&lt;br /&gt;
                recepID = llList2Integer(agentsInTranslation, w + 4);&lt;br /&gt;
                recepLan =  checkLanguage(llList2String(agentsInTranslation, w + 1));&lt;br /&gt;
                if (spkrLan == recepLan)&lt;br /&gt;
                { }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
                    if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
                    {&lt;br /&gt;
                        lstliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
                        translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            if (translationCache != [])&lt;br /&gt;
            {    // Process Requests&lt;br /&gt;
                if (~llListFindList(corrections, (list)msgid))&lt;br /&gt;
                {&lt;br /&gt;
                    message = llList2String(corrections, 1);&lt;br /&gt;
                    corrections = [];&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    corrections = [];&lt;br /&gt;
                }&lt;br /&gt;
                for (w = 0; w &amp;lt; llGetListLength(translationCache); w += 2)&lt;br /&gt;
                {   //====================================&lt;br /&gt;
                    //Translation&lt;br /&gt;
                    //====================================&lt;br /&gt;
                    //Forumulate and Send Translation Request&lt;br /&gt;
                    lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, w), [&amp;quot;|&amp;quot;],[]), 1);&lt;br /&gt;
                    Translate(0, llEscapeURL(message) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, w + 1), llList2String(translationCache, w)]);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {   // if speaker is not owner&lt;br /&gt;
            lstliPos = llListFindList(agentsInTranslation, (list)llGetOwner());&lt;br /&gt;
            recepID = llList2Integer(agentsInTranslation, lstliPos + 4);&lt;br /&gt;
            recepLan =  checkLanguage(llList2String(agentsInTranslation , lstliPos + 1 ));&lt;br /&gt;
            if (spkrLan == recepLan)&lt;br /&gt;
            { }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
                if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
                {&lt;br /&gt;
                    lstliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
                    translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];&lt;br /&gt;
                }&lt;br /&gt;
                if (translationCache != [])&lt;br /&gt;
                {   //====================================&lt;br /&gt;
                    //Translation&lt;br /&gt;
                    //====================================&lt;br /&gt;
                    //Forumulate and Send Translation Request&lt;br /&gt;
                    lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, lstliPos), [&amp;quot;|&amp;quot;],[]), 1);&lt;br /&gt;
                    Translate(0, llEscapeURL(message) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, lstliPos + 1), llList2String(translationCache, lstliPos)]);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
    {   // Process Response Code&lt;br /&gt;
        integer httliPos;&lt;br /&gt;
        if (~llListFindList(spellchecks, (list)request_id))&lt;br /&gt;
        {&lt;br /&gt;
            if(contains(body, &amp;quot;lt&amp;gt;&amp;quot;) != 0)&lt;br /&gt;
            {   // Yahoo Spell Checker correction&lt;br /&gt;
                integer httsplID = llList2Integer(spellchecks,  0);&lt;br /&gt;
                corrections = (corrections=[]) + corrections + [httsplID, llGetSubString(body, llSubStringIndex(body, &amp;quot;t&amp;gt;&amp;quot;) + 2, llSubStringIndex(body, &amp;quot;&amp;lt;/&amp;quot;) - 1)];&lt;br /&gt;
                llOwnerSay(llGetSubString(body, llSubStringIndex(body, &amp;quot;t&amp;gt;&amp;quot;) + 2, llSubStringIndex(body, &amp;quot;&amp;lt;/&amp;quot;) - 1));&lt;br /&gt;
                spellchecks = [];&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                spellchecks = [];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (~llListFindList(requestedTranslations, (list)request_id))&lt;br /&gt;
        {   // Translation&lt;br /&gt;
            httliPos = llListFindList(requestedTranslations, (list)request_id);&lt;br /&gt;
            processHTTPResponse(0, body, llCSV2List(llList2String(requestedTranslations, httliPos + 1)));&lt;br /&gt;
            requestedTranslations = llDeleteSubList(requestedTranslations, httliPos, httliPos + 1);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if (~llListFindList(tempDetections, (list)request_id))&lt;br /&gt;
        {   // Language Detection&lt;br /&gt;
            integer tmpliPos = llListFindList(tempDetections, (list)request_id);&lt;br /&gt;
            key speakerID = llList2Key(tempDetections, tmpliPos + 1);&lt;br /&gt;
            tempDetections = llDeleteSubList(tempDetections, tmpliPos, tmpliPos + 3);&lt;br /&gt;
            string htttmpStr = llToLower(llGetSubString(body, llSubStringIndex(body, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(body, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
            if (contains(htttmpStr, &amp;quot;err&amp;quot;) == 0 &amp;amp;&amp;amp; contains(htttmpStr, &amp;quot;unn&amp;quot;) == 0)&lt;br /&gt;
            {   // We Trust the Google system, the Google´s guys are good and I am sure they will keep improving :-)&lt;br /&gt;
                // Language Detected&lt;br /&gt;
                htttmpStr = checkLanguage(htttmpStr);&lt;br /&gt;
                if (~llListFindList(agentsInTranslation, (list)speakerID))&lt;br /&gt;
                {&lt;br /&gt;
                    integer tmpavliPos = llListFindList(agentsInTranslation, (list)speakerID);&lt;br /&gt;
					string actlan = llList2String(agentsInTranslation, tmpavliPos + 1);&lt;br /&gt;
					string tmplan = llList2String(agentsInTranslation, tmpavliPos + 2);&lt;br /&gt;
                    if (llList2Integer(agentsInTranslation, tmpavliPos + 3) &amp;gt;= 2)&lt;br /&gt;
                    {   // if anyone speaks on any different language 3 times in a row&lt;br /&gt;
                        addAgent(speakerID, htttmpStr, 0);&lt;br /&gt;
                    }&lt;br /&gt;
                    if (actlan == htttmpStr)&lt;br /&gt;
                    {   // reset language checker for speaker&lt;br /&gt;
                        agentsInTranslation = llListReplaceList(agentsInTranslation, [actlan, 0 ], tmpavliPos + 2, tmpavliPos + 3);&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        if ( htttmpStr == tmplan)&lt;br /&gt;
                        {   // if language of speaker is not the same as detected language&lt;br /&gt;
                            agentsInTranslation = llListReplaceList(agentsInTranslation,[llList2Integer(agentsInTranslation,tmpavliPos + 3) + 1] , tmpavliPos + 3, tmpavliPos + 3);&lt;br /&gt;
                        }&lt;br /&gt;
                        else&lt;br /&gt;
                        {&lt;br /&gt;
                            agentsInTranslation = llListReplaceList(agentsInTranslation,[htttmpStr, 0] , tmpavliPos + 2, tmpavliPos + 3);&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        integer r;&lt;br /&gt;
        vector  tmrVct;&lt;br /&gt;
        list  newList;&lt;br /&gt;
        float timeElapsed;&lt;br /&gt;
        llSetTimerEvent(0.0);   // we better reset timer by way of precaution&lt;br /&gt;
        if (isInitialized == FALSE)&lt;br /&gt;
        {&lt;br /&gt;
            enabled = TRUE;&lt;br /&gt;
            listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
            llMessageLinked(LINK_THIS, 6877259, (string)enabled, NULL_KEY);&lt;br /&gt;
            isInitialized = TRUE;&lt;br /&gt;
            string mylanguage = llGetAgentLanguage(llGetOwner());&lt;br /&gt;
            if (llStringLength(mylanguage) &amp;lt; 1)&lt;br /&gt;
            {&lt;br /&gt;
                mylanguage = &amp;quot;en&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            if(~llListFindList(agentsInTranslation, (list)llGetOwner()))&lt;br /&gt;
            {&lt;br /&gt;
                integer ownerliPos = llListFindList(agentsInTranslation, (list)llGetOwner());&lt;br /&gt;
                agentsInTranslation = llListReplaceList(agentsInTranslation, [mylanguage] , ownerliPos + 1, ownerliPos + 1);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [llGetOwner() , mylanguage, mylanguage , 0 , llRound(llFrand(2000000)) + 1];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        for (r = 0; r &amp;lt; llGetListLength(tempDetections); r += 2)&lt;br /&gt;
        {&lt;br /&gt;
            timeElapsed = llGetTime() - llList2Float(llCSV2List(llList2String(tempDetections, r + 1)), 0);&lt;br /&gt;
            if (timeElapsed &amp;lt; 20.0)&lt;br /&gt;
            {&lt;br /&gt;
                newList = (newList=[]) + newList + llList2List(tempDetections, r, r + 1);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        tempDetections = newList;&lt;br /&gt;
        newList = [];&lt;br /&gt;
        for (r = 0; r &amp;lt; llGetListLength(requestedTranslations); r += 2)&lt;br /&gt;
        {&lt;br /&gt;
            timeElapsed = llGetTime() - llList2Float(llCSV2List(llList2String(requestedTranslations, r + 1)), 0);&lt;br /&gt;
            if (timeElapsed &amp;lt; 20.0)&lt;br /&gt;
            {&lt;br /&gt;
                newList = (newList=[]) + newList + llList2List(requestedTranslations, r, r + 1);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        requestedTranslations = newList;&lt;br /&gt;
        newList = [];&lt;br /&gt;
        if (isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            for (r = 0; r &amp;lt; llGetListLength(agentsInTranslation); r += 5)&lt;br /&gt;
            {&lt;br /&gt;
                tmrVct = llList2Vector(llGetObjectDetails(llList2Key(agentsInTranslation, r), [OBJECT_POS]), 0);&lt;br /&gt;
                if (llVecDist(llGetPos(), tmrVct) &amp;lt;= 20.0)&lt;br /&gt;
                {&lt;br /&gt;
                    newList = (newList=[]) + newList + llList2List(agentsInTranslation, r, r + 4);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            agentsInTranslation = newList;&lt;br /&gt;
            newList = [];&lt;br /&gt;
        }&lt;br /&gt;
        if ((autoLanguage) &amp;amp;&amp;amp; isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            llSensor(&amp;quot;&amp;quot;, NULL_KEY, AGENT, 20.0, PI);&lt;br /&gt;
        }&lt;br /&gt;
        llSetTimerEvent(4.0);   // restart timer&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=691433</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=691433"/>
		<updated>2009-12-23T00:48:01Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribución al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente código fué originálmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mí manera...&lt;br /&gt;
No ós riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;OK&#039;&#039; ===&lt;br /&gt;
Bueno, despues de respiñar todo lo que pude, creo que el uso de memoria y la velocidad están prácticamente igual qué en la versión original pero bueno... en la variedad está el gusto no?&lt;br /&gt;
Ya he probado un poco el código, y parece que funciona aunque estoy teniendo algunos problemas... Por ejemplo creo que el sistema de traduccion no funciona corréctamente, y no me refiero al sistema de traduccion de Google (en mi opinion, si no es el mejor, es uno de los mejores del mundo), sino a que aún queda mucho trabajo por hacer en el script...&lt;br /&gt;
&lt;br /&gt;
El siguiente paso sera intentar dividir el script en dos, o si es posible en tres para repartir el uso de memoria. Tambien me gustaria probar un truco que uso a menudo para traducir páginas en un idioma que no entiendo, lo que hago es que en vez de traducir diréctamente al español, primero se traduce a inglés, y luego desde inglés al español. Parece una tontería y un gasto innecesario, pero si lo hago es porque así suelo entender mejor las traducciones.&lt;br /&gt;
Quiero por un lado el sistema de comunicacion y evaluacion entre traductores, y por otro el sistema de traduccion entre avatares, ¿es muy dificil? no sé ya lo veremos...&lt;br /&gt;
&lt;br /&gt;
Well, after saving as much as I could, I think the memory usage and the speed are technically the same as in the original script, but well, in the variety is the taste, isnt it?. &lt;br /&gt;
I have tested a bit the code above already, and it seems to work altought i´m having some problems...&lt;br /&gt;
For instance i think the translation system is not working properly, and i dont mean the Google´s translation system (in my opinion, if is not the best, one of the bests), but that there is still much work to do in the script...&lt;br /&gt;
&lt;br /&gt;
The next step will be to try to divide the script in 2, or 3 if is possible, so we can spread the memory usage. Also I would like to test a trick i use often for to translate languages that i dont understand, what I do first is to translate that language into English, and then from English to Spanish, it seems a nonsense and unnecesary waste, but if i do it is becouse so i usually understand the translations better.&lt;br /&gt;
I want by one part the translators communications and evaluation system, and by other the translation system between avatars, is it very difficult? I don´t know , we will see...&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Es dificil... me está costando pero ya veremos...&lt;br /&gt;
Its difficult... i am struggling but we will see...&lt;br /&gt;
&lt;br /&gt;
chu chu chu&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
De Güatemala a Güatepeor, Sin comentarios...&lt;br /&gt;
&lt;br /&gt;
From Güatebad to Güateworse, No comments...&lt;br /&gt;
&lt;br /&gt;
Buscando en Internet he encontrado este [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html API de Yahoo] comprobador de ortografía, aunque creo que por ahora sólo soporta el lenguage inglés pero sería interesante añadirlo al proyecto&lt;br /&gt;
&lt;br /&gt;
Searching on the web I crossed in my way with this spell checker [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html Yahoo´s API] , I think that it only supports English language by now althought it would be interesting to add it to the project&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Estoy probando el comprobador de deletreo de Yahoo aunque la verdad es que no estoy teniendo buenos resultados, parece que Google es mucho más rapido y necesito corregir antes de traducir. También estoy intentando solucionar el error que aparece con el símbolo (apostrofe) ´ en las frases con genitivo sajon traducidas al inglés y tampoco doy con la tecla... Ya que esto me está dando muchos dolores de cabeza quizás deje el proyecto en standby hasta después de navidades.&lt;br /&gt;
&lt;br /&gt;
I am testing the Yahoo´s spell checker althought to be honest I´m not having good success, it seems Google is much faster and I need to correct before translate. Also I am triying to fix the error showed in the phrases translated to English with the saxons genitive apostrophe ´ and still triying and triying. As this is driving me nuts, maybe I will leave the project in standby until new year.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ESTO ES EL TRADUCTOR &amp;quot;un lío&amp;quot; por ahora... Necesito rehacer algunas cosas&lt;br /&gt;
&lt;br /&gt;
THIS IS THE TRANSLATOR &amp;quot;mess&amp;quot; by now... I need to redo some things&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Personal Translator (Mod made in Perry Mizin)&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//November 12, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Translation Web Services powered by Google&lt;br /&gt;
//Spell Checker Web Services powered by Yahoo&lt;br /&gt;
//Variables&lt;br /&gt;
list requestedTranslations;&lt;br /&gt;
list tempDetections;&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
list spellchecks;&lt;br /&gt;
list corrections;&lt;br /&gt;
integer M = 1;&lt;br /&gt;
integer listenID;&lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
integer showTranslation = FALSE;&lt;br /&gt;
integer tranObjects = TRUE;&lt;br /&gt;
integer isInitialized = FALSE;&lt;br /&gt;
string  options;&lt;br /&gt;
string tempcorrection;&lt;br /&gt;
key tempValue;&lt;br /&gt;
//Functions&lt;br /&gt;
integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex&lt;br /&gt;
{&lt;br /&gt;
    return ~llSubStringIndex(haystack, needle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sendIM(key imid, string imstr)&lt;br /&gt;
{&lt;br /&gt;
    // llInstantMessage(key id , string message) causes the script to sleep for 2 seconds&lt;br /&gt;
    if (llGetAgentSize(imid) == ZERO_VECTOR)&lt;br /&gt;
    { }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        if (imid != llGetOwner())&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(imstr + &amp;quot; @&amp;quot; + llKey2Name(imid));  //llOwnerSay(string message) has no delay&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if (M == 8)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_THIS, 2334420, imstr, imid);&lt;br /&gt;
        M = 1;&lt;br /&gt;
    }&lt;br /&gt;
    else if (M == 7)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_THIS, 2334430, imstr, imid);&lt;br /&gt;
        M = 8;&lt;br /&gt;
    }&lt;br /&gt;
    else if (M == 6)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_THIS, 2334440, imstr, imid);&lt;br /&gt;
        M = 7;&lt;br /&gt;
    }&lt;br /&gt;
    else if (M == 5)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_THIS, 2334450, imstr, imid);&lt;br /&gt;
        M = 6;&lt;br /&gt;
    }&lt;br /&gt;
    else if (M == 4)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_THIS, 2334460, imstr, imid);&lt;br /&gt;
        M = 5;&lt;br /&gt;
    }&lt;br /&gt;
    else if (M == 3)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_THIS, 2334470, imstr, imid);&lt;br /&gt;
        M = 4;&lt;br /&gt;
    }&lt;br /&gt;
    else if (M == 2)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_THIS, 2334480, imstr, imid);&lt;br /&gt;
        M = 3;&lt;br /&gt;
    }&lt;br /&gt;
    else if (M == 1)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_THIS, 2334490, imstr, imid);&lt;br /&gt;
        M = 2;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
DetectLanguage(string dtcmsg, key dtcid)&lt;br /&gt;
{&lt;br /&gt;
    tempValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&amp;amp;q=&amp;quot; + llEscapeURL(dtcmsg), [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot; &amp;quot;);&lt;br /&gt;
    if (tempValue != NULL_KEY)&lt;br /&gt;
    {&lt;br /&gt;
        tempDetections = (tempDetections=[]) + tempDetections + [tempValue, dtcid];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
CheckSpell(integer splnum, string splmsg)&lt;br /&gt;
{&lt;br /&gt;
    key spellValue;&lt;br /&gt;
    spellValue = llHTTPRequest(&amp;quot;http://search.yahooapis.com/WebSearchService/V1/spellingSuggestion?appid=DNPjiabV34EOgXQ3kAu6.d7kf6v.JUGCn1bFUcSTFMSGCyCy_ALzbepYstlI7DrOGP0-&amp;amp;query=&amp;quot; + splmsg, [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot;&amp;quot;);&lt;br /&gt;
    if (spellValue != NULL_KEY)&lt;br /&gt;
    {    //Translation&lt;br /&gt;
        spellchecks = (spellchecks=[]) + spellchecks + [spellValue, splnum];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Translate(integer chkn, string chkmsg, list chkli)&lt;br /&gt;
{&lt;br /&gt;
    key returnValue;&lt;br /&gt;
    returnValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&amp;amp;q=&amp;quot; + chkmsg, [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot;&amp;quot;);&lt;br /&gt;
    if (returnValue != NULL_KEY)&lt;br /&gt;
    {    //Translation&lt;br /&gt;
        requestedTranslations = (requestedTranslations=[]) + requestedTranslations + [returnValue, llList2CSV(chkli)];&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llSleep(25.0); //Something has gone horribly wrong, sleep 25 seconds to clear throttle&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string checkLanguage(string chklantmpStr)&lt;br /&gt;
{&lt;br /&gt;
    if (chklantmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;en&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else if (chklantmpStr == &amp;quot;und&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;el&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if (llGetSubString(chklantmpStr, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = llGetSubString(chklantmpStr, 0, 1);&lt;br /&gt;
    }&lt;br /&gt;
    return chklantmpStr;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
    integer avliPos;&lt;br /&gt;
    integer idNum;&lt;br /&gt;
    if (~llListFindList(agentsInTranslation, (list)avid))&lt;br /&gt;
    {&lt;br /&gt;
        avliPos = llListFindList(agentsInTranslation, (list)avid);&lt;br /&gt;
        agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, avlan, chklan], avliPos + 1, avliPos + 3);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        @at;&lt;br /&gt;
        idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
        if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
        {&lt;br /&gt;
            jump at;&lt;br /&gt;
        }&lt;br /&gt;
        agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, avlan, chklan, idNum];&lt;br /&gt;
        // llMessageLinked(LINK_THIS, 64562349, avlan, avid);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string addNewAgent(key newavid)&lt;br /&gt;
{&lt;br /&gt;
    string speakerLan;&lt;br /&gt;
    if (llGetAgentSize(newavid) == ZERO_VECTOR)&lt;br /&gt;
    {&lt;br /&gt;
        speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
        addAgent(newavid, speakerLan, 4);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        speakerLan  = checkLanguage(llGetAgentLanguage(newavid));&lt;br /&gt;
        if (speakerLan == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
            addAgent(newavid, speakerLan, 0);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            addAgent(newavid, speakerLan, 0);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return speakerLan;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
    if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
    {&lt;br /&gt;
        integer gkliPos = llListFindList(agentsInTranslation, (list)agentID);&lt;br /&gt;
        return llList2Key(agentsInTranslation, gkliPos - 4);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
processHTTPResponse(integer ntype, string bodyStr, list httli)&lt;br /&gt;
{&lt;br /&gt;
    key     recepientID;&lt;br /&gt;
    key     speakerID;&lt;br /&gt;
    list    paramtmpli;&lt;br /&gt;
    list    recepientList;&lt;br /&gt;
    string  recepientLanguage;&lt;br /&gt;
    string  languagePair;&lt;br /&gt;
    string  speakerName;&lt;br /&gt;
    string  speakerLanguage;&lt;br /&gt;
    string  translatedText;&lt;br /&gt;
    string  lantmpStr;&lt;br /&gt;
    integer z;&lt;br /&gt;
    //===================&lt;br /&gt;
    //Process Translation&lt;br /&gt;
    //===================&lt;br /&gt;
    speakerID  = llList2Key(httli, 1);&lt;br /&gt;
    speakerName = llKey2Name(speakerID);&lt;br /&gt;
    if (speakerName == &amp;quot;&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
    }&lt;br /&gt;
    recepientList = llParseString2List(llList2String(httli, 2), [&amp;quot;@&amp;quot;], []);&lt;br /&gt;
    paramtmpli = llParseStringKeepNulls(llList2String(httli, 3), [&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
    recepientLanguage = llList2String(paramtmpli, 1);&lt;br /&gt;
    languagePair = llDumpList2String(paramtmpli, &amp;quot;&amp;gt;&amp;gt;&amp;quot;);&lt;br /&gt;
    //Perform Text Cleanup&lt;br /&gt;
    translatedText = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;detectedSourceLanguage\&amp;quot;:\&amp;quot;&amp;quot;));&lt;br /&gt;
    //Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
    if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
    {&lt;br /&gt;
        lantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
        for(z = llStringLength(translatedText);z &amp;gt;= 0; z--)&lt;br /&gt;
        {&lt;br /&gt;
            lantmpStr = (lantmpStr=&amp;quot;&amp;quot;) + lantmpStr + llGetSubString(translatedText, z, z);&lt;br /&gt;
        }&lt;br /&gt;
        translatedText = lantmpStr;&lt;br /&gt;
    }&lt;br /&gt;
    lantmpStr = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
    for (z = 0; z &amp;lt; llGetListLength(recepientList); z += 1)&lt;br /&gt;
    {&lt;br /&gt;
        recepientID = getAgentKey(llList2Integer(recepientList, z));&lt;br /&gt;
        if (recepientID != &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, [recepientID]) + 1);&lt;br /&gt;
            if (recepientLanguage == speakerLanguage)&lt;br /&gt;
            { }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                sendIM(recepientID, lantmpStr);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(5);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
    {&lt;br /&gt;
        list ltmpli;&lt;br /&gt;
        if (num == 8434532)&lt;br /&gt;
        {&lt;br /&gt;
            enabled = (integer)lstr;&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 3342976)&lt;br /&gt;
        {    //Send Preferences&lt;br /&gt;
            options = lstr;&lt;br /&gt;
            if (isInitialized == FALSE) return;&lt;br /&gt;
            ltmpli = llCSV2List(options);&lt;br /&gt;
            showTranslation = llList2Integer(ltmpli, 0);&lt;br /&gt;
            tranObjects = llList2Integer(ltmpli, 1);&lt;br /&gt;
            autoLanguage = llList2Integer(ltmpli, 2);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    sensor(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        integer s;&lt;br /&gt;
        key sid;&lt;br /&gt;
        for (s = 0; s &amp;lt; num_detected; s += 1)&lt;br /&gt;
        {&lt;br /&gt;
            sid = llDetectedKey(s);&lt;br /&gt;
            if (~llListFindList(agentsInTranslation, (list)sid))&lt;br /&gt;
            { }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                addNewAgent(sid);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    no_sensor()&lt;br /&gt;
    { }&lt;br /&gt;
&lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        integer w;&lt;br /&gt;
        string  spkrLan;&lt;br /&gt;
        string  recepLan;&lt;br /&gt;
        integer recepID;&lt;br /&gt;
        integer lstliPos;&lt;br /&gt;
        string  lanpair;&lt;br /&gt;
        list    translationCache;&lt;br /&gt;
        //Translator Engine Code&lt;br /&gt;
        integer msgid = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
        CheckSpell(msgid , llEscapeURL(message));&lt;br /&gt;
        if ((!enabled) &amp;amp;&amp;amp; (isMaster == 1))&lt;br /&gt;
        {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if (!tranObjects)&lt;br /&gt;
        {&lt;br /&gt;
            if (llGetAgentSize(id) == ZERO_VECTOR)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                DetectLanguage(message, id);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            DetectLanguage(message, id);&lt;br /&gt;
        }&lt;br /&gt;
        if (~llListFindList(agentsInTranslation, (list)id))&lt;br /&gt;
        {&lt;br /&gt;
            lstliPos = llListFindList(agentsInTranslation, (list)id);&lt;br /&gt;
            spkrLan = llList2String(agentsInTranslation, lstliPos + 1);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            spkrLan = addNewAgent(id);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        //===============================&lt;br /&gt;
        //Formulate Translation Requests&lt;br /&gt;
        //===============================&lt;br /&gt;
        if (id == llGetOwner())&lt;br /&gt;
        {    // If speaker is owner&lt;br /&gt;
            // I will do this dirty cheat by now&lt;br /&gt;
            // There should exist another clean way to filter speakers &amp;amp; receivers, I need to think about this&lt;br /&gt;
            for (w = 0; w &amp;lt; llGetListLength(agentsInTranslation); w += 5)&lt;br /&gt;
            {    //Loop through translation group and do appropriate translations as needed&lt;br /&gt;
                recepID = llList2Integer(agentsInTranslation, w + 4);&lt;br /&gt;
                recepLan =  checkLanguage(llList2String(agentsInTranslation, w + 1));&lt;br /&gt;
                if (spkrLan == recepLan)&lt;br /&gt;
                { }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
                    if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
                    {&lt;br /&gt;
                        lstliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
                        translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            if (translationCache != [])&lt;br /&gt;
            {    //Process Requests&lt;br /&gt;
                llSleep(1.0);&lt;br /&gt;
                if (~llListFindList(corrections, (list)msgid))&lt;br /&gt;
                {&lt;br /&gt;
                    integer splchknum = llListFindList(corrections, (list)msgid);&lt;br /&gt;
                    message = llList2String(corrections, splchknum + 1 );&lt;br /&gt;
                    corrections = llDeleteSubList(corrections, splchknum,splchknum + 1);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    corrections = [];&lt;br /&gt;
                }&lt;br /&gt;
                for (w = 0; w &amp;lt; llGetListLength(translationCache); w += 2)&lt;br /&gt;
                {    //====================================&lt;br /&gt;
                    //Translation&lt;br /&gt;
                    //====================================&lt;br /&gt;
                    //Forumulate and Send Translation Request&lt;br /&gt;
                    lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, w), [&amp;quot;|&amp;quot;],[]), 1);&lt;br /&gt;
                    Translate(0, llEscapeURL(message) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, w + 1), llList2String(translationCache, w)]);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {    // if speaker is not owner&lt;br /&gt;
            lstliPos = llListFindList(agentsInTranslation, (list)llGetOwner());&lt;br /&gt;
            recepID = llList2Integer(agentsInTranslation, lstliPos + 4);&lt;br /&gt;
            recepLan =  checkLanguage(llList2String(agentsInTranslation , lstliPos + 1 ));&lt;br /&gt;
            if (spkrLan == recepLan)&lt;br /&gt;
            { }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
                if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
                {&lt;br /&gt;
                    lstliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
                    translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];&lt;br /&gt;
                }&lt;br /&gt;
                if (translationCache != [])&lt;br /&gt;
                {    //====================================&lt;br /&gt;
                    //Translation&lt;br /&gt;
                    //====================================&lt;br /&gt;
                    //Forumulate and Send Translation Request&lt;br /&gt;
                    lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, lstliPos), [&amp;quot;|&amp;quot;],[]), 1);&lt;br /&gt;
                    Translate(0, llEscapeURL(message) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, lstliPos + 1), llList2String(translationCache, lstliPos)]);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
    {    //Process Response Code&lt;br /&gt;
        integer httliPos;&lt;br /&gt;
        if (~llListFindList(spellchecks, (list)request_id))&lt;br /&gt;
        {&lt;br /&gt;
            if(contains(body, &amp;quot;&amp;lt;Result&amp;gt;&amp;quot;) != 0)&lt;br /&gt;
            {    // Yahoo Spell Checker correction&lt;br /&gt;
                integer httsplliPos = llListFindList(spellchecks, (list)request_id);&lt;br /&gt;
                integer httsplID = llList2Integer(spellchecks, httsplliPos + 1);&lt;br /&gt;
                corrections = (corrections=[]) + corrections + [ httsplID, llGetSubString(body, llSubStringIndex(body, &amp;quot;&amp;lt;Result&amp;gt;&amp;quot;) + 8, llSubStringIndex(body, &amp;quot;&amp;lt;/Result&amp;gt;&amp;quot;) - 1)];                &lt;br /&gt;
                spellchecks = llDeleteSubList(spellchecks, httsplliPos, httsplliPos + 1 );&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                integer httsplliPos = llListFindList(spellchecks, (list)request_id);&lt;br /&gt;
                spellchecks = llDeleteSubList(spellchecks, httsplliPos, httsplliPos + 1 );&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (~llListFindList(requestedTranslations, (list)request_id))&lt;br /&gt;
        {&lt;br /&gt;
            httliPos = llListFindList(requestedTranslations, (list)request_id);&lt;br /&gt;
            processHTTPResponse(0, body, llCSV2List(llList2String(requestedTranslations, httliPos + 1)));&lt;br /&gt;
            requestedTranslations = llDeleteSubList(requestedTranslations, httliPos, httliPos + 1);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if (~llListFindList(tempDetections, (list)request_id))&lt;br /&gt;
        {    // We Trust the Google system, the Google´s guys are good and I am sure they will keep improving :-)&lt;br /&gt;
            integer tmpliPos = llListFindList(tempDetections, (list)request_id);&lt;br /&gt;
            key speakerID = llList2Key(tempDetections, tmpliPos + 1);&lt;br /&gt;
            tempDetections = llDeleteSubList(tempDetections, tmpliPos, tmpliPos + 3);&lt;br /&gt;
            string htttmpStr = llToLower(llGetSubString(body, llSubStringIndex(body, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(body, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
            if (contains(htttmpStr, &amp;quot;err&amp;quot;) == 0 &amp;amp;&amp;amp; contains(htttmpStr, &amp;quot;unn&amp;quot;) == 0)&lt;br /&gt;
            {    // if detects any language&lt;br /&gt;
                htttmpStr = checkLanguage(htttmpStr);&lt;br /&gt;
                if (~llListFindList(agentsInTranslation, (list)speakerID))&lt;br /&gt;
                {&lt;br /&gt;
                    integer tmpavliPos = llListFindList(agentsInTranslation, (list)speakerID);&lt;br /&gt;
                    string actlan = llList2String(agentsInTranslation, tmpavliPos + 1);&lt;br /&gt;
                    if (llList2Integer(agentsInTranslation, tmpavliPos + 3) &amp;gt;= 2)&lt;br /&gt;
                    {    // if anyone speaks on any different language 3 times in a row&lt;br /&gt;
                        addAgent(speakerID, htttmpStr, 0);&lt;br /&gt;
                    }&lt;br /&gt;
                    if (actlan == htttmpStr)&lt;br /&gt;
                    {    // reset language checker for speaker&lt;br /&gt;
                        agentsInTranslation = llListReplaceList(agentsInTranslation, [ actlan, 0 ], tmpavliPos + 2, tmpavliPos + 3);&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        if ( htttmpStr == llList2String(agentsInTranslation,tmpavliPos + 2))&lt;br /&gt;
                        { // if language of speaker is not the same as detected language&lt;br /&gt;
                            agentsInTranslation = llListReplaceList(agentsInTranslation,[llList2Integer(agentsInTranslation,tmpavliPos + 3) + 1] , tmpavliPos + 3, tmpavliPos + 3);&lt;br /&gt;
                        }&lt;br /&gt;
                        else&lt;br /&gt;
                        {&lt;br /&gt;
                            agentsInTranslation = llListReplaceList(agentsInTranslation,[htttmpStr, 0] , tmpavliPos + 2, tmpavliPos + 3);&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        integer r;&lt;br /&gt;
        vector  tmrVct;&lt;br /&gt;
        list  newList;&lt;br /&gt;
        float timeElapsed;&lt;br /&gt;
        llSetTimerEvent(0.0); // we better reset timer by way of precaution&lt;br /&gt;
        if (isInitialized == FALSE)&lt;br /&gt;
        {&lt;br /&gt;
            enabled = TRUE;&lt;br /&gt;
            listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
            llMessageLinked(LINK_THIS, 6877259, (string)enabled, NULL_KEY);&lt;br /&gt;
            isInitialized = TRUE;&lt;br /&gt;
            string mylanguage = llGetAgentLanguage(llGetOwner());&lt;br /&gt;
            if (llStringLength(mylanguage) &amp;lt; 1)&lt;br /&gt;
            {&lt;br /&gt;
                mylanguage = &amp;quot;en&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            if(~llListFindList(agentsInTranslation, (list)llGetOwner()))&lt;br /&gt;
            {&lt;br /&gt;
                integer ownerliPos = llListFindList(agentsInTranslation, (list)llGetOwner());&lt;br /&gt;
                agentsInTranslation = llListReplaceList(agentsInTranslation, [mylanguage] , ownerliPos + 1, ownerliPos + 1);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [llGetOwner() , mylanguage, mylanguage , 0 , llRound(llFrand(2000000)) + 1];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        for (r = 0; r &amp;lt; llGetListLength(tempDetections); r += 2)&lt;br /&gt;
        {&lt;br /&gt;
            timeElapsed = llGetTime() - llList2Float(llCSV2List(llList2String(tempDetections, r + 1)), 0);&lt;br /&gt;
            if (timeElapsed &amp;lt; 20.0)&lt;br /&gt;
            {&lt;br /&gt;
                newList = (newList=[]) + newList + llList2List(tempDetections, r, r + 1);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        tempDetections = newList;&lt;br /&gt;
        newList = [];&lt;br /&gt;
        for (r = 0; r &amp;lt; llGetListLength(requestedTranslations); r += 2)&lt;br /&gt;
        {&lt;br /&gt;
            timeElapsed = llGetTime() - llList2Float(llCSV2List(llList2String(requestedTranslations, r + 1)), 0);&lt;br /&gt;
            if (timeElapsed &amp;lt; 20.0)&lt;br /&gt;
            {&lt;br /&gt;
                newList = (newList=[]) + newList + llList2List(requestedTranslations, r, r + 1);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        requestedTranslations = newList;&lt;br /&gt;
        newList = [];&lt;br /&gt;
        if (isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            for (r = 0; r &amp;lt; llGetListLength(agentsInTranslation); r += 5)&lt;br /&gt;
            {&lt;br /&gt;
                tmrVct = llList2Vector(llGetObjectDetails(llList2Key(agentsInTranslation, r), [OBJECT_POS]), 0);&lt;br /&gt;
                if (llVecDist(llGetPos(), tmrVct) &amp;lt;= 20.0)&lt;br /&gt;
                {&lt;br /&gt;
                    newList = (newList=[]) + newList + llList2List(agentsInTranslation, r, r + 4);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            agentsInTranslation = newList;&lt;br /&gt;
            newList = [];&lt;br /&gt;
        }&lt;br /&gt;
        if ((autoLanguage) &amp;amp;&amp;amp; isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            llSensor(&amp;quot;&amp;quot;, NULL_KEY, AGENT, 20.0, PI);&lt;br /&gt;
        }&lt;br /&gt;
        llSetTimerEvent(4.0); // restart timer&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=690652</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=690652"/>
		<updated>2009-12-20T20:50:43Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribución al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente código fué originálmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mí manera...&lt;br /&gt;
No ós riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;OK&#039;&#039; ===&lt;br /&gt;
Bueno, despues de respiñar todo lo que pude, creo que el uso de memoria y la velocidad están prácticamente igual qué en la versión original pero bueno... en la variedad está el gusto no?&lt;br /&gt;
Ya he probado un poco el código, y parece que funciona aunque estoy teniendo algunos problemas... Por ejemplo creo que el sistema de traduccion no funciona corréctamente, y no me refiero al sistema de traduccion de Google (en mi opinion, si no es el mejor, es uno de los mejores del mundo), sino a que aún queda mucho trabajo por hacer en el script...&lt;br /&gt;
&lt;br /&gt;
El siguiente paso sera intentar dividir el script en dos, o si es posible en tres para repartir el uso de memoria. Tambien me gustaria probar un truco que uso a menudo para traducir páginas en un idioma que no entiendo, lo que hago es que en vez de traducir diréctamente al español, primero se traduce a inglés, y luego desde inglés al español. Parece una tontería y un gasto innecesario, pero si lo hago es porque así suelo entender mejor las traducciones.&lt;br /&gt;
Quiero por un lado el sistema de comunicacion y evaluacion entre traductores, y por otro el sistema de traduccion entre avatares, ¿es muy dificil? no sé ya lo veremos...&lt;br /&gt;
&lt;br /&gt;
Well, after saving as much as I could, I think the memory usage and the speed are technically the same as in the original script, but well, in the variety is the taste, isnt it?. &lt;br /&gt;
I have tested a bit the code above already, and it seems to work altought i´m having some problems...&lt;br /&gt;
For instance i think the translation system is not working properly, and i dont mean the Google´s translation system (in my opinion, if is not the best, one of the bests), but that there is still much work to do in the script...&lt;br /&gt;
&lt;br /&gt;
The next step will be to try to divide the script in 2, or 3 if is possible, so we can spread the memory usage. Also I would like to test a trick i use often for to translate languages that i dont understand, what I do first is to translate that language into English, and then from English to Spanish, it seems a nonsense and unnecesary waste, but if i do it is becouse so i usually understand the translations better.&lt;br /&gt;
I want by one part the translators communications and evaluation system, and by other the translation system between avatars, is it very difficult? I don´t know , we will see...&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Es dificil... me está costando pero ya veremos...&lt;br /&gt;
Its difficult... i am struggling but we will see...&lt;br /&gt;
&lt;br /&gt;
chu chu chu&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
De Güatemala a Güatepeor, Sin comentarios...&lt;br /&gt;
&lt;br /&gt;
From Güatebad to Güateworse, No comments...&lt;br /&gt;
&lt;br /&gt;
Buscando en Internet he encontrado este [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html API de Yahoo] comprobador de ortografía, aunque creo que por ahora sólo soporta el lenguage inglés pero sería interesante añadirlo al proyecto&lt;br /&gt;
&lt;br /&gt;
Searching on the web I crossed in my way with this spell checker [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html Yahoo´s API] , I think that it only supports English language by now althought it would be interesting to add it to the project&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
ESTO ES EL TRADUCTOR &amp;quot;un lío&amp;quot; por ahora... Necesito rehacer algunas cosas&lt;br /&gt;
&lt;br /&gt;
THIS IS THE TRANSLATOR &amp;quot;mess&amp;quot; by now... I need to redo some things&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Personal Translator&lt;br /&gt;
//Universal Translator (Mods made in Perry Mizin)&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//November 12, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Web Server Services powered by Google&lt;br /&gt;
//Variables&lt;br /&gt;
list requestedTranslations;&lt;br /&gt;
list tempDetections;&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
integer M = 1;&lt;br /&gt;
integer listenID;&lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
integer showTranslation = FALSE;&lt;br /&gt;
integer tranObjects = TRUE;&lt;br /&gt;
integer isInitialized = FALSE;&lt;br /&gt;
string  options;&lt;br /&gt;
key tempValue;&lt;br /&gt;
//Functions&lt;br /&gt;
integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex&lt;br /&gt;
{&lt;br /&gt;
	return ~llSubStringIndex(haystack, needle);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
sendIM(key imid, string imstr)&lt;br /&gt;
{	// llInstantMessage(key id , string message) causes the script to sleep for 2 seconds&lt;br /&gt;
	if (showTranslation == TRUE)&lt;br /&gt;
	{&lt;br /&gt;
		if (imid != llGetOwner())&lt;br /&gt;
		{&lt;br /&gt;
			llOwnerSay(imstr + &amp;quot; @&amp;quot; + llKey2Name(imid));  //llOwnerSay(string message) has no delay&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if (M == 8)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334420, imstr, imid);&lt;br /&gt;
		M = 1;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 7)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334430, imstr, imid);&lt;br /&gt;
		M = 8;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 6)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334440, imstr, imid);&lt;br /&gt;
		M = 7;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 5)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334450, imstr, imid);&lt;br /&gt;
		M = 6;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 4)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334460, imstr, imid);&lt;br /&gt;
		M = 5;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 3)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334470, imstr, imid);&lt;br /&gt;
		M = 4;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 2)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334480, imstr, imid);&lt;br /&gt;
		M = 3;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 1)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334490, imstr, imid);&lt;br /&gt;
		M = 2;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
detectLanguage(string dtcmsg, key dtckey)&lt;br /&gt;
{&lt;br /&gt;
	tempValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&amp;amp;q=&amp;quot; + llEscapeURL(dtcmsg), [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot; &amp;quot;);&lt;br /&gt;
	if (tempValue != NULL_KEY)&lt;br /&gt;
	{&lt;br /&gt;
		tempDetections = (tempDetections=[]) + tempDetections + [tempValue, dtckey];&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
Translate(integer chkn, string chkmsg, list chkli)&lt;br /&gt;
{&lt;br /&gt;
	key returnValue;&lt;br /&gt;
	returnValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&amp;amp;q=&amp;quot; + chkmsg, [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot;&amp;quot;);&lt;br /&gt;
	if (returnValue != NULL_KEY)&lt;br /&gt;
	{	//Translation&lt;br /&gt;
		requestedTranslations = (requestedTranslations=[]) + requestedTranslations + [returnValue, llList2CSV(chkli)];&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		llSleep(5.0); //Something has gone horribly wrong, sleep 5 seconds to clear throttle&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
string checkLanguage(string chklantmpStr)&lt;br /&gt;
{&lt;br /&gt;
	if (chklantmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;en&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	else if (chklantmpStr == &amp;quot;und&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;el&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	if (llGetSubString(chklantmpStr, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = llGetSubString(chklantmpStr, 0, 1);&lt;br /&gt;
	}&lt;br /&gt;
	return chklantmpStr;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
	integer avliPos;&lt;br /&gt;
	integer idNum;&lt;br /&gt;
	if (~llListFindList(agentsInTranslation, (list)avid))&lt;br /&gt;
	{&lt;br /&gt;
		avliPos = llListFindList(agentsInTranslation, (list)avid);&lt;br /&gt;
		agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, chklan], avliPos + 1, avliPos + 2);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		@at;&lt;br /&gt;
		idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
		if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
		{&lt;br /&gt;
			jump at;&lt;br /&gt;
		}&lt;br /&gt;
		agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, chklan, idNum];&lt;br /&gt;
		// llMessageLinked(LINK_THIS, 64562349, avlan, avid);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
string addNewAgent(key newavid)&lt;br /&gt;
{&lt;br /&gt;
	string speakerLan;&lt;br /&gt;
	if (llGetAgentSize(newavid) == ZERO_VECTOR)&lt;br /&gt;
	{&lt;br /&gt;
		speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
		addAgent(newavid, speakerLan, 4);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		speakerLan  = checkLanguage(llGetAgentLanguage(newavid));&lt;br /&gt;
		if (speakerLan == &amp;quot;&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
			addAgent(newavid, speakerLan, 0);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			addAgent(newavid, speakerLan, 0);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return speakerLan;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
	if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
	{&lt;br /&gt;
		integer gkliPos = llListFindList(agentsInTranslation, (list)agentID);&lt;br /&gt;
		return llList2Key(agentsInTranslation, gkliPos - 3);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		return &amp;quot;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
processHTTPResponse(integer ntype, string bodyStr, list httli)&lt;br /&gt;
{&lt;br /&gt;
	key     recepientID;&lt;br /&gt;
	key     speakerID;&lt;br /&gt;
	list    paramtmpli;&lt;br /&gt;
	list    recepientList;&lt;br /&gt;
	string  recepientLanguage;&lt;br /&gt;
	string  languagePair;&lt;br /&gt;
	string  speakerName;&lt;br /&gt;
	string  speakerLanguage;&lt;br /&gt;
	string  translatedText;&lt;br /&gt;
	string  lantmpStr;&lt;br /&gt;
	integer z;	&lt;br /&gt;
	//===================&lt;br /&gt;
	//Process Translation&lt;br /&gt;
	//===================&lt;br /&gt;
	speakerID  = llList2Key(httli, 1);&lt;br /&gt;
	speakerName = llKey2Name(speakerID);&lt;br /&gt;
	if (speakerName == &amp;quot;&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
	}&lt;br /&gt;
	recepientList = llParseString2List(llList2String(httli, 2), [&amp;quot;@&amp;quot;], []);&lt;br /&gt;
	paramtmpli = llParseStringKeepNulls(llList2String(httli, 3), [&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
	recepientLanguage = llList2String(paramtmpli, 1);&lt;br /&gt;
	languagePair = llDumpList2String(paramtmpli, &amp;quot;&amp;gt;&amp;gt;&amp;quot;);&lt;br /&gt;
	//Perform Text Cleanup&lt;br /&gt;
	translatedText = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;detectedSourceLanguage\&amp;quot;:\&amp;quot;&amp;quot;));&lt;br /&gt;
	//Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
	if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
	{&lt;br /&gt;
		lantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
		for(z = llStringLength(translatedText);z &amp;gt;= 0; z--)&lt;br /&gt;
		{&lt;br /&gt;
			lantmpStr = (lantmpStr=&amp;quot;&amp;quot;) + lantmpStr + llGetSubString(translatedText, z, z);&lt;br /&gt;
		}&lt;br /&gt;
		translatedText = lantmpStr;&lt;br /&gt;
	}&lt;br /&gt;
	lantmpStr = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
	for (z = 0; z &amp;lt; llGetListLength(recepientList); z += 1)&lt;br /&gt;
	{&lt;br /&gt;
		recepientID = getAgentKey(llList2Integer(recepientList, z));&lt;br /&gt;
		if (recepientID != &amp;quot;&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, [recepientID]) + 1);&lt;br /&gt;
			if (recepientLanguage == speakerLanguage)&lt;br /&gt;
			{ }&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				sendIM(recepientID, lantmpStr);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(5);&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
	{&lt;br /&gt;
		list ltmpli;&lt;br /&gt;
		if (num == 8434532)&lt;br /&gt;
		{&lt;br /&gt;
			enabled = (integer)lstr;&lt;br /&gt;
		}&lt;br /&gt;
		else if (num == 3342976)&lt;br /&gt;
		{	//Send Preferences&lt;br /&gt;
			options = lstr;&lt;br /&gt;
			if (isInitialized == FALSE) return;&lt;br /&gt;
			ltmpli = llCSV2List(options);&lt;br /&gt;
			showTranslation = llList2Integer(ltmpli, 0);&lt;br /&gt;
			tranObjects = llList2Integer(ltmpli, 1);&lt;br /&gt;
			autoLanguage = llList2Integer(ltmpli, 2);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	sensor(integer num_detected)&lt;br /&gt;
	{&lt;br /&gt;
		integer s;&lt;br /&gt;
		key sid;&lt;br /&gt;
		for (s = 0; s &amp;lt; num_detected; s += 1)&lt;br /&gt;
		{&lt;br /&gt;
			sid = llDetectedKey(s);&lt;br /&gt;
			if (~llListFindList(agentsInTranslation, (list)sid))&lt;br /&gt;
			{ }&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				addNewAgent(sid);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	no_sensor()&lt;br /&gt;
	{ }&lt;br /&gt;
 &lt;br /&gt;
	listen(integer channel, string name, key id, string message)&lt;br /&gt;
	{&lt;br /&gt;
		integer w;&lt;br /&gt;
		string  spkrLan;&lt;br /&gt;
		string  recepLan;&lt;br /&gt;
		integer recepID;&lt;br /&gt;
		integer lstliPos;&lt;br /&gt;
		string  lanpair;&lt;br /&gt;
		list    translationCache;&lt;br /&gt;
		//Translator Engine Code&lt;br /&gt;
		if ((!enabled) &amp;amp;&amp;amp; (isMaster == 1))&lt;br /&gt;
		{&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (!tranObjects)&lt;br /&gt;
		{&lt;br /&gt;
			if (llGetAgentSize(id) == ZERO_VECTOR)&lt;br /&gt;
			{&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				detectLanguage(message, id);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			detectLanguage(message, id);&lt;br /&gt;
		}&lt;br /&gt;
		if (~llListFindList(agentsInTranslation, (list)id))&lt;br /&gt;
		{&lt;br /&gt;
			lstliPos = llListFindList(agentsInTranslation, (list)id);&lt;br /&gt;
			spkrLan = llList2String(agentsInTranslation, lstliPos + 1);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			spkrLan = addNewAgent(id);&lt;br /&gt;
		}&lt;br /&gt;
		//===============================&lt;br /&gt;
		//Formulate Translation Requests&lt;br /&gt;
		//===============================&lt;br /&gt;
		if (id == llGetOwner())&lt;br /&gt;
		{	// If speaker is owner&lt;br /&gt;
			// I will do this dirty cheat by now&lt;br /&gt;
			// There should exist another clean way to filter speakers &amp;amp; receivers, I need to think about this&lt;br /&gt;
			for (w = 0; w &amp;lt; llGetListLength(agentsInTranslation); w += 4)&lt;br /&gt;
			{	//Loop through translation group and do appropriate translations as needed&lt;br /&gt;
				recepID = llList2Integer(agentsInTranslation, w + 3);&lt;br /&gt;
				recepLan =  checkLanguage(llList2String(agentsInTranslation, w + 1));&lt;br /&gt;
				if (spkrLan == recepLan)&lt;br /&gt;
				{ }&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
					if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
					{&lt;br /&gt;
						lstliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
						translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			if (translationCache != [])&lt;br /&gt;
			{	//Process Requests&lt;br /&gt;
				for (w = 0; w &amp;lt; llGetListLength(translationCache); w += 2)&lt;br /&gt;
				{	//====================================&lt;br /&gt;
					//Translation&lt;br /&gt;
					//====================================&lt;br /&gt;
					//Forumulate and Send Translation Request&lt;br /&gt;
					lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, w), [&amp;quot;|&amp;quot;],[]), 1);&lt;br /&gt;
					Translate(0, llEscapeURL(message) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, w + 1), llList2String(translationCache, w)]);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{	// if speaker is not owner&lt;br /&gt;
			lstliPos = llListFindList(agentsInTranslation, (list)llGetOwner());&lt;br /&gt;
			recepID = llList2Integer(agentsInTranslation, lstliPos + 3);&lt;br /&gt;
			recepLan =  checkLanguage(llList2String(agentsInTranslation , lstliPos + 1 ));&lt;br /&gt;
			if (spkrLan == recepLan)&lt;br /&gt;
			{ }&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
				if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
				{&lt;br /&gt;
					lstliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
					translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];&lt;br /&gt;
				}&lt;br /&gt;
				if (translationCache != [])&lt;br /&gt;
				{	//====================================&lt;br /&gt;
					//Translation&lt;br /&gt;
					//====================================&lt;br /&gt;
					//Forumulate and Send Translation Request&lt;br /&gt;
					lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, lstliPos), [&amp;quot;|&amp;quot;],[]), 1);&lt;br /&gt;
					Translate(0, llEscapeURL(message) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, lstliPos + 1), llList2String(translationCache, lstliPos)]);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
	{	//Process Response Code&lt;br /&gt;
		integer httliPos;&lt;br /&gt;
		if (~llListFindList(requestedTranslations, (list)request_id))&lt;br /&gt;
		{&lt;br /&gt;
			httliPos = llListFindList(requestedTranslations, [request_id]);&lt;br /&gt;
			processHTTPResponse(0, body, llCSV2List(llList2String(requestedTranslations, httliPos + 1)));&lt;br /&gt;
			requestedTranslations = llDeleteSubList(requestedTranslations, httliPos, httliPos + 1);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (~llListFindList(tempDetections, (list)request_id))&lt;br /&gt;
		{	// We Trust the Google system, the Google´s guys are good and I am sure they will keep improving :-)&lt;br /&gt;
			integer tmpliPos = llListFindList(tempDetections, (list)request_id);&lt;br /&gt;
			key speakerID = llList2Key(tempDetections, tmpliPos + 1);&lt;br /&gt;
			tempDetections = llDeleteSubList(tempDetections, tmpliPos, tmpliPos + 3);&lt;br /&gt;
			string htttmpStr = llToLower(llGetSubString(body, llSubStringIndex(body, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(body, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
			if (contains(htttmpStr, &amp;quot;err&amp;quot;) == 0 &amp;amp;&amp;amp; contains(htttmpStr, &amp;quot;unn&amp;quot;) == 0)&lt;br /&gt;
			{	// if detects any language&lt;br /&gt;
				htttmpStr = checkLanguage(htttmpStr);&lt;br /&gt;
				if (~llListFindList(agentsInTranslation, (list)speakerID))&lt;br /&gt;
				{&lt;br /&gt;
					integer tmpavliPos = llListFindList(agentsInTranslation, (list)speakerID);&lt;br /&gt;
					string actlan = llList2String(agentsInTranslation, tmpavliPos + 1);&lt;br /&gt;
					if (llList2Integer(agentsInTranslation, tmpavliPos + 2) &amp;gt;= 3)&lt;br /&gt;
					{	// if anyone speaks on any different language 3 times in a row&lt;br /&gt;
						addAgent(speakerID, htttmpStr, 0);&lt;br /&gt;
					}&lt;br /&gt;
					if (actlan == htttmpStr)&lt;br /&gt;
					{	// reset language checker for speaker&lt;br /&gt;
						agentsInTranslation = llListReplaceList(agentsInTranslation,[0], tmpavliPos + 2, tmpavliPos + 2);&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{	// if language of speaker is not the same as detected language&lt;br /&gt;
						agentsInTranslation = llListReplaceList(agentsInTranslation,[llList2Integer(agentsInTranslation,tmpavliPos + 2) + 1] , tmpavliPos + 2, tmpavliPos + 2);&lt;br /&gt;
					}											}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	timer()&lt;br /&gt;
	{&lt;br /&gt;
		integer r;&lt;br /&gt;
		vector  tmrVct;&lt;br /&gt;
		list  newList;&lt;br /&gt;
		float timeElapsed;&lt;br /&gt;
		llSetTimerEvent(0.0); // we better reset timer by way of precaution&lt;br /&gt;
		if (isInitialized == FALSE)&lt;br /&gt;
		{&lt;br /&gt;
			enabled = TRUE;&lt;br /&gt;
			listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
			llMessageLinked(LINK_THIS, 6877259, (string)enabled, NULL_KEY);&lt;br /&gt;
			isInitialized = TRUE;&lt;br /&gt;
			string mylanguage = llGetAgentLanguage(llGetOwner());&lt;br /&gt;
			if (llStringLength(mylanguage) &amp;lt; 1)&lt;br /&gt;
			{&lt;br /&gt;
				mylanguage = &amp;quot;en&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			if(~llListFindList(agentsInTranslation, (list)llGetOwner()))&lt;br /&gt;
			{&lt;br /&gt;
				integer ownerliPos = llListFindList(agentsInTranslation, (list)llGetOwner());&lt;br /&gt;
				agentsInTranslation = llListReplaceList(agentsInTranslation, [mylanguage] , ownerliPos + 1, ownerliPos + 1);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [llGetOwner() , mylanguage , 0 , llRound(llFrand(2000000)) + 1];&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		for (r = 0; r &amp;lt; llGetListLength(tempDetections); r += 2)&lt;br /&gt;
		{&lt;br /&gt;
			timeElapsed = llGetTime() - llList2Float(llCSV2List(llList2String(tempDetections, r + 1)), 0);&lt;br /&gt;
			if (timeElapsed &amp;lt; 30.0)&lt;br /&gt;
			{&lt;br /&gt;
				newList = (newList=[]) + newList + llList2List(tempDetections, r, r + 1);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		tempDetections = newList;&lt;br /&gt;
		newList = [];&lt;br /&gt;
		for (r = 0; r &amp;lt; llGetListLength(requestedTranslations); r += 2)&lt;br /&gt;
		{&lt;br /&gt;
			timeElapsed = llGetTime() - llList2Float(llCSV2List(llList2String(requestedTranslations, r + 1)), 0);&lt;br /&gt;
			if (timeElapsed &amp;lt; 30.0)&lt;br /&gt;
			{&lt;br /&gt;
				newList = (newList=[]) + newList + llList2List(requestedTranslations, r, r + 1);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		requestedTranslations = newList;&lt;br /&gt;
		newList = [];&lt;br /&gt;
		if (isMaster &amp;gt; 0)&lt;br /&gt;
		{&lt;br /&gt;
			for (r = 0; r &amp;lt; llGetListLength(agentsInTranslation) r += 4)&lt;br /&gt;
			{&lt;br /&gt;
				tmrVct = llList2Vector(llGetObjectDetails(llList2Key(agentsInTranslation, r), [OBJECT_POS]), 0);&lt;br /&gt;
				if (llVecDist(llGetPos(), tmrVct) &amp;lt;= 20.0)&lt;br /&gt;
				{&lt;br /&gt;
					newList = (newList=[]) + newList + llList2List(agentsInTranslation, r, r + 3);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			agentsInTranslation = newList;&lt;br /&gt;
			newList = [];&lt;br /&gt;
		}&lt;br /&gt;
		if ((autoLanguage) &amp;amp;&amp;amp; isMaster &amp;gt; 0)&lt;br /&gt;
		{&lt;br /&gt;
			llSensor(&amp;quot;&amp;quot;, NULL_KEY, AGENT, 20.0, PI);&lt;br /&gt;
		}&lt;br /&gt;
		llSetTimerEvent(4.0); // restart timer&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=690643</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=690643"/>
		<updated>2009-12-20T11:01:31Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: /* OK */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribucion al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente codigo fué originalmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mi manera...&lt;br /&gt;
No os riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;OK&#039;&#039; ===&lt;br /&gt;
Bueno, despues de respiñar todo lo que he podido, creo que el uso de memoria y la velocidad estan practicamente igual que en la version original pero bueno... en la variedad está el gusto no?&lt;br /&gt;
Ya he probado un poco el codigo, y parece que funciona aunque estoy teniendo algunos problemas... Por ejemplo creo que el sistema de traduccion no funciona correctamente, y no me refiero al sistema de traduccion de Google (en mi opinion, si no es el mejor, es uno de los mejores del mundo), sino a que aun queda mucho trabajo por hacer en el script...&lt;br /&gt;
&lt;br /&gt;
El siguiente paso sera intentar dividir el script en dos, o si es posible en tres para repartir el uso de memoria. Tambien me gustaria probar un truco que uso a menudo para traducir paginas en un idioma que no entiendo, lo que hago es que en vez de traducir directamente al español, primero lo traduzco a inglés, y luego desde inglés al español, parece una tonteria y un gasto innecesario, pero si lo hago es porque así suelo entender mejor las traducciones.&lt;br /&gt;
Quiero por un lado el sistema de comunicacion y evaluacion entre traductores, y por otro el sistema de traduccion entre avatares, ¿es muy dificil? no se ya lo veremos...&lt;br /&gt;
&lt;br /&gt;
Well, after saving as much as I could, I think the memory usage and the speed are technically the same as in the original script, but well, in the variety is the taste, isnt it?. &lt;br /&gt;
I have tested a bit the code above already, and it seems to work altought i´m having some problems...&lt;br /&gt;
For instance i think the translation system is not working properly, and i dont mean the Google´s translation system (in my opinion, if is not the best, one of the bests), but that there is still much work to do in the script...&lt;br /&gt;
&lt;br /&gt;
The next step will be to try to divide the script in 2, or 3 if is possible, so we can spread the memory usage. Also I would like to test a trick i use often for to translate languages that i dont understand, what I do first is to translate that language into English, and then from English to Spanish, it seems a nonsense and unnecesary waste, but if i do it is becouse so i usually understand the translations better.&lt;br /&gt;
I want by one part the translators communications and evaluation system, and by other the translation system between avatars, is it very difficult? I don´t know , we will see...&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Es dificil... me está costando pero ya veremos...&lt;br /&gt;
Its difficult... i am struggling but we will see...&lt;br /&gt;
&lt;br /&gt;
chu chu chu&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
De Güatemala a Güatepeor, Sin comentarios...&lt;br /&gt;
&lt;br /&gt;
From Güatebad to Güateworse, No comments...&lt;br /&gt;
&lt;br /&gt;
Buscando en Internet he encontrado este [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html API de Yahoo] comprobador de ortografía, aunque creo que por ahora sólo soporta el lenguage inglés pero sería interesante añadirlo al proyecto&lt;br /&gt;
&lt;br /&gt;
Searching on the web I crossed in my way with this spell checker [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html Yahoo´s API] , I think that it only supports English language by now althought it would be interesting to add it to the project&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
ESTO ES EL TRADUCTOR &amp;quot;un lío&amp;quot; por ahora... Necesito limpiar el codigo y rehacer algunas cosas&lt;br /&gt;
&lt;br /&gt;
THIS IS THE TRANSLATOR &amp;quot;mess&amp;quot; by now... I need to clean the code and rework some things&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Personal Translator&lt;br /&gt;
//Universal Translator (Mods made in Perry Mizin)&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//November 12, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Web Server Services powered by Google&lt;br /&gt;
//Variables&lt;br /&gt;
list requestedTranslations;&lt;br /&gt;
list tempDetections;&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
integer M = 1;&lt;br /&gt;
integer listenID;&lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
integer showTranslation = FALSE;&lt;br /&gt;
integer tranObjects = TRUE;&lt;br /&gt;
integer isInitialized = FALSE;&lt;br /&gt;
string  options;&lt;br /&gt;
key tempValue;&lt;br /&gt;
//Functions&lt;br /&gt;
integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex&lt;br /&gt;
{&lt;br /&gt;
	return ~llSubStringIndex(haystack, needle);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
sendIM(key imid, string imstr)&lt;br /&gt;
{	// llInstantMessage(key id , string message) causes the script to sleep for 2 seconds&lt;br /&gt;
	if (showTranslation == TRUE)&lt;br /&gt;
	{&lt;br /&gt;
		if (imid != llGetOwner())&lt;br /&gt;
		{&lt;br /&gt;
			llOwnerSay(imstr + &amp;quot; @&amp;quot; + llKey2Name(imid));  //llOwnerSay(string message) has no delay&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if (M == 8)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334420, imstr, imid);&lt;br /&gt;
		M = 1;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 7)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334430, imstr, imid);&lt;br /&gt;
		M = 8;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 6)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334440, imstr, imid);&lt;br /&gt;
		M = 7;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 5)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334450, imstr, imid);&lt;br /&gt;
		M = 6;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 4)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334460, imstr, imid);&lt;br /&gt;
		M = 5;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 3)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334470, imstr, imid);&lt;br /&gt;
		M = 4;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 2)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334480, imstr, imid);&lt;br /&gt;
		M = 3;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 1)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334490, imstr, imid);&lt;br /&gt;
		M = 2;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
detectLanguage(string dtcmsg, key dtckey)&lt;br /&gt;
{&lt;br /&gt;
	tempValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&amp;amp;q=&amp;quot; + llEscapeURL(dtcmsg), [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot; &amp;quot;);&lt;br /&gt;
	if (tempValue != NULL_KEY)&lt;br /&gt;
	{&lt;br /&gt;
		tempDetections = (tempDetections=[]) + tempDetections + [tempValue, dtckey];&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
Translate(integer chkn, string chkmsg, list chkli)&lt;br /&gt;
{&lt;br /&gt;
	key returnValue;&lt;br /&gt;
	returnValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&amp;amp;q=&amp;quot; + chkmsg, [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot;&amp;quot;);&lt;br /&gt;
	if (returnValue != NULL_KEY)&lt;br /&gt;
	{	//Translation&lt;br /&gt;
		requestedTranslations = (requestedTranslations=[]) + requestedTranslations + [returnValue, llList2CSV(chkli)];&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		llSleep(5.0); //Something has gone horribly wrong, sleep 5 seconds to clear throttle&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
string checkLanguage(string chklantmpStr)&lt;br /&gt;
{&lt;br /&gt;
	if (chklantmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;en&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	else if (chklantmpStr == &amp;quot;und&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;el&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	if (llGetSubString(chklantmpStr, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = llGetSubString(chklantmpStr, 0, 1);&lt;br /&gt;
	}&lt;br /&gt;
	return chklantmpStr;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
	integer avliPos;&lt;br /&gt;
	integer idNum;&lt;br /&gt;
	if (~llListFindList(agentsInTranslation, (list)avid))&lt;br /&gt;
	{&lt;br /&gt;
		avliPos = llListFindList(agentsInTranslation, (list)avid);&lt;br /&gt;
		agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, chklan], avliPos + 1, avliPos + 2);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		@at;&lt;br /&gt;
		idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
		if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
		{&lt;br /&gt;
			jump at;&lt;br /&gt;
		}&lt;br /&gt;
		agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, chklan, idNum];&lt;br /&gt;
		// llMessageLinked(LINK_THIS, 64562349, avlan, avid);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
string addNewAgent(key newavid)&lt;br /&gt;
{&lt;br /&gt;
	string speakerLan;&lt;br /&gt;
	if (llGetAgentSize(newavid) == ZERO_VECTOR)&lt;br /&gt;
	{&lt;br /&gt;
		speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
		addAgent(newavid, speakerLan, 4);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		speakerLan  = checkLanguage(llGetAgentLanguage(newavid));&lt;br /&gt;
		if (speakerLan == &amp;quot;&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
			addAgent(newavid, speakerLan, 0);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			addAgent(newavid, speakerLan, 0);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return speakerLan;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
	if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
	{&lt;br /&gt;
		integer gkliPos = llListFindList(agentsInTranslation, (list)agentID);&lt;br /&gt;
		return llList2Key(agentsInTranslation, gkliPos - 3);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		return &amp;quot;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
processHTTPResponse(integer ntype, string bodyStr, list httli)&lt;br /&gt;
{&lt;br /&gt;
	key     recepientID;&lt;br /&gt;
	key     speakerID;&lt;br /&gt;
	list    paramtmpli;&lt;br /&gt;
	list    recepientList;&lt;br /&gt;
	string  recepientLanguage;&lt;br /&gt;
	string  languagePair;&lt;br /&gt;
	string  speakerName;&lt;br /&gt;
	string  speakerLanguage;&lt;br /&gt;
	string  translatedText;&lt;br /&gt;
	string  lantmpStr;&lt;br /&gt;
	integer z;	&lt;br /&gt;
	//===================&lt;br /&gt;
	//Process Translation&lt;br /&gt;
	//===================&lt;br /&gt;
	speakerID  = llList2Key(httli, 1);&lt;br /&gt;
	speakerName = llKey2Name(speakerID);&lt;br /&gt;
	if (speakerName == &amp;quot;&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
	}&lt;br /&gt;
	recepientList = llParseString2List(llList2String(httli, 2), [&amp;quot;@&amp;quot;], []);&lt;br /&gt;
	paramtmpli = llParseStringKeepNulls(llList2String(httli, 3), [&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
	recepientLanguage = llList2String(paramtmpli, 1);&lt;br /&gt;
	languagePair = llDumpList2String(paramtmpli, &amp;quot;&amp;gt;&amp;gt;&amp;quot;);&lt;br /&gt;
	//Perform Text Cleanup&lt;br /&gt;
	translatedText = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;detectedSourceLanguage\&amp;quot;:\&amp;quot;&amp;quot;));&lt;br /&gt;
	//Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
	if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
	{&lt;br /&gt;
		lantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
		for(z = llStringLength(translatedText);z &amp;gt;= 0; z--)&lt;br /&gt;
		{&lt;br /&gt;
			lantmpStr = (lantmpStr=&amp;quot;&amp;quot;) + lantmpStr + llGetSubString(translatedText, z, z);&lt;br /&gt;
		}&lt;br /&gt;
		translatedText = lantmpStr;&lt;br /&gt;
	}&lt;br /&gt;
	lantmpStr = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
	for (z = 0; z &amp;lt; llGetListLength(recepientList); z += 1)&lt;br /&gt;
	{&lt;br /&gt;
		recepientID = getAgentKey(llList2Integer(recepientList, z));&lt;br /&gt;
		if (recepientID != &amp;quot;&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, [recepientID]) + 1);&lt;br /&gt;
			if (recepientLanguage == speakerLanguage)&lt;br /&gt;
			{ }&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				sendIM(recepientID, lantmpStr);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(5);&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
	{&lt;br /&gt;
		list ltmpli;&lt;br /&gt;
		if (num == 8434532)&lt;br /&gt;
		{&lt;br /&gt;
			enabled = (integer)lstr;&lt;br /&gt;
		}&lt;br /&gt;
		else if (num == 3342976)&lt;br /&gt;
		{	//Send Preferences&lt;br /&gt;
			options = lstr;&lt;br /&gt;
			if (isInitialized == FALSE) return;&lt;br /&gt;
			ltmpli = llCSV2List(options);&lt;br /&gt;
			showTranslation = llList2Integer(ltmpli, 0);&lt;br /&gt;
			tranObjects = llList2Integer(ltmpli, 1);&lt;br /&gt;
			autoLanguage = llList2Integer(ltmpli, 2);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	sensor(integer num_detected)&lt;br /&gt;
	{&lt;br /&gt;
		integer s;&lt;br /&gt;
		key sid;&lt;br /&gt;
		for (s = 0; s &amp;lt; num_detected; s += 1)&lt;br /&gt;
		{&lt;br /&gt;
			sid = llDetectedKey(s);&lt;br /&gt;
			if (~llListFindList(agentsInTranslation, (list)sid))&lt;br /&gt;
			{ }&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				addNewAgent(sid);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	no_sensor()&lt;br /&gt;
	{ }&lt;br /&gt;
 &lt;br /&gt;
	listen(integer channel, string name, key id, string message)&lt;br /&gt;
	{&lt;br /&gt;
		integer w;&lt;br /&gt;
		string  spkrLan;&lt;br /&gt;
		string  recepLan;&lt;br /&gt;
		integer recepID;&lt;br /&gt;
		integer lstliPos;&lt;br /&gt;
		string  lanpair;&lt;br /&gt;
		list    translationCache;&lt;br /&gt;
		//Translator Engine Code&lt;br /&gt;
		if ((!enabled) &amp;amp;&amp;amp; (isMaster == 1))&lt;br /&gt;
		{&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (!tranObjects)&lt;br /&gt;
		{&lt;br /&gt;
			if (llGetAgentSize(id) == ZERO_VECTOR)&lt;br /&gt;
			{&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				detectLanguage(message, id);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			detectLanguage(message, id);&lt;br /&gt;
		}&lt;br /&gt;
		if (~llListFindList(agentsInTranslation, (list)id))&lt;br /&gt;
		{&lt;br /&gt;
			lstliPos = llListFindList(agentsInTranslation, (list)id);&lt;br /&gt;
			spkrLan = llList2String(agentsInTranslation, lstliPos + 1);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			spkrLan = addNewAgent(id);&lt;br /&gt;
		}&lt;br /&gt;
		//===============================&lt;br /&gt;
		//Formulate Translation Requests&lt;br /&gt;
		//===============================&lt;br /&gt;
		if (id == llGetOwner())&lt;br /&gt;
		{	// If speaker is owner&lt;br /&gt;
			// I will do this dirty cheat by now&lt;br /&gt;
			// There should exist another clean way to filter speakers &amp;amp; receivers, I need to think about this&lt;br /&gt;
			for (w = 0; w &amp;lt; llGetListLength(agentsInTranslation); w += 4)&lt;br /&gt;
			{	//Loop through translation group and do appropriate translations as needed&lt;br /&gt;
				recepID = llList2Integer(agentsInTranslation, w + 3);&lt;br /&gt;
				recepLan =  checkLanguage(llList2String(agentsInTranslation, w + 1));&lt;br /&gt;
				if (spkrLan == recepLan)&lt;br /&gt;
				{ }&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
					if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
					{&lt;br /&gt;
						lstliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
						translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			if (translationCache != [])&lt;br /&gt;
			{	//Process Requests&lt;br /&gt;
				for (w = 0; w &amp;lt; llGetListLength(translationCache); w += 2)&lt;br /&gt;
				{	//====================================&lt;br /&gt;
					//Translation&lt;br /&gt;
					//====================================&lt;br /&gt;
					//Forumulate and Send Translation Request&lt;br /&gt;
					lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, w), [&amp;quot;|&amp;quot;],[]), 1);&lt;br /&gt;
					Translate(0, llEscapeURL(message) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, w + 1), llList2String(translationCache, w)]);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{	// if speaker is not owner&lt;br /&gt;
			lstliPos = llListFindList(agentsInTranslation, (list)llGetOwner());&lt;br /&gt;
			recepID = llList2Integer(agentsInTranslation, lstliPos + 3);&lt;br /&gt;
			recepLan =  checkLanguage(llList2String(agentsInTranslation , lstliPos + 1 ));&lt;br /&gt;
			if (spkrLan == recepLan)&lt;br /&gt;
			{ }&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
				if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
				{&lt;br /&gt;
					lstliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
					translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];&lt;br /&gt;
				}&lt;br /&gt;
				if (translationCache != [])&lt;br /&gt;
				{	//====================================&lt;br /&gt;
					//Translation&lt;br /&gt;
					//====================================&lt;br /&gt;
					//Forumulate and Send Translation Request&lt;br /&gt;
					lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, lstliPos), [&amp;quot;|&amp;quot;],[]), 1);&lt;br /&gt;
					Translate(0, llEscapeURL(message) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, lstliPos + 1), llList2String(translationCache, lstliPos)]);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
	{	//Process Response Code&lt;br /&gt;
		integer httliPos;&lt;br /&gt;
		if (~llListFindList(requestedTranslations, (list)request_id))&lt;br /&gt;
		{&lt;br /&gt;
			httliPos = llListFindList(requestedTranslations, [request_id]);&lt;br /&gt;
			processHTTPResponse(0, body, llCSV2List(llList2String(requestedTranslations, httliPos + 1)));&lt;br /&gt;
			requestedTranslations = llDeleteSubList(requestedTranslations, httliPos, httliPos + 1);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (~llListFindList(tempDetections, (list)request_id))&lt;br /&gt;
		{	// We Trust the Google system, the Google´s guys are good and I am sure they will keep improving :-)&lt;br /&gt;
			integer tmpliPos = llListFindList(tempDetections, (list)request_id);&lt;br /&gt;
			key speakerID = llList2Key(tempDetections, tmpliPos + 1);&lt;br /&gt;
			tempDetections = llDeleteSubList(tempDetections, tmpliPos, tmpliPos + 3);&lt;br /&gt;
			string htttmpStr = llToLower(llGetSubString(body, llSubStringIndex(body, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(body, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
			if (contains(htttmpStr, &amp;quot;err&amp;quot;) == 0 &amp;amp;&amp;amp; contains(htttmpStr, &amp;quot;unn&amp;quot;) == 0)&lt;br /&gt;
			{	// if detects any language&lt;br /&gt;
				htttmpStr = checkLanguage(htttmpStr);&lt;br /&gt;
				if (~llListFindList(agentsInTranslation, (list)speakerID))&lt;br /&gt;
				{&lt;br /&gt;
					integer tmpavliPos = llListFindList(agentsInTranslation, (list)speakerID);&lt;br /&gt;
					string actlan = llList2String(agentsInTranslation, tmpavliPos + 1);&lt;br /&gt;
					if (llList2Integer(agentsInTranslation, tmpavliPos + 2) &amp;gt;= 3)&lt;br /&gt;
					{	// if anyone speaks on any different language 3 times in a row&lt;br /&gt;
						addAgent(speakerID, htttmpStr, 0);&lt;br /&gt;
					}&lt;br /&gt;
					if (actlan == htttmpStr)&lt;br /&gt;
					{	// reset language checker for speaker&lt;br /&gt;
						agentsInTranslation = llListReplaceList(agentsInTranslation,[0], tmpavliPos + 2, tmpavliPos + 2);&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{	// if language of speaker is not the same as detected language&lt;br /&gt;
						agentsInTranslation = llListReplaceList(agentsInTranslation,[llList2Integer(agentsInTranslation,tmpavliPos + 2) + 1] , tmpavliPos + 2, tmpavliPos + 2);&lt;br /&gt;
					}											}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	timer()&lt;br /&gt;
	{&lt;br /&gt;
		integer r;&lt;br /&gt;
		vector  tmrVct;&lt;br /&gt;
		list  newList;&lt;br /&gt;
		float timeElapsed;&lt;br /&gt;
		llSetTimerEvent(0.0); // we better reset timer by way of precaution&lt;br /&gt;
		if (isInitialized == FALSE)&lt;br /&gt;
		{&lt;br /&gt;
			enabled = TRUE;&lt;br /&gt;
			listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
			llMessageLinked(LINK_THIS, 6877259, (string)enabled, NULL_KEY);&lt;br /&gt;
			isInitialized = TRUE;&lt;br /&gt;
			string mylanguage = llGetAgentLanguage(llGetOwner());&lt;br /&gt;
			if (llStringLength(mylanguage) &amp;lt; 1)&lt;br /&gt;
			{&lt;br /&gt;
				mylanguage = &amp;quot;en&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			if(~llListFindList(agentsInTranslation, (list)llGetOwner()))&lt;br /&gt;
			{&lt;br /&gt;
				integer ownerliPos = llListFindList(agentsInTranslation, (list)llGetOwner());&lt;br /&gt;
				agentsInTranslation = llListReplaceList(agentsInTranslation, [mylanguage] , ownerliPos + 1, ownerliPos + 1);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [llGetOwner() , mylanguage , 0 , llRound(llFrand(2000000)) + 1];&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		for (r = 0; r &amp;lt; llGetListLength(tempDetections); r += 2)&lt;br /&gt;
		{&lt;br /&gt;
			timeElapsed = llGetTime() - llList2Float(llCSV2List(llList2String(tempDetections, r + 1)), 0);&lt;br /&gt;
			if (timeElapsed &amp;lt; 30.0)&lt;br /&gt;
			{&lt;br /&gt;
				newList = (newList=[]) + newList + llList2List(tempDetections, r, r + 1);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		tempDetections = newList;&lt;br /&gt;
		newList = [];&lt;br /&gt;
		for (r = 0; r &amp;lt; llGetListLength(requestedTranslations); r += 2)&lt;br /&gt;
		{&lt;br /&gt;
			timeElapsed = llGetTime() - llList2Float(llCSV2List(llList2String(requestedTranslations, r + 1)), 0);&lt;br /&gt;
			if (timeElapsed &amp;lt; 30.0)&lt;br /&gt;
			{&lt;br /&gt;
				newList = (newList=[]) + newList + llList2List(requestedTranslations, r, r + 1);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		requestedTranslations = newList;&lt;br /&gt;
		newList = [];&lt;br /&gt;
		if (isMaster &amp;gt; 0)&lt;br /&gt;
		{&lt;br /&gt;
			for (r = 0; r &amp;lt; llGetListLength(agentsInTranslation) r += 4)&lt;br /&gt;
			{&lt;br /&gt;
				tmrVct = llList2Vector(llGetObjectDetails(llList2Key(agentsInTranslation, r), [OBJECT_POS]), 0);&lt;br /&gt;
				if (llVecDist(llGetPos(), tmrVct) &amp;lt;= 20.0)&lt;br /&gt;
				{&lt;br /&gt;
					newList = (newList=[]) + newList + llList2List(agentsInTranslation, r, r + 3);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			agentsInTranslation = newList;&lt;br /&gt;
			newList = [];&lt;br /&gt;
		}&lt;br /&gt;
		if ((autoLanguage) &amp;amp;&amp;amp; isMaster &amp;gt; 0)&lt;br /&gt;
		{&lt;br /&gt;
			llSensor(&amp;quot;&amp;quot;, NULL_KEY, AGENT, 20.0, PI);&lt;br /&gt;
		}&lt;br /&gt;
		llSetTimerEvent(4.0); // restart timer&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=690633</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=690633"/>
		<updated>2009-12-20T10:40:40Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: /* OK */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribucion al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente codigo fué originalmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mi manera...&lt;br /&gt;
No os riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;OK&#039;&#039; ===&lt;br /&gt;
Bueno, despues de respiñar todo lo que he podido, creo que el uso de memoria y la velocidad estan practicamente igual que en la version original pero bueno... en la variedad está el gusto no?&lt;br /&gt;
Ya he probado un poco el codigo, y parece que funciona aunque estoy teniendo algunos problemas... Por ejemplo creo que el sistema de traduccion no funciona correctamente, y no me refiero al sistema de traduccion de Google (en mi opinion, si no es el mejor, es uno de los mejores del mundo), sino a que aun queda mucho trabajo por hacer en el script...&lt;br /&gt;
&lt;br /&gt;
El siguiente paso sera intentar dividir el script en dos, o si es posible en tres para repartir el uso de memoria. Tambien me gustaria probar un truco que uso a menudo para traducir paginas en un idioma que no entiendo, lo que hago es que en vez de traducir directamente al español, primero lo traduzco a inglés, y luego desde inglés al español, parece una tonteria y un gasto innecesario, pero si lo hago es porque así suelo entender mejor las traducciones.&lt;br /&gt;
Quiero por un lado el sistema de comunicacion y evaluacion entre traductores, y por otro el sistema de traduccion entre avatares, ¿es muy dificil? no se ya lo veremos...&lt;br /&gt;
&lt;br /&gt;
Well, after saving as much as I could, I think the memory usage and the speed are technically the same as in the original script, but well, in the variety is the taste, isnt it?. &lt;br /&gt;
I have tested a bit the code above already, and it seems to work altought i´m having some problems...&lt;br /&gt;
For instance i think the translation system is not working properly, and i dont mean the Google´s translation system (in my opinion, if is not the best, one of the bests), but that there is still much work to do in the script...&lt;br /&gt;
&lt;br /&gt;
The next step will be to try to divide the script in 2, or 3 if is possible, so we can spread the memory usage. Also I would like to test a trick i use often for to translate languages that i dont understand, what I do first is to translate that language into English, and then from English to Spanish, it seems a nonsense and unnecesary waste, but if i do it is becouse so i usually understand the translations better.&lt;br /&gt;
I want by one part the translators communications and evaluation system, and by other the translation system between avatars, is it very difficult? I don´t know , we will see...&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Es dificil... me está costando pero ya veremos...&lt;br /&gt;
Its difficult... i am struggling but we will see...&lt;br /&gt;
&lt;br /&gt;
chu chu chu&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
De Güatemala a Güatepeor, Sin comentarios...&lt;br /&gt;
&lt;br /&gt;
From Güatebad to Güateworse, No comments...&lt;br /&gt;
&lt;br /&gt;
Buscando en Internet he encontrado este [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html API de Yahoo] comprobador de ortografía, aunque creo que por ahora sólo soporta el lenguage inglés pero sería interesante añadirlo al proyecto&lt;br /&gt;
&lt;br /&gt;
Searching on the web I crossed in my way with this spell checker [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html Yahoo´s API] , I think that it only supports English language by now althought it would be interesting to add it to the project&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
ESTO ES EL TRADUCTOR &amp;quot;un lío&amp;quot; por ahora... Necesito limpiar el codigo y rehacer algunas cosas&lt;br /&gt;
&lt;br /&gt;
THIS IS THE TRANSLATOR &amp;quot;mess&amp;quot; by now... I need to clean the code and rework some things&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Personal Translator&lt;br /&gt;
//Universal Translator (Mods made in Perry Mizin)&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//November 12, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Web Server Services powered by Google&lt;br /&gt;
//Variables&lt;br /&gt;
list requestedTranslations;&lt;br /&gt;
list tempDetections;&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
integer M = 1;&lt;br /&gt;
integer listenID;&lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
integer showTranslation = FALSE;&lt;br /&gt;
integer tranObjects = TRUE;&lt;br /&gt;
integer isInitialized = FALSE;&lt;br /&gt;
string  options;&lt;br /&gt;
key tempValue;&lt;br /&gt;
//Functions&lt;br /&gt;
integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex&lt;br /&gt;
{&lt;br /&gt;
	return ~llSubStringIndex(haystack, needle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sendIM(key imid, string imstr)&lt;br /&gt;
{	// llInstantMessage(key id , string message) causes the script to sleep for 2 seconds&lt;br /&gt;
	if (showTranslation == TRUE)&lt;br /&gt;
	{&lt;br /&gt;
		if (imid != llGetOwner())&lt;br /&gt;
		{&lt;br /&gt;
			llOwnerSay(imstr + &amp;quot; @&amp;quot; + llKey2Name(imid));  //llOwnerSay(string message) has no delay&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if (M == 8)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334420, imstr, imid);&lt;br /&gt;
		M = 1;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 7)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334430, imstr, imid);&lt;br /&gt;
		M = 8;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 6)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334440, imstr, imid);&lt;br /&gt;
		M = 7;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 5)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334450, imstr, imid);&lt;br /&gt;
		M = 6;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 4)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334460, imstr, imid);&lt;br /&gt;
		M = 5;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 3)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334470, imstr, imid);&lt;br /&gt;
		M = 4;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 2)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334480, imstr, imid);&lt;br /&gt;
		M = 3;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 1)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334490, imstr, imid);&lt;br /&gt;
		M = 2;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
detectLanguage(string dtcmsg, key dtckey)&lt;br /&gt;
{&lt;br /&gt;
	tempValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&amp;amp;q=&amp;quot; + llEscapeURL(dtcmsg), [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot; &amp;quot;);&lt;br /&gt;
	if (tempValue != NULL_KEY)&lt;br /&gt;
	{&lt;br /&gt;
		tempDetections = (tempDetections=[]) + tempDetections + [tempValue, dtckey];&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Translate(integer chkn, string chkmsg, list chkli)&lt;br /&gt;
{&lt;br /&gt;
	key returnValue;&lt;br /&gt;
	returnValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&amp;amp;q=&amp;quot; + chkmsg, [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot;&amp;quot;);&lt;br /&gt;
	if (returnValue != NULL_KEY)&lt;br /&gt;
	{	//Translation&lt;br /&gt;
		requestedTranslations = (requestedTranslations=[]) + requestedTranslations + [returnValue, llList2CSV(chkli)];&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		llSleep(5.0); //Something has gone horribly wrong, sleep 5 seconds to clear throttle&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string checkLanguage(string chklantmpStr)&lt;br /&gt;
{&lt;br /&gt;
	if (chklantmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;en&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	else if (chklantmpStr == &amp;quot;und&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;el&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	if (llGetSubString(chklantmpStr, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = llGetSubString(chklantmpStr, 0, 1);&lt;br /&gt;
	}&lt;br /&gt;
	return chklantmpStr;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
	integer avliPos;&lt;br /&gt;
	integer idNum;&lt;br /&gt;
	if (~llListFindList(agentsInTranslation, (list)avid))&lt;br /&gt;
	{&lt;br /&gt;
		avliPos = llListFindList(agentsInTranslation, (list)avid);&lt;br /&gt;
		agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, chklan], avliPos + 1, avliPos + 2);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		@at;&lt;br /&gt;
		idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
		if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
		{&lt;br /&gt;
			jump at;&lt;br /&gt;
		}&lt;br /&gt;
		agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, chklan, idNum];&lt;br /&gt;
		// llMessageLinked(LINK_THIS, 64562349, avlan, avid);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string addNewAgent(key newavid)&lt;br /&gt;
{&lt;br /&gt;
	string speakerLan;&lt;br /&gt;
	if (llGetAgentSize(newavid) == ZERO_VECTOR)&lt;br /&gt;
	{&lt;br /&gt;
		speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
		addAgent(newavid, speakerLan, 4);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		speakerLan  = checkLanguage(llGetAgentLanguage(newavid));&lt;br /&gt;
		if (speakerLan == &amp;quot;&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
			addAgent(newavid, speakerLan, 0);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			addAgent(newavid, speakerLan, 0);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return speakerLan;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
	if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
	{&lt;br /&gt;
		integer gkliPos = llListFindList(agentsInTranslation, (list)agentID);&lt;br /&gt;
		return llList2Key(agentsInTranslation, gkliPos - 3);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		return &amp;quot;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
processHTTPResponse(integer ntype, string bodyStr, list httli)&lt;br /&gt;
{&lt;br /&gt;
	key     recepientID;&lt;br /&gt;
	key     speakerID;&lt;br /&gt;
	list    paramtmpli;&lt;br /&gt;
	list    recepientList;&lt;br /&gt;
	string  recepientLanguage;&lt;br /&gt;
	string  languagePair;&lt;br /&gt;
	string  speakerName;&lt;br /&gt;
	string  speakerLanguage;&lt;br /&gt;
	string  translatedText;&lt;br /&gt;
	string  lantmpStr;&lt;br /&gt;
	integer z;	&lt;br /&gt;
	//===================&lt;br /&gt;
	//Process Translation&lt;br /&gt;
	//===================&lt;br /&gt;
	speakerID  = llList2Key(httli, 1);&lt;br /&gt;
	speakerName = llKey2Name(speakerID);&lt;br /&gt;
	if (speakerName == &amp;quot;&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
	}&lt;br /&gt;
	recepientList = llParseString2List(llList2String(httli, 2), [&amp;quot;@&amp;quot;], []);&lt;br /&gt;
	paramtmpli = llParseStringKeepNulls(llList2String(httli, 3), [&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
	recepientLanguage = llList2String(paramtmpli, 1);&lt;br /&gt;
	languagePair = llDumpList2String(paramtmpli, &amp;quot;&amp;gt;&amp;gt;&amp;quot;);&lt;br /&gt;
	//Perform Text Cleanup&lt;br /&gt;
	translatedText = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;detectedSourceLanguage\&amp;quot;:\&amp;quot;&amp;quot;));&lt;br /&gt;
	//Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
	if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
	{&lt;br /&gt;
		lantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
		for(z = llStringLength(translatedText);z &amp;gt;= 0; z--)&lt;br /&gt;
		{&lt;br /&gt;
			lantmpStr = (lantmpStr=&amp;quot;&amp;quot;) + lantmpStr + llGetSubString(translatedText, z, z);&lt;br /&gt;
		}&lt;br /&gt;
		translatedText = lantmpStr;&lt;br /&gt;
	}&lt;br /&gt;
	lantmpStr = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
	for (z = 0; z &amp;lt; llGetListLength(recepientList); z += 1)&lt;br /&gt;
	{&lt;br /&gt;
		recepientID = getAgentKey(llList2Integer(recepientList, z));&lt;br /&gt;
		if (recepientID != &amp;quot;&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, [recepientID]) + 1);&lt;br /&gt;
			if (recepientLanguage != speakerLanguage)&lt;br /&gt;
			{&lt;br /&gt;
				sendIM(recepientID, lantmpStr);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(5);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
	{&lt;br /&gt;
		list ltmpli;&lt;br /&gt;
		if (num == 8434532)&lt;br /&gt;
		{&lt;br /&gt;
			enabled = (integer)lstr;&lt;br /&gt;
		}&lt;br /&gt;
		else if (num == 3342976)&lt;br /&gt;
		{	//Send Preferences&lt;br /&gt;
			options = lstr;&lt;br /&gt;
			if (isInitialized == FALSE) return;&lt;br /&gt;
			ltmpli = llCSV2List(options);&lt;br /&gt;
			showTranslation = llList2Integer(ltmpli, 0);&lt;br /&gt;
			tranObjects = llList2Integer(ltmpli, 1);&lt;br /&gt;
			autoLanguage = llList2Integer(ltmpli, 2);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	sensor(integer num_detected)&lt;br /&gt;
	{&lt;br /&gt;
		integer s;&lt;br /&gt;
		key sid;&lt;br /&gt;
		for (s = 0; s &amp;lt; num_detected; s += 1)&lt;br /&gt;
		{&lt;br /&gt;
			sid = llDetectedKey(s);&lt;br /&gt;
			if (~llListFindList(agentsInTranslation, (list)sid))&lt;br /&gt;
			{ }&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				addNewAgent(sid);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	no_sensor()&lt;br /&gt;
	{ }&lt;br /&gt;
&lt;br /&gt;
	listen(integer channel, string name, key id, string message)&lt;br /&gt;
	{&lt;br /&gt;
		integer w;&lt;br /&gt;
		string  spkrLan;&lt;br /&gt;
		string  recepLan;&lt;br /&gt;
		integer recepID;&lt;br /&gt;
		integer lstliPos;&lt;br /&gt;
		string  lanpair;&lt;br /&gt;
		list    translationCache;&lt;br /&gt;
		//Translator Engine Code&lt;br /&gt;
		if ((!enabled) &amp;amp;&amp;amp; (isMaster == 1))&lt;br /&gt;
		{&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (!tranObjects)&lt;br /&gt;
		{&lt;br /&gt;
			if (llGetAgentSize(id) == ZERO_VECTOR)&lt;br /&gt;
			{&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				detectLanguage(message, id);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			detectLanguage(message, id);&lt;br /&gt;
		}&lt;br /&gt;
		if (~llListFindList(agentsInTranslation, (list)id))&lt;br /&gt;
		{&lt;br /&gt;
			lstliPos = llListFindList(agentsInTranslation, (list)id);&lt;br /&gt;
			spkrLan = llList2String(agentsInTranslation, lstliPos + 1);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			spkrLan = addNewAgent(id);&lt;br /&gt;
		}&lt;br /&gt;
		//===============================&lt;br /&gt;
		//Formulate Translation Requests&lt;br /&gt;
		//===============================&lt;br /&gt;
		if (id == llGetOwner())&lt;br /&gt;
		{	// If speaker is owner&lt;br /&gt;
			// I will do this dirty cheat by now&lt;br /&gt;
			// There should exist another clean way to filter speakers &amp;amp; receivers, I need to think about this&lt;br /&gt;
			for (w = 0; w &amp;lt; llGetListLength(agentsInTranslation); w += 4)&lt;br /&gt;
			{	//Loop through translation group and do appropriate translations as needed&lt;br /&gt;
				recepID = llList2Integer(agentsInTranslation, w + 3);&lt;br /&gt;
				recepLan =  checkLanguage(llList2String(agentsInTranslation, w + 1));&lt;br /&gt;
				if (spkrLan != recepLan)&lt;br /&gt;
				{&lt;br /&gt;
					lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
					if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
					{&lt;br /&gt;
						lstliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
						translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			if (translationCache != [])&lt;br /&gt;
			{	//Process Requests&lt;br /&gt;
				for (w = 0; w &amp;lt; llGetListLength(translationCache); w += 2)&lt;br /&gt;
				{	//====================================&lt;br /&gt;
					//Translation&lt;br /&gt;
					//====================================&lt;br /&gt;
					//Forumulate and Send Translation Request&lt;br /&gt;
					lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, w), [&amp;quot;|&amp;quot;],[]), 1);&lt;br /&gt;
					Translate(0, llEscapeURL(message) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, w + 1), llList2String(translationCache, w)]);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{	// if speaker is not owner&lt;br /&gt;
			lstliPos = llListFindList(agentsInTranslation, (list)llGetOwner());&lt;br /&gt;
			recepID = llList2Integer(agentsInTranslation, lstliPos + 3);&lt;br /&gt;
			recepLan =  checkLanguage(llList2String(agentsInTranslation , lstliPos + 1 ));&lt;br /&gt;
			if (spkrLan != recepLan)&lt;br /&gt;
			{&lt;br /&gt;
				lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
				if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
				{&lt;br /&gt;
					lstliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
					translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];&lt;br /&gt;
				}&lt;br /&gt;
				if (translationCache != [])&lt;br /&gt;
				{	//====================================&lt;br /&gt;
					//Translation&lt;br /&gt;
					//====================================&lt;br /&gt;
					//Forumulate and Send Translation Request&lt;br /&gt;
					lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, lstliPos), [&amp;quot;|&amp;quot;],[]), 1);&lt;br /&gt;
					Translate(0, llEscapeURL(message) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, lstliPos + 1), llList2String(translationCache, lstliPos)]);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
	{	//Process Response Code&lt;br /&gt;
		integer httliPos;&lt;br /&gt;
		if (~llListFindList(requestedTranslations, (list)request_id))&lt;br /&gt;
		{&lt;br /&gt;
			httliPos = llListFindList(requestedTranslations, [request_id]);&lt;br /&gt;
			processHTTPResponse(0, body, llCSV2List(llList2String(requestedTranslations, httliPos + 1)));&lt;br /&gt;
			requestedTranslations = llDeleteSubList(requestedTranslations, httliPos, httliPos + 1);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (~llListFindList(tempDetections, (list)request_id))&lt;br /&gt;
		{	// We Trust the Google system, the Google´s guys are good and I am sure they will keep improving :-)&lt;br /&gt;
			integer tmpliPos = llListFindList(tempDetections, (list)request_id);&lt;br /&gt;
			key speakerID = llList2Key(tempDetections, tmpliPos + 1);&lt;br /&gt;
			tempDetections = llDeleteSubList(tempDetections, tmpliPos, tmpliPos + 3);&lt;br /&gt;
			string htttmpStr = llToLower(llGetSubString(body, llSubStringIndex(body, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(body, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
			if (htttmpStr != &amp;quot;&amp;quot; &amp;amp;&amp;amp; contains(htttmpStr, &amp;quot;err&amp;quot;) == 0 &amp;amp;&amp;amp; contains(htttmpStr, &amp;quot;unn&amp;quot;) == 0)&lt;br /&gt;
			{	// if detects any language&lt;br /&gt;
				htttmpStr = checkLanguage(htttmpStr);&lt;br /&gt;
				if (~llListFindList(agentsInTranslation, (list)speakerID))&lt;br /&gt;
				{&lt;br /&gt;
					integer tmpavliPos = llListFindList(agentsInTranslation, (list)speakerID);&lt;br /&gt;
					string actlan = llList2String(agentsInTranslation, tmpavliPos + 1);&lt;br /&gt;
					if (actlan != htttmpStr)&lt;br /&gt;
					{	// if language of speaker is not the same as detected language&lt;br /&gt;
						agentsInTranslation = llListReplaceList(agentsInTranslation,[llList2Integer(agentsInTranslation,tmpavliPos + 2) + 1] , tmpavliPos + 2, tmpavliPos + 2);&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{	// reset language checker for speaker&lt;br /&gt;
						agentsInTranslation = llListReplaceList(agentsInTranslation,[0], tmpavliPos + 2, tmpavliPos + 2);&lt;br /&gt;
					}&lt;br /&gt;
					if (llList2Integer(agentsInTranslation,tmpavliPos + 2) &amp;gt;= 3)&lt;br /&gt;
					{	// if anyone speaks on any different language 3 times in a row&lt;br /&gt;
						addAgent(speakerID, htttmpStr, 0);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	timer()&lt;br /&gt;
	{&lt;br /&gt;
		integer r;&lt;br /&gt;
		vector  tmrVct;&lt;br /&gt;
		list  newList;&lt;br /&gt;
		float timeElapsed;&lt;br /&gt;
		llSetTimerEvent(0.0); // we better reset timer by way of precaution&lt;br /&gt;
		if (isInitialized == FALSE)&lt;br /&gt;
		{&lt;br /&gt;
			enabled = TRUE;&lt;br /&gt;
			listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
			llMessageLinked(LINK_THIS, 6877259, (string)enabled, NULL_KEY);&lt;br /&gt;
			isInitialized = TRUE;&lt;br /&gt;
			string mylanguage = llGetAgentLanguage(llGetOwner());&lt;br /&gt;
			if (llStringLength(mylanguage) &amp;lt; 1)&lt;br /&gt;
			{&lt;br /&gt;
				mylanguage = &amp;quot;en&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			if(~llListFindList(agentsInTranslation, (list)llGetOwner()))&lt;br /&gt;
			{&lt;br /&gt;
				integer ownerliPos = llListFindList(agentsInTranslation, (list)llGetOwner());&lt;br /&gt;
				agentsInTranslation = llListReplaceList(agentsInTranslation,[mylanguage] , ownerliPos + 1, ownerliPos + 1);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [llGetOwner() , mylanguage , 0 , llRound(llFrand(2000000)) + 1];&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		for (r = 0; r &amp;lt; llGetListLength(tempDetections); r += 2)&lt;br /&gt;
		{&lt;br /&gt;
			timeElapsed = llGetTime() - llList2Float(llCSV2List(llList2String(tempDetections, r + 1)), 0);&lt;br /&gt;
			if (timeElapsed &amp;lt; 30.0)&lt;br /&gt;
			{&lt;br /&gt;
				newList = (newList=[]) + newList + llList2List(tempDetections, r, r + 1);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		tempDetections = newList;&lt;br /&gt;
		newList = [];&lt;br /&gt;
		for (r = 0; r &amp;lt; llGetListLength(requestedTranslations); r += 2)&lt;br /&gt;
		{&lt;br /&gt;
			timeElapsed = llGetTime() - llList2Float(llCSV2List(llList2String(requestedTranslations, r + 1)), 0);&lt;br /&gt;
			if (timeElapsed &amp;lt; 30.0)&lt;br /&gt;
			{&lt;br /&gt;
				newList = (newList=[]) + newList + llList2List(requestedTranslations, r, r + 1);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		requestedTranslations = newList;&lt;br /&gt;
		newList = [];&lt;br /&gt;
		if (isMaster &amp;gt; 0)&lt;br /&gt;
		{&lt;br /&gt;
			for (r = 0; r &amp;lt; llGetListLength(agentsInTranslation) r += 4)&lt;br /&gt;
			{&lt;br /&gt;
				tmrVct = llList2Vector(llGetObjectDetails(llList2Key(agentsInTranslation, r), [OBJECT_POS]), 0);&lt;br /&gt;
				if (llVecDist(llGetPos(), tmrVct) &amp;lt;= 20.0)&lt;br /&gt;
				{&lt;br /&gt;
					newList = (newList=[]) + newList + llList2List(agentsInTranslation, r, r + 3);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			agentsInTranslation = newList;&lt;br /&gt;
			newList = [];&lt;br /&gt;
		}&lt;br /&gt;
		if ((autoLanguage) &amp;amp;&amp;amp; isMaster &amp;gt; 0)&lt;br /&gt;
		{&lt;br /&gt;
			llSensor(&amp;quot;&amp;quot;, NULL_KEY, AGENT, 20.0, PI);&lt;br /&gt;
		}&lt;br /&gt;
		llSetTimerEvent(4.0); // restart timer&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=690563</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=690563"/>
		<updated>2009-12-19T20:48:25Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: /* OK */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribucion al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente codigo fué originalmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mi manera...&lt;br /&gt;
No os riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;OK&#039;&#039; ===&lt;br /&gt;
Bueno, despues de respiñar todo lo que he podido, creo que el uso de memoria y la velocidad estan practicamente igual que en la version original pero bueno... en la variedad está el gusto no?&lt;br /&gt;
Ya he probado un poco el codigo, y parece que funciona aunque estoy teniendo algunos problemas... Por ejemplo creo que el sistema de traduccion no funciona correctamente, y no me refiero al sistema de traduccion de Google (en mi opinion, si no es el mejor, es uno de los mejores del mundo), sino a que aun queda mucho trabajo por hacer en el script...&lt;br /&gt;
&lt;br /&gt;
El siguiente paso sera intentar dividir el script en dos, o si es posible en tres para repartir el uso de memoria. Tambien me gustaria probar un truco que uso a menudo para traducir paginas en un idioma que no entiendo, lo que hago es que en vez de traducir directamente al español, primero lo traduzco a inglés, y luego desde inglés al español, parece una tonteria y un gasto innecesario, pero si lo hago es porque así suelo entender mejor las traducciones.&lt;br /&gt;
Quiero por un lado el sistema de comunicacion y evaluacion entre traductores, y por otro el sistema de traduccion entre avatares, ¿es muy dificil? no se ya lo veremos...&lt;br /&gt;
&lt;br /&gt;
Well, after saving as much as I could, I think the memory usage and the speed are technically the same as in the original script, but well, in the variety is the taste, isnt it?. &lt;br /&gt;
I have tested a bit the code above already, and it seems to work altought i´m having some problems...&lt;br /&gt;
For instance i think the translation system is not working properly, and i dont mean the Google´s translation system (in my opinion, if is not the best, one of the bests), but that there is still much work to do in the script...&lt;br /&gt;
&lt;br /&gt;
The next step will be to try to divide the script in 2, or 3 if is possible, so we can spread the memory usage. Also I would like to test a trick i use often for to translate languages that i dont understand, what I do first is to translate that language into English, and then from English to Spanish, it seems a nonsense and unnecesary waste, but if i do it is becouse so i usually understand the translations better.&lt;br /&gt;
I want by one part the translators communications and evaluation system, and by other the translation system between avatars, is it very difficult? I don´t know , we will see...&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Es dificil... me está costando pero ya veremos...&lt;br /&gt;
Its difficult... i am struggling but we will see...&lt;br /&gt;
&lt;br /&gt;
chu chu chu&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
De Güatemala a Güatepeor, Sin comentarios...&lt;br /&gt;
&lt;br /&gt;
From Güatebad to Güateworse, No comments...&lt;br /&gt;
&lt;br /&gt;
Buscando en Internet he encontrado este [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html API de Yahoo] comprobador de ortografía, aunque creo que por ahora sólo soporta el lenguage inglés pero sería interesante añadirlo al proyecto&lt;br /&gt;
&lt;br /&gt;
Searching on the web I crossed in my way with this spell checker [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html Yahoo´s API] , I think that it only supports English language by now althought it would be interesting to add it to the project&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
ESTO ES EL TRADUCTOR &amp;quot;un lío&amp;quot; por ahora... Necesito limpiar el codigo y rehacer algunas cosas&lt;br /&gt;
&lt;br /&gt;
THIS IS THE TRANSLATOR &amp;quot;mess&amp;quot; by now... I need to clean the code and rework some things&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Personal Translator&lt;br /&gt;
//Universal Translator (Mods made in Perry Mizin)&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//November 12, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Web Server Services powered by Google &lt;br /&gt;
//Variables&lt;br /&gt;
list requestedTranslations;&lt;br /&gt;
list tempDetections;&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
list requestList;&lt;br /&gt;
integer listenID; &lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
integer showTranslation = FALSE;&lt;br /&gt;
integer tranObjects = TRUE; &lt;br /&gt;
integer isInitialized = FALSE;&lt;br /&gt;
string  options;&lt;br /&gt;
key tempValue;&lt;br /&gt;
//Functions&lt;br /&gt;
integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex&lt;br /&gt;
{&lt;br /&gt;
    return ~llSubStringIndex(haystack, needle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sendIM(key imid, string imstr)&lt;br /&gt;
{	// llInstantMessage(key id , string message) causes the script to sleep for 2 seconds&lt;br /&gt;
	if (M &amp;gt;= 10)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334400, imstr, imid);&lt;br /&gt;
		M = 1;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 9)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334410, imstr, imid);&lt;br /&gt;
		M = 10;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 8)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334420, imstr, imid);&lt;br /&gt;
		M = 9;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 7)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334430, imstr, imid);&lt;br /&gt;
		M = 8;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 6)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334440, imstr, imid);&lt;br /&gt;
		M = 7;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 5)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334450, imstr, imid);&lt;br /&gt;
		M = 6;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 4)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334460, imstr, imid);&lt;br /&gt;
		M = 5;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 3)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334470, imstr, imid);&lt;br /&gt;
		M = 4;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 2)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334480, imstr, imid);&lt;br /&gt;
		M = 3;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 1)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334490, imstr, imid);&lt;br /&gt;
		M = 2;&lt;br /&gt;
	}&lt;br /&gt;
	if (showTranslation == TRUE)&lt;br /&gt;
	{&lt;br /&gt;
	    if (imid != llGetOwner())&lt;br /&gt;
	    {&lt;br /&gt;
	    	llOwnerSay(imstr + &amp;quot; @&amp;quot; + llKey2Name(imid));  //llOwnerSay(string message) has no delay&lt;br /&gt;
	    }&lt;br /&gt;
	}   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
detectLanguage(string dtcmsg, key dtckey)&lt;br /&gt;
{&lt;br /&gt;
    tempValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&amp;amp;q=&amp;quot; + llEscapeURL(dtcmsg), [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot; &amp;quot;);&lt;br /&gt;
    if (tempValue != NULL_KEY)&lt;br /&gt;
    {&lt;br /&gt;
        tempDetections = (tempDetections=[]) + tempDetections + [tempValue, dtckey];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Translate(integer chkn, string chkmsg, list chkli)&lt;br /&gt;
{&lt;br /&gt;
    key returnValue;&lt;br /&gt;
    returnValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&amp;amp;q=&amp;quot; + chkmsg, [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot;&amp;quot;);&lt;br /&gt;
    if (returnValue != NULL_KEY)&lt;br /&gt;
    {	//Translation&lt;br /&gt;
        requestedTranslations = (requestedTranslations=[]) + requestedTranslations + [returnValue, llList2CSV(chkli)];&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llSleep(5.0); //Something has gone horribly wrong, sleep 5 seconds to clear throttle&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string checkLanguage(string chklantmpStr)&lt;br /&gt;
{&lt;br /&gt;
    if (chklantmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;en&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else if (chklantmpStr == &amp;quot;und&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;el&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if (llGetSubString(chklantmpStr, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = llGetSubString(chklantmpStr, 0, 1);&lt;br /&gt;
    }&lt;br /&gt;
    return chklantmpStr;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
    integer avliPos;&lt;br /&gt;
    integer idNum;&lt;br /&gt;
    if (~llListFindList(agentsInTranslation, (list)avid))&lt;br /&gt;
    {&lt;br /&gt;
        avliPos = llListFindList(agentsInTranslation, (list)avid);&lt;br /&gt;
        agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, chklan], avliPos + 1, avliPos + 2);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        @at;&lt;br /&gt;
        idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
        if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
        {       &lt;br /&gt;
            jump at;&lt;br /&gt;
        }&lt;br /&gt;
        agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, chklan, idNum];&lt;br /&gt;
        // llMessageLinked(LINK_THIS, 64562349, avlan, avid);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string addNewAgent(key newavid)&lt;br /&gt;
{&lt;br /&gt;
    string speakerLan; &lt;br /&gt;
    if (llGetAgentSize(newavid) != ZERO_VECTOR)&lt;br /&gt;
    {&lt;br /&gt;
        speakerLan  = checkLanguage(llGetAgentLanguage(newavid));&lt;br /&gt;
        if (speakerLan == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
            addAgent(newavid, speakerLan, 0);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            addAgent(newavid, speakerLan, 0);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return speakerLan;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
    if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
    {&lt;br /&gt;
        integer gkliPos = llListFindList(agentsInTranslation, (list)agentID);&lt;br /&gt;
        return llList2Key(agentsInTranslation, gkliPos - 3);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
processHTTPResponse(integer ntype, string bodyStr, list httli)&lt;br /&gt;
{&lt;br /&gt;
    integer spkliPos;&lt;br /&gt;
    list    recepientList;&lt;br /&gt;
    key     recepientID;&lt;br /&gt;
    string  recepientLanguage;&lt;br /&gt;
    string  languagePair;&lt;br /&gt;
    key     speakerID;&lt;br /&gt;
    string  speakerName;&lt;br /&gt;
    string  speakerLanguage;&lt;br /&gt;
    string  translatedText;&lt;br /&gt;
    string  lantmpStr;&lt;br /&gt;
    integer z;&lt;br /&gt;
    list    paramtmpli;&lt;br /&gt;
    //===================&lt;br /&gt;
    //Process Translation&lt;br /&gt;
    //===================&lt;br /&gt;
        speakerID  = llList2Key(httli, 1);&lt;br /&gt;
        speakerName = llKey2Name(speakerID);&lt;br /&gt;
        if (speakerName == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
        }&lt;br /&gt;
        recepientList = llParseString2List(llList2String(httli, 2), [&amp;quot;@&amp;quot;], []);&lt;br /&gt;
        paramtmpli = llParseStringKeepNulls(llList2String(httli, 3), [&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
        recepientLanguage = llList2String(paramtmpli, 1);&lt;br /&gt;
        languagePair = llDumpList2String(paramtmpli, &amp;quot;&amp;gt;&amp;gt;&amp;quot;); &lt;br /&gt;
        //Perform Text Cleanup&lt;br /&gt;
        translatedText = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;detectedSourceLanguage\&amp;quot;:\&amp;quot;&amp;quot;));&lt;br /&gt;
        //Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
        if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            lantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
            for(z = llStringLength(translatedText);z &amp;gt;= 0; z--)&lt;br /&gt;
            {&lt;br /&gt;
                lantmpStr = (lantmpStr=&amp;quot;&amp;quot;) + lantmpStr + llGetSubString(translatedText, z, z); &lt;br /&gt;
            }&lt;br /&gt;
            translatedText = lantmpStr;&lt;br /&gt;
        }   &lt;br /&gt;
        lantmpStr = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
        if (showTranslation)&lt;br /&gt;
        {&lt;br /&gt;
            sendIM(speakerID, lantmpStr);&lt;br /&gt;
        } &lt;br /&gt;
        for (z = 0; z &amp;lt; llGetListLength(recepientList); z += 1)&lt;br /&gt;
        {&lt;br /&gt;
            recepientID = getAgentKey(llList2Integer(recepientList, z));&lt;br /&gt;
            if (recepientID != &amp;quot;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, [recepientID]) + 1);&lt;br /&gt;
                if (recepientLanguage != speakerLanguage)&lt;br /&gt;
                {&lt;br /&gt;
                    sendIM(recepientID, lantmpStr);&lt;br /&gt;
                }&lt;br /&gt;
            }  &lt;br /&gt;
        }&lt;br /&gt;
        return;   &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
         llSetTimerEvent(5);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
    {&lt;br /&gt;
        list ltmpli;&lt;br /&gt;
        if (num == 8434532)&lt;br /&gt;
        {&lt;br /&gt;
            enabled = (integer)lstr;&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 3342976)&lt;br /&gt;
        {	//Send Preferences&lt;br /&gt;
            options = lstr;&lt;br /&gt;
            if (isInitialized == FALSE) return;&lt;br /&gt;
            ltmpli = llCSV2List(options);&lt;br /&gt;
            showTranslation = llList2Integer(ltmpli, 0);&lt;br /&gt;
            tranObjects = llList2Integer(ltmpli, 1);&lt;br /&gt;
            autoLanguage = llList2Integer(ltmpli, 2);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    sensor(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        integer s;&lt;br /&gt;
        key sid;&lt;br /&gt;
        for (s = 0; s &amp;lt; num_detected; s += 1)&lt;br /&gt;
        {&lt;br /&gt;
            sid = llDetectedKey(s);&lt;br /&gt;
			if (~llListFindList(agentsInTranslation, (list)sid))&lt;br /&gt;
			{ }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                addNewAgent(sid);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
	no_sensor()&lt;br /&gt;
	{ }&lt;br /&gt;
    &lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        integer w;&lt;br /&gt;
        string  spkrLan;&lt;br /&gt;
        string  recepLan;&lt;br /&gt;
        integer recepID;&lt;br /&gt;
        integer lstliPos;&lt;br /&gt;
        string  lanpair;&lt;br /&gt;
        list    translationCache;&lt;br /&gt;
        //Translator Engine Code&lt;br /&gt;
        if ((!enabled) &amp;amp;&amp;amp; (isMaster == 1))&lt;br /&gt;
        {&lt;br /&gt;
            return;&lt;br /&gt;
        } &lt;br /&gt;
        if (!tranObjects)&lt;br /&gt;
        {&lt;br /&gt;
            if (llGetAgentSize(id) == ZERO_VECTOR)&lt;br /&gt;
            {&lt;br /&gt;
            return;&lt;br /&gt;
            } &lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                detectLanguage(message, id);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            detectLanguage(message, id);&lt;br /&gt;
        }            &lt;br /&gt;
        if (~llListFindList(agentsInTranslation, (list)id))&lt;br /&gt;
        {&lt;br /&gt;
            lstliPos = llListFindList(agentsInTranslation, (list)id);          &lt;br /&gt;
            spkrLan = llList2String(agentsInTranslation, lstliPos + 1);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            spkrLan = addNewAgent(id);&lt;br /&gt;
        }&lt;br /&gt;
        //===============================&lt;br /&gt;
        //Formulate Translation Requests&lt;br /&gt;
        //===============================&lt;br /&gt;
        if (id == llGetOwner())&lt;br /&gt;
		{	// If speaker is owner&lt;br /&gt;
			// I will do this dirty cheat by now&lt;br /&gt;
			// There should exist another clean way to filter speakers &amp;amp; receivers, I need to think about this&lt;br /&gt;
            for (w = 0; w &amp;lt; llGetListLength(agentsInTranslation); w += 4)&lt;br /&gt;
            {	//Loop through translation group and do appropriate translations as needed&lt;br /&gt;
                recepID = llList2Integer(agentsInTranslation, w + 3);&lt;br /&gt;
                recepLan =  checkLanguage(llList2String(agentsInTranslation, w + 1));&lt;br /&gt;
                if (spkrLan != recepLan) &lt;br /&gt;
                {&lt;br /&gt;
                    lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
                    if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
                    {&lt;br /&gt;
                        lstliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
                        translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }                          &lt;br /&gt;
            if (translationCache != [])&lt;br /&gt;
            {	//Process Requests&lt;br /&gt;
                for (w = 0; w &amp;lt; llGetListLength(translationCache); w += 2)&lt;br /&gt;
                {	//====================================&lt;br /&gt;
                    //Translation&lt;br /&gt;
                    //====================================&lt;br /&gt;
                    //Forumulate and Send Translation Request&lt;br /&gt;
                    lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, w), [&amp;quot;|&amp;quot;],[]), 1); &lt;br /&gt;
                    Translate(0, llEscapeURL(message) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, w + 1), llList2String(translationCache, w)]);&lt;br /&gt;
                } &lt;br /&gt;
            }   &lt;br /&gt;
        }&lt;br /&gt;
        else  &lt;br /&gt;
        {	// if speaker is not owner&lt;br /&gt;
            lstliPos = llListFindList(agentsInTranslation, (list)llGetOwner());&lt;br /&gt;
            recepID = llList2Integer(agentsInTranslation, lstliPos + 3);&lt;br /&gt;
            recepLan =  checkLanguage(llList2String(agentsInTranslation , lstliPos + 1 ));&lt;br /&gt;
            if (spkrLan != recepLan) &lt;br /&gt;
            {&lt;br /&gt;
                lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
                if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
                {&lt;br /&gt;
                    lstliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
                    translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];&lt;br /&gt;
                }                                          &lt;br /&gt;
                if (translationCache != [])&lt;br /&gt;
                {	//====================================&lt;br /&gt;
                    //Translation&lt;br /&gt;
                    //====================================&lt;br /&gt;
                    //Forumulate and Send Translation Request&lt;br /&gt;
                    lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, lstliPos), [&amp;quot;|&amp;quot;],[]), 1); &lt;br /&gt;
                    Translate(0, llEscapeURL(message) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, lstliPos + 1), llList2String(translationCache, lstliPos)]);&lt;br /&gt;
                } &lt;br /&gt;
            }                             &lt;br /&gt;
        }   &lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
    {	//Process Response Code&lt;br /&gt;
        integer httliPos;&lt;br /&gt;
        string htttmpStr;&lt;br /&gt;
        if (~llListFindList(requestedTranslations, (list)request_id))&lt;br /&gt;
        {&lt;br /&gt;
            httliPos = llListFindList(requestedTranslations, [request_id]);&lt;br /&gt;
            processHTTPResponse(0, body, llCSV2List(llList2String(requestedTranslations, httliPos + 1)));&lt;br /&gt;
            requestedTranslations = llDeleteSubList(requestedTranslations, httliPos, httliPos + 1);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if (~llListFindList(tempDetections, (list)request_id))&lt;br /&gt;
		{	// We Trust the Google system, the Google´s guys are good and I am sure they will keep improving :-)&lt;br /&gt;
            integer tmpliPos = llListFindList(tempDetections, (list)request_id);&lt;br /&gt;
            key speakerID = llList2Key(tempDetections, tmpliPos + 1);&lt;br /&gt;
            tempDetections = llDeleteSubList(tempDetections, tmpliPos, tmpliPos + 3);&lt;br /&gt;
            string tmptmpStr = llToLower(llGetSubString(body, llSubStringIndex(body, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(body, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
			if ( tmptmpStr != &amp;quot;&amp;quot; &amp;amp;&amp;amp; contains(tmptmpStr, &amp;quot;err&amp;quot;) == 0 &amp;amp;&amp;amp; contains(tmptmpStr, &amp;quot;unn&amp;quot;) == 0 )			&lt;br /&gt;
			{	// if detects any language&lt;br /&gt;
				tmptmpStr = checkLanguage(tmptmpStr);&lt;br /&gt;
                if (~llListFindList(agentsInTranslation, (list)speakerID))&lt;br /&gt;
                {&lt;br /&gt;
                    integer tmpavliPos = llListFindList(agentsInTranslation, (list)speakerID);&lt;br /&gt;
                    string actlan = llList2String(agentsInTranslation, tmpavliPos + 1);&lt;br /&gt;
                    if (actlan != tmptmpStr)&lt;br /&gt;
                    {	// if language of speaker is not the same as detected language&lt;br /&gt;
                        agentsInTranslation = llListReplaceList(agentsInTranslation,[llList2Integer(agentsInTranslation,tmpavliPos + 2) + 1] , tmpavliPos + 2, tmpavliPos + 2);&lt;br /&gt;
                    } &lt;br /&gt;
                    else &lt;br /&gt;
                    {	// reset language checker for speaker&lt;br /&gt;
                        agentsInTranslation = llListReplaceList(agentsInTranslation,[0], tmpavliPos + 2, tmpavliPos + 2);&lt;br /&gt;
                    }&lt;br /&gt;
					if (llList2Integer(agentsInTranslation,tmpavliPos + 2) &amp;gt;= 3)&lt;br /&gt;
					{	// if anyone speaks on any language 3 times in a row&lt;br /&gt;
                        addAgent(speakerID, tmptmpStr, 0);&lt;br /&gt;
                    }                &lt;br /&gt;
                }                &lt;br /&gt;
            }            &lt;br /&gt;
        }              &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
	{		&lt;br /&gt;
        llSetTimerEvent(0.0); // we better reset timer by way of precaution&lt;br /&gt;
        if (isInitialized == FALSE)&lt;br /&gt;
        {&lt;br /&gt;
            enabled = TRUE;&lt;br /&gt;
            listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); &lt;br /&gt;
            llMessageLinked(LINK_THIS, 6877259, (string)enabled, NULL_KEY);&lt;br /&gt;
            isInitialized = TRUE;&lt;br /&gt;
            string mylanguage = llGetAgentLanguage(llGetOwner());&lt;br /&gt;
            if (llStringLength(mylanguage) &amp;lt; 1)&lt;br /&gt;
            {&lt;br /&gt;
                mylanguage = &amp;quot;en&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			if(~llListFindList(agentsInTranslation, (list)llGetOwner())&lt;br /&gt;
			{&lt;br /&gt;
				integer ownerliPos = llListFindList(agentsInTranslation, (list)llGetOwner());&lt;br /&gt;
				agentsInTranslation = llListReplaceList(agentsInTranslation,[mylanguage] , ownerliPos + 1, ownerliPos + 1);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [llGetOwner() , mylanguage , 0 , llRound(llFrand(2000000)) + 1];&lt;br /&gt;
			}&lt;br /&gt;
        }&lt;br /&gt;
        integer r;&lt;br /&gt;
        string  tmrtmpStr;&lt;br /&gt;
        list    tmrnewli; &lt;br /&gt;
        integer x;&lt;br /&gt;
        list  newList;&lt;br /&gt;
        float timeElapsed;  &lt;br /&gt;
        for (x = 0; x &amp;lt; llGetListLength(tempDetections); x += 2)&lt;br /&gt;
        {&lt;br /&gt;
			timeElapsed = llGetTime() - llList2Float(llCSV2List(llList2String(tempDetections, x + 1)), 0);&lt;br /&gt;
			if (timeElapsed &amp;lt; 60.0)&lt;br /&gt;
			{&lt;br /&gt;
				newList = (newList=[]) + newList + llList2List(tempDetections, x, x + 1);&lt;br /&gt;
			}&lt;br /&gt;
        }&lt;br /&gt;
        tempDetections = newList;&lt;br /&gt;
        newList = [];&lt;br /&gt;
        for (x = 0; x &amp;lt; llGetListLength(requestedTranslations); x += 2)&lt;br /&gt;
        {&lt;br /&gt;
            timeElapsed = llGetTime() - llList2Float(llCSV2List(llList2String(requestedTranslations, x + 1)), 0);&lt;br /&gt;
            if (timeElapsed &amp;lt; 60.0) &lt;br /&gt;
            {&lt;br /&gt;
                newList = (newList=[]) + newList + llList2List(requestedTranslations, x, x + 1);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        requestedTranslations = newList;&lt;br /&gt;
        if (isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            for (r = 0; r &amp;lt; llGetListLength(agentsInTranslation); r += 4)&lt;br /&gt;
            {&lt;br /&gt;
                tmrtmpStr = llList2String(llGetObjectDetails(llList2Key(agentsInTranslation, r), [OBJECT_POS]), 0);&lt;br /&gt;
                if ((llVecDist(llGetPos(), (vector)tmrtmpStr) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tmrtmpStr != &amp;quot;&amp;quot;))&lt;br /&gt;
                {&lt;br /&gt;
                    tmrnewli = (tmrnewli=[]) + tmrnewli + llList2List(agentsInTranslation, r, r + 3);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            agentsInTranslation = tmrnewli;&lt;br /&gt;
        }&lt;br /&gt;
        if ((autoLanguage) &amp;amp;&amp;amp; isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            llSensor(&amp;quot;&amp;quot;, NULL_KEY, AGENT, 20.0, PI);&lt;br /&gt;
        }&lt;br /&gt;
        llSetTimerEvent(4.0); // restart timer&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=690553</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=690553"/>
		<updated>2009-12-19T20:40:32Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: /* OK */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribucion al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente codigo fué originalmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mi manera...&lt;br /&gt;
No os riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;OK&#039;&#039; ===&lt;br /&gt;
Bueno, despues de respiñar todo lo que he podido, creo que el uso de memoria y la velocidad estan practicamente igual que en la version original pero bueno... en la variedad está el gusto no?&lt;br /&gt;
Ya he probado un poco el codigo, y parece que funciona aunque estoy teniendo algunos problemas... Por ejemplo creo que el sistema de traduccion no funciona correctamente, y no me refiero al sistema de traduccion de Google (en mi opinion, si no es el mejor, es uno de los mejores del mundo), sino a que aun queda mucho trabajo por hacer en el script...&lt;br /&gt;
&lt;br /&gt;
El siguiente paso sera intentar dividir el script en dos, o si es posible en tres para repartir el uso de memoria. Tambien me gustaria probar un truco que uso a menudo para traducir paginas en un idioma que no entiendo, lo que hago es que en vez de traducir directamente al español, primero lo traduzco a inglés, y luego desde inglés al español, parece una tonteria y un gasto innecesario, pero si lo hago es porque así suelo entender mejor las traducciones.&lt;br /&gt;
Quiero por un lado el sistema de comunicacion y evaluacion entre traductores, y por otro el sistema de traduccion entre avatares, ¿es muy dificil? no se ya lo veremos...&lt;br /&gt;
&lt;br /&gt;
Well, after saving as much as I could, I think the memory usage and the speed are technically the same as in the original script, but well, in the variety is the taste, isnt it?. &lt;br /&gt;
I have tested a bit the code above already, and it seems to work altought i´m having some problems...&lt;br /&gt;
For instance i think the translation system is not working properly, and i dont mean the Google´s translation system (in my opinion, if is not the best, one of the bests), but that there is still much work to do in the script...&lt;br /&gt;
&lt;br /&gt;
The next step will be to try to divide the script in 2, or 3 if is possible, so we can spread the memory usage. Also I would like to test a trick i use often for to translate languages that i dont understand, what I do first is to translate that language into English, and then from English to Spanish, it seems a nonsense and unnecesary waste, but if i do it is becouse so i usually understand the translations better.&lt;br /&gt;
I want by one part the translators communications and evaluation system, and by other the translation system between avatars, is it very difficult? I don´t know , we will see...&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Es dificil... me está costando pero ya veremos...&lt;br /&gt;
Its difficult... i am struggling but we will see...&lt;br /&gt;
&lt;br /&gt;
chu chu chu&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
De Güatemala a Güatepeor, Sin comentarios...&lt;br /&gt;
&lt;br /&gt;
From Güatebad to Güateworse, No comments...&lt;br /&gt;
&lt;br /&gt;
Buscando en Internet he encontrado este [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html API de Yahoo] comprobador de ortografía, aunque creo que por ahora sólo soporta el lenguage inglés por ahora sería interesante añadirlo al proyecto&lt;br /&gt;
&lt;br /&gt;
Searching on the web I crossed in my way with this spell checker [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html Yahoo´s API] , I think that it only supports English language by now althought it would be interesting to add it to the project&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
ESTO ES EL TRADUCTOR &amp;quot;un lío&amp;quot; por ahora... Necesito limpiar el codigo y rehacer algunas cosas&lt;br /&gt;
&lt;br /&gt;
THIS IS THE TRANSLATOR &amp;quot;mess&amp;quot; by now... I need to clean the code and rework some things&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Personal Translator&lt;br /&gt;
//Universal Translator (Mods made in Perry Mizin)&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//November 12, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Web Server Services powered by Google &lt;br /&gt;
//Variables&lt;br /&gt;
list requestedTranslations;&lt;br /&gt;
list tempDetections;&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
list requestList;&lt;br /&gt;
integer listenID; &lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
integer showTranslation = FALSE;&lt;br /&gt;
integer tranObjects = TRUE; &lt;br /&gt;
integer isInitialized = FALSE;&lt;br /&gt;
string  options;&lt;br /&gt;
key tempValue;&lt;br /&gt;
//Functions&lt;br /&gt;
integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex&lt;br /&gt;
{&lt;br /&gt;
    return ~llSubStringIndex(haystack, needle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sendIM(key imid, string imstr)&lt;br /&gt;
{	// llInstantMessage(key id , string message) causes the script to sleep for 2 seconds&lt;br /&gt;
	if (M &amp;gt;= 10)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334400, imstr, imid);&lt;br /&gt;
		M = 1;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 9)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334410, imstr, imid);&lt;br /&gt;
		M = 10;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 8)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334420, imstr, imid);&lt;br /&gt;
		M = 9;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 7)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334430, imstr, imid);&lt;br /&gt;
		M = 8;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 6)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334440, imstr, imid);&lt;br /&gt;
		M = 7;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 5)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334450, imstr, imid);&lt;br /&gt;
		M = 6;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 4)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334460, imstr, imid);&lt;br /&gt;
		M = 5;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 3)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334470, imstr, imid);&lt;br /&gt;
		M = 4;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 2)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334480, imstr, imid);&lt;br /&gt;
		M = 3;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 1)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334490, imstr, imid);&lt;br /&gt;
		M = 2;&lt;br /&gt;
	}&lt;br /&gt;
	if (showTranslation == TRUE)&lt;br /&gt;
	{&lt;br /&gt;
	    if (imid != llGetOwner())&lt;br /&gt;
	    {&lt;br /&gt;
	    	llOwnerSay(imstr + &amp;quot; @&amp;quot; + llKey2Name(imid));  //llOwnerSay(string message) has no delay&lt;br /&gt;
	    }&lt;br /&gt;
	}   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
detectLanguage(string dtcmsg, key dtckey)&lt;br /&gt;
{&lt;br /&gt;
    tempValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&amp;amp;q=&amp;quot; + llEscapeURL(dtcmsg), [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot; &amp;quot;);&lt;br /&gt;
    if (tempValue != NULL_KEY)&lt;br /&gt;
    {&lt;br /&gt;
        tempDetections = (tempDetections=[]) + tempDetections + [tempValue, dtckey];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Translate(integer chkn, string chkmsg, list chkli)&lt;br /&gt;
{&lt;br /&gt;
    key returnValue;&lt;br /&gt;
    returnValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&amp;amp;q=&amp;quot; + chkmsg, [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot;&amp;quot;);&lt;br /&gt;
    if (returnValue != NULL_KEY)&lt;br /&gt;
    {	//Translation&lt;br /&gt;
        requestedTranslations = (requestedTranslations=[]) + requestedTranslations + [returnValue, llList2CSV(chkli)];&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llSleep(5.0); //Something has gone horribly wrong, sleep 5 seconds to clear throttle&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string checkLanguage(string chklantmpStr)&lt;br /&gt;
{&lt;br /&gt;
    if (chklantmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;en&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else if (chklantmpStr == &amp;quot;und&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;el&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if (llGetSubString(chklantmpStr, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = llGetSubString(chklantmpStr, 0, 1);&lt;br /&gt;
    }&lt;br /&gt;
    return chklantmpStr;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
    integer avliPos;&lt;br /&gt;
    integer idNum;&lt;br /&gt;
    if (~llListFindList(agentsInTranslation, (list)avid))&lt;br /&gt;
    {&lt;br /&gt;
        avliPos = llListFindList(agentsInTranslation, (list)avid);&lt;br /&gt;
        agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, chklan], avliPos + 1, avliPos + 2);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        @at;&lt;br /&gt;
        idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
        if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
        {       &lt;br /&gt;
            jump at;&lt;br /&gt;
        }&lt;br /&gt;
        agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, chklan, idNum];&lt;br /&gt;
        // llMessageLinked(LINK_THIS, 64562349, avlan, avid);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string addNewAgent(key newavid)&lt;br /&gt;
{&lt;br /&gt;
    string speakerLan; &lt;br /&gt;
    if (llGetAgentSize(newavid) != ZERO_VECTOR)&lt;br /&gt;
    {&lt;br /&gt;
        speakerLan  = checkLanguage(llGetAgentLanguage(newavid));&lt;br /&gt;
        if (speakerLan == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
            addAgent(newavid, speakerLan, 0);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            addAgent(newavid, speakerLan, 0);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return speakerLan;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
    if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
    {&lt;br /&gt;
        integer gkliPos = llListFindList(agentsInTranslation, (list)agentID);&lt;br /&gt;
        return llList2Key(agentsInTranslation, gkliPos - 3);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
processHTTPResponse(integer ntype, string bodyStr, list httli)&lt;br /&gt;
{&lt;br /&gt;
    integer spkliPos;&lt;br /&gt;
    list    recepientList;&lt;br /&gt;
    key     recepientID;&lt;br /&gt;
    string  recepientLanguage;&lt;br /&gt;
    string  languagePair;&lt;br /&gt;
    key     speakerID;&lt;br /&gt;
    string  speakerName;&lt;br /&gt;
    string  speakerLanguage;&lt;br /&gt;
    string  translatedText;&lt;br /&gt;
    string  lantmpStr;&lt;br /&gt;
    integer z;&lt;br /&gt;
    list    paramtmpli;&lt;br /&gt;
    //===================&lt;br /&gt;
    //Process Translation&lt;br /&gt;
    //===================&lt;br /&gt;
        speakerID  = llList2Key(httli, 1);&lt;br /&gt;
        speakerName = llKey2Name(speakerID);&lt;br /&gt;
        if (speakerName == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
        }&lt;br /&gt;
        recepientList = llParseString2List(llList2String(httli, 2), [&amp;quot;@&amp;quot;], []);&lt;br /&gt;
        paramtmpli = llParseStringKeepNulls(llList2String(httli, 3), [&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
        recepientLanguage = llList2String(paramtmpli, 1);&lt;br /&gt;
        languagePair = llDumpList2String(paramtmpli, &amp;quot;&amp;gt;&amp;gt;&amp;quot;); &lt;br /&gt;
        //Perform Text Cleanup&lt;br /&gt;
        translatedText = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;detectedSourceLanguage\&amp;quot;:\&amp;quot;&amp;quot;));&lt;br /&gt;
        //Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
        if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            lantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
            for(z = llStringLength(translatedText);z &amp;gt;= 0; z--)&lt;br /&gt;
            {&lt;br /&gt;
                lantmpStr = (lantmpStr=&amp;quot;&amp;quot;) + lantmpStr + llGetSubString(translatedText, z, z); &lt;br /&gt;
            }&lt;br /&gt;
            translatedText = lantmpStr;&lt;br /&gt;
        }   &lt;br /&gt;
        lantmpStr = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
        if (showTranslation)&lt;br /&gt;
        {&lt;br /&gt;
            sendIM(speakerID, lantmpStr);&lt;br /&gt;
        } &lt;br /&gt;
        for (z = 0; z &amp;lt; llGetListLength(recepientList); z += 1)&lt;br /&gt;
        {&lt;br /&gt;
            recepientID = getAgentKey(llList2Integer(recepientList, z));&lt;br /&gt;
            if (recepientID != &amp;quot;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, [recepientID]) + 1);&lt;br /&gt;
                if (recepientLanguage != speakerLanguage)&lt;br /&gt;
                {&lt;br /&gt;
                    sendIM(recepientID, lantmpStr);&lt;br /&gt;
                }&lt;br /&gt;
            }  &lt;br /&gt;
        }&lt;br /&gt;
        return;   &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
         llSetTimerEvent(5);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
    {&lt;br /&gt;
        list ltmpli;&lt;br /&gt;
        if (num == 8434532)&lt;br /&gt;
        {&lt;br /&gt;
            enabled = (integer)lstr;&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 3342976)&lt;br /&gt;
        {	//Send Preferences&lt;br /&gt;
            options = lstr;&lt;br /&gt;
            if (isInitialized == FALSE) return;&lt;br /&gt;
            ltmpli = llCSV2List(options);&lt;br /&gt;
            showTranslation = llList2Integer(ltmpli, 0);&lt;br /&gt;
            tranObjects = llList2Integer(ltmpli, 1);&lt;br /&gt;
            autoLanguage = llList2Integer(ltmpli, 2);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    sensor(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        integer s;&lt;br /&gt;
        key sid;&lt;br /&gt;
        for (s = 0; s &amp;lt; num_detected; s += 1)&lt;br /&gt;
        {&lt;br /&gt;
            sid = llDetectedKey(s);&lt;br /&gt;
			if (~llListFindList(agentsInTranslation, (list)sid))&lt;br /&gt;
			{ }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                addNewAgent(sid);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
	no_sensor()&lt;br /&gt;
	{ }&lt;br /&gt;
    &lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        integer w;&lt;br /&gt;
        string  spkrLan;&lt;br /&gt;
        string  recepLan;&lt;br /&gt;
        integer recepID;&lt;br /&gt;
        integer lstliPos;&lt;br /&gt;
        string  lanpair;&lt;br /&gt;
        list    translationCache;&lt;br /&gt;
        //Translator Engine Code&lt;br /&gt;
        if ((!enabled) &amp;amp;&amp;amp; (isMaster == 1))&lt;br /&gt;
        {&lt;br /&gt;
            return;&lt;br /&gt;
        } &lt;br /&gt;
        if (!tranObjects)&lt;br /&gt;
        {&lt;br /&gt;
            if (llGetAgentSize(id) == ZERO_VECTOR)&lt;br /&gt;
            {&lt;br /&gt;
            return;&lt;br /&gt;
            } &lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                detectLanguage(message, id);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            detectLanguage(message, id);&lt;br /&gt;
        }            &lt;br /&gt;
        if (~llListFindList(agentsInTranslation, (list)id))&lt;br /&gt;
        {&lt;br /&gt;
            lstliPos = llListFindList(agentsInTranslation, (list)id);          &lt;br /&gt;
            spkrLan = llList2String(agentsInTranslation, lstliPos + 1);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            spkrLan = addNewAgent(id);&lt;br /&gt;
        }&lt;br /&gt;
        //===============================&lt;br /&gt;
        //Formulate Translation Requests&lt;br /&gt;
        //===============================&lt;br /&gt;
        if (id == llGetOwner())&lt;br /&gt;
		{	// If speaker is owner&lt;br /&gt;
			// I will do this dirty cheat by now&lt;br /&gt;
			// There should exist another clean way to filter speakers &amp;amp; receivers, I need to think about this&lt;br /&gt;
            for (w = 0; w &amp;lt; llGetListLength(agentsInTranslation); w += 4)&lt;br /&gt;
            {	//Loop through translation group and do appropriate translations as needed&lt;br /&gt;
                recepID = llList2Integer(agentsInTranslation, w + 3);&lt;br /&gt;
                recepLan =  checkLanguage(llList2String(agentsInTranslation, w + 1));&lt;br /&gt;
                if (spkrLan != recepLan) &lt;br /&gt;
                {&lt;br /&gt;
                    lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
                    if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
                    {&lt;br /&gt;
                        lstliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
                        translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }                          &lt;br /&gt;
            if (translationCache != [])&lt;br /&gt;
            {	//Process Requests&lt;br /&gt;
                for (w = 0; w &amp;lt; llGetListLength(translationCache); w += 2)&lt;br /&gt;
                {	//====================================&lt;br /&gt;
                    //Translation&lt;br /&gt;
                    //====================================&lt;br /&gt;
                    //Forumulate and Send Translation Request&lt;br /&gt;
                    lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, w), [&amp;quot;|&amp;quot;],[]), 1); &lt;br /&gt;
                    Translate(0, llEscapeURL(message) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, w + 1), llList2String(translationCache, w)]);&lt;br /&gt;
                } &lt;br /&gt;
            }   &lt;br /&gt;
        }&lt;br /&gt;
        else  &lt;br /&gt;
        {	// if speaker is not owner&lt;br /&gt;
            lstliPos = llListFindList(agentsInTranslation, (list)llGetOwner());&lt;br /&gt;
            recepID = llList2Integer(agentsInTranslation, lstliPos + 3);&lt;br /&gt;
            recepLan =  checkLanguage(llList2String(agentsInTranslation , lstliPos + 1 ));&lt;br /&gt;
            if (spkrLan != recepLan) &lt;br /&gt;
            {&lt;br /&gt;
                lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
                if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
                {&lt;br /&gt;
                    lstliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
                    translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];&lt;br /&gt;
                }                                          &lt;br /&gt;
                if (translationCache != [])&lt;br /&gt;
                {	//====================================&lt;br /&gt;
                    //Translation&lt;br /&gt;
                    //====================================&lt;br /&gt;
                    //Forumulate and Send Translation Request&lt;br /&gt;
                    lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, lstliPos), [&amp;quot;|&amp;quot;],[]), 1); &lt;br /&gt;
                    Translate(0, llEscapeURL(message) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, lstliPos + 1), llList2String(translationCache, lstliPos)]);&lt;br /&gt;
                } &lt;br /&gt;
            }                             &lt;br /&gt;
        }   &lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
    {	//Process Response Code&lt;br /&gt;
        integer httliPos;&lt;br /&gt;
        string htttmpStr;&lt;br /&gt;
        if (~llListFindList(requestedTranslations, (list)request_id))&lt;br /&gt;
        {&lt;br /&gt;
            httliPos = llListFindList(requestedTranslations, [request_id]);&lt;br /&gt;
            processHTTPResponse(0, body, llCSV2List(llList2String(requestedTranslations, httliPos + 1)));&lt;br /&gt;
            requestedTranslations = llDeleteSubList(requestedTranslations, httliPos, httliPos + 1);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if (~llListFindList(tempDetections, (list)request_id))&lt;br /&gt;
		{	// We Trust the Google system, the Google´s guys are good and I am sure they will keep improving :-)&lt;br /&gt;
            integer tmpliPos = llListFindList(tempDetections, (list)request_id);&lt;br /&gt;
            key speakerID = llList2Key(tempDetections, tmpliPos + 1);&lt;br /&gt;
            tempDetections = llDeleteSubList(tempDetections, tmpliPos, tmpliPos + 3);&lt;br /&gt;
            string tmptmpStr = llToLower(llGetSubString(body, llSubStringIndex(body, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(body, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
			if ( tmptmpStr != &amp;quot;&amp;quot; &amp;amp;&amp;amp; contains(tmptmpStr, &amp;quot;err&amp;quot;) == 0 &amp;amp;&amp;amp; contains(tmptmpStr, &amp;quot;unn&amp;quot;) == 0 )			&lt;br /&gt;
			{	// if detects any language&lt;br /&gt;
				tmptmpStr = checkLanguage(tmptmpStr);&lt;br /&gt;
                if (~llListFindList(agentsInTranslation, (list)speakerID))&lt;br /&gt;
                {&lt;br /&gt;
                    integer tmpavliPos = llListFindList(agentsInTranslation, (list)speakerID);&lt;br /&gt;
                    string actlan = llList2String(agentsInTranslation, tmpavliPos + 1);&lt;br /&gt;
                    if (actlan != tmptmpStr)&lt;br /&gt;
                    {	// if language of speaker is not the same as detected language&lt;br /&gt;
                        agentsInTranslation = llListReplaceList(agentsInTranslation,[llList2Integer(agentsInTranslation,tmpavliPos + 2) + 1] , tmpavliPos + 2, tmpavliPos + 2);&lt;br /&gt;
                    } &lt;br /&gt;
                    else &lt;br /&gt;
                    {	// reset language checker for speaker&lt;br /&gt;
                        agentsInTranslation = llListReplaceList(agentsInTranslation,[0], tmpavliPos + 2, tmpavliPos + 2);&lt;br /&gt;
                    }&lt;br /&gt;
					if (llList2Integer(agentsInTranslation,tmpavliPos + 2) &amp;gt;= 3)&lt;br /&gt;
					{	// if anyone speaks on any language 3 times in a row&lt;br /&gt;
                        addAgent(speakerID, tmptmpStr, 0);&lt;br /&gt;
                    }                &lt;br /&gt;
                }                &lt;br /&gt;
            }            &lt;br /&gt;
        }              &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
	{		&lt;br /&gt;
        llSetTimerEvent(0.0); // we better reset timer by way of precaution&lt;br /&gt;
        if (isInitialized == FALSE)&lt;br /&gt;
        {&lt;br /&gt;
            enabled = TRUE;&lt;br /&gt;
            listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); &lt;br /&gt;
            llMessageLinked(LINK_THIS, 6877259, (string)enabled, NULL_KEY);&lt;br /&gt;
            isInitialized = TRUE;&lt;br /&gt;
            string mylanguage = llGetAgentLanguage(llGetOwner());&lt;br /&gt;
            if (llStringLength(mylanguage) &amp;lt; 1)&lt;br /&gt;
            {&lt;br /&gt;
                mylanguage = &amp;quot;en&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			if(~llListFindList(agentsInTranslation, (list)llGetOwner())&lt;br /&gt;
			{&lt;br /&gt;
				integer ownerliPos = llListFindList(agentsInTranslation, (list)llGetOwner());&lt;br /&gt;
				agentsInTranslation = llListReplaceList(agentsInTranslation,[mylanguage] , ownerliPos + 1, ownerliPos + 1);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [llGetOwner() , mylanguage , 0 , llRound(llFrand(2000000)) + 1];&lt;br /&gt;
			}&lt;br /&gt;
        }&lt;br /&gt;
        integer r;&lt;br /&gt;
        string  tmrtmpStr;&lt;br /&gt;
        list    tmrnewli; &lt;br /&gt;
        integer x;&lt;br /&gt;
        list  newList;&lt;br /&gt;
        float timeElapsed;  &lt;br /&gt;
        for (x = 0; x &amp;lt; llGetListLength(tempDetections); x += 2)&lt;br /&gt;
        {&lt;br /&gt;
			timeElapsed = llGetTime() - llList2Float(llCSV2List(llList2String(tempDetections, x + 1)), 0);&lt;br /&gt;
			if (timeElapsed &amp;lt; 60.0)&lt;br /&gt;
			{&lt;br /&gt;
				newList = (newList=[]) + newList + llList2List(tempDetections, x, x + 1);&lt;br /&gt;
			}&lt;br /&gt;
        }&lt;br /&gt;
        tempDetections = newList;&lt;br /&gt;
        newList = [];&lt;br /&gt;
        for (x = 0; x &amp;lt; llGetListLength(requestedTranslations); x += 2)&lt;br /&gt;
        {&lt;br /&gt;
            timeElapsed = llGetTime() - llList2Float(llCSV2List(llList2String(requestedTranslations, x + 1)), 0);&lt;br /&gt;
            if (timeElapsed &amp;lt; 60.0) &lt;br /&gt;
            {&lt;br /&gt;
                newList = (newList=[]) + newList + llList2List(requestedTranslations, x, x + 1);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        requestedTranslations = newList;&lt;br /&gt;
        if (isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            for (r = 0; r &amp;lt; llGetListLength(agentsInTranslation); r += 4)&lt;br /&gt;
            {&lt;br /&gt;
                tmrtmpStr = llList2String(llGetObjectDetails(llList2Key(agentsInTranslation, r), [OBJECT_POS]), 0);&lt;br /&gt;
                if ((llVecDist(llGetPos(), (vector)tmrtmpStr) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tmrtmpStr != &amp;quot;&amp;quot;))&lt;br /&gt;
                {&lt;br /&gt;
                    tmrnewli = (tmrnewli=[]) + tmrnewli + llList2List(agentsInTranslation, r, r + 3);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            agentsInTranslation = tmrnewli;&lt;br /&gt;
        }&lt;br /&gt;
        if ((autoLanguage) &amp;amp;&amp;amp; isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            llSensor(&amp;quot;&amp;quot;, NULL_KEY, AGENT, 20.0, PI);&lt;br /&gt;
        }&lt;br /&gt;
        llSetTimerEvent(4.0); // restart timer&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=690543</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=690543"/>
		<updated>2009-12-19T20:38:38Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: /* OK */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribucion al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente codigo fué originalmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mi manera...&lt;br /&gt;
No os riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;OK&#039;&#039; ===&lt;br /&gt;
Bueno, despues de respiñar todo lo que he podido, creo que el uso de memoria y la velocidad estan practicamente igual que en la version original pero bueno... en la variedad está el gusto no?&lt;br /&gt;
Ya he probado un poco el codigo, y parece que funciona aunque estoy teniendo algunos problemas... Por ejemplo creo que el sistema de traduccion no funciona correctamente, y no me refiero al sistema de traduccion de Google (en mi opinion, si no es el mejor, es uno de los mejores del mundo), sino a que aun queda mucho trabajo por hacer en el script...&lt;br /&gt;
&lt;br /&gt;
El siguiente paso sera intentar dividir el script en dos, o si es posible en tres para repartir el uso de memoria. Tambien me gustaria probar un truco que uso a menudo para traducir paginas en un idioma que no entiendo, lo que hago es que en vez de traducir directamente al español, primero lo traduzco a inglés, y luego desde inglés al español, parece una tonteria y un gasto innecesario, pero si lo hago es porque así suelo entender mejor las traducciones.&lt;br /&gt;
Quiero por un lado el sistema de comunicacion y evaluacion entre traductores, y por otro el sistema de traduccion entre avatares, ¿es muy dificil? no se ya lo veremos...&lt;br /&gt;
&lt;br /&gt;
Well, after saving as much as I could, I think the memory usage and the speed are technically the same as in the original script, but well, in the variety is the taste, isnt it?. &lt;br /&gt;
I have tested a bit the code above already, and it seems to work altought i´m having some problems...&lt;br /&gt;
For instance i think the translation system is not working properly, and i dont mean the Google´s translation system (in my opinion, if is not the best, one of the bests), but that there is still much work to do in the script...&lt;br /&gt;
&lt;br /&gt;
The next step will be to try to divide the script in 2, or 3 if is possible, so we can spread the memory usage. Also I would like to test a trick i use often for to translate languages that i dont understand, what I do first is to translate that language into English, and then from English to Spanish, it seems a nonsense and unnecesary waste, but if i do it is becouse so i usually understand the translations better.&lt;br /&gt;
I want by one part the translators communications and evaluation system, and by other the translation system between avatars, is it very difficult? I don´t know , we will see...&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Es dificil... me está costando pero ya veremos...&lt;br /&gt;
Its difficult... i am struggling but we will see...&lt;br /&gt;
&lt;br /&gt;
chu chu chu&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
De Güatemala a Güatepeor, Sin comentarios...&lt;br /&gt;
&lt;br /&gt;
From Güatebad to Güateworse, No comments...&lt;br /&gt;
&lt;br /&gt;
Buscando en Internet he encontrado este [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html API de Yahoo] comprobador de ortografía, aunque creo que por ahora sólo soporta el lenguage inglés por ahora sería interesante añadirlo al proyecto&lt;br /&gt;
&lt;br /&gt;
Searching on the web I crossed in my way with this spell checker [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html Yahoo´s API] , I think that it only supports English language by now althought it would be interesting to add it to the project&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
ESTO ES EL TRADUCTOR &amp;quot;fracaso&amp;quot; por ahora... Necesito limpiar el codigo y rehacer algunas cosas&lt;br /&gt;
&lt;br /&gt;
THIS IS THE TRANSLATOR &amp;quot;mess&amp;quot; by now... I need to clean the code and rework some things&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Personal Translator&lt;br /&gt;
//Universal Translator (Mods made in Perry Mizin)&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//November 12, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Web Server Services powered by Google &lt;br /&gt;
//Variables&lt;br /&gt;
list requestedTranslations;&lt;br /&gt;
list tempDetections;&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
list requestList;&lt;br /&gt;
integer listenID; &lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
integer showTranslation = FALSE;&lt;br /&gt;
integer tranObjects = TRUE; &lt;br /&gt;
integer isInitialized = FALSE;&lt;br /&gt;
string  options;&lt;br /&gt;
key tempValue;&lt;br /&gt;
//Functions&lt;br /&gt;
integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex&lt;br /&gt;
{&lt;br /&gt;
    return ~llSubStringIndex(haystack, needle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sendIM(key imid, string imstr)&lt;br /&gt;
{	// llInstantMessage(key id , string message) causes the script to sleep for 2 seconds&lt;br /&gt;
	if (M &amp;gt;= 10)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334400, imstr, imid);&lt;br /&gt;
		M = 1;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 9)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334410, imstr, imid);&lt;br /&gt;
		M = 10;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 8)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334420, imstr, imid);&lt;br /&gt;
		M = 9;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 7)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334430, imstr, imid);&lt;br /&gt;
		M = 8;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 6)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334440, imstr, imid);&lt;br /&gt;
		M = 7;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 5)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334450, imstr, imid);&lt;br /&gt;
		M = 6;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 4)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334460, imstr, imid);&lt;br /&gt;
		M = 5;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 3)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334470, imstr, imid);&lt;br /&gt;
		M = 4;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 2)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334480, imstr, imid);&lt;br /&gt;
		M = 3;&lt;br /&gt;
	}&lt;br /&gt;
	else if (M == 1)&lt;br /&gt;
	{&lt;br /&gt;
		llMessageLinked(LINK_THIS, 2334490, imstr, imid);&lt;br /&gt;
		M = 2;&lt;br /&gt;
	}&lt;br /&gt;
	if (showTranslation == TRUE)&lt;br /&gt;
	{&lt;br /&gt;
		if (imid != llGetOwner())&lt;br /&gt;
	    {&lt;br /&gt;
	    	llOwnerSay(imstr + &amp;quot; @&amp;quot; + llKey2Name(imid));  //llOwnerSay(string message) has no delay&lt;br /&gt;
	    }&lt;br /&gt;
	}   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
detectLanguage(string dtcmsg, key dtckey)&lt;br /&gt;
{&lt;br /&gt;
    tempValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&amp;amp;q=&amp;quot; + llEscapeURL(dtcmsg), [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot; &amp;quot;);&lt;br /&gt;
    if (tempValue != NULL_KEY)&lt;br /&gt;
    {&lt;br /&gt;
        tempDetections = (tempDetections=[]) + tempDetections + [tempValue, dtckey];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Translate(integer chkn, string chkmsg, list chkli)&lt;br /&gt;
{&lt;br /&gt;
    key returnValue;&lt;br /&gt;
    returnValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&amp;amp;q=&amp;quot; + chkmsg, [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot;&amp;quot;);&lt;br /&gt;
    if (returnValue != NULL_KEY)&lt;br /&gt;
    {	//Translation&lt;br /&gt;
        requestedTranslations = (requestedTranslations=[]) + requestedTranslations + [returnValue, llList2CSV(chkli)];&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llSleep(5.0); //Something has gone horribly wrong, sleep 5 seconds to clear throttle&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string checkLanguage(string chklantmpStr)&lt;br /&gt;
{&lt;br /&gt;
    if (chklantmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;en&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else if (chklantmpStr == &amp;quot;und&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;el&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if (llGetSubString(chklantmpStr, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = llGetSubString(chklantmpStr, 0, 1);&lt;br /&gt;
    }&lt;br /&gt;
    return chklantmpStr;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
    integer avliPos;&lt;br /&gt;
    integer idNum;&lt;br /&gt;
    if (~llListFindList(agentsInTranslation, (list)avid))&lt;br /&gt;
    {&lt;br /&gt;
        avliPos = llListFindList(agentsInTranslation, (list)avid);&lt;br /&gt;
        agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, chklan], avliPos + 1, avliPos + 2);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        @at;&lt;br /&gt;
        idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
        if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
        {       &lt;br /&gt;
            jump at;&lt;br /&gt;
        }&lt;br /&gt;
        agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, chklan, idNum];&lt;br /&gt;
        // llMessageLinked(LINK_THIS, 64562349, avlan, avid);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string addNewAgent(key newavid)&lt;br /&gt;
{&lt;br /&gt;
    string speakerLan; &lt;br /&gt;
    if (llGetAgentSize(newavid) != ZERO_VECTOR)&lt;br /&gt;
    {&lt;br /&gt;
        speakerLan  = checkLanguage(llGetAgentLanguage(newavid));&lt;br /&gt;
        if (speakerLan == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
            addAgent(newavid, speakerLan, 0);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            addAgent(newavid, speakerLan, 0);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return speakerLan;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
    if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
    {&lt;br /&gt;
        integer gkliPos = llListFindList(agentsInTranslation, (list)agentID);&lt;br /&gt;
        return llList2Key(agentsInTranslation, gkliPos - 3);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
processHTTPResponse(integer ntype, string bodyStr, list httli)&lt;br /&gt;
{&lt;br /&gt;
    integer spkliPos;&lt;br /&gt;
    list    recepientList;&lt;br /&gt;
    key     recepientID;&lt;br /&gt;
    string  recepientLanguage;&lt;br /&gt;
    string  languagePair;&lt;br /&gt;
    key     speakerID;&lt;br /&gt;
    string  speakerName;&lt;br /&gt;
    string  speakerLanguage;&lt;br /&gt;
    string  translatedText;&lt;br /&gt;
    string  lantmpStr;&lt;br /&gt;
    integer z;&lt;br /&gt;
    list    paramtmpli;&lt;br /&gt;
    //===================&lt;br /&gt;
    //Process Translation&lt;br /&gt;
    //===================&lt;br /&gt;
        speakerID  = llList2Key(httli, 1);&lt;br /&gt;
        speakerName = llKey2Name(speakerID);&lt;br /&gt;
        if (speakerName == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
        }&lt;br /&gt;
        recepientList = llParseString2List(llList2String(httli, 2), [&amp;quot;@&amp;quot;], []);&lt;br /&gt;
        paramtmpli = llParseStringKeepNulls(llList2String(httli, 3), [&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
        recepientLanguage = llList2String(paramtmpli, 1);&lt;br /&gt;
        languagePair = llDumpList2String(paramtmpli, &amp;quot;&amp;gt;&amp;gt;&amp;quot;); &lt;br /&gt;
        //Perform Text Cleanup&lt;br /&gt;
        translatedText = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;detectedSourceLanguage\&amp;quot;:\&amp;quot;&amp;quot;));&lt;br /&gt;
        //Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
        if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            lantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
            for(z = llStringLength(translatedText);z &amp;gt;= 0; z--)&lt;br /&gt;
            {&lt;br /&gt;
                lantmpStr = (lantmpStr=&amp;quot;&amp;quot;) + lantmpStr + llGetSubString(translatedText, z, z); &lt;br /&gt;
            }&lt;br /&gt;
            translatedText = lantmpStr;&lt;br /&gt;
        }   &lt;br /&gt;
        lantmpStr = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
        if (showTranslation)&lt;br /&gt;
        {&lt;br /&gt;
            sendIM(speakerID, lantmpStr);&lt;br /&gt;
        } &lt;br /&gt;
        for (z = 0; z &amp;lt; llGetListLength(recepientList); z += 1)&lt;br /&gt;
        {&lt;br /&gt;
            recepientID = getAgentKey(llList2Integer(recepientList, z));&lt;br /&gt;
            if (recepientID != &amp;quot;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, [recepientID]) + 1);&lt;br /&gt;
                if (recepientLanguage != speakerLanguage)&lt;br /&gt;
                {&lt;br /&gt;
                    sendIM(recepientID, lantmpStr);&lt;br /&gt;
                }&lt;br /&gt;
            }  &lt;br /&gt;
        }&lt;br /&gt;
        return;   &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
         llSetTimerEvent(5);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
    {&lt;br /&gt;
        list ltmpli;&lt;br /&gt;
        if (num == 8434532)&lt;br /&gt;
        {&lt;br /&gt;
            enabled = (integer)lstr;&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 3342976)&lt;br /&gt;
        {	//Send Preferences&lt;br /&gt;
            options = lstr;&lt;br /&gt;
            if (isInitialized == FALSE) return;&lt;br /&gt;
            ltmpli = llCSV2List(options);&lt;br /&gt;
            showTranslation = llList2Integer(ltmpli, 0);&lt;br /&gt;
            tranObjects = llList2Integer(ltmpli, 1);&lt;br /&gt;
            autoLanguage = llList2Integer(ltmpli, 2);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    sensor(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        integer s;&lt;br /&gt;
        key sid;&lt;br /&gt;
        for (s = 0; s &amp;lt; num_detected; s += 1)&lt;br /&gt;
        {&lt;br /&gt;
            sid = llDetectedKey(s);&lt;br /&gt;
			if (~llListFindList(agentsInTranslation, (list)sid))&lt;br /&gt;
			{ }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                addNewAgent(sid);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
	no_sensor()&lt;br /&gt;
	{ }&lt;br /&gt;
    &lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        integer w;&lt;br /&gt;
        string  spkrLan;&lt;br /&gt;
        string  recepLan;&lt;br /&gt;
        integer recepID;&lt;br /&gt;
        integer lstliPos;&lt;br /&gt;
        string  lanpair;&lt;br /&gt;
        list    translationCache;&lt;br /&gt;
        //Translator Engine Code&lt;br /&gt;
        if ((!enabled) &amp;amp;&amp;amp; (isMaster == 1))&lt;br /&gt;
        {&lt;br /&gt;
            return;&lt;br /&gt;
        } &lt;br /&gt;
        if (!tranObjects)&lt;br /&gt;
        {&lt;br /&gt;
            if (llGetAgentSize(id) == ZERO_VECTOR)&lt;br /&gt;
            {&lt;br /&gt;
            return;&lt;br /&gt;
            } &lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                detectLanguage(message, id);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            detectLanguage(message, id);&lt;br /&gt;
        }            &lt;br /&gt;
        if (~llListFindList(agentsInTranslation, (list)id))&lt;br /&gt;
        {&lt;br /&gt;
            lstliPos = llListFindList(agentsInTranslation, (list)id);          &lt;br /&gt;
            spkrLan = llList2String(agentsInTranslation, lstliPos + 1);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            spkrLan = addNewAgent(id);&lt;br /&gt;
        }&lt;br /&gt;
        //===============================&lt;br /&gt;
        //Formulate Translation Requests&lt;br /&gt;
        //===============================&lt;br /&gt;
        if (id == llGetOwner())&lt;br /&gt;
		{	// If speaker is owner&lt;br /&gt;
			// I will do this dirty cheat by now&lt;br /&gt;
			// There should exist another clean way to filter speakers &amp;amp; receivers, I need to think about this&lt;br /&gt;
            for (w = 0; w &amp;lt; llGetListLength(agentsInTranslation); w += 4)&lt;br /&gt;
            {	//Loop through translation group and do appropriate translations as needed&lt;br /&gt;
                recepID = llList2Integer(agentsInTranslation, w + 3);&lt;br /&gt;
                recepLan =  checkLanguage(llList2String(agentsInTranslation, w + 1));&lt;br /&gt;
                if (spkrLan != recepLan) &lt;br /&gt;
                {&lt;br /&gt;
                    lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
                    if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
                    {&lt;br /&gt;
                        lstliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
                        translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }                          &lt;br /&gt;
            if (translationCache != [])&lt;br /&gt;
            {	//Process Requests&lt;br /&gt;
                for (w = 0; w &amp;lt; llGetListLength(translationCache); w += 2)&lt;br /&gt;
                {	//====================================&lt;br /&gt;
                    //Translation&lt;br /&gt;
                    //====================================&lt;br /&gt;
                    //Forumulate and Send Translation Request&lt;br /&gt;
                    lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, w), [&amp;quot;|&amp;quot;],[]), 1); &lt;br /&gt;
                    Translate(0, llEscapeURL(message) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, w + 1), llList2String(translationCache, w)]);&lt;br /&gt;
                } &lt;br /&gt;
            }   &lt;br /&gt;
        }&lt;br /&gt;
        else  &lt;br /&gt;
        {	// if speaker is not owner&lt;br /&gt;
            lstliPos = llListFindList(agentsInTranslation, (list)llGetOwner());&lt;br /&gt;
            recepID = llList2Integer(agentsInTranslation, lstliPos + 3);&lt;br /&gt;
            recepLan =  checkLanguage(llList2String(agentsInTranslation , lstliPos + 1 ));&lt;br /&gt;
            if (spkrLan != recepLan) &lt;br /&gt;
            {&lt;br /&gt;
                lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
                if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
                {&lt;br /&gt;
                    lstliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
                    translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];&lt;br /&gt;
                }                                          &lt;br /&gt;
                if (translationCache != [])&lt;br /&gt;
                {	//====================================&lt;br /&gt;
                    //Translation&lt;br /&gt;
                    //====================================&lt;br /&gt;
                    //Forumulate and Send Translation Request&lt;br /&gt;
                    lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, lstliPos), [&amp;quot;|&amp;quot;],[]), 1); &lt;br /&gt;
                    Translate(0, llEscapeURL(message) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, lstliPos + 1), llList2String(translationCache, lstliPos)]);&lt;br /&gt;
                } &lt;br /&gt;
            }                             &lt;br /&gt;
        }   &lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
    {	//Process Response Code&lt;br /&gt;
        integer httliPos;&lt;br /&gt;
        string htttmpStr;&lt;br /&gt;
        if (~llListFindList(requestedTranslations, (list)request_id))&lt;br /&gt;
        {&lt;br /&gt;
            httliPos = llListFindList(requestedTranslations, [request_id]);&lt;br /&gt;
            processHTTPResponse(0, body, llCSV2List(llList2String(requestedTranslations, httliPos + 1)));&lt;br /&gt;
            requestedTranslations = llDeleteSubList(requestedTranslations, httliPos, httliPos + 1);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if (~llListFindList(tempDetections, (list)request_id))&lt;br /&gt;
		{	// We Trust the Google system, the Google´s guys are good and I am sure they will keep improving :-)&lt;br /&gt;
            integer tmpliPos = llListFindList(tempDetections, (list)request_id);&lt;br /&gt;
            key speakerID = llList2Key(tempDetections, tmpliPos + 1);&lt;br /&gt;
            tempDetections = llDeleteSubList(tempDetections, tmpliPos, tmpliPos + 3);&lt;br /&gt;
            string tmptmpStr = llToLower(llGetSubString(body, llSubStringIndex(body, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(body, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
			if ( tmptmpStr != &amp;quot;&amp;quot; &amp;amp;&amp;amp; contains(tmptmpStr, &amp;quot;err&amp;quot;) == 0 &amp;amp;&amp;amp; contains(tmptmpStr, &amp;quot;unn&amp;quot;) == 0 )			&lt;br /&gt;
			{	// if detects any language&lt;br /&gt;
				tmptmpStr = checkLanguage(tmptmpStr);&lt;br /&gt;
                if (~llListFindList(agentsInTranslation, (list)speakerID))&lt;br /&gt;
                {&lt;br /&gt;
                    integer tmpavliPos = llListFindList(agentsInTranslation, (list)speakerID);&lt;br /&gt;
                    string actlan = llList2String(agentsInTranslation, tmpavliPos + 1);&lt;br /&gt;
                    if (actlan != tmptmpStr)&lt;br /&gt;
                    {	// if language of speaker is not the same as detected language&lt;br /&gt;
                        agentsInTranslation = llListReplaceList(agentsInTranslation,[llList2Integer(agentsInTranslation,tmpavliPos + 2) + 1] , tmpavliPos + 2, tmpavliPos + 2);&lt;br /&gt;
                    } &lt;br /&gt;
                    else &lt;br /&gt;
                    {	// reset language checker for speaker&lt;br /&gt;
                        agentsInTranslation = llListReplaceList(agentsInTranslation,[0], tmpavliPos + 2, tmpavliPos + 2);&lt;br /&gt;
                    }&lt;br /&gt;
					if (llList2Integer(agentsInTranslation,tmpavliPos + 2) &amp;gt;= 3)&lt;br /&gt;
					{	// if anyone speaks on any language 3 times in a row&lt;br /&gt;
                        addAgent(speakerID, tmptmpStr, 0);&lt;br /&gt;
                    }                &lt;br /&gt;
                }                &lt;br /&gt;
            }            &lt;br /&gt;
        }              &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
	{		&lt;br /&gt;
        llSetTimerEvent(0.0); // we better reset timer by way of precaution&lt;br /&gt;
        if (isInitialized == FALSE)&lt;br /&gt;
        {&lt;br /&gt;
            enabled = TRUE;&lt;br /&gt;
            listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); &lt;br /&gt;
            llMessageLinked(LINK_THIS, 6877259, (string)enabled, NULL_KEY);&lt;br /&gt;
            isInitialized = TRUE;&lt;br /&gt;
            string mylanguage = llGetAgentLanguage(llGetOwner());&lt;br /&gt;
            if (llStringLength(mylanguage) &amp;lt; 1)&lt;br /&gt;
            {&lt;br /&gt;
                mylanguage = &amp;quot;en&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			if(~llListFindList(agentsInTranslation, (list)llGetOwner())&lt;br /&gt;
			{&lt;br /&gt;
				integer ownerliPos = llListFindList(agentsInTranslation, (list)llGetOwner());&lt;br /&gt;
				agentsInTranslation = llListReplaceList(agentsInTranslation,[mylanguage] , ownerliPos + 1, ownerliPos + 1);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [llGetOwner() , mylanguage , 0 , llRound(llFrand(2000000)) + 1];&lt;br /&gt;
			}&lt;br /&gt;
        }&lt;br /&gt;
        integer r;&lt;br /&gt;
        string  tmrtmpStr;&lt;br /&gt;
        list    tmrnewli; &lt;br /&gt;
        integer x;&lt;br /&gt;
        list  newList;&lt;br /&gt;
        float timeElapsed;  &lt;br /&gt;
        for (x = 0; x &amp;lt; llGetListLength(tempDetections); x += 2)&lt;br /&gt;
        {&lt;br /&gt;
			timeElapsed = llGetTime() - llList2Float(llCSV2List(llList2String(tempDetections, x + 1)), 0);&lt;br /&gt;
			if (timeElapsed &amp;lt; 60.0)&lt;br /&gt;
			{&lt;br /&gt;
				newList = (newList=[]) + newList + llList2List(tempDetections, x, x + 1);&lt;br /&gt;
			}&lt;br /&gt;
        }&lt;br /&gt;
        tempDetections = newList;&lt;br /&gt;
        newList = [];&lt;br /&gt;
        for (x = 0; x &amp;lt; llGetListLength(requestedTranslations); x += 2)&lt;br /&gt;
        {&lt;br /&gt;
            timeElapsed = llGetTime() - llList2Float(llCSV2List(llList2String(requestedTranslations, x + 1)), 0);&lt;br /&gt;
            if (timeElapsed &amp;lt; 60.0) &lt;br /&gt;
            {&lt;br /&gt;
                newList = (newList=[]) + newList + llList2List(requestedTranslations, x, x + 1);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        requestedTranslations = newList;&lt;br /&gt;
        if (isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            for (r = 0; r &amp;lt; llGetListLength(agentsInTranslation); r += 4)&lt;br /&gt;
            {&lt;br /&gt;
                tmrtmpStr = llList2String(llGetObjectDetails(llList2Key(agentsInTranslation, r), [OBJECT_POS]), 0);&lt;br /&gt;
                if ((llVecDist(llGetPos(), (vector)tmrtmpStr) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tmrtmpStr != &amp;quot;&amp;quot;))&lt;br /&gt;
                {&lt;br /&gt;
                    tmrnewli = (tmrnewli=[]) + tmrnewli + llList2List(agentsInTranslation, r, r + 3);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            agentsInTranslation = tmrnewli;&lt;br /&gt;
        }&lt;br /&gt;
        if ((autoLanguage) &amp;amp;&amp;amp; isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            llSensor(&amp;quot;&amp;quot;, NULL_KEY, AGENT, 20.0, PI);&lt;br /&gt;
        }&lt;br /&gt;
        llSetTimerEvent(4.0); // restart timer&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=690502</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=690502"/>
		<updated>2009-12-19T14:45:43Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: /* OK */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribucion al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente codigo fué originalmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mi manera...&lt;br /&gt;
No os riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;OK&#039;&#039; ===&lt;br /&gt;
Bueno, despues de respiñar todo lo que he podido, creo que el uso de memoria y la velocidad estan practicamente igual que en la version original pero bueno... en la variedad está el gusto no?&lt;br /&gt;
Ya he probado un poco el codigo, y parece que funciona aunque estoy teniendo algunos problemas... Por ejemplo creo que el sistema de traduccion no funciona correctamente, y no me refiero al sistema de traduccion de Google (en mi opinion, si no es el mejor, es uno de los mejores del mundo), sino a que aun queda mucho trabajo por hacer en el script...&lt;br /&gt;
&lt;br /&gt;
El siguiente paso sera intentar dividir el script en dos, o si es posible en tres para repartir el uso de memoria. Tambien me gustaria probar un truco que uso a menudo para traducir paginas en un idioma que no entiendo, lo que hago es que en vez de traducir directamente al español, primero lo traduzco a inglés, y luego desde inglés al español, parece una tonteria y un gasto innecesario, pero si lo hago es porque así suelo entender mejor las traducciones.&lt;br /&gt;
Quiero por un lado el sistema de comunicacion y evaluacion entre traductores, y por otro el sistema de traduccion entre avatares, ¿es muy dificil? no se ya lo veremos...&lt;br /&gt;
&lt;br /&gt;
Well, after saving as much as I could, I think the memory usage and the speed are technically the same as in the original script, but well, in the variety is the taste, isnt it?. &lt;br /&gt;
I have tested a bit the code above already, and it seems to work altought i´m having some problems...&lt;br /&gt;
For instance i think the translation system is not working properly, and i dont mean the Google´s translation system (in my opinion, if is not the best, one of the bests), but that there is still much work to do in the script...&lt;br /&gt;
&lt;br /&gt;
The next step will be to try to divide the script in 2, or 3 if is possible, so we can spread the memory usage. Also I would like to test a trick i use often for to translate languages that i dont understand, what I do first is to translate that language into English, and then from English to Spanish, it seems a nonsense and unnecesary waste, but if i do it is becouse so i usually understand the translations better.&lt;br /&gt;
I want by one part the translators communications and evaluation system, and by other the translation system between avatars, is it very difficult? I don´t know , we will see...&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Es dificil... me está costando pero ya veremos...&lt;br /&gt;
Its difficult... i am struggling but we will see...&lt;br /&gt;
&lt;br /&gt;
chu chu chu&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
De Güatemala a Güatepeor, Sin comentarios...&lt;br /&gt;
&lt;br /&gt;
From Güatebad to Güateworse, No comments...&lt;br /&gt;
&lt;br /&gt;
Buscando en Internet he encontrado este [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html API de Yahoo] comprobador de ortografía, aunque creo que por ahora sólo soporta el lenguage inglés por ahora sería interesante añadirlo al proyecto&lt;br /&gt;
&lt;br /&gt;
Searching on the web I crossed in my way with this spell checker [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html Yahoo´s API] , I think that it only supports English language by now althought it would be interesting to add it to the project&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
ESTO ES EL TRADUCTOR &amp;quot;fracaso&amp;quot; por ahora... Necesito limpiar el codigo y rehacer algunas cosas&lt;br /&gt;
&lt;br /&gt;
THIS IS THE TRANSLATOR &amp;quot;mess&amp;quot; by now... I need to clean the code and rework some things&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Personal Translator&lt;br /&gt;
//Universal Translator (Mods made in Perry Mizin)&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//November 12, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Web Server Services powered by Google &lt;br /&gt;
//Variables&lt;br /&gt;
list requestedTranslations;&lt;br /&gt;
list tempDetections;&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
list requestList;&lt;br /&gt;
integer listenID; &lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
integer showTranslation = FALSE;&lt;br /&gt;
integer tranObjects = TRUE; &lt;br /&gt;
integer isInitialized = FALSE;&lt;br /&gt;
string  options;&lt;br /&gt;
key tempValue;&lt;br /&gt;
//Functions&lt;br /&gt;
integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex&lt;br /&gt;
{&lt;br /&gt;
    return ~llSubStringIndex(haystack, needle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sendIM(key imid, string imstr)&lt;br /&gt;
{&lt;br /&gt;
    llInstantMessage(imid, llUnescapeURL(imstr));&lt;br /&gt;
    if (imid != llGetOwner())&lt;br /&gt;
    {&lt;br /&gt;
    llOwnerSay(llUnescapeURL(imstr) + &amp;quot; @&amp;quot; + llKey2Name(imid));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
detectLanguage(string dtcmsg, key dtckey)&lt;br /&gt;
{&lt;br /&gt;
    dtcmsg = &amp;quot;detect?v=1.0&amp;amp;q=&amp;quot; + llEscapeURL(dtcmsg);&lt;br /&gt;
    tempValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/&amp;quot; + dtcmsg, [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot; &amp;quot;);&lt;br /&gt;
    if (tempValue != NULL_KEY)&lt;br /&gt;
    {&lt;br /&gt;
        tempDetections = (tempDetections=[]) + tempDetections + [tempValue, dtckey];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
checkThrottle(integer chkn, string chkmsg, list chkli)&lt;br /&gt;
{&lt;br /&gt;
    key returnValue;&lt;br /&gt;
    //loop though list and remove items older than 25 seconds&lt;br /&gt;
    chkmsg = &amp;quot;translate?v=1.0&amp;amp;q=&amp;quot; + chkmsg;&lt;br /&gt;
    requestList = (requestList=[]) + requestList + [llGetTime()];&lt;br /&gt;
    returnValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/&amp;quot; + chkmsg, [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot;&amp;quot;);&lt;br /&gt;
    if (returnValue != NULL_KEY)&lt;br /&gt;
    {&lt;br /&gt;
            //Translation&lt;br /&gt;
            requestedTranslations = (requestedTranslations=[]) + requestedTranslations + [returnValue, llList2CSV(chkli)];&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llSleep(40.0); //Something has gone horribly wrong, sleep 40 seconds to clear throttle&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string checkLanguage(string chklantmpStr)&lt;br /&gt;
{&lt;br /&gt;
    if (chklantmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;en&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else if (chklantmpStr == &amp;quot;und&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;el&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if (llGetSubString(chklantmpStr, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = llGetSubString(chklantmpStr, 0, 1);&lt;br /&gt;
    }&lt;br /&gt;
    return chklantmpStr;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
    integer avliPos;&lt;br /&gt;
    integer idNum;&lt;br /&gt;
    if (~llListFindList(agentsInTranslation, (list)avid))&lt;br /&gt;
    {&lt;br /&gt;
        avliPos = llListFindList(agentsInTranslation, (list)avid);&lt;br /&gt;
        agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, chklan], avliPos + 1, avliPos + 2);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        @at;&lt;br /&gt;
        idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
        if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
        {       &lt;br /&gt;
            jump at;&lt;br /&gt;
        }&lt;br /&gt;
        agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, chklan, idNum];&lt;br /&gt;
        llMessageLinked(LINK_THIS, 64562349, avlan, avid);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string addNewAgent(key newavid)&lt;br /&gt;
{&lt;br /&gt;
    string speakerLan; &lt;br /&gt;
    if (llGetAgentSize(newavid) != ZERO_VECTOR)&lt;br /&gt;
    {&lt;br /&gt;
        speakerLan  = checkLanguage(llGetAgentLanguage(newavid));&lt;br /&gt;
        if (speakerLan == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
            addAgent(newavid, speakerLan, 0);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            addAgent(newavid, speakerLan, 0);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return speakerLan;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
    if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
    {&lt;br /&gt;
        integer gkliPos = llListFindList(agentsInTranslation, (list)agentID);&lt;br /&gt;
        return llList2Key(agentsInTranslation, gkliPos - 3);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
processHTTPResponse(integer ntype, string bodyStr, list httli)&lt;br /&gt;
{&lt;br /&gt;
    integer spkliPos;&lt;br /&gt;
    list    recepientList;&lt;br /&gt;
    key     recepientID;&lt;br /&gt;
    string  recepientLanguage;&lt;br /&gt;
    string  languagePair;&lt;br /&gt;
    key     speakerID;&lt;br /&gt;
    string  speakerName;&lt;br /&gt;
    string  speakerLanguage;&lt;br /&gt;
    string  translatedText;&lt;br /&gt;
    string  lantmpStr;&lt;br /&gt;
    integer z;&lt;br /&gt;
    list    paramtmpli;&lt;br /&gt;
    //===================&lt;br /&gt;
    //Process Translation&lt;br /&gt;
    //===================&lt;br /&gt;
        speakerID  = llList2Key(httli, 1);&lt;br /&gt;
        speakerName = llKey2Name(speakerID);&lt;br /&gt;
        if (speakerName == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
        }&lt;br /&gt;
        recepientList = llParseString2List(llList2String(httli, 2), [&amp;quot;@&amp;quot;], []);&lt;br /&gt;
        paramtmpli = llParseStringKeepNulls(llList2String(httli, 3), [&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
        recepientLanguage = llList2String(paramtmpli, 1);&lt;br /&gt;
        languagePair = llDumpList2String(paramtmpli, &amp;quot;&amp;gt;&amp;gt;&amp;quot;); &lt;br /&gt;
        //Perform Text Cleanup&lt;br /&gt;
        translatedText = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;detectedSourceLanguage\&amp;quot;:\&amp;quot;&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
        //Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
        if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            lantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
            for(z = llStringLength(translatedText);z &amp;gt;= 0; z--)&lt;br /&gt;
            {&lt;br /&gt;
                lantmpStr = (lantmpStr=&amp;quot;&amp;quot;) + lantmpStr + llGetSubString(translatedText, z, z); &lt;br /&gt;
            }&lt;br /&gt;
            translatedText = lantmpStr;&lt;br /&gt;
        }   &lt;br /&gt;
        lantmpStr = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
        if (showTranslation)&lt;br /&gt;
        {&lt;br /&gt;
            sendIM(speakerID, lantmpStr);&lt;br /&gt;
        } &lt;br /&gt;
        for (z = 0; z &amp;lt; llGetListLength(recepientList); z += 1)&lt;br /&gt;
        {&lt;br /&gt;
            recepientID = getAgentKey(llList2Integer(recepientList, z));&lt;br /&gt;
            if (recepientID != &amp;quot;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, [recepientID]) + 1);&lt;br /&gt;
                if (recepientLanguage != speakerLanguage)&lt;br /&gt;
                {&lt;br /&gt;
                    sendIM(recepientID, lantmpStr);&lt;br /&gt;
                }&lt;br /&gt;
            }  &lt;br /&gt;
        }&lt;br /&gt;
        return;   &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
         llSetTimerEvent(5);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
    {&lt;br /&gt;
        list ltmpli;&lt;br /&gt;
        if (num == 8434532)&lt;br /&gt;
        {&lt;br /&gt;
            enabled = (integer)lstr;&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 3342976)&lt;br /&gt;
        {&lt;br /&gt;
            //Send Preferences&lt;br /&gt;
            options = lstr;&lt;br /&gt;
            if (isInitialized == FALSE) return;&lt;br /&gt;
            ltmpli = llCSV2List(options);&lt;br /&gt;
            showTranslation = llList2Integer(ltmpli, 0);&lt;br /&gt;
            tranObjects = llList2Integer(ltmpli, 1);&lt;br /&gt;
            autoLanguage = llList2Integer(ltmpli, 2);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    sensor(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        integer s;&lt;br /&gt;
        key     sid;&lt;br /&gt;
        for (s = 0; s &amp;lt; num_detected; s += 1)&lt;br /&gt;
        {&lt;br /&gt;
            sid = llDetectedKey(s);&lt;br /&gt;
            if (~llListFindList(agentsInTranslation, (list)sid)) { }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                addNewAgent(sid);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    no_sensor() { }&lt;br /&gt;
    &lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        integer w;&lt;br /&gt;
        string  spkrLan;&lt;br /&gt;
        string  recepLan;&lt;br /&gt;
        integer recepID;&lt;br /&gt;
        integer lstliPos;&lt;br /&gt;
        string  lanpair;&lt;br /&gt;
        list    translationCache;&lt;br /&gt;
        //Multiplexor Code&lt;br /&gt;
        //Translator Engine Code&lt;br /&gt;
        if ((!enabled) &amp;amp;&amp;amp; (isMaster == 1))&lt;br /&gt;
        {&lt;br /&gt;
            return;&lt;br /&gt;
        } &lt;br /&gt;
        if (!tranObjects)&lt;br /&gt;
        {&lt;br /&gt;
            if (llGetAgentSize(id) == ZERO_VECTOR)&lt;br /&gt;
            {&lt;br /&gt;
            return;&lt;br /&gt;
            } &lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                detectLanguage(message, id);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            detectLanguage(message, id);&lt;br /&gt;
        }&lt;br /&gt;
            &lt;br /&gt;
        if (~llListFindList(agentsInTranslation, (list)id))&lt;br /&gt;
        {&lt;br /&gt;
            lstliPos = llListFindList(agentsInTranslation, (list)id);          &lt;br /&gt;
            spkrLan = llList2String(agentsInTranslation, lstliPos + 1);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            spkrLan = addNewAgent(id);&lt;br /&gt;
        }&lt;br /&gt;
                //===============================&lt;br /&gt;
                //Formulate Translation Requests&lt;br /&gt;
                //===============================&lt;br /&gt;
        if (id == llGetOwner())&lt;br /&gt;
        {&lt;br /&gt;
            for (w = 0; w &amp;lt; llGetListLength(agentsInTranslation); w += 4)&lt;br /&gt;
            {&lt;br /&gt;
                //Loop through translation group and do appropriate translations as needed&lt;br /&gt;
                recepID = llList2Integer(agentsInTranslation, w + 3);&lt;br /&gt;
                recepLan =  checkLanguage(llList2String(agentsInTranslation, w + 1));&lt;br /&gt;
                if (spkrLan != recepLan) &lt;br /&gt;
                {&lt;br /&gt;
                    lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
                    if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
                    {&lt;br /&gt;
                        lstliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
                        translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }              &lt;br /&gt;
            //Process Requests&lt;br /&gt;
            if (translationCache != [])&lt;br /&gt;
            {&lt;br /&gt;
                for (w = 0; w &amp;lt; llGetListLength(translationCache); w += 2)&lt;br /&gt;
                {&lt;br /&gt;
                    //====================================&lt;br /&gt;
                    //Translation&lt;br /&gt;
                    //====================================&lt;br /&gt;
                    //Forumulate and Send Translation Request&lt;br /&gt;
                    lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, w), [&amp;quot;|&amp;quot;],[]), 1); &lt;br /&gt;
                    checkThrottle(0, llEscapeURL(message) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, w + 1), llList2String(translationCache, w)]);&lt;br /&gt;
                } &lt;br /&gt;
            }   &lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            lstliPos = llListFindList(agentsInTranslation, (list)llGetOwner());&lt;br /&gt;
            recepID = llList2Integer(agentsInTranslation, lstliPos + 3);&lt;br /&gt;
            recepLan =  checkLanguage(llList2String(agentsInTranslation , lstliPos + 1 ));&lt;br /&gt;
            if (spkrLan != recepLan) &lt;br /&gt;
            {&lt;br /&gt;
                lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
                if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
                {&lt;br /&gt;
                    lstliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
                    translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];&lt;br /&gt;
                }                                          &lt;br /&gt;
                if (translationCache != [])&lt;br /&gt;
                {&lt;br /&gt;
                        //====================================&lt;br /&gt;
                        //Translation&lt;br /&gt;
                        //====================================&lt;br /&gt;
                        //Forumulate and Send Translation Request&lt;br /&gt;
                        lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, lstliPos), [&amp;quot;|&amp;quot;],[]), 1); &lt;br /&gt;
                        checkThrottle(0, llEscapeURL(message) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, lstliPos + 1), llList2String(translationCache, lstliPos)]);&lt;br /&gt;
                } &lt;br /&gt;
            }                             &lt;br /&gt;
        }   &lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
    {&lt;br /&gt;
        //Process Resonse Code&lt;br /&gt;
        integer httliPos;&lt;br /&gt;
        string htttmpStr;&lt;br /&gt;
&lt;br /&gt;
        if (~llListFindList(requestedTranslations, (list)request_id))&lt;br /&gt;
        {&lt;br /&gt;
            httliPos = llListFindList(requestedTranslations, [request_id]);&lt;br /&gt;
            processHTTPResponse(0, body, llCSV2List(llList2String(requestedTranslations, httliPos + 1)));&lt;br /&gt;
            requestedTranslations = llDeleteSubList(requestedTranslations, httliPos, httliPos + 1);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if (~llListFindList(tempDetections, (list)request_id))&lt;br /&gt;
        {&lt;br /&gt;
            integer tmpliPos = llListFindList(tempDetections, (list)request_id);&lt;br /&gt;
            key speakerID = llList2Key(tempDetections, tmpliPos + 1);&lt;br /&gt;
            tempDetections = llDeleteSubList(tempDetections, tmpliPos, tmpliPos + 3);&lt;br /&gt;
            string tmptmpStr = llToLower(llGetSubString(body, llSubStringIndex(body, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(body, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
            if (contains(tmptmpStr, &amp;quot;err&amp;quot;) == 0 &amp;amp;&amp;amp; contains(tmptmpStr, &amp;quot;unn&amp;quot;) == 0 )&lt;br /&gt;
            {&lt;br /&gt;
                tmptmpStr = checkLanguage(tmptmpStr);&lt;br /&gt;
                if (~llListFindList(agentsInTranslation, (list)speakerID))&lt;br /&gt;
                {&lt;br /&gt;
                    integer tmpavliPos = llListFindList(agentsInTranslation, (list)speakerID);&lt;br /&gt;
                    string actlan = llList2String(agentsInTranslation, tmpavliPos + 1);&lt;br /&gt;
                    if (actlan != tmptmpStr)&lt;br /&gt;
                    {&lt;br /&gt;
                        agentsInTranslation = llListReplaceList(agentsInTranslation,[llList2Integer(agentsInTranslation,tmpavliPos + 2) + 1] , tmpavliPos + 2, tmpavliPos + 2);&lt;br /&gt;
                    } &lt;br /&gt;
                    else &lt;br /&gt;
                    {&lt;br /&gt;
                        agentsInTranslation = llListReplaceList(agentsInTranslation,[0], tmpavliPos + 2, tmpavliPos + 2);&lt;br /&gt;
                    }&lt;br /&gt;
                    if (llList2Integer(agentsInTranslation,tmpavliPos + 2) &amp;gt;= 4) //if any av talks on any language 4 times in a row&lt;br /&gt;
                    {&lt;br /&gt;
                        if (tmptmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
                        {&lt;br /&gt;
                            return;&lt;br /&gt;
                        }&lt;br /&gt;
                        else&lt;br /&gt;
                        {&lt;br /&gt;
                            addAgent(speakerID, tmptmpStr, 0);&lt;br /&gt;
                        }&lt;br /&gt;
                    }                &lt;br /&gt;
                }                &lt;br /&gt;
            }            &lt;br /&gt;
        }              &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
        if (isInitialized == FALSE)&lt;br /&gt;
        {&lt;br /&gt;
            enabled = TRUE;&lt;br /&gt;
            listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); &lt;br /&gt;
            llMessageLinked(LINK_THIS, 6877259, (string)enabled, NULL_KEY);&lt;br /&gt;
            isInitialized = TRUE;&lt;br /&gt;
            string mylanguage = llGetAgentLanguage(llGetOwner());&lt;br /&gt;
            if (llStringLength(mylanguage) &amp;lt; 1)&lt;br /&gt;
            {&lt;br /&gt;
                mylanguage = &amp;quot;en&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [llGetOwner() , mylanguage , 0 , llRound(llFrand(2000000)) + 1];&lt;br /&gt;
        }&lt;br /&gt;
        integer r;&lt;br /&gt;
        string  tmrtmpStr;&lt;br /&gt;
        list    tmrnewli; &lt;br /&gt;
        integer x;&lt;br /&gt;
        list  newList;&lt;br /&gt;
        float timeElapsed;  &lt;br /&gt;
        for (x = 0; x &amp;lt; llGetListLength(tempDetections); x += 2)&lt;br /&gt;
        {&lt;br /&gt;
            timeElapsed = llGetTime() - llList2Float(llCSV2List(llList2String(tempDetections, x + 1)), 0);&lt;br /&gt;
            if (timeElapsed &amp;lt; 60.0) &lt;br /&gt;
                newList = (newList=[]) + newList + llList2List(tempDetections, x, x + 1);&lt;br /&gt;
        }&lt;br /&gt;
        tempDetections = newList;&lt;br /&gt;
        newList = [];&lt;br /&gt;
        for (x = 0; x &amp;lt; llGetListLength(requestedTranslations); x += 2)&lt;br /&gt;
        {&lt;br /&gt;
            timeElapsed = llGetTime() - llList2Float(llCSV2List(llList2String(requestedTranslations, x + 1)), 0);&lt;br /&gt;
            if (timeElapsed &amp;lt; 60.0) &lt;br /&gt;
            {&lt;br /&gt;
                newList = (newList=[]) + newList + llList2List(requestedTranslations, x, x + 1);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        requestedTranslations = newList;&lt;br /&gt;
        if (isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            for (r = 0; r &amp;lt; llGetListLength(agentsInTranslation); r += 4)&lt;br /&gt;
            {&lt;br /&gt;
                tmrtmpStr = llList2String(llGetObjectDetails(llList2Key(agentsInTranslation, r), [OBJECT_POS]), 0);&lt;br /&gt;
                if ((llVecDist(llGetPos(), (vector)tmrtmpStr) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tmrtmpStr != &amp;quot;&amp;quot;))&lt;br /&gt;
                {&lt;br /&gt;
                    tmrnewli = (tmrnewli=[]) + tmrnewli + llList2List(agentsInTranslation, r, r + 3);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            agentsInTranslation = tmrnewli;&lt;br /&gt;
        }&lt;br /&gt;
        if ((autoLanguage) &amp;amp;&amp;amp; isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            llSensor(&amp;quot;&amp;quot;, NULL_KEY, AGENT, 20.0, PI);&lt;br /&gt;
        }&lt;br /&gt;
        llSetTimerEvent(4.0); // restart timer&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=690492</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=690492"/>
		<updated>2009-12-19T14:42:52Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribucion al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente codigo fué originalmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mi manera...&lt;br /&gt;
No os riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;OK&#039;&#039; ===&lt;br /&gt;
Bueno, despues de respiñar todo lo que he podido, creo que el uso de memoria y la velocidad estan practicamente igual que en la version original pero bueno... en la variedad está el gusto no?&lt;br /&gt;
Ya he probado un poco el codigo, y parece que funciona aunque estoy teniendo algunos problemas... Por ejemplo creo que el sistema de traduccion no funciona correctamente, y no me refiero al sistema de traduccion de Google (en mi opinion, si no es el mejor, es uno de los mejores del mundo), sino a que aun queda mucho trabajo por hacer en el script...&lt;br /&gt;
&lt;br /&gt;
El siguiente paso sera intentar dividir el script en dos, o si es posible en tres para repartir el uso de memoria. Tambien me gustaria probar un truco que uso a menudo para traducir paginas en un idioma que no entiendo, lo que hago es que en vez de traducir directamente al español, primero lo traduzco a inglés, y luego desde inglés al español, parece una tonteria y un gasto innecesario, pero si lo hago es porque así suelo entender mejor las traducciones.&lt;br /&gt;
Quiero por un lado el sistema de comunicacion y evaluacion entre traductores, y por otro el sistema de traduccion entre avatares, ¿es muy dificil? no se ya lo veremos...&lt;br /&gt;
&lt;br /&gt;
Well, after saving as much as I could, I think the memory usage and the speed are technically the same as in the original script, but well, in the variety is the taste, isnt it?. &lt;br /&gt;
I have tested a bit the code above already, and it seems to work altought i´m having some problems...&lt;br /&gt;
For instance i think the translation system is not working properly, and i dont mean the Google´s translation system (in my opinion, if is not the best, one of the bests), but that there is still much work to do in the script...&lt;br /&gt;
&lt;br /&gt;
The next step will be to try to divide the script in 2, or 3 if is possible, so we can spread the memory usage. Also I would like to test a trick i use often for to translate languages that i dont understand, what I do first is to translate that language into English, and then from English to Spanish, it seems a nonsense and unnecesary waste, but if i do it is becouse so i usually understand the translations better.&lt;br /&gt;
I want by one part the translators communications and evaluation system, and by other the translation system between avatars, is it very difficult? I don´t know , we will see...&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Es dificil... me está costando pero ya veremos...&lt;br /&gt;
Its difficult... i am struggling but we will see...&lt;br /&gt;
&lt;br /&gt;
chu chu chu&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
De Güatemala a Güatepeor, Sin comentarios...&lt;br /&gt;
&lt;br /&gt;
From Güatebad to Güateworse, No comments...&lt;br /&gt;
&lt;br /&gt;
Buscando en Internet he encontrado este [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html API de Yahoo] comprobador de ortografía, aunque creo que por ahora sólo soporta el lenguage inglés sería interesante añadirlo al proyecto&lt;br /&gt;
&lt;br /&gt;
Searching on the web I crossend in my way with this spell checker [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html Yahoo´s API] , I think that it only supports English language althought it would be interesting to add it to the project&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
ESTO ES EL TRADUCTOR &amp;quot;fracaso&amp;quot; por ahora... Necesito limpiar el codigo y rehacer algunas cosas&lt;br /&gt;
&lt;br /&gt;
THIS IS THE TRANSLATOR &amp;quot;mess&amp;quot; by now... I need to clean the code and rework some things&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Personal Translator&lt;br /&gt;
//Universal Translator (Mods made in Perry Mizin)&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//November 12, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Web Server Services powered by Google&lt;br /&gt;
//Variables&lt;br /&gt;
list requestedTranslations;&lt;br /&gt;
list tempDetections;&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
list requestList;&lt;br /&gt;
integer listenID;&lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
integer showTranslation = FALSE;&lt;br /&gt;
integer tranObjects = TRUE;&lt;br /&gt;
integer isInitialized = FALSE;&lt;br /&gt;
string  options;&lt;br /&gt;
key tempValue;&lt;br /&gt;
//Functions&lt;br /&gt;
integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex&lt;br /&gt;
{&lt;br /&gt;
	return ~llSubStringIndex(haystack, needle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sendIM(key imid, string imstr)&lt;br /&gt;
{&lt;br /&gt;
	llInstantMessage(imid, llUnescapeURL(imstr));&lt;br /&gt;
	if (imid != llGetOwner())&lt;br /&gt;
	{&lt;br /&gt;
		llOwnerSay(llUnescapeURL(imstr) + &amp;quot; @&amp;quot; + llKey2Name(imid));&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
detectLanguage(string dtcmsg, key dtckey)&lt;br /&gt;
{&lt;br /&gt;
	dtcmsg = &amp;quot;detect?v=1.0&amp;amp;q=&amp;quot; + dtcmsg;&lt;br /&gt;
	tempValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/&amp;quot; + dtcmsg, [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot; &amp;quot;);&lt;br /&gt;
	if (tempValue != NULL_KEY)&lt;br /&gt;
	{&lt;br /&gt;
		tempDetections = (tempDetections=[]) + tempDetections + [tempValue, dtckey];&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
checkThrottle(integer chkn, string chkmsg, list chkli)&lt;br /&gt;
{&lt;br /&gt;
	key returnValue;&lt;br /&gt;
	//loop though list and remove items older than 25 seconds&lt;br /&gt;
	chkmsg = &amp;quot;translate?v=1.0&amp;amp;q=&amp;quot; + chkmsg;&lt;br /&gt;
	requestList = (requestList=[]) + requestList + [llGetTime()];&lt;br /&gt;
	returnValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/&amp;quot; + chkmsg, [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot;&amp;quot;);&lt;br /&gt;
	if (returnValue != NULL_KEY)&lt;br /&gt;
	{&lt;br /&gt;
		//Translation&lt;br /&gt;
		requestedTranslations = (requestedTranslations=[]) + requestedTranslations + [returnValue, llList2CSV(chkli)];&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		llSleep(40.0); //Something has gone horribly wrong, sleep 40 seconds to clear throttle&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string checkLanguage(string chklantmpStr)&lt;br /&gt;
{&lt;br /&gt;
	if (chklantmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;en&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	else if (chklantmpStr == &amp;quot;und&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;el&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	if (llGetSubString(chklantmpStr, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = llGetSubString(chklantmpStr, 0, 1);&lt;br /&gt;
	}&lt;br /&gt;
	return chklantmpStr;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
	integer avliPos;&lt;br /&gt;
	integer idNum;&lt;br /&gt;
	if (~llListFindList(agentsInTranslation, (list)avid))&lt;br /&gt;
	{&lt;br /&gt;
		avliPos = llListFindList(agentsInTranslation, (list)avid);&lt;br /&gt;
		agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, chklan], avliPos + 1, avliPos + 2);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		@at;&lt;br /&gt;
		idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
		if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
		{&lt;br /&gt;
			jump at;&lt;br /&gt;
		}&lt;br /&gt;
		agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, chklan, idNum];&lt;br /&gt;
		llMessageLinked(LINK_THIS, 64562349, avlan, avid);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string addNewAgent(key newavid)&lt;br /&gt;
{&lt;br /&gt;
	string speakerLan;&lt;br /&gt;
	if (llGetAgentSize(newavid) != ZERO_VECTOR)&lt;br /&gt;
	{&lt;br /&gt;
		speakerLan  = checkLanguage(llGetAgentLanguage(newavid));&lt;br /&gt;
		if (speakerLan == &amp;quot;&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
			addAgent(newavid, speakerLan, 0);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			addAgent(newavid, speakerLan, 0);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return speakerLan;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
	if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
	{&lt;br /&gt;
		integer gkliPos = llListFindList(agentsInTranslation, (list)agentID);&lt;br /&gt;
		return llList2Key(agentsInTranslation, gkliPos - 3);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		return &amp;quot;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
processHTTPResponse(integer ntype, string bodyStr, list httli)&lt;br /&gt;
{&lt;br /&gt;
	integer spkliPos;&lt;br /&gt;
	list    recepientList;&lt;br /&gt;
	key     recepientID;&lt;br /&gt;
	string  recepientLanguage;&lt;br /&gt;
	string  languagePair;&lt;br /&gt;
	key     speakerID;&lt;br /&gt;
	string  speakerName;&lt;br /&gt;
	string  speakerLanguage;&lt;br /&gt;
	string  translatedText;&lt;br /&gt;
	string  lantmpStr;&lt;br /&gt;
	integer z;&lt;br /&gt;
	list    paramtmpli;&lt;br /&gt;
	//===================&lt;br /&gt;
	//Process Translation&lt;br /&gt;
	//===================&lt;br /&gt;
	speakerID  = llList2Key(httli, 1);&lt;br /&gt;
	speakerName = llKey2Name(speakerID);&lt;br /&gt;
	if (speakerName == &amp;quot;&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
	}&lt;br /&gt;
	recepientList = llParseString2List(llList2String(httli, 2), [&amp;quot;@&amp;quot;], []);&lt;br /&gt;
	paramtmpli = llParseStringKeepNulls(llList2String(httli, 3), [&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
	recepientLanguage = llList2String(paramtmpli, 1);&lt;br /&gt;
	languagePair = llDumpList2String(paramtmpli, &amp;quot;&amp;gt;&amp;gt;&amp;quot;);&lt;br /&gt;
	//Perform Text Cleanup&lt;br /&gt;
	translatedText = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;detectedSourceLanguage\&amp;quot;:\&amp;quot;&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
	//Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
	if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
	{&lt;br /&gt;
		lantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
		for(z = llStringLength(translatedText);z &amp;gt;= 0; z--)&lt;br /&gt;
		{&lt;br /&gt;
			lantmpStr = (lantmpStr=&amp;quot;&amp;quot;) + lantmpStr + llGetSubString(translatedText, z, z);&lt;br /&gt;
		}&lt;br /&gt;
		translatedText = lantmpStr;&lt;br /&gt;
	}&lt;br /&gt;
	lantmpStr = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
	if (showTranslation)&lt;br /&gt;
	{&lt;br /&gt;
		sendIM(speakerID, lantmpStr);&lt;br /&gt;
	}&lt;br /&gt;
	for (z = 0; z &amp;lt; llGetListLength(recepientList); z += 1)&lt;br /&gt;
	{&lt;br /&gt;
		recepientID = getAgentKey(llList2Integer(recepientList, z));&lt;br /&gt;
		if (recepientID != &amp;quot;&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, [recepientID]) + 1);&lt;br /&gt;
			if (recepientLanguage != speakerLanguage)&lt;br /&gt;
			{&lt;br /&gt;
				sendIM(recepientID, lantmpStr);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(5);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
	{&lt;br /&gt;
		list    ltmpli;&lt;br /&gt;
		if (num == 8434532)&lt;br /&gt;
		{&lt;br /&gt;
			enabled = (integer)lstr;&lt;br /&gt;
		}&lt;br /&gt;
		else if (num == 3342976)&lt;br /&gt;
		{&lt;br /&gt;
			//Send Preferences&lt;br /&gt;
			options = lstr;&lt;br /&gt;
			if (isInitialized == FALSE) return;&lt;br /&gt;
			ltmpli = llCSV2List(options);&lt;br /&gt;
			showTranslation = llList2Integer(ltmpli, 0);&lt;br /&gt;
			tranObjects = llList2Integer(ltmpli, 1);&lt;br /&gt;
			autoLanguage = llList2Integer(ltmpli, 2);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	sensor(integer num_detected)&lt;br /&gt;
	{&lt;br /&gt;
		integer s;&lt;br /&gt;
		key     sid;&lt;br /&gt;
		for (s = 0; s &amp;lt; num_detected; s += 1)&lt;br /&gt;
		{&lt;br /&gt;
			sid = llDetectedKey(s);&lt;br /&gt;
			if (~llListFindList(agentsInTranslation, (list)sid)) { }&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				addNewAgent(sid);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	no_sensor() { }&lt;br /&gt;
&lt;br /&gt;
	listen(integer channel, string name, key id, string message)&lt;br /&gt;
	{&lt;br /&gt;
		integer w;&lt;br /&gt;
		string  spkrLan;&lt;br /&gt;
		string  recepLan;&lt;br /&gt;
		integer recepID;&lt;br /&gt;
		integer lstliPos;&lt;br /&gt;
		string  lanpair;&lt;br /&gt;
		list    translationCache;&lt;br /&gt;
		//Multiplexor Code&lt;br /&gt;
		//Translator Engine Code&lt;br /&gt;
		if ((!enabled) &amp;amp;&amp;amp; (isMaster == 1))&lt;br /&gt;
		{&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (!tranObjects)&lt;br /&gt;
		{&lt;br /&gt;
			if (llGetAgentSize(id) == ZERO_VECTOR)&lt;br /&gt;
			{&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				detectLanguage(llEscapeURL(message), id);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			detectLanguage(llEscapeURL(message), id);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if (~llListFindList(agentsInTranslation, (list)id))&lt;br /&gt;
		{&lt;br /&gt;
			lstliPos = llListFindList(agentsInTranslation, (list)id);&lt;br /&gt;
			spkrLan = llList2String(agentsInTranslation, lstliPos + 1);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			spkrLan = addNewAgent(id);&lt;br /&gt;
		}&lt;br /&gt;
		//===============================&lt;br /&gt;
		//Formulate Translation Requests&lt;br /&gt;
		//===============================&lt;br /&gt;
		if (id == llGetOwner())&lt;br /&gt;
		{&lt;br /&gt;
			for (w = 0; w &amp;lt; llGetListLength(agentsInTranslation); w += 4)&lt;br /&gt;
			{&lt;br /&gt;
				//Loop through translation group and do appropriate translations as needed&lt;br /&gt;
				recepID = llList2Integer(agentsInTranslation, w + 3);&lt;br /&gt;
				recepLan =  checkLanguage(llList2String(agentsInTranslation, w + 1));&lt;br /&gt;
				if (spkrLan != recepLan)&lt;br /&gt;
				{&lt;br /&gt;
					lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
					if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
					{&lt;br /&gt;
						lstliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
						translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			//Process Requests&lt;br /&gt;
			if (translationCache != [])&lt;br /&gt;
			{&lt;br /&gt;
				for (w = 0; w &amp;lt; llGetListLength(translationCache); w += 2)&lt;br /&gt;
				{&lt;br /&gt;
					//====================================&lt;br /&gt;
					//Translation&lt;br /&gt;
					//====================================&lt;br /&gt;
					//Forumulate and Send Translation Request&lt;br /&gt;
					lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, w), [&amp;quot;|&amp;quot;],[]), 1);&lt;br /&gt;
					checkThrottle(0, llEscapeURL(message) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, w + 1), llList2String(translationCache, w)]);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			lstliPos = llListFindList(agentsInTranslation, (list)llGetOwner());&lt;br /&gt;
			recepID = llList2Integer(agentsInTranslation, lstliPos + 3);&lt;br /&gt;
			recepLan =  checkLanguage(llList2String(agentsInTranslation , lstliPos + 1 ));&lt;br /&gt;
			if (spkrLan != recepLan)&lt;br /&gt;
			{&lt;br /&gt;
				lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
				if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
				{&lt;br /&gt;
					lstliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
					translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];&lt;br /&gt;
				}&lt;br /&gt;
				if (translationCache != [])&lt;br /&gt;
				{&lt;br /&gt;
					//====================================&lt;br /&gt;
					//Translation&lt;br /&gt;
					//====================================&lt;br /&gt;
					//Forumulate and Send Translation Request&lt;br /&gt;
					lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, lstliPos), [&amp;quot;|&amp;quot;],[]), 1);&lt;br /&gt;
					checkThrottle(0, llEscapeURL(message) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, lstliPos + 1), llList2String(translationCache, lstliPos)]);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
	{&lt;br /&gt;
		//Process Resonse Code&lt;br /&gt;
		integer httliPos;&lt;br /&gt;
		string htttmpStr;&lt;br /&gt;
&lt;br /&gt;
		if (~llListFindList(requestedTranslations, (list)request_id))&lt;br /&gt;
		{&lt;br /&gt;
			httliPos = llListFindList(requestedTranslations, [request_id]);&lt;br /&gt;
			processHTTPResponse(0, body, llCSV2List(llList2String(requestedTranslations, httliPos + 1)));&lt;br /&gt;
			requestedTranslations = llDeleteSubList(requestedTranslations, httliPos, httliPos + 1);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (~llListFindList(tempDetections, (list)request_id))&lt;br /&gt;
		{&lt;br /&gt;
			integer tmpliPos = llListFindList(tempDetections, (list)request_id);&lt;br /&gt;
			key speakerID = llList2Key(tempDetections, tmpliPos + 1);&lt;br /&gt;
			tempDetections = llDeleteSubList(tempDetections, tmpliPos, tmpliPos + 3);&lt;br /&gt;
			string tmptmpStr = llToLower(llGetSubString(body, llSubStringIndex(body, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(body, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
			if (contains(tmptmpStr, &amp;quot;err&amp;quot;) == 0 &amp;amp;&amp;amp; contains(tmptmpStr, &amp;quot;unn&amp;quot;) == 0 )&lt;br /&gt;
			{&lt;br /&gt;
				tmptmpStr = checkLanguage(tmptmpStr);&lt;br /&gt;
				if (~llListFindList(agentsInTranslation, (list)speakerID))&lt;br /&gt;
				{&lt;br /&gt;
					integer tmpavliPos = llListFindList(agentsInTranslation, (list)speakerID);&lt;br /&gt;
					string actlan = llList2String(agentsInTranslation, tmpavliPos + 1);&lt;br /&gt;
					if (actlan != tmptmpStr)&lt;br /&gt;
					{&lt;br /&gt;
						agentsInTranslation = llListReplaceList(agentsInTranslation,[llList2Integer(agentsInTranslation,tmpavliPos + 2) + 1] , tmpavliPos + 2, tmpavliPos + 2);&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						agentsInTranslation = llListReplaceList(agentsInTranslation,[0], tmpavliPos + 2, tmpavliPos + 2);&lt;br /&gt;
					}&lt;br /&gt;
					if (llList2Integer(agentsInTranslation,tmpavliPos + 2) &amp;gt;= 4) //if any av talks on any language 4 times in a row&lt;br /&gt;
					{&lt;br /&gt;
						if (tmptmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
						{&lt;br /&gt;
							return;&lt;br /&gt;
						}&lt;br /&gt;
						else&lt;br /&gt;
						{&lt;br /&gt;
							addAgent(speakerID, tmptmpStr, 0);&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	timer()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(0.0);&lt;br /&gt;
		if (isInitialized == FALSE)&lt;br /&gt;
		{&lt;br /&gt;
			enabled = TRUE;&lt;br /&gt;
			listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
			llMessageLinked(LINK_THIS, 6877259, (string)enabled, NULL_KEY);&lt;br /&gt;
			isInitialized = TRUE;&lt;br /&gt;
			string mylanguage = llGetAgentLanguage(llGetOwner());&lt;br /&gt;
			if (llStringLength(mylanguage) &amp;lt; 1)&lt;br /&gt;
			{&lt;br /&gt;
				mylanguage = &amp;quot;en&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [llGetOwner() , mylanguage , 0 , llRound(llFrand(2000000)) + 1];&lt;br /&gt;
		}&lt;br /&gt;
		integer r;&lt;br /&gt;
		string  tmrtmpStr;&lt;br /&gt;
		list    tmrnewli;&lt;br /&gt;
		integer x;&lt;br /&gt;
		list  newList;&lt;br /&gt;
		float timeElapsed;&lt;br /&gt;
		for (x = 0; x &amp;lt; llGetListLength(tempDetections); x += 2)&lt;br /&gt;
		{&lt;br /&gt;
			timeElapsed = llGetTime() - llList2Float(llCSV2List(llList2String(tempDetections, x + 1)), 0);&lt;br /&gt;
			if (timeElapsed &amp;lt; 60.0)&lt;br /&gt;
				newList = (newList=[]) + newList + llList2List(tempDetections, x, x + 1);&lt;br /&gt;
		}&lt;br /&gt;
		tempDetections = newList;&lt;br /&gt;
		newList = [];&lt;br /&gt;
		for (x = 0; x &amp;lt; llGetListLength(requestedTranslations); x += 2)&lt;br /&gt;
		{&lt;br /&gt;
			timeElapsed = llGetTime() - llList2Float(llCSV2List(llList2String(requestedTranslations, x + 1)), 0);&lt;br /&gt;
			if (timeElapsed &amp;lt; 60.0)&lt;br /&gt;
			{&lt;br /&gt;
				newList = (newList=[]) + newList + llList2List(requestedTranslations, x, x + 1);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		requestedTranslations = newList;&lt;br /&gt;
		if (isMaster &amp;gt; 0)&lt;br /&gt;
		{&lt;br /&gt;
			for (r = 0; r &amp;lt; llGetListLength(agentsInTranslation); r += 4)&lt;br /&gt;
			{&lt;br /&gt;
				tmrtmpStr = llList2String(llGetObjectDetails(llList2Key(agentsInTranslation, r), [OBJECT_POS]), 0);&lt;br /&gt;
				if ((llVecDist(llGetPos(), (vector)tmrtmpStr) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tmrtmpStr != &amp;quot;&amp;quot;))&lt;br /&gt;
				{&lt;br /&gt;
					tmrnewli = (tmrnewli=[]) + tmrnewli + llList2List(agentsInTranslation, r, r + 3);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			agentsInTranslation = tmrnewli;&lt;br /&gt;
		}&lt;br /&gt;
		if ((autoLanguage) &amp;amp;&amp;amp; isMaster &amp;gt; 0)&lt;br /&gt;
		{&lt;br /&gt;
			llSensor(&amp;quot;&amp;quot;, NULL_KEY, AGENT, 20.0, PI);&lt;br /&gt;
		}&lt;br /&gt;
		llSetTimerEvent(4.0); // restart timer&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=690482</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=690482"/>
		<updated>2009-12-19T14:39:24Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribucion al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente codigo fué originalmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mi manera...&lt;br /&gt;
No os riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;OK&#039;&#039; ===&lt;br /&gt;
Bueno, despues de respiñar todo lo que he podido, creo que el uso de memoria y la velocidad estan practicamente igual que en la version original pero bueno... en la variedad está el gusto no?&lt;br /&gt;
Ya he probado un poco el codigo, y parece que funciona aunque estoy teniendo algunos problemas... Por ejemplo creo que el sistema de traduccion no funciona correctamente, y no me refiero al sistema de traduccion de Google (en mi opinion, si no es el mejor, es uno de los mejores del mundo), sino a que aun queda mucho trabajo por hacer en el script...&lt;br /&gt;
&lt;br /&gt;
El siguiente paso sera intentar dividir el script en dos, o si es posible en tres para repartir el uso de memoria. Tambien me gustaria probar un truco que uso a menudo para traducir paginas en un idioma que no entiendo, lo que hago es que en vez de traducir directamente al español, primero lo traduzco a inglés, y luego desde inglés al español, parece una tonteria y un gasto innecesario, pero si lo hago es porque así suelo entender mejor las traducciones.&lt;br /&gt;
Quiero por un lado el sistema de comunicacion y evaluacion entre traductores, y por otro el sistema de traduccion entre avatares, ¿es muy dificil? no se ya lo veremos...&lt;br /&gt;
&lt;br /&gt;
Well, after saving as much as I could, I think the memory usage and the speed are technically the same as in the original script, but well, in the variety is the taste, isnt it?. &lt;br /&gt;
I have tested a bit the code above already, and it seems to work altought i´m having some problems...&lt;br /&gt;
For instance i think the translation system is not working properly, and i dont mean the Google´s translation system (in my opinion, if is not the best, one of the bests), but that there is still much work to do in the script...&lt;br /&gt;
&lt;br /&gt;
The next step will be to try to divide the script in 2, or 3 if is possible, so we can spread the memory usage. Also I would like to test a trick i use often for to translate languages that i dont understand, what I do first is to translate that language into English, and then from English to Spanish, it seems a nonsense and unnecesary waste, but if i do it is becouse so i usually understand the translations better.&lt;br /&gt;
I want by one part the translators communications and evaluation system, and by other the translation system between avatars, is it very difficult? I don´t know , we will see...&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Es dificil... me está costando pero ya veremos...&lt;br /&gt;
Its difficult... i am struggling but we will see...&lt;br /&gt;
&lt;br /&gt;
chu chu chu&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
De Güatemala a Güatepeor, Sin comentarios...&lt;br /&gt;
&lt;br /&gt;
From Güatebad to Güateworse, No comments...&lt;br /&gt;
&lt;br /&gt;
Buscando en Internet he encontrado este [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html:API de Yahoo] , creo que sería interesante añadirlo al proyecto&lt;br /&gt;
&lt;br /&gt;
Searching on the web I crossend in my way with this [http://developer.yahoo.com/search/web/V1/spellingSuggestion.html:Yahoo´s API] , I think it would be interesting to add it to the project&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
ESTO ES EL TRADUCTOR &amp;quot;fracaso&amp;quot; por ahora... Necesito limpiar el codigo y rehacer algunas cosas&lt;br /&gt;
&lt;br /&gt;
THIS IS THE TRANSLATOR &amp;quot;mess&amp;quot; by now... I need to clean the code and rework some things&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Personal Translator&lt;br /&gt;
//Universal Translator (Mods made in Perry Mizin)&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//November 12, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Web Server Services powered by Google&lt;br /&gt;
//Variables&lt;br /&gt;
list requestedTranslations;&lt;br /&gt;
list tempDetections;&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
list requestList;&lt;br /&gt;
integer listenID;&lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
integer showTranslation = FALSE;&lt;br /&gt;
integer tranObjects = TRUE;&lt;br /&gt;
integer isInitialized = FALSE;&lt;br /&gt;
string  options;&lt;br /&gt;
key tempValue;&lt;br /&gt;
//Functions&lt;br /&gt;
integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex&lt;br /&gt;
{&lt;br /&gt;
	return ~llSubStringIndex(haystack, needle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sendIM(key imid, string imstr)&lt;br /&gt;
{&lt;br /&gt;
	llInstantMessage(imid, llUnescapeURL(imstr));&lt;br /&gt;
	if (imid != llGetOwner())&lt;br /&gt;
	{&lt;br /&gt;
		llOwnerSay(llUnescapeURL(imstr) + &amp;quot; @&amp;quot; + llKey2Name(imid));&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
detectLanguage(string dtcmsg, key dtckey)&lt;br /&gt;
{&lt;br /&gt;
	dtcmsg = &amp;quot;detect?v=1.0&amp;amp;q=&amp;quot; + dtcmsg;&lt;br /&gt;
	tempValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/&amp;quot; + dtcmsg, [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot; &amp;quot;);&lt;br /&gt;
	if (tempValue != NULL_KEY)&lt;br /&gt;
	{&lt;br /&gt;
		tempDetections = (tempDetections=[]) + tempDetections + [tempValue, dtckey];&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
checkThrottle(integer chkn, string chkmsg, list chkli)&lt;br /&gt;
{&lt;br /&gt;
	key returnValue;&lt;br /&gt;
	//loop though list and remove items older than 25 seconds&lt;br /&gt;
	chkmsg = &amp;quot;translate?v=1.0&amp;amp;q=&amp;quot; + chkmsg;&lt;br /&gt;
	requestList = (requestList=[]) + requestList + [llGetTime()];&lt;br /&gt;
	returnValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/&amp;quot; + chkmsg, [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot;&amp;quot;);&lt;br /&gt;
	if (returnValue != NULL_KEY)&lt;br /&gt;
	{&lt;br /&gt;
		//Translation&lt;br /&gt;
		requestedTranslations = (requestedTranslations=[]) + requestedTranslations + [returnValue, llList2CSV(chkli)];&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		llSleep(40.0); //Something has gone horribly wrong, sleep 40 seconds to clear throttle&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string checkLanguage(string chklantmpStr)&lt;br /&gt;
{&lt;br /&gt;
	if (chklantmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;en&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	else if (chklantmpStr == &amp;quot;und&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;el&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	if (llGetSubString(chklantmpStr, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = llGetSubString(chklantmpStr, 0, 1);&lt;br /&gt;
	}&lt;br /&gt;
	return chklantmpStr;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
	integer avliPos;&lt;br /&gt;
	integer idNum;&lt;br /&gt;
	if (~llListFindList(agentsInTranslation, (list)avid))&lt;br /&gt;
	{&lt;br /&gt;
		avliPos = llListFindList(agentsInTranslation, (list)avid);&lt;br /&gt;
		agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, chklan], avliPos + 1, avliPos + 2);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		@at;&lt;br /&gt;
		idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
		if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
		{&lt;br /&gt;
			jump at;&lt;br /&gt;
		}&lt;br /&gt;
		agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, chklan, idNum];&lt;br /&gt;
		llMessageLinked(LINK_THIS, 64562349, avlan, avid);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string addNewAgent(key newavid)&lt;br /&gt;
{&lt;br /&gt;
	string speakerLan;&lt;br /&gt;
	if (llGetAgentSize(newavid) != ZERO_VECTOR)&lt;br /&gt;
	{&lt;br /&gt;
		speakerLan  = checkLanguage(llGetAgentLanguage(newavid));&lt;br /&gt;
		if (speakerLan == &amp;quot;&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
			addAgent(newavid, speakerLan, 0);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			addAgent(newavid, speakerLan, 0);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return speakerLan;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
	if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
	{&lt;br /&gt;
		integer gkliPos = llListFindList(agentsInTranslation, (list)agentID);&lt;br /&gt;
		return llList2Key(agentsInTranslation, gkliPos - 3);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		return &amp;quot;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
processHTTPResponse(integer ntype, string bodyStr, list httli)&lt;br /&gt;
{&lt;br /&gt;
	integer spkliPos;&lt;br /&gt;
	list    recepientList;&lt;br /&gt;
	key     recepientID;&lt;br /&gt;
	string  recepientLanguage;&lt;br /&gt;
	string  languagePair;&lt;br /&gt;
	key     speakerID;&lt;br /&gt;
	string  speakerName;&lt;br /&gt;
	string  speakerLanguage;&lt;br /&gt;
	string  translatedText;&lt;br /&gt;
	string  lantmpStr;&lt;br /&gt;
	integer z;&lt;br /&gt;
	list    paramtmpli;&lt;br /&gt;
	//===================&lt;br /&gt;
	//Process Translation&lt;br /&gt;
	//===================&lt;br /&gt;
	speakerID  = llList2Key(httli, 1);&lt;br /&gt;
	speakerName = llKey2Name(speakerID);&lt;br /&gt;
	if (speakerName == &amp;quot;&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
	}&lt;br /&gt;
	recepientList = llParseString2List(llList2String(httli, 2), [&amp;quot;@&amp;quot;], []);&lt;br /&gt;
	paramtmpli = llParseStringKeepNulls(llList2String(httli, 3), [&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
	recepientLanguage = llList2String(paramtmpli, 1);&lt;br /&gt;
	languagePair = llDumpList2String(paramtmpli, &amp;quot;&amp;gt;&amp;gt;&amp;quot;);&lt;br /&gt;
	//Perform Text Cleanup&lt;br /&gt;
	translatedText = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;detectedSourceLanguage\&amp;quot;:\&amp;quot;&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
	//Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
	if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
	{&lt;br /&gt;
		lantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
		for(z = llStringLength(translatedText);z &amp;gt;= 0; z--)&lt;br /&gt;
		{&lt;br /&gt;
			lantmpStr = (lantmpStr=&amp;quot;&amp;quot;) + lantmpStr + llGetSubString(translatedText, z, z);&lt;br /&gt;
		}&lt;br /&gt;
		translatedText = lantmpStr;&lt;br /&gt;
	}&lt;br /&gt;
	lantmpStr = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
	if (showTranslation)&lt;br /&gt;
	{&lt;br /&gt;
		sendIM(speakerID, lantmpStr);&lt;br /&gt;
	}&lt;br /&gt;
	for (z = 0; z &amp;lt; llGetListLength(recepientList); z += 1)&lt;br /&gt;
	{&lt;br /&gt;
		recepientID = getAgentKey(llList2Integer(recepientList, z));&lt;br /&gt;
		if (recepientID != &amp;quot;&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, [recepientID]) + 1);&lt;br /&gt;
			if (recepientLanguage != speakerLanguage)&lt;br /&gt;
			{&lt;br /&gt;
				sendIM(recepientID, lantmpStr);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(5);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
	{&lt;br /&gt;
		list    ltmpli;&lt;br /&gt;
		if (num == 8434532)&lt;br /&gt;
		{&lt;br /&gt;
			enabled = (integer)lstr;&lt;br /&gt;
		}&lt;br /&gt;
		else if (num == 3342976)&lt;br /&gt;
		{&lt;br /&gt;
			//Send Preferences&lt;br /&gt;
			options = lstr;&lt;br /&gt;
			if (isInitialized == FALSE) return;&lt;br /&gt;
			ltmpli = llCSV2List(options);&lt;br /&gt;
			showTranslation = llList2Integer(ltmpli, 0);&lt;br /&gt;
			tranObjects = llList2Integer(ltmpli, 1);&lt;br /&gt;
			autoLanguage = llList2Integer(ltmpli, 2);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	sensor(integer num_detected)&lt;br /&gt;
	{&lt;br /&gt;
		integer s;&lt;br /&gt;
		key     sid;&lt;br /&gt;
		for (s = 0; s &amp;lt; num_detected; s += 1)&lt;br /&gt;
		{&lt;br /&gt;
			sid = llDetectedKey(s);&lt;br /&gt;
			if (~llListFindList(agentsInTranslation, (list)sid)) { }&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				addNewAgent(sid);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	no_sensor() { }&lt;br /&gt;
&lt;br /&gt;
	listen(integer channel, string name, key id, string message)&lt;br /&gt;
	{&lt;br /&gt;
		integer w;&lt;br /&gt;
		string  spkrLan;&lt;br /&gt;
		string  recepLan;&lt;br /&gt;
		integer recepID;&lt;br /&gt;
		integer lstliPos;&lt;br /&gt;
		string  lanpair;&lt;br /&gt;
		list    translationCache;&lt;br /&gt;
		//Multiplexor Code&lt;br /&gt;
		//Translator Engine Code&lt;br /&gt;
		if ((!enabled) &amp;amp;&amp;amp; (isMaster == 1))&lt;br /&gt;
		{&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (!tranObjects)&lt;br /&gt;
		{&lt;br /&gt;
			if (llGetAgentSize(id) == ZERO_VECTOR)&lt;br /&gt;
			{&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				detectLanguage(llEscapeURL(message), id);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			detectLanguage(llEscapeURL(message), id);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if (~llListFindList(agentsInTranslation, (list)id))&lt;br /&gt;
		{&lt;br /&gt;
			lstliPos = llListFindList(agentsInTranslation, (list)id);&lt;br /&gt;
			spkrLan = llList2String(agentsInTranslation, lstliPos + 1);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			spkrLan = addNewAgent(id);&lt;br /&gt;
		}&lt;br /&gt;
		//===============================&lt;br /&gt;
		//Formulate Translation Requests&lt;br /&gt;
		//===============================&lt;br /&gt;
		if (id == llGetOwner())&lt;br /&gt;
		{&lt;br /&gt;
			for (w = 0; w &amp;lt; llGetListLength(agentsInTranslation); w += 4)&lt;br /&gt;
			{&lt;br /&gt;
				//Loop through translation group and do appropriate translations as needed&lt;br /&gt;
				recepID = llList2Integer(agentsInTranslation, w + 3);&lt;br /&gt;
				recepLan =  checkLanguage(llList2String(agentsInTranslation, w + 1));&lt;br /&gt;
				if (spkrLan != recepLan)&lt;br /&gt;
				{&lt;br /&gt;
					lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
					if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
					{&lt;br /&gt;
						lstliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
						translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			//Process Requests&lt;br /&gt;
			if (translationCache != [])&lt;br /&gt;
			{&lt;br /&gt;
				for (w = 0; w &amp;lt; llGetListLength(translationCache); w += 2)&lt;br /&gt;
				{&lt;br /&gt;
					//====================================&lt;br /&gt;
					//Translation&lt;br /&gt;
					//====================================&lt;br /&gt;
					//Forumulate and Send Translation Request&lt;br /&gt;
					lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, w), [&amp;quot;|&amp;quot;],[]), 1);&lt;br /&gt;
					checkThrottle(0, llEscapeURL(message) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, w + 1), llList2String(translationCache, w)]);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			lstliPos = llListFindList(agentsInTranslation, (list)llGetOwner());&lt;br /&gt;
			recepID = llList2Integer(agentsInTranslation, lstliPos + 3);&lt;br /&gt;
			recepLan =  checkLanguage(llList2String(agentsInTranslation , lstliPos + 1 ));&lt;br /&gt;
			if (spkrLan != recepLan)&lt;br /&gt;
			{&lt;br /&gt;
				lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
				if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
				{&lt;br /&gt;
					lstliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
					translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];&lt;br /&gt;
				}&lt;br /&gt;
				if (translationCache != [])&lt;br /&gt;
				{&lt;br /&gt;
					//====================================&lt;br /&gt;
					//Translation&lt;br /&gt;
					//====================================&lt;br /&gt;
					//Forumulate and Send Translation Request&lt;br /&gt;
					lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, lstliPos), [&amp;quot;|&amp;quot;],[]), 1);&lt;br /&gt;
					checkThrottle(0, llEscapeURL(message) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, lstliPos + 1), llList2String(translationCache, lstliPos)]);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
	{&lt;br /&gt;
		//Process Resonse Code&lt;br /&gt;
		integer httliPos;&lt;br /&gt;
		string htttmpStr;&lt;br /&gt;
&lt;br /&gt;
		if (~llListFindList(requestedTranslations, (list)request_id))&lt;br /&gt;
		{&lt;br /&gt;
			httliPos = llListFindList(requestedTranslations, [request_id]);&lt;br /&gt;
			processHTTPResponse(0, body, llCSV2List(llList2String(requestedTranslations, httliPos + 1)));&lt;br /&gt;
			requestedTranslations = llDeleteSubList(requestedTranslations, httliPos, httliPos + 1);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (~llListFindList(tempDetections, (list)request_id))&lt;br /&gt;
		{&lt;br /&gt;
			integer tmpliPos = llListFindList(tempDetections, (list)request_id);&lt;br /&gt;
			key speakerID = llList2Key(tempDetections, tmpliPos + 1);&lt;br /&gt;
			tempDetections = llDeleteSubList(tempDetections, tmpliPos, tmpliPos + 3);&lt;br /&gt;
			string tmptmpStr = llToLower(llGetSubString(body, llSubStringIndex(body, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(body, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
			if (contains(tmptmpStr, &amp;quot;err&amp;quot;) == 0 &amp;amp;&amp;amp; contains(tmptmpStr, &amp;quot;unn&amp;quot;) == 0 )&lt;br /&gt;
			{&lt;br /&gt;
				tmptmpStr = checkLanguage(tmptmpStr);&lt;br /&gt;
				if (~llListFindList(agentsInTranslation, (list)speakerID))&lt;br /&gt;
				{&lt;br /&gt;
					integer tmpavliPos = llListFindList(agentsInTranslation, (list)speakerID);&lt;br /&gt;
					string actlan = llList2String(agentsInTranslation, tmpavliPos + 1);&lt;br /&gt;
					if (actlan != tmptmpStr)&lt;br /&gt;
					{&lt;br /&gt;
						agentsInTranslation = llListReplaceList(agentsInTranslation,[llList2Integer(agentsInTranslation,tmpavliPos + 2) + 1] , tmpavliPos + 2, tmpavliPos + 2);&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						agentsInTranslation = llListReplaceList(agentsInTranslation,[0], tmpavliPos + 2, tmpavliPos + 2);&lt;br /&gt;
					}&lt;br /&gt;
					if (llList2Integer(agentsInTranslation,tmpavliPos + 2) &amp;gt;= 4) //if any av talks on any language 4 times in a row&lt;br /&gt;
					{&lt;br /&gt;
						if (tmptmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
						{&lt;br /&gt;
							return;&lt;br /&gt;
						}&lt;br /&gt;
						else&lt;br /&gt;
						{&lt;br /&gt;
							addAgent(speakerID, tmptmpStr, 0);&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	timer()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(0.0);&lt;br /&gt;
		if (isInitialized == FALSE)&lt;br /&gt;
		{&lt;br /&gt;
			enabled = TRUE;&lt;br /&gt;
			listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
			llMessageLinked(LINK_THIS, 6877259, (string)enabled, NULL_KEY);&lt;br /&gt;
			isInitialized = TRUE;&lt;br /&gt;
			string mylanguage = llGetAgentLanguage(llGetOwner());&lt;br /&gt;
			if (llStringLength(mylanguage) &amp;lt; 1)&lt;br /&gt;
			{&lt;br /&gt;
				mylanguage = &amp;quot;en&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [llGetOwner() , mylanguage , 0 , llRound(llFrand(2000000)) + 1];&lt;br /&gt;
		}&lt;br /&gt;
		integer r;&lt;br /&gt;
		string  tmrtmpStr;&lt;br /&gt;
		list    tmrnewli;&lt;br /&gt;
		integer x;&lt;br /&gt;
		list  newList;&lt;br /&gt;
		float timeElapsed;&lt;br /&gt;
		for (x = 0; x &amp;lt; llGetListLength(tempDetections); x += 2)&lt;br /&gt;
		{&lt;br /&gt;
			timeElapsed = llGetTime() - llList2Float(llCSV2List(llList2String(tempDetections, x + 1)), 0);&lt;br /&gt;
			if (timeElapsed &amp;lt; 60.0)&lt;br /&gt;
				newList = (newList=[]) + newList + llList2List(tempDetections, x, x + 1);&lt;br /&gt;
		}&lt;br /&gt;
		tempDetections = newList;&lt;br /&gt;
		newList = [];&lt;br /&gt;
		for (x = 0; x &amp;lt; llGetListLength(requestedTranslations); x += 2)&lt;br /&gt;
		{&lt;br /&gt;
			timeElapsed = llGetTime() - llList2Float(llCSV2List(llList2String(requestedTranslations, x + 1)), 0);&lt;br /&gt;
			if (timeElapsed &amp;lt; 60.0)&lt;br /&gt;
			{&lt;br /&gt;
				newList = (newList=[]) + newList + llList2List(requestedTranslations, x, x + 1);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		requestedTranslations = newList;&lt;br /&gt;
		if (isMaster &amp;gt; 0)&lt;br /&gt;
		{&lt;br /&gt;
			for (r = 0; r &amp;lt; llGetListLength(agentsInTranslation); r += 4)&lt;br /&gt;
			{&lt;br /&gt;
				tmrtmpStr = llList2String(llGetObjectDetails(llList2Key(agentsInTranslation, r), [OBJECT_POS]), 0);&lt;br /&gt;
				if ((llVecDist(llGetPos(), (vector)tmrtmpStr) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tmrtmpStr != &amp;quot;&amp;quot;))&lt;br /&gt;
				{&lt;br /&gt;
					tmrnewli = (tmrnewli=[]) + tmrnewli + llList2List(agentsInTranslation, r, r + 3);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			agentsInTranslation = tmrnewli;&lt;br /&gt;
		}&lt;br /&gt;
		if ((autoLanguage) &amp;amp;&amp;amp; isMaster &amp;gt; 0)&lt;br /&gt;
		{&lt;br /&gt;
			llSensor(&amp;quot;&amp;quot;, NULL_KEY, AGENT, 20.0, PI);&lt;br /&gt;
		}&lt;br /&gt;
		llSetTimerEvent(4.0); // restart timer&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=690352</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=690352"/>
		<updated>2009-12-18T15:17:29Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribucion al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente codigo fué originalmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mi manera...&lt;br /&gt;
No os riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;OK&#039;&#039; ===&lt;br /&gt;
Bueno, despues de respiñar todo lo que he podido, creo que el uso de memoria y la velocidad estan practicamente igual que en la version original pero bueno... en la variedad está el gusto no?&lt;br /&gt;
Ya he probado un poco el codigo, y parece que funciona aunque estoy teniendo algunos problemas... Por ejemplo creo que el sistema de traduccion no funciona correctamente, y no me refiero al sistema de traduccion de Google (en mi opinion, si no es el mejor, es uno de los mejores del mundo), sino a que aun queda mucho trabajo por hacer en el script...&lt;br /&gt;
&lt;br /&gt;
El siguiente paso sera intentar dividir el script en dos, o si es posible en tres para repartir el uso de memoria. Tambien me gustaria probar un truco que uso a menudo para traducir paginas en un idioma que no entiendo, lo que hago es que en vez de traducir directamente al español, primero lo traduzco a inglés, y luego desde inglés al español, parece una tonteria y un gasto innecesario, pero si lo hago es porque así suelo entender mejor las traducciones.&lt;br /&gt;
Quiero por un lado el sistema de comunicacion y evaluacion entre traductores, y por otro el sistema de traduccion entre avatares, ¿es muy dificil? no se ya lo veremos...&lt;br /&gt;
&lt;br /&gt;
Well, after saving as much as I could, I think the memory usage and the speed are technically the same as in the original script, but well, in the variety is the taste, isnt it?. &lt;br /&gt;
I have tested a bit the code above already, and it seems to work altought i´m having some problems...&lt;br /&gt;
For instance i think the translation system is not working properly, and i dont mean the Google´s translation system (in my opinion, if is not the best, one of the bests), but that there is still much work to do in the script...&lt;br /&gt;
&lt;br /&gt;
The next step will be to try to divide the script in 2, or 3 if is possible, so we can spread the memory usage. Also I would like to test a trick i use often for to translate languages that i dont understand, what I do first is to translate that language into English, and then from English to Spanish, it seems a nonsense and unnecesary waste, but if i do it is becouse so i usually understand the translations better.&lt;br /&gt;
I want by one part the translators communications and evaluation system, and by other the translation system between avatars, is it very difficult? I don´t know , we will see...&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Es dificil... me está costando pero ya veremos...&lt;br /&gt;
Its difficult... i am struggling but we will see...&lt;br /&gt;
&lt;br /&gt;
chu chu chu&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
De Güatemala a Güatepeor, Sin comentarios...&lt;br /&gt;
From Güatebad to Güateworse, No comments...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
ESTO ES EL TRADUCTOR &amp;quot;fracaso&amp;quot; por ahora... Necesito limpiar el codigo y rehacer algunas cosas&lt;br /&gt;
THIS IS THE TRANSLATOR &amp;quot;mess&amp;quot; by now... I need to clean the code and rework some things&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Personal Translator&lt;br /&gt;
//Universal Translator (Mods made in Perry Mizin)&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//November 12, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Web Server Services powered by Google&lt;br /&gt;
//Variables&lt;br /&gt;
list requestedTranslations;&lt;br /&gt;
list tempDetections;&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
list requestList;&lt;br /&gt;
integer listenID;&lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
integer showTranslation = FALSE;&lt;br /&gt;
integer tranObjects = TRUE;&lt;br /&gt;
integer isInitialized = FALSE;&lt;br /&gt;
string  options;&lt;br /&gt;
key tempValue;&lt;br /&gt;
//Functions&lt;br /&gt;
integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex&lt;br /&gt;
{&lt;br /&gt;
	return ~llSubStringIndex(haystack, needle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sendIM(key imid, string imstr)&lt;br /&gt;
{&lt;br /&gt;
	llInstantMessage(imid, llUnescapeURL(imstr));&lt;br /&gt;
	if (imid != llGetOwner())&lt;br /&gt;
	{&lt;br /&gt;
		llOwnerSay(llUnescapeURL(imstr) + &amp;quot; @&amp;quot; + llKey2Name(imid));&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
detectLanguage(string dtcmsg, key dtckey)&lt;br /&gt;
{&lt;br /&gt;
	dtcmsg = &amp;quot;detect?v=1.0&amp;amp;q=&amp;quot; + dtcmsg;&lt;br /&gt;
	tempValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/&amp;quot; + dtcmsg, [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot; &amp;quot;);&lt;br /&gt;
	if (tempValue != NULL_KEY)&lt;br /&gt;
	{&lt;br /&gt;
		tempDetections = (tempDetections=[]) + tempDetections + [tempValue, dtckey];&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
checkThrottle(integer chkn, string chkmsg, list chkli)&lt;br /&gt;
{&lt;br /&gt;
	key returnValue;&lt;br /&gt;
	//loop though list and remove items older than 25 seconds&lt;br /&gt;
	chkmsg = &amp;quot;translate?v=1.0&amp;amp;q=&amp;quot; + chkmsg;&lt;br /&gt;
	requestList = (requestList=[]) + requestList + [llGetTime()];&lt;br /&gt;
	returnValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/&amp;quot; + chkmsg, [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot;&amp;quot;);&lt;br /&gt;
	if (returnValue != NULL_KEY)&lt;br /&gt;
	{&lt;br /&gt;
		//Translation&lt;br /&gt;
		requestedTranslations = (requestedTranslations=[]) + requestedTranslations + [returnValue, llList2CSV(chkli)];&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		llSleep(40.0); //Something has gone horribly wrong, sleep 40 seconds to clear throttle&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string checkLanguage(string chklantmpStr)&lt;br /&gt;
{&lt;br /&gt;
	if (chklantmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;en&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	else if (chklantmpStr == &amp;quot;und&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;el&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	if (llGetSubString(chklantmpStr, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		chklantmpStr = llGetSubString(chklantmpStr, 0, 1);&lt;br /&gt;
	}&lt;br /&gt;
	return chklantmpStr;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
	integer avliPos;&lt;br /&gt;
	integer idNum;&lt;br /&gt;
	if (~llListFindList(agentsInTranslation, (list)avid))&lt;br /&gt;
	{&lt;br /&gt;
		avliPos = llListFindList(agentsInTranslation, (list)avid);&lt;br /&gt;
		agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, chklan], avliPos + 1, avliPos + 2);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		@at;&lt;br /&gt;
		idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
		if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
		{&lt;br /&gt;
			jump at;&lt;br /&gt;
		}&lt;br /&gt;
		agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, chklan, idNum];&lt;br /&gt;
		llMessageLinked(LINK_THIS, 64562349, avlan, avid);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string addNewAgent(key newavid)&lt;br /&gt;
{&lt;br /&gt;
	string speakerLan;&lt;br /&gt;
	if (llGetAgentSize(newavid) != ZERO_VECTOR)&lt;br /&gt;
	{&lt;br /&gt;
		speakerLan  = checkLanguage(llGetAgentLanguage(newavid));&lt;br /&gt;
		if (speakerLan == &amp;quot;&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
			addAgent(newavid, speakerLan, 0);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			addAgent(newavid, speakerLan, 0);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return speakerLan;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
	if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
	{&lt;br /&gt;
		integer gkliPos = llListFindList(agentsInTranslation, (list)agentID);&lt;br /&gt;
		return llList2Key(agentsInTranslation, gkliPos - 3);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		return &amp;quot;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
processHTTPResponse(integer ntype, string bodyStr, list httli)&lt;br /&gt;
{&lt;br /&gt;
	integer spkliPos;&lt;br /&gt;
	list    recepientList;&lt;br /&gt;
	key     recepientID;&lt;br /&gt;
	string  recepientLanguage;&lt;br /&gt;
	string  languagePair;&lt;br /&gt;
	key     speakerID;&lt;br /&gt;
	string  speakerName;&lt;br /&gt;
	string  speakerLanguage;&lt;br /&gt;
	string  translatedText;&lt;br /&gt;
	string  lantmpStr;&lt;br /&gt;
	integer z;&lt;br /&gt;
	list    paramtmpli;&lt;br /&gt;
	//===================&lt;br /&gt;
	//Process Translation&lt;br /&gt;
	//===================&lt;br /&gt;
	speakerID  = llList2Key(httli, 1);&lt;br /&gt;
	speakerName = llKey2Name(speakerID);&lt;br /&gt;
	if (speakerName == &amp;quot;&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
	}&lt;br /&gt;
	recepientList = llParseString2List(llList2String(httli, 2), [&amp;quot;@&amp;quot;], []);&lt;br /&gt;
	paramtmpli = llParseStringKeepNulls(llList2String(httli, 3), [&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
	recepientLanguage = llList2String(paramtmpli, 1);&lt;br /&gt;
	languagePair = llDumpList2String(paramtmpli, &amp;quot;&amp;gt;&amp;gt;&amp;quot;);&lt;br /&gt;
	//Perform Text Cleanup&lt;br /&gt;
	translatedText = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;detectedSourceLanguage\&amp;quot;:\&amp;quot;&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
	//Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
	if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
	{&lt;br /&gt;
		lantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
		for(z = llStringLength(translatedText);z &amp;gt;= 0; z--)&lt;br /&gt;
		{&lt;br /&gt;
			lantmpStr = (lantmpStr=&amp;quot;&amp;quot;) + lantmpStr + llGetSubString(translatedText, z, z);&lt;br /&gt;
		}&lt;br /&gt;
		translatedText = lantmpStr;&lt;br /&gt;
	}&lt;br /&gt;
	lantmpStr = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
	if (showTranslation)&lt;br /&gt;
	{&lt;br /&gt;
		sendIM(speakerID, lantmpStr);&lt;br /&gt;
	}&lt;br /&gt;
	for (z = 0; z &amp;lt; llGetListLength(recepientList); z += 1)&lt;br /&gt;
	{&lt;br /&gt;
		recepientID = getAgentKey(llList2Integer(recepientList, z));&lt;br /&gt;
		if (recepientID != &amp;quot;&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, [recepientID]) + 1);&lt;br /&gt;
			if (recepientLanguage != speakerLanguage)&lt;br /&gt;
			{&lt;br /&gt;
				sendIM(recepientID, lantmpStr);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(5);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
	{&lt;br /&gt;
		list    ltmpli;&lt;br /&gt;
		if (num == 8434532)&lt;br /&gt;
		{&lt;br /&gt;
			enabled = (integer)lstr;&lt;br /&gt;
		}&lt;br /&gt;
		else if (num == 3342976)&lt;br /&gt;
		{&lt;br /&gt;
			//Send Preferences&lt;br /&gt;
			options = lstr;&lt;br /&gt;
			if (isInitialized == FALSE) return;&lt;br /&gt;
			ltmpli = llCSV2List(options);&lt;br /&gt;
			showTranslation = llList2Integer(ltmpli, 0);&lt;br /&gt;
			tranObjects = llList2Integer(ltmpli, 1);&lt;br /&gt;
			autoLanguage = llList2Integer(ltmpli, 2);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	sensor(integer num_detected)&lt;br /&gt;
	{&lt;br /&gt;
		integer s;&lt;br /&gt;
		key     sid;&lt;br /&gt;
		for (s = 0; s &amp;lt; num_detected; s += 1)&lt;br /&gt;
		{&lt;br /&gt;
			sid = llDetectedKey(s);&lt;br /&gt;
			if (~llListFindList(agentsInTranslation, (list)sid)) { }&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				addNewAgent(sid);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	no_sensor() { }&lt;br /&gt;
&lt;br /&gt;
	listen(integer channel, string name, key id, string message)&lt;br /&gt;
	{&lt;br /&gt;
		integer w;&lt;br /&gt;
		string  spkrLan;&lt;br /&gt;
		string  recepLan;&lt;br /&gt;
		integer recepID;&lt;br /&gt;
		integer lstliPos;&lt;br /&gt;
		string  lanpair;&lt;br /&gt;
		list    translationCache;&lt;br /&gt;
		//Multiplexor Code&lt;br /&gt;
		//Translator Engine Code&lt;br /&gt;
		if ((!enabled) &amp;amp;&amp;amp; (isMaster == 1))&lt;br /&gt;
		{&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (!tranObjects)&lt;br /&gt;
		{&lt;br /&gt;
			if (llGetAgentSize(id) == ZERO_VECTOR)&lt;br /&gt;
			{&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				detectLanguage(llEscapeURL(message), id);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			detectLanguage(llEscapeURL(message), id);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if (~llListFindList(agentsInTranslation, (list)id))&lt;br /&gt;
		{&lt;br /&gt;
			lstliPos = llListFindList(agentsInTranslation, (list)id);&lt;br /&gt;
			spkrLan = llList2String(agentsInTranslation, lstliPos + 1);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			spkrLan = addNewAgent(id);&lt;br /&gt;
		}&lt;br /&gt;
		//===============================&lt;br /&gt;
		//Formulate Translation Requests&lt;br /&gt;
		//===============================&lt;br /&gt;
		if (id == llGetOwner())&lt;br /&gt;
		{&lt;br /&gt;
			for (w = 0; w &amp;lt; llGetListLength(agentsInTranslation); w += 4)&lt;br /&gt;
			{&lt;br /&gt;
				//Loop through translation group and do appropriate translations as needed&lt;br /&gt;
				recepID = llList2Integer(agentsInTranslation, w + 3);&lt;br /&gt;
				recepLan =  checkLanguage(llList2String(agentsInTranslation, w + 1));&lt;br /&gt;
				if (spkrLan != recepLan)&lt;br /&gt;
				{&lt;br /&gt;
					lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
					if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
					{&lt;br /&gt;
						lstliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
						translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			//Process Requests&lt;br /&gt;
			if (translationCache != [])&lt;br /&gt;
			{&lt;br /&gt;
				for (w = 0; w &amp;lt; llGetListLength(translationCache); w += 2)&lt;br /&gt;
				{&lt;br /&gt;
					//====================================&lt;br /&gt;
					//Translation&lt;br /&gt;
					//====================================&lt;br /&gt;
					//Forumulate and Send Translation Request&lt;br /&gt;
					lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, w), [&amp;quot;|&amp;quot;],[]), 1);&lt;br /&gt;
					checkThrottle(0, llEscapeURL(message) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, w + 1), llList2String(translationCache, w)]);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			lstliPos = llListFindList(agentsInTranslation, (list)llGetOwner());&lt;br /&gt;
			recepID = llList2Integer(agentsInTranslation, lstliPos + 3);&lt;br /&gt;
			recepLan =  checkLanguage(llList2String(agentsInTranslation , lstliPos + 1 ));&lt;br /&gt;
			if (spkrLan != recepLan)&lt;br /&gt;
			{&lt;br /&gt;
				lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
				if (~llListFindList(translationCache, (list)lanpair))&lt;br /&gt;
				{&lt;br /&gt;
					lstliPos = llListFindList(translationCache, (list)lanpair);&lt;br /&gt;
					translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];&lt;br /&gt;
				}&lt;br /&gt;
				if (translationCache != [])&lt;br /&gt;
				{&lt;br /&gt;
					//====================================&lt;br /&gt;
					//Translation&lt;br /&gt;
					//====================================&lt;br /&gt;
					//Forumulate and Send Translation Request&lt;br /&gt;
					lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, lstliPos), [&amp;quot;|&amp;quot;],[]), 1);&lt;br /&gt;
					checkThrottle(0, llEscapeURL(message) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, lstliPos + 1), llList2String(translationCache, lstliPos)]);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
	{&lt;br /&gt;
		//Process Resonse Code&lt;br /&gt;
		integer httliPos;&lt;br /&gt;
		string htttmpStr;&lt;br /&gt;
&lt;br /&gt;
		if (~llListFindList(requestedTranslations, (list)request_id))&lt;br /&gt;
		{&lt;br /&gt;
			httliPos = llListFindList(requestedTranslations, [request_id]);&lt;br /&gt;
			processHTTPResponse(0, body, llCSV2List(llList2String(requestedTranslations, httliPos + 1)));&lt;br /&gt;
			requestedTranslations = llDeleteSubList(requestedTranslations, httliPos, httliPos + 1);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (~llListFindList(tempDetections, (list)request_id))&lt;br /&gt;
		{&lt;br /&gt;
			integer tmpliPos = llListFindList(tempDetections, (list)request_id);&lt;br /&gt;
			key speakerID = llList2Key(tempDetections, tmpliPos + 1);&lt;br /&gt;
			tempDetections = llDeleteSubList(tempDetections, tmpliPos, tmpliPos + 3);&lt;br /&gt;
			string tmptmpStr = llToLower(llGetSubString(body, llSubStringIndex(body, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(body, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
			if (contains(tmptmpStr, &amp;quot;err&amp;quot;) == 0 &amp;amp;&amp;amp; contains(tmptmpStr, &amp;quot;unn&amp;quot;) == 0 )&lt;br /&gt;
			{&lt;br /&gt;
				tmptmpStr = checkLanguage(tmptmpStr);&lt;br /&gt;
				if (~llListFindList(agentsInTranslation, (list)speakerID))&lt;br /&gt;
				{&lt;br /&gt;
					integer tmpavliPos = llListFindList(agentsInTranslation, (list)speakerID);&lt;br /&gt;
					string actlan = llList2String(agentsInTranslation, tmpavliPos + 1);&lt;br /&gt;
					if (actlan != tmptmpStr)&lt;br /&gt;
					{&lt;br /&gt;
						agentsInTranslation = llListReplaceList(agentsInTranslation,[llList2Integer(agentsInTranslation,tmpavliPos + 2) + 1] , tmpavliPos + 2, tmpavliPos + 2);&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
					{&lt;br /&gt;
						agentsInTranslation = llListReplaceList(agentsInTranslation,[0], tmpavliPos + 2, tmpavliPos + 2);&lt;br /&gt;
					}&lt;br /&gt;
					if (llList2Integer(agentsInTranslation,tmpavliPos + 2) &amp;gt;= 4) //if any av talks on any language 4 times in a row&lt;br /&gt;
					{&lt;br /&gt;
						if (tmptmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
						{&lt;br /&gt;
							return;&lt;br /&gt;
						}&lt;br /&gt;
						else&lt;br /&gt;
						{&lt;br /&gt;
							addAgent(speakerID, tmptmpStr, 0);&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	timer()&lt;br /&gt;
	{&lt;br /&gt;
		llSetTimerEvent(0.0);&lt;br /&gt;
		if (isInitialized == FALSE)&lt;br /&gt;
		{&lt;br /&gt;
			enabled = TRUE;&lt;br /&gt;
			listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
			llMessageLinked(LINK_THIS, 6877259, (string)enabled, NULL_KEY);&lt;br /&gt;
			isInitialized = TRUE;&lt;br /&gt;
			string mylanguage = llGetAgentLanguage(llGetOwner());&lt;br /&gt;
			if (llStringLength(mylanguage) &amp;lt; 1)&lt;br /&gt;
			{&lt;br /&gt;
				mylanguage = &amp;quot;en&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [llGetOwner() , mylanguage , 0 , llRound(llFrand(2000000)) + 1];&lt;br /&gt;
		}&lt;br /&gt;
		integer r;&lt;br /&gt;
		string  tmrtmpStr;&lt;br /&gt;
		list    tmrnewli;&lt;br /&gt;
		integer x;&lt;br /&gt;
		list  newList;&lt;br /&gt;
		float timeElapsed;&lt;br /&gt;
		for (x = 0; x &amp;lt; llGetListLength(tempDetections); x += 2)&lt;br /&gt;
		{&lt;br /&gt;
			timeElapsed = llGetTime() - llList2Float(llCSV2List(llList2String(tempDetections, x + 1)), 0);&lt;br /&gt;
			if (timeElapsed &amp;lt; 60.0)&lt;br /&gt;
				newList = (newList=[]) + newList + llList2List(tempDetections, x, x + 1);&lt;br /&gt;
		}&lt;br /&gt;
		tempDetections = newList;&lt;br /&gt;
		newList = [];&lt;br /&gt;
		for (x = 0; x &amp;lt; llGetListLength(requestedTranslations); x += 2)&lt;br /&gt;
		{&lt;br /&gt;
			timeElapsed = llGetTime() - llList2Float(llCSV2List(llList2String(requestedTranslations, x + 1)), 0);&lt;br /&gt;
			if (timeElapsed &amp;lt; 60.0)&lt;br /&gt;
			{&lt;br /&gt;
				newList = (newList=[]) + newList + llList2List(requestedTranslations, x, x + 1);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		requestedTranslations = newList;&lt;br /&gt;
		if (isMaster &amp;gt; 0)&lt;br /&gt;
		{&lt;br /&gt;
			for (r = 0; r &amp;lt; llGetListLength(agentsInTranslation); r += 4)&lt;br /&gt;
			{&lt;br /&gt;
				tmrtmpStr = llList2String(llGetObjectDetails(llList2Key(agentsInTranslation, r), [OBJECT_POS]), 0);&lt;br /&gt;
				if ((llVecDist(llGetPos(), (vector)tmrtmpStr) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tmrtmpStr != &amp;quot;&amp;quot;))&lt;br /&gt;
				{&lt;br /&gt;
					tmrnewli = (tmrnewli=[]) + tmrnewli + llList2List(agentsInTranslation, r, r + 3);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			agentsInTranslation = tmrnewli;&lt;br /&gt;
		}&lt;br /&gt;
		if ((autoLanguage) &amp;amp;&amp;amp; isMaster &amp;gt; 0)&lt;br /&gt;
		{&lt;br /&gt;
			llSensor(&amp;quot;&amp;quot;, NULL_KEY, AGENT, 20.0, PI);&lt;br /&gt;
		}&lt;br /&gt;
		llSetTimerEvent(4.0); // restart timer&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=688902</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=688902"/>
		<updated>2009-12-16T21:30:33Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribucion al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente codigo fué originalmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mi manera...&lt;br /&gt;
No os riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;OK&#039;&#039; ===&lt;br /&gt;
Bueno, despues de respiñar todo lo que he podido, creo que el uso de memoria y la velocidad estan practicamente igual que en la version original pero bueno... en la variedad está el gusto no?&lt;br /&gt;
Ya he probado un poco el codigo, y parece que funciona aunque estoy teniendo algunos problemas... Por ejemplo creo que el sistema de traduccion no funciona correctamente, y no me refiero al sistema de traduccion de Google (en mi opinion, si no es el mejor, es uno de los mejores del mundo), sino a que aun queda mucho trabajo por hacer en el script...&lt;br /&gt;
&lt;br /&gt;
El siguiente paso sera intentar dividir el script en dos, o si es posible en tres para repartir el uso de memoria. Tambien me gustaria probar un truco que uso a menudo para traducir paginas en un idioma que no entiendo, lo que hago es que en vez de traducir directamente al español, primero lo traduzco a inglés, y luego desde inglés al español, parece una tonteria y un gasto innecesario, pero si lo hago es porque así suelo entender mejor las traducciones.&lt;br /&gt;
Quiero por un lado el sistema de comunicacion y evaluacion entre traductores, y por otro el sistema de traduccion entre avatares, ¿es muy dificil? no se ya lo veremos...&lt;br /&gt;
&lt;br /&gt;
Well, after saving as much as I could, I think the memory usage and the speed are technically the same as in the original script, but well, in the variety is the taste, isnt it?. &lt;br /&gt;
I have tested a bit the code above already, and it seems to work altought i´m having some problems...&lt;br /&gt;
For instance i think the translation system is not working properly, and i dont mean the Google´s translation system (in my opinion, if is not the best, one of the bests), but that there is still much work to do in the script...&lt;br /&gt;
&lt;br /&gt;
The next step will be to try to divide the script in 2, or 3 if is possible, so we can spread the memory usage. Also I would like to test a trick i use often for to translate languages that i dont understand, what I do first is to translate that language into English, and then from English to Spanish, it seems a nonsense and unnecesary waste, but if i do it is becouse so i usually understand the translations better.&lt;br /&gt;
I want by one part the translators communications and evaluation system, and by other the translation system between avatars, is it very difficult? I don´t know , we will see...&lt;br /&gt;
&lt;br /&gt;
Es dificil... me está costando pero ya veremos...&lt;br /&gt;
Its difficult... i am struggling but we will see...&lt;br /&gt;
&lt;br /&gt;
chu chu chu&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=688852</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=688852"/>
		<updated>2009-12-16T21:06:27Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: /* OK */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribucion al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente codigo fué originalmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mi manera...&lt;br /&gt;
No os riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;OK&#039;&#039; ===&lt;br /&gt;
Bueno, despues de respiñar todo lo que he podido, creo que el uso de memoria y la velocidad estan practicamente igual que en la version original pero bueno... en la variedad está el gusto no?&lt;br /&gt;
Ya he probado un poco el codigo, y parece que funciona aunque estoy teniendo algunos problemas... Por ejemplo creo que el sistema de traduccion no funciona correctamente, y no me refiero al sistema de traduccion de Google (en mi opinion, si no es el mejor, es uno de los mejores del mundo), sino a que aun queda mucho trabajo por hacer en el script...&lt;br /&gt;
&lt;br /&gt;
El siguiente paso sera intentar dividir el script en dos, o si es posible en tres para repartir el uso de memoria. Tambien me gustaria probar un truco que uso a menudo para traducir paginas en un idioma que no entiendo, lo que hago es que en vez de traducir directamente al español, primero lo traduzco a inglés, y luego desde inglés al español, parece una tonteria y un gasto innecesario, pero si lo hago es porque así suelo entender mejor las traducciones.&lt;br /&gt;
Quiero por un lado el sistema de comunicacion y evaluacion entre traductores, y por otro el sistema de traduccion entre avatares, ¿es muy dificil? no se ya lo veremos...&lt;br /&gt;
&lt;br /&gt;
Well, after saving as much as I could, I think the memory usage and the speed are technically the same as in the original script, but well, in the variety is the taste, isnt it?. &lt;br /&gt;
I have tested a bit the code above already, and it seems to work altought i´m having some problems...&lt;br /&gt;
For instance i think the translation system is not working properly, and i dont mean the Google´s translation system (in my opinion, if is not the best, one of the bests), but that there is still much work to do in the script...&lt;br /&gt;
&lt;br /&gt;
The next step will be to try to divide the script in 2, or 3 if is possible, so we can spread the memory usage. Also I would like to test a trick i use often for to translate languages that i dont understand, what I do first is to translate that language into English, and then from English to Spanish, it seems a nonsense and unnecesary waste, but if i do it is becouse so i usually understand the translations better.&lt;br /&gt;
I want by one part the translators communications and evaluation system, and by other the translation system between avatars, is it very difficult? I don´t know , we will see...&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=687853</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=687853"/>
		<updated>2009-12-15T22:53:52Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: /* welcome */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribucion al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente codigo fué originalmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mi manera...&lt;br /&gt;
No os riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;OK&#039;&#039; ===&lt;br /&gt;
Bueno, despues de respiñar todo lo que he podido, creo que el uso de memoria y la velocidad estan practicamente igual que en la version original pero bueno... en la variedad está el gusto no?&lt;br /&gt;
Ya he probado un poco el codigo, y parece que funciona aunque estoy teniendo algunos problemas... Por ejemplo creo que el sistema de traduccion no funciona correctamente, y no me refiero al sistema de traduccion de Google (en mi opinion, si no es el mejor, es uno de los mejores del mundo), sino a que aun queda mucho trabajo por hacer en el script...&lt;br /&gt;
&lt;br /&gt;
El siguiente paso sera intentar dividir el script en dos, o si es posible en tres para repartir el uso de memoria. Tambien me gustaria probar un truco que uso a menudo para traducir paginas en un idioma que no entiendo, lo que hago es que en vez de traducir directamente al español, primero lo traduzco a inglés, y luego desde inglés al español, parece una tonteria y un gasto innecesario, pero si lo hago es porque así suelo entender mejor las traducciones.&lt;br /&gt;
Quiero por un lado el sistema de comunicacion y evaluacion entre traductores, y por otro el sistema de traduccion entre avatares, ¿es muy dificil? no se ya lo veremos...&lt;br /&gt;
&lt;br /&gt;
Well, after saving as much as I could, I think the memory usage and the speed are technically the same as in the original script, but well, in the variety is the taste, isnt it?. &lt;br /&gt;
I have tested a bit the code above already, and it seems to work altought i´m having some problems...&lt;br /&gt;
For instance i think the translation system is not working properly, and i dont mean the Google´s translation system (in my opinion, if is not the best, one of the bests), but that there is still much work to do in the script...&lt;br /&gt;
&lt;br /&gt;
The next step will be to try to divide the script in 2, or 3 if is possible, so we can spread the memory usage. Also I would like to test a trick i use often for to translate languages that i dont understand, what I do first is to translate that language into English, and then from English to Spanish, it seems a nonsense and unnecesary waste, but if i do it is becouse so i usually understand the translations better.&lt;br /&gt;
I want by one part the translators communications and evaluation system, and by other the translation system between avatars, is it very difficult? I don´t know , we will see...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//November 12, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Web Server Services powered by Google &lt;br /&gt;
//Variables&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
list agentsInTranslationOptions;&lt;br /&gt;
list requestList;&lt;br /&gt;
integer listenID; &lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
integer showTranslation = FALSE;&lt;br /&gt;
integer tranObjects = TRUE; &lt;br /&gt;
integer lastHeartBeat;&lt;br /&gt;
list    languageCodes = [&lt;br /&gt;
&amp;quot;zh-CN&amp;quot;, &amp;quot;zh-TW&amp;quot;, &amp;quot;hr&amp;quot;,  &lt;br /&gt;
&amp;quot;bg&amp;quot;, &amp;quot;be&amp;quot;, &amp;quot;ca&amp;quot;,&lt;br /&gt;
&amp;quot;af&amp;quot;, &amp;quot;sq&amp;quot;, &amp;quot;ar&amp;quot;,   &lt;br /&gt;
&amp;quot;tl&amp;quot;, &amp;quot;fr&amp;quot;, &amp;quot;gl&amp;quot;,    &lt;br /&gt;
&amp;quot;fi&amp;quot;, &amp;quot;en&amp;quot;, &amp;quot;et&amp;quot;,     &lt;br /&gt;
&amp;quot;cs&amp;quot;, &amp;quot;da&amp;quot;, &amp;quot;nl&amp;quot;,  &lt;br /&gt;
&amp;quot;id&amp;quot;, &amp;quot;ga&amp;quot;, &amp;quot;it&amp;quot;,      &lt;br /&gt;
&amp;quot;hi&amp;quot;, &amp;quot;hu&amp;quot;, &amp;quot;is&amp;quot;, &lt;br /&gt;
&amp;quot;de&amp;quot;, &amp;quot;el&amp;quot;, &amp;quot;iw&amp;quot;,    &lt;br /&gt;
&amp;quot;mt&amp;quot;, &amp;quot;no&amp;quot;, &amp;quot;fa&amp;quot;,   &lt;br /&gt;
&amp;quot;lt&amp;quot;, &amp;quot;mk&amp;quot;, &amp;quot;ms&amp;quot;,   &lt;br /&gt;
&amp;quot;ja&amp;quot;, &amp;quot;ko&amp;quot;, &amp;quot;lv&amp;quot;,   &lt;br /&gt;
&amp;quot;sl&amp;quot;, &amp;quot;es&amp;quot;, &amp;quot;sw&amp;quot;, &lt;br /&gt;
&amp;quot;ru&amp;quot;, &amp;quot;sr&amp;quot;, &amp;quot;sk&amp;quot;, &lt;br /&gt;
&amp;quot;pl&amp;quot;, &amp;quot;pt-PT&amp;quot;, &amp;quot;ro&amp;quot;,&lt;br /&gt;
&amp;quot;yi&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;uk&amp;quot;, &amp;quot;vi&amp;quot;, &amp;quot;cy&amp;quot;,&lt;br /&gt;
&amp;quot;sv&amp;quot;,&amp;quot;th&amp;quot;, &amp;quot;tr&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
list    translators;&lt;br /&gt;
list    sayCache;&lt;br /&gt;
list    sayCachePrivate;&lt;br /&gt;
integer priorityNumber;&lt;br /&gt;
integer priorityNumListenID;&lt;br /&gt;
integer isInitialized = FALSE;&lt;br /&gt;
string  options; &lt;br /&gt;
//Options&lt;br /&gt;
//integer debug = TRUE;&lt;br /&gt;
integer broadcastChannel = -9999999; //note this is not the channel used by the HR Universal Translator&lt;br /&gt;
string  password = &amp;quot;password&amp;quot;; //note this is not the password used to encrypt comms of the HR Universal Translator&lt;br /&gt;
integer version = 190;&lt;br /&gt;
//&lt;br /&gt;
sendIM(key imid, string imstr)&lt;br /&gt;
{&lt;br /&gt;
    if (llGetParcelFlags(llGetPos()) &amp;amp; PARCEL_FLAG_ALLOW_SCRIPTS)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 85234119, imstr, imid); &lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_THIS, 85304563, imstr, imid);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//txTxtLot() = sendTextBatch()&lt;br /&gt;
txTxtLot(integer txch, string txtxt) &lt;br /&gt;
{&lt;br /&gt;
    txtxt = llXorBase64StringsCorrect(llStringToBase64(txtxt), llStringToBase64(password));&lt;br /&gt;
    while (llStringLength(txtxt) &amp;gt; 508) //If string is 509 characters or longer &lt;br /&gt;
    {&lt;br /&gt;
        llSay(txch, llGetSubString(txtxt, 0, 507)); //send 508 character chunk&lt;br /&gt;
        txtxt = llGetSubString(txtxt, 508, -1);  //delete 508 character chunk&lt;br /&gt;
    }&lt;br /&gt;
    llSay(txch, txtxt);  //send out any remainder chunk or original chunk&lt;br /&gt;
    //Perry Mizin Comment: I don´t understand the aim of the following if.    &lt;br /&gt;
    //Hank Ramos Comment: this line serves to &amp;quot;trigger&amp;quot; the receiver not to wait for another batch.  If the&lt;br /&gt;
    //message length is exactly 508 characters, the receiver things that another chunk of the message is coming.&lt;br /&gt;
    //This message serves to tell the receiver that the last chunk was the last chunk, not another regular chunk.&lt;br /&gt;
    if (llStringLength(txtxt) == 508)&lt;br /&gt;
        llSay(txch, (string)(txch*4958654));&lt;br /&gt;
    //Hank Ramos Comment: this just flashes the color of the bottom prim to show a message was sent&lt;br /&gt;
    llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0, 0.25&amp;gt;, &amp;quot;&amp;quot;); &lt;br /&gt;
}  &lt;br /&gt;
//string rxTxtLot() = string receiveTextBatch()&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer rxliPos;&lt;br /&gt;
    string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
    {&lt;br /&gt;
        rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
        rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
        sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
    rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
    return rxmsg;&lt;br /&gt;
}&lt;br /&gt;
//string rxTxtLot() = string receiveTextBatch() (Another way)&lt;br /&gt;
integer rxTxtLotBusy = FALSE; //Perry Mizin: added Busy Mode, this could fail or prevent fail&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    if (rxTxtLotBusy == FALSE)&lt;br /&gt;
    {&lt;br /&gt;
        rxTxtLotBusy = TRUE;&lt;br /&gt;
        integer rxliPos;&lt;br /&gt;
        string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
        if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
        {&lt;br /&gt;
            @rxin;&lt;br /&gt;
            rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
            rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
            sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
            if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
            {&lt;br /&gt;
                 jump rxin;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
        rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
        rxTxtLotBusy = FALSE;&lt;br /&gt;
        return rxmsg;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        //Perry Mizin: llSaySomething?&lt;br /&gt;
        return &amp;quot;&amp;quot;;        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string rxTxtLotPrv() = string receiveTextBatchPrivate()&lt;br /&gt;
string rxTxtLotPrv(key prxid, string prxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer prxliPos;&lt;br /&gt;
    string  prxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCachePrivate, (list)prxid))&lt;br /&gt;
    {&lt;br /&gt;
        prxliPos = llListFindList(sayCachePrivate, [prxid]);&lt;br /&gt;
        prxtmpStr = (prxtmpStr=&amp;quot;&amp;quot;) + prxtmpStr + llList2String(sayCachePrivate, prxliPos + 1);&lt;br /&gt;
        sayCachePrivate = llDeleteSubList(sayCachePrivate, prxliPos, prxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    prxmsg = prxtmpStr + prxmsg;&lt;br /&gt;
    prxmsg = llBase64ToString(llXorBase64StringsCorrect(prxmsg, llStringToBase64(password)));&lt;br /&gt;
    return prxmsg;&lt;br /&gt;
}&lt;br /&gt;
//updateTranslatorList()&lt;br /&gt;
updateTranslatorList()&lt;br /&gt;
{&lt;br /&gt;
    integer nx;&lt;br /&gt;
    integer xliLng;&lt;br /&gt;
    list    newList;&lt;br /&gt;
    string  tmpStrPos;&lt;br /&gt;
    integer newMaster;&lt;br /&gt;
    //Scan and remove translators not in the area&lt;br /&gt;
    xliLng = llGetListLength(translators);&lt;br /&gt;
    for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
    {&lt;br /&gt;
        tmpStrPos = llList2String(llGetObjectDetails(llList2Key(translators, nx + 1), [OBJECT_POS]), 0);&lt;br /&gt;
        if ((llVecDist(llGetPos(), (vector)tmpStrPos) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tmpStrPos != &amp;quot;&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            newList = (newList=[]) + newList +  llList2List(translators, nx, nx + 1);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    translators = newList;&lt;br /&gt;
    //llMessageLinked(LINK_THIS,65635544,(string)xliLng,&amp;quot;&amp;quot;); Perry Mizin: what is this necesary for?&lt;br /&gt;
    if (translators == [])&lt;br /&gt;
    {&lt;br /&gt;
        newMaster = 1;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        if (enabled)&lt;br /&gt;
        {&lt;br /&gt;
            xliLng = llGetListLength(translators);&lt;br /&gt;
            newMaster = 2;&lt;br /&gt;
            for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
            {&lt;br /&gt;
                //llOwnerSay(&amp;quot;Checking Priority Number(&amp;quot; +  (string)priorityNumber + &amp;quot;): &amp;quot; + (string)llList2Integer(translators, x));&lt;br /&gt;
                if (llList2Integer(translators, nx) &amp;gt; priorityNumber)&lt;br /&gt;
                {&lt;br /&gt;
                    newMaster = 0;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            newMaster = 0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster &amp;gt; 0) &amp;amp;&amp;amp; (newMaster == 0))&lt;br /&gt;
    {&lt;br /&gt;
        //We are being demoted from master to slave&lt;br /&gt;
        //Flush agentsInTranslation to master&lt;br /&gt;
        if (agentsInTranslation != [])&lt;br /&gt;
        {&lt;br /&gt;
            //Demotion Dump of agentsInTranslation to Master&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1003, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
            if (isInitialized == FALSE)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1004, options])); //error&lt;br /&gt;
        }&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster == 0) &amp;amp;&amp;amp; (newMaster &amp;gt; 0))&lt;br /&gt;
    {&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
        listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); &lt;br /&gt;
    }&lt;br /&gt;
    isMaster = newMaster;&lt;br /&gt;
    llMessageLinked(LINK_THIS, 34829304, (string)isMaster, &amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
//sendHeartbeat()&lt;br /&gt;
sendHeartbeat()&lt;br /&gt;
{&lt;br /&gt;
    updateTranslatorList();&lt;br /&gt;
    txTxtLot(broadcastChannel, llList2CSV([1001, priorityNumber]));&lt;br /&gt;
    //Broadcast agentList to Slaves&lt;br /&gt;
    if (isMaster == 2)&lt;br /&gt;
    {&lt;br /&gt;
        txTxtLot(broadcastChannel, llList2CSV([1002, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//checkThrottle()&lt;br /&gt;
checkThrottle(integer chkn, string chkmsg, list chkli)&lt;br /&gt;
{&lt;br /&gt;
    integer y;&lt;br /&gt;
    integer maxCount;&lt;br /&gt;
    float   chkoldTime;&lt;br /&gt;
    float   sleepTime;&lt;br /&gt;
    list    chknewli;&lt;br /&gt;
    key     returnValue;&lt;br /&gt;
    integer channelToSpeak; &lt;br /&gt;
    //loop though list and remove items older than 25 seconds&lt;br /&gt;
    for (y = 0; y &amp;lt; llGetListLength(requestList); y += 1)&lt;br /&gt;
    {&lt;br /&gt;
        chkoldTime = llList2Float(requestList, y);&lt;br /&gt;
        //Construct new list with only times less than 25 seconds&lt;br /&gt;
        if ((llGetTime() - chkoldTime) &amp;lt;= 25.0)&lt;br /&gt;
        { &lt;br /&gt;
            chknewli = (chknewli=[]) + chknewli + [chkoldTime];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    requestList = chknewli; &lt;br /&gt;
    y = llGetListLength(requestList);&lt;br /&gt;
    //Shunt all translations to linked translators if master&lt;br /&gt;
    if (isMaster == 2)&lt;br /&gt;
    {&lt;br /&gt;
        if (chkn == 0)&lt;br /&gt;
        {&lt;br /&gt;
            //Send HTTP request to other translator&lt;br /&gt;
            //Send out Request to Random Translator Channel&lt;br /&gt;
            channelToSpeak = llList2Integer(llListRandomize(llList2ListStrided(translators, 0, -1, 2), 1), 0);&lt;br /&gt;
            if (channelToSpeak &amp;gt; 0) &lt;br /&gt;
            {&lt;br /&gt;
                txTxtLot(channelToSpeak, llList2CSV([chkn, llList2CSV(chkli)]) + &amp;quot;~&amp;quot; + chkmsg);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if (y == 19)&lt;br /&gt;
    {&lt;br /&gt;
        sleepTime =  25.0 - (llGetTime() - llList2Float(requestList, 0));&lt;br /&gt;
        if (sleepTime &amp;gt; 0) &lt;br /&gt;
        {&lt;br /&gt;
            llSleep(sleepTime);&lt;br /&gt;
        }&lt;br /&gt;
        requestList = llDeleteSubList(requestList, 0, 0);&lt;br /&gt;
    }&lt;br /&gt;
    if (chkn == 0)&lt;br /&gt;
    {&lt;br /&gt;
        chkmsg = &amp;quot;translate?v=1.0&amp;amp;q=&amp;quot; + chkmsg;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        chkmsg = &amp;quot;detect?v=1.0&amp;amp;q=&amp;quot; + chkmsg;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    requestList = (requestList=[]) + requestList + (list)llGetTime();&lt;br /&gt;
    returnValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/&amp;quot; + chkmsg, [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot; &amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
    if (returnValue != NULL_KEY)&lt;br /&gt;
    {&lt;br /&gt;
        if (chkn == 0)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS, 235365342, llList2CSV(chkli), returnValue); &lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS, 235365343, llList2CSV(chkli), returnValue); &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llSleep(40.0); //Something has gone horribly wrong, sleep 40 seconds to clear throttle&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string checkLanguage()&lt;br /&gt;
string checkLanguage(string chklantmpStr)&lt;br /&gt;
{&lt;br /&gt;
    if (llGetSubString(chklantmpStr, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else if (chklantmpStr == &amp;quot;und&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;el&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if (~llListFindList(languageCodes, [chklantmpStr]))&lt;br /&gt;
    {&lt;br /&gt;
 &lt;br /&gt;
    } else {&lt;br /&gt;
        chklantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    chklantmpStr = llGetSubString(chklantmpStr, 0, 1);&lt;br /&gt;
    return chklantmpStr;&lt;br /&gt;
}&lt;br /&gt;
//addAgent()&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
    integer avliPos;&lt;br /&gt;
    integer idNum;&lt;br /&gt;
    if (llListFindList(agentsInTranslation, (list)avid) != 911)&lt;br /&gt;
    {&lt;br /&gt;
        avliPos = llListFindList(agentsInTranslation, [avid]);&lt;br /&gt;
        agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, chklan], avliPos + 1, avliPos + 2);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        @yes;&lt;br /&gt;
        idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
        if(llListFindList(agentsInTranslation, (list)idNum) != 911)&lt;br /&gt;
        {//it exists       &lt;br /&gt;
            jump at;&lt;br /&gt;
        }&lt;br /&gt;
        agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, chklan, idNum];&lt;br /&gt;
        llMessageLinked(LINK_THIS, 64562349, avlan, avid);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string addNewAgent()&lt;br /&gt;
string addNewAgent(key newavid)&lt;br /&gt;
{&lt;br /&gt;
    string speakerLan;&lt;br /&gt;
 &lt;br /&gt;
    if (llGetAgentSize(newavid) != ZERO_VECTOR)&lt;br /&gt;
    {&lt;br /&gt;
        speakerLan  = checkLanguage(llGetAgentLanguage(newavid));&lt;br /&gt;
        if (speakerLan == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
            addAgent(newavid, speakerLan, TRUE);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            addAgent(newavid, speakerLan, FALSE);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return speakerLan;&lt;br /&gt;
}&lt;br /&gt;
//key getAgentKey()&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
    if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
    {&lt;br /&gt;
        integer gkliPos = llListFindList(agentsInTranslation, [agentID]);&lt;br /&gt;
        return llList2Key(agentsInTranslation, gkliPos - 3);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//processHTTPResponse()&lt;br /&gt;
processHTTPResponse(integer ntype, string bodyStr, list paramsli)&lt;br /&gt;
{&lt;br /&gt;
    integer spkliPos;&lt;br /&gt;
    list    recepientList;&lt;br /&gt;
    key     recepientID;&lt;br /&gt;
    string  recepientLanguage;&lt;br /&gt;
    string  languagePair;&lt;br /&gt;
    key     speakerID;&lt;br /&gt;
    string  speakerName;&lt;br /&gt;
    string  speakerLanguage;&lt;br /&gt;
    string  translatedText;&lt;br /&gt;
    string  lantmpStr;&lt;br /&gt;
    integer z;&lt;br /&gt;
    integer speakerLanguageReliable;&lt;br /&gt;
    float   speakerLanguageConfidence;&lt;br /&gt;
    list    paramtmpli;&lt;br /&gt;
    //===================&lt;br /&gt;
    //Process Translation&lt;br /&gt;
    //===================&lt;br /&gt;
    if (ntype == 0)&lt;br /&gt;
    {&lt;br /&gt;
        speakerID  = llList2Key(paramsli, 1);&lt;br /&gt;
        speakerName = llKey2Name(speakerID);&lt;br /&gt;
        if (speakerName == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
        }&lt;br /&gt;
        recepientList = llParseString2List(llList2String(paramsli, 2), [&amp;quot;@&amp;quot;], []);&lt;br /&gt;
        paramtmpli = llParseStringKeepNulls(llList2String(paramsli, 3), [&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
        recepientLanguage = llList2String(paramtmpli, 1);&lt;br /&gt;
        languagePair = llDumpList2String(paramtmpli, &amp;quot;&amp;gt;&amp;gt;&amp;quot;); &lt;br /&gt;
        //Perform Text Cleanup&lt;br /&gt;
        z = llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;detectedSourceLanguage\&amp;quot;:\&amp;quot;&amp;quot;); &lt;br /&gt;
        if (z != -1)&lt;br /&gt;
        {&lt;br /&gt;
            translatedText  = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, z);&lt;br /&gt;
            speakerLanguage = checkLanguage(llGetSubString(bodyStr, z + 28, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;}, \&amp;quot;responseDetails\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
            spkliPos = llListFindList(agentsInTranslation, [speakerID]);&lt;br /&gt;
            if (spkliPos &amp;gt;= 0)&lt;br /&gt;
            {&lt;br /&gt;
                if (speakerLanguage != llList2String(agentsInTranslation, spkliPos + 1))&lt;br /&gt;
                {&lt;br /&gt;
                    agentsInTranslation = llListReplaceList(agentsInTranslation, [TRUE], spkliPos + 2, spkliPos + 2);  //Mark for recheck of actual spoken language.&lt;br /&gt;
                }&lt;br /&gt;
            }                   &lt;br /&gt;
        }&lt;br /&gt;
        else if (z == -1)&lt;br /&gt;
        {&lt;br /&gt;
            translatedText = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;}, \&amp;quot;responseDetails\&amp;quot;&amp;quot;));&lt;br /&gt;
        }&lt;br /&gt;
        //Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
        if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            lantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
            //Perry Mizin Comment: Probably I guess this is wrong, maybe I am wrong&lt;br /&gt;
            //Perry Mizin Comment: alternative reverse order: &amp;quot;Hello World&amp;quot; could be &amp;quot;World Hello&amp;quot;&lt;br /&gt;
            //Perry Mizin Comment: reverse order: &amp;quot;Hello World&amp;quot; is &amp;quot;dlroW olleH&amp;quot; or ,,pl^ºM ºllªH,,&lt;br /&gt;
            for(z = llStringLength(translatedText);z &amp;gt;= 0; z--)&lt;br /&gt;
            {&lt;br /&gt;
                lantmpStr = (lantmpStr=&amp;quot;&amp;quot;) + lantmpStr + llGetSubString(translatedText, z, z); &lt;br /&gt;
            }&lt;br /&gt;
            translatedText = lantmpStr;&lt;br /&gt;
        }   &lt;br /&gt;
        lantmpStr = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
        if (showTranslation)&lt;br /&gt;
        {&lt;br /&gt;
            sendIM(speakerID, lantmpStr);&lt;br /&gt;
        } &lt;br /&gt;
        for (z = 0; z &amp;lt; llGetListLength(recepientList); z += 1)&lt;br /&gt;
        {&lt;br /&gt;
            recepientID = getAgentKey(llList2Integer(recepientList, z));&lt;br /&gt;
            if (recepientID != &amp;quot;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, [recepientID]) + 1);&lt;br /&gt;
                if (recepientLanguage != speakerLanguage)&lt;br /&gt;
                {&lt;br /&gt;
                    sendIM(recepientID, lantmpStr);&lt;br /&gt;
                }&lt;br /&gt;
            }  &lt;br /&gt;
        }&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    //===========================&lt;br /&gt;
    //Process Language Detection&lt;br /&gt;
    //===========================&lt;br /&gt;
    if (ntype == 1)&lt;br /&gt;
    {&lt;br /&gt;
        speakerID = llList2Key(paramsli, 1);&lt;br /&gt;
        speakerLanguageReliable = llToLower(llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) + 15, llSubStringIndex(bodyStr, &amp;quot;,\&amp;quot;confidence\&amp;quot;:&amp;quot;) - 1)) == &amp;quot;true&amp;quot;;&lt;br /&gt;
        speakerLanguageConfidence = (float)llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;,\&amp;quot;confidence\&amp;quot;:&amp;quot;) + 14, llSubStringIndex(bodyStr, &amp;quot;}, \&amp;quot;responseDetails\&amp;quot;:&amp;quot;) - 1);&lt;br /&gt;
 &lt;br /&gt;
        spkliPos = llListFindList(agentsInTranslation, [speakerID]);&lt;br /&gt;
        if (((spkliPos &amp;lt; 0) &amp;amp;&amp;amp; (speakerLanguageReliable) || (speakerLanguageConfidence &amp;gt;= 0.08)))&lt;br /&gt;
        {&lt;br /&gt;
            //Analyze Data&lt;br /&gt;
            lantmpStr = checkLanguage(llToLower(llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1)));&lt;br /&gt;
            if (lantmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            } &lt;br /&gt;
            if (speakerLanguageConfidence &amp;lt; 0.14)&lt;br /&gt;
            {&lt;br /&gt;
                addAgent(speakerID, lantmpStr, TRUE);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                addAgent(speakerID, lantmpStr, FALSE);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        //Multiplexor Initialization&lt;br /&gt;
        priorityNumber = version*1000000 + llRound(llFrand(499999) + 50000);&lt;br /&gt;
        llListen(broadcastChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        priorityNumListenID = llListen(priorityNumber, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
        //Send out initial heartbeat&lt;br /&gt;
        lastHeartBeat = llGetUnixTime();&lt;br /&gt;
        txTxtLot(broadcastChannel, llList2CSV([1001, priorityNumber]));&lt;br /&gt;
 &lt;br /&gt;
        //Wait for the network to settle down&lt;br /&gt;
        llSetTimerEvent(5.0); &lt;br /&gt;
        //llSetTimerEvent(10 + ((1-llGetRegionTimeDilation()) * 1));       &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
    {&lt;br /&gt;
        list    ltmpli;&lt;br /&gt;
&lt;br /&gt;
        //Old Multiplexor&lt;br /&gt;
        if (num == 8434532)&lt;br /&gt;
        {&lt;br /&gt;
            enabled = (integer)lstr;&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 3342976)&lt;br /&gt;
        {&lt;br /&gt;
            //Send Preferences&lt;br /&gt;
            options = lstr;&lt;br /&gt;
            if (isInitialized == FALSE) return;&lt;br /&gt;
            ltmpli = llCSV2List(options);&lt;br /&gt;
            showTranslation = llList2Integer(ltmpli, 0);&lt;br /&gt;
            tranObjects = llList2Integer(ltmpli, 1);&lt;br /&gt;
            autoLanguage = llList2Integer(ltmpli, 2);&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1004, options]));&lt;br /&gt;
 &lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 9384610)&lt;br /&gt;
        {&lt;br /&gt;
            if (isMaster == 0) //markering&lt;br /&gt;
                //llMessageLinked(LINK_THIS, 5598321, llList2CSV([id, str, FALSE]), &amp;quot;&amp;quot;);&lt;br /&gt;
                txTxtLot(broadcastChannel, llList2CSV([1003, lid, lstr, FALSE]));&lt;br /&gt;
            else&lt;br /&gt;
                addAgent(lid, lstr, TRUE);&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 345149625)&lt;br /&gt;
        {&lt;br /&gt;
            //Return Translation&lt;br /&gt;
            processHTTPResponse(0, lstr, llCSV2List(lid));&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 345149626)&lt;br /&gt;
        {&lt;br /&gt;
            //Return Detection&lt;br /&gt;
            processHTTPResponse(1, lstr, llCSV2List(lid));&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    sensor(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        integer s;&lt;br /&gt;
        key     sid;&lt;br /&gt;
 &lt;br /&gt;
        for (s = 0; s &amp;lt; num_detected; s += 1)&lt;br /&gt;
        {&lt;br /&gt;
            sid = llDetectedKey(s);&lt;br /&gt;
            if (~llListFindList(agentsInTranslation, (list)sid))&lt;br /&gt;
            {                &lt;br /&gt;
            }else{&lt;br /&gt;
                addNewAgent(sid);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        integer w;&lt;br /&gt;
        string  spkrLan;&lt;br /&gt;
        string  recepLan;&lt;br /&gt;
        integer recepID;&lt;br /&gt;
        integer lstliPos;&lt;br /&gt;
        string  lanpair;&lt;br /&gt;
        list    translationCache;&lt;br /&gt;
        list    lsttmpli;&lt;br /&gt;
        integer ImessageType;&lt;br /&gt;
        string  Imessage;&lt;br /&gt;
        string  lsttmpStr;&lt;br /&gt;
        string  lst2tmpStr;&lt;br /&gt;
 &lt;br /&gt;
        //Multiplexor Code&lt;br /&gt;
        if ((channel == broadcastChannel) || (channel == priorityNumber))&lt;br /&gt;
        {&lt;br /&gt;
            //==========================&lt;br /&gt;
            //Process Proxy HTTP Request&lt;br /&gt;
            //==========================&lt;br /&gt;
 &lt;br /&gt;
            if (channel == priorityNumber)&lt;br /&gt;
            {&lt;br /&gt;
                if (llStringLength(message) &amp;gt;= 508)&lt;br /&gt;
                {&lt;br /&gt;
                    if (((integer)message/channel) != 4958654)&lt;br /&gt;
                    {&lt;br /&gt;
                        sayCachePrivate = (sayCachePrivate=[]) + sayCachePrivate + [id, message];&lt;br /&gt;
                        return; &lt;br /&gt;
                    }&lt;br /&gt;
                    message = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                message = rxTxtLotPrv(id, message);&lt;br /&gt;
                //Received packet to translate&lt;br /&gt;
                llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0.05, 0.25&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
                lsttmpli = llParseString2List(message, [&amp;quot;~&amp;quot;], []);&lt;br /&gt;
                lsttmpStr = llList2String(lsttmpli, 0);&lt;br /&gt;
                lsttmpli = llDeleteSubList(lsttmpli, 0, 0);&lt;br /&gt;
 &lt;br /&gt;
                lst2tmpStr = llDumpList2String(lsttmpli, &amp;quot;|&amp;quot;);&lt;br /&gt;
                lsttmpli = llCSV2List(lsttmpStr);&lt;br /&gt;
                lstliPos = llList2Integer(lsttmpli, 0);&lt;br /&gt;
                lsttmpli = llDeleteSubList(lsttmpli, 0, 0);&lt;br /&gt;
 &lt;br /&gt;
                checkThrottle(lstliPos, lst2tmpStr, lsttmpli);&lt;br /&gt;
 &lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
            //=======================&lt;br /&gt;
            //Process Global Messages&lt;br /&gt;
            //=======================&lt;br /&gt;
            if (llStringLength(message) &amp;gt;= 508)&lt;br /&gt;
            {&lt;br /&gt;
                if (((integer)message/channel) != 4958654)&lt;br /&gt;
                {&lt;br /&gt;
                    sayCache = (sayCache=[]) + sayCache + [id, message];&lt;br /&gt;
                    return; &lt;br /&gt;
                }&lt;br /&gt;
                message = &amp;quot;&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            message = rxTxtLot(id, message);&lt;br /&gt;
 &lt;br /&gt;
            lsttmpli = llCSV2List(message);&lt;br /&gt;
 &lt;br /&gt;
            if (llGetListLength(lsttmpli) &amp;gt;= 2)    &lt;br /&gt;
            {&lt;br /&gt;
                ImessageType = llList2Integer(lsttmpli, 0);&lt;br /&gt;
                lsttmpli = llDeleteSubList(lsttmpli, 0, 0);&lt;br /&gt;
                Imessage = llList2CSV(lsttmpli);        &lt;br /&gt;
 &lt;br /&gt;
                llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0, 0.25&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
                //Process Message Here&lt;br /&gt;
                if (ImessageType == 1001)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming Heartbeat&lt;br /&gt;
                    if ((integer)Imessage == priorityNumber)&lt;br /&gt;
                    {&lt;br /&gt;
                        llOwnerSay(&amp;quot;Priority Number Conflict!  Resetting Script...&amp;quot;);&lt;br /&gt;
                        llResetScript(); //Reset if conflicting priority number&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    if (~llListFindList(translators, (list)id)  //lstliPos &amp;lt; 0) &lt;br /&gt;
                    {&lt;br /&gt;
                        lstliPos = llListFindList(translators, [id]);&lt;br /&gt;
                        translators = llListReplaceList(translators, [(integer)Imessage], lstliPos - 1, lstliPos - 1);                        &lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                       translators = (translators=[]) + translators + [(integer)Imessage, id];&lt;br /&gt;
                        if ((isMaster &amp;gt; 0) &amp;amp;&amp;amp; (isInitialized))&lt;br /&gt;
                        {&lt;br /&gt;
                            txTxtLot((integer)Imessage, llList2CSV([1002, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
                            txTxtLot((integer)Imessage, llList2CSV([1004, options]));&lt;br /&gt;
                        } &lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if (ImessageType == 1002)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming agentsInTranslation Master Broadcast&lt;br /&gt;
                    if (isMaster == 0)&lt;br /&gt;
                    {&lt;br /&gt;
                        //llMessageLinked(LINK_THIS, 9458021, Imessage, &amp;quot;&amp;quot;);  &lt;br /&gt;
                        lsttmpli = llCSV2List(Imessage);&lt;br /&gt;
                        agentsInTranslation = [];&lt;br /&gt;
                        for (w = 0; w &amp;lt; llGetListLength(lsttmpli); w += 4)&lt;br /&gt;
                        {&lt;br /&gt;
                            agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [llList2Key(lsttmpli, w), llList2String(lsttmpli, w + 1), llList2Integer(lsttmpli, w + 2), llList2Integer(lsttmpli, w + 3)];&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if (ImessageType == 1003)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming agentsInTranslation dump from Slave&lt;br /&gt;
                    lsttmpli = llCSV2List(Imessage);&lt;br /&gt;
                    for (w = 0; w &amp;lt; llGetListLength(lsttmpli); w += 4)&lt;br /&gt;
                    {&lt;br /&gt;
                        addAgent(llList2Key(lsttmpli, w), llList2String(lsttmpli, w + 1), llList2Integer(lsttmpli, w + 2));&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if (ImessageType == 1004)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming Preferences&lt;br /&gt;
                    options = Imessage;&lt;br /&gt;
                    lsttmpli = llCSV2List(options);&lt;br /&gt;
                    showTranslation = llList2Integer(lsttmpli, 0);&lt;br /&gt;
                    tranObjects = llList2Integer(lsttmpli, 1);&lt;br /&gt;
                    autoLanguage = llList2Integer(lsttmpli, 2);&lt;br /&gt;
 &lt;br /&gt;
                    llMessageLinked(LINK_THIS, 3342977, Imessage, &amp;quot;&amp;quot;);  &lt;br /&gt;
                }&lt;br /&gt;
            }            &lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        //Translator Engine Code&lt;br /&gt;
        if ((llToLower(message) == &amp;quot;translator&amp;quot;) &amp;amp;&amp;amp; (isMaster &amp;gt; 0)) &lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS, 2540664, message, id);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ((!enabled) &amp;amp;&amp;amp; (isMaster == 1)) return;&lt;br /&gt;
 &lt;br /&gt;
        if (!tranObjects)&lt;br /&gt;
        {&lt;br /&gt;
            if (llGetAgentSize(id) == ZERO_VECTOR) return;&lt;br /&gt;
        } &lt;br /&gt;
        &lt;br /&gt;
        if (~llListFindList(agentsInTranslation, (list)id)) //lstliPos &amp;gt;= 0)&lt;br /&gt;
        {&lt;br /&gt;
            lstliPos = llListFindList(agentsInTranslation, (list)id);            &lt;br /&gt;
            spkrLan = llList2String(agentsInTranslation, lstliPos + 1);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            spkrLan = addNewAgent(id);&lt;br /&gt;
        } &lt;br /&gt;
        if (spkrLan == &amp;quot;xx&amp;quot;) return;  //Agent Opt-Out&lt;br /&gt;
         &lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;1, 1, 0&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
        //===============================&lt;br /&gt;
        //Formulate Translation Requests&lt;br /&gt;
        //===============================&lt;br /&gt;
        for (w = 0; w &amp;lt; llGetListLength(agentsInTranslation); w += 4)&lt;br /&gt;
        {&lt;br /&gt;
            //Loop through translation group and do appropriate translations as needed&lt;br /&gt;
            recepID = llList2Integer(agentsInTranslation, w + 3);&lt;br /&gt;
            recepLan =  checkLanguage(llList2Key(agentsInTranslation, w + 1)); &lt;br /&gt;
            if ((spkrLan != recepLan) &amp;amp;&amp;amp; (recepLan != &amp;quot;&amp;quot;) &amp;amp;&amp;amp; (recepLan != &amp;quot;xx&amp;quot;))&lt;br /&gt;
            {&lt;br /&gt;
                lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
 &lt;br /&gt;
                &lt;br /&gt;
                if (~llListFindList(translationCache, (list)lanpair)) //lstliPos &amp;lt; 0)&lt;br /&gt;
                {&lt;br /&gt;
                  lstliPos = llListFindList(translationCache, [lanpair]);&lt;br /&gt;
                  translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
                  &lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                  translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        } &lt;br /&gt;
        //Process Requests&lt;br /&gt;
        if (translationCache != [])&lt;br /&gt;
        {&lt;br /&gt;
            for (w = 0; w &amp;lt; llGetListLength(translationCache); w += 2)&lt;br /&gt;
            {&lt;br /&gt;
                //====================================&lt;br /&gt;
                //Translation&lt;br /&gt;
                //====================================&lt;br /&gt;
                //Forumulate and Send Translation Request&lt;br /&gt;
                lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, w), [&amp;quot;|&amp;quot;],[]), 1); &lt;br /&gt;
                checkThrottle(0, llEscapeURL(message) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, w + 1), llList2String(translationCache, w)]);&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
            spkrLan = &amp;quot;&amp;quot;; &lt;br /&gt;
        //====================================&lt;br /&gt;
        //Language Detection&lt;br /&gt;
        //====================================&lt;br /&gt;
        if (llGetAgentSize(id) != ZERO_VECTOR) //llList2Key(llGetObjectDetails(id, [OBJECT_CREATOR]), 0) == NULL_KEY)&lt;br /&gt;
        {&lt;br /&gt;
            if (((spkrLan == &amp;quot;&amp;quot;) || (llList2Integer(agentsInTranslation, llListFindList(agentsInTranslation, [id]) + 2) == TRUE)) || (isMaster == 2))&lt;br /&gt;
            {&lt;br /&gt;
                //Forumulate and Send Language Detect Request&lt;br /&gt;
                checkThrottle(1, llEscapeURL(message), [llGetTime(), id]);&lt;br /&gt;
            }       &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
    {&lt;br /&gt;
        string  htttmpStr; &lt;br /&gt;
        if (status != 200) &lt;br /&gt;
        {&lt;br /&gt;
            //llOwnerSay(&amp;quot;WWW Error:&amp;quot; + (string)status);&lt;br /&gt;
            llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;1, 0, 0&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
            //llOwnerSay(body);&lt;br /&gt;
            return;&lt;br /&gt;
        } &lt;br /&gt;
        //Process Resonse Code&lt;br /&gt;
        htttmpStr = llGetSubString(body, llSubStringIndex(body, &amp;quot;\&amp;quot;responseStatus\&amp;quot;:&amp;quot;), -1);&lt;br /&gt;
        status = (integer)llGetSubString(htttmpStr, 17, llSubStringIndex(htttmpStr, &amp;quot;}&amp;quot;) - 1);&lt;br /&gt;
        if (status != 200)&lt;br /&gt;
        {&lt;br /&gt;
            //llOwnerSay(&amp;quot;Language Server Returned Error Code: &amp;quot; + (string)status);&lt;br /&gt;
            //llOwnerSay(body);&lt;br /&gt;
            llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;1, 0, 0&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0, 0, 1&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
        llMessageLinked(LINK_THIS, 345149624, body, request_id);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(0.0);  // timer reset&lt;br /&gt;
        integer r;&lt;br /&gt;
        string  tmrtmpStr;&lt;br /&gt;
        list    tmrnewli;&lt;br /&gt;
        integer translatorCount = llGetListLength(translators)/2; &lt;br /&gt;
        if (isInitialized == FALSE)&lt;br /&gt;
        {&lt;br /&gt;
            enabled = TRUE;&lt;br /&gt;
            listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); &lt;br /&gt;
            llListen(777, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
            llMessageLinked(LINK_THIS, 6877259, (string)enabled, NULL_KEY);&lt;br /&gt;
            isInitialized = TRUE;&lt;br /&gt;
        } &lt;br /&gt;
        llMessageLinked(LINK_THIS, 94558323, llList2CSV(agentsInTranslation), &amp;quot;&amp;quot;);&lt;br /&gt;
        if (isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            for (r = 0; r &amp;lt; llGetListLength(agentsInTranslation); r += 4)&lt;br /&gt;
            {&lt;br /&gt;
                tmrtmpStr = llList2String(llGetObjectDetails(llList2Key(agentsInTranslation, r), [OBJECT_POS]), 0);&lt;br /&gt;
                if ((llVecDist(llGetPos(), (vector)tmrtmpStr) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tmrtmpStr != &amp;quot;&amp;quot;))&lt;br /&gt;
                {&lt;br /&gt;
                    tmrnewli = (tmrnewli=[]) + tmrnewli + llList2List(agentsInTranslation, r, r + 3);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            agentsInTranslation = tmrnewli;&lt;br /&gt;
            if ((llGetUnixTime() - lastHeartBeat) &amp;gt;= 5)&lt;br /&gt;
            {&lt;br /&gt;
                //Send heartbeat&lt;br /&gt;
                sendHeartbeat();&lt;br /&gt;
                lastHeartBeat = llGetUnixTime();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            if ((llGetUnixTime() - lastHeartBeat) &amp;gt;= `0 + llGetListLength(agentsInTranslation)*2 + llPow(translatorCount, 1.4) + translatorCount + ((1-llGetRegionTimeDilation()) * 5))&lt;br /&gt;
            {&lt;br /&gt;
                //Send heartbeat&lt;br /&gt;
                sendHeartbeat();&lt;br /&gt;
                lastHeartBeat = llGetUnixTime();&lt;br /&gt;
            }&lt;br /&gt;
        } &lt;br /&gt;
        //turn on and off scanner&lt;br /&gt;
        if ((autoLanguage) &amp;amp;&amp;amp; isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            llSensor(&amp;quot;&amp;quot;, NULL_KEY, AGENT, 20.0, PI);&lt;br /&gt;
        }&lt;br /&gt;
        llSetTimerEvent(4.0); // restart timer&lt;br /&gt;
        //llSetTimerEvent(4 + ((1-llGetRegionTimeDilation()) * 5));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=687843</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=687843"/>
		<updated>2009-12-15T22:53:05Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: /* Universal Translator Engine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribucion al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente codigo fué originalmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mi manera...&lt;br /&gt;
No os riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;OK&#039;&#039; ===&lt;br /&gt;
Bueno, despues de respiñar todo lo que he podido, creo que el uso de memoria y la velocidad estan practicamente igual que en la version original pero bueno... en la variedad está el gusto no?&lt;br /&gt;
Ya he probado un poco el codigo, y parece que funciona aunque estoy teniendo algunos problemas... Por ejemplo creo que el sistema de traduccion no funciona correctamente, y no me refiero al sistema de traduccion de Google (en mi opinion, si no es el mejor, es uno de los mejores del mundo), sino a que aun queda mucho trabajo por hacer en el script...&lt;br /&gt;
&lt;br /&gt;
El siguiente paso sera intentar dividir el script en dos, o si es posible en tres para repartir el uso de memoria. Tambien me gustaria probar un truco que uso a menudo para traducir paginas en un idioma que no entiendo, lo que hago es que en vez de traducir directamente al español, primero lo traduzco a inglés, y luego desde inglés al español, parece una tonteria y un gasto innecesario, pero si lo hago es porque así suelo entender mejor las traducciones.&lt;br /&gt;
Quiero por un lado el sistema de comunicacion y evaluacion entre traductores, y por otro el sistema de traduccion entre avatares, ¿es muy dificil? no se ya lo veremos...&lt;br /&gt;
&lt;br /&gt;
Well, after saving as much as I could, I think the memory usage and the speed are technically the same as in the original script, but well, in the variety is the taste, isnt it?. &lt;br /&gt;
I have tested a bit the code above already, and it seems to work altought i´m having some problems...&lt;br /&gt;
For instance i think the translation system is not working properly, and i dont mean the Google´s translation system (in my opinion, if is not the best, one of the bests), but that there is still much work to do in the script...&lt;br /&gt;
&lt;br /&gt;
The next step will be to try to divide the script in 2, or 3 if is possible, so we can spread the memory usage. Also I would like to test a trick i use often for to translate languages that i dont understand, what I do first is to translate that language into English, and then from English to Spanish, it seems a nonsense and unnecesary waste, but if i do it is becouse so i usually understand the translations better.&lt;br /&gt;
I want by one part the translators communications and evaluation system, and by other the translation system between avatars, is it very difficult? I don´t know , we will see...&lt;br /&gt;
&lt;br /&gt;
== welcome ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//November 12, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Web Server Services powered by Google &lt;br /&gt;
//Variables&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
list agentsInTranslationOptions;&lt;br /&gt;
list requestList;&lt;br /&gt;
integer listenID; &lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
integer showTranslation = FALSE;&lt;br /&gt;
integer tranObjects = TRUE; &lt;br /&gt;
integer lastHeartBeat;&lt;br /&gt;
list    languageCodes = [&lt;br /&gt;
&amp;quot;zh-CN&amp;quot;, &amp;quot;zh-TW&amp;quot;, &amp;quot;hr&amp;quot;,  &lt;br /&gt;
&amp;quot;bg&amp;quot;, &amp;quot;be&amp;quot;, &amp;quot;ca&amp;quot;,&lt;br /&gt;
&amp;quot;af&amp;quot;, &amp;quot;sq&amp;quot;, &amp;quot;ar&amp;quot;,   &lt;br /&gt;
&amp;quot;tl&amp;quot;, &amp;quot;fr&amp;quot;, &amp;quot;gl&amp;quot;,    &lt;br /&gt;
&amp;quot;fi&amp;quot;, &amp;quot;en&amp;quot;, &amp;quot;et&amp;quot;,     &lt;br /&gt;
&amp;quot;cs&amp;quot;, &amp;quot;da&amp;quot;, &amp;quot;nl&amp;quot;,  &lt;br /&gt;
&amp;quot;id&amp;quot;, &amp;quot;ga&amp;quot;, &amp;quot;it&amp;quot;,      &lt;br /&gt;
&amp;quot;hi&amp;quot;, &amp;quot;hu&amp;quot;, &amp;quot;is&amp;quot;, &lt;br /&gt;
&amp;quot;de&amp;quot;, &amp;quot;el&amp;quot;, &amp;quot;iw&amp;quot;,    &lt;br /&gt;
&amp;quot;mt&amp;quot;, &amp;quot;no&amp;quot;, &amp;quot;fa&amp;quot;,   &lt;br /&gt;
&amp;quot;lt&amp;quot;, &amp;quot;mk&amp;quot;, &amp;quot;ms&amp;quot;,   &lt;br /&gt;
&amp;quot;ja&amp;quot;, &amp;quot;ko&amp;quot;, &amp;quot;lv&amp;quot;,   &lt;br /&gt;
&amp;quot;sl&amp;quot;, &amp;quot;es&amp;quot;, &amp;quot;sw&amp;quot;, &lt;br /&gt;
&amp;quot;ru&amp;quot;, &amp;quot;sr&amp;quot;, &amp;quot;sk&amp;quot;, &lt;br /&gt;
&amp;quot;pl&amp;quot;, &amp;quot;pt-PT&amp;quot;, &amp;quot;ro&amp;quot;,&lt;br /&gt;
&amp;quot;yi&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;uk&amp;quot;, &amp;quot;vi&amp;quot;, &amp;quot;cy&amp;quot;,&lt;br /&gt;
&amp;quot;sv&amp;quot;,&amp;quot;th&amp;quot;, &amp;quot;tr&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
list    translators;&lt;br /&gt;
list    sayCache;&lt;br /&gt;
list    sayCachePrivate;&lt;br /&gt;
integer priorityNumber;&lt;br /&gt;
integer priorityNumListenID;&lt;br /&gt;
integer isInitialized = FALSE;&lt;br /&gt;
string  options; &lt;br /&gt;
//Options&lt;br /&gt;
//integer debug = TRUE;&lt;br /&gt;
integer broadcastChannel = -9999999; //note this is not the channel used by the HR Universal Translator&lt;br /&gt;
string  password = &amp;quot;password&amp;quot;; //note this is not the password used to encrypt comms of the HR Universal Translator&lt;br /&gt;
integer version = 190;&lt;br /&gt;
//&lt;br /&gt;
sendIM(key imid, string imstr)&lt;br /&gt;
{&lt;br /&gt;
    if (llGetParcelFlags(llGetPos()) &amp;amp; PARCEL_FLAG_ALLOW_SCRIPTS)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 85234119, imstr, imid); &lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_THIS, 85304563, imstr, imid);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//txTxtLot() = sendTextBatch()&lt;br /&gt;
txTxtLot(integer txch, string txtxt) &lt;br /&gt;
{&lt;br /&gt;
    txtxt = llXorBase64StringsCorrect(llStringToBase64(txtxt), llStringToBase64(password));&lt;br /&gt;
    while (llStringLength(txtxt) &amp;gt; 508) //If string is 509 characters or longer &lt;br /&gt;
    {&lt;br /&gt;
        llSay(txch, llGetSubString(txtxt, 0, 507)); //send 508 character chunk&lt;br /&gt;
        txtxt = llGetSubString(txtxt, 508, -1);  //delete 508 character chunk&lt;br /&gt;
    }&lt;br /&gt;
    llSay(txch, txtxt);  //send out any remainder chunk or original chunk&lt;br /&gt;
    //Perry Mizin Comment: I don´t understand the aim of the following if.    &lt;br /&gt;
    //Hank Ramos Comment: this line serves to &amp;quot;trigger&amp;quot; the receiver not to wait for another batch.  If the&lt;br /&gt;
    //message length is exactly 508 characters, the receiver things that another chunk of the message is coming.&lt;br /&gt;
    //This message serves to tell the receiver that the last chunk was the last chunk, not another regular chunk.&lt;br /&gt;
    if (llStringLength(txtxt) == 508)&lt;br /&gt;
        llSay(txch, (string)(txch*4958654));&lt;br /&gt;
    //Hank Ramos Comment: this just flashes the color of the bottom prim to show a message was sent&lt;br /&gt;
    llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0, 0.25&amp;gt;, &amp;quot;&amp;quot;); &lt;br /&gt;
}  &lt;br /&gt;
//string rxTxtLot() = string receiveTextBatch()&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer rxliPos;&lt;br /&gt;
    string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
    {&lt;br /&gt;
        rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
        rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
        sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
    rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
    return rxmsg;&lt;br /&gt;
}&lt;br /&gt;
//string rxTxtLot() = string receiveTextBatch() (Another way)&lt;br /&gt;
integer rxTxtLotBusy = FALSE; //Perry Mizin: added Busy Mode, this could fail or prevent fail&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    if (rxTxtLotBusy == FALSE)&lt;br /&gt;
    {&lt;br /&gt;
        rxTxtLotBusy = TRUE;&lt;br /&gt;
        integer rxliPos;&lt;br /&gt;
        string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
        if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
        {&lt;br /&gt;
            @rxin;&lt;br /&gt;
            rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
            rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
            sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
            if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
            {&lt;br /&gt;
                 jump rxin;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
        rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
        rxTxtLotBusy = FALSE;&lt;br /&gt;
        return rxmsg;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        //Perry Mizin: llSaySomething?&lt;br /&gt;
        return &amp;quot;&amp;quot;;        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string rxTxtLotPrv() = string receiveTextBatchPrivate()&lt;br /&gt;
string rxTxtLotPrv(key prxid, string prxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer prxliPos;&lt;br /&gt;
    string  prxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCachePrivate, (list)prxid))&lt;br /&gt;
    {&lt;br /&gt;
        prxliPos = llListFindList(sayCachePrivate, [prxid]);&lt;br /&gt;
        prxtmpStr = (prxtmpStr=&amp;quot;&amp;quot;) + prxtmpStr + llList2String(sayCachePrivate, prxliPos + 1);&lt;br /&gt;
        sayCachePrivate = llDeleteSubList(sayCachePrivate, prxliPos, prxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    prxmsg = prxtmpStr + prxmsg;&lt;br /&gt;
    prxmsg = llBase64ToString(llXorBase64StringsCorrect(prxmsg, llStringToBase64(password)));&lt;br /&gt;
    return prxmsg;&lt;br /&gt;
}&lt;br /&gt;
//updateTranslatorList()&lt;br /&gt;
updateTranslatorList()&lt;br /&gt;
{&lt;br /&gt;
    integer nx;&lt;br /&gt;
    integer xliLng;&lt;br /&gt;
    list    newList;&lt;br /&gt;
    string  tmpStrPos;&lt;br /&gt;
    integer newMaster;&lt;br /&gt;
    //Scan and remove translators not in the area&lt;br /&gt;
    xliLng = llGetListLength(translators);&lt;br /&gt;
    for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
    {&lt;br /&gt;
        tmpStrPos = llList2String(llGetObjectDetails(llList2Key(translators, nx + 1), [OBJECT_POS]), 0);&lt;br /&gt;
        if ((llVecDist(llGetPos(), (vector)tmpStrPos) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tmpStrPos != &amp;quot;&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            newList = (newList=[]) + newList +  llList2List(translators, nx, nx + 1);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    translators = newList;&lt;br /&gt;
    //llMessageLinked(LINK_THIS,65635544,(string)xliLng,&amp;quot;&amp;quot;); Perry Mizin: what is this necesary for?&lt;br /&gt;
    if (translators == [])&lt;br /&gt;
    {&lt;br /&gt;
        newMaster = 1;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        if (enabled)&lt;br /&gt;
        {&lt;br /&gt;
            xliLng = llGetListLength(translators);&lt;br /&gt;
            newMaster = 2;&lt;br /&gt;
            for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
            {&lt;br /&gt;
                //llOwnerSay(&amp;quot;Checking Priority Number(&amp;quot; +  (string)priorityNumber + &amp;quot;): &amp;quot; + (string)llList2Integer(translators, x));&lt;br /&gt;
                if (llList2Integer(translators, nx) &amp;gt; priorityNumber)&lt;br /&gt;
                {&lt;br /&gt;
                    newMaster = 0;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            newMaster = 0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster &amp;gt; 0) &amp;amp;&amp;amp; (newMaster == 0))&lt;br /&gt;
    {&lt;br /&gt;
        //We are being demoted from master to slave&lt;br /&gt;
        //Flush agentsInTranslation to master&lt;br /&gt;
        if (agentsInTranslation != [])&lt;br /&gt;
        {&lt;br /&gt;
            //Demotion Dump of agentsInTranslation to Master&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1003, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
            if (isInitialized == FALSE)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1004, options])); //error&lt;br /&gt;
        }&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster == 0) &amp;amp;&amp;amp; (newMaster &amp;gt; 0))&lt;br /&gt;
    {&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
        listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); &lt;br /&gt;
    }&lt;br /&gt;
    isMaster = newMaster;&lt;br /&gt;
    llMessageLinked(LINK_THIS, 34829304, (string)isMaster, &amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
//sendHeartbeat()&lt;br /&gt;
sendHeartbeat()&lt;br /&gt;
{&lt;br /&gt;
    updateTranslatorList();&lt;br /&gt;
    txTxtLot(broadcastChannel, llList2CSV([1001, priorityNumber]));&lt;br /&gt;
    //Broadcast agentList to Slaves&lt;br /&gt;
    if (isMaster == 2)&lt;br /&gt;
    {&lt;br /&gt;
        txTxtLot(broadcastChannel, llList2CSV([1002, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//checkThrottle()&lt;br /&gt;
checkThrottle(integer chkn, string chkmsg, list chkli)&lt;br /&gt;
{&lt;br /&gt;
    integer y;&lt;br /&gt;
    integer maxCount;&lt;br /&gt;
    float   chkoldTime;&lt;br /&gt;
    float   sleepTime;&lt;br /&gt;
    list    chknewli;&lt;br /&gt;
    key     returnValue;&lt;br /&gt;
    integer channelToSpeak; &lt;br /&gt;
    //loop though list and remove items older than 25 seconds&lt;br /&gt;
    for (y = 0; y &amp;lt; llGetListLength(requestList); y += 1)&lt;br /&gt;
    {&lt;br /&gt;
        chkoldTime = llList2Float(requestList, y);&lt;br /&gt;
        //Construct new list with only times less than 25 seconds&lt;br /&gt;
        if ((llGetTime() - chkoldTime) &amp;lt;= 25.0)&lt;br /&gt;
        { &lt;br /&gt;
            chknewli = (chknewli=[]) + chknewli + [chkoldTime];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    requestList = chknewli; &lt;br /&gt;
    y = llGetListLength(requestList);&lt;br /&gt;
    //Shunt all translations to linked translators if master&lt;br /&gt;
    if (isMaster == 2)&lt;br /&gt;
    {&lt;br /&gt;
        if (chkn == 0)&lt;br /&gt;
        {&lt;br /&gt;
            //Send HTTP request to other translator&lt;br /&gt;
            //Send out Request to Random Translator Channel&lt;br /&gt;
            channelToSpeak = llList2Integer(llListRandomize(llList2ListStrided(translators, 0, -1, 2), 1), 0);&lt;br /&gt;
            if (channelToSpeak &amp;gt; 0) &lt;br /&gt;
            {&lt;br /&gt;
                txTxtLot(channelToSpeak, llList2CSV([chkn, llList2CSV(chkli)]) + &amp;quot;~&amp;quot; + chkmsg);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if (y == 19)&lt;br /&gt;
    {&lt;br /&gt;
        sleepTime =  25.0 - (llGetTime() - llList2Float(requestList, 0));&lt;br /&gt;
        if (sleepTime &amp;gt; 0) &lt;br /&gt;
        {&lt;br /&gt;
            llSleep(sleepTime);&lt;br /&gt;
        }&lt;br /&gt;
        requestList = llDeleteSubList(requestList, 0, 0);&lt;br /&gt;
    }&lt;br /&gt;
    if (chkn == 0)&lt;br /&gt;
    {&lt;br /&gt;
        chkmsg = &amp;quot;translate?v=1.0&amp;amp;q=&amp;quot; + chkmsg;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        chkmsg = &amp;quot;detect?v=1.0&amp;amp;q=&amp;quot; + chkmsg;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    requestList = (requestList=[]) + requestList + (list)llGetTime();&lt;br /&gt;
    returnValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/&amp;quot; + chkmsg, [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot; &amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
    if (returnValue != NULL_KEY)&lt;br /&gt;
    {&lt;br /&gt;
        if (chkn == 0)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS, 235365342, llList2CSV(chkli), returnValue); &lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS, 235365343, llList2CSV(chkli), returnValue); &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llSleep(40.0); //Something has gone horribly wrong, sleep 40 seconds to clear throttle&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string checkLanguage()&lt;br /&gt;
string checkLanguage(string chklantmpStr)&lt;br /&gt;
{&lt;br /&gt;
    if (llGetSubString(chklantmpStr, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else if (chklantmpStr == &amp;quot;und&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;el&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if (~llListFindList(languageCodes, [chklantmpStr]))&lt;br /&gt;
    {&lt;br /&gt;
 &lt;br /&gt;
    } else {&lt;br /&gt;
        chklantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    chklantmpStr = llGetSubString(chklantmpStr, 0, 1);&lt;br /&gt;
    return chklantmpStr;&lt;br /&gt;
}&lt;br /&gt;
//addAgent()&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
    integer avliPos;&lt;br /&gt;
    integer idNum;&lt;br /&gt;
    if (llListFindList(agentsInTranslation, (list)avid) != 911)&lt;br /&gt;
    {&lt;br /&gt;
        avliPos = llListFindList(agentsInTranslation, [avid]);&lt;br /&gt;
        agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, chklan], avliPos + 1, avliPos + 2);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        @yes;&lt;br /&gt;
        idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
        if(llListFindList(agentsInTranslation, (list)idNum) != 911)&lt;br /&gt;
        {//it exists       &lt;br /&gt;
            jump at;&lt;br /&gt;
        }&lt;br /&gt;
        agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, chklan, idNum];&lt;br /&gt;
        llMessageLinked(LINK_THIS, 64562349, avlan, avid);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string addNewAgent()&lt;br /&gt;
string addNewAgent(key newavid)&lt;br /&gt;
{&lt;br /&gt;
    string speakerLan;&lt;br /&gt;
 &lt;br /&gt;
    if (llGetAgentSize(newavid) != ZERO_VECTOR)&lt;br /&gt;
    {&lt;br /&gt;
        speakerLan  = checkLanguage(llGetAgentLanguage(newavid));&lt;br /&gt;
        if (speakerLan == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
            addAgent(newavid, speakerLan, TRUE);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            addAgent(newavid, speakerLan, FALSE);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return speakerLan;&lt;br /&gt;
}&lt;br /&gt;
//key getAgentKey()&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
    if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
    {&lt;br /&gt;
        integer gkliPos = llListFindList(agentsInTranslation, [agentID]);&lt;br /&gt;
        return llList2Key(agentsInTranslation, gkliPos - 3);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//processHTTPResponse()&lt;br /&gt;
processHTTPResponse(integer ntype, string bodyStr, list paramsli)&lt;br /&gt;
{&lt;br /&gt;
    integer spkliPos;&lt;br /&gt;
    list    recepientList;&lt;br /&gt;
    key     recepientID;&lt;br /&gt;
    string  recepientLanguage;&lt;br /&gt;
    string  languagePair;&lt;br /&gt;
    key     speakerID;&lt;br /&gt;
    string  speakerName;&lt;br /&gt;
    string  speakerLanguage;&lt;br /&gt;
    string  translatedText;&lt;br /&gt;
    string  lantmpStr;&lt;br /&gt;
    integer z;&lt;br /&gt;
    integer speakerLanguageReliable;&lt;br /&gt;
    float   speakerLanguageConfidence;&lt;br /&gt;
    list    paramtmpli;&lt;br /&gt;
    //===================&lt;br /&gt;
    //Process Translation&lt;br /&gt;
    //===================&lt;br /&gt;
    if (ntype == 0)&lt;br /&gt;
    {&lt;br /&gt;
        speakerID  = llList2Key(paramsli, 1);&lt;br /&gt;
        speakerName = llKey2Name(speakerID);&lt;br /&gt;
        if (speakerName == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
        }&lt;br /&gt;
        recepientList = llParseString2List(llList2String(paramsli, 2), [&amp;quot;@&amp;quot;], []);&lt;br /&gt;
        paramtmpli = llParseStringKeepNulls(llList2String(paramsli, 3), [&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
        recepientLanguage = llList2String(paramtmpli, 1);&lt;br /&gt;
        languagePair = llDumpList2String(paramtmpli, &amp;quot;&amp;gt;&amp;gt;&amp;quot;); &lt;br /&gt;
        //Perform Text Cleanup&lt;br /&gt;
        z = llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;detectedSourceLanguage\&amp;quot;:\&amp;quot;&amp;quot;); &lt;br /&gt;
        if (z != -1)&lt;br /&gt;
        {&lt;br /&gt;
            translatedText  = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, z);&lt;br /&gt;
            speakerLanguage = checkLanguage(llGetSubString(bodyStr, z + 28, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;}, \&amp;quot;responseDetails\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
            spkliPos = llListFindList(agentsInTranslation, [speakerID]);&lt;br /&gt;
            if (spkliPos &amp;gt;= 0)&lt;br /&gt;
            {&lt;br /&gt;
                if (speakerLanguage != llList2String(agentsInTranslation, spkliPos + 1))&lt;br /&gt;
                {&lt;br /&gt;
                    agentsInTranslation = llListReplaceList(agentsInTranslation, [TRUE], spkliPos + 2, spkliPos + 2);  //Mark for recheck of actual spoken language.&lt;br /&gt;
                }&lt;br /&gt;
            }                   &lt;br /&gt;
        }&lt;br /&gt;
        else if (z == -1)&lt;br /&gt;
        {&lt;br /&gt;
            translatedText = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;}, \&amp;quot;responseDetails\&amp;quot;&amp;quot;));&lt;br /&gt;
        }&lt;br /&gt;
        //Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
        if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            lantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
            //Perry Mizin Comment: Probably I guess this is wrong, maybe I am wrong&lt;br /&gt;
            //Perry Mizin Comment: alternative reverse order: &amp;quot;Hello World&amp;quot; could be &amp;quot;World Hello&amp;quot;&lt;br /&gt;
            //Perry Mizin Comment: reverse order: &amp;quot;Hello World&amp;quot; is &amp;quot;dlroW olleH&amp;quot; or ,,pl^ºM ºllªH,,&lt;br /&gt;
            for(z = llStringLength(translatedText);z &amp;gt;= 0; z--)&lt;br /&gt;
            {&lt;br /&gt;
                lantmpStr = (lantmpStr=&amp;quot;&amp;quot;) + lantmpStr + llGetSubString(translatedText, z, z); &lt;br /&gt;
            }&lt;br /&gt;
            translatedText = lantmpStr;&lt;br /&gt;
        }   &lt;br /&gt;
        lantmpStr = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
        if (showTranslation)&lt;br /&gt;
        {&lt;br /&gt;
            sendIM(speakerID, lantmpStr);&lt;br /&gt;
        } &lt;br /&gt;
        for (z = 0; z &amp;lt; llGetListLength(recepientList); z += 1)&lt;br /&gt;
        {&lt;br /&gt;
            recepientID = getAgentKey(llList2Integer(recepientList, z));&lt;br /&gt;
            if (recepientID != &amp;quot;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, [recepientID]) + 1);&lt;br /&gt;
                if (recepientLanguage != speakerLanguage)&lt;br /&gt;
                {&lt;br /&gt;
                    sendIM(recepientID, lantmpStr);&lt;br /&gt;
                }&lt;br /&gt;
            }  &lt;br /&gt;
        }&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    //===========================&lt;br /&gt;
    //Process Language Detection&lt;br /&gt;
    //===========================&lt;br /&gt;
    if (ntype == 1)&lt;br /&gt;
    {&lt;br /&gt;
        speakerID = llList2Key(paramsli, 1);&lt;br /&gt;
        speakerLanguageReliable = llToLower(llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) + 15, llSubStringIndex(bodyStr, &amp;quot;,\&amp;quot;confidence\&amp;quot;:&amp;quot;) - 1)) == &amp;quot;true&amp;quot;;&lt;br /&gt;
        speakerLanguageConfidence = (float)llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;,\&amp;quot;confidence\&amp;quot;:&amp;quot;) + 14, llSubStringIndex(bodyStr, &amp;quot;}, \&amp;quot;responseDetails\&amp;quot;:&amp;quot;) - 1);&lt;br /&gt;
 &lt;br /&gt;
        spkliPos = llListFindList(agentsInTranslation, [speakerID]);&lt;br /&gt;
        if (((spkliPos &amp;lt; 0) &amp;amp;&amp;amp; (speakerLanguageReliable) || (speakerLanguageConfidence &amp;gt;= 0.08)))&lt;br /&gt;
        {&lt;br /&gt;
            //Analyze Data&lt;br /&gt;
            lantmpStr = checkLanguage(llToLower(llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1)));&lt;br /&gt;
            if (lantmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            } &lt;br /&gt;
            if (speakerLanguageConfidence &amp;lt; 0.14)&lt;br /&gt;
            {&lt;br /&gt;
                addAgent(speakerID, lantmpStr, TRUE);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                addAgent(speakerID, lantmpStr, FALSE);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        //Multiplexor Initialization&lt;br /&gt;
        priorityNumber = version*1000000 + llRound(llFrand(499999) + 50000);&lt;br /&gt;
        llListen(broadcastChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        priorityNumListenID = llListen(priorityNumber, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
        //Send out initial heartbeat&lt;br /&gt;
        lastHeartBeat = llGetUnixTime();&lt;br /&gt;
        txTxtLot(broadcastChannel, llList2CSV([1001, priorityNumber]));&lt;br /&gt;
 &lt;br /&gt;
        //Wait for the network to settle down&lt;br /&gt;
        llSetTimerEvent(5.0); &lt;br /&gt;
        //llSetTimerEvent(10 + ((1-llGetRegionTimeDilation()) * 1));       &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
    {&lt;br /&gt;
        list    ltmpli;&lt;br /&gt;
&lt;br /&gt;
        //Old Multiplexor&lt;br /&gt;
        if (num == 8434532)&lt;br /&gt;
        {&lt;br /&gt;
            enabled = (integer)lstr;&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 3342976)&lt;br /&gt;
        {&lt;br /&gt;
            //Send Preferences&lt;br /&gt;
            options = lstr;&lt;br /&gt;
            if (isInitialized == FALSE) return;&lt;br /&gt;
            ltmpli = llCSV2List(options);&lt;br /&gt;
            showTranslation = llList2Integer(ltmpli, 0);&lt;br /&gt;
            tranObjects = llList2Integer(ltmpli, 1);&lt;br /&gt;
            autoLanguage = llList2Integer(ltmpli, 2);&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1004, options]));&lt;br /&gt;
 &lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 9384610)&lt;br /&gt;
        {&lt;br /&gt;
            if (isMaster == 0) //markering&lt;br /&gt;
                //llMessageLinked(LINK_THIS, 5598321, llList2CSV([id, str, FALSE]), &amp;quot;&amp;quot;);&lt;br /&gt;
                txTxtLot(broadcastChannel, llList2CSV([1003, lid, lstr, FALSE]));&lt;br /&gt;
            else&lt;br /&gt;
                addAgent(lid, lstr, TRUE);&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 345149625)&lt;br /&gt;
        {&lt;br /&gt;
            //Return Translation&lt;br /&gt;
            processHTTPResponse(0, lstr, llCSV2List(lid));&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 345149626)&lt;br /&gt;
        {&lt;br /&gt;
            //Return Detection&lt;br /&gt;
            processHTTPResponse(1, lstr, llCSV2List(lid));&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    sensor(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        integer s;&lt;br /&gt;
        key     sid;&lt;br /&gt;
 &lt;br /&gt;
        for (s = 0; s &amp;lt; num_detected; s += 1)&lt;br /&gt;
        {&lt;br /&gt;
            sid = llDetectedKey(s);&lt;br /&gt;
            if (~llListFindList(agentsInTranslation, (list)sid))&lt;br /&gt;
            {                &lt;br /&gt;
            }else{&lt;br /&gt;
                addNewAgent(sid);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        integer w;&lt;br /&gt;
        string  spkrLan;&lt;br /&gt;
        string  recepLan;&lt;br /&gt;
        integer recepID;&lt;br /&gt;
        integer lstliPos;&lt;br /&gt;
        string  lanpair;&lt;br /&gt;
        list    translationCache;&lt;br /&gt;
        list    lsttmpli;&lt;br /&gt;
        integer ImessageType;&lt;br /&gt;
        string  Imessage;&lt;br /&gt;
        string  lsttmpStr;&lt;br /&gt;
        string  lst2tmpStr;&lt;br /&gt;
 &lt;br /&gt;
        //Multiplexor Code&lt;br /&gt;
        if ((channel == broadcastChannel) || (channel == priorityNumber))&lt;br /&gt;
        {&lt;br /&gt;
            //==========================&lt;br /&gt;
            //Process Proxy HTTP Request&lt;br /&gt;
            //==========================&lt;br /&gt;
 &lt;br /&gt;
            if (channel == priorityNumber)&lt;br /&gt;
            {&lt;br /&gt;
                if (llStringLength(message) &amp;gt;= 508)&lt;br /&gt;
                {&lt;br /&gt;
                    if (((integer)message/channel) != 4958654)&lt;br /&gt;
                    {&lt;br /&gt;
                        sayCachePrivate = (sayCachePrivate=[]) + sayCachePrivate + [id, message];&lt;br /&gt;
                        return; &lt;br /&gt;
                    }&lt;br /&gt;
                    message = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                message = rxTxtLotPrv(id, message);&lt;br /&gt;
                //Received packet to translate&lt;br /&gt;
                llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0.05, 0.25&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
                lsttmpli = llParseString2List(message, [&amp;quot;~&amp;quot;], []);&lt;br /&gt;
                lsttmpStr = llList2String(lsttmpli, 0);&lt;br /&gt;
                lsttmpli = llDeleteSubList(lsttmpli, 0, 0);&lt;br /&gt;
 &lt;br /&gt;
                lst2tmpStr = llDumpList2String(lsttmpli, &amp;quot;|&amp;quot;);&lt;br /&gt;
                lsttmpli = llCSV2List(lsttmpStr);&lt;br /&gt;
                lstliPos = llList2Integer(lsttmpli, 0);&lt;br /&gt;
                lsttmpli = llDeleteSubList(lsttmpli, 0, 0);&lt;br /&gt;
 &lt;br /&gt;
                checkThrottle(lstliPos, lst2tmpStr, lsttmpli);&lt;br /&gt;
 &lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
            //=======================&lt;br /&gt;
            //Process Global Messages&lt;br /&gt;
            //=======================&lt;br /&gt;
            if (llStringLength(message) &amp;gt;= 508)&lt;br /&gt;
            {&lt;br /&gt;
                if (((integer)message/channel) != 4958654)&lt;br /&gt;
                {&lt;br /&gt;
                    sayCache = (sayCache=[]) + sayCache + [id, message];&lt;br /&gt;
                    return; &lt;br /&gt;
                }&lt;br /&gt;
                message = &amp;quot;&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            message = rxTxtLot(id, message);&lt;br /&gt;
 &lt;br /&gt;
            lsttmpli = llCSV2List(message);&lt;br /&gt;
 &lt;br /&gt;
            if (llGetListLength(lsttmpli) &amp;gt;= 2)    &lt;br /&gt;
            {&lt;br /&gt;
                ImessageType = llList2Integer(lsttmpli, 0);&lt;br /&gt;
                lsttmpli = llDeleteSubList(lsttmpli, 0, 0);&lt;br /&gt;
                Imessage = llList2CSV(lsttmpli);        &lt;br /&gt;
 &lt;br /&gt;
                llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0, 0.25&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
                //Process Message Here&lt;br /&gt;
                if (ImessageType == 1001)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming Heartbeat&lt;br /&gt;
                    if ((integer)Imessage == priorityNumber)&lt;br /&gt;
                    {&lt;br /&gt;
                        llOwnerSay(&amp;quot;Priority Number Conflict!  Resetting Script...&amp;quot;);&lt;br /&gt;
                        llResetScript(); //Reset if conflicting priority number&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    if (~llListFindList(translators, (list)id)  //lstliPos &amp;lt; 0) &lt;br /&gt;
                    {&lt;br /&gt;
                        lstliPos = llListFindList(translators, [id]);&lt;br /&gt;
                        translators = llListReplaceList(translators, [(integer)Imessage], lstliPos - 1, lstliPos - 1);                        &lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                       translators = (translators=[]) + translators + [(integer)Imessage, id];&lt;br /&gt;
                        if ((isMaster &amp;gt; 0) &amp;amp;&amp;amp; (isInitialized))&lt;br /&gt;
                        {&lt;br /&gt;
                            txTxtLot((integer)Imessage, llList2CSV([1002, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
                            txTxtLot((integer)Imessage, llList2CSV([1004, options]));&lt;br /&gt;
                        } &lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if (ImessageType == 1002)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming agentsInTranslation Master Broadcast&lt;br /&gt;
                    if (isMaster == 0)&lt;br /&gt;
                    {&lt;br /&gt;
                        //llMessageLinked(LINK_THIS, 9458021, Imessage, &amp;quot;&amp;quot;);  &lt;br /&gt;
                        lsttmpli = llCSV2List(Imessage);&lt;br /&gt;
                        agentsInTranslation = [];&lt;br /&gt;
                        for (w = 0; w &amp;lt; llGetListLength(lsttmpli); w += 4)&lt;br /&gt;
                        {&lt;br /&gt;
                            agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [llList2Key(lsttmpli, w), llList2String(lsttmpli, w + 1), llList2Integer(lsttmpli, w + 2), llList2Integer(lsttmpli, w + 3)];&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if (ImessageType == 1003)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming agentsInTranslation dump from Slave&lt;br /&gt;
                    lsttmpli = llCSV2List(Imessage);&lt;br /&gt;
                    for (w = 0; w &amp;lt; llGetListLength(lsttmpli); w += 4)&lt;br /&gt;
                    {&lt;br /&gt;
                        addAgent(llList2Key(lsttmpli, w), llList2String(lsttmpli, w + 1), llList2Integer(lsttmpli, w + 2));&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if (ImessageType == 1004)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming Preferences&lt;br /&gt;
                    options = Imessage;&lt;br /&gt;
                    lsttmpli = llCSV2List(options);&lt;br /&gt;
                    showTranslation = llList2Integer(lsttmpli, 0);&lt;br /&gt;
                    tranObjects = llList2Integer(lsttmpli, 1);&lt;br /&gt;
                    autoLanguage = llList2Integer(lsttmpli, 2);&lt;br /&gt;
 &lt;br /&gt;
                    llMessageLinked(LINK_THIS, 3342977, Imessage, &amp;quot;&amp;quot;);  &lt;br /&gt;
                }&lt;br /&gt;
            }            &lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        //Translator Engine Code&lt;br /&gt;
        if ((llToLower(message) == &amp;quot;translator&amp;quot;) &amp;amp;&amp;amp; (isMaster &amp;gt; 0)) &lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS, 2540664, message, id);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ((!enabled) &amp;amp;&amp;amp; (isMaster == 1)) return;&lt;br /&gt;
 &lt;br /&gt;
        if (!tranObjects)&lt;br /&gt;
        {&lt;br /&gt;
            if (llGetAgentSize(id) == ZERO_VECTOR) return;&lt;br /&gt;
        } &lt;br /&gt;
        &lt;br /&gt;
        if (~llListFindList(agentsInTranslation, (list)id)) //lstliPos &amp;gt;= 0)&lt;br /&gt;
        {&lt;br /&gt;
            lstliPos = llListFindList(agentsInTranslation, (list)id);            &lt;br /&gt;
            spkrLan = llList2String(agentsInTranslation, lstliPos + 1);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            spkrLan = addNewAgent(id);&lt;br /&gt;
        } &lt;br /&gt;
        if (spkrLan == &amp;quot;xx&amp;quot;) return;  //Agent Opt-Out&lt;br /&gt;
         &lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;1, 1, 0&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
        //===============================&lt;br /&gt;
        //Formulate Translation Requests&lt;br /&gt;
        //===============================&lt;br /&gt;
        for (w = 0; w &amp;lt; llGetListLength(agentsInTranslation); w += 4)&lt;br /&gt;
        {&lt;br /&gt;
            //Loop through translation group and do appropriate translations as needed&lt;br /&gt;
            recepID = llList2Integer(agentsInTranslation, w + 3);&lt;br /&gt;
            recepLan =  checkLanguage(llList2Key(agentsInTranslation, w + 1)); &lt;br /&gt;
            if ((spkrLan != recepLan) &amp;amp;&amp;amp; (recepLan != &amp;quot;&amp;quot;) &amp;amp;&amp;amp; (recepLan != &amp;quot;xx&amp;quot;))&lt;br /&gt;
            {&lt;br /&gt;
                lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
 &lt;br /&gt;
                &lt;br /&gt;
                if (~llListFindList(translationCache, (list)lanpair)) //lstliPos &amp;lt; 0)&lt;br /&gt;
                {&lt;br /&gt;
                  lstliPos = llListFindList(translationCache, [lanpair]);&lt;br /&gt;
                  translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
                  &lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                  translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        } &lt;br /&gt;
        //Process Requests&lt;br /&gt;
        if (translationCache != [])&lt;br /&gt;
        {&lt;br /&gt;
            for (w = 0; w &amp;lt; llGetListLength(translationCache); w += 2)&lt;br /&gt;
            {&lt;br /&gt;
                //====================================&lt;br /&gt;
                //Translation&lt;br /&gt;
                //====================================&lt;br /&gt;
                //Forumulate and Send Translation Request&lt;br /&gt;
                lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, w), [&amp;quot;|&amp;quot;],[]), 1); &lt;br /&gt;
                checkThrottle(0, llEscapeURL(message) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, w + 1), llList2String(translationCache, w)]);&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
            spkrLan = &amp;quot;&amp;quot;; &lt;br /&gt;
        //====================================&lt;br /&gt;
        //Language Detection&lt;br /&gt;
        //====================================&lt;br /&gt;
        if (llGetAgentSize(id) != ZERO_VECTOR) //llList2Key(llGetObjectDetails(id, [OBJECT_CREATOR]), 0) == NULL_KEY)&lt;br /&gt;
        {&lt;br /&gt;
            if (((spkrLan == &amp;quot;&amp;quot;) || (llList2Integer(agentsInTranslation, llListFindList(agentsInTranslation, [id]) + 2) == TRUE)) || (isMaster == 2))&lt;br /&gt;
            {&lt;br /&gt;
                //Forumulate and Send Language Detect Request&lt;br /&gt;
                checkThrottle(1, llEscapeURL(message), [llGetTime(), id]);&lt;br /&gt;
            }       &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
    {&lt;br /&gt;
        string  htttmpStr; &lt;br /&gt;
        if (status != 200) &lt;br /&gt;
        {&lt;br /&gt;
            //llOwnerSay(&amp;quot;WWW Error:&amp;quot; + (string)status);&lt;br /&gt;
            llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;1, 0, 0&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
            //llOwnerSay(body);&lt;br /&gt;
            return;&lt;br /&gt;
        } &lt;br /&gt;
        //Process Resonse Code&lt;br /&gt;
        htttmpStr = llGetSubString(body, llSubStringIndex(body, &amp;quot;\&amp;quot;responseStatus\&amp;quot;:&amp;quot;), -1);&lt;br /&gt;
        status = (integer)llGetSubString(htttmpStr, 17, llSubStringIndex(htttmpStr, &amp;quot;}&amp;quot;) - 1);&lt;br /&gt;
        if (status != 200)&lt;br /&gt;
        {&lt;br /&gt;
            //llOwnerSay(&amp;quot;Language Server Returned Error Code: &amp;quot; + (string)status);&lt;br /&gt;
            //llOwnerSay(body);&lt;br /&gt;
            llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;1, 0, 0&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0, 0, 1&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
        llMessageLinked(LINK_THIS, 345149624, body, request_id);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(0.0);  // timer reset&lt;br /&gt;
        integer r;&lt;br /&gt;
        string  tmrtmpStr;&lt;br /&gt;
        list    tmrnewli;&lt;br /&gt;
        integer translatorCount = llGetListLength(translators)/2; &lt;br /&gt;
        if (isInitialized == FALSE)&lt;br /&gt;
        {&lt;br /&gt;
            enabled = TRUE;&lt;br /&gt;
            listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); &lt;br /&gt;
            llListen(777, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
            llMessageLinked(LINK_THIS, 6877259, (string)enabled, NULL_KEY);&lt;br /&gt;
            isInitialized = TRUE;&lt;br /&gt;
        } &lt;br /&gt;
        llMessageLinked(LINK_THIS, 94558323, llList2CSV(agentsInTranslation), &amp;quot;&amp;quot;);&lt;br /&gt;
        if (isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            for (r = 0; r &amp;lt; llGetListLength(agentsInTranslation); r += 4)&lt;br /&gt;
            {&lt;br /&gt;
                tmrtmpStr = llList2String(llGetObjectDetails(llList2Key(agentsInTranslation, r), [OBJECT_POS]), 0);&lt;br /&gt;
                if ((llVecDist(llGetPos(), (vector)tmrtmpStr) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tmrtmpStr != &amp;quot;&amp;quot;))&lt;br /&gt;
                {&lt;br /&gt;
                    tmrnewli = (tmrnewli=[]) + tmrnewli + llList2List(agentsInTranslation, r, r + 3);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            agentsInTranslation = tmrnewli;&lt;br /&gt;
            if ((llGetUnixTime() - lastHeartBeat) &amp;gt;= 5)&lt;br /&gt;
            {&lt;br /&gt;
                //Send heartbeat&lt;br /&gt;
                sendHeartbeat();&lt;br /&gt;
                lastHeartBeat = llGetUnixTime();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            if ((llGetUnixTime() - lastHeartBeat) &amp;gt;= `0 + llGetListLength(agentsInTranslation)*2 + llPow(translatorCount, 1.4) + translatorCount + ((1-llGetRegionTimeDilation()) * 5))&lt;br /&gt;
            {&lt;br /&gt;
                //Send heartbeat&lt;br /&gt;
                sendHeartbeat();&lt;br /&gt;
                lastHeartBeat = llGetUnixTime();&lt;br /&gt;
            }&lt;br /&gt;
        } &lt;br /&gt;
        //turn on and off scanner&lt;br /&gt;
        if ((autoLanguage) &amp;amp;&amp;amp; isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            llSensor(&amp;quot;&amp;quot;, NULL_KEY, AGENT, 20.0, PI);&lt;br /&gt;
        }&lt;br /&gt;
        llSetTimerEvent(4.0); // restart timer&lt;br /&gt;
        //llSetTimerEvent(4 + ((1-llGetRegionTimeDilation()) * 5));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=687833</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=687833"/>
		<updated>2009-12-15T22:50:04Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: /* welcome */ new section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribucion al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente codigo fué originalmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mi manera...&lt;br /&gt;
No os riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;Universal Translator Engine&#039;&#039; ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bueno, despues de respiñar todo lo que he podido, creo que el uso de memoria y la velocidad estan practicamente igual que en la version original pero bueno... en la variedad está el gusto no?&lt;br /&gt;
Ya he probado un poco el codigo, y parece que funciona aunque estoy teniendo algunos problemas... Por ejemplo creo que el sistema de traduccion no funciona correctamente, y no me refiero al sistema de traduccion de Google (en mi opinion, si no es el mejor, es uno de los mejores del mundo), sino a que aun queda mucho trabajo por hacer en el script...&lt;br /&gt;
&lt;br /&gt;
El siguiente paso sera intentar dividir el script en dos, o si es posible en tres para repartir el uso de memoria. Tambien me gustaria probar un truco que uso a menudo para traducir paginas en un idioma que no entiendo, lo que hago es que en vez de traducir directamente al español, primero lo traduzco a inglés, y luego desde inglés al español, parece una tonteria y un gasto innecesario, pero si lo hago es porque así suelo entender mejor las traducciones.&lt;br /&gt;
Quiero por un lado el sistema de comunicacion y evaluacion entre traductores, y por otro el sistema de traduccion entre avatares, ¿es muy dificil? no se ya lo veremos...&lt;br /&gt;
&lt;br /&gt;
Well, after saving as much as I could, I think the memory usage and the speed are technically the same as in the original script, but well, in the variety is the taste, isnt it?. &lt;br /&gt;
I have tested a bit the code above already, and it seems to work altought i´m having some problems...&lt;br /&gt;
For instance i think the translation system is not working properly, and i dont mean the Google´s translation system (in my opinion, if is not the best, one of the bests), but that there is still much work to do in the script...&lt;br /&gt;
&lt;br /&gt;
The next step will be to try to divide the script in 2, or 3 if is possible, so we can spread the memory usage. Also I would like to test a trick i use often for to translate languages that i dont understand, what I do first is to translate that language into English, and then from English to Spanish, it seems a nonsense and unnecesary waste, but if i do it is becouse so i usually understand the translations better.&lt;br /&gt;
I want by one part the translators communications and evaluation system, and by other the translation system between avatars, is it very difficult? I doný know , we will see...&lt;br /&gt;
&lt;br /&gt;
== welcome ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//November 12, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Web Server Services powered by Google &lt;br /&gt;
//Variables&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
list agentsInTranslationOptions;&lt;br /&gt;
list requestList;&lt;br /&gt;
integer listenID; &lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
integer showTranslation = FALSE;&lt;br /&gt;
integer tranObjects = TRUE; &lt;br /&gt;
integer lastHeartBeat;&lt;br /&gt;
list    languageCodes = [&lt;br /&gt;
&amp;quot;zh-CN&amp;quot;, &amp;quot;zh-TW&amp;quot;, &amp;quot;hr&amp;quot;,  &lt;br /&gt;
&amp;quot;bg&amp;quot;, &amp;quot;be&amp;quot;, &amp;quot;ca&amp;quot;,&lt;br /&gt;
&amp;quot;af&amp;quot;, &amp;quot;sq&amp;quot;, &amp;quot;ar&amp;quot;,   &lt;br /&gt;
&amp;quot;tl&amp;quot;, &amp;quot;fr&amp;quot;, &amp;quot;gl&amp;quot;,    &lt;br /&gt;
&amp;quot;fi&amp;quot;, &amp;quot;en&amp;quot;, &amp;quot;et&amp;quot;,     &lt;br /&gt;
&amp;quot;cs&amp;quot;, &amp;quot;da&amp;quot;, &amp;quot;nl&amp;quot;,  &lt;br /&gt;
&amp;quot;id&amp;quot;, &amp;quot;ga&amp;quot;, &amp;quot;it&amp;quot;,      &lt;br /&gt;
&amp;quot;hi&amp;quot;, &amp;quot;hu&amp;quot;, &amp;quot;is&amp;quot;, &lt;br /&gt;
&amp;quot;de&amp;quot;, &amp;quot;el&amp;quot;, &amp;quot;iw&amp;quot;,    &lt;br /&gt;
&amp;quot;mt&amp;quot;, &amp;quot;no&amp;quot;, &amp;quot;fa&amp;quot;,   &lt;br /&gt;
&amp;quot;lt&amp;quot;, &amp;quot;mk&amp;quot;, &amp;quot;ms&amp;quot;,   &lt;br /&gt;
&amp;quot;ja&amp;quot;, &amp;quot;ko&amp;quot;, &amp;quot;lv&amp;quot;,   &lt;br /&gt;
&amp;quot;sl&amp;quot;, &amp;quot;es&amp;quot;, &amp;quot;sw&amp;quot;, &lt;br /&gt;
&amp;quot;ru&amp;quot;, &amp;quot;sr&amp;quot;, &amp;quot;sk&amp;quot;, &lt;br /&gt;
&amp;quot;pl&amp;quot;, &amp;quot;pt-PT&amp;quot;, &amp;quot;ro&amp;quot;,&lt;br /&gt;
&amp;quot;yi&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;uk&amp;quot;, &amp;quot;vi&amp;quot;, &amp;quot;cy&amp;quot;,&lt;br /&gt;
&amp;quot;sv&amp;quot;,&amp;quot;th&amp;quot;, &amp;quot;tr&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
list    translators;&lt;br /&gt;
list    sayCache;&lt;br /&gt;
list    sayCachePrivate;&lt;br /&gt;
integer priorityNumber;&lt;br /&gt;
integer priorityNumListenID;&lt;br /&gt;
integer isInitialized = FALSE;&lt;br /&gt;
string  options; &lt;br /&gt;
//Options&lt;br /&gt;
//integer debug = TRUE;&lt;br /&gt;
integer broadcastChannel = -9999999; //note this is not the channel used by the HR Universal Translator&lt;br /&gt;
string  password = &amp;quot;password&amp;quot;; //note this is not the password used to encrypt comms of the HR Universal Translator&lt;br /&gt;
integer version = 190;&lt;br /&gt;
//&lt;br /&gt;
sendIM(key imid, string imstr)&lt;br /&gt;
{&lt;br /&gt;
    if (llGetParcelFlags(llGetPos()) &amp;amp; PARCEL_FLAG_ALLOW_SCRIPTS)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 85234119, imstr, imid); &lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_THIS, 85304563, imstr, imid);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//txTxtLot() = sendTextBatch()&lt;br /&gt;
txTxtLot(integer txch, string txtxt) &lt;br /&gt;
{&lt;br /&gt;
    txtxt = llXorBase64StringsCorrect(llStringToBase64(txtxt), llStringToBase64(password));&lt;br /&gt;
    while (llStringLength(txtxt) &amp;gt; 508) //If string is 509 characters or longer &lt;br /&gt;
    {&lt;br /&gt;
        llSay(txch, llGetSubString(txtxt, 0, 507)); //send 508 character chunk&lt;br /&gt;
        txtxt = llGetSubString(txtxt, 508, -1);  //delete 508 character chunk&lt;br /&gt;
    }&lt;br /&gt;
    llSay(txch, txtxt);  //send out any remainder chunk or original chunk&lt;br /&gt;
    //Perry Mizin Comment: I don´t understand the aim of the following if.    &lt;br /&gt;
    //Hank Ramos Comment: this line serves to &amp;quot;trigger&amp;quot; the receiver not to wait for another batch.  If the&lt;br /&gt;
    //message length is exactly 508 characters, the receiver things that another chunk of the message is coming.&lt;br /&gt;
    //This message serves to tell the receiver that the last chunk was the last chunk, not another regular chunk.&lt;br /&gt;
    if (llStringLength(txtxt) == 508)&lt;br /&gt;
        llSay(txch, (string)(txch*4958654));&lt;br /&gt;
    //Hank Ramos Comment: this just flashes the color of the bottom prim to show a message was sent&lt;br /&gt;
    llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0, 0.25&amp;gt;, &amp;quot;&amp;quot;); &lt;br /&gt;
}  &lt;br /&gt;
//string rxTxtLot() = string receiveTextBatch()&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer rxliPos;&lt;br /&gt;
    string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
    {&lt;br /&gt;
        rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
        rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
        sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
    rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
    return rxmsg;&lt;br /&gt;
}&lt;br /&gt;
//string rxTxtLot() = string receiveTextBatch() (Another way)&lt;br /&gt;
integer rxTxtLotBusy = FALSE; //Perry Mizin: added Busy Mode, this could fail or prevent fail&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    if (rxTxtLotBusy == FALSE)&lt;br /&gt;
    {&lt;br /&gt;
        rxTxtLotBusy = TRUE;&lt;br /&gt;
        integer rxliPos;&lt;br /&gt;
        string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
        if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
        {&lt;br /&gt;
            @rxin;&lt;br /&gt;
            rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
            rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
            sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
            if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
            {&lt;br /&gt;
                 jump rxin;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
        rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
        rxTxtLotBusy = FALSE;&lt;br /&gt;
        return rxmsg;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        //Perry Mizin: llSaySomething?&lt;br /&gt;
        return &amp;quot;&amp;quot;;        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string rxTxtLotPrv() = string receiveTextBatchPrivate()&lt;br /&gt;
string rxTxtLotPrv(key prxid, string prxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer prxliPos;&lt;br /&gt;
    string  prxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCachePrivate, (list)prxid))&lt;br /&gt;
    {&lt;br /&gt;
        prxliPos = llListFindList(sayCachePrivate, [prxid]);&lt;br /&gt;
        prxtmpStr = (prxtmpStr=&amp;quot;&amp;quot;) + prxtmpStr + llList2String(sayCachePrivate, prxliPos + 1);&lt;br /&gt;
        sayCachePrivate = llDeleteSubList(sayCachePrivate, prxliPos, prxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    prxmsg = prxtmpStr + prxmsg;&lt;br /&gt;
    prxmsg = llBase64ToString(llXorBase64StringsCorrect(prxmsg, llStringToBase64(password)));&lt;br /&gt;
    return prxmsg;&lt;br /&gt;
}&lt;br /&gt;
//updateTranslatorList()&lt;br /&gt;
updateTranslatorList()&lt;br /&gt;
{&lt;br /&gt;
    integer nx;&lt;br /&gt;
    integer xliLng;&lt;br /&gt;
    list    newList;&lt;br /&gt;
    string  tmpStrPos;&lt;br /&gt;
    integer newMaster;&lt;br /&gt;
    //Scan and remove translators not in the area&lt;br /&gt;
    xliLng = llGetListLength(translators);&lt;br /&gt;
    for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
    {&lt;br /&gt;
        tmpStrPos = llList2String(llGetObjectDetails(llList2Key(translators, nx + 1), [OBJECT_POS]), 0);&lt;br /&gt;
        if ((llVecDist(llGetPos(), (vector)tmpStrPos) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tmpStrPos != &amp;quot;&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            newList = (newList=[]) + newList +  llList2List(translators, nx, nx + 1);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    translators = newList;&lt;br /&gt;
    //llMessageLinked(LINK_THIS,65635544,(string)xliLng,&amp;quot;&amp;quot;); Perry Mizin: what is this necesary for?&lt;br /&gt;
    if (translators == [])&lt;br /&gt;
    {&lt;br /&gt;
        newMaster = 1;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        if (enabled)&lt;br /&gt;
        {&lt;br /&gt;
            xliLng = llGetListLength(translators);&lt;br /&gt;
            newMaster = 2;&lt;br /&gt;
            for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
            {&lt;br /&gt;
                //llOwnerSay(&amp;quot;Checking Priority Number(&amp;quot; +  (string)priorityNumber + &amp;quot;): &amp;quot; + (string)llList2Integer(translators, x));&lt;br /&gt;
                if (llList2Integer(translators, nx) &amp;gt; priorityNumber)&lt;br /&gt;
                {&lt;br /&gt;
                    newMaster = 0;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            newMaster = 0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster &amp;gt; 0) &amp;amp;&amp;amp; (newMaster == 0))&lt;br /&gt;
    {&lt;br /&gt;
        //We are being demoted from master to slave&lt;br /&gt;
        //Flush agentsInTranslation to master&lt;br /&gt;
        if (agentsInTranslation != [])&lt;br /&gt;
        {&lt;br /&gt;
            //Demotion Dump of agentsInTranslation to Master&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1003, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
            if (isInitialized == FALSE)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1004, options])); //error&lt;br /&gt;
        }&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster == 0) &amp;amp;&amp;amp; (newMaster &amp;gt; 0))&lt;br /&gt;
    {&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
        listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); &lt;br /&gt;
    }&lt;br /&gt;
    isMaster = newMaster;&lt;br /&gt;
    llMessageLinked(LINK_THIS, 34829304, (string)isMaster, &amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
//sendHeartbeat()&lt;br /&gt;
sendHeartbeat()&lt;br /&gt;
{&lt;br /&gt;
    updateTranslatorList();&lt;br /&gt;
    txTxtLot(broadcastChannel, llList2CSV([1001, priorityNumber]));&lt;br /&gt;
    //Broadcast agentList to Slaves&lt;br /&gt;
    if (isMaster == 2)&lt;br /&gt;
    {&lt;br /&gt;
        txTxtLot(broadcastChannel, llList2CSV([1002, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//checkThrottle()&lt;br /&gt;
checkThrottle(integer chkn, string chkmsg, list chkli)&lt;br /&gt;
{&lt;br /&gt;
    integer y;&lt;br /&gt;
    integer maxCount;&lt;br /&gt;
    float   chkoldTime;&lt;br /&gt;
    float   sleepTime;&lt;br /&gt;
    list    chknewli;&lt;br /&gt;
    key     returnValue;&lt;br /&gt;
    integer channelToSpeak; &lt;br /&gt;
    //loop though list and remove items older than 25 seconds&lt;br /&gt;
    for (y = 0; y &amp;lt; llGetListLength(requestList); y += 1)&lt;br /&gt;
    {&lt;br /&gt;
        chkoldTime = llList2Float(requestList, y);&lt;br /&gt;
        //Construct new list with only times less than 25 seconds&lt;br /&gt;
        if ((llGetTime() - chkoldTime) &amp;lt;= 25.0)&lt;br /&gt;
        { &lt;br /&gt;
            chknewli = (chknewli=[]) + chknewli + [chkoldTime];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    requestList = chknewli; &lt;br /&gt;
    y = llGetListLength(requestList);&lt;br /&gt;
    //Shunt all translations to linked translators if master&lt;br /&gt;
    if (isMaster == 2)&lt;br /&gt;
    {&lt;br /&gt;
        if (chkn == 0)&lt;br /&gt;
        {&lt;br /&gt;
            //Send HTTP request to other translator&lt;br /&gt;
            //Send out Request to Random Translator Channel&lt;br /&gt;
            channelToSpeak = llList2Integer(llListRandomize(llList2ListStrided(translators, 0, -1, 2), 1), 0);&lt;br /&gt;
            if (channelToSpeak &amp;gt; 0) &lt;br /&gt;
            {&lt;br /&gt;
                txTxtLot(channelToSpeak, llList2CSV([chkn, llList2CSV(chkli)]) + &amp;quot;~&amp;quot; + chkmsg);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if (y == 19)&lt;br /&gt;
    {&lt;br /&gt;
        sleepTime =  25.0 - (llGetTime() - llList2Float(requestList, 0));&lt;br /&gt;
        if (sleepTime &amp;gt; 0) &lt;br /&gt;
        {&lt;br /&gt;
            llSleep(sleepTime);&lt;br /&gt;
        }&lt;br /&gt;
        requestList = llDeleteSubList(requestList, 0, 0);&lt;br /&gt;
    }&lt;br /&gt;
    if (chkn == 0)&lt;br /&gt;
    {&lt;br /&gt;
        chkmsg = &amp;quot;translate?v=1.0&amp;amp;q=&amp;quot; + chkmsg;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        chkmsg = &amp;quot;detect?v=1.0&amp;amp;q=&amp;quot; + chkmsg;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    requestList = (requestList=[]) + requestList + (list)llGetTime();&lt;br /&gt;
    returnValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/&amp;quot; + chkmsg, [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot; &amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
    if (returnValue != NULL_KEY)&lt;br /&gt;
    {&lt;br /&gt;
        if (chkn == 0)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS, 235365342, llList2CSV(chkli), returnValue); &lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS, 235365343, llList2CSV(chkli), returnValue); &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llSleep(40.0); //Something has gone horribly wrong, sleep 40 seconds to clear throttle&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string checkLanguage()&lt;br /&gt;
string checkLanguage(string chklantmpStr)&lt;br /&gt;
{&lt;br /&gt;
    if (llGetSubString(chklantmpStr, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else if (chklantmpStr == &amp;quot;und&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;el&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if (~llListFindList(languageCodes, [chklantmpStr]))&lt;br /&gt;
    {&lt;br /&gt;
 &lt;br /&gt;
    } else {&lt;br /&gt;
        chklantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    chklantmpStr = llGetSubString(chklantmpStr, 0, 1);&lt;br /&gt;
    return chklantmpStr;&lt;br /&gt;
}&lt;br /&gt;
//addAgent()&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
    integer avliPos;&lt;br /&gt;
    integer idNum;&lt;br /&gt;
    if (llListFindList(agentsInTranslation, (list)avid) != 911)&lt;br /&gt;
    {&lt;br /&gt;
        avliPos = llListFindList(agentsInTranslation, [avid]);&lt;br /&gt;
        agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, chklan], avliPos + 1, avliPos + 2);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        @yes;&lt;br /&gt;
        idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
        if(llListFindList(agentsInTranslation, (list)idNum) != 911)&lt;br /&gt;
        {//it exists       &lt;br /&gt;
            jump at;&lt;br /&gt;
        }&lt;br /&gt;
        agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, chklan, idNum];&lt;br /&gt;
        llMessageLinked(LINK_THIS, 64562349, avlan, avid);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string addNewAgent()&lt;br /&gt;
string addNewAgent(key newavid)&lt;br /&gt;
{&lt;br /&gt;
    string speakerLan;&lt;br /&gt;
 &lt;br /&gt;
    if (llGetAgentSize(newavid) != ZERO_VECTOR)&lt;br /&gt;
    {&lt;br /&gt;
        speakerLan  = checkLanguage(llGetAgentLanguage(newavid));&lt;br /&gt;
        if (speakerLan == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
            addAgent(newavid, speakerLan, TRUE);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            addAgent(newavid, speakerLan, FALSE);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return speakerLan;&lt;br /&gt;
}&lt;br /&gt;
//key getAgentKey()&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
    if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
    {&lt;br /&gt;
        integer gkliPos = llListFindList(agentsInTranslation, [agentID]);&lt;br /&gt;
        return llList2Key(agentsInTranslation, gkliPos - 3);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//processHTTPResponse()&lt;br /&gt;
processHTTPResponse(integer ntype, string bodyStr, list paramsli)&lt;br /&gt;
{&lt;br /&gt;
    integer spkliPos;&lt;br /&gt;
    list    recepientList;&lt;br /&gt;
    key     recepientID;&lt;br /&gt;
    string  recepientLanguage;&lt;br /&gt;
    string  languagePair;&lt;br /&gt;
    key     speakerID;&lt;br /&gt;
    string  speakerName;&lt;br /&gt;
    string  speakerLanguage;&lt;br /&gt;
    string  translatedText;&lt;br /&gt;
    string  lantmpStr;&lt;br /&gt;
    integer z;&lt;br /&gt;
    integer speakerLanguageReliable;&lt;br /&gt;
    float   speakerLanguageConfidence;&lt;br /&gt;
    list    paramtmpli;&lt;br /&gt;
    //===================&lt;br /&gt;
    //Process Translation&lt;br /&gt;
    //===================&lt;br /&gt;
    if (ntype == 0)&lt;br /&gt;
    {&lt;br /&gt;
        speakerID  = llList2Key(paramsli, 1);&lt;br /&gt;
        speakerName = llKey2Name(speakerID);&lt;br /&gt;
        if (speakerName == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
        }&lt;br /&gt;
        recepientList = llParseString2List(llList2String(paramsli, 2), [&amp;quot;@&amp;quot;], []);&lt;br /&gt;
        paramtmpli = llParseStringKeepNulls(llList2String(paramsli, 3), [&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
        recepientLanguage = llList2String(paramtmpli, 1);&lt;br /&gt;
        languagePair = llDumpList2String(paramtmpli, &amp;quot;&amp;gt;&amp;gt;&amp;quot;); &lt;br /&gt;
        //Perform Text Cleanup&lt;br /&gt;
        z = llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;detectedSourceLanguage\&amp;quot;:\&amp;quot;&amp;quot;); &lt;br /&gt;
        if (z != -1)&lt;br /&gt;
        {&lt;br /&gt;
            translatedText  = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, z);&lt;br /&gt;
            speakerLanguage = checkLanguage(llGetSubString(bodyStr, z + 28, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;}, \&amp;quot;responseDetails\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
            spkliPos = llListFindList(agentsInTranslation, [speakerID]);&lt;br /&gt;
            if (spkliPos &amp;gt;= 0)&lt;br /&gt;
            {&lt;br /&gt;
                if (speakerLanguage != llList2String(agentsInTranslation, spkliPos + 1))&lt;br /&gt;
                {&lt;br /&gt;
                    agentsInTranslation = llListReplaceList(agentsInTranslation, [TRUE], spkliPos + 2, spkliPos + 2);  //Mark for recheck of actual spoken language.&lt;br /&gt;
                }&lt;br /&gt;
            }                   &lt;br /&gt;
        }&lt;br /&gt;
        else if (z == -1)&lt;br /&gt;
        {&lt;br /&gt;
            translatedText = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;}, \&amp;quot;responseDetails\&amp;quot;&amp;quot;));&lt;br /&gt;
        }&lt;br /&gt;
        //Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
        if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            lantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
            //Perry Mizin Comment: Probably I guess this is wrong, maybe I am wrong&lt;br /&gt;
            //Perry Mizin Comment: alternative reverse order: &amp;quot;Hello World&amp;quot; could be &amp;quot;World Hello&amp;quot;&lt;br /&gt;
            //Perry Mizin Comment: reverse order: &amp;quot;Hello World&amp;quot; is &amp;quot;dlroW olleH&amp;quot; or ,,pl^ºM ºllªH,,&lt;br /&gt;
            for(z = llStringLength(translatedText);z &amp;gt;= 0; z--)&lt;br /&gt;
            {&lt;br /&gt;
                lantmpStr = (lantmpStr=&amp;quot;&amp;quot;) + lantmpStr + llGetSubString(translatedText, z, z); &lt;br /&gt;
            }&lt;br /&gt;
            translatedText = lantmpStr;&lt;br /&gt;
        }   &lt;br /&gt;
        lantmpStr = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
        if (showTranslation)&lt;br /&gt;
        {&lt;br /&gt;
            sendIM(speakerID, lantmpStr);&lt;br /&gt;
        } &lt;br /&gt;
        for (z = 0; z &amp;lt; llGetListLength(recepientList); z += 1)&lt;br /&gt;
        {&lt;br /&gt;
            recepientID = getAgentKey(llList2Integer(recepientList, z));&lt;br /&gt;
            if (recepientID != &amp;quot;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, [recepientID]) + 1);&lt;br /&gt;
                if (recepientLanguage != speakerLanguage)&lt;br /&gt;
                {&lt;br /&gt;
                    sendIM(recepientID, lantmpStr);&lt;br /&gt;
                }&lt;br /&gt;
            }  &lt;br /&gt;
        }&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    //===========================&lt;br /&gt;
    //Process Language Detection&lt;br /&gt;
    //===========================&lt;br /&gt;
    if (ntype == 1)&lt;br /&gt;
    {&lt;br /&gt;
        speakerID = llList2Key(paramsli, 1);&lt;br /&gt;
        speakerLanguageReliable = llToLower(llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) + 15, llSubStringIndex(bodyStr, &amp;quot;,\&amp;quot;confidence\&amp;quot;:&amp;quot;) - 1)) == &amp;quot;true&amp;quot;;&lt;br /&gt;
        speakerLanguageConfidence = (float)llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;,\&amp;quot;confidence\&amp;quot;:&amp;quot;) + 14, llSubStringIndex(bodyStr, &amp;quot;}, \&amp;quot;responseDetails\&amp;quot;:&amp;quot;) - 1);&lt;br /&gt;
 &lt;br /&gt;
        spkliPos = llListFindList(agentsInTranslation, [speakerID]);&lt;br /&gt;
        if (((spkliPos &amp;lt; 0) &amp;amp;&amp;amp; (speakerLanguageReliable) || (speakerLanguageConfidence &amp;gt;= 0.08)))&lt;br /&gt;
        {&lt;br /&gt;
            //Analyze Data&lt;br /&gt;
            lantmpStr = checkLanguage(llToLower(llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1)));&lt;br /&gt;
            if (lantmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            } &lt;br /&gt;
            if (speakerLanguageConfidence &amp;lt; 0.14)&lt;br /&gt;
            {&lt;br /&gt;
                addAgent(speakerID, lantmpStr, TRUE);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                addAgent(speakerID, lantmpStr, FALSE);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        //Multiplexor Initialization&lt;br /&gt;
        priorityNumber = version*1000000 + llRound(llFrand(499999) + 50000);&lt;br /&gt;
        llListen(broadcastChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        priorityNumListenID = llListen(priorityNumber, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
        //Send out initial heartbeat&lt;br /&gt;
        lastHeartBeat = llGetUnixTime();&lt;br /&gt;
        txTxtLot(broadcastChannel, llList2CSV([1001, priorityNumber]));&lt;br /&gt;
 &lt;br /&gt;
        //Wait for the network to settle down&lt;br /&gt;
        llSetTimerEvent(5.0); &lt;br /&gt;
        //llSetTimerEvent(10 + ((1-llGetRegionTimeDilation()) * 1));       &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
    {&lt;br /&gt;
        list    ltmpli;&lt;br /&gt;
&lt;br /&gt;
        //Old Multiplexor&lt;br /&gt;
        if (num == 8434532)&lt;br /&gt;
        {&lt;br /&gt;
            enabled = (integer)lstr;&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 3342976)&lt;br /&gt;
        {&lt;br /&gt;
            //Send Preferences&lt;br /&gt;
            options = lstr;&lt;br /&gt;
            if (isInitialized == FALSE) return;&lt;br /&gt;
            ltmpli = llCSV2List(options);&lt;br /&gt;
            showTranslation = llList2Integer(ltmpli, 0);&lt;br /&gt;
            tranObjects = llList2Integer(ltmpli, 1);&lt;br /&gt;
            autoLanguage = llList2Integer(ltmpli, 2);&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1004, options]));&lt;br /&gt;
 &lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 9384610)&lt;br /&gt;
        {&lt;br /&gt;
            if (isMaster == 0) //markering&lt;br /&gt;
                //llMessageLinked(LINK_THIS, 5598321, llList2CSV([id, str, FALSE]), &amp;quot;&amp;quot;);&lt;br /&gt;
                txTxtLot(broadcastChannel, llList2CSV([1003, lid, lstr, FALSE]));&lt;br /&gt;
            else&lt;br /&gt;
                addAgent(lid, lstr, TRUE);&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 345149625)&lt;br /&gt;
        {&lt;br /&gt;
            //Return Translation&lt;br /&gt;
            processHTTPResponse(0, lstr, llCSV2List(lid));&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 345149626)&lt;br /&gt;
        {&lt;br /&gt;
            //Return Detection&lt;br /&gt;
            processHTTPResponse(1, lstr, llCSV2List(lid));&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    sensor(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        integer s;&lt;br /&gt;
        key     sid;&lt;br /&gt;
 &lt;br /&gt;
        for (s = 0; s &amp;lt; num_detected; s += 1)&lt;br /&gt;
        {&lt;br /&gt;
            sid = llDetectedKey(s);&lt;br /&gt;
            if (~llListFindList(agentsInTranslation, (list)sid))&lt;br /&gt;
            {                &lt;br /&gt;
            }else{&lt;br /&gt;
                addNewAgent(sid);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        integer w;&lt;br /&gt;
        string  spkrLan;&lt;br /&gt;
        string  recepLan;&lt;br /&gt;
        integer recepID;&lt;br /&gt;
        integer lstliPos;&lt;br /&gt;
        string  lanpair;&lt;br /&gt;
        list    translationCache;&lt;br /&gt;
        list    lsttmpli;&lt;br /&gt;
        integer ImessageType;&lt;br /&gt;
        string  Imessage;&lt;br /&gt;
        string  lsttmpStr;&lt;br /&gt;
        string  lst2tmpStr;&lt;br /&gt;
 &lt;br /&gt;
        //Multiplexor Code&lt;br /&gt;
        if ((channel == broadcastChannel) || (channel == priorityNumber))&lt;br /&gt;
        {&lt;br /&gt;
            //==========================&lt;br /&gt;
            //Process Proxy HTTP Request&lt;br /&gt;
            //==========================&lt;br /&gt;
 &lt;br /&gt;
            if (channel == priorityNumber)&lt;br /&gt;
            {&lt;br /&gt;
                if (llStringLength(message) &amp;gt;= 508)&lt;br /&gt;
                {&lt;br /&gt;
                    if (((integer)message/channel) != 4958654)&lt;br /&gt;
                    {&lt;br /&gt;
                        sayCachePrivate = (sayCachePrivate=[]) + sayCachePrivate + [id, message];&lt;br /&gt;
                        return; &lt;br /&gt;
                    }&lt;br /&gt;
                    message = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                message = rxTxtLotPrv(id, message);&lt;br /&gt;
                //Received packet to translate&lt;br /&gt;
                llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0.05, 0.25&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
                lsttmpli = llParseString2List(message, [&amp;quot;~&amp;quot;], []);&lt;br /&gt;
                lsttmpStr = llList2String(lsttmpli, 0);&lt;br /&gt;
                lsttmpli = llDeleteSubList(lsttmpli, 0, 0);&lt;br /&gt;
 &lt;br /&gt;
                lst2tmpStr = llDumpList2String(lsttmpli, &amp;quot;|&amp;quot;);&lt;br /&gt;
                lsttmpli = llCSV2List(lsttmpStr);&lt;br /&gt;
                lstliPos = llList2Integer(lsttmpli, 0);&lt;br /&gt;
                lsttmpli = llDeleteSubList(lsttmpli, 0, 0);&lt;br /&gt;
 &lt;br /&gt;
                checkThrottle(lstliPos, lst2tmpStr, lsttmpli);&lt;br /&gt;
 &lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
            //=======================&lt;br /&gt;
            //Process Global Messages&lt;br /&gt;
            //=======================&lt;br /&gt;
            if (llStringLength(message) &amp;gt;= 508)&lt;br /&gt;
            {&lt;br /&gt;
                if (((integer)message/channel) != 4958654)&lt;br /&gt;
                {&lt;br /&gt;
                    sayCache = (sayCache=[]) + sayCache + [id, message];&lt;br /&gt;
                    return; &lt;br /&gt;
                }&lt;br /&gt;
                message = &amp;quot;&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            message = rxTxtLot(id, message);&lt;br /&gt;
 &lt;br /&gt;
            lsttmpli = llCSV2List(message);&lt;br /&gt;
 &lt;br /&gt;
            if (llGetListLength(lsttmpli) &amp;gt;= 2)    &lt;br /&gt;
            {&lt;br /&gt;
                ImessageType = llList2Integer(lsttmpli, 0);&lt;br /&gt;
                lsttmpli = llDeleteSubList(lsttmpli, 0, 0);&lt;br /&gt;
                Imessage = llList2CSV(lsttmpli);        &lt;br /&gt;
 &lt;br /&gt;
                llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0, 0.25&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
                //Process Message Here&lt;br /&gt;
                if (ImessageType == 1001)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming Heartbeat&lt;br /&gt;
                    if ((integer)Imessage == priorityNumber)&lt;br /&gt;
                    {&lt;br /&gt;
                        llOwnerSay(&amp;quot;Priority Number Conflict!  Resetting Script...&amp;quot;);&lt;br /&gt;
                        llResetScript(); //Reset if conflicting priority number&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    if (~llListFindList(translators, (list)id)  //lstliPos &amp;lt; 0) &lt;br /&gt;
                    {&lt;br /&gt;
                        lstliPos = llListFindList(translators, [id]);&lt;br /&gt;
                        translators = llListReplaceList(translators, [(integer)Imessage], lstliPos - 1, lstliPos - 1);                        &lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                       translators = (translators=[]) + translators + [(integer)Imessage, id];&lt;br /&gt;
                        if ((isMaster &amp;gt; 0) &amp;amp;&amp;amp; (isInitialized))&lt;br /&gt;
                        {&lt;br /&gt;
                            txTxtLot((integer)Imessage, llList2CSV([1002, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
                            txTxtLot((integer)Imessage, llList2CSV([1004, options]));&lt;br /&gt;
                        } &lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if (ImessageType == 1002)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming agentsInTranslation Master Broadcast&lt;br /&gt;
                    if (isMaster == 0)&lt;br /&gt;
                    {&lt;br /&gt;
                        //llMessageLinked(LINK_THIS, 9458021, Imessage, &amp;quot;&amp;quot;);  &lt;br /&gt;
                        lsttmpli = llCSV2List(Imessage);&lt;br /&gt;
                        agentsInTranslation = [];&lt;br /&gt;
                        for (w = 0; w &amp;lt; llGetListLength(lsttmpli); w += 4)&lt;br /&gt;
                        {&lt;br /&gt;
                            agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [llList2Key(lsttmpli, w), llList2String(lsttmpli, w + 1), llList2Integer(lsttmpli, w + 2), llList2Integer(lsttmpli, w + 3)];&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if (ImessageType == 1003)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming agentsInTranslation dump from Slave&lt;br /&gt;
                    lsttmpli = llCSV2List(Imessage);&lt;br /&gt;
                    for (w = 0; w &amp;lt; llGetListLength(lsttmpli); w += 4)&lt;br /&gt;
                    {&lt;br /&gt;
                        addAgent(llList2Key(lsttmpli, w), llList2String(lsttmpli, w + 1), llList2Integer(lsttmpli, w + 2));&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if (ImessageType == 1004)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming Preferences&lt;br /&gt;
                    options = Imessage;&lt;br /&gt;
                    lsttmpli = llCSV2List(options);&lt;br /&gt;
                    showTranslation = llList2Integer(lsttmpli, 0);&lt;br /&gt;
                    tranObjects = llList2Integer(lsttmpli, 1);&lt;br /&gt;
                    autoLanguage = llList2Integer(lsttmpli, 2);&lt;br /&gt;
 &lt;br /&gt;
                    llMessageLinked(LINK_THIS, 3342977, Imessage, &amp;quot;&amp;quot;);  &lt;br /&gt;
                }&lt;br /&gt;
            }            &lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        //Translator Engine Code&lt;br /&gt;
        if ((llToLower(message) == &amp;quot;translator&amp;quot;) &amp;amp;&amp;amp; (isMaster &amp;gt; 0)) &lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS, 2540664, message, id);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ((!enabled) &amp;amp;&amp;amp; (isMaster == 1)) return;&lt;br /&gt;
 &lt;br /&gt;
        if (!tranObjects)&lt;br /&gt;
        {&lt;br /&gt;
            if (llGetAgentSize(id) == ZERO_VECTOR) return;&lt;br /&gt;
        } &lt;br /&gt;
        &lt;br /&gt;
        if (~llListFindList(agentsInTranslation, (list)id)) //lstliPos &amp;gt;= 0)&lt;br /&gt;
        {&lt;br /&gt;
            lstliPos = llListFindList(agentsInTranslation, (list)id);            &lt;br /&gt;
            spkrLan = llList2String(agentsInTranslation, lstliPos + 1);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            spkrLan = addNewAgent(id);&lt;br /&gt;
        } &lt;br /&gt;
        if (spkrLan == &amp;quot;xx&amp;quot;) return;  //Agent Opt-Out&lt;br /&gt;
         &lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;1, 1, 0&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
        //===============================&lt;br /&gt;
        //Formulate Translation Requests&lt;br /&gt;
        //===============================&lt;br /&gt;
        for (w = 0; w &amp;lt; llGetListLength(agentsInTranslation); w += 4)&lt;br /&gt;
        {&lt;br /&gt;
            //Loop through translation group and do appropriate translations as needed&lt;br /&gt;
            recepID = llList2Integer(agentsInTranslation, w + 3);&lt;br /&gt;
            recepLan =  checkLanguage(llList2Key(agentsInTranslation, w + 1)); &lt;br /&gt;
            if ((spkrLan != recepLan) &amp;amp;&amp;amp; (recepLan != &amp;quot;&amp;quot;) &amp;amp;&amp;amp; (recepLan != &amp;quot;xx&amp;quot;))&lt;br /&gt;
            {&lt;br /&gt;
                lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
 &lt;br /&gt;
                &lt;br /&gt;
                if (~llListFindList(translationCache, (list)lanpair)) //lstliPos &amp;lt; 0)&lt;br /&gt;
                {&lt;br /&gt;
                  lstliPos = llListFindList(translationCache, [lanpair]);&lt;br /&gt;
                  translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
                  &lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                  translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        } &lt;br /&gt;
        //Process Requests&lt;br /&gt;
        if (translationCache != [])&lt;br /&gt;
        {&lt;br /&gt;
            for (w = 0; w &amp;lt; llGetListLength(translationCache); w += 2)&lt;br /&gt;
            {&lt;br /&gt;
                //====================================&lt;br /&gt;
                //Translation&lt;br /&gt;
                //====================================&lt;br /&gt;
                //Forumulate and Send Translation Request&lt;br /&gt;
                lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, w), [&amp;quot;|&amp;quot;],[]), 1); &lt;br /&gt;
                checkThrottle(0, llEscapeURL(message) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, w + 1), llList2String(translationCache, w)]);&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
            spkrLan = &amp;quot;&amp;quot;; &lt;br /&gt;
        //====================================&lt;br /&gt;
        //Language Detection&lt;br /&gt;
        //====================================&lt;br /&gt;
        if (llGetAgentSize(id) != ZERO_VECTOR) //llList2Key(llGetObjectDetails(id, [OBJECT_CREATOR]), 0) == NULL_KEY)&lt;br /&gt;
        {&lt;br /&gt;
            if (((spkrLan == &amp;quot;&amp;quot;) || (llList2Integer(agentsInTranslation, llListFindList(agentsInTranslation, [id]) + 2) == TRUE)) || (isMaster == 2))&lt;br /&gt;
            {&lt;br /&gt;
                //Forumulate and Send Language Detect Request&lt;br /&gt;
                checkThrottle(1, llEscapeURL(message), [llGetTime(), id]);&lt;br /&gt;
            }       &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
    {&lt;br /&gt;
        string  htttmpStr; &lt;br /&gt;
        if (status != 200) &lt;br /&gt;
        {&lt;br /&gt;
            //llOwnerSay(&amp;quot;WWW Error:&amp;quot; + (string)status);&lt;br /&gt;
            llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;1, 0, 0&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
            //llOwnerSay(body);&lt;br /&gt;
            return;&lt;br /&gt;
        } &lt;br /&gt;
        //Process Resonse Code&lt;br /&gt;
        htttmpStr = llGetSubString(body, llSubStringIndex(body, &amp;quot;\&amp;quot;responseStatus\&amp;quot;:&amp;quot;), -1);&lt;br /&gt;
        status = (integer)llGetSubString(htttmpStr, 17, llSubStringIndex(htttmpStr, &amp;quot;}&amp;quot;) - 1);&lt;br /&gt;
        if (status != 200)&lt;br /&gt;
        {&lt;br /&gt;
            //llOwnerSay(&amp;quot;Language Server Returned Error Code: &amp;quot; + (string)status);&lt;br /&gt;
            //llOwnerSay(body);&lt;br /&gt;
            llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;1, 0, 0&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0, 0, 1&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
        llMessageLinked(LINK_THIS, 345149624, body, request_id);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(0.0);  // timer reset&lt;br /&gt;
        integer r;&lt;br /&gt;
        string  tmrtmpStr;&lt;br /&gt;
        list    tmrnewli;&lt;br /&gt;
        integer translatorCount = llGetListLength(translators)/2; &lt;br /&gt;
        if (isInitialized == FALSE)&lt;br /&gt;
        {&lt;br /&gt;
            enabled = TRUE;&lt;br /&gt;
            listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); &lt;br /&gt;
            llListen(777, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
            llMessageLinked(LINK_THIS, 6877259, (string)enabled, NULL_KEY);&lt;br /&gt;
            isInitialized = TRUE;&lt;br /&gt;
        } &lt;br /&gt;
        llMessageLinked(LINK_THIS, 94558323, llList2CSV(agentsInTranslation), &amp;quot;&amp;quot;);&lt;br /&gt;
        if (isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            for (r = 0; r &amp;lt; llGetListLength(agentsInTranslation); r += 4)&lt;br /&gt;
            {&lt;br /&gt;
                tmrtmpStr = llList2String(llGetObjectDetails(llList2Key(agentsInTranslation, r), [OBJECT_POS]), 0);&lt;br /&gt;
                if ((llVecDist(llGetPos(), (vector)tmrtmpStr) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tmrtmpStr != &amp;quot;&amp;quot;))&lt;br /&gt;
                {&lt;br /&gt;
                    tmrnewli = (tmrnewli=[]) + tmrnewli + llList2List(agentsInTranslation, r, r + 3);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            agentsInTranslation = tmrnewli;&lt;br /&gt;
            if ((llGetUnixTime() - lastHeartBeat) &amp;gt;= 5)&lt;br /&gt;
            {&lt;br /&gt;
                //Send heartbeat&lt;br /&gt;
                sendHeartbeat();&lt;br /&gt;
                lastHeartBeat = llGetUnixTime();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            if ((llGetUnixTime() - lastHeartBeat) &amp;gt;= `0 + llGetListLength(agentsInTranslation)*2 + llPow(translatorCount, 1.4) + translatorCount + ((1-llGetRegionTimeDilation()) * 5))&lt;br /&gt;
            {&lt;br /&gt;
                //Send heartbeat&lt;br /&gt;
                sendHeartbeat();&lt;br /&gt;
                lastHeartBeat = llGetUnixTime();&lt;br /&gt;
            }&lt;br /&gt;
        } &lt;br /&gt;
        //turn on and off scanner&lt;br /&gt;
        if ((autoLanguage) &amp;amp;&amp;amp; isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            llSensor(&amp;quot;&amp;quot;, NULL_KEY, AGENT, 20.0, PI);&lt;br /&gt;
        }&lt;br /&gt;
        llSetTimerEvent(4.0); // restart timer&lt;br /&gt;
        //llSetTimerEvent(4 + ((1-llGetRegionTimeDilation()) * 5));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=687823</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=687823"/>
		<updated>2009-12-15T22:48:47Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: /* Universal Translator Engine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribucion al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente codigo fué originalmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mi manera...&lt;br /&gt;
No os riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;Universal Translator Engine&#039;&#039; ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bueno, despues de respiñar todo lo que he podido, creo que el uso de memoria y la velocidad estan practicamente igual que en la version original pero bueno... en la variedad está el gusto no?&lt;br /&gt;
Ya he probado un poco el codigo, y parece que funciona aunque estoy teniendo algunos problemas... Por ejemplo creo que el sistema de traduccion no funciona correctamente, y no me refiero al sistema de traduccion de Google (en mi opinion, si no es el mejor, es uno de los mejores del mundo), sino a que aun queda mucho trabajo por hacer en el script...&lt;br /&gt;
&lt;br /&gt;
El siguiente paso sera intentar dividir el script en dos, o si es posible en tres para repartir el uso de memoria. Tambien me gustaria probar un truco que uso a menudo para traducir paginas en un idioma que no entiendo, lo que hago es que en vez de traducir directamente al español, primero lo traduzco a inglés, y luego desde inglés al español, parece una tonteria y un gasto innecesario, pero si lo hago es porque así suelo entender mejor las traducciones.&lt;br /&gt;
Quiero por un lado el sistema de comunicacion y evaluacion entre traductores, y por otro el sistema de traduccion entre avatares, ¿es muy dificil? no se ya lo veremos...&lt;br /&gt;
&lt;br /&gt;
Well, after saving as much as I could, I think the memory usage and the speed are technically the same as in the original script, but well, in the variety is the taste, isnt it?. &lt;br /&gt;
I have tested a bit the code above already, and it seems to work altought i´m having some problems...&lt;br /&gt;
For instance i think the translation system is not working properly, and i dont mean the Google´s translation system (in my opinion, if is not the best, one of the bests), but that there is still much work to do in the script...&lt;br /&gt;
&lt;br /&gt;
The next step will be to try to divide the script in 2, or 3 if is possible, so we can spread the memory usage. Also I would like to test a trick i use often for to translate languages that i dont understand, what I do first is to translate that language into English, and then from English to Spanish, it seems a nonsense and unnecesary waste, but if i do it is becouse so i usually understand the translations better.&lt;br /&gt;
I want by one part the translators communications and evaluation system, and by other the translation system between avatars, is it very difficult? I doný know , we will see...&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=687813</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=687813"/>
		<updated>2009-12-15T22:39:29Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: /* Universal Translator Engine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribucion al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente codigo fué originalmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mi manera...&lt;br /&gt;
No os riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;Universal Translator Engine&#039;&#039; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//November 12, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Web Server Services powered by Google &lt;br /&gt;
//Variables&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
list agentsInTranslationOptions;&lt;br /&gt;
list requestList;&lt;br /&gt;
integer listenID; &lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
integer showTranslation = FALSE;&lt;br /&gt;
integer tranObjects = TRUE; &lt;br /&gt;
integer lastHeartBeat;&lt;br /&gt;
list    languageCodes = [&lt;br /&gt;
&amp;quot;zh-CN&amp;quot;, &amp;quot;zh-TW&amp;quot;, &amp;quot;hr&amp;quot;,  &lt;br /&gt;
&amp;quot;bg&amp;quot;, &amp;quot;be&amp;quot;, &amp;quot;ca&amp;quot;,&lt;br /&gt;
&amp;quot;af&amp;quot;, &amp;quot;sq&amp;quot;, &amp;quot;ar&amp;quot;,   &lt;br /&gt;
&amp;quot;tl&amp;quot;, &amp;quot;fr&amp;quot;, &amp;quot;gl&amp;quot;,    &lt;br /&gt;
&amp;quot;fi&amp;quot;, &amp;quot;en&amp;quot;, &amp;quot;et&amp;quot;,     &lt;br /&gt;
&amp;quot;cs&amp;quot;, &amp;quot;da&amp;quot;, &amp;quot;nl&amp;quot;,  &lt;br /&gt;
&amp;quot;id&amp;quot;, &amp;quot;ga&amp;quot;, &amp;quot;it&amp;quot;,      &lt;br /&gt;
&amp;quot;hi&amp;quot;, &amp;quot;hu&amp;quot;, &amp;quot;is&amp;quot;, &lt;br /&gt;
&amp;quot;de&amp;quot;, &amp;quot;el&amp;quot;, &amp;quot;iw&amp;quot;,    &lt;br /&gt;
&amp;quot;mt&amp;quot;, &amp;quot;no&amp;quot;, &amp;quot;fa&amp;quot;,   &lt;br /&gt;
&amp;quot;lt&amp;quot;, &amp;quot;mk&amp;quot;, &amp;quot;ms&amp;quot;,   &lt;br /&gt;
&amp;quot;ja&amp;quot;, &amp;quot;ko&amp;quot;, &amp;quot;lv&amp;quot;,   &lt;br /&gt;
&amp;quot;sl&amp;quot;, &amp;quot;es&amp;quot;, &amp;quot;sw&amp;quot;, &lt;br /&gt;
&amp;quot;ru&amp;quot;, &amp;quot;sr&amp;quot;, &amp;quot;sk&amp;quot;, &lt;br /&gt;
&amp;quot;pl&amp;quot;, &amp;quot;pt-PT&amp;quot;, &amp;quot;ro&amp;quot;,&lt;br /&gt;
&amp;quot;yi&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;uk&amp;quot;, &amp;quot;vi&amp;quot;, &amp;quot;cy&amp;quot;,&lt;br /&gt;
&amp;quot;sv&amp;quot;,&amp;quot;th&amp;quot;, &amp;quot;tr&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
list    translators;&lt;br /&gt;
list    sayCache;&lt;br /&gt;
list    sayCachePrivate;&lt;br /&gt;
integer priorityNumber;&lt;br /&gt;
integer priorityNumListenID;&lt;br /&gt;
integer isInitialized = FALSE;&lt;br /&gt;
string  options; &lt;br /&gt;
//Options&lt;br /&gt;
//integer debug = TRUE;&lt;br /&gt;
integer broadcastChannel = -9999999; //note this is not the channel used by the HR Universal Translator&lt;br /&gt;
string  password = &amp;quot;password&amp;quot;; //note this is not the password used to encrypt comms of the HR Universal Translator&lt;br /&gt;
integer version = 190;&lt;br /&gt;
//&lt;br /&gt;
sendIM(key imid, string imstr)&lt;br /&gt;
{&lt;br /&gt;
    if (llGetParcelFlags(llGetPos()) &amp;amp; PARCEL_FLAG_ALLOW_SCRIPTS)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 85234119, imstr, imid); &lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_THIS, 85304563, imstr, imid);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//txTxtLot() = sendTextBatch()&lt;br /&gt;
txTxtLot(integer txch, string txtxt) &lt;br /&gt;
{&lt;br /&gt;
    txtxt = llXorBase64StringsCorrect(llStringToBase64(txtxt), llStringToBase64(password));&lt;br /&gt;
    while (llStringLength(txtxt) &amp;gt; 508) //If string is 509 characters or longer &lt;br /&gt;
    {&lt;br /&gt;
        llSay(txch, llGetSubString(txtxt, 0, 507)); //send 508 character chunk&lt;br /&gt;
        txtxt = llGetSubString(txtxt, 508, -1);  //delete 508 character chunk&lt;br /&gt;
    }&lt;br /&gt;
    llSay(txch, txtxt);  //send out any remainder chunk or original chunk&lt;br /&gt;
    //Perry Mizin Comment: I don´t understand the aim of the following if.    &lt;br /&gt;
    //Hank Ramos Comment: this line serves to &amp;quot;trigger&amp;quot; the receiver not to wait for another batch.  If the&lt;br /&gt;
    //message length is exactly 508 characters, the receiver things that another chunk of the message is coming.&lt;br /&gt;
    //This message serves to tell the receiver that the last chunk was the last chunk, not another regular chunk.&lt;br /&gt;
    if (llStringLength(txtxt) == 508)&lt;br /&gt;
        llSay(txch, (string)(txch*4958654));&lt;br /&gt;
    //Hank Ramos Comment: this just flashes the color of the bottom prim to show a message was sent&lt;br /&gt;
    llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0, 0.25&amp;gt;, &amp;quot;&amp;quot;); &lt;br /&gt;
}  &lt;br /&gt;
//string rxTxtLot() = string receiveTextBatch()&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer rxliPos;&lt;br /&gt;
    string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
    {&lt;br /&gt;
        rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
        rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
        sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
    rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
    return rxmsg;&lt;br /&gt;
}&lt;br /&gt;
//string rxTxtLot() = string receiveTextBatch() (Another way)&lt;br /&gt;
integer rxTxtLotBusy = FALSE; //Perry Mizin: added Busy Mode, this could fail or prevent fail&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    if (rxTxtLotBusy == FALSE)&lt;br /&gt;
    {&lt;br /&gt;
        rxTxtLotBusy = TRUE;&lt;br /&gt;
        integer rxliPos;&lt;br /&gt;
        string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
        if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
        {&lt;br /&gt;
            @rxin;&lt;br /&gt;
            rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
            rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
            sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
            if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
            {&lt;br /&gt;
                 jump rxin;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
        rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
        rxTxtLotBusy = FALSE;&lt;br /&gt;
        return rxmsg;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        //Perry Mizin: llSaySomething?&lt;br /&gt;
        return &amp;quot;&amp;quot;;        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string rxTxtLotPrv() = string receiveTextBatchPrivate()&lt;br /&gt;
string rxTxtLotPrv(key prxid, string prxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer prxliPos;&lt;br /&gt;
    string  prxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCachePrivate, (list)prxid))&lt;br /&gt;
    {&lt;br /&gt;
        prxliPos = llListFindList(sayCachePrivate, [prxid]);&lt;br /&gt;
        prxtmpStr = (prxtmpStr=&amp;quot;&amp;quot;) + prxtmpStr + llList2String(sayCachePrivate, prxliPos + 1);&lt;br /&gt;
        sayCachePrivate = llDeleteSubList(sayCachePrivate, prxliPos, prxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    prxmsg = prxtmpStr + prxmsg;&lt;br /&gt;
    prxmsg = llBase64ToString(llXorBase64StringsCorrect(prxmsg, llStringToBase64(password)));&lt;br /&gt;
    return prxmsg;&lt;br /&gt;
}&lt;br /&gt;
//updateTranslatorList()&lt;br /&gt;
updateTranslatorList()&lt;br /&gt;
{&lt;br /&gt;
    integer nx;&lt;br /&gt;
    integer xliLng;&lt;br /&gt;
    list    newList;&lt;br /&gt;
    string  tmpStrPos;&lt;br /&gt;
    integer newMaster;&lt;br /&gt;
    //Scan and remove translators not in the area&lt;br /&gt;
    xliLng = llGetListLength(translators);&lt;br /&gt;
    for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
    {&lt;br /&gt;
        tmpStrPos = llList2String(llGetObjectDetails(llList2Key(translators, nx + 1), [OBJECT_POS]), 0);&lt;br /&gt;
        if ((llVecDist(llGetPos(), (vector)tmpStrPos) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tmpStrPos != &amp;quot;&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            newList = (newList=[]) + newList +  llList2List(translators, nx, nx + 1);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    translators = newList;&lt;br /&gt;
    //llMessageLinked(LINK_THIS,65635544,(string)xliLng,&amp;quot;&amp;quot;); Perry Mizin: what is this necesary for?&lt;br /&gt;
    if (translators == [])&lt;br /&gt;
    {&lt;br /&gt;
        newMaster = 1;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        if (enabled)&lt;br /&gt;
        {&lt;br /&gt;
            xliLng = llGetListLength(translators);&lt;br /&gt;
            newMaster = 2;&lt;br /&gt;
            for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
            {&lt;br /&gt;
                //llOwnerSay(&amp;quot;Checking Priority Number(&amp;quot; +  (string)priorityNumber + &amp;quot;): &amp;quot; + (string)llList2Integer(translators, x));&lt;br /&gt;
                if (llList2Integer(translators, nx) &amp;gt; priorityNumber)&lt;br /&gt;
                {&lt;br /&gt;
                    newMaster = 0;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            newMaster = 0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster &amp;gt; 0) &amp;amp;&amp;amp; (newMaster == 0))&lt;br /&gt;
    {&lt;br /&gt;
        //We are being demoted from master to slave&lt;br /&gt;
        //Flush agentsInTranslation to master&lt;br /&gt;
        if (agentsInTranslation != [])&lt;br /&gt;
        {&lt;br /&gt;
            //Demotion Dump of agentsInTranslation to Master&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1003, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
            if (isInitialized == FALSE)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1004, options])); //error&lt;br /&gt;
        }&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster == 0) &amp;amp;&amp;amp; (newMaster &amp;gt; 0))&lt;br /&gt;
    {&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
        listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); &lt;br /&gt;
    }&lt;br /&gt;
    isMaster = newMaster;&lt;br /&gt;
    llMessageLinked(LINK_THIS, 34829304, (string)isMaster, &amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
//sendHeartbeat()&lt;br /&gt;
sendHeartbeat()&lt;br /&gt;
{&lt;br /&gt;
    updateTranslatorList();&lt;br /&gt;
    txTxtLot(broadcastChannel, llList2CSV([1001, priorityNumber]));&lt;br /&gt;
    //Broadcast agentList to Slaves&lt;br /&gt;
    if (isMaster == 2)&lt;br /&gt;
    {&lt;br /&gt;
        txTxtLot(broadcastChannel, llList2CSV([1002, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//checkThrottle()&lt;br /&gt;
checkThrottle(integer chkn, string chkmsg, list chkli)&lt;br /&gt;
{&lt;br /&gt;
    integer y;&lt;br /&gt;
    integer maxCount;&lt;br /&gt;
    float   chkoldTime;&lt;br /&gt;
    float   sleepTime;&lt;br /&gt;
    list    chknewli;&lt;br /&gt;
    key     returnValue;&lt;br /&gt;
    integer channelToSpeak; &lt;br /&gt;
    //loop though list and remove items older than 25 seconds&lt;br /&gt;
    for (y = 0; y &amp;lt; llGetListLength(requestList); y += 1)&lt;br /&gt;
    {&lt;br /&gt;
        chkoldTime = llList2Float(requestList, y);&lt;br /&gt;
        //Construct new list with only times less than 25 seconds&lt;br /&gt;
        if ((llGetTime() - chkoldTime) &amp;lt;= 25.0)&lt;br /&gt;
        { &lt;br /&gt;
            chknewli = (chknewli=[]) + chknewli + [chkoldTime];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    requestList = chknewli; &lt;br /&gt;
    y = llGetListLength(requestList);&lt;br /&gt;
    //Shunt all translations to linked translators if master&lt;br /&gt;
    if (isMaster == 2)&lt;br /&gt;
    {&lt;br /&gt;
        if (chkn == 0)&lt;br /&gt;
        {&lt;br /&gt;
            //Send HTTP request to other translator&lt;br /&gt;
            //Send out Request to Random Translator Channel&lt;br /&gt;
            channelToSpeak = llList2Integer(llListRandomize(llList2ListStrided(translators, 0, -1, 2), 1), 0);&lt;br /&gt;
            if (channelToSpeak &amp;gt; 0) &lt;br /&gt;
            {&lt;br /&gt;
                txTxtLot(channelToSpeak, llList2CSV([chkn, llList2CSV(chkli)]) + &amp;quot;~&amp;quot; + chkmsg);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if (y == 19)&lt;br /&gt;
    {&lt;br /&gt;
        sleepTime =  25.0 - (llGetTime() - llList2Float(requestList, 0));&lt;br /&gt;
        if (sleepTime &amp;gt; 0) &lt;br /&gt;
        {&lt;br /&gt;
            llSleep(sleepTime);&lt;br /&gt;
        }&lt;br /&gt;
        requestList = llDeleteSubList(requestList, 0, 0);&lt;br /&gt;
    }&lt;br /&gt;
    if (chkn == 0)&lt;br /&gt;
    {&lt;br /&gt;
        chkmsg = &amp;quot;translate?v=1.0&amp;amp;q=&amp;quot; + chkmsg;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        chkmsg = &amp;quot;detect?v=1.0&amp;amp;q=&amp;quot; + chkmsg;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    requestList = (requestList=[]) + requestList + (list)llGetTime();&lt;br /&gt;
    returnValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/&amp;quot; + chkmsg, [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot; &amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
    if (returnValue != NULL_KEY)&lt;br /&gt;
    {&lt;br /&gt;
        if (chkn == 0)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS, 235365342, llList2CSV(chkli), returnValue); &lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS, 235365343, llList2CSV(chkli), returnValue); &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llSleep(40.0); //Something has gone horribly wrong, sleep 40 seconds to clear throttle&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string checkLanguage()&lt;br /&gt;
string checkLanguage(string chklantmpStr)&lt;br /&gt;
{&lt;br /&gt;
    if (llGetSubString(chklantmpStr, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else if (chklantmpStr == &amp;quot;und&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;el&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if (~llListFindList(languageCodes, [chklantmpStr]))&lt;br /&gt;
    {&lt;br /&gt;
 &lt;br /&gt;
    } else {&lt;br /&gt;
        chklantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    chklantmpStr = llGetSubString(chklantmpStr, 0, 1);&lt;br /&gt;
    return chklantmpStr;&lt;br /&gt;
}&lt;br /&gt;
//addAgent()&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
    integer avliPos;&lt;br /&gt;
    integer idNum;&lt;br /&gt;
    if (llListFindList(agentsInTranslation, (list)avid) != 911)&lt;br /&gt;
    {&lt;br /&gt;
        avliPos = llListFindList(agentsInTranslation, [avid]);&lt;br /&gt;
        agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, chklan], avliPos + 1, avliPos + 2);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        @yes;&lt;br /&gt;
        idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
        if(llListFindList(agentsInTranslation, (list)idNum) != 911)&lt;br /&gt;
        {//it exists       &lt;br /&gt;
            jump at;&lt;br /&gt;
        }&lt;br /&gt;
        agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, chklan, idNum];&lt;br /&gt;
        llMessageLinked(LINK_THIS, 64562349, avlan, avid);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string addNewAgent()&lt;br /&gt;
string addNewAgent(key newavid)&lt;br /&gt;
{&lt;br /&gt;
    string speakerLan;&lt;br /&gt;
 &lt;br /&gt;
    if (llGetAgentSize(newavid) != ZERO_VECTOR)&lt;br /&gt;
    {&lt;br /&gt;
        speakerLan  = checkLanguage(llGetAgentLanguage(newavid));&lt;br /&gt;
        if (speakerLan == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
            addAgent(newavid, speakerLan, TRUE);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            addAgent(newavid, speakerLan, FALSE);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return speakerLan;&lt;br /&gt;
}&lt;br /&gt;
//key getAgentKey()&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
    if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
    {&lt;br /&gt;
        integer gkliPos = llListFindList(agentsInTranslation, [agentID]);&lt;br /&gt;
        return llList2Key(agentsInTranslation, gkliPos - 3);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//processHTTPResponse()&lt;br /&gt;
processHTTPResponse(integer ntype, string bodyStr, list paramsli)&lt;br /&gt;
{&lt;br /&gt;
    integer spkliPos;&lt;br /&gt;
    list    recepientList;&lt;br /&gt;
    key     recepientID;&lt;br /&gt;
    string  recepientLanguage;&lt;br /&gt;
    string  languagePair;&lt;br /&gt;
    key     speakerID;&lt;br /&gt;
    string  speakerName;&lt;br /&gt;
    string  speakerLanguage;&lt;br /&gt;
    string  translatedText;&lt;br /&gt;
    string  lantmpStr;&lt;br /&gt;
    integer z;&lt;br /&gt;
    integer speakerLanguageReliable;&lt;br /&gt;
    float   speakerLanguageConfidence;&lt;br /&gt;
    list    paramtmpli;&lt;br /&gt;
    //===================&lt;br /&gt;
    //Process Translation&lt;br /&gt;
    //===================&lt;br /&gt;
    if (ntype == 0)&lt;br /&gt;
    {&lt;br /&gt;
        speakerID  = llList2Key(paramsli, 1);&lt;br /&gt;
        speakerName = llKey2Name(speakerID);&lt;br /&gt;
        if (speakerName == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
        }&lt;br /&gt;
        recepientList = llParseString2List(llList2String(paramsli, 2), [&amp;quot;@&amp;quot;], []);&lt;br /&gt;
        paramtmpli = llParseStringKeepNulls(llList2String(paramsli, 3), [&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
        recepientLanguage = llList2String(paramtmpli, 1);&lt;br /&gt;
        languagePair = llDumpList2String(paramtmpli, &amp;quot;&amp;gt;&amp;gt;&amp;quot;); &lt;br /&gt;
        //Perform Text Cleanup&lt;br /&gt;
        z = llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;detectedSourceLanguage\&amp;quot;:\&amp;quot;&amp;quot;); &lt;br /&gt;
        if (z != -1)&lt;br /&gt;
        {&lt;br /&gt;
            translatedText  = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, z);&lt;br /&gt;
            speakerLanguage = checkLanguage(llGetSubString(bodyStr, z + 28, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;}, \&amp;quot;responseDetails\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
            spkliPos = llListFindList(agentsInTranslation, [speakerID]);&lt;br /&gt;
            if (spkliPos &amp;gt;= 0)&lt;br /&gt;
            {&lt;br /&gt;
                if (speakerLanguage != llList2String(agentsInTranslation, spkliPos + 1))&lt;br /&gt;
                {&lt;br /&gt;
                    agentsInTranslation = llListReplaceList(agentsInTranslation, [TRUE], spkliPos + 2, spkliPos + 2);  //Mark for recheck of actual spoken language.&lt;br /&gt;
                }&lt;br /&gt;
            }                   &lt;br /&gt;
        }&lt;br /&gt;
        else if (z == -1)&lt;br /&gt;
        {&lt;br /&gt;
            translatedText = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;}, \&amp;quot;responseDetails\&amp;quot;&amp;quot;));&lt;br /&gt;
        }&lt;br /&gt;
        //Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
        if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            lantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
            //Perry Mizin Comment: Probably I guess this is wrong, maybe I am wrong&lt;br /&gt;
            //Perry Mizin Comment: alternative reverse order: &amp;quot;Hello World&amp;quot; could be &amp;quot;World Hello&amp;quot;&lt;br /&gt;
            //Perry Mizin Comment: reverse order: &amp;quot;Hello World&amp;quot; is &amp;quot;dlroW olleH&amp;quot; or ,,pl^ºM ºllªH,,&lt;br /&gt;
            for(z = llStringLength(translatedText);z &amp;gt;= 0; z--)&lt;br /&gt;
            {&lt;br /&gt;
                lantmpStr = (lantmpStr=&amp;quot;&amp;quot;) + lantmpStr + llGetSubString(translatedText, z, z); &lt;br /&gt;
            }&lt;br /&gt;
            translatedText = lantmpStr;&lt;br /&gt;
        }   &lt;br /&gt;
        lantmpStr = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
        if (showTranslation)&lt;br /&gt;
        {&lt;br /&gt;
            sendIM(speakerID, lantmpStr);&lt;br /&gt;
        } &lt;br /&gt;
        for (z = 0; z &amp;lt; llGetListLength(recepientList); z += 1)&lt;br /&gt;
        {&lt;br /&gt;
            recepientID = getAgentKey(llList2Integer(recepientList, z));&lt;br /&gt;
            if (recepientID != &amp;quot;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, [recepientID]) + 1);&lt;br /&gt;
                if (recepientLanguage != speakerLanguage)&lt;br /&gt;
                {&lt;br /&gt;
                    sendIM(recepientID, lantmpStr);&lt;br /&gt;
                }&lt;br /&gt;
            }  &lt;br /&gt;
        }&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    //===========================&lt;br /&gt;
    //Process Language Detection&lt;br /&gt;
    //===========================&lt;br /&gt;
    if (ntype == 1)&lt;br /&gt;
    {&lt;br /&gt;
        speakerID = llList2Key(paramsli, 1);&lt;br /&gt;
        speakerLanguageReliable = llToLower(llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) + 15, llSubStringIndex(bodyStr, &amp;quot;,\&amp;quot;confidence\&amp;quot;:&amp;quot;) - 1)) == &amp;quot;true&amp;quot;;&lt;br /&gt;
        speakerLanguageConfidence = (float)llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;,\&amp;quot;confidence\&amp;quot;:&amp;quot;) + 14, llSubStringIndex(bodyStr, &amp;quot;}, \&amp;quot;responseDetails\&amp;quot;:&amp;quot;) - 1);&lt;br /&gt;
 &lt;br /&gt;
        spkliPos = llListFindList(agentsInTranslation, [speakerID]);&lt;br /&gt;
        if (((spkliPos &amp;lt; 0) &amp;amp;&amp;amp; (speakerLanguageReliable) || (speakerLanguageConfidence &amp;gt;= 0.08)))&lt;br /&gt;
        {&lt;br /&gt;
            //Analyze Data&lt;br /&gt;
            lantmpStr = checkLanguage(llToLower(llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1)));&lt;br /&gt;
            if (lantmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            } &lt;br /&gt;
            if (speakerLanguageConfidence &amp;lt; 0.14)&lt;br /&gt;
            {&lt;br /&gt;
                addAgent(speakerID, lantmpStr, TRUE);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                addAgent(speakerID, lantmpStr, FALSE);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        //Multiplexor Initialization&lt;br /&gt;
        priorityNumber = version*1000000 + llRound(llFrand(499999) + 50000);&lt;br /&gt;
        llListen(broadcastChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        priorityNumListenID = llListen(priorityNumber, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
        //Send out initial heartbeat&lt;br /&gt;
        lastHeartBeat = llGetUnixTime();&lt;br /&gt;
        txTxtLot(broadcastChannel, llList2CSV([1001, priorityNumber]));&lt;br /&gt;
 &lt;br /&gt;
        //Wait for the network to settle down&lt;br /&gt;
        llSetTimerEvent(5.0); &lt;br /&gt;
        //llSetTimerEvent(10 + ((1-llGetRegionTimeDilation()) * 1));       &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
    {&lt;br /&gt;
        list    ltmpli;&lt;br /&gt;
&lt;br /&gt;
        //Old Multiplexor&lt;br /&gt;
        if (num == 8434532)&lt;br /&gt;
        {&lt;br /&gt;
            enabled = (integer)lstr;&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 3342976)&lt;br /&gt;
        {&lt;br /&gt;
            //Send Preferences&lt;br /&gt;
            options = lstr;&lt;br /&gt;
            if (isInitialized == FALSE) return;&lt;br /&gt;
            ltmpli = llCSV2List(options);&lt;br /&gt;
            showTranslation = llList2Integer(ltmpli, 0);&lt;br /&gt;
            tranObjects = llList2Integer(ltmpli, 1);&lt;br /&gt;
            autoLanguage = llList2Integer(ltmpli, 2);&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1004, options]));&lt;br /&gt;
 &lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 9384610)&lt;br /&gt;
        {&lt;br /&gt;
            if (isMaster == 0) //markering&lt;br /&gt;
                //llMessageLinked(LINK_THIS, 5598321, llList2CSV([id, str, FALSE]), &amp;quot;&amp;quot;);&lt;br /&gt;
                txTxtLot(broadcastChannel, llList2CSV([1003, lid, lstr, FALSE]));&lt;br /&gt;
            else&lt;br /&gt;
                addAgent(lid, lstr, TRUE);&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 345149625)&lt;br /&gt;
        {&lt;br /&gt;
            //Return Translation&lt;br /&gt;
            processHTTPResponse(0, lstr, llCSV2List(lid));&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 345149626)&lt;br /&gt;
        {&lt;br /&gt;
            //Return Detection&lt;br /&gt;
            processHTTPResponse(1, lstr, llCSV2List(lid));&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    sensor(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        integer s;&lt;br /&gt;
        key     sid;&lt;br /&gt;
 &lt;br /&gt;
        for (s = 0; s &amp;lt; num_detected; s += 1)&lt;br /&gt;
        {&lt;br /&gt;
            sid = llDetectedKey(s);&lt;br /&gt;
            if (~llListFindList(agentsInTranslation, (list)sid))&lt;br /&gt;
            {                &lt;br /&gt;
            }else{&lt;br /&gt;
                addNewAgent(sid);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        integer w;&lt;br /&gt;
        string  spkrLan;&lt;br /&gt;
        string  recepLan;&lt;br /&gt;
        integer recepID;&lt;br /&gt;
        integer lstliPos;&lt;br /&gt;
        string  lanpair;&lt;br /&gt;
        list    translationCache;&lt;br /&gt;
        list    lsttmpli;&lt;br /&gt;
        integer ImessageType;&lt;br /&gt;
        string  Imessage;&lt;br /&gt;
        string  lsttmpStr;&lt;br /&gt;
        string  lst2tmpStr;&lt;br /&gt;
 &lt;br /&gt;
        //Multiplexor Code&lt;br /&gt;
        if ((channel == broadcastChannel) || (channel == priorityNumber))&lt;br /&gt;
        {&lt;br /&gt;
            //==========================&lt;br /&gt;
            //Process Proxy HTTP Request&lt;br /&gt;
            //==========================&lt;br /&gt;
 &lt;br /&gt;
            if (channel == priorityNumber)&lt;br /&gt;
            {&lt;br /&gt;
                if (llStringLength(message) &amp;gt;= 508)&lt;br /&gt;
                {&lt;br /&gt;
                    if (((integer)message/channel) != 4958654)&lt;br /&gt;
                    {&lt;br /&gt;
                        sayCachePrivate = (sayCachePrivate=[]) + sayCachePrivate + [id, message];&lt;br /&gt;
                        return; &lt;br /&gt;
                    }&lt;br /&gt;
                    message = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                message = rxTxtLotPrv(id, message);&lt;br /&gt;
                //Received packet to translate&lt;br /&gt;
                llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0.05, 0.25&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
                lsttmpli = llParseString2List(message, [&amp;quot;~&amp;quot;], []);&lt;br /&gt;
                lsttmpStr = llList2String(lsttmpli, 0);&lt;br /&gt;
                lsttmpli = llDeleteSubList(lsttmpli, 0, 0);&lt;br /&gt;
 &lt;br /&gt;
                lst2tmpStr = llDumpList2String(lsttmpli, &amp;quot;|&amp;quot;);&lt;br /&gt;
                lsttmpli = llCSV2List(lsttmpStr);&lt;br /&gt;
                lstliPos = llList2Integer(lsttmpli, 0);&lt;br /&gt;
                lsttmpli = llDeleteSubList(lsttmpli, 0, 0);&lt;br /&gt;
 &lt;br /&gt;
                checkThrottle(lstliPos, lst2tmpStr, lsttmpli);&lt;br /&gt;
 &lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
            //=======================&lt;br /&gt;
            //Process Global Messages&lt;br /&gt;
            //=======================&lt;br /&gt;
            if (llStringLength(message) &amp;gt;= 508)&lt;br /&gt;
            {&lt;br /&gt;
                if (((integer)message/channel) != 4958654)&lt;br /&gt;
                {&lt;br /&gt;
                    sayCache = (sayCache=[]) + sayCache + [id, message];&lt;br /&gt;
                    return; &lt;br /&gt;
                }&lt;br /&gt;
                message = &amp;quot;&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            message = rxTxtLot(id, message);&lt;br /&gt;
 &lt;br /&gt;
            lsttmpli = llCSV2List(message);&lt;br /&gt;
 &lt;br /&gt;
            if (llGetListLength(lsttmpli) &amp;gt;= 2)    &lt;br /&gt;
            {&lt;br /&gt;
                ImessageType = llList2Integer(lsttmpli, 0);&lt;br /&gt;
                lsttmpli = llDeleteSubList(lsttmpli, 0, 0);&lt;br /&gt;
                Imessage = llList2CSV(lsttmpli);        &lt;br /&gt;
 &lt;br /&gt;
                llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0, 0.25&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
                //Process Message Here&lt;br /&gt;
                if (ImessageType == 1001)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming Heartbeat&lt;br /&gt;
                    if ((integer)Imessage == priorityNumber)&lt;br /&gt;
                    {&lt;br /&gt;
                        llOwnerSay(&amp;quot;Priority Number Conflict!  Resetting Script...&amp;quot;);&lt;br /&gt;
                        llResetScript(); //Reset if conflicting priority number&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    if (~llListFindList(translators, (list)id)  //lstliPos &amp;lt; 0) &lt;br /&gt;
                    {&lt;br /&gt;
                        lstliPos = llListFindList(translators, [id]);&lt;br /&gt;
                        translators = llListReplaceList(translators, [(integer)Imessage], lstliPos - 1, lstliPos - 1);                        &lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                       translators = (translators=[]) + translators + [(integer)Imessage, id];&lt;br /&gt;
                        if ((isMaster &amp;gt; 0) &amp;amp;&amp;amp; (isInitialized))&lt;br /&gt;
                        {&lt;br /&gt;
                            txTxtLot((integer)Imessage, llList2CSV([1002, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
                            txTxtLot((integer)Imessage, llList2CSV([1004, options]));&lt;br /&gt;
                        } &lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if (ImessageType == 1002)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming agentsInTranslation Master Broadcast&lt;br /&gt;
                    if (isMaster == 0)&lt;br /&gt;
                    {&lt;br /&gt;
                        //llMessageLinked(LINK_THIS, 9458021, Imessage, &amp;quot;&amp;quot;);  &lt;br /&gt;
                        lsttmpli = llCSV2List(Imessage);&lt;br /&gt;
                        agentsInTranslation = [];&lt;br /&gt;
                        for (w = 0; w &amp;lt; llGetListLength(lsttmpli); w += 4)&lt;br /&gt;
                        {&lt;br /&gt;
                            agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [llList2Key(lsttmpli, w), llList2String(lsttmpli, w + 1), llList2Integer(lsttmpli, w + 2), llList2Integer(lsttmpli, w + 3)];&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if (ImessageType == 1003)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming agentsInTranslation dump from Slave&lt;br /&gt;
                    lsttmpli = llCSV2List(Imessage);&lt;br /&gt;
                    for (w = 0; w &amp;lt; llGetListLength(lsttmpli); w += 4)&lt;br /&gt;
                    {&lt;br /&gt;
                        addAgent(llList2Key(lsttmpli, w), llList2String(lsttmpli, w + 1), llList2Integer(lsttmpli, w + 2));&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if (ImessageType == 1004)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming Preferences&lt;br /&gt;
                    options = Imessage;&lt;br /&gt;
                    lsttmpli = llCSV2List(options);&lt;br /&gt;
                    showTranslation = llList2Integer(lsttmpli, 0);&lt;br /&gt;
                    tranObjects = llList2Integer(lsttmpli, 1);&lt;br /&gt;
                    autoLanguage = llList2Integer(lsttmpli, 2);&lt;br /&gt;
 &lt;br /&gt;
                    llMessageLinked(LINK_THIS, 3342977, Imessage, &amp;quot;&amp;quot;);  &lt;br /&gt;
                }&lt;br /&gt;
            }            &lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        //Translator Engine Code&lt;br /&gt;
        if ((llToLower(message) == &amp;quot;translator&amp;quot;) &amp;amp;&amp;amp; (isMaster &amp;gt; 0)) &lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS, 2540664, message, id);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ((!enabled) &amp;amp;&amp;amp; (isMaster == 1)) return;&lt;br /&gt;
 &lt;br /&gt;
        if (!tranObjects)&lt;br /&gt;
        {&lt;br /&gt;
            if (llGetAgentSize(id) == ZERO_VECTOR) return;&lt;br /&gt;
        } &lt;br /&gt;
        &lt;br /&gt;
        if (~llListFindList(agentsInTranslation, (list)id)) //lstliPos &amp;gt;= 0)&lt;br /&gt;
        {&lt;br /&gt;
            lstliPos = llListFindList(agentsInTranslation, (list)id);            &lt;br /&gt;
            spkrLan = llList2String(agentsInTranslation, lstliPos + 1);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            spkrLan = addNewAgent(id);&lt;br /&gt;
        } &lt;br /&gt;
        if (spkrLan == &amp;quot;xx&amp;quot;) return;  //Agent Opt-Out&lt;br /&gt;
         &lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;1, 1, 0&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
        //===============================&lt;br /&gt;
        //Formulate Translation Requests&lt;br /&gt;
        //===============================&lt;br /&gt;
        for (w = 0; w &amp;lt; llGetListLength(agentsInTranslation); w += 4)&lt;br /&gt;
        {&lt;br /&gt;
            //Loop through translation group and do appropriate translations as needed&lt;br /&gt;
            recepID = llList2Integer(agentsInTranslation, w + 3);&lt;br /&gt;
            recepLan =  checkLanguage(llList2Key(agentsInTranslation, w + 1)); &lt;br /&gt;
            if ((spkrLan != recepLan) &amp;amp;&amp;amp; (recepLan != &amp;quot;&amp;quot;) &amp;amp;&amp;amp; (recepLan != &amp;quot;xx&amp;quot;))&lt;br /&gt;
            {&lt;br /&gt;
                lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
 &lt;br /&gt;
                &lt;br /&gt;
                if (~llListFindList(translationCache, (list)lanpair)) //lstliPos &amp;lt; 0)&lt;br /&gt;
                {&lt;br /&gt;
                  lstliPos = llListFindList(translationCache, [lanpair]);&lt;br /&gt;
                  translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
                  &lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                  translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        } &lt;br /&gt;
        //Process Requests&lt;br /&gt;
        if (translationCache != [])&lt;br /&gt;
        {&lt;br /&gt;
            for (w = 0; w &amp;lt; llGetListLength(translationCache); w += 2)&lt;br /&gt;
            {&lt;br /&gt;
                //====================================&lt;br /&gt;
                //Translation&lt;br /&gt;
                //====================================&lt;br /&gt;
                //Forumulate and Send Translation Request&lt;br /&gt;
                lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, w), [&amp;quot;|&amp;quot;],[]), 1); &lt;br /&gt;
                checkThrottle(0, llEscapeURL(message) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, w + 1), llList2String(translationCache, w)]);&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
            spkrLan = &amp;quot;&amp;quot;; &lt;br /&gt;
        //====================================&lt;br /&gt;
        //Language Detection&lt;br /&gt;
        //====================================&lt;br /&gt;
        if (llGetAgentSize(id) != ZERO_VECTOR) //llList2Key(llGetObjectDetails(id, [OBJECT_CREATOR]), 0) == NULL_KEY)&lt;br /&gt;
        {&lt;br /&gt;
            if (((spkrLan == &amp;quot;&amp;quot;) || (llList2Integer(agentsInTranslation, llListFindList(agentsInTranslation, [id]) + 2) == TRUE)) || (isMaster == 2))&lt;br /&gt;
            {&lt;br /&gt;
                //Forumulate and Send Language Detect Request&lt;br /&gt;
                checkThrottle(1, llEscapeURL(message), [llGetTime(), id]);&lt;br /&gt;
            }       &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
    {&lt;br /&gt;
        string  htttmpStr; &lt;br /&gt;
        if (status != 200) &lt;br /&gt;
        {&lt;br /&gt;
            //llOwnerSay(&amp;quot;WWW Error:&amp;quot; + (string)status);&lt;br /&gt;
            llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;1, 0, 0&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
            //llOwnerSay(body);&lt;br /&gt;
            return;&lt;br /&gt;
        } &lt;br /&gt;
        //Process Resonse Code&lt;br /&gt;
        htttmpStr = llGetSubString(body, llSubStringIndex(body, &amp;quot;\&amp;quot;responseStatus\&amp;quot;:&amp;quot;), -1);&lt;br /&gt;
        status = (integer)llGetSubString(htttmpStr, 17, llSubStringIndex(htttmpStr, &amp;quot;}&amp;quot;) - 1);&lt;br /&gt;
        if (status != 200)&lt;br /&gt;
        {&lt;br /&gt;
            //llOwnerSay(&amp;quot;Language Server Returned Error Code: &amp;quot; + (string)status);&lt;br /&gt;
            //llOwnerSay(body);&lt;br /&gt;
            llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;1, 0, 0&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0, 0, 1&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
        llMessageLinked(LINK_THIS, 345149624, body, request_id);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(0.0);  // timer reset&lt;br /&gt;
        integer r;&lt;br /&gt;
        string  tmrtmpStr;&lt;br /&gt;
        list    tmrnewli;&lt;br /&gt;
        integer translatorCount = llGetListLength(translators)/2; &lt;br /&gt;
        if (isInitialized == FALSE)&lt;br /&gt;
        {&lt;br /&gt;
            enabled = TRUE;&lt;br /&gt;
            listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); &lt;br /&gt;
            llListen(777, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
            llMessageLinked(LINK_THIS, 6877259, (string)enabled, NULL_KEY);&lt;br /&gt;
            isInitialized = TRUE;&lt;br /&gt;
        } &lt;br /&gt;
        llMessageLinked(LINK_THIS, 94558323, llList2CSV(agentsInTranslation), &amp;quot;&amp;quot;);&lt;br /&gt;
        if (isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            for (r = 0; r &amp;lt; llGetListLength(agentsInTranslation); r += 4)&lt;br /&gt;
            {&lt;br /&gt;
                tmrtmpStr = llList2String(llGetObjectDetails(llList2Key(agentsInTranslation, r), [OBJECT_POS]), 0);&lt;br /&gt;
                if ((llVecDist(llGetPos(), (vector)tmrtmpStr) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tmrtmpStr != &amp;quot;&amp;quot;))&lt;br /&gt;
                {&lt;br /&gt;
                    tmrnewli = (tmrnewli=[]) + tmrnewli + llList2List(agentsInTranslation, r, r + 3);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            agentsInTranslation = tmrnewli;&lt;br /&gt;
            if ((llGetUnixTime() - lastHeartBeat) &amp;gt;= 5)&lt;br /&gt;
            {&lt;br /&gt;
                //Send heartbeat&lt;br /&gt;
                sendHeartbeat();&lt;br /&gt;
                lastHeartBeat = llGetUnixTime();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            if ((llGetUnixTime() - lastHeartBeat) &amp;gt;= `0 + llGetListLength(agentsInTranslation)*2 + llPow(translatorCount, 1.4) + translatorCount + ((1-llGetRegionTimeDilation()) * 5))&lt;br /&gt;
            {&lt;br /&gt;
                //Send heartbeat&lt;br /&gt;
                sendHeartbeat();&lt;br /&gt;
                lastHeartBeat = llGetUnixTime();&lt;br /&gt;
            }&lt;br /&gt;
        } &lt;br /&gt;
        //turn on and off scanner&lt;br /&gt;
        if ((autoLanguage) &amp;amp;&amp;amp; isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            llSensor(&amp;quot;&amp;quot;, NULL_KEY, AGENT, 20.0, PI);&lt;br /&gt;
        }&lt;br /&gt;
        llSetTimerEvent(4.0); // restart timer&lt;br /&gt;
        //llSetTimerEvent(4 + ((1-llGetRegionTimeDilation()) * 5));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bueno, despues de respiñar todo lo que he podido, creo que el uso de memoria y la velocidad estan practicamente igual que en la version original pero bueno... en la variedad está el gusto no?&lt;br /&gt;
Ya he probado un poco el codigo, y parece que funciona aunque estoy teniendo algunos problemas... Por ejemplo creo que el sistema de traduccion no funciona correctamente, y no me refiero al sistema de traduccion de Google (en mi opinion, si no es el mejor, es uno de los mejores del mundo), sino a que aun queda mucho trabajo por hacer en el script...&lt;br /&gt;
&lt;br /&gt;
El siguiente paso sera intentar dividir el script en dos, o si es posible en tres para repartir el uso de memoria. Tambien me gustaria probar un truco que uso a menudo para traducir paginas en un idioma que no entiendo, lo que hago es que en vez de traducir directamente al español, primero lo traduzco a inglés, y luego desde inglés al español, parece una tonteria y un gasto innecesario, pero si lo hago es porque así suelo entender mejor las traducciones.&lt;br /&gt;
Quiero por un lado el sistema de comunicacion y evaluacion entre traductores, y por otro el sistema de traduccion entre avatares, ¿es muy dificil? no se ya lo veremos...&lt;br /&gt;
&lt;br /&gt;
Well, after saving as much as I could, I think the memory usage and the speed are technically the same as in the original script, but well, in the variety is the taste, isnt it?. &lt;br /&gt;
I have tested a bit the code above already, and it seems to work altought i´m having some problems...&lt;br /&gt;
For instance i think the translation system is not working properly, and i dont mean the Google´s translation system (in my opinion, if is not the best, one of the bests), but that there is still much work to do in the script...&lt;br /&gt;
&lt;br /&gt;
The next step will be to try to divide the script in 2, or 3 if is possible, so we can spread the memory usage. Also I would like to test a trick i use often for to translate languages that i dont understand, what I do first is to translate that language into English, and then from English to Spanish, it seems a nonsense and unnecesary waste, but if i do it is becouse so i usually understand the translations better.&lt;br /&gt;
I want by one part the translators communications and evaluation system, and by other the translation system between avatars, is it very difficult? I doný know , we will see...&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=687622</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=687622"/>
		<updated>2009-12-15T15:32:43Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: /* Universal Translator Engine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribucion al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente codigo fué originalmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mi manera...&lt;br /&gt;
No os riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;Universal Translator Engine&#039;&#039; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//November 12, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Web Server Services powered by Google &lt;br /&gt;
//Variables&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
list agentsInTranslationOptions;&lt;br /&gt;
list requestList;&lt;br /&gt;
integer listenID; &lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
integer showTranslation = FALSE;&lt;br /&gt;
integer tranObjects = TRUE; &lt;br /&gt;
integer lastHeartBeat;&lt;br /&gt;
list    languageCodes = [&lt;br /&gt;
&amp;quot;zh-CN&amp;quot;, &amp;quot;zh-TW&amp;quot;, &amp;quot;hr&amp;quot;,  &lt;br /&gt;
&amp;quot;bg&amp;quot;, &amp;quot;be&amp;quot;, &amp;quot;ca&amp;quot;,&lt;br /&gt;
&amp;quot;af&amp;quot;, &amp;quot;sq&amp;quot;, &amp;quot;ar&amp;quot;,   &lt;br /&gt;
&amp;quot;tl&amp;quot;, &amp;quot;fr&amp;quot;, &amp;quot;gl&amp;quot;,    &lt;br /&gt;
&amp;quot;fi&amp;quot;, &amp;quot;en&amp;quot;, &amp;quot;et&amp;quot;,     &lt;br /&gt;
&amp;quot;cs&amp;quot;, &amp;quot;da&amp;quot;, &amp;quot;nl&amp;quot;,  &lt;br /&gt;
&amp;quot;id&amp;quot;, &amp;quot;ga&amp;quot;, &amp;quot;it&amp;quot;,      &lt;br /&gt;
&amp;quot;hi&amp;quot;, &amp;quot;hu&amp;quot;, &amp;quot;is&amp;quot;, &lt;br /&gt;
&amp;quot;de&amp;quot;, &amp;quot;el&amp;quot;, &amp;quot;iw&amp;quot;,    &lt;br /&gt;
&amp;quot;mt&amp;quot;, &amp;quot;no&amp;quot;, &amp;quot;fa&amp;quot;,   &lt;br /&gt;
&amp;quot;lt&amp;quot;, &amp;quot;mk&amp;quot;, &amp;quot;ms&amp;quot;,   &lt;br /&gt;
&amp;quot;ja&amp;quot;, &amp;quot;ko&amp;quot;, &amp;quot;lv&amp;quot;,   &lt;br /&gt;
&amp;quot;sl&amp;quot;, &amp;quot;es&amp;quot;, &amp;quot;sw&amp;quot;, &lt;br /&gt;
&amp;quot;ru&amp;quot;, &amp;quot;sr&amp;quot;, &amp;quot;sk&amp;quot;, &lt;br /&gt;
&amp;quot;pl&amp;quot;, &amp;quot;pt-PT&amp;quot;, &amp;quot;ro&amp;quot;,&lt;br /&gt;
&amp;quot;yi&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;uk&amp;quot;, &amp;quot;vi&amp;quot;, &amp;quot;cy&amp;quot;,&lt;br /&gt;
&amp;quot;sv&amp;quot;,&amp;quot;th&amp;quot;, &amp;quot;tr&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
list    translators;&lt;br /&gt;
list    sayCache;&lt;br /&gt;
list    sayCachePrivate;&lt;br /&gt;
integer priorityNumber;&lt;br /&gt;
integer priorityNumListenID;&lt;br /&gt;
integer isInitialized = FALSE;&lt;br /&gt;
string  options; &lt;br /&gt;
//Options&lt;br /&gt;
//integer debug = TRUE;&lt;br /&gt;
integer broadcastChannel = -9999999; //note this is not the channel used by the HR Universal Translator&lt;br /&gt;
string  password = &amp;quot;password&amp;quot;; //note this is not the password used to encrypt comms of the HR Universal Translator&lt;br /&gt;
integer version = 190;&lt;br /&gt;
//&lt;br /&gt;
sendIM(key imid, string imstr)&lt;br /&gt;
{&lt;br /&gt;
    if (llGetParcelFlags(llGetPos()) &amp;amp; PARCEL_FLAG_ALLOW_SCRIPTS)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 85234119, imstr, imid); &lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_THIS, 85304563, imstr, imid);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//txTxtLot() = sendTextBatch()&lt;br /&gt;
txTxtLot(integer txch, string txtxt) &lt;br /&gt;
{&lt;br /&gt;
    txtxt = llXorBase64StringsCorrect(llStringToBase64(txtxt), llStringToBase64(password));&lt;br /&gt;
    while (llStringLength(txtxt) &amp;gt; 508) //If string is 509 characters or longer &lt;br /&gt;
    {&lt;br /&gt;
        llSay(txch, llGetSubString(txtxt, 0, 507)); //send 508 character chunk&lt;br /&gt;
        txtxt = llGetSubString(txtxt, 508, -1);  //delete 508 character chunk&lt;br /&gt;
    }&lt;br /&gt;
    llSay(txch, txtxt);  //send out any remainder chunk or original chunk&lt;br /&gt;
    //Perry Mizin Comment: I don´t understand the aim of the following if.    &lt;br /&gt;
    //Hank Ramos Comment: this line serves to &amp;quot;trigger&amp;quot; the receiver not to wait for another batch.  If the&lt;br /&gt;
    //message length is exactly 508 characters, the receiver things that another chunk of the message is coming.&lt;br /&gt;
    //This message serves to tell the receiver that the last chunk was the last chunk, not another regular chunk.&lt;br /&gt;
    if (llStringLength(txtxt) == 508)&lt;br /&gt;
        llSay(txch, (string)(txch*4958654));&lt;br /&gt;
    //Hank Ramos Comment: this just flashes the color of the bottom prim to show a message was sent&lt;br /&gt;
    llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0, 0.25&amp;gt;, &amp;quot;&amp;quot;); &lt;br /&gt;
}  &lt;br /&gt;
//string rxTxtLot() = string receiveTextBatch()&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer rxliPos;&lt;br /&gt;
    string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
    {&lt;br /&gt;
        rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
        rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
        sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
    rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
    return rxmsg;&lt;br /&gt;
}&lt;br /&gt;
//string rxTxtLot() = string receiveTextBatch() (Another way)&lt;br /&gt;
integer rxTxtLotBusy = FALSE; //Perry Mizin: added Busy Mode, this could fail or prevent fail&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    if (rxTxtLotBusy == FALSE)&lt;br /&gt;
    {&lt;br /&gt;
        rxTxtLotBusy = TRUE;&lt;br /&gt;
        integer rxliPos;&lt;br /&gt;
        string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
        if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
        {&lt;br /&gt;
            @rxin;&lt;br /&gt;
            rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
            rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
            sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
            if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
            {&lt;br /&gt;
                 jump rxin;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
        rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
        rxTxtLotBusy = FALSE;&lt;br /&gt;
        return rxmsg;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        //Perry Mizin: llSaySomething?&lt;br /&gt;
        return &amp;quot;&amp;quot;;        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string rxTxtLotPrv() = string receiveTextBatchPrivate()&lt;br /&gt;
string rxTxtLotPrv(key prxid, string prxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer prxliPos;&lt;br /&gt;
    string  prxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCachePrivate, (list)prxid))&lt;br /&gt;
    {&lt;br /&gt;
        prxliPos = llListFindList(sayCachePrivate, [prxid]);&lt;br /&gt;
        prxtmpStr = (prxtmpStr=&amp;quot;&amp;quot;) + prxtmpStr + llList2String(sayCachePrivate, prxliPos + 1);&lt;br /&gt;
        sayCachePrivate = llDeleteSubList(sayCachePrivate, prxliPos, prxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    prxmsg = prxtmpStr + prxmsg;&lt;br /&gt;
    prxmsg = llBase64ToString(llXorBase64StringsCorrect(prxmsg, llStringToBase64(password)));&lt;br /&gt;
    return prxmsg;&lt;br /&gt;
}&lt;br /&gt;
//updateTranslatorList()&lt;br /&gt;
updateTranslatorList()&lt;br /&gt;
{&lt;br /&gt;
    integer nx;&lt;br /&gt;
    integer xliLng;&lt;br /&gt;
    list    newList;&lt;br /&gt;
    string  tmpStrPos;&lt;br /&gt;
    integer newMaster;&lt;br /&gt;
    //Scan and remove translators not in the area&lt;br /&gt;
    xliLng = llGetListLength(translators);&lt;br /&gt;
    for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
    {&lt;br /&gt;
        tmpStrPos = llList2String(llGetObjectDetails(llList2Key(translators, nx + 1), [OBJECT_POS]), 0);&lt;br /&gt;
        if ((llVecDist(llGetPos(), (vector)tmpStrPos) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tmpStrPos != &amp;quot;&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            newList = (newList=[]) + newList +  llList2List(translators, nx, nx + 1);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    translators = newList;&lt;br /&gt;
    //llMessageLinked(LINK_THIS,65635544,(string)xliLng,&amp;quot;&amp;quot;); Perry Mizin: what is this necesary for?&lt;br /&gt;
    if (translators == [])&lt;br /&gt;
    {&lt;br /&gt;
        newMaster = 1;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        if (enabled)&lt;br /&gt;
        {&lt;br /&gt;
            xliLng = llGetListLength(translators);&lt;br /&gt;
            newMaster = 2;&lt;br /&gt;
            for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
            {&lt;br /&gt;
                //llOwnerSay(&amp;quot;Checking Priority Number(&amp;quot; +  (string)priorityNumber + &amp;quot;): &amp;quot; + (string)llList2Integer(translators, x));&lt;br /&gt;
                if (llList2Integer(translators, nx) &amp;gt; priorityNumber)&lt;br /&gt;
                {&lt;br /&gt;
                    newMaster = 0;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            newMaster = 0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster &amp;gt; 0) &amp;amp;&amp;amp; (newMaster == 0))&lt;br /&gt;
    {&lt;br /&gt;
        //We are being demoted from master to slave&lt;br /&gt;
        //Flush agentsInTranslation to master&lt;br /&gt;
        if (agentsInTranslation != [])&lt;br /&gt;
        {&lt;br /&gt;
            //Demotion Dump of agentsInTranslation to Master&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1003, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
            if (isInitialized == FALSE)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1004, options])); //error&lt;br /&gt;
        }&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster == 0) &amp;amp;&amp;amp; (newMaster &amp;gt; 0))&lt;br /&gt;
    {&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
        listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); &lt;br /&gt;
    }&lt;br /&gt;
    isMaster = newMaster;&lt;br /&gt;
    llMessageLinked(LINK_THIS, 34829304, (string)isMaster, &amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
//sendHeartbeat()&lt;br /&gt;
sendHeartbeat()&lt;br /&gt;
{&lt;br /&gt;
    updateTranslatorList();&lt;br /&gt;
    txTxtLot(broadcastChannel, llList2CSV([1001, priorityNumber]));&lt;br /&gt;
    //Broadcast agentList to Slaves&lt;br /&gt;
    if (isMaster == 2)&lt;br /&gt;
    {&lt;br /&gt;
        txTxtLot(broadcastChannel, llList2CSV([1002, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//checkThrottle()&lt;br /&gt;
checkThrottle(integer chkn, string chkmsg, list chkli)&lt;br /&gt;
{&lt;br /&gt;
    integer y;&lt;br /&gt;
    integer maxCount;&lt;br /&gt;
    float   chkoldTime;&lt;br /&gt;
    float   sleepTime;&lt;br /&gt;
    list    chknewli;&lt;br /&gt;
    key     returnValue;&lt;br /&gt;
    integer channelToSpeak; &lt;br /&gt;
    //loop though list and remove items older than 25 seconds&lt;br /&gt;
    for (y = 0; y &amp;lt; llGetListLength(requestList); y += 1)&lt;br /&gt;
    {&lt;br /&gt;
        chkoldTime = llList2Float(requestList, y);&lt;br /&gt;
        //Construct new list with only times less than 25 seconds&lt;br /&gt;
        if ((llGetTime() - chkoldTime) &amp;lt;= 25.0)&lt;br /&gt;
        { &lt;br /&gt;
            chknewli = (chknewli=[]) + chknewli + [chkoldTime];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    requestList = chknewli; &lt;br /&gt;
    y = llGetListLength(requestList);&lt;br /&gt;
    //Shunt all translations to linked translators if master&lt;br /&gt;
    if (isMaster == 2)&lt;br /&gt;
    {&lt;br /&gt;
        if (chkn == 0)&lt;br /&gt;
        {&lt;br /&gt;
            //Send HTTP request to other translator&lt;br /&gt;
            //Send out Request to Random Translator Channel&lt;br /&gt;
            channelToSpeak = llList2Integer(llListRandomize(llList2ListStrided(translators, 0, -1, 2), 1), 0);&lt;br /&gt;
            if (channelToSpeak &amp;gt; 0) &lt;br /&gt;
            {&lt;br /&gt;
                txTxtLot(channelToSpeak, llList2CSV([chkn, llList2CSV(chkli)]) + &amp;quot;~&amp;quot; + chkmsg);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if (y == 19)&lt;br /&gt;
    {&lt;br /&gt;
        sleepTime =  25.0 - (llGetTime() - llList2Float(requestList, 0));&lt;br /&gt;
        if (sleepTime &amp;gt; 0) &lt;br /&gt;
        {&lt;br /&gt;
            llSleep(sleepTime);&lt;br /&gt;
        }&lt;br /&gt;
        requestList = llDeleteSubList(requestList, 0, 0);&lt;br /&gt;
    }&lt;br /&gt;
    if (chkn == 0)&lt;br /&gt;
    {&lt;br /&gt;
        chkmsg = &amp;quot;translate?v=1.0&amp;amp;q=&amp;quot; + chkmsg;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        chkmsg = &amp;quot;detect?v=1.0&amp;amp;q=&amp;quot; + chkmsg;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    requestList = (requestList=[]) + requestList + (list)llGetTime();&lt;br /&gt;
    returnValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/&amp;quot; + chkmsg, [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot; &amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
    if (returnValue != NULL_KEY)&lt;br /&gt;
    {&lt;br /&gt;
        if (chkn == 0)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS, 235365342, llList2CSV(chkli), returnValue); &lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS, 235365343, llList2CSV(chkli), returnValue); &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llSleep(40.0); //Something has gone horribly wrong, sleep 40 seconds to clear throttle&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string checkLanguage()&lt;br /&gt;
string checkLanguage(string chklantmpStr)&lt;br /&gt;
{&lt;br /&gt;
    if (llGetSubString(chklantmpStr, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else if (chklantmpStr == &amp;quot;und&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;el&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if (~llListFindList(languageCodes, [chklantmpStr]))&lt;br /&gt;
    {&lt;br /&gt;
 &lt;br /&gt;
    } else {&lt;br /&gt;
        chklantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    chklantmpStr = llGetSubString(chklantmpStr, 0, 1);&lt;br /&gt;
    return chklantmpStr;&lt;br /&gt;
}&lt;br /&gt;
//addAgent()&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
    integer avliPos;&lt;br /&gt;
    integer idNum;&lt;br /&gt;
    if (~llListFindList(agentsInTranslation, (list)avid))&lt;br /&gt;
    {&lt;br /&gt;
        avliPos = llListFindList(agentsInTranslation, [avid]);&lt;br /&gt;
        agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, chklan], avliPos + 1, avliPos + 2);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        @at;&lt;br /&gt;
        idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
        if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
        {//it exists       &lt;br /&gt;
            jump at;&lt;br /&gt;
        }&lt;br /&gt;
        agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, chklan, idNum];&lt;br /&gt;
        llMessageLinked(LINK_THIS, 64562349, avlan, avid);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string addNewAgent()&lt;br /&gt;
string addNewAgent(key newavid)&lt;br /&gt;
{&lt;br /&gt;
    string speakerLan;&lt;br /&gt;
 &lt;br /&gt;
    if (llGetAgentSize(newavid) != ZERO_VECTOR)&lt;br /&gt;
    {&lt;br /&gt;
        speakerLan  = checkLanguage(llGetAgentLanguage(newavid));&lt;br /&gt;
        if (speakerLan == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
            addAgent(newavid, speakerLan, TRUE);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            addAgent(newavid, speakerLan, FALSE);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return speakerLan;&lt;br /&gt;
}&lt;br /&gt;
//key getAgentKey()&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
    if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
    {&lt;br /&gt;
        integer gkliPos = llListFindList(agentsInTranslation, [agentID]);&lt;br /&gt;
        return llList2Key(agentsInTranslation, gkliPos - 3);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//processHTTPResponse()&lt;br /&gt;
processHTTPResponse(integer ntype, string bodyStr, list paramsli)&lt;br /&gt;
{&lt;br /&gt;
    integer spkliPos;&lt;br /&gt;
    list    recepientList;&lt;br /&gt;
    key     recepientID;&lt;br /&gt;
    string  recepientLanguage;&lt;br /&gt;
    string  languagePair;&lt;br /&gt;
    key     speakerID;&lt;br /&gt;
    string  speakerName;&lt;br /&gt;
    string  speakerLanguage;&lt;br /&gt;
    string  translatedText;&lt;br /&gt;
    string  lantmpStr;&lt;br /&gt;
    integer z;&lt;br /&gt;
    integer speakerLanguageReliable;&lt;br /&gt;
    float   speakerLanguageConfidence;&lt;br /&gt;
    list    paramtmpli;&lt;br /&gt;
    //===================&lt;br /&gt;
    //Process Translation&lt;br /&gt;
    //===================&lt;br /&gt;
    if (ntype == 0)&lt;br /&gt;
    {&lt;br /&gt;
        speakerID  = llList2Key(paramsli, 1);&lt;br /&gt;
        speakerName = llKey2Name(speakerID);&lt;br /&gt;
        if (speakerName == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
        }&lt;br /&gt;
        recepientList = llParseString2List(llList2String(paramsli, 2), [&amp;quot;@&amp;quot;], []);&lt;br /&gt;
        paramtmpli = llParseStringKeepNulls(llList2String(paramsli, 3), [&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
        recepientLanguage = llList2String(paramtmpli, 1);&lt;br /&gt;
        languagePair = llDumpList2String(paramtmpli, &amp;quot;&amp;gt;&amp;gt;&amp;quot;); &lt;br /&gt;
        //Perform Text Cleanup&lt;br /&gt;
        z = llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;detectedSourceLanguage\&amp;quot;:\&amp;quot;&amp;quot;); &lt;br /&gt;
        if (z != -1)&lt;br /&gt;
        {&lt;br /&gt;
            translatedText  = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, z);&lt;br /&gt;
            speakerLanguage = checkLanguage(llGetSubString(bodyStr, z + 28, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;}, \&amp;quot;responseDetails\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
            spkliPos = llListFindList(agentsInTranslation, [speakerID]);&lt;br /&gt;
            if (spkliPos &amp;gt;= 0)&lt;br /&gt;
            {&lt;br /&gt;
                if (speakerLanguage != llList2String(agentsInTranslation, spkliPos + 1))&lt;br /&gt;
                {&lt;br /&gt;
                    agentsInTranslation = llListReplaceList(agentsInTranslation, [TRUE], spkliPos + 2, spkliPos + 2);  //Mark for recheck of actual spoken language.&lt;br /&gt;
                }&lt;br /&gt;
            }                   &lt;br /&gt;
        }&lt;br /&gt;
        else if (z == -1)&lt;br /&gt;
        {&lt;br /&gt;
            translatedText = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;}, \&amp;quot;responseDetails\&amp;quot;&amp;quot;));&lt;br /&gt;
        }&lt;br /&gt;
        //Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
        if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            lantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
            //Perry Mizin Comment: Probably I guess this is wrong, maybe I am wrong&lt;br /&gt;
            //Perry Mizin Comment: alternative reverse order: &amp;quot;Hello World&amp;quot; could be &amp;quot;World Hello&amp;quot;&lt;br /&gt;
            //Perry Mizin Comment: reverse order: &amp;quot;Hello World&amp;quot; is &amp;quot;dlroW olleH&amp;quot; or ,,pl^ºM ºllªH,,&lt;br /&gt;
            for(z = llStringLength(translatedText);z &amp;gt;= 0; z--)&lt;br /&gt;
            {&lt;br /&gt;
                lantmpStr = (lantmpStr=&amp;quot;&amp;quot;) + lantmpStr + llGetSubString(translatedText, z, z); &lt;br /&gt;
            }&lt;br /&gt;
            translatedText = lantmpStr;&lt;br /&gt;
        }   &lt;br /&gt;
        lantmpStr = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
        if (showTranslation)&lt;br /&gt;
        {&lt;br /&gt;
            sendIM(speakerID, lantmpStr);&lt;br /&gt;
        } &lt;br /&gt;
        for (z = 0; z &amp;lt; llGetListLength(recepientList); z += 1)&lt;br /&gt;
        {&lt;br /&gt;
            recepientID = getAgentKey(llList2Integer(recepientList, z));&lt;br /&gt;
            if (recepientID != &amp;quot;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, [recepientID]) + 1);&lt;br /&gt;
                if (recepientLanguage != speakerLanguage)&lt;br /&gt;
                {&lt;br /&gt;
                    sendIM(recepientID, lantmpStr);&lt;br /&gt;
                }&lt;br /&gt;
            }  &lt;br /&gt;
        }&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    //===========================&lt;br /&gt;
    //Process Language Detection&lt;br /&gt;
    //===========================&lt;br /&gt;
    if (ntype == 1)&lt;br /&gt;
    {&lt;br /&gt;
        speakerID = llList2Key(paramsli, 1);&lt;br /&gt;
        speakerLanguageReliable = llToLower(llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) + 15, llSubStringIndex(bodyStr, &amp;quot;,\&amp;quot;confidence\&amp;quot;:&amp;quot;) - 1)) == &amp;quot;true&amp;quot;;&lt;br /&gt;
        speakerLanguageConfidence = (float)llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;,\&amp;quot;confidence\&amp;quot;:&amp;quot;) + 14, llSubStringIndex(bodyStr, &amp;quot;}, \&amp;quot;responseDetails\&amp;quot;:&amp;quot;) - 1);&lt;br /&gt;
 &lt;br /&gt;
        spkliPos = llListFindList(agentsInTranslation, [speakerID]);&lt;br /&gt;
        if (((spkliPos &amp;lt; 0) &amp;amp;&amp;amp; (speakerLanguageReliable) || (speakerLanguageConfidence &amp;gt;= 0.08)))&lt;br /&gt;
        {&lt;br /&gt;
            //Analyze Data&lt;br /&gt;
            lantmpStr = checkLanguage(llToLower(llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1)));&lt;br /&gt;
            if (lantmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            } &lt;br /&gt;
            if (speakerLanguageConfidence &amp;lt; 0.14)&lt;br /&gt;
            {&lt;br /&gt;
                addAgent(speakerID, lantmpStr, TRUE);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                addAgent(speakerID, lantmpStr, FALSE);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        //Multiplexor Initialization&lt;br /&gt;
        priorityNumber = version*1000000 + llRound(llFrand(499999) + 50000);&lt;br /&gt;
        llListen(broadcastChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        priorityNumListenID = llListen(priorityNumber, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
        //Send out initial heartbeat&lt;br /&gt;
        lastHeartBeat = llGetUnixTime();&lt;br /&gt;
        txTxtLot(broadcastChannel, llList2CSV([1001, priorityNumber]));&lt;br /&gt;
 &lt;br /&gt;
        //Wait for the network to settle down&lt;br /&gt;
        llSetTimerEvent(5.0); &lt;br /&gt;
        //llSetTimerEvent(10 + ((1-llGetRegionTimeDilation()) * 1));       &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
    {&lt;br /&gt;
        list    ltmpli;&lt;br /&gt;
&lt;br /&gt;
        //Old Multiplexor&lt;br /&gt;
        if (num == 8434532)&lt;br /&gt;
        {&lt;br /&gt;
            enabled = (integer)lstr;&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 3342976)&lt;br /&gt;
        {&lt;br /&gt;
            //Send Preferences&lt;br /&gt;
            options = lstr;&lt;br /&gt;
            if (isInitialized == FALSE) return;&lt;br /&gt;
            ltmpli = llCSV2List(options);&lt;br /&gt;
            showTranslation = llList2Integer(ltmpli, 0);&lt;br /&gt;
            tranObjects = llList2Integer(ltmpli, 1);&lt;br /&gt;
            autoLanguage = llList2Integer(ltmpli, 2);&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1004, options]));&lt;br /&gt;
 &lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 9384610)&lt;br /&gt;
        {&lt;br /&gt;
            if (isMaster == 0) //markering&lt;br /&gt;
                //llMessageLinked(LINK_THIS, 5598321, llList2CSV([id, str, FALSE]), &amp;quot;&amp;quot;);&lt;br /&gt;
                txTxtLot(broadcastChannel, llList2CSV([1003, lid, lstr, FALSE]));&lt;br /&gt;
            else&lt;br /&gt;
                addAgent(lid, lstr, TRUE);&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 345149625)&lt;br /&gt;
        {&lt;br /&gt;
            //Return Translation&lt;br /&gt;
            processHTTPResponse(0, lstr, llCSV2List(lid));&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 345149626)&lt;br /&gt;
        {&lt;br /&gt;
            //Return Detection&lt;br /&gt;
            processHTTPResponse(1, lstr, llCSV2List(lid));&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    sensor(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        integer s;&lt;br /&gt;
        key     sid;&lt;br /&gt;
 &lt;br /&gt;
        for (s = 0; s &amp;lt; num_detected; s += 1)&lt;br /&gt;
        {&lt;br /&gt;
            sid = llDetectedKey(s);&lt;br /&gt;
            if (~llListFindList(agentsInTranslation, (list)sid))&lt;br /&gt;
            {                &lt;br /&gt;
            }else{&lt;br /&gt;
                addNewAgent(sid);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        integer w;&lt;br /&gt;
        string  spkrLan;&lt;br /&gt;
        string  recepLan;&lt;br /&gt;
        integer recepID;&lt;br /&gt;
        integer lstliPos;&lt;br /&gt;
        string  lanpair;&lt;br /&gt;
        list    translationCache;&lt;br /&gt;
        list    lsttmpli;&lt;br /&gt;
        integer ImessageType;&lt;br /&gt;
        string  Imessage;&lt;br /&gt;
        string  lsttmpStr;&lt;br /&gt;
        string  lst2tmpStr;&lt;br /&gt;
 &lt;br /&gt;
        //Multiplexor Code&lt;br /&gt;
        if ((channel == broadcastChannel) || (channel == priorityNumber))&lt;br /&gt;
        {&lt;br /&gt;
            //==========================&lt;br /&gt;
            //Process Proxy HTTP Request&lt;br /&gt;
            //==========================&lt;br /&gt;
 &lt;br /&gt;
            if (channel == priorityNumber)&lt;br /&gt;
            {&lt;br /&gt;
                if (llStringLength(message) &amp;gt;= 508)&lt;br /&gt;
                {&lt;br /&gt;
                    if (((integer)message/channel) != 4958654)&lt;br /&gt;
                    {&lt;br /&gt;
                        sayCachePrivate = (sayCachePrivate=[]) + sayCachePrivate + [id, message];&lt;br /&gt;
                        return; &lt;br /&gt;
                    }&lt;br /&gt;
                    message = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                message = rxTxtLotPrv(id, message);&lt;br /&gt;
                //Received packet to translate&lt;br /&gt;
                llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0.05, 0.25&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
                lsttmpli = llParseString2List(message, [&amp;quot;~&amp;quot;], []);&lt;br /&gt;
                lsttmpStr = llList2String(lsttmpli, 0);&lt;br /&gt;
                lsttmpli = llDeleteSubList(lsttmpli, 0, 0);&lt;br /&gt;
 &lt;br /&gt;
                lst2tmpStr = llDumpList2String(lsttmpli, &amp;quot;|&amp;quot;);&lt;br /&gt;
                lsttmpli = llCSV2List(lsttmpStr);&lt;br /&gt;
                lstliPos = llList2Integer(lsttmpli, 0);&lt;br /&gt;
                lsttmpli = llDeleteSubList(lsttmpli, 0, 0);&lt;br /&gt;
 &lt;br /&gt;
                checkThrottle(lstliPos, lst2tmpStr, lsttmpli);&lt;br /&gt;
 &lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
            //=======================&lt;br /&gt;
            //Process Global Messages&lt;br /&gt;
            //=======================&lt;br /&gt;
            if (llStringLength(message) &amp;gt;= 508)&lt;br /&gt;
            {&lt;br /&gt;
                if (((integer)message/channel) != 4958654)&lt;br /&gt;
                {&lt;br /&gt;
                    sayCache = (sayCache=[]) + sayCache + [id, message];&lt;br /&gt;
                    return; &lt;br /&gt;
                }&lt;br /&gt;
                message = &amp;quot;&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            message = rxTxtLot(id, message);&lt;br /&gt;
 &lt;br /&gt;
            lsttmpli = llCSV2List(message);&lt;br /&gt;
 &lt;br /&gt;
            if (llGetListLength(lsttmpli) &amp;gt;= 2)    &lt;br /&gt;
            {&lt;br /&gt;
                ImessageType = llList2Integer(lsttmpli, 0);&lt;br /&gt;
                lsttmpli = llDeleteSubList(lsttmpli, 0, 0);&lt;br /&gt;
                Imessage = llList2CSV(lsttmpli);        &lt;br /&gt;
 &lt;br /&gt;
                llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0, 0.25&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
                //Process Message Here&lt;br /&gt;
                if (ImessageType == 1001)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming Heartbeat&lt;br /&gt;
                    if ((integer)Imessage == priorityNumber)&lt;br /&gt;
                    {&lt;br /&gt;
                        llOwnerSay(&amp;quot;Priority Number Conflict!  Resetting Script...&amp;quot;);&lt;br /&gt;
                        llResetScript(); //Reset if conflicting priority number&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    if (~llListFindList(translators, (list)id)  //lstliPos &amp;lt; 0) &lt;br /&gt;
                    {&lt;br /&gt;
                        lstliPos = llListFindList(translators, [id]);&lt;br /&gt;
                        translators = llListReplaceList(translators, [(integer)Imessage], lstliPos - 1, lstliPos - 1);                        &lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                       translators = (translators=[]) + translators + [(integer)Imessage, id];&lt;br /&gt;
                        if ((isMaster &amp;gt; 0) &amp;amp;&amp;amp; (isInitialized))&lt;br /&gt;
                        {&lt;br /&gt;
                            txTxtLot((integer)Imessage, llList2CSV([1002, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
                            txTxtLot((integer)Imessage, llList2CSV([1004, options]));&lt;br /&gt;
                        } &lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if (ImessageType == 1002)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming agentsInTranslation Master Broadcast&lt;br /&gt;
                    if (isMaster == 0)&lt;br /&gt;
                    {&lt;br /&gt;
                        //llMessageLinked(LINK_THIS, 9458021, Imessage, &amp;quot;&amp;quot;);  &lt;br /&gt;
                        lsttmpli = llCSV2List(Imessage);&lt;br /&gt;
                        agentsInTranslation = [];&lt;br /&gt;
                        for (w = 0; w &amp;lt; llGetListLength(lsttmpli); w += 4)&lt;br /&gt;
                        {&lt;br /&gt;
                            agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [llList2Key(lsttmpli, w), llList2String(lsttmpli, w + 1), llList2Integer(lsttmpli, w + 2), llList2Integer(lsttmpli, w + 3)];&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if (ImessageType == 1003)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming agentsInTranslation dump from Slave&lt;br /&gt;
                    lsttmpli = llCSV2List(Imessage);&lt;br /&gt;
                    for (w = 0; w &amp;lt; llGetListLength(lsttmpli); w += 4)&lt;br /&gt;
                    {&lt;br /&gt;
                        addAgent(llList2Key(lsttmpli, w), llList2String(lsttmpli, w + 1), llList2Integer(lsttmpli, w + 2));&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if (ImessageType == 1004)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming Preferences&lt;br /&gt;
                    options = Imessage;&lt;br /&gt;
                    lsttmpli = llCSV2List(options);&lt;br /&gt;
                    showTranslation = llList2Integer(lsttmpli, 0);&lt;br /&gt;
                    tranObjects = llList2Integer(lsttmpli, 1);&lt;br /&gt;
                    autoLanguage = llList2Integer(lsttmpli, 2);&lt;br /&gt;
 &lt;br /&gt;
                    llMessageLinked(LINK_THIS, 3342977, Imessage, &amp;quot;&amp;quot;);  &lt;br /&gt;
                }&lt;br /&gt;
            }            &lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        //Translator Engine Code&lt;br /&gt;
        if ((llToLower(message) == &amp;quot;translator&amp;quot;) &amp;amp;&amp;amp; (isMaster &amp;gt; 0)) &lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS, 2540664, message, id);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ((!enabled) &amp;amp;&amp;amp; (isMaster == 1)) return;&lt;br /&gt;
 &lt;br /&gt;
        if (!tranObjects)&lt;br /&gt;
        {&lt;br /&gt;
            if (llGetAgentSize(id) == ZERO_VECTOR) return;&lt;br /&gt;
        } &lt;br /&gt;
        &lt;br /&gt;
        if (~llListFindList(agentsInTranslation, (list)id)) //lstliPos &amp;gt;= 0)&lt;br /&gt;
        {&lt;br /&gt;
            lstliPos = llListFindList(agentsInTranslation, (list)id);            &lt;br /&gt;
            spkrLan = llList2String(agentsInTranslation, lstliPos + 1);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            spkrLan = addNewAgent(id);&lt;br /&gt;
        } &lt;br /&gt;
        if (spkrLan == &amp;quot;xx&amp;quot;) return;  //Agent Opt-Out&lt;br /&gt;
         &lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;1, 1, 0&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
        //===============================&lt;br /&gt;
        //Formulate Translation Requests&lt;br /&gt;
        //===============================&lt;br /&gt;
        for (w = 0; w &amp;lt; llGetListLength(agentsInTranslation); w += 4)&lt;br /&gt;
        {&lt;br /&gt;
            //Loop through translation group and do appropriate translations as needed&lt;br /&gt;
            recepID = llList2Integer(agentsInTranslation, w + 3);&lt;br /&gt;
            recepLan =  checkLanguage(llList2Key(agentsInTranslation, w + 1)); &lt;br /&gt;
            if ((spkrLan != recepLan) &amp;amp;&amp;amp; (recepLan != &amp;quot;&amp;quot;) &amp;amp;&amp;amp; (recepLan != &amp;quot;xx&amp;quot;))&lt;br /&gt;
            {&lt;br /&gt;
                lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
 &lt;br /&gt;
                &lt;br /&gt;
                if (~llListFindList(translationCache, (list)lanpair)) //lstliPos &amp;lt; 0)&lt;br /&gt;
                {&lt;br /&gt;
                  lstliPos = llListFindList(translationCache, [lanpair]);&lt;br /&gt;
                  translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
                  &lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                  translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        } &lt;br /&gt;
        //Process Requests&lt;br /&gt;
        if (translationCache != [])&lt;br /&gt;
        {&lt;br /&gt;
            for (w = 0; w &amp;lt; llGetListLength(translationCache); w += 2)&lt;br /&gt;
            {&lt;br /&gt;
                //====================================&lt;br /&gt;
                //Translation&lt;br /&gt;
                //====================================&lt;br /&gt;
                //Forumulate and Send Translation Request&lt;br /&gt;
                lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, w), [&amp;quot;|&amp;quot;],[]), 1); &lt;br /&gt;
                checkThrottle(0, llEscapeURL(message) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, w + 1), llList2String(translationCache, w)]);&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
            spkrLan = &amp;quot;&amp;quot;; &lt;br /&gt;
        //====================================&lt;br /&gt;
        //Language Detection&lt;br /&gt;
        //====================================&lt;br /&gt;
        if (llGetAgentSize(id) != ZERO_VECTOR) //llList2Key(llGetObjectDetails(id, [OBJECT_CREATOR]), 0) == NULL_KEY)&lt;br /&gt;
        {&lt;br /&gt;
            if (((spkrLan == &amp;quot;&amp;quot;) || (llList2Integer(agentsInTranslation, llListFindList(agentsInTranslation, [id]) + 2) == TRUE)) || (isMaster == 2))&lt;br /&gt;
            {&lt;br /&gt;
                //Forumulate and Send Language Detect Request&lt;br /&gt;
                checkThrottle(1, llEscapeURL(message), [llGetTime(), id]);&lt;br /&gt;
            }       &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
    {&lt;br /&gt;
        string  htttmpStr; &lt;br /&gt;
        if (status != 200) &lt;br /&gt;
        {&lt;br /&gt;
            //llOwnerSay(&amp;quot;WWW Error:&amp;quot; + (string)status);&lt;br /&gt;
            llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;1, 0, 0&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
            //llOwnerSay(body);&lt;br /&gt;
            return;&lt;br /&gt;
        } &lt;br /&gt;
        //Process Resonse Code&lt;br /&gt;
        htttmpStr = llGetSubString(body, llSubStringIndex(body, &amp;quot;\&amp;quot;responseStatus\&amp;quot;:&amp;quot;), -1);&lt;br /&gt;
        status = (integer)llGetSubString(htttmpStr, 17, llSubStringIndex(htttmpStr, &amp;quot;}&amp;quot;) - 1);&lt;br /&gt;
        if (status != 200)&lt;br /&gt;
        {&lt;br /&gt;
            //llOwnerSay(&amp;quot;Language Server Returned Error Code: &amp;quot; + (string)status);&lt;br /&gt;
            //llOwnerSay(body);&lt;br /&gt;
            llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;1, 0, 0&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0, 0, 1&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
        llMessageLinked(LINK_THIS, 345149624, body, request_id);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(0.0);  // timer reset&lt;br /&gt;
        integer r;&lt;br /&gt;
        string  tmrtmpStr;&lt;br /&gt;
        list    tmrnewli;&lt;br /&gt;
        integer translatorCount = llGetListLength(translators)/2; &lt;br /&gt;
        if (isInitialized == FALSE)&lt;br /&gt;
        {&lt;br /&gt;
            enabled = TRUE;&lt;br /&gt;
            listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); &lt;br /&gt;
            llListen(777, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
            llMessageLinked(LINK_THIS, 6877259, (string)enabled, NULL_KEY);&lt;br /&gt;
            isInitialized = TRUE;&lt;br /&gt;
        } &lt;br /&gt;
        llMessageLinked(LINK_THIS, 94558323, llList2CSV(agentsInTranslation), &amp;quot;&amp;quot;);&lt;br /&gt;
        if (isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            for (r = 0; r &amp;lt; llGetListLength(agentsInTranslation); r += 4)&lt;br /&gt;
            {&lt;br /&gt;
                tmrtmpStr = llList2String(llGetObjectDetails(llList2Key(agentsInTranslation, r), [OBJECT_POS]), 0);&lt;br /&gt;
                if ((llVecDist(llGetPos(), (vector)tmrtmpStr) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tmrtmpStr != &amp;quot;&amp;quot;))&lt;br /&gt;
                {&lt;br /&gt;
                    tmrnewli = (tmrnewli=[]) + tmrnewli + llList2List(agentsInTranslation, r, r + 3);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            agentsInTranslation = tmrnewli;&lt;br /&gt;
            if ((llGetUnixTime() - lastHeartBeat) &amp;gt;= 5)&lt;br /&gt;
            {&lt;br /&gt;
                //Send heartbeat&lt;br /&gt;
                sendHeartbeat();&lt;br /&gt;
                lastHeartBeat = llGetUnixTime();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            if ((llGetUnixTime() - lastHeartBeat) &amp;gt;= `0 + llGetListLength(agentsInTranslation)*2 + llPow(translatorCount, 1.4) + translatorCount + ((1-llGetRegionTimeDilation()) * 5))&lt;br /&gt;
            {&lt;br /&gt;
                //Send heartbeat&lt;br /&gt;
                sendHeartbeat();&lt;br /&gt;
                lastHeartBeat = llGetUnixTime();&lt;br /&gt;
            }&lt;br /&gt;
        } &lt;br /&gt;
        //turn on and off scanner&lt;br /&gt;
        if ((autoLanguage) &amp;amp;&amp;amp; isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            llSensor(&amp;quot;&amp;quot;, NULL_KEY, AGENT, 20.0, PI);&lt;br /&gt;
        }&lt;br /&gt;
        llSetTimerEvent(4.0); // restart timer&lt;br /&gt;
        //llSetTimerEvent(4 + ((1-llGetRegionTimeDilation()) * 5));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bueno, despues de respiñar todo lo que he podido, creo que el uso de memoria y la velocidad estan practicamente igual que en la version original pero bueno... en la variedad está el gusto no?&lt;br /&gt;
Ya he probado un poco el codigo, y parece que funciona aunque estoy teniendo algunos problemas... Por ejemplo creo que el sistema de traduccion no funciona correctamente, y no me refiero al sistema de traduccion de Google (en mi opinion, si no es el mejor, es uno de los mejores del mundo), sino a que aun queda mucho trabajo por hacer en el script...&lt;br /&gt;
&lt;br /&gt;
El siguiente paso sera intentar dividir el script en dos, o si es posible en tres para repartir el uso de memoria. Tambien me gustaria probar un truco que uso a menudo para traducir paginas en un idioma que no entiendo, lo que hago es que en vez de traducir directamente al español, primero lo traduzco a inglés, y luego desde inglés al español, parece una tonteria y un gasto innecesario, pero si lo hago es porque así suelo entender mejor las traducciones.&lt;br /&gt;
Quiero por un lado el sistema de comunicacion y evaluacion entre traductores, y por otro el sistema de traduccion entre avatares, ¿es muy dificil? no se ya lo veremos...&lt;br /&gt;
&lt;br /&gt;
Well, after saving as much as I could, I think the memory usage and the speed are technically the same as in the original script, but well, in the variety is the taste, isnt it?. &lt;br /&gt;
I have tested a bit the code above already, and it seems to work altought i´m having some problems...&lt;br /&gt;
For instance i think the translation system is not working properly, and i dont mean the Google´s translation system (in my opinion, if is not the best, one of the bests), but that there is still much work to do in the script...&lt;br /&gt;
&lt;br /&gt;
The next step will be to try to divide the script in 2, or 3 if is possible, so we can spread the memory usage. Also I would like to test a trick i use often for to translate languages that i dont understand, what I do first is to translate that language into English, and then from English to Spanish, it seems a nonsense and unnecesary waste, but if i do it is becouse so i usually understand the translations better.&lt;br /&gt;
I want by one part the translators communications and evaluation system, and by other the translation system between avatars, is it very difficult? I doný know , we will see...&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=687612</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=687612"/>
		<updated>2009-12-15T15:26:33Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: /* Universal Translator Engine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribucion al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente codigo fué originalmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mi manera...&lt;br /&gt;
No os riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;Universal Translator Engine&#039;&#039; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//November 12, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Web Server Services powered by Google &lt;br /&gt;
//Variables&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
list agentsInTranslationOptions;&lt;br /&gt;
list requestList;&lt;br /&gt;
integer listenID; &lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
integer showTranslation = FALSE;&lt;br /&gt;
integer tranObjects = TRUE; &lt;br /&gt;
integer lastHeartBeat;&lt;br /&gt;
list    languageCodes = [&lt;br /&gt;
&amp;quot;zh-CN&amp;quot;, &amp;quot;zh-TW&amp;quot;, &amp;quot;hr&amp;quot;,  &lt;br /&gt;
&amp;quot;bg&amp;quot;, &amp;quot;be&amp;quot;, &amp;quot;ca&amp;quot;,&lt;br /&gt;
&amp;quot;af&amp;quot;, &amp;quot;sq&amp;quot;, &amp;quot;ar&amp;quot;,   &lt;br /&gt;
&amp;quot;tl&amp;quot;, &amp;quot;fr&amp;quot;, &amp;quot;gl&amp;quot;,    &lt;br /&gt;
&amp;quot;fi&amp;quot;, &amp;quot;en&amp;quot;, &amp;quot;et&amp;quot;,     &lt;br /&gt;
&amp;quot;cs&amp;quot;, &amp;quot;da&amp;quot;, &amp;quot;nl&amp;quot;,  &lt;br /&gt;
&amp;quot;id&amp;quot;, &amp;quot;ga&amp;quot;, &amp;quot;it&amp;quot;,      &lt;br /&gt;
&amp;quot;hi&amp;quot;, &amp;quot;hu&amp;quot;, &amp;quot;is&amp;quot;, &lt;br /&gt;
&amp;quot;de&amp;quot;, &amp;quot;el&amp;quot;, &amp;quot;iw&amp;quot;,    &lt;br /&gt;
&amp;quot;mt&amp;quot;, &amp;quot;no&amp;quot;, &amp;quot;fa&amp;quot;,   &lt;br /&gt;
&amp;quot;lt&amp;quot;, &amp;quot;mk&amp;quot;, &amp;quot;ms&amp;quot;,   &lt;br /&gt;
&amp;quot;ja&amp;quot;, &amp;quot;ko&amp;quot;, &amp;quot;lv&amp;quot;,   &lt;br /&gt;
&amp;quot;sl&amp;quot;, &amp;quot;es&amp;quot;, &amp;quot;sw&amp;quot;, &lt;br /&gt;
&amp;quot;ru&amp;quot;, &amp;quot;sr&amp;quot;, &amp;quot;sk&amp;quot;, &lt;br /&gt;
&amp;quot;pl&amp;quot;, &amp;quot;pt-PT&amp;quot;, &amp;quot;ro&amp;quot;,&lt;br /&gt;
&amp;quot;yi&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;uk&amp;quot;, &amp;quot;vi&amp;quot;, &amp;quot;cy&amp;quot;,&lt;br /&gt;
&amp;quot;sv&amp;quot;,&amp;quot;th&amp;quot;, &amp;quot;tr&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
list    translators;&lt;br /&gt;
list    sayCache;&lt;br /&gt;
list    sayCachePrivate;&lt;br /&gt;
integer priorityNumber;&lt;br /&gt;
integer priorityNumListenID;&lt;br /&gt;
integer isInitialized = FALSE;&lt;br /&gt;
string  options; &lt;br /&gt;
//Options&lt;br /&gt;
//integer debug = TRUE;&lt;br /&gt;
integer broadcastChannel = -9999999; //note this is not the channel used by the HR Universal Translator&lt;br /&gt;
string  password = &amp;quot;password&amp;quot;; //note this is not the password used to encrypt comms of the HR Universal Translator&lt;br /&gt;
integer version = 190;&lt;br /&gt;
//&lt;br /&gt;
sendIM(key imid, string imstr)&lt;br /&gt;
{&lt;br /&gt;
    if (llGetParcelFlags(llGetPos()) &amp;amp; PARCEL_FLAG_ALLOW_SCRIPTS)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 85234119, imstr, imid); &lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_THIS, 85304563, imstr, imid);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//txTxtLot() = sendTextBatch()&lt;br /&gt;
txTxtLot(integer txch, string txtxt) &lt;br /&gt;
{&lt;br /&gt;
    txtxt = llXorBase64StringsCorrect(llStringToBase64(txtxt), llStringToBase64(password));&lt;br /&gt;
    while (llStringLength(txtxt) &amp;gt; 508) //If string is 509 characters or longer &lt;br /&gt;
    {&lt;br /&gt;
        llSay(txch, llGetSubString(txtxt, 0, 507)); //send 508 character chunk&lt;br /&gt;
        txtxt = llGetSubString(txtxt, 508, -1);  //delete 508 character chunk&lt;br /&gt;
    }&lt;br /&gt;
    llSay(txch, txtxt);  //send out any remainder chunk or original chunk&lt;br /&gt;
    //Perry Mizin Comment: I don´t understand the aim of the following if.    &lt;br /&gt;
    //Hank Ramos Comment: this line serves to &amp;quot;trigger&amp;quot; the receiver not to wait for another batch.  If the&lt;br /&gt;
    //message length is exactly 508 characters, the receiver things that another chunk of the message is coming.&lt;br /&gt;
    //This message serves to tell the receiver that the last chunk was the last chunk, not another regular chunk.&lt;br /&gt;
    if (llStringLength(txtxt) == 508)&lt;br /&gt;
        llSay(txch, (string)(txch*4958654));&lt;br /&gt;
    //Hank Ramos Comment: this just flashes the color of the bottom prim to show a message was sent&lt;br /&gt;
    llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0, 0.25&amp;gt;, &amp;quot;&amp;quot;); &lt;br /&gt;
}  &lt;br /&gt;
//string rxTxtLot() = string receiveTextBatch()&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer rxliPos;&lt;br /&gt;
    string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
    {&lt;br /&gt;
        rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
        rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
        sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
    rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
    return rxmsg;&lt;br /&gt;
}&lt;br /&gt;
//string rxTxtLot() = string receiveTextBatch() (Another way)&lt;br /&gt;
integer rxTxtLotBusy = FALSE; //Perry Mizin: added Busy Mode, this could fail or prevent fail&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    if (rxTxtLotBusy == FALSE)&lt;br /&gt;
    {&lt;br /&gt;
        rxTxtLotBusy = TRUE;&lt;br /&gt;
        integer rxliPos;&lt;br /&gt;
        string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
        if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
        {&lt;br /&gt;
            @rxin;&lt;br /&gt;
            rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
            rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
            sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
            if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
            {&lt;br /&gt;
                 jump rxin;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
        rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
        rxTxtLotBusy = FALSE;&lt;br /&gt;
        return rxmsg;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        //Perry Mizin: llSaySomething?&lt;br /&gt;
        return &amp;quot;&amp;quot;;        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string rxTxtLotPrv() = string receiveTextBatchPrivate()&lt;br /&gt;
string rxTxtLotPrv(key prxid, string prxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer prxliPos;&lt;br /&gt;
    string  prxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCachePrivate, (list)prxid))&lt;br /&gt;
    {&lt;br /&gt;
        prxliPos = llListFindList(sayCachePrivate, [prxid]);&lt;br /&gt;
        prxtmpStr = (prxtmpStr=&amp;quot;&amp;quot;) + prxtmpStr + llList2String(sayCachePrivate, prxliPos + 1);&lt;br /&gt;
        sayCachePrivate = llDeleteSubList(sayCachePrivate, prxliPos, prxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    prxmsg = prxtmpStr + prxmsg;&lt;br /&gt;
    prxmsg = llBase64ToString(llXorBase64StringsCorrect(prxmsg, llStringToBase64(password)));&lt;br /&gt;
    return prxmsg;&lt;br /&gt;
}&lt;br /&gt;
//updateTranslatorList()&lt;br /&gt;
updateTranslatorList()&lt;br /&gt;
{&lt;br /&gt;
    integer nx;&lt;br /&gt;
    integer xliLng;&lt;br /&gt;
    list    newList;&lt;br /&gt;
    string  tmpStrPos;&lt;br /&gt;
    integer newMaster;&lt;br /&gt;
    //Scan and remove translators not in the area&lt;br /&gt;
    xliLng = llGetListLength(translators);&lt;br /&gt;
    for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
    {&lt;br /&gt;
        tmpStrPos = llList2String(llGetObjectDetails(llList2Key(translators, nx + 1), [OBJECT_POS]), 0);&lt;br /&gt;
        if ((llVecDist(llGetPos(), (vector)tmpStrPos) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tmpStrPos != &amp;quot;&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            newList = (newList=[]) + newList +  llList2List(translators, nx, nx + 1);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    translators = newList;&lt;br /&gt;
    //llMessageLinked(LINK_THIS,65635544,(string)xliLng,&amp;quot;&amp;quot;); Perry Mizin: what is this necesary for?&lt;br /&gt;
    if (translators == [])&lt;br /&gt;
    {&lt;br /&gt;
        newMaster = 1;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        if (enabled)&lt;br /&gt;
        {&lt;br /&gt;
            xliLng = llGetListLength(translators);&lt;br /&gt;
            newMaster = 2;&lt;br /&gt;
            for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
            {&lt;br /&gt;
                //llOwnerSay(&amp;quot;Checking Priority Number(&amp;quot; +  (string)priorityNumber + &amp;quot;): &amp;quot; + (string)llList2Integer(translators, x));&lt;br /&gt;
                if (llList2Integer(translators, nx) &amp;gt; priorityNumber)&lt;br /&gt;
                {&lt;br /&gt;
                    newMaster = 0;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            newMaster = 0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster &amp;gt; 0) &amp;amp;&amp;amp; (newMaster == 0))&lt;br /&gt;
    {&lt;br /&gt;
        //We are being demoted from master to slave&lt;br /&gt;
        //Flush agentsInTranslation to master&lt;br /&gt;
        if (agentsInTranslation != [])&lt;br /&gt;
        {&lt;br /&gt;
            //Demotion Dump of agentsInTranslation to Master&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1003, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
            if (isInitialized == FALSE)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1004, options])); //error&lt;br /&gt;
        }&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster == 0) &amp;amp;&amp;amp; (newMaster &amp;gt; 0))&lt;br /&gt;
    {&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
        listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); &lt;br /&gt;
    }&lt;br /&gt;
    isMaster = newMaster;&lt;br /&gt;
    llMessageLinked(LINK_THIS, 34829304, (string)isMaster, &amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
//sendHeartbeat()&lt;br /&gt;
sendHeartbeat()&lt;br /&gt;
{&lt;br /&gt;
    updateTranslatorList();&lt;br /&gt;
    txTxtLot(broadcastChannel, llList2CSV([1001, priorityNumber]));&lt;br /&gt;
    //Broadcast agentList to Slaves&lt;br /&gt;
    if (isMaster == 2)&lt;br /&gt;
    {&lt;br /&gt;
        txTxtLot(broadcastChannel, llList2CSV([1002, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//checkThrottle()&lt;br /&gt;
checkThrottle(integer chkn, string chkmsg, list chkli)&lt;br /&gt;
{&lt;br /&gt;
    integer y;&lt;br /&gt;
    integer maxCount;&lt;br /&gt;
    float   chkoldTime;&lt;br /&gt;
    float   sleepTime;&lt;br /&gt;
    list    chknewli;&lt;br /&gt;
    key     returnValue;&lt;br /&gt;
    integer channelToSpeak; &lt;br /&gt;
    //loop though list and remove items older than 25 seconds&lt;br /&gt;
    for (y = 0; y &amp;lt; llGetListLength(requestList); y += 1)&lt;br /&gt;
    {&lt;br /&gt;
        chkoldTime = llList2Float(requestList, y);&lt;br /&gt;
        //Construct new list with only times less than 25 seconds&lt;br /&gt;
        if ((llGetTime() - chkoldTime) &amp;lt;= 25.0)&lt;br /&gt;
        { &lt;br /&gt;
            chknewli = (chknewli=[]) + chknewli + [chkoldTime];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    requestList = chknewli; &lt;br /&gt;
    y = llGetListLength(requestList);&lt;br /&gt;
    //Shunt all translations to linked translators if master&lt;br /&gt;
    if (isMaster == 2)&lt;br /&gt;
    {&lt;br /&gt;
        if (chkn == 0)&lt;br /&gt;
        {&lt;br /&gt;
            //Send HTTP request to other translator&lt;br /&gt;
            //Send out Request to Random Translator Channel&lt;br /&gt;
            channelToSpeak = llList2Integer(llListRandomize(llList2ListStrided(translators, 0, -1, 2), 1), 0);&lt;br /&gt;
            if (channelToSpeak &amp;gt; 0) &lt;br /&gt;
            {&lt;br /&gt;
                txTxtLot(channelToSpeak, llList2CSV([chkn, llList2CSV(chkli)]) + &amp;quot;~&amp;quot; + chkmsg);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if (y == 19)&lt;br /&gt;
    {&lt;br /&gt;
        sleepTime =  25.0 - (llGetTime() - llList2Float(requestList, 0));&lt;br /&gt;
        if (sleepTime &amp;gt; 0) &lt;br /&gt;
        {&lt;br /&gt;
            llSleep(sleepTime);&lt;br /&gt;
        }&lt;br /&gt;
        requestList = llDeleteSubList(requestList, 0, 0);&lt;br /&gt;
    }&lt;br /&gt;
    if (chkn == 0)&lt;br /&gt;
    {&lt;br /&gt;
        chkmsg = &amp;quot;translate?v=1.0&amp;amp;q=&amp;quot; + chkmsg;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        chkmsg = &amp;quot;detect?v=1.0&amp;amp;q=&amp;quot; + chkmsg;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    requestList = (requestList=[]) + requestList + (list)llGetTime();&lt;br /&gt;
    returnValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/&amp;quot; + chkmsg, [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot; &amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
    if (returnValue != NULL_KEY)&lt;br /&gt;
    {&lt;br /&gt;
        if (chkn == 0)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS, 235365342, llList2CSV(chkli), returnValue); &lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS, 235365343, llList2CSV(chkli), returnValue); &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llSleep(40.0); //Something has gone horribly wrong, sleep 40 seconds to clear throttle&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string checkLanguage()&lt;br /&gt;
string checkLanguage(string chklantmpStr)&lt;br /&gt;
{&lt;br /&gt;
    if (llGetSubString(chklantmpStr, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else if (chklantmpStr == &amp;quot;und&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;el&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if (~llListFindList(languageCodes, [chklantmpStr]))&lt;br /&gt;
    {&lt;br /&gt;
 &lt;br /&gt;
    } else {&lt;br /&gt;
        chklantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    chklantmpStr = llGetSubString(chklantmpStr, 0, 1);&lt;br /&gt;
    return chklantmpStr;&lt;br /&gt;
}&lt;br /&gt;
//addAgent()&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
    integer avliPos;&lt;br /&gt;
    integer idNum;&lt;br /&gt;
    if (~llListFindList(agentsInTranslation, (list)avid))&lt;br /&gt;
    {&lt;br /&gt;
        avliPos = llListFindList(agentsInTranslation, [avid]);&lt;br /&gt;
        agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, chklan], avliPos + 1, avliPos + 2);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        @at;&lt;br /&gt;
        idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
        if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
        {//it exists       &lt;br /&gt;
            jump at;&lt;br /&gt;
        }&lt;br /&gt;
        agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, chklan, idNum];&lt;br /&gt;
        llMessageLinked(LINK_THIS, 64562349, avlan, avid);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string addNewAgent()&lt;br /&gt;
string addNewAgent(key newavid)&lt;br /&gt;
{&lt;br /&gt;
    string speakerLan;&lt;br /&gt;
 &lt;br /&gt;
    if (llGetAgentSize(newavid) != ZERO_VECTOR)&lt;br /&gt;
    {&lt;br /&gt;
        speakerLan  = checkLanguage(llGetAgentLanguage(newavid));&lt;br /&gt;
        if (speakerLan == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
            addAgent(newavid, speakerLan, TRUE);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            addAgent(newavid, speakerLan, FALSE);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return speakerLan;&lt;br /&gt;
}&lt;br /&gt;
//key getAgentKey()&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
    if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
    {&lt;br /&gt;
        integer gkliPos = llListFindList(agentsInTranslation, [agentID]);&lt;br /&gt;
        return llList2Key(agentsInTranslation, gkliPos - 3);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//processHTTPResponse()&lt;br /&gt;
processHTTPResponse(integer ntype, string bodyStr, list paramsli)&lt;br /&gt;
{&lt;br /&gt;
    integer spkliPos;&lt;br /&gt;
    list    recepientList;&lt;br /&gt;
    key     recepientID;&lt;br /&gt;
    string  recepientLanguage;&lt;br /&gt;
    string  languagePair;&lt;br /&gt;
    key     speakerID;&lt;br /&gt;
    string  speakerName;&lt;br /&gt;
    string  speakerLanguage;&lt;br /&gt;
    string  translatedText;&lt;br /&gt;
    string  lantmpStr;&lt;br /&gt;
    integer z;&lt;br /&gt;
    integer speakerLanguageReliable;&lt;br /&gt;
    float   speakerLanguageConfidence;&lt;br /&gt;
    list    paramtmpli;&lt;br /&gt;
    //===================&lt;br /&gt;
    //Process Translation&lt;br /&gt;
    //===================&lt;br /&gt;
    if (ntype == 0)&lt;br /&gt;
    {&lt;br /&gt;
        speakerID  = llList2Key(paramsli, 1);&lt;br /&gt;
        speakerName = llKey2Name(speakerID);&lt;br /&gt;
        if (speakerName == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
        }&lt;br /&gt;
        recepientList = llParseString2List(llList2String(paramsli, 2), [&amp;quot;@&amp;quot;], []);&lt;br /&gt;
        paramtmpli = llParseStringKeepNulls(llList2String(paramsli, 3), [&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
        recepientLanguage = llList2String(paramtmpli, 1);&lt;br /&gt;
        languagePair = llDumpList2String(paramtmpli, &amp;quot;&amp;gt;&amp;gt;&amp;quot;); &lt;br /&gt;
        //Perform Text Cleanup&lt;br /&gt;
        z = llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;detectedSourceLanguage\&amp;quot;:\&amp;quot;&amp;quot;); &lt;br /&gt;
        if (z != -1)&lt;br /&gt;
        {&lt;br /&gt;
            translatedText  = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, z);&lt;br /&gt;
            speakerLanguage = checkLanguage(llGetSubString(bodyStr, z + 28, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;}, \&amp;quot;responseDetails\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
            spkliPos = llListFindList(agentsInTranslation, [speakerID]);&lt;br /&gt;
            if (spkliPos &amp;gt;= 0)&lt;br /&gt;
            {&lt;br /&gt;
                if (speakerLanguage != llList2String(agentsInTranslation, spkliPos + 1))&lt;br /&gt;
                {&lt;br /&gt;
                    agentsInTranslation = llListReplaceList(agentsInTranslation, [TRUE], spkliPos + 2, spkliPos + 2);  //Mark for recheck of actual spoken language.&lt;br /&gt;
                }&lt;br /&gt;
            }                   &lt;br /&gt;
        }&lt;br /&gt;
        else if (z == -1)&lt;br /&gt;
        {&lt;br /&gt;
            translatedText = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;}, \&amp;quot;responseDetails\&amp;quot;&amp;quot;));&lt;br /&gt;
        }&lt;br /&gt;
        //Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
        if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            lantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
            //Perry Mizin Comment: Probably I guess this is wrong, maybe I am wrong&lt;br /&gt;
            //Perry Mizin Comment: alternative reverse order: &amp;quot;Hello World&amp;quot; could be &amp;quot;World Hello&amp;quot;&lt;br /&gt;
            //Perry Mizin Comment: reverse order: &amp;quot;Hello World&amp;quot; is &amp;quot;dlroW olleH&amp;quot; or ,,pl^ºM ºllªH,,&lt;br /&gt;
            for(z = llStringLength(translatedText);z &amp;gt;= 0; z--)&lt;br /&gt;
            {&lt;br /&gt;
                lantmpStr = (lantmpStr=&amp;quot;&amp;quot;) + lantmpStr + llGetSubString(translatedText, z, z); &lt;br /&gt;
            }&lt;br /&gt;
            translatedText = lantmpStr;&lt;br /&gt;
        }   &lt;br /&gt;
        lantmpStr = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
        if (showTranslation)&lt;br /&gt;
        {&lt;br /&gt;
            sendIM(speakerID, lantmpStr);&lt;br /&gt;
        } &lt;br /&gt;
        for (z = 0; z &amp;lt; llGetListLength(recepientList); z += 1)&lt;br /&gt;
        {&lt;br /&gt;
            recepientID = getAgentKey(llList2Integer(recepientList, z));&lt;br /&gt;
            if (recepientID != &amp;quot;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, [recepientID]) + 1);&lt;br /&gt;
                if (recepientLanguage != speakerLanguage)&lt;br /&gt;
                {&lt;br /&gt;
                    sendIM(recepientID, lantmpStr);&lt;br /&gt;
                }&lt;br /&gt;
            }  &lt;br /&gt;
        }&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    //===========================&lt;br /&gt;
    //Process Language Detection&lt;br /&gt;
    //===========================&lt;br /&gt;
    if (ntype == 1)&lt;br /&gt;
    {&lt;br /&gt;
        speakerID = llList2Key(paramsli, 1);&lt;br /&gt;
        speakerLanguageReliable = llToLower(llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) + 15, llSubStringIndex(bodyStr, &amp;quot;,\&amp;quot;confidence\&amp;quot;:&amp;quot;) - 1)) == &amp;quot;true&amp;quot;;&lt;br /&gt;
        speakerLanguageConfidence = (float)llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;,\&amp;quot;confidence\&amp;quot;:&amp;quot;) + 14, llSubStringIndex(bodyStr, &amp;quot;}, \&amp;quot;responseDetails\&amp;quot;:&amp;quot;) - 1);&lt;br /&gt;
 &lt;br /&gt;
        spkliPos = llListFindList(agentsInTranslation, [speakerID]);&lt;br /&gt;
        if (((spkliPos &amp;lt; 0) &amp;amp;&amp;amp; (speakerLanguageReliable) || (speakerLanguageConfidence &amp;gt;= 0.08)))&lt;br /&gt;
        {&lt;br /&gt;
            //Analyze Data&lt;br /&gt;
            lantmpStr = checkLanguage(llToLower(llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1)));&lt;br /&gt;
            if (lantmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            } &lt;br /&gt;
            if (speakerLanguageConfidence &amp;lt; 0.14)&lt;br /&gt;
            {&lt;br /&gt;
                addAgent(speakerID, lantmpStr, TRUE);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                addAgent(speakerID, lantmpStr, FALSE);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        //Multiplexor Initialization&lt;br /&gt;
        priorityNumber = version*1000000 + llRound(llFrand(499999) + 50000);&lt;br /&gt;
        llListen(broadcastChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        priorityNumListenID = llListen(priorityNumber, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
        //Send out initial heartbeat&lt;br /&gt;
        lastHeartBeat = llGetUnixTime();&lt;br /&gt;
        txTxtLot(broadcastChannel, llList2CSV([1001, priorityNumber]));&lt;br /&gt;
 &lt;br /&gt;
        //Wait for the network to settle down&lt;br /&gt;
        llSetTimerEvent(5.0); &lt;br /&gt;
        //llSetTimerEvent(10 + ((1-llGetRegionTimeDilation()) * 1));       &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
    {&lt;br /&gt;
        list    ltmpli;&lt;br /&gt;
&lt;br /&gt;
        //Old Multiplexor&lt;br /&gt;
        if (num == 8434532)&lt;br /&gt;
        {&lt;br /&gt;
            enabled = (integer)lstr;&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 3342976)&lt;br /&gt;
        {&lt;br /&gt;
            //Send Preferences&lt;br /&gt;
            options = lstr;&lt;br /&gt;
            if (isInitialized == FALSE) return;&lt;br /&gt;
            ltmpli = llCSV2List(options);&lt;br /&gt;
            showTranslation = llList2Integer(ltmpli, 0);&lt;br /&gt;
            tranObjects = llList2Integer(ltmpli, 1);&lt;br /&gt;
            autoLanguage = llList2Integer(ltmpli, 2);&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1004, options]));&lt;br /&gt;
 &lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 9384610)&lt;br /&gt;
        {&lt;br /&gt;
            if (isMaster == 0) //markering&lt;br /&gt;
                //llMessageLinked(LINK_THIS, 5598321, llList2CSV([id, str, FALSE]), &amp;quot;&amp;quot;);&lt;br /&gt;
                txTxtLot(broadcastChannel, llList2CSV([1003, lid, lstr, FALSE]));&lt;br /&gt;
            else&lt;br /&gt;
                addAgent(lid, lstr, TRUE);&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 345149625)&lt;br /&gt;
        {&lt;br /&gt;
            //Return Translation&lt;br /&gt;
            processHTTPResponse(0, lstr, llCSV2List(lid));&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 345149626)&lt;br /&gt;
        {&lt;br /&gt;
            //Return Detection&lt;br /&gt;
            processHTTPResponse(1, lstr, llCSV2List(lid));&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    sensor(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        integer s;&lt;br /&gt;
        key     sid;&lt;br /&gt;
 &lt;br /&gt;
        for (s = 0; s &amp;lt; num_detected; s += 1)&lt;br /&gt;
        {&lt;br /&gt;
            sid = llDetectedKey(s);&lt;br /&gt;
            if (~llListFindList(agentsInTranslation, (list)sid))&lt;br /&gt;
            {                &lt;br /&gt;
            }else{&lt;br /&gt;
                addNewAgent(sid);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        integer w;&lt;br /&gt;
        string  spkrLan;&lt;br /&gt;
        string  recepLan;&lt;br /&gt;
        integer recepID;&lt;br /&gt;
        integer lstliPos;&lt;br /&gt;
        string  lanpair;&lt;br /&gt;
        list    translationCache;&lt;br /&gt;
        list    lsttmpli;&lt;br /&gt;
        integer ImessageType;&lt;br /&gt;
        string  Imessage;&lt;br /&gt;
        string  lsttmpStr;&lt;br /&gt;
        string  lst2tmpStr;&lt;br /&gt;
 &lt;br /&gt;
        //Multiplexor Code&lt;br /&gt;
        if ((channel == broadcastChannel) || (channel == priorityNumber))&lt;br /&gt;
        {&lt;br /&gt;
            //==========================&lt;br /&gt;
            //Process Proxy HTTP Request&lt;br /&gt;
            //==========================&lt;br /&gt;
 &lt;br /&gt;
            if (channel == priorityNumber)&lt;br /&gt;
            {&lt;br /&gt;
                if (llStringLength(message) &amp;gt;= 508)&lt;br /&gt;
                {&lt;br /&gt;
                    if (((integer)message/channel) != 4958654)&lt;br /&gt;
                    {&lt;br /&gt;
                        sayCachePrivate = (sayCachePrivate=[]) + sayCachePrivate + [id, message];&lt;br /&gt;
                        return; &lt;br /&gt;
                    }&lt;br /&gt;
                    message = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                message = rxTxtLotPrv(id, message);&lt;br /&gt;
                //Received packet to translate&lt;br /&gt;
                llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0.05, 0.25&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
                lsttmpli = llParseString2List(message, [&amp;quot;~&amp;quot;], []);&lt;br /&gt;
                lsttmpStr = llList2String(lsttmpli, 0);&lt;br /&gt;
                lsttmpli = llDeleteSubList(lsttmpli, 0, 0);&lt;br /&gt;
 &lt;br /&gt;
                lst2tmpStr = llDumpList2String(lsttmpli, &amp;quot;|&amp;quot;);&lt;br /&gt;
                lsttmpli = llCSV2List(lsttmpStr);&lt;br /&gt;
                lstliPos = llList2Integer(lsttmpli, 0);&lt;br /&gt;
                lsttmpli = llDeleteSubList(lsttmpli, 0, 0);&lt;br /&gt;
 &lt;br /&gt;
                checkThrottle(lstliPos, lst2tmpStr, lsttmpli);&lt;br /&gt;
 &lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
            //=======================&lt;br /&gt;
            //Process Global Messages&lt;br /&gt;
            //=======================&lt;br /&gt;
            if (llStringLength(message) &amp;gt;= 508)&lt;br /&gt;
            {&lt;br /&gt;
                if (((integer)message/channel) != 4958654)&lt;br /&gt;
                {&lt;br /&gt;
                    sayCache = (sayCache=[]) + sayCache + [id, message];&lt;br /&gt;
                    return; &lt;br /&gt;
                }&lt;br /&gt;
                message = &amp;quot;&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            message = rxTxtLot(id, message);&lt;br /&gt;
 &lt;br /&gt;
            lsttmpli = llCSV2List(message);&lt;br /&gt;
 &lt;br /&gt;
            if (llGetListLength(lsttmpli) &amp;gt;= 2)    &lt;br /&gt;
            {&lt;br /&gt;
                ImessageType = llList2Integer(lsttmpli, 0);&lt;br /&gt;
                lsttmpli = llDeleteSubList(lsttmpli, 0, 0);&lt;br /&gt;
                Imessage = llList2CSV(lsttmpli);        &lt;br /&gt;
 &lt;br /&gt;
                llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0, 0.25&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
                //Process Message Here&lt;br /&gt;
                if (ImessageType == 1001)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming Heartbeat&lt;br /&gt;
                    if ((integer)Imessage == priorityNumber)&lt;br /&gt;
                    {&lt;br /&gt;
                        llOwnerSay(&amp;quot;Priority Number Conflict!  Resetting Script...&amp;quot;);&lt;br /&gt;
                        llResetScript(); //Reset if conflicting priority number&lt;br /&gt;
                    }&lt;br /&gt;
                    lstliPos = llListFindList(translators, [id]);&lt;br /&gt;
                    if (lstliPos &amp;lt; 0) &lt;br /&gt;
                    {&lt;br /&gt;
                        translators = (translators=[]) + translators + [(integer)Imessage, id];&lt;br /&gt;
                        if ((isMaster &amp;gt; 0) &amp;amp;&amp;amp; (isInitialized))&lt;br /&gt;
                        {&lt;br /&gt;
                            txTxtLot((integer)Imessage, llList2CSV([1002, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
                            txTxtLot((integer)Imessage, llList2CSV([1004, options]));&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        translators = llListReplaceList(translators, [(integer)Imessage], lstliPos - 1, lstliPos - 1);&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if (ImessageType == 1002)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming agentsInTranslation Master Broadcast&lt;br /&gt;
                    if (isMaster == 0)&lt;br /&gt;
                    {&lt;br /&gt;
                        //llMessageLinked(LINK_THIS, 9458021, Imessage, &amp;quot;&amp;quot;);  &lt;br /&gt;
                        lsttmpli = llCSV2List(Imessage);&lt;br /&gt;
                        agentsInTranslation = [];&lt;br /&gt;
                        for (w = 0; w &amp;lt; llGetListLength(lsttmpli); w += 4)&lt;br /&gt;
                        {&lt;br /&gt;
                            agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [llList2Key(lsttmpli, w), llList2String(lsttmpli, w + 1), llList2Integer(lsttmpli, w + 2), llList2Integer(lsttmpli, w + 3)];&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if (ImessageType == 1003)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming agentsInTranslation dump from Slave&lt;br /&gt;
                    lsttmpli = llCSV2List(Imessage);&lt;br /&gt;
                    for (w = 0; w &amp;lt; llGetListLength(lsttmpli); w += 4)&lt;br /&gt;
                    {&lt;br /&gt;
                        addAgent(llList2Key(lsttmpli, w), llList2String(lsttmpli, w + 1), llList2Integer(lsttmpli, w + 2));&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if (ImessageType == 1004)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming Preferences&lt;br /&gt;
                    options = Imessage;&lt;br /&gt;
                    lsttmpli = llCSV2List(options);&lt;br /&gt;
                    showTranslation = llList2Integer(lsttmpli, 0);&lt;br /&gt;
                    tranObjects = llList2Integer(lsttmpli, 1);&lt;br /&gt;
                    autoLanguage = llList2Integer(lsttmpli, 2);&lt;br /&gt;
 &lt;br /&gt;
                    llMessageLinked(LINK_THIS, 3342977, Imessage, &amp;quot;&amp;quot;);  &lt;br /&gt;
                }&lt;br /&gt;
            }            &lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        //Translator Engine Code&lt;br /&gt;
        if ((llToLower(message) == &amp;quot;translator&amp;quot;) &amp;amp;&amp;amp; (isMaster &amp;gt; 0)) &lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS, 2540664, message, id);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ((!enabled) &amp;amp;&amp;amp; (isMaster == 1)) return;&lt;br /&gt;
 &lt;br /&gt;
        if (!tranObjects)&lt;br /&gt;
        {&lt;br /&gt;
            if (llGetAgentSize(id) == ZERO_VECTOR) return;&lt;br /&gt;
        } &lt;br /&gt;
        &lt;br /&gt;
        if (~llListFindList(agentsInTranslation, (list)id)) //lstliPos &amp;gt;= 0)&lt;br /&gt;
        {&lt;br /&gt;
            lstliPos = llListFindList(agentsInTranslation, (list)id);            &lt;br /&gt;
            spkrLan = llList2String(agentsInTranslation, lstliPos + 1);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            spkrLan = addNewAgent(id);&lt;br /&gt;
        } &lt;br /&gt;
        if (spkrLan == &amp;quot;xx&amp;quot;) return;  //Agent Opt-Out&lt;br /&gt;
         &lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;1, 1, 0&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
        //===============================&lt;br /&gt;
        //Formulate Translation Requests&lt;br /&gt;
        //===============================&lt;br /&gt;
        for (w = 0; w &amp;lt; llGetListLength(agentsInTranslation); w += 4)&lt;br /&gt;
        {&lt;br /&gt;
            //Loop through translation group and do appropriate translations as needed&lt;br /&gt;
            recepID = llList2Integer(agentsInTranslation, w + 3);&lt;br /&gt;
            recepLan =  checkLanguage(llList2Key(agentsInTranslation, w + 1)); &lt;br /&gt;
            if ((spkrLan != recepLan) &amp;amp;&amp;amp; (recepLan != &amp;quot;&amp;quot;) &amp;amp;&amp;amp; (recepLan != &amp;quot;xx&amp;quot;))&lt;br /&gt;
            {&lt;br /&gt;
                lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
 &lt;br /&gt;
                &lt;br /&gt;
                if (~llListFindList(translationCache, (list)lanpair)) //lstliPos &amp;lt; 0)&lt;br /&gt;
                {&lt;br /&gt;
                  lstliPos = llListFindList(translationCache, [lanpair]);&lt;br /&gt;
                  translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
                  &lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                  translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        } &lt;br /&gt;
        //Process Requests&lt;br /&gt;
        if (llGetListLength(translationCache) &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            for (w = 0; w &amp;lt; llGetListLength(translationCache); w += 2)&lt;br /&gt;
            {&lt;br /&gt;
                //====================================&lt;br /&gt;
                //Translation&lt;br /&gt;
                //====================================&lt;br /&gt;
                //Forumulate and Send Translation Request&lt;br /&gt;
                lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, w), [&amp;quot;|&amp;quot;],[]), 1); &lt;br /&gt;
                checkThrottle(0, llEscapeURL(message) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, w + 1), llList2String(translationCache, w)]);&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
            spkrLan = &amp;quot;&amp;quot;; &lt;br /&gt;
        //====================================&lt;br /&gt;
        //Language Detection&lt;br /&gt;
        //====================================&lt;br /&gt;
        if (llGetAgentSize(id) != ZERO_VECTOR) //llList2Key(llGetObjectDetails(id, [OBJECT_CREATOR]), 0) == NULL_KEY)&lt;br /&gt;
        {&lt;br /&gt;
            if (((spkrLan == &amp;quot;&amp;quot;) || (llList2Integer(agentsInTranslation, llListFindList(agentsInTranslation, [id]) + 2) == TRUE)) || (isMaster == 2))&lt;br /&gt;
            {&lt;br /&gt;
                //Forumulate and Send Language Detect Request&lt;br /&gt;
                checkThrottle(1, llEscapeURL(message), [llGetTime(), id]);&lt;br /&gt;
            }       &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
    {&lt;br /&gt;
        string  htttmpStr; &lt;br /&gt;
        if (status != 200) &lt;br /&gt;
        {&lt;br /&gt;
            //llOwnerSay(&amp;quot;WWW Error:&amp;quot; + (string)status);&lt;br /&gt;
            llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;1, 0, 0&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
            //llOwnerSay(body);&lt;br /&gt;
            return;&lt;br /&gt;
        } &lt;br /&gt;
        //Process Resonse Code&lt;br /&gt;
        htttmpStr = llGetSubString(body, llSubStringIndex(body, &amp;quot;\&amp;quot;responseStatus\&amp;quot;:&amp;quot;), -1);&lt;br /&gt;
        status = (integer)llGetSubString(htttmpStr, 17, llSubStringIndex(htttmpStr, &amp;quot;}&amp;quot;) - 1);&lt;br /&gt;
        if (status != 200)&lt;br /&gt;
        {&lt;br /&gt;
            //llOwnerSay(&amp;quot;Language Server Returned Error Code: &amp;quot; + (string)status);&lt;br /&gt;
            //llOwnerSay(body);&lt;br /&gt;
            llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;1, 0, 0&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0, 0, 1&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
        llMessageLinked(LINK_THIS, 345149624, body, request_id);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(0.0);  // timer reset&lt;br /&gt;
        integer r;&lt;br /&gt;
        string  tmrtmpStr;&lt;br /&gt;
        list    tmrnewli;&lt;br /&gt;
        integer translatorCount = llGetListLength(translators)/2; &lt;br /&gt;
        if (isInitialized == FALSE)&lt;br /&gt;
        {&lt;br /&gt;
            enabled = TRUE;&lt;br /&gt;
            listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); &lt;br /&gt;
            llListen(777, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
            llMessageLinked(LINK_THIS, 6877259, (string)enabled, NULL_KEY);&lt;br /&gt;
            isInitialized = TRUE;&lt;br /&gt;
        } &lt;br /&gt;
        llMessageLinked(LINK_THIS, 94558323, llList2CSV(agentsInTranslation), &amp;quot;&amp;quot;);&lt;br /&gt;
        if (isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            for (r = 0; r &amp;lt; llGetListLength(agentsInTranslation); r += 4)&lt;br /&gt;
            {&lt;br /&gt;
                tmrtmpStr = llList2String(llGetObjectDetails(llList2Key(agentsInTranslation, r), [OBJECT_POS]), 0);&lt;br /&gt;
                if ((llVecDist(llGetPos(), (vector)tmrtmpStr) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tmrtmpStr != &amp;quot;&amp;quot;))&lt;br /&gt;
                {&lt;br /&gt;
                    tmrnewli = (tmrnewli=[]) + tmrnewli + llList2List(agentsInTranslation, r, r + 3);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            agentsInTranslation = tmrnewli;&lt;br /&gt;
            if ((llGetUnixTime() - lastHeartBeat) &amp;gt;= 5)&lt;br /&gt;
            {&lt;br /&gt;
                //Send heartbeat&lt;br /&gt;
                sendHeartbeat();&lt;br /&gt;
                lastHeartBeat = llGetUnixTime();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            if ((llGetUnixTime() - lastHeartBeat) &amp;gt;= `0 + llGetListLength(agentsInTranslation)*2 + llPow(translatorCount, 1.4) + translatorCount + ((1-llGetRegionTimeDilation()) * 5))&lt;br /&gt;
            {&lt;br /&gt;
                //Send heartbeat&lt;br /&gt;
                sendHeartbeat();&lt;br /&gt;
                lastHeartBeat = llGetUnixTime();&lt;br /&gt;
            }&lt;br /&gt;
        } &lt;br /&gt;
        //turn on and off scanner&lt;br /&gt;
        if ((autoLanguage) &amp;amp;&amp;amp; isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            llSensor(&amp;quot;&amp;quot;, NULL_KEY, AGENT, 20.0, PI);&lt;br /&gt;
        }&lt;br /&gt;
        llSetTimerEvent(4.0); // restart timer&lt;br /&gt;
        //llSetTimerEvent(4 + ((1-llGetRegionTimeDilation()) * 5));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bueno, despues de respiñar todo lo que he podido, creo que el uso de memoria y la velocidad estan practicamente igual que en la version original pero bueno... en la variedad está el gusto no?&lt;br /&gt;
Ya he probado un poco el codigo, y parece que funciona aunque estoy teniendo algunos problemas... Por ejemplo creo que el sistema de traduccion no funciona correctamente, y no me refiero al sistema de traduccion de Google (en mi opinion, si no es el mejor, es uno de los mejores del mundo), sino a que aun queda mucho trabajo por hacer en el script...&lt;br /&gt;
&lt;br /&gt;
El siguiente paso sera intentar dividir el script en dos, o si es posible en tres para repartir el uso de memoria. Tambien me gustaria probar un truco que uso a menudo para traducir paginas en un idioma que no entiendo, lo que hago es que en vez de traducir directamente al español, primero lo traduzco a inglés, y luego desde inglés al español, parece una tonteria y un gasto innecesario, pero si lo hago es porque así suelo entender mejor las traducciones.&lt;br /&gt;
Quiero por un lado el sistema de comunicacion y evaluacion entre traductores, y por otro el sistema de traduccion entre avatares, ¿es muy dificil? no se ya lo veremos...&lt;br /&gt;
&lt;br /&gt;
Well, after saving as much as I could, I think the memory usage and the speed are technically the same as in the original script, but well, in the variety is the taste, isnt it?. &lt;br /&gt;
I have tested a bit the code above already, and it seems to work altought i´m having some problems...&lt;br /&gt;
For instance i think the translation system is not working properly, and i dont mean the Google´s translation system (in my opinion, if is not the best, one of the bests), but that there is still much work to do in the script...&lt;br /&gt;
&lt;br /&gt;
The next step will be to try to divide the script in 2, or 3 if is possible, so we can spread the memory usage. Also I would like to test a trick i use often for to translate languages that i dont understand, what I do first is to translate that language into English, and then from English to Spanish, it seems a nonsense and unnecesary waste, but if i do it is becouse so i usually understand the translations better.&lt;br /&gt;
I want by one part the translators communications and evaluation system, and by other the translation system between avatars, is it very difficult? I doný know , we will see...&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=687523</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=687523"/>
		<updated>2009-12-15T09:46:47Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: /* Welcome */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribucion al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente codigo fué originalmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mi manera...&lt;br /&gt;
No os riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;Universal Translator Engine&#039;&#039; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//November 12, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Web Server Services powered by Google &lt;br /&gt;
//Variables&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
list agentsInTranslationOptions;&lt;br /&gt;
list requestList;&lt;br /&gt;
integer listenID; &lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
integer showTranslation = FALSE;&lt;br /&gt;
integer tranObjects = TRUE; &lt;br /&gt;
integer lastHeartBeat;&lt;br /&gt;
list    languageCodes = [&lt;br /&gt;
&amp;quot;zh-CN&amp;quot;, &amp;quot;zh-TW&amp;quot;, &amp;quot;hr&amp;quot;,  &lt;br /&gt;
&amp;quot;bg&amp;quot;, &amp;quot;be&amp;quot;, &amp;quot;ca&amp;quot;,&lt;br /&gt;
&amp;quot;af&amp;quot;, &amp;quot;sq&amp;quot;, &amp;quot;ar&amp;quot;,   &lt;br /&gt;
&amp;quot;tl&amp;quot;, &amp;quot;fr&amp;quot;, &amp;quot;gl&amp;quot;,    &lt;br /&gt;
&amp;quot;fi&amp;quot;, &amp;quot;en&amp;quot;, &amp;quot;et&amp;quot;,     &lt;br /&gt;
&amp;quot;cs&amp;quot;, &amp;quot;da&amp;quot;, &amp;quot;nl&amp;quot;,  &lt;br /&gt;
&amp;quot;id&amp;quot;, &amp;quot;ga&amp;quot;, &amp;quot;it&amp;quot;,      &lt;br /&gt;
&amp;quot;hi&amp;quot;, &amp;quot;hu&amp;quot;, &amp;quot;is&amp;quot;, &lt;br /&gt;
&amp;quot;de&amp;quot;, &amp;quot;el&amp;quot;, &amp;quot;iw&amp;quot;,    &lt;br /&gt;
&amp;quot;mt&amp;quot;, &amp;quot;no&amp;quot;, &amp;quot;fa&amp;quot;,   &lt;br /&gt;
&amp;quot;lt&amp;quot;, &amp;quot;mk&amp;quot;, &amp;quot;ms&amp;quot;,   &lt;br /&gt;
&amp;quot;ja&amp;quot;, &amp;quot;ko&amp;quot;, &amp;quot;lv&amp;quot;,   &lt;br /&gt;
&amp;quot;sl&amp;quot;, &amp;quot;es&amp;quot;, &amp;quot;sw&amp;quot;, &lt;br /&gt;
&amp;quot;ru&amp;quot;, &amp;quot;sr&amp;quot;, &amp;quot;sk&amp;quot;, &lt;br /&gt;
&amp;quot;pl&amp;quot;, &amp;quot;pt-PT&amp;quot;, &amp;quot;ro&amp;quot;,&lt;br /&gt;
&amp;quot;yi&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;uk&amp;quot;, &amp;quot;vi&amp;quot;, &amp;quot;cy&amp;quot;,&lt;br /&gt;
&amp;quot;sv&amp;quot;,&amp;quot;th&amp;quot;, &amp;quot;tr&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
list    translators;&lt;br /&gt;
list    sayCache;&lt;br /&gt;
list    sayCachePrivate;&lt;br /&gt;
integer priorityNumber;&lt;br /&gt;
integer priorityNumListenID;&lt;br /&gt;
integer isInitialized = FALSE;&lt;br /&gt;
string  options; &lt;br /&gt;
//Options&lt;br /&gt;
//integer debug = TRUE;&lt;br /&gt;
integer broadcastChannel = -9999999; //note this is not the channel used by the HR Universal Translator&lt;br /&gt;
string  password = &amp;quot;password&amp;quot;; //note this is not the password used to encrypt comms of the HR Universal Translator&lt;br /&gt;
integer version = 190;&lt;br /&gt;
//&lt;br /&gt;
sendIM(key imid, string imstr)&lt;br /&gt;
{&lt;br /&gt;
    if (llGetParcelFlags(llGetPos()) &amp;amp; PARCEL_FLAG_ALLOW_SCRIPTS)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 85234119, imstr, imid); &lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_THIS, 85304563, imstr, imid);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//txTxtLot() = sendTextBatch()&lt;br /&gt;
txTxtLot(integer txch, string txtxt) &lt;br /&gt;
{&lt;br /&gt;
    txtxt = llXorBase64StringsCorrect(llStringToBase64(txtxt), llStringToBase64(password));&lt;br /&gt;
    while (llStringLength(txtxt) &amp;gt; 508) //If string is 509 characters or longer &lt;br /&gt;
    {&lt;br /&gt;
        llSay(txch, llGetSubString(txtxt, 0, 507)); //send 508 character chunk&lt;br /&gt;
        txtxt = llGetSubString(txtxt, 508, -1);  //delete 508 character chunk&lt;br /&gt;
    }&lt;br /&gt;
    llSay(txch, txtxt);  //send out any remainder chunk or original chunk&lt;br /&gt;
    //Perry Mizin Comment: I don´t understand the aim of the following if.    &lt;br /&gt;
    //Hank Ramos Comment: this line serves to &amp;quot;trigger&amp;quot; the receiver not to wait for another batch.  If the&lt;br /&gt;
    //message length is exactly 508 characters, the receiver things that another chunk of the message is coming.&lt;br /&gt;
    //This message serves to tell the receiver that the last chunk was the last chunk, not another regular chunk.&lt;br /&gt;
    if (llStringLength(txtxt) == 508)&lt;br /&gt;
        llSay(txch, (string)(txch*4958654));&lt;br /&gt;
    //Hank Ramos Comment: this just flashes the color of the bottom prim to show a message was sent&lt;br /&gt;
    llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0, 0.25&amp;gt;, &amp;quot;&amp;quot;); &lt;br /&gt;
}  &lt;br /&gt;
//string rxTxtLot() = string receiveTextBatch()&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer rxliPos;&lt;br /&gt;
    string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
    {&lt;br /&gt;
        rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
        rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
        sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
    rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
    return rxmsg;&lt;br /&gt;
}&lt;br /&gt;
//string rxTxtLot() = string receiveTextBatch() (Another way)&lt;br /&gt;
integer rxTxtLotBusy = FALSE; //Perry Mizin: added Busy Mode, this could fail or prevent fail&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    if (rxTxtLotBusy == FALSE)&lt;br /&gt;
    {&lt;br /&gt;
        rxTxtLotBusy = TRUE;&lt;br /&gt;
        integer rxliPos;&lt;br /&gt;
        string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
        if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
        {&lt;br /&gt;
            @rxin;&lt;br /&gt;
            rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
            rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
            sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
            if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
            {&lt;br /&gt;
                 jump rxin;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
        rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
        rxTxtLotBusy = FALSE;&lt;br /&gt;
        return rxmsg;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        //Perry Mizin: llSaySomething?&lt;br /&gt;
        return &amp;quot;&amp;quot;;        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string rxTxtLotPrv() = string receiveTextBatchPrivate()&lt;br /&gt;
string rxTxtLotPrv(key prxid, string prxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer prxliPos;&lt;br /&gt;
    string  prxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCachePrivate, (list)prxid))&lt;br /&gt;
    {&lt;br /&gt;
        prxliPos = llListFindList(sayCachePrivate, [prxid]);&lt;br /&gt;
        prxtmpStr = (prxtmpStr=&amp;quot;&amp;quot;) + prxtmpStr + llList2String(sayCachePrivate, prxliPos + 1);&lt;br /&gt;
        sayCachePrivate = llDeleteSubList(sayCachePrivate, prxliPos, prxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    prxmsg = prxtmpStr + prxmsg;&lt;br /&gt;
    prxmsg = llBase64ToString(llXorBase64StringsCorrect(prxmsg, llStringToBase64(password)));&lt;br /&gt;
    return prxmsg;&lt;br /&gt;
}&lt;br /&gt;
//updateTranslatorList()&lt;br /&gt;
updateTranslatorList()&lt;br /&gt;
{&lt;br /&gt;
    integer nx;&lt;br /&gt;
    integer xliLng;&lt;br /&gt;
    list    newList;&lt;br /&gt;
    string  tmpStrPos;&lt;br /&gt;
    integer newMaster;&lt;br /&gt;
    //Scan and remove translators not in the area&lt;br /&gt;
    xliLng = llGetListLength(translators);&lt;br /&gt;
    for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
    {&lt;br /&gt;
        tmpStrPos = llList2String(llGetObjectDetails(llList2Key(translators, nx + 1), [OBJECT_POS]), 0);&lt;br /&gt;
        if ((llVecDist(llGetPos(), (vector)tmpStrPos) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tmpStrPos != &amp;quot;&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            newList = (newList=[]) + newList +  llList2List(translators, nx, nx + 1);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    translators = newList;&lt;br /&gt;
    //llMessageLinked(LINK_THIS,65635544,(string)xliLng,&amp;quot;&amp;quot;); Perry Mizin: what is this necesary for?&lt;br /&gt;
    if (translators == [])&lt;br /&gt;
    {&lt;br /&gt;
        newMaster = 1;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        if (enabled)&lt;br /&gt;
        {&lt;br /&gt;
            xliLng = llGetListLength(translators);&lt;br /&gt;
            newMaster = 2;&lt;br /&gt;
            for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
            {&lt;br /&gt;
                //llOwnerSay(&amp;quot;Checking Priority Number(&amp;quot; +  (string)priorityNumber + &amp;quot;): &amp;quot; + (string)llList2Integer(translators, x));&lt;br /&gt;
                if (llList2Integer(translators, nx) &amp;gt; priorityNumber)&lt;br /&gt;
                {&lt;br /&gt;
                    newMaster = 0;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            newMaster = 0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster &amp;gt; 0) &amp;amp;&amp;amp; (newMaster == 0))&lt;br /&gt;
    {&lt;br /&gt;
        //We are being demoted from master to slave&lt;br /&gt;
        //Flush agentsInTranslation to master&lt;br /&gt;
        if (agentsInTranslation != [])&lt;br /&gt;
        {&lt;br /&gt;
            //Demotion Dump of agentsInTranslation to Master&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1003, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
            if (isInitialized == FALSE)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1004, options])); //error&lt;br /&gt;
        }&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster == 0) &amp;amp;&amp;amp; (newMaster &amp;gt; 0))&lt;br /&gt;
    {&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
        listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); &lt;br /&gt;
    }&lt;br /&gt;
    isMaster = newMaster;&lt;br /&gt;
    llMessageLinked(LINK_THIS, 34829304, (string)isMaster, &amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
//sendHeartbeat()&lt;br /&gt;
sendHeartbeat()&lt;br /&gt;
{&lt;br /&gt;
    updateTranslatorList();&lt;br /&gt;
    txTxtLot(broadcastChannel, llList2CSV([1001, priorityNumber]));&lt;br /&gt;
    //Broadcast agentList to Slaves&lt;br /&gt;
    if (isMaster == 2)&lt;br /&gt;
    {&lt;br /&gt;
        txTxtLot(broadcastChannel, llList2CSV([1002, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//checkThrottle()&lt;br /&gt;
checkThrottle(integer chkn, string chkmsg, list chkli)&lt;br /&gt;
{&lt;br /&gt;
    integer y;&lt;br /&gt;
    integer maxCount;&lt;br /&gt;
    float   chkoldTime;&lt;br /&gt;
    float   sleepTime;&lt;br /&gt;
    list    chknewli;&lt;br /&gt;
    key     returnValue;&lt;br /&gt;
    integer channelToSpeak; &lt;br /&gt;
    //loop though list and remove items older than 25 seconds&lt;br /&gt;
    for (y = 0; y &amp;lt; llGetListLength(requestList); y += 1)&lt;br /&gt;
    {&lt;br /&gt;
        chkoldTime = llList2Float(requestList, y);&lt;br /&gt;
        //Construct new list with only times less than 25 seconds&lt;br /&gt;
        if ((llGetTime() - chkoldTime) &amp;lt;= 25.0)&lt;br /&gt;
        { &lt;br /&gt;
            chknewli = (chknewli=[]) + chknewli + [chkoldTime];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    requestList = chknewli; &lt;br /&gt;
    y = llGetListLength(requestList);&lt;br /&gt;
    //Shunt all translations to linked translators if master&lt;br /&gt;
    if (isMaster == 2)&lt;br /&gt;
    {&lt;br /&gt;
        if (chkn == 0)&lt;br /&gt;
        {&lt;br /&gt;
            //Send HTTP request to other translator&lt;br /&gt;
            //Send out Request to Random Translator Channel&lt;br /&gt;
            channelToSpeak = llList2Integer(llListRandomize(llList2ListStrided(translators, 0, -1, 2), 1), 0);&lt;br /&gt;
            if (channelToSpeak &amp;gt; 0) &lt;br /&gt;
            {&lt;br /&gt;
                txTxtLot(channelToSpeak, llList2CSV([chkn, llList2CSV(chkli)]) + &amp;quot;~&amp;quot; + chkmsg);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if (y == 19)&lt;br /&gt;
    {&lt;br /&gt;
        sleepTime =  25.0 - (llGetTime() - llList2Float(requestList, 0));&lt;br /&gt;
        if (sleepTime &amp;gt; 0) &lt;br /&gt;
        {&lt;br /&gt;
            llSleep(sleepTime);&lt;br /&gt;
        }&lt;br /&gt;
        requestList = llDeleteSubList(requestList, 0, 0);&lt;br /&gt;
    }&lt;br /&gt;
    if (chkn == 0)&lt;br /&gt;
    {&lt;br /&gt;
        chkmsg = &amp;quot;translate?v=1.0&amp;amp;q=&amp;quot; + chkmsg;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        chkmsg = &amp;quot;detect?v=1.0&amp;amp;q=&amp;quot; + chkmsg;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    requestList = (requestList=[]) + requestList + (list)llGetTime();&lt;br /&gt;
    returnValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/&amp;quot; + chkmsg, [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot; &amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
    if (returnValue != NULL_KEY)&lt;br /&gt;
    {&lt;br /&gt;
        if (chkn == 0)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS, 235365342, llList2CSV(chkli), returnValue); &lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS, 235365343, llList2CSV(chkli), returnValue); &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llSleep(40.0); //Something has gone horribly wrong, sleep 40 seconds to clear throttle&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string checkLanguage()&lt;br /&gt;
string checkLanguage(string chklantmpStr)&lt;br /&gt;
{&lt;br /&gt;
    if (llGetSubString(chklantmpStr, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else if (chklantmpStr == &amp;quot;und&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;el&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if (~llListFindList(languageCodes, [chklantmpStr]))&lt;br /&gt;
    {&lt;br /&gt;
 &lt;br /&gt;
    } else {&lt;br /&gt;
        chklantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    chklantmpStr = llGetSubString(chklantmpStr, 0, 1);&lt;br /&gt;
    return chklantmpStr;&lt;br /&gt;
}&lt;br /&gt;
//addAgent()&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
    integer avliPos;&lt;br /&gt;
    integer idNum;&lt;br /&gt;
    if (~llListFindList(agentsInTranslation, (list)avid))&lt;br /&gt;
    {&lt;br /&gt;
        avliPos = llListFindList(agentsInTranslation, [avid]);&lt;br /&gt;
        agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, chklan], avliPos + 1, avliPos + 2);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        @at;&lt;br /&gt;
        idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
        if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
        {//it exists       &lt;br /&gt;
            jump at;&lt;br /&gt;
        }&lt;br /&gt;
        agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, chklan, idNum];&lt;br /&gt;
        llMessageLinked(LINK_THIS, 64562349, avlan, avid);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string addNewAgent()&lt;br /&gt;
string addNewAgent(key newavid)&lt;br /&gt;
{&lt;br /&gt;
    string speakerLan;&lt;br /&gt;
 &lt;br /&gt;
    if (llGetAgentSize(newavid) != ZERO_VECTOR)&lt;br /&gt;
    {&lt;br /&gt;
        speakerLan  = checkLanguage(llGetAgentLanguage(newavid));&lt;br /&gt;
        if (speakerLan == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
            addAgent(newavid, speakerLan, TRUE);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            addAgent(newavid, speakerLan, FALSE);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return speakerLan;&lt;br /&gt;
}&lt;br /&gt;
//key getAgentKey()&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
    if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
    {&lt;br /&gt;
        integer gkliPos = llListFindList(agentsInTranslation, [agentID]);&lt;br /&gt;
        return llList2Key(agentsInTranslation, gkliPos - 3);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//processHTTPResponse()&lt;br /&gt;
processHTTPResponse(integer ntype, string bodyStr, list paramsli)&lt;br /&gt;
{&lt;br /&gt;
    integer spkliPos;&lt;br /&gt;
    list    recepientList;&lt;br /&gt;
    key     recepientID;&lt;br /&gt;
    string  recepientLanguage;&lt;br /&gt;
    string  languagePair;&lt;br /&gt;
    key     speakerID;&lt;br /&gt;
    string  speakerName;&lt;br /&gt;
    string  speakerLanguage;&lt;br /&gt;
    string  translatedText;&lt;br /&gt;
    string  lantmpStr;&lt;br /&gt;
    integer z;&lt;br /&gt;
    integer speakerLanguageReliable;&lt;br /&gt;
    float   speakerLanguageConfidence;&lt;br /&gt;
    list    paramtmpli;&lt;br /&gt;
    //===================&lt;br /&gt;
    //Process Translation&lt;br /&gt;
    //===================&lt;br /&gt;
    if (ntype == 0)&lt;br /&gt;
    {&lt;br /&gt;
        speakerID  = llList2Key(paramsli, 1);&lt;br /&gt;
        speakerName = llKey2Name(speakerID);&lt;br /&gt;
        if (speakerName == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
        }&lt;br /&gt;
        recepientList = llParseString2List(llList2String(paramsli, 2), [&amp;quot;@&amp;quot;], []);&lt;br /&gt;
        paramtmpli = llParseStringKeepNulls(llList2String(paramsli, 3), [&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
        recepientLanguage = llList2String(paramtmpli, 1);&lt;br /&gt;
        languagePair = llDumpList2String(paramtmpli, &amp;quot;&amp;gt;&amp;gt;&amp;quot;); &lt;br /&gt;
        //Perform Text Cleanup&lt;br /&gt;
        z = llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;detectedSourceLanguage\&amp;quot;:\&amp;quot;&amp;quot;); &lt;br /&gt;
        if (z != -1)&lt;br /&gt;
        {&lt;br /&gt;
            translatedText  = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, z);&lt;br /&gt;
            speakerLanguage = checkLanguage(llGetSubString(bodyStr, z + 28, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;}, \&amp;quot;responseDetails\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
            spkliPos = llListFindList(agentsInTranslation, [speakerID]);&lt;br /&gt;
            if (spkliPos &amp;gt;= 0)&lt;br /&gt;
            {&lt;br /&gt;
                if (speakerLanguage != llList2String(agentsInTranslation, spkliPos + 1))&lt;br /&gt;
                {&lt;br /&gt;
                    agentsInTranslation = llListReplaceList(agentsInTranslation, [TRUE], spkliPos + 2, spkliPos + 2);  //Mark for recheck of actual spoken language.&lt;br /&gt;
                }&lt;br /&gt;
            }                   &lt;br /&gt;
        }&lt;br /&gt;
        else if (z == -1)&lt;br /&gt;
        {&lt;br /&gt;
            translatedText = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;}, \&amp;quot;responseDetails\&amp;quot;&amp;quot;));&lt;br /&gt;
        }&lt;br /&gt;
        //Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
        if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            lantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
            //Perry Mizin Comment: Probably I guess this is wrong, maybe I am wrong&lt;br /&gt;
            //Perry Mizin Comment: alternative reverse order: &amp;quot;Hello World&amp;quot; could be &amp;quot;World Hello&amp;quot;&lt;br /&gt;
            //Perry Mizin Comment: reverse order: &amp;quot;Hello World&amp;quot; is &amp;quot;dlroW olleH&amp;quot; or ,,pl^ºM ºllªH,,&lt;br /&gt;
            for(z = llStringLength(translatedText);z &amp;gt;= 0; z--)&lt;br /&gt;
            {&lt;br /&gt;
                lantmpStr = (lantmpStr=&amp;quot;&amp;quot;) + lantmpStr + llGetSubString(translatedText, z, z); &lt;br /&gt;
            }&lt;br /&gt;
            translatedText = lantmpStr;&lt;br /&gt;
        }   &lt;br /&gt;
        lantmpStr = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
        if (showTranslation)&lt;br /&gt;
        {&lt;br /&gt;
            sendIM(speakerID, lantmpStr);&lt;br /&gt;
        } &lt;br /&gt;
        for (z = 0; z &amp;lt; llGetListLength(recepientList); z += 1)&lt;br /&gt;
        {&lt;br /&gt;
            recepientID = getAgentKey(llList2Integer(recepientList, z));&lt;br /&gt;
            if (recepientID != &amp;quot;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, [recepientID]) + 1);&lt;br /&gt;
                if (recepientLanguage != speakerLanguage)&lt;br /&gt;
                {&lt;br /&gt;
                    sendIM(recepientID, lantmpStr);&lt;br /&gt;
                }&lt;br /&gt;
            }  &lt;br /&gt;
        }&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    //===========================&lt;br /&gt;
    //Process Language Detection&lt;br /&gt;
    //===========================&lt;br /&gt;
    if (ntype == 1)&lt;br /&gt;
    {&lt;br /&gt;
        speakerID = llList2Key(paramsli, 1);&lt;br /&gt;
        speakerLanguageReliable = llToLower(llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) + 15, llSubStringIndex(bodyStr, &amp;quot;,\&amp;quot;confidence\&amp;quot;:&amp;quot;) - 1)) == &amp;quot;true&amp;quot;;&lt;br /&gt;
        speakerLanguageConfidence = (float)llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;,\&amp;quot;confidence\&amp;quot;:&amp;quot;) + 14, llSubStringIndex(bodyStr, &amp;quot;}, \&amp;quot;responseDetails\&amp;quot;:&amp;quot;) - 1);&lt;br /&gt;
 &lt;br /&gt;
        spkliPos = llListFindList(agentsInTranslation, [speakerID]);&lt;br /&gt;
        if (((spkliPos &amp;lt; 0) &amp;amp;&amp;amp; (speakerLanguageReliable) || (speakerLanguageConfidence &amp;gt;= 0.08)))&lt;br /&gt;
        {&lt;br /&gt;
            //Analyze Data&lt;br /&gt;
            lantmpStr = checkLanguage(llToLower(llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1)));&lt;br /&gt;
            if (lantmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            } &lt;br /&gt;
            if (speakerLanguageConfidence &amp;lt; 0.14)&lt;br /&gt;
            {&lt;br /&gt;
                addAgent(speakerID, lantmpStr, TRUE);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                addAgent(speakerID, lantmpStr, FALSE);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        //Multiplexor Initialization&lt;br /&gt;
        priorityNumber = version*1000000 + llRound(llFrand(499999) + 50000);&lt;br /&gt;
        llListen(broadcastChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        priorityNumListenID = llListen(priorityNumber, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
        //Send out initial heartbeat&lt;br /&gt;
        lastHeartBeat = llGetUnixTime();&lt;br /&gt;
        txTxtLot(broadcastChannel, llList2CSV([1001, priorityNumber]));&lt;br /&gt;
 &lt;br /&gt;
        //Wait for the network to settle down&lt;br /&gt;
        llSetTimerEvent(5.0); &lt;br /&gt;
        //llSetTimerEvent(10 + ((1-llGetRegionTimeDilation()) * 1));       &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
    {&lt;br /&gt;
        list    ltmpli;&lt;br /&gt;
&lt;br /&gt;
        //Old Multiplexor&lt;br /&gt;
        if (num == 8434532)&lt;br /&gt;
        {&lt;br /&gt;
            enabled = (integer)lstr;&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 3342976)&lt;br /&gt;
        {&lt;br /&gt;
            //Send Preferences&lt;br /&gt;
            options = lstr;&lt;br /&gt;
            if (isInitialized == FALSE) return;&lt;br /&gt;
            ltmpli = llCSV2List(options);&lt;br /&gt;
            showTranslation = llList2Integer(ltmpli, 0);&lt;br /&gt;
            tranObjects = llList2Integer(ltmpli, 1);&lt;br /&gt;
            autoLanguage = llList2Integer(ltmpli, 2);&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1004, options]));&lt;br /&gt;
 &lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 9384610)&lt;br /&gt;
        {&lt;br /&gt;
            if (isMaster == 0) //markering&lt;br /&gt;
                //llMessageLinked(LINK_THIS, 5598321, llList2CSV([id, str, FALSE]), &amp;quot;&amp;quot;);&lt;br /&gt;
                txTxtLot(broadcastChannel, llList2CSV([1003, lid, lstr, FALSE]));&lt;br /&gt;
            else&lt;br /&gt;
                addAgent(lid, lstr, TRUE);&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 345149625)&lt;br /&gt;
        {&lt;br /&gt;
            //Return Translation&lt;br /&gt;
            processHTTPResponse(0, lstr, llCSV2List(lid));&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 345149626)&lt;br /&gt;
        {&lt;br /&gt;
            //Return Detection&lt;br /&gt;
            processHTTPResponse(1, lstr, llCSV2List(lid));&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    sensor(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        integer s;&lt;br /&gt;
        key     sid;&lt;br /&gt;
 &lt;br /&gt;
        for (s = 0; s &amp;lt; num_detected; s += 1)&lt;br /&gt;
        {&lt;br /&gt;
            sid = llDetectedKey(s);&lt;br /&gt;
            if (~llListFindList(agentsInTranslation, (list)sid))&lt;br /&gt;
            {&lt;br /&gt;
                &lt;br /&gt;
            } else {&lt;br /&gt;
                addNewAgent(sid);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        integer w;&lt;br /&gt;
        string  spkrLan;&lt;br /&gt;
        string  recepLan;&lt;br /&gt;
        integer recepID;&lt;br /&gt;
        integer lstliPos;&lt;br /&gt;
        string  lanpair;&lt;br /&gt;
        list    translationCache;&lt;br /&gt;
        list    lsttmpli;&lt;br /&gt;
        integer ImessageType;&lt;br /&gt;
        string  Imessage;&lt;br /&gt;
        string  lsttmpStr;&lt;br /&gt;
        string  lst2tmpStr;&lt;br /&gt;
 &lt;br /&gt;
        //Multiplexor Code&lt;br /&gt;
        if ((channel == broadcastChannel) || (channel == priorityNumber))&lt;br /&gt;
        {&lt;br /&gt;
            //==========================&lt;br /&gt;
            //Process Proxy HTTP Request&lt;br /&gt;
            //==========================&lt;br /&gt;
 &lt;br /&gt;
            if (channel == priorityNumber)&lt;br /&gt;
            {&lt;br /&gt;
                if (llStringLength(message) &amp;gt;= 508)&lt;br /&gt;
                {&lt;br /&gt;
                    if (((integer)message/channel) != 4958654)&lt;br /&gt;
                    {&lt;br /&gt;
                        sayCachePrivate = (sayCachePrivate=[]) + sayCachePrivate + [id, message];&lt;br /&gt;
                        return; &lt;br /&gt;
                    }&lt;br /&gt;
                    message = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                message = rxTxtLotPrv(id, message);&lt;br /&gt;
                //Received packet to translate&lt;br /&gt;
                llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0.05, 0.25&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
                lsttmpli = llParseString2List(message, [&amp;quot;~&amp;quot;], []);&lt;br /&gt;
                lsttmpStr = llList2String(lsttmpli, 0);&lt;br /&gt;
                lsttmpli = llDeleteSubList(lsttmpli, 0, 0);&lt;br /&gt;
 &lt;br /&gt;
                lst2tmpStr = llDumpList2String(lsttmpli, &amp;quot;|&amp;quot;);&lt;br /&gt;
                lsttmpli = llCSV2List(lsttmpStr);&lt;br /&gt;
                lstliPos = llList2Integer(lsttmpli, 0);&lt;br /&gt;
                lsttmpli = llDeleteSubList(lsttmpli, 0, 0);&lt;br /&gt;
 &lt;br /&gt;
                checkThrottle(lstliPos, lst2tmpStr, lsttmpli);&lt;br /&gt;
 &lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
            //=======================&lt;br /&gt;
            //Process Global Messages&lt;br /&gt;
            //=======================&lt;br /&gt;
            if (llStringLength(message) &amp;gt;= 508)&lt;br /&gt;
            {&lt;br /&gt;
                if (((integer)message/channel) != 4958654)&lt;br /&gt;
                {&lt;br /&gt;
                    sayCache = (sayCache=[]) + sayCache + [id, message];&lt;br /&gt;
                    return; &lt;br /&gt;
                }&lt;br /&gt;
                message = &amp;quot;&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            message = rxTxtLot(id, message);&lt;br /&gt;
 &lt;br /&gt;
            lsttmpli = llCSV2List(message);&lt;br /&gt;
 &lt;br /&gt;
            if (llGetListLength(lsttmpli) &amp;gt;= 2)    &lt;br /&gt;
            {&lt;br /&gt;
                ImessageType = llList2Integer(lsttmpli, 0);&lt;br /&gt;
                lsttmpli = llDeleteSubList(lsttmpli, 0, 0);&lt;br /&gt;
                Imessage = llList2CSV(lsttmpli);        &lt;br /&gt;
 &lt;br /&gt;
                llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0, 0.25&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
                //Process Message Here&lt;br /&gt;
                if (ImessageType == 1001)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming Heartbeat&lt;br /&gt;
                    if ((integer)Imessage == priorityNumber)&lt;br /&gt;
                    {&lt;br /&gt;
                        llOwnerSay(&amp;quot;Priority Number Conflict!  Resetting Script...&amp;quot;);&lt;br /&gt;
                        llResetScript(); //Reset if conflicting priority number&lt;br /&gt;
                    }&lt;br /&gt;
                    lstliPos = llListFindList(translators, [id]);&lt;br /&gt;
                    if (lstliPos &amp;lt; 0) &lt;br /&gt;
                    {&lt;br /&gt;
                        translators = (translators=[]) + translators + [(integer)Imessage, id];&lt;br /&gt;
                        if ((isMaster &amp;gt; 0) &amp;amp;&amp;amp; (isInitialized))&lt;br /&gt;
                        {&lt;br /&gt;
                            txTxtLot((integer)Imessage, llList2CSV([1002, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
                            txTxtLot((integer)Imessage, llList2CSV([1004, options]));&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        translators = llListReplaceList(translators, [(integer)Imessage], lstliPos - 1, lstliPos - 1);&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if (ImessageType == 1002)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming agentsInTranslation Master Broadcast&lt;br /&gt;
                    if (isMaster == 0)&lt;br /&gt;
                    {&lt;br /&gt;
                        //llMessageLinked(LINK_THIS, 9458021, Imessage, &amp;quot;&amp;quot;);  &lt;br /&gt;
                        lsttmpli = llCSV2List(Imessage);&lt;br /&gt;
                        agentsInTranslation = [];&lt;br /&gt;
                        for (w = 0; w &amp;lt; llGetListLength(lsttmpli); w += 4)&lt;br /&gt;
                        {&lt;br /&gt;
                            agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [llList2Key(lsttmpli, w), llList2String(lsttmpli, w + 1), llList2Integer(lsttmpli, w + 2), llList2Integer(lsttmpli, w + 3)];&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if (ImessageType == 1003)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming agentsInTranslation dump from Slave&lt;br /&gt;
                    lsttmpli = llCSV2List(Imessage);&lt;br /&gt;
                    for (w = 0; w &amp;lt; llGetListLength(lsttmpli); w += 4)&lt;br /&gt;
                    {&lt;br /&gt;
                        addAgent(llList2Key(lsttmpli, w), llList2String(lsttmpli, w + 1), llList2Integer(lsttmpli, w + 2));&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if (ImessageType == 1004)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming Preferences&lt;br /&gt;
                    options = Imessage;&lt;br /&gt;
                    lsttmpli = llCSV2List(options);&lt;br /&gt;
                    showTranslation = llList2Integer(lsttmpli, 0);&lt;br /&gt;
                    tranObjects = llList2Integer(lsttmpli, 1);&lt;br /&gt;
                    autoLanguage = llList2Integer(lsttmpli, 2);&lt;br /&gt;
 &lt;br /&gt;
                    llMessageLinked(LINK_THIS, 3342977, Imessage, &amp;quot;&amp;quot;);  &lt;br /&gt;
                }&lt;br /&gt;
            }            &lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        //Translator Engine Code&lt;br /&gt;
        if ((llToLower(message) == &amp;quot;translator&amp;quot;) &amp;amp;&amp;amp; (isMaster &amp;gt; 0)) &lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS, 2540664, message, id);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ((!enabled) &amp;amp;&amp;amp; (isMaster == 1)) return;&lt;br /&gt;
 &lt;br /&gt;
        if (!tranObjects)&lt;br /&gt;
        {&lt;br /&gt;
            if (llGetAgentSize(id) != ZERO_VECTOR) return;&lt;br /&gt;
        } &lt;br /&gt;
        lstliPos = llListFindList(agentsInTranslation, [id]);&lt;br /&gt;
        if (lstliPos &amp;gt;= 0)&lt;br /&gt;
        {            &lt;br /&gt;
            spkrLan = llList2String(agentsInTranslation, lstliPos + 1);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            spkrLan = addNewAgent(id);&lt;br /&gt;
        } &lt;br /&gt;
        if (spkrLan == &amp;quot;xx&amp;quot;) return;  //Agent Opt-Out&lt;br /&gt;
         &lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;1, 1, 0&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
        //===============================&lt;br /&gt;
        //Formulate Translation Requests&lt;br /&gt;
        //===============================&lt;br /&gt;
        for (w = 0; w &amp;lt; llGetListLength(agentsInTranslation); w += 4)&lt;br /&gt;
        {&lt;br /&gt;
            //Loop through translation group and do appropriate translations as needed&lt;br /&gt;
            recepID = llList2Integer(agentsInTranslation, w + 3);&lt;br /&gt;
            recepLan =  checkLanguage(llList2Key(agentsInTranslation, w + 1)); &lt;br /&gt;
            if ((spkrLan != recepLan) &amp;amp;&amp;amp; (recepLan != &amp;quot;&amp;quot;) &amp;amp;&amp;amp; (recepLan != &amp;quot;xx&amp;quot;))&lt;br /&gt;
            {&lt;br /&gt;
                lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
 &lt;br /&gt;
                lstliPos = llListFindList(translationCache, [lanpair]);&lt;br /&gt;
                if (lstliPos &amp;lt; 0)&lt;br /&gt;
                {&lt;br /&gt;
                  translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                  translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        } &lt;br /&gt;
        //Process Requests&lt;br /&gt;
        if (llGetListLength(translationCache) &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            for (w = 0; w &amp;lt; llGetListLength(translationCache); w += 2)&lt;br /&gt;
            {&lt;br /&gt;
                //====================================&lt;br /&gt;
                //Translation&lt;br /&gt;
                //====================================&lt;br /&gt;
                //Forumulate and Send Translation Request&lt;br /&gt;
                lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, w), [&amp;quot;|&amp;quot;],[]), 1); &lt;br /&gt;
                checkThrottle(0, llEscapeURL(message) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, w + 1), llList2String(translationCache, w)]);&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
            spkrLan = &amp;quot;&amp;quot;; &lt;br /&gt;
        //====================================&lt;br /&gt;
        //Language Detection&lt;br /&gt;
        //====================================&lt;br /&gt;
        if (llGetAgentSize(id) != ZERO_VECTOR) //llList2Key(llGetObjectDetails(id, [OBJECT_CREATOR]), 0) == NULL_KEY)&lt;br /&gt;
        {&lt;br /&gt;
            if (((spkrLan == &amp;quot;&amp;quot;) || (llList2Integer(agentsInTranslation, llListFindList(agentsInTranslation, [id]) + 2) == TRUE)) || (isMaster == 2))&lt;br /&gt;
            {&lt;br /&gt;
                //Forumulate and Send Language Detect Request&lt;br /&gt;
                checkThrottle(1, llEscapeURL(message), [llGetTime(), id]);&lt;br /&gt;
            }       &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
    {&lt;br /&gt;
        string  htttmpStr; &lt;br /&gt;
        if (status != 200) &lt;br /&gt;
        {&lt;br /&gt;
            //llOwnerSay(&amp;quot;WWW Error:&amp;quot; + (string)status);&lt;br /&gt;
            llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;1, 0, 0&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
            //llOwnerSay(body);&lt;br /&gt;
            return;&lt;br /&gt;
        } &lt;br /&gt;
        //Process Resonse Code&lt;br /&gt;
        htttmpStr = llGetSubString(body, llSubStringIndex(body, &amp;quot;\&amp;quot;responseStatus\&amp;quot;:&amp;quot;), -1);&lt;br /&gt;
        status = (integer)llGetSubString(htttmpStr, 17, llSubStringIndex(htttmpStr, &amp;quot;}&amp;quot;) - 1);&lt;br /&gt;
        if (status != 200)&lt;br /&gt;
        {&lt;br /&gt;
            //llOwnerSay(&amp;quot;Language Server Returned Error Code: &amp;quot; + (string)status);&lt;br /&gt;
            //llOwnerSay(body);&lt;br /&gt;
            llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;1, 0, 0&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0, 0, 1&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
        llMessageLinked(LINK_THIS, 345149624, body, request_id);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(0.0);  // timer reset&lt;br /&gt;
        integer r;&lt;br /&gt;
        string  tmrtmpStr;&lt;br /&gt;
        list    tmrnewli;&lt;br /&gt;
        integer translatorCount = llGetListLength(translators)/2; &lt;br /&gt;
        if (isInitialized == FALSE)&lt;br /&gt;
        {&lt;br /&gt;
            enabled = TRUE;&lt;br /&gt;
            listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); &lt;br /&gt;
            llListen(777, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
            llMessageLinked(LINK_THIS, 6877259, (string)enabled, NULL_KEY);&lt;br /&gt;
            isInitialized = TRUE;&lt;br /&gt;
        } &lt;br /&gt;
        llMessageLinked(LINK_THIS, 94558323, llList2CSV(agentsInTranslation), &amp;quot;&amp;quot;);&lt;br /&gt;
        if (isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            for (r = 0; r &amp;lt; llGetListLength(agentsInTranslation); r += 4)&lt;br /&gt;
            {&lt;br /&gt;
                tmrtmpStr = llList2String(llGetObjectDetails(llList2Key(agentsInTranslation, r), [OBJECT_POS]), 0);&lt;br /&gt;
                if ((llVecDist(llGetPos(), (vector)tmrtmpStr) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tmrtmpStr != &amp;quot;&amp;quot;))&lt;br /&gt;
                {&lt;br /&gt;
                    tmrnewli = (tmrnewli=[]) + tmrnewli + llList2List(agentsInTranslation, r, r + 3);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            agentsInTranslation = tmrnewli;&lt;br /&gt;
            if ((llGetUnixTime() - lastHeartBeat) &amp;gt;= 5)&lt;br /&gt;
            {&lt;br /&gt;
                //Send heartbeat&lt;br /&gt;
                sendHeartbeat();&lt;br /&gt;
                lastHeartBeat = llGetUnixTime();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            if ((llGetUnixTime() - lastHeartBeat) &amp;gt;= `0 + llGetListLength(agentsInTranslation)*2 + llPow(translatorCount, 1.4) + translatorCount + ((1-llGetRegionTimeDilation()) * 5))&lt;br /&gt;
            {&lt;br /&gt;
                //Send heartbeat&lt;br /&gt;
                sendHeartbeat();&lt;br /&gt;
                lastHeartBeat = llGetUnixTime();&lt;br /&gt;
            }&lt;br /&gt;
        } &lt;br /&gt;
        //turn on and off scanner&lt;br /&gt;
        if ((autoLanguage) &amp;amp;&amp;amp; isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            llSensor(&amp;quot;&amp;quot;, NULL_KEY, AGENT, 20.0, PI);&lt;br /&gt;
        }&lt;br /&gt;
        llSetTimerEvent(4.0); // restart timer&lt;br /&gt;
        //llSetTimerEvent(4 + ((1-llGetRegionTimeDilation()) * 5));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bueno, despues de respiñar todo lo que he podido, creo que el uso de memoria y la velocidad estan practicamente igual que en la version original pero bueno... en la variedad está el gusto no?&lt;br /&gt;
Ya he probado un poco el codigo, y parece que funciona aunque estoy teniendo algunos problemas... Por ejemplo creo que el sistema de traduccion no funciona correctamente, y no me refiero al sistema de traduccion de Google (en mi opinion, si no es el mejor, es uno de los mejores del mundo), sino a que aun queda mucho trabajo por hacer en el script...&lt;br /&gt;
&lt;br /&gt;
El siguiente paso sera intentar dividir el script en dos, o si es posible en tres para repartir el uso de memoria. Tambien me gustaria probar un truco que uso a menudo para traducir paginas en un idioma que no entiendo, lo que hago es que en vez de traducir directamente al español, primero lo traduzco a inglés, y luego desde inglés al español, parece una tonteria y un gasto innecesario, pero si lo hago es porque así suelo entender mejor las traducciones.&lt;br /&gt;
Quiero por un lado el sistema de comunicacion y evaluacion entre traductores, y por otro el sistema de traduccion entre avatares, ¿es muy dificil? no se ya lo veremos...&lt;br /&gt;
&lt;br /&gt;
Well, after saving as much as I could, I think the memory usage and the speed are technically the same as in the original script, but well, in the variety is the taste, isnt it?. &lt;br /&gt;
I have tested a bit the code above already, and it seems to work altought i´m having some problems...&lt;br /&gt;
For instance i think the translation system is not working properly, and i dont mean the Google´s translation system (in my opinion, if is not the best, one of the bests), but that there is still much work to do in the script...&lt;br /&gt;
&lt;br /&gt;
The next step will be to try to divide the script in 2, or 3 if is possible, so we can spread the memory usage. Also I would like to test a trick i use often for to translate languages that i dont understand, what I do first is to translate that language into English, and then from English to Spanish, it seems a nonsense and unnecesary waste, but if i do it is becouse so i usually understand the translations better.&lt;br /&gt;
I want by one part the translators communications and evaluation system, and by other the translation system between avatars, is it very difficult? I doný know , we will see...&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=687513</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=687513"/>
		<updated>2009-12-15T08:49:26Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: /* THE CODE BELOW IS NOT TESTED */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribucion al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente codigo fué originalmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mi manera...&lt;br /&gt;
No os riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Universal Translator Engine&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//November 12, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Web Server Services powered by Google &lt;br /&gt;
//Variables&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
list agentsInTranslationOptions;&lt;br /&gt;
list requestList;&lt;br /&gt;
integer listenID; &lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
integer showTranslation = FALSE;&lt;br /&gt;
integer tranObjects = TRUE; &lt;br /&gt;
integer lastHeartBeat;&lt;br /&gt;
list    languageCodes = [&lt;br /&gt;
&amp;quot;zh-CN&amp;quot;, &amp;quot;zh-TW&amp;quot;, &amp;quot;hr&amp;quot;,  &lt;br /&gt;
&amp;quot;bg&amp;quot;, &amp;quot;be&amp;quot;, &amp;quot;ca&amp;quot;,&lt;br /&gt;
&amp;quot;af&amp;quot;, &amp;quot;sq&amp;quot;, &amp;quot;ar&amp;quot;,   &lt;br /&gt;
&amp;quot;tl&amp;quot;, &amp;quot;fr&amp;quot;, &amp;quot;gl&amp;quot;,    &lt;br /&gt;
&amp;quot;fi&amp;quot;, &amp;quot;en&amp;quot;, &amp;quot;et&amp;quot;,     &lt;br /&gt;
&amp;quot;cs&amp;quot;, &amp;quot;da&amp;quot;, &amp;quot;nl&amp;quot;,  &lt;br /&gt;
&amp;quot;id&amp;quot;, &amp;quot;ga&amp;quot;, &amp;quot;it&amp;quot;,      &lt;br /&gt;
&amp;quot;hi&amp;quot;, &amp;quot;hu&amp;quot;, &amp;quot;is&amp;quot;, &lt;br /&gt;
&amp;quot;de&amp;quot;, &amp;quot;el&amp;quot;, &amp;quot;iw&amp;quot;,    &lt;br /&gt;
&amp;quot;mt&amp;quot;, &amp;quot;no&amp;quot;, &amp;quot;fa&amp;quot;,   &lt;br /&gt;
&amp;quot;lt&amp;quot;, &amp;quot;mk&amp;quot;, &amp;quot;ms&amp;quot;,   &lt;br /&gt;
&amp;quot;ja&amp;quot;, &amp;quot;ko&amp;quot;, &amp;quot;lv&amp;quot;,   &lt;br /&gt;
&amp;quot;sl&amp;quot;, &amp;quot;es&amp;quot;, &amp;quot;sw&amp;quot;, &lt;br /&gt;
&amp;quot;ru&amp;quot;, &amp;quot;sr&amp;quot;, &amp;quot;sk&amp;quot;, &lt;br /&gt;
&amp;quot;pl&amp;quot;, &amp;quot;pt-PT&amp;quot;, &amp;quot;ro&amp;quot;,&lt;br /&gt;
&amp;quot;yi&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;uk&amp;quot;, &amp;quot;vi&amp;quot;, &amp;quot;cy&amp;quot;,&lt;br /&gt;
&amp;quot;sv&amp;quot;,&amp;quot;th&amp;quot;, &amp;quot;tr&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
list    translators;&lt;br /&gt;
list    sayCache;&lt;br /&gt;
list    sayCachePrivate;&lt;br /&gt;
integer priorityNumber;&lt;br /&gt;
integer priorityNumListenID;&lt;br /&gt;
integer isInitialized = FALSE;&lt;br /&gt;
string  options; &lt;br /&gt;
//Options&lt;br /&gt;
//integer debug = TRUE;&lt;br /&gt;
integer broadcastChannel = -9999999; //note this is not the channel used by the HR Universal Translator&lt;br /&gt;
string  password = &amp;quot;password&amp;quot;; //note this is not the password used to encrypt comms of the HR Universal Translator&lt;br /&gt;
integer version = 190;&lt;br /&gt;
//&lt;br /&gt;
sendIM(key imid, string imstr)&lt;br /&gt;
{&lt;br /&gt;
    if (llGetParcelFlags(llGetPos()) &amp;amp; PARCEL_FLAG_ALLOW_SCRIPTS)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 85234119, imstr, imid); &lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_THIS, 85304563, imstr, imid);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//txTxtLot() = sendTextBatch()&lt;br /&gt;
txTxtLot(integer txch, string txtxt) &lt;br /&gt;
{&lt;br /&gt;
    txtxt = llXorBase64StringsCorrect(llStringToBase64(txtxt), llStringToBase64(password));&lt;br /&gt;
    while (llStringLength(txtxt) &amp;gt; 508) //If string is 509 characters or longer &lt;br /&gt;
    {&lt;br /&gt;
        llSay(txch, llGetSubString(txtxt, 0, 507)); //send 508 character chunk&lt;br /&gt;
        txtxt = llGetSubString(txtxt, 508, -1);  //delete 508 character chunk&lt;br /&gt;
    }&lt;br /&gt;
    llSay(txch, txtxt);  //send out any remainder chunk or original chunk&lt;br /&gt;
    //Perry Mizin Comment: I don´t understand the aim of the following if.    &lt;br /&gt;
    //Hank Ramos Comment: this line serves to &amp;quot;trigger&amp;quot; the receiver not to wait for another batch.  If the&lt;br /&gt;
    //message length is exactly 508 characters, the receiver things that another chunk of the message is coming.&lt;br /&gt;
    //This message serves to tell the receiver that the last chunk was the last chunk, not another regular chunk.&lt;br /&gt;
    if (llStringLength(txtxt) == 508)&lt;br /&gt;
        llSay(txch, (string)(txch*4958654));&lt;br /&gt;
    //Hank Ramos Comment: this just flashes the color of the bottom prim to show a message was sent&lt;br /&gt;
    llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0, 0.25&amp;gt;, &amp;quot;&amp;quot;); &lt;br /&gt;
}  &lt;br /&gt;
//string rxTxtLot() = string receiveTextBatch()&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer rxliPos;&lt;br /&gt;
    string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
    {&lt;br /&gt;
        rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
        rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
        sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
    rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
    return rxmsg;&lt;br /&gt;
}&lt;br /&gt;
//string rxTxtLot() = string receiveTextBatch() (Another way)&lt;br /&gt;
integer rxTxtLotBusy = FALSE; //Perry Mizin: added Busy Mode, this could fail or prevent fail&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    if (rxTxtLotBusy == FALSE)&lt;br /&gt;
    {&lt;br /&gt;
        rxTxtLotBusy = TRUE;&lt;br /&gt;
        integer rxliPos;&lt;br /&gt;
        string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
        if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
        {&lt;br /&gt;
            @rxin;&lt;br /&gt;
            rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
            rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
            sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
            if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
            {&lt;br /&gt;
                 jump rxin;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
        rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
        rxTxtLotBusy = FALSE;&lt;br /&gt;
        return rxmsg;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        //Perry Mizin: llSaySomething?&lt;br /&gt;
        return &amp;quot;&amp;quot;;        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string rxTxtLotPrv() = string receiveTextBatchPrivate()&lt;br /&gt;
string rxTxtLotPrv(key prxid, string prxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer prxliPos;&lt;br /&gt;
    string  prxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCachePrivate, (list)prxid))&lt;br /&gt;
    {&lt;br /&gt;
        prxliPos = llListFindList(sayCachePrivate, [prxid]);&lt;br /&gt;
        prxtmpStr = (prxtmpStr=&amp;quot;&amp;quot;) + prxtmpStr + llList2String(sayCachePrivate, prxliPos + 1);&lt;br /&gt;
        sayCachePrivate = llDeleteSubList(sayCachePrivate, prxliPos, prxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    prxmsg = prxtmpStr + prxmsg;&lt;br /&gt;
    prxmsg = llBase64ToString(llXorBase64StringsCorrect(prxmsg, llStringToBase64(password)));&lt;br /&gt;
    return prxmsg;&lt;br /&gt;
}&lt;br /&gt;
//updateTranslatorList()&lt;br /&gt;
updateTranslatorList()&lt;br /&gt;
{&lt;br /&gt;
    integer nx;&lt;br /&gt;
    integer xliLng;&lt;br /&gt;
    list    newList;&lt;br /&gt;
    string  tmpStrPos;&lt;br /&gt;
    integer newMaster;&lt;br /&gt;
    //Scan and remove translators not in the area&lt;br /&gt;
    xliLng = llGetListLength(translators);&lt;br /&gt;
    for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
    {&lt;br /&gt;
        tmpStrPos = llList2String(llGetObjectDetails(llList2Key(translators, nx + 1), [OBJECT_POS]), 0);&lt;br /&gt;
        if ((llVecDist(llGetPos(), (vector)tmpStrPos) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tmpStrPos != &amp;quot;&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            newList = (newList=[]) + newList +  llList2List(translators, nx, nx + 1);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    translators = newList;&lt;br /&gt;
    //llMessageLinked(LINK_THIS,65635544,(string)xliLng,&amp;quot;&amp;quot;); Perry Mizin: what is this necesary for?&lt;br /&gt;
    if (translators == [])&lt;br /&gt;
    {&lt;br /&gt;
        newMaster = 1;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        if (enabled)&lt;br /&gt;
        {&lt;br /&gt;
            xliLng = llGetListLength(translators);&lt;br /&gt;
            newMaster = 2;&lt;br /&gt;
            for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
            {&lt;br /&gt;
                //llOwnerSay(&amp;quot;Checking Priority Number(&amp;quot; +  (string)priorityNumber + &amp;quot;): &amp;quot; + (string)llList2Integer(translators, x));&lt;br /&gt;
                if (llList2Integer(translators, nx) &amp;gt; priorityNumber)&lt;br /&gt;
                {&lt;br /&gt;
                    newMaster = 0;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            newMaster = 0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster &amp;gt; 0) &amp;amp;&amp;amp; (newMaster == 0))&lt;br /&gt;
    {&lt;br /&gt;
        //We are being demoted from master to slave&lt;br /&gt;
        //Flush agentsInTranslation to master&lt;br /&gt;
        if (agentsInTranslation != [])&lt;br /&gt;
        {&lt;br /&gt;
            //Demotion Dump of agentsInTranslation to Master&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1003, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
            if (isInitialized == FALSE)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1004, options])); //error&lt;br /&gt;
        }&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster == 0) &amp;amp;&amp;amp; (newMaster &amp;gt; 0))&lt;br /&gt;
    {&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
        listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); &lt;br /&gt;
    }&lt;br /&gt;
    isMaster = newMaster;&lt;br /&gt;
    llMessageLinked(LINK_THIS, 34829304, (string)isMaster, &amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
//sendHeartbeat()&lt;br /&gt;
sendHeartbeat()&lt;br /&gt;
{&lt;br /&gt;
    updateTranslatorList();&lt;br /&gt;
    txTxtLot(broadcastChannel, llList2CSV([1001, priorityNumber]));&lt;br /&gt;
    //Broadcast agentList to Slaves&lt;br /&gt;
    if (isMaster == 2)&lt;br /&gt;
    {&lt;br /&gt;
        txTxtLot(broadcastChannel, llList2CSV([1002, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//checkThrottle()&lt;br /&gt;
checkThrottle(integer chkn, string chkmsg, list chkli)&lt;br /&gt;
{&lt;br /&gt;
    integer y;&lt;br /&gt;
    integer maxCount;&lt;br /&gt;
    float   chkoldTime;&lt;br /&gt;
    float   sleepTime;&lt;br /&gt;
    list    chknewli;&lt;br /&gt;
    key     returnValue;&lt;br /&gt;
    integer channelToSpeak; &lt;br /&gt;
    //loop though list and remove items older than 25 seconds&lt;br /&gt;
    for (y = 0; y &amp;lt; llGetListLength(requestList); y += 1)&lt;br /&gt;
    {&lt;br /&gt;
        chkoldTime = llList2Float(requestList, y);&lt;br /&gt;
        //Construct new list with only times less than 25 seconds&lt;br /&gt;
        if ((llGetTime() - chkoldTime) &amp;lt;= 25.0)&lt;br /&gt;
        { &lt;br /&gt;
            chknewli = (chknewli=[]) + chknewli + [chkoldTime];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    requestList = chknewli; &lt;br /&gt;
    y = llGetListLength(requestList);&lt;br /&gt;
    //Shunt all translations to linked translators if master&lt;br /&gt;
    if (isMaster == 2)&lt;br /&gt;
    {&lt;br /&gt;
        if (chkn == 0)&lt;br /&gt;
        {&lt;br /&gt;
            //Send HTTP request to other translator&lt;br /&gt;
            //Send out Request to Random Translator Channel&lt;br /&gt;
            channelToSpeak = llList2Integer(llListRandomize(llList2ListStrided(translators, 0, -1, 2), 1), 0);&lt;br /&gt;
            if (channelToSpeak &amp;gt; 0) &lt;br /&gt;
            {&lt;br /&gt;
                txTxtLot(channelToSpeak, llList2CSV([chkn, llList2CSV(chkli)]) + &amp;quot;~&amp;quot; + chkmsg);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if (y == 19)&lt;br /&gt;
    {&lt;br /&gt;
        sleepTime =  25.0 - (llGetTime() - llList2Float(requestList, 0));&lt;br /&gt;
        if (sleepTime &amp;gt; 0) &lt;br /&gt;
        {&lt;br /&gt;
            llSleep(sleepTime);&lt;br /&gt;
        }&lt;br /&gt;
        requestList = llDeleteSubList(requestList, 0, 0);&lt;br /&gt;
    }&lt;br /&gt;
    if (chkn == 0)&lt;br /&gt;
    {&lt;br /&gt;
        chkmsg = &amp;quot;translate?v=1.0&amp;amp;q=&amp;quot; + chkmsg;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        chkmsg = &amp;quot;detect?v=1.0&amp;amp;q=&amp;quot; + chkmsg;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    requestList = (requestList=[]) + requestList + (list)llGetTime();&lt;br /&gt;
    returnValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/&amp;quot; + chkmsg, [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot; &amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
    if (returnValue != NULL_KEY)&lt;br /&gt;
    {&lt;br /&gt;
        if (chkn == 0)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS, 235365342, llList2CSV(chkli), returnValue); &lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS, 235365343, llList2CSV(chkli), returnValue); &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llSleep(40.0); //Something has gone horribly wrong, sleep 40 seconds to clear throttle&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string checkLanguage()&lt;br /&gt;
string checkLanguage(string chklantmpStr)&lt;br /&gt;
{&lt;br /&gt;
    if (llGetSubString(chklantmpStr, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else if (chklantmpStr == &amp;quot;und&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;el&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if (~llListFindList(languageCodes, [chklantmpStr]))&lt;br /&gt;
    {&lt;br /&gt;
 &lt;br /&gt;
    } else {&lt;br /&gt;
        chklantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    chklantmpStr = llGetSubString(chklantmpStr, 0, 1);&lt;br /&gt;
    return chklantmpStr;&lt;br /&gt;
}&lt;br /&gt;
//addAgent()&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
    integer avliPos;&lt;br /&gt;
    integer idNum;&lt;br /&gt;
    if (~llListFindList(agentsInTranslation, (list)avid))&lt;br /&gt;
    {&lt;br /&gt;
        avliPos = llListFindList(agentsInTranslation, [avid]);&lt;br /&gt;
        agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, chklan], avliPos + 1, avliPos + 2);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        @at;&lt;br /&gt;
        idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
        if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
        {//it exists       &lt;br /&gt;
            jump at;&lt;br /&gt;
        }&lt;br /&gt;
        agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, chklan, idNum];&lt;br /&gt;
        llMessageLinked(LINK_THIS, 64562349, avlan, avid);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string addNewAgent()&lt;br /&gt;
string addNewAgent(key newavid)&lt;br /&gt;
{&lt;br /&gt;
    string speakerLan;&lt;br /&gt;
 &lt;br /&gt;
    if (llGetAgentSize(newavid) != ZERO_VECTOR)&lt;br /&gt;
    {&lt;br /&gt;
        speakerLan  = checkLanguage(llGetAgentLanguage(newavid));&lt;br /&gt;
        if (speakerLan == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
            addAgent(newavid, speakerLan, TRUE);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            addAgent(newavid, speakerLan, FALSE);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return speakerLan;&lt;br /&gt;
}&lt;br /&gt;
//key getAgentKey()&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
    if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
    {&lt;br /&gt;
        integer gkliPos = llListFindList(agentsInTranslation, [agentID]);&lt;br /&gt;
        return llList2Key(agentsInTranslation, gkliPos - 3);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//processHTTPResponse()&lt;br /&gt;
processHTTPResponse(integer ntype, string bodyStr, list paramsli)&lt;br /&gt;
{&lt;br /&gt;
    integer spkliPos;&lt;br /&gt;
    list    recepientList;&lt;br /&gt;
    key     recepientID;&lt;br /&gt;
    string  recepientLanguage;&lt;br /&gt;
    string  languagePair;&lt;br /&gt;
    key     speakerID;&lt;br /&gt;
    string  speakerName;&lt;br /&gt;
    string  speakerLanguage;&lt;br /&gt;
    string  translatedText;&lt;br /&gt;
    string  lantmpStr;&lt;br /&gt;
    integer z;&lt;br /&gt;
    integer speakerLanguageReliable;&lt;br /&gt;
    float   speakerLanguageConfidence;&lt;br /&gt;
    list    paramtmpli;&lt;br /&gt;
    //===================&lt;br /&gt;
    //Process Translation&lt;br /&gt;
    //===================&lt;br /&gt;
    if (ntype == 0)&lt;br /&gt;
    {&lt;br /&gt;
        speakerID  = llList2Key(paramsli, 1);&lt;br /&gt;
        speakerName = llKey2Name(speakerID);&lt;br /&gt;
        if (speakerName == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
        }&lt;br /&gt;
        recepientList = llParseString2List(llList2String(paramsli, 2), [&amp;quot;@&amp;quot;], []);&lt;br /&gt;
        paramtmpli = llParseStringKeepNulls(llList2String(paramsli, 3), [&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
        recepientLanguage = llList2String(paramtmpli, 1);&lt;br /&gt;
        languagePair = llDumpList2String(paramtmpli, &amp;quot;&amp;gt;&amp;gt;&amp;quot;); &lt;br /&gt;
        //Perform Text Cleanup&lt;br /&gt;
        z = llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;detectedSourceLanguage\&amp;quot;:\&amp;quot;&amp;quot;); &lt;br /&gt;
        if (z != -1)&lt;br /&gt;
        {&lt;br /&gt;
            translatedText  = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, z);&lt;br /&gt;
            speakerLanguage = checkLanguage(llGetSubString(bodyStr, z + 28, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;}, \&amp;quot;responseDetails\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
            spkliPos = llListFindList(agentsInTranslation, [speakerID]);&lt;br /&gt;
            if (spkliPos &amp;gt;= 0)&lt;br /&gt;
            {&lt;br /&gt;
                if (speakerLanguage != llList2String(agentsInTranslation, spkliPos + 1))&lt;br /&gt;
                {&lt;br /&gt;
                    agentsInTranslation = llListReplaceList(agentsInTranslation, [TRUE], spkliPos + 2, spkliPos + 2);  //Mark for recheck of actual spoken language.&lt;br /&gt;
                }&lt;br /&gt;
            }                   &lt;br /&gt;
        }&lt;br /&gt;
        else if (z == -1)&lt;br /&gt;
        {&lt;br /&gt;
            translatedText = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;}, \&amp;quot;responseDetails\&amp;quot;&amp;quot;));&lt;br /&gt;
        }&lt;br /&gt;
        //Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
        if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            lantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
            //Perry Mizin Comment: Probably I guess this is wrong, maybe I am wrong&lt;br /&gt;
            //Perry Mizin Comment: alternative reverse order: &amp;quot;Hello World&amp;quot; could be &amp;quot;World Hello&amp;quot;&lt;br /&gt;
            //Perry Mizin Comment: reverse order: &amp;quot;Hello World&amp;quot; is &amp;quot;dlroW olleH&amp;quot; or ,,pl^ºM ºllªH,,&lt;br /&gt;
            for(z = llStringLength(translatedText);z &amp;gt;= 0; z--)&lt;br /&gt;
            {&lt;br /&gt;
                lantmpStr = (lantmpStr=&amp;quot;&amp;quot;) + lantmpStr + llGetSubString(translatedText, z, z); &lt;br /&gt;
            }&lt;br /&gt;
            translatedText = lantmpStr;&lt;br /&gt;
        }   &lt;br /&gt;
        lantmpStr = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
        if (showTranslation)&lt;br /&gt;
        {&lt;br /&gt;
            sendIM(speakerID, lantmpStr);&lt;br /&gt;
        } &lt;br /&gt;
        for (z = 0; z &amp;lt; llGetListLength(recepientList); z += 1)&lt;br /&gt;
        {&lt;br /&gt;
            recepientID = getAgentKey(llList2Integer(recepientList, z));&lt;br /&gt;
            if (recepientID != &amp;quot;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, [recepientID]) + 1);&lt;br /&gt;
                if (recepientLanguage != speakerLanguage)&lt;br /&gt;
                {&lt;br /&gt;
                    sendIM(recepientID, lantmpStr);&lt;br /&gt;
                }&lt;br /&gt;
            }  &lt;br /&gt;
        }&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    //===========================&lt;br /&gt;
    //Process Language Detection&lt;br /&gt;
    //===========================&lt;br /&gt;
    if (ntype == 1)&lt;br /&gt;
    {&lt;br /&gt;
        speakerID = llList2Key(paramsli, 1);&lt;br /&gt;
        speakerLanguageReliable = llToLower(llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) + 15, llSubStringIndex(bodyStr, &amp;quot;,\&amp;quot;confidence\&amp;quot;:&amp;quot;) - 1)) == &amp;quot;true&amp;quot;;&lt;br /&gt;
        speakerLanguageConfidence = (float)llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;,\&amp;quot;confidence\&amp;quot;:&amp;quot;) + 14, llSubStringIndex(bodyStr, &amp;quot;}, \&amp;quot;responseDetails\&amp;quot;:&amp;quot;) - 1);&lt;br /&gt;
 &lt;br /&gt;
        spkliPos = llListFindList(agentsInTranslation, [speakerID]);&lt;br /&gt;
        if (((spkliPos &amp;lt; 0) &amp;amp;&amp;amp; (speakerLanguageReliable) || (speakerLanguageConfidence &amp;gt;= 0.08)))&lt;br /&gt;
        {&lt;br /&gt;
            //Analyze Data&lt;br /&gt;
            lantmpStr = checkLanguage(llToLower(llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1)));&lt;br /&gt;
            if (lantmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            } &lt;br /&gt;
            if (speakerLanguageConfidence &amp;lt; 0.14)&lt;br /&gt;
            {&lt;br /&gt;
                addAgent(speakerID, lantmpStr, TRUE);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                addAgent(speakerID, lantmpStr, FALSE);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        //Multiplexor Initialization&lt;br /&gt;
        priorityNumber = version*1000000 + llRound(llFrand(499999) + 50000);&lt;br /&gt;
        llListen(broadcastChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        priorityNumListenID = llListen(priorityNumber, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
        //Send out initial heartbeat&lt;br /&gt;
        lastHeartBeat = llGetUnixTime();&lt;br /&gt;
        txTxtLot(broadcastChannel, llList2CSV([1001, priorityNumber]));&lt;br /&gt;
 &lt;br /&gt;
        //Wait for the network to settle down&lt;br /&gt;
        llSetTimerEvent(5.0); &lt;br /&gt;
        //llSetTimerEvent(10 + ((1-llGetRegionTimeDilation()) * 1));       &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
    {&lt;br /&gt;
        list    ltmpli;&lt;br /&gt;
&lt;br /&gt;
        //Old Multiplexor&lt;br /&gt;
        if (num == 8434532)&lt;br /&gt;
        {&lt;br /&gt;
            enabled = (integer)lstr;&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 3342976)&lt;br /&gt;
        {&lt;br /&gt;
            //Send Preferences&lt;br /&gt;
            options = lstr;&lt;br /&gt;
            if (isInitialized == FALSE) return;&lt;br /&gt;
            ltmpli = llCSV2List(options);&lt;br /&gt;
            showTranslation = llList2Integer(ltmpli, 0);&lt;br /&gt;
            tranObjects = llList2Integer(ltmpli, 1);&lt;br /&gt;
            autoLanguage = llList2Integer(ltmpli, 2);&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1004, options]));&lt;br /&gt;
 &lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 9384610)&lt;br /&gt;
        {&lt;br /&gt;
            if (isMaster == 0) //markering&lt;br /&gt;
                //llMessageLinked(LINK_THIS, 5598321, llList2CSV([id, str, FALSE]), &amp;quot;&amp;quot;);&lt;br /&gt;
                txTxtLot(broadcastChannel, llList2CSV([1003, lid, lstr, FALSE]));&lt;br /&gt;
            else&lt;br /&gt;
                addAgent(lid, lstr, TRUE);&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 345149625)&lt;br /&gt;
        {&lt;br /&gt;
            //Return Translation&lt;br /&gt;
            processHTTPResponse(0, lstr, llCSV2List(lid));&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 345149626)&lt;br /&gt;
        {&lt;br /&gt;
            //Return Detection&lt;br /&gt;
            processHTTPResponse(1, lstr, llCSV2List(lid));&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    sensor(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        integer s;&lt;br /&gt;
        key     sid;&lt;br /&gt;
 &lt;br /&gt;
        for (s = 0; s &amp;lt; num_detected; s += 1)&lt;br /&gt;
        {&lt;br /&gt;
            sid = llDetectedKey(s);&lt;br /&gt;
            if (~llListFindList(agentsInTranslation, (list)sid))&lt;br /&gt;
            {&lt;br /&gt;
                &lt;br /&gt;
            } else {&lt;br /&gt;
                addNewAgent(sid);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        integer w;&lt;br /&gt;
        string  spkrLan;&lt;br /&gt;
        string  recepLan;&lt;br /&gt;
        integer recepID;&lt;br /&gt;
        integer lstliPos;&lt;br /&gt;
        string  lanpair;&lt;br /&gt;
        list    translationCache;&lt;br /&gt;
        list    lsttmpli;&lt;br /&gt;
        integer ImessageType;&lt;br /&gt;
        string  Imessage;&lt;br /&gt;
        string  lsttmpStr;&lt;br /&gt;
        string  lst2tmpStr;&lt;br /&gt;
 &lt;br /&gt;
        //Multiplexor Code&lt;br /&gt;
        if ((channel == broadcastChannel) || (channel == priorityNumber))&lt;br /&gt;
        {&lt;br /&gt;
            //==========================&lt;br /&gt;
            //Process Proxy HTTP Request&lt;br /&gt;
            //==========================&lt;br /&gt;
 &lt;br /&gt;
            if (channel == priorityNumber)&lt;br /&gt;
            {&lt;br /&gt;
                if (llStringLength(message) &amp;gt;= 508)&lt;br /&gt;
                {&lt;br /&gt;
                    if (((integer)message/channel) != 4958654)&lt;br /&gt;
                    {&lt;br /&gt;
                        sayCachePrivate = (sayCachePrivate=[]) + sayCachePrivate + [id, message];&lt;br /&gt;
                        return; &lt;br /&gt;
                    }&lt;br /&gt;
                    message = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                message = rxTxtLotPrv(id, message);&lt;br /&gt;
                //Received packet to translate&lt;br /&gt;
                llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0.05, 0.25&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
                lsttmpli = llParseString2List(message, [&amp;quot;~&amp;quot;], []);&lt;br /&gt;
                lsttmpStr = llList2String(lsttmpli, 0);&lt;br /&gt;
                lsttmpli = llDeleteSubList(lsttmpli, 0, 0);&lt;br /&gt;
 &lt;br /&gt;
                lst2tmpStr = llDumpList2String(lsttmpli, &amp;quot;|&amp;quot;);&lt;br /&gt;
                lsttmpli = llCSV2List(lsttmpStr);&lt;br /&gt;
                lstliPos = llList2Integer(lsttmpli, 0);&lt;br /&gt;
                lsttmpli = llDeleteSubList(lsttmpli, 0, 0);&lt;br /&gt;
 &lt;br /&gt;
                checkThrottle(lstliPos, lst2tmpStr, lsttmpli);&lt;br /&gt;
 &lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
            //=======================&lt;br /&gt;
            //Process Global Messages&lt;br /&gt;
            //=======================&lt;br /&gt;
            if (llStringLength(message) &amp;gt;= 508)&lt;br /&gt;
            {&lt;br /&gt;
                if (((integer)message/channel) != 4958654)&lt;br /&gt;
                {&lt;br /&gt;
                    sayCache = (sayCache=[]) + sayCache + [id, message];&lt;br /&gt;
                    return; &lt;br /&gt;
                }&lt;br /&gt;
                message = &amp;quot;&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            message = rxTxtLot(id, message);&lt;br /&gt;
 &lt;br /&gt;
            lsttmpli = llCSV2List(message);&lt;br /&gt;
 &lt;br /&gt;
            if (llGetListLength(lsttmpli) &amp;gt;= 2)    &lt;br /&gt;
            {&lt;br /&gt;
                ImessageType = llList2Integer(lsttmpli, 0);&lt;br /&gt;
                lsttmpli = llDeleteSubList(lsttmpli, 0, 0);&lt;br /&gt;
                Imessage = llList2CSV(lsttmpli);        &lt;br /&gt;
 &lt;br /&gt;
                llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0, 0.25&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
                //Process Message Here&lt;br /&gt;
                if (ImessageType == 1001)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming Heartbeat&lt;br /&gt;
                    if ((integer)Imessage == priorityNumber)&lt;br /&gt;
                    {&lt;br /&gt;
                        llOwnerSay(&amp;quot;Priority Number Conflict!  Resetting Script...&amp;quot;);&lt;br /&gt;
                        llResetScript(); //Reset if conflicting priority number&lt;br /&gt;
                    }&lt;br /&gt;
                    lstliPos = llListFindList(translators, [id]);&lt;br /&gt;
                    if (lstliPos &amp;lt; 0) &lt;br /&gt;
                    {&lt;br /&gt;
                        translators = (translators=[]) + translators + [(integer)Imessage, id];&lt;br /&gt;
                        if ((isMaster &amp;gt; 0) &amp;amp;&amp;amp; (isInitialized))&lt;br /&gt;
                        {&lt;br /&gt;
                            txTxtLot((integer)Imessage, llList2CSV([1002, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
                            txTxtLot((integer)Imessage, llList2CSV([1004, options]));&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        translators = llListReplaceList(translators, [(integer)Imessage], lstliPos - 1, lstliPos - 1);&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if (ImessageType == 1002)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming agentsInTranslation Master Broadcast&lt;br /&gt;
                    if (isMaster == 0)&lt;br /&gt;
                    {&lt;br /&gt;
                        //llMessageLinked(LINK_THIS, 9458021, Imessage, &amp;quot;&amp;quot;);  &lt;br /&gt;
                        lsttmpli = llCSV2List(Imessage);&lt;br /&gt;
                        agentsInTranslation = [];&lt;br /&gt;
                        for (w = 0; w &amp;lt; llGetListLength(lsttmpli); w += 4)&lt;br /&gt;
                        {&lt;br /&gt;
                            agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [llList2Key(lsttmpli, w), llList2String(lsttmpli, w + 1), llList2Integer(lsttmpli, w + 2), llList2Integer(lsttmpli, w + 3)];&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if (ImessageType == 1003)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming agentsInTranslation dump from Slave&lt;br /&gt;
                    lsttmpli = llCSV2List(Imessage);&lt;br /&gt;
                    for (w = 0; w &amp;lt; llGetListLength(lsttmpli); w += 4)&lt;br /&gt;
                    {&lt;br /&gt;
                        addAgent(llList2Key(lsttmpli, w), llList2String(lsttmpli, w + 1), llList2Integer(lsttmpli, w + 2));&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if (ImessageType == 1004)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming Preferences&lt;br /&gt;
                    options = Imessage;&lt;br /&gt;
                    lsttmpli = llCSV2List(options);&lt;br /&gt;
                    showTranslation = llList2Integer(lsttmpli, 0);&lt;br /&gt;
                    tranObjects = llList2Integer(lsttmpli, 1);&lt;br /&gt;
                    autoLanguage = llList2Integer(lsttmpli, 2);&lt;br /&gt;
 &lt;br /&gt;
                    llMessageLinked(LINK_THIS, 3342977, Imessage, &amp;quot;&amp;quot;);  &lt;br /&gt;
                }&lt;br /&gt;
            }            &lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        //Translator Engine Code&lt;br /&gt;
        if ((llToLower(message) == &amp;quot;translator&amp;quot;) &amp;amp;&amp;amp; (isMaster &amp;gt; 0)) &lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS, 2540664, message, id);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ((!enabled) &amp;amp;&amp;amp; (isMaster == 1)) return;&lt;br /&gt;
 &lt;br /&gt;
        if (!tranObjects)&lt;br /&gt;
        {&lt;br /&gt;
            if (llGetAgentSize(id) != ZERO_VECTOR) return;&lt;br /&gt;
        } &lt;br /&gt;
        lstliPos = llListFindList(agentsInTranslation, [id]);&lt;br /&gt;
        if (lstliPos &amp;gt;= 0)&lt;br /&gt;
        {            &lt;br /&gt;
            spkrLan = llList2String(agentsInTranslation, lstliPos + 1);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            spkrLan = addNewAgent(id);&lt;br /&gt;
        } &lt;br /&gt;
        if (spkrLan == &amp;quot;xx&amp;quot;) return;  //Agent Opt-Out&lt;br /&gt;
         &lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;1, 1, 0&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
        //===============================&lt;br /&gt;
        //Formulate Translation Requests&lt;br /&gt;
        //===============================&lt;br /&gt;
        for (w = 0; w &amp;lt; llGetListLength(agentsInTranslation); w += 4)&lt;br /&gt;
        {&lt;br /&gt;
            //Loop through translation group and do appropriate translations as needed&lt;br /&gt;
            recepID = llList2Integer(agentsInTranslation, w + 3);&lt;br /&gt;
            recepLan =  checkLanguage(llList2Key(agentsInTranslation, w + 1)); &lt;br /&gt;
            if ((spkrLan != recepLan) &amp;amp;&amp;amp; (recepLan != &amp;quot;&amp;quot;) &amp;amp;&amp;amp; (recepLan != &amp;quot;xx&amp;quot;))&lt;br /&gt;
            {&lt;br /&gt;
                lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
 &lt;br /&gt;
                lstliPos = llListFindList(translationCache, [lanpair]);&lt;br /&gt;
                if (lstliPos &amp;lt; 0)&lt;br /&gt;
                {&lt;br /&gt;
                  translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                  translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        } &lt;br /&gt;
        //Process Requests&lt;br /&gt;
        if (llGetListLength(translationCache) &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            for (w = 0; w &amp;lt; llGetListLength(translationCache); w += 2)&lt;br /&gt;
            {&lt;br /&gt;
                //====================================&lt;br /&gt;
                //Translation&lt;br /&gt;
                //====================================&lt;br /&gt;
                //Forumulate and Send Translation Request&lt;br /&gt;
                lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, w), [&amp;quot;|&amp;quot;],[]), 1); &lt;br /&gt;
                checkThrottle(0, llEscapeURL(message) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, w + 1), llList2String(translationCache, w)]);&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
            spkrLan = &amp;quot;&amp;quot;; &lt;br /&gt;
        //====================================&lt;br /&gt;
        //Language Detection&lt;br /&gt;
        //====================================&lt;br /&gt;
        if (llGetAgentSize(id) != ZERO_VECTOR) //llList2Key(llGetObjectDetails(id, [OBJECT_CREATOR]), 0) == NULL_KEY)&lt;br /&gt;
        {&lt;br /&gt;
            if (((spkrLan == &amp;quot;&amp;quot;) || (llList2Integer(agentsInTranslation, llListFindList(agentsInTranslation, [id]) + 2) == TRUE)) || (isMaster == 2))&lt;br /&gt;
            {&lt;br /&gt;
                //Forumulate and Send Language Detect Request&lt;br /&gt;
                checkThrottle(1, llEscapeURL(message), [llGetTime(), id]);&lt;br /&gt;
            }       &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
    {&lt;br /&gt;
        string  htttmpStr; &lt;br /&gt;
        if (status != 200) &lt;br /&gt;
        {&lt;br /&gt;
            //llOwnerSay(&amp;quot;WWW Error:&amp;quot; + (string)status);&lt;br /&gt;
            llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;1, 0, 0&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
            //llOwnerSay(body);&lt;br /&gt;
            return;&lt;br /&gt;
        } &lt;br /&gt;
        //Process Resonse Code&lt;br /&gt;
        htttmpStr = llGetSubString(body, llSubStringIndex(body, &amp;quot;\&amp;quot;responseStatus\&amp;quot;:&amp;quot;), -1);&lt;br /&gt;
        status = (integer)llGetSubString(htttmpStr, 17, llSubStringIndex(htttmpStr, &amp;quot;}&amp;quot;) - 1);&lt;br /&gt;
        if (status != 200)&lt;br /&gt;
        {&lt;br /&gt;
            //llOwnerSay(&amp;quot;Language Server Returned Error Code: &amp;quot; + (string)status);&lt;br /&gt;
            //llOwnerSay(body);&lt;br /&gt;
            llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;1, 0, 0&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0, 0, 1&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
        llMessageLinked(LINK_THIS, 345149624, body, request_id);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(0.0);  // timer reset&lt;br /&gt;
        integer r;&lt;br /&gt;
        string  tmrtmpStr;&lt;br /&gt;
        list    tmrnewli;&lt;br /&gt;
        integer translatorCount = llGetListLength(translators)/2; &lt;br /&gt;
        if (isInitialized == FALSE)&lt;br /&gt;
        {&lt;br /&gt;
            enabled = TRUE;&lt;br /&gt;
            listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); &lt;br /&gt;
            llListen(777, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
            llMessageLinked(LINK_THIS, 6877259, (string)enabled, NULL_KEY);&lt;br /&gt;
            isInitialized = TRUE;&lt;br /&gt;
        } &lt;br /&gt;
        llMessageLinked(LINK_THIS, 94558323, llList2CSV(agentsInTranslation), &amp;quot;&amp;quot;);&lt;br /&gt;
        if (isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            for (r = 0; r &amp;lt; llGetListLength(agentsInTranslation); r += 4)&lt;br /&gt;
            {&lt;br /&gt;
                tmrtmpStr = llList2String(llGetObjectDetails(llList2Key(agentsInTranslation, r), [OBJECT_POS]), 0);&lt;br /&gt;
                if ((llVecDist(llGetPos(), (vector)tmrtmpStr) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tmrtmpStr != &amp;quot;&amp;quot;))&lt;br /&gt;
                {&lt;br /&gt;
                    tmrnewli = (tmrnewli=[]) + tmrnewli + llList2List(agentsInTranslation, r, r + 3);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            agentsInTranslation = tmrnewli;&lt;br /&gt;
            if ((llGetUnixTime() - lastHeartBeat) &amp;gt;= 5)&lt;br /&gt;
            {&lt;br /&gt;
                //Send heartbeat&lt;br /&gt;
                sendHeartbeat();&lt;br /&gt;
                lastHeartBeat = llGetUnixTime();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            if ((llGetUnixTime() - lastHeartBeat) &amp;gt;= `0 + llGetListLength(agentsInTranslation)*2 + llPow(translatorCount, 1.4) + translatorCount + ((1-llGetRegionTimeDilation()) * 5))&lt;br /&gt;
            {&lt;br /&gt;
                //Send heartbeat&lt;br /&gt;
                sendHeartbeat();&lt;br /&gt;
                lastHeartBeat = llGetUnixTime();&lt;br /&gt;
            }&lt;br /&gt;
        } &lt;br /&gt;
        //turn on and off scanner&lt;br /&gt;
        if ((autoLanguage) &amp;amp;&amp;amp; isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            llSensor(&amp;quot;&amp;quot;, NULL_KEY, AGENT, 20.0, PI);&lt;br /&gt;
        }&lt;br /&gt;
        llSetTimerEvent(4.0); // restart timer&lt;br /&gt;
        //llSetTimerEvent(4 + ((1-llGetRegionTimeDilation()) * 5));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=686702</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=686702"/>
		<updated>2009-12-14T20:09:50Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: /* THE CODE BELOW IS NOT TESTED */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribucion al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente codigo fué originalmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mi manera...&lt;br /&gt;
No os riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== THE CODE BELOW IS NOT TESTED ==&lt;br /&gt;
Que exagerado&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//November 12, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Web Server Services powered by Google &lt;br /&gt;
//Variables&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
list agentsInTranslationOptions;&lt;br /&gt;
list requestList;&lt;br /&gt;
integer listenID; &lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
integer showTranslation = FALSE;&lt;br /&gt;
integer tranObjects = TRUE; &lt;br /&gt;
integer lastHeartBeat;&lt;br /&gt;
list    languageCodes = [&lt;br /&gt;
&amp;quot;zh-CN&amp;quot;, &amp;quot;zh-TW&amp;quot;, &amp;quot;hr&amp;quot;,  &lt;br /&gt;
&amp;quot;bg&amp;quot;, &amp;quot;be&amp;quot;, &amp;quot;ca&amp;quot;,&lt;br /&gt;
&amp;quot;af&amp;quot;, &amp;quot;sq&amp;quot;, &amp;quot;ar&amp;quot;,   &lt;br /&gt;
&amp;quot;tl&amp;quot;, &amp;quot;fr&amp;quot;, &amp;quot;gl&amp;quot;,    &lt;br /&gt;
&amp;quot;fi&amp;quot;, &amp;quot;en&amp;quot;, &amp;quot;et&amp;quot;,     &lt;br /&gt;
&amp;quot;cs&amp;quot;, &amp;quot;da&amp;quot;, &amp;quot;nl&amp;quot;,  &lt;br /&gt;
&amp;quot;id&amp;quot;, &amp;quot;ga&amp;quot;, &amp;quot;it&amp;quot;,      &lt;br /&gt;
&amp;quot;hi&amp;quot;, &amp;quot;hu&amp;quot;, &amp;quot;is&amp;quot;, &lt;br /&gt;
&amp;quot;de&amp;quot;, &amp;quot;el&amp;quot;, &amp;quot;iw&amp;quot;,    &lt;br /&gt;
&amp;quot;mt&amp;quot;, &amp;quot;no&amp;quot;, &amp;quot;fa&amp;quot;,   &lt;br /&gt;
&amp;quot;lt&amp;quot;, &amp;quot;mk&amp;quot;, &amp;quot;ms&amp;quot;,   &lt;br /&gt;
&amp;quot;ja&amp;quot;, &amp;quot;ko&amp;quot;, &amp;quot;lv&amp;quot;,   &lt;br /&gt;
&amp;quot;sl&amp;quot;, &amp;quot;es&amp;quot;, &amp;quot;sw&amp;quot;, &lt;br /&gt;
&amp;quot;ru&amp;quot;, &amp;quot;sr&amp;quot;, &amp;quot;sk&amp;quot;, &lt;br /&gt;
&amp;quot;pl&amp;quot;, &amp;quot;pt-PT&amp;quot;, &amp;quot;ro&amp;quot;,&lt;br /&gt;
&amp;quot;yi&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;uk&amp;quot;, &amp;quot;vi&amp;quot;, &amp;quot;cy&amp;quot;,&lt;br /&gt;
&amp;quot;sv&amp;quot;,&amp;quot;th&amp;quot;, &amp;quot;tr&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
list    translators;&lt;br /&gt;
list    sayCache;&lt;br /&gt;
list    sayCachePrivate;&lt;br /&gt;
integer priorityNumber;&lt;br /&gt;
integer priorityNumListenID;&lt;br /&gt;
integer isInitialized = FALSE;&lt;br /&gt;
string  options; &lt;br /&gt;
//Options&lt;br /&gt;
//integer debug = TRUE;&lt;br /&gt;
integer broadcastChannel = -9999999; //note this is not the channel used by the HR Universal Translator&lt;br /&gt;
string  password = &amp;quot;password&amp;quot;; //note this is not the password used to encrypt comms of the HR Universal Translator&lt;br /&gt;
integer version = 190;&lt;br /&gt;
//&lt;br /&gt;
sendIM(key imid, string imstr)&lt;br /&gt;
{&lt;br /&gt;
    if (llGetParcelFlags(llGetPos()) &amp;amp; PARCEL_FLAG_ALLOW_SCRIPTS)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 85234119, imstr, imid); &lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_THIS, 85304563, imstr, imid);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//txTxtLot() = sendTextBatch()&lt;br /&gt;
txTxtLot(integer txch, string txtxt) &lt;br /&gt;
{&lt;br /&gt;
    txtxt = llXorBase64StringsCorrect(llStringToBase64(txtxt), llStringToBase64(password));&lt;br /&gt;
    while (llStringLength(txtxt) &amp;gt; 508) //If string is 509 characters or longer &lt;br /&gt;
    {&lt;br /&gt;
        llSay(txch, llGetSubString(txtxt, 0, 507)); //send 508 character chunk&lt;br /&gt;
        txtxt = llGetSubString(txtxt, 508, -1);  //delete 508 character chunk&lt;br /&gt;
    }&lt;br /&gt;
    llSay(txch, txtxt);  //send out any remainder chunk or original chunk&lt;br /&gt;
    //Perry Mizin Comment: I don´t understand the aim of the following if.    &lt;br /&gt;
    //Hank Ramos Comment: this line serves to &amp;quot;trigger&amp;quot; the receiver not to wait for another batch.  If the&lt;br /&gt;
    //message length is exactly 508 characters, the receiver things that another chunk of the message is coming.&lt;br /&gt;
    //This message serves to tell the receiver that the last chunk was the last chunk, not another regular chunk.&lt;br /&gt;
    if (llStringLength(txtxt) == 508)&lt;br /&gt;
        llSay(txch, (string)(txch*4958654));&lt;br /&gt;
    //Hank Ramos Comment: this just flashes the color of the bottom prim to show a message was sent&lt;br /&gt;
    llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0, 0.25&amp;gt;, &amp;quot;&amp;quot;); &lt;br /&gt;
}  &lt;br /&gt;
//string rxTxtLot() = string receiveTextBatch()&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer rxliPos;&lt;br /&gt;
    string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
    {&lt;br /&gt;
        rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
        rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
        sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
    rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
    return rxmsg;&lt;br /&gt;
}&lt;br /&gt;
//string rxTxtLot() = string receiveTextBatch() (Another way)&lt;br /&gt;
integer rxTxtLotBusy = FALSE; //Perry Mizin: added Busy Mode, this could fail or prevent fail&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    if (rxTxtLotBusy == FALSE)&lt;br /&gt;
    {&lt;br /&gt;
        rxTxtLotBusy = TRUE;&lt;br /&gt;
        integer rxliPos;&lt;br /&gt;
        string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
        if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
        {&lt;br /&gt;
            @rxin;&lt;br /&gt;
            rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
            rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
            sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
            if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
            {&lt;br /&gt;
                 jump rxin;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
        rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
        rxTxtLotBusy = FALSE;&lt;br /&gt;
        return rxmsg;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        //Perry Mizin: llSaySomething?&lt;br /&gt;
        return &amp;quot;&amp;quot;;        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string rxTxtLotPrv() = string receiveTextBatchPrivate()&lt;br /&gt;
string rxTxtLotPrv(key prxid, string prxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer prxliPos;&lt;br /&gt;
    string  prxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCachePrivate, (list)prxid))&lt;br /&gt;
    {&lt;br /&gt;
        prxliPos = llListFindList(sayCachePrivate, [prxid]);&lt;br /&gt;
        prxtmpStr = (prxtmpStr=&amp;quot;&amp;quot;) + prxtmpStr + llList2String(sayCachePrivate, prxliPos + 1);&lt;br /&gt;
        sayCachePrivate = llDeleteSubList(sayCachePrivate, prxliPos, prxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    prxmsg = prxtmpStr + prxmsg;&lt;br /&gt;
    prxmsg = llBase64ToString(llXorBase64StringsCorrect(prxmsg, llStringToBase64(password)));&lt;br /&gt;
    return prxmsg;&lt;br /&gt;
}&lt;br /&gt;
//updateTranslatorList()&lt;br /&gt;
updateTranslatorList()&lt;br /&gt;
{&lt;br /&gt;
    integer nx;&lt;br /&gt;
    integer xliLng;&lt;br /&gt;
    list    newList;&lt;br /&gt;
    string  tmpStrPos;&lt;br /&gt;
    integer newMaster;&lt;br /&gt;
    //Scan and remove translators not in the area&lt;br /&gt;
    xliLng = llGetListLength(translators);&lt;br /&gt;
    for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
    {&lt;br /&gt;
        tmpStrPos = llList2String(llGetObjectDetails(llList2Key(translators, nx + 1), [OBJECT_POS]), 0);&lt;br /&gt;
        if ((llVecDist(llGetPos(), (vector)tmpStrPos) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tmpStrPos != &amp;quot;&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            newList = (newList=[]) + newList +  llList2List(translators, nx, nx + 1);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    translators = newList;&lt;br /&gt;
    //llMessageLinked(LINK_THIS,65635544,(string)xliLng,&amp;quot;&amp;quot;); Perry Mizin: what is this necesary for?&lt;br /&gt;
    if (translators == [])&lt;br /&gt;
    {&lt;br /&gt;
        newMaster = 1;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        if (enabled)&lt;br /&gt;
        {&lt;br /&gt;
            xliLng = llGetListLength(translators);&lt;br /&gt;
            newMaster = 2;&lt;br /&gt;
            for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
            {&lt;br /&gt;
                //llOwnerSay(&amp;quot;Checking Priority Number(&amp;quot; +  (string)priorityNumber + &amp;quot;): &amp;quot; + (string)llList2Integer(translators, x));&lt;br /&gt;
                if (llList2Integer(translators, nx) &amp;gt; priorityNumber)&lt;br /&gt;
                {&lt;br /&gt;
                    newMaster = 0;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            newMaster = 0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster &amp;gt; 0) &amp;amp;&amp;amp; (newMaster == 0))&lt;br /&gt;
    {&lt;br /&gt;
        //We are being demoted from master to slave&lt;br /&gt;
        //Flush agentsInTranslation to master&lt;br /&gt;
        if (agentsInTranslation != [])&lt;br /&gt;
        {&lt;br /&gt;
            //Demotion Dump of agentsInTranslation to Master&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1003, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
            if (isInitialized == FALSE)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1004, options])); //error&lt;br /&gt;
        }&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster == 0) &amp;amp;&amp;amp; (newMaster &amp;gt; 0))&lt;br /&gt;
    {&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
        listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); &lt;br /&gt;
    }&lt;br /&gt;
    isMaster = newMaster;&lt;br /&gt;
    llMessageLinked(LINK_THIS, 34829304, (string)isMaster, &amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
//sendHeartbeat()&lt;br /&gt;
sendHeartbeat()&lt;br /&gt;
{&lt;br /&gt;
    updateTranslatorList();&lt;br /&gt;
    txTxtLot(broadcastChannel, llList2CSV([1001, priorityNumber]));&lt;br /&gt;
    //Broadcast agentList to Slaves&lt;br /&gt;
    if (isMaster == 2)&lt;br /&gt;
    {&lt;br /&gt;
        txTxtLot(broadcastChannel, llList2CSV([1002, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//checkThrottle()&lt;br /&gt;
checkThrottle(integer chkn, string chkmsg, list chkli)&lt;br /&gt;
{&lt;br /&gt;
    integer y;&lt;br /&gt;
    integer maxCount;&lt;br /&gt;
    float   chkoldTime;&lt;br /&gt;
    float   sleepTime;&lt;br /&gt;
    list    chknewli;&lt;br /&gt;
    key     returnValue;&lt;br /&gt;
    integer channelToSpeak; &lt;br /&gt;
    //loop though list and remove items older than 25 seconds&lt;br /&gt;
    for (y = 0; y &amp;lt; llGetListLength(requestList); y += 1)&lt;br /&gt;
    {&lt;br /&gt;
        chkoldTime = llList2Float(requestList, y);&lt;br /&gt;
        //Construct new list with only times less than 25 seconds&lt;br /&gt;
        if ((llGetTime() - chkoldTime) &amp;lt;= 25.0)&lt;br /&gt;
        { &lt;br /&gt;
            chknewli = (chknewli=[]) + chknewli + [chkoldTime];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    requestList = chknewli; &lt;br /&gt;
    y = llGetListLength(requestList);&lt;br /&gt;
    //Shunt all translations to linked translators if master&lt;br /&gt;
    if (isMaster == 2)&lt;br /&gt;
    {&lt;br /&gt;
        if (chkn == 0)&lt;br /&gt;
        {&lt;br /&gt;
            //Send HTTP request to other translator&lt;br /&gt;
            //Send out Request to Random Translator Channel&lt;br /&gt;
            channelToSpeak = llList2Integer(llListRandomize(llList2ListStrided(translators, 0, -1, 2), 1), 0);&lt;br /&gt;
            if (channelToSpeak &amp;gt; 0) &lt;br /&gt;
            {&lt;br /&gt;
                txTxtLot(channelToSpeak, llList2CSV([chkn, llList2CSV(chkli)]) + &amp;quot;~&amp;quot; + chkmsg);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if (y == 19)&lt;br /&gt;
    {&lt;br /&gt;
        sleepTime =  25.0 - (llGetTime() - llList2Float(requestList, 0));&lt;br /&gt;
        if (sleepTime &amp;gt; 0) &lt;br /&gt;
        {&lt;br /&gt;
            llSleep(sleepTime);&lt;br /&gt;
        }&lt;br /&gt;
        requestList = llDeleteSubList(requestList, 0, 0);&lt;br /&gt;
    }&lt;br /&gt;
    if (chkn == 0)&lt;br /&gt;
    {&lt;br /&gt;
        chkmsg = &amp;quot;translate?v=1.0&amp;amp;q=&amp;quot; + chkmsg;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        chkmsg = &amp;quot;detect?v=1.0&amp;amp;q=&amp;quot; + chkmsg;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    requestList = (requestList=[]) + requestList + (list)llGetTime();&lt;br /&gt;
    returnValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/&amp;quot; + chkmsg, [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot; &amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
    if (returnValue != NULL_KEY)&lt;br /&gt;
    {&lt;br /&gt;
        if (chkn == 0)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS, 235365342, llList2CSV(chkli), returnValue); &lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS, 235365343, llList2CSV(chkli), returnValue); &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llSleep(40.0); //Something has gone horribly wrong, sleep 40 seconds to clear throttle&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string checkLanguage()&lt;br /&gt;
string checkLanguage(string chklantmpStr)&lt;br /&gt;
{&lt;br /&gt;
    if (llGetSubString(chklantmpStr, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else if (chklantmpStr == &amp;quot;und&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;el&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if (~llListFindList(languageCodes, [chklantmpStr]))&lt;br /&gt;
    {&lt;br /&gt;
 &lt;br /&gt;
    } else {&lt;br /&gt;
        chklantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    chklantmpStr = llGetSubString(chklantmpStr, 0, 1);&lt;br /&gt;
    return chklantmpStr;&lt;br /&gt;
}&lt;br /&gt;
//addAgent()&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
    integer avliPos;&lt;br /&gt;
    integer idNum;&lt;br /&gt;
    if (~llListFindList(agentsInTranslation, (list)avid))&lt;br /&gt;
    {&lt;br /&gt;
        avliPos = llListFindList(agentsInTranslation, [avid]);&lt;br /&gt;
        agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, chklan], avliPos + 1, avliPos + 2);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        @at;&lt;br /&gt;
        idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
        if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
        {//it exists       &lt;br /&gt;
            jump at;&lt;br /&gt;
        }&lt;br /&gt;
        agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, chklan, idNum];&lt;br /&gt;
        llMessageLinked(LINK_THIS, 64562349, avlan, avid);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string addNewAgent()&lt;br /&gt;
string addNewAgent(key newavid)&lt;br /&gt;
{&lt;br /&gt;
    string speakerLan;&lt;br /&gt;
 &lt;br /&gt;
    if (llGetAgentSize(newavid) != ZERO_VECTOR)&lt;br /&gt;
    {&lt;br /&gt;
        speakerLan  = checkLanguage(llGetAgentLanguage(newavid));&lt;br /&gt;
        if (speakerLan == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
            addAgent(newavid, speakerLan, TRUE);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            addAgent(newavid, speakerLan, FALSE);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return speakerLan;&lt;br /&gt;
}&lt;br /&gt;
//key getAgentKey()&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
    if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
    {&lt;br /&gt;
        integer gkliPos = llListFindList(agentsInTranslation, [agentID]);&lt;br /&gt;
        return llList2Key(agentsInTranslation, gkliPos - 3);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//processHTTPResponse()&lt;br /&gt;
processHTTPResponse(integer ntype, string bodyStr, list paramsli)&lt;br /&gt;
{&lt;br /&gt;
    integer spkliPos;&lt;br /&gt;
    list    recepientList;&lt;br /&gt;
    key     recepientID;&lt;br /&gt;
    string  recepientLanguage;&lt;br /&gt;
    string  languagePair;&lt;br /&gt;
    key     speakerID;&lt;br /&gt;
    string  speakerName;&lt;br /&gt;
    string  speakerLanguage;&lt;br /&gt;
    string  translatedText;&lt;br /&gt;
    string  lantmpStr;&lt;br /&gt;
    integer z;&lt;br /&gt;
    integer speakerLanguageReliable;&lt;br /&gt;
    float   speakerLanguageConfidence;&lt;br /&gt;
    list    paramtmpli;&lt;br /&gt;
    //===================&lt;br /&gt;
    //Process Translation&lt;br /&gt;
    //===================&lt;br /&gt;
    if (ntype == 0)&lt;br /&gt;
    {&lt;br /&gt;
        speakerID  = llList2Key(paramsli, 1);&lt;br /&gt;
        speakerName = llKey2Name(speakerID);&lt;br /&gt;
        if (speakerName == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
        }&lt;br /&gt;
        recepientList = llParseString2List(llList2String(paramsli, 2), [&amp;quot;@&amp;quot;], []);&lt;br /&gt;
        paramtmpli = llParseStringKeepNulls(llList2String(paramsli, 3), [&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
        recepientLanguage = llList2String(paramtmpli, 1);&lt;br /&gt;
        languagePair = llDumpList2String(paramtmpli, &amp;quot;&amp;gt;&amp;gt;&amp;quot;); &lt;br /&gt;
        //Perform Text Cleanup&lt;br /&gt;
        z = llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;detectedSourceLanguage\&amp;quot;:\&amp;quot;&amp;quot;); &lt;br /&gt;
        if (z != -1)&lt;br /&gt;
        {&lt;br /&gt;
            translatedText  = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, z);&lt;br /&gt;
            speakerLanguage = checkLanguage(llGetSubString(bodyStr, z + 28, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;}, \&amp;quot;responseDetails\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
            spkliPos = llListFindList(agentsInTranslation, [speakerID]);&lt;br /&gt;
            if (spkliPos &amp;gt;= 0)&lt;br /&gt;
            {&lt;br /&gt;
                if (speakerLanguage != llList2String(agentsInTranslation, spkliPos + 1))&lt;br /&gt;
                {&lt;br /&gt;
                    agentsInTranslation = llListReplaceList(agentsInTranslation, [TRUE], spkliPos + 2, spkliPos + 2);  //Mark for recheck of actual spoken language.&lt;br /&gt;
                }&lt;br /&gt;
            }                   &lt;br /&gt;
        }&lt;br /&gt;
        else if (z == -1)&lt;br /&gt;
        {&lt;br /&gt;
            translatedText = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;}, \&amp;quot;responseDetails\&amp;quot;&amp;quot;));&lt;br /&gt;
        }&lt;br /&gt;
        //Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
        if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            lantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
            //Perry Mizin Comment: Probably I guess this is wrong, maybe I am wrong&lt;br /&gt;
            //Perry Mizin Comment: alternative reverse order: &amp;quot;Hello World&amp;quot; could be &amp;quot;World Hello&amp;quot;&lt;br /&gt;
            //Perry Mizin Comment: reverse order: &amp;quot;Hello World&amp;quot; is &amp;quot;dlroW olleH&amp;quot; or ,,pl^ºM ºllªH,,&lt;br /&gt;
            for(z = llStringLength(translatedText);z &amp;gt;= 0; z--)&lt;br /&gt;
            {&lt;br /&gt;
                lantmpStr = (lantmpStr=&amp;quot;&amp;quot;) + lantmpStr + llGetSubString(translatedText, z, z); &lt;br /&gt;
            }&lt;br /&gt;
            translatedText = lantmpStr;&lt;br /&gt;
        }   &lt;br /&gt;
        lantmpStr = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
        if (showTranslation)&lt;br /&gt;
        {&lt;br /&gt;
            sendIM(speakerID, lantmpStr);&lt;br /&gt;
        } &lt;br /&gt;
        for (z = 0; z &amp;lt; llGetListLength(recepientList); z += 1)&lt;br /&gt;
        {&lt;br /&gt;
            recepientID = getAgentKey(llList2Integer(recepientList, z));&lt;br /&gt;
            if (recepientID != &amp;quot;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, [recepientID]) + 1);&lt;br /&gt;
                if (recepientLanguage != speakerLanguage)&lt;br /&gt;
                {&lt;br /&gt;
                    sendIM(recepientID, lantmpStr);&lt;br /&gt;
                }&lt;br /&gt;
            }  &lt;br /&gt;
        }&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    //===========================&lt;br /&gt;
    //Process Language Detection&lt;br /&gt;
    //===========================&lt;br /&gt;
    if (ntype == 1)&lt;br /&gt;
    {&lt;br /&gt;
        speakerID = llList2Key(paramsli, 1);&lt;br /&gt;
        speakerLanguageReliable = llToLower(llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) + 15, llSubStringIndex(bodyStr, &amp;quot;,\&amp;quot;confidence\&amp;quot;:&amp;quot;) - 1)) == &amp;quot;true&amp;quot;;&lt;br /&gt;
        speakerLanguageConfidence = (float)llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;,\&amp;quot;confidence\&amp;quot;:&amp;quot;) + 14, llSubStringIndex(bodyStr, &amp;quot;}, \&amp;quot;responseDetails\&amp;quot;:&amp;quot;) - 1);&lt;br /&gt;
 &lt;br /&gt;
        spkliPos = llListFindList(agentsInTranslation, [speakerID]);&lt;br /&gt;
        if (((spkliPos &amp;lt; 0) &amp;amp;&amp;amp; (speakerLanguageReliable) || (speakerLanguageConfidence &amp;gt;= 0.08)))&lt;br /&gt;
        {&lt;br /&gt;
            //Analyze Data&lt;br /&gt;
            lantmpStr = checkLanguage(llToLower(llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1)));&lt;br /&gt;
            if (lantmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            } &lt;br /&gt;
            if (speakerLanguageConfidence &amp;lt; 0.14)&lt;br /&gt;
            {&lt;br /&gt;
                addAgent(speakerID, lantmpStr, TRUE);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                addAgent(speakerID, lantmpStr, FALSE);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        //Multiplexor Initialization&lt;br /&gt;
        priorityNumber = version*1000000 + llRound(llFrand(499999) + 50000);&lt;br /&gt;
        llListen(broadcastChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        priorityNumListenID = llListen(priorityNumber, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
        //Send out initial heartbeat&lt;br /&gt;
        lastHeartBeat = llGetUnixTime();&lt;br /&gt;
        txTxtLot(broadcastChannel, llList2CSV([1001, priorityNumber]));&lt;br /&gt;
 &lt;br /&gt;
        //Wait for the network to settle down&lt;br /&gt;
        llSetTimerEvent(5.0); &lt;br /&gt;
        //llSetTimerEvent(10 + ((1-llGetRegionTimeDilation()) * 1));       &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
    {&lt;br /&gt;
        list    ltmpli;&lt;br /&gt;
&lt;br /&gt;
        //Old Multiplexor&lt;br /&gt;
        if (num == 8434532)&lt;br /&gt;
        {&lt;br /&gt;
            enabled = (integer)lstr;&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 3342976)&lt;br /&gt;
        {&lt;br /&gt;
            //Send Preferences&lt;br /&gt;
            options = lstr;&lt;br /&gt;
            if (isInitialized == FALSE) return;&lt;br /&gt;
            ltmpli = llCSV2List(options);&lt;br /&gt;
            showTranslation = llList2Integer(ltmpli, 0);&lt;br /&gt;
            tranObjects = llList2Integer(ltmpli, 1);&lt;br /&gt;
            autoLanguage = llList2Integer(ltmpli, 2);&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1004, options]));&lt;br /&gt;
 &lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 9384610)&lt;br /&gt;
        {&lt;br /&gt;
            if (isMaster == 0) //markering&lt;br /&gt;
                //llMessageLinked(LINK_THIS, 5598321, llList2CSV([id, str, FALSE]), &amp;quot;&amp;quot;);&lt;br /&gt;
                txTxtLot(broadcastChannel, llList2CSV([1003, lid, lstr, FALSE]));&lt;br /&gt;
            else&lt;br /&gt;
                addAgent(lid, lstr, TRUE);&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 345149625)&lt;br /&gt;
        {&lt;br /&gt;
            //Return Translation&lt;br /&gt;
            processHTTPResponse(0, lstr, llCSV2List(lid));&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 345149626)&lt;br /&gt;
        {&lt;br /&gt;
            //Return Detection&lt;br /&gt;
            processHTTPResponse(1, lstr, llCSV2List(lid));&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    sensor(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        integer s;&lt;br /&gt;
        key     sid;&lt;br /&gt;
 &lt;br /&gt;
        for (s = 0; s &amp;lt; num_detected; s += 1)&lt;br /&gt;
        {&lt;br /&gt;
            sid = llDetectedKey(s);&lt;br /&gt;
            if (~llListFindList(agentsInTranslation, (list)sid))&lt;br /&gt;
            {&lt;br /&gt;
                &lt;br /&gt;
            } else {&lt;br /&gt;
                addNewAgent(sid);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        integer w;&lt;br /&gt;
        string  spkrLan;&lt;br /&gt;
        string  recepLan;&lt;br /&gt;
        integer recepID;&lt;br /&gt;
        integer lstliPos;&lt;br /&gt;
        string  lanpair;&lt;br /&gt;
        list    translationCache;&lt;br /&gt;
        list    lsttmpli;&lt;br /&gt;
        integer ImessageType;&lt;br /&gt;
        string  Imessage;&lt;br /&gt;
        string  lsttmpStr;&lt;br /&gt;
        string  lst2tmpStr;&lt;br /&gt;
 &lt;br /&gt;
        //Multiplexor Code&lt;br /&gt;
        if ((channel == broadcastChannel) || (channel == priorityNumber))&lt;br /&gt;
        {&lt;br /&gt;
            //==========================&lt;br /&gt;
            //Process Proxy HTTP Request&lt;br /&gt;
            //==========================&lt;br /&gt;
 &lt;br /&gt;
            if (channel == priorityNumber)&lt;br /&gt;
            {&lt;br /&gt;
                if (llStringLength(message) &amp;gt;= 508)&lt;br /&gt;
                {&lt;br /&gt;
                    if (((integer)message/channel) != 4958654)&lt;br /&gt;
                    {&lt;br /&gt;
                        sayCachePrivate = (sayCachePrivate=[]) + sayCachePrivate + [id, message];&lt;br /&gt;
                        return; &lt;br /&gt;
                    }&lt;br /&gt;
                    message = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                message = rxTxtLotPrv(id, message);&lt;br /&gt;
                //Received packet to translate&lt;br /&gt;
                llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0.05, 0.25&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
                lsttmpli = llParseString2List(message, [&amp;quot;~&amp;quot;], []);&lt;br /&gt;
                lsttmpStr = llList2String(lsttmpli, 0);&lt;br /&gt;
                lsttmpli = llDeleteSubList(lsttmpli, 0, 0);&lt;br /&gt;
 &lt;br /&gt;
                lst2tmpStr = llDumpList2String(lsttmpli, &amp;quot;|&amp;quot;);&lt;br /&gt;
                lsttmpli = llCSV2List(lsttmpStr);&lt;br /&gt;
                lstliPos = llList2Integer(lsttmpli, 0);&lt;br /&gt;
                lsttmpli = llDeleteSubList(lsttmpli, 0, 0);&lt;br /&gt;
 &lt;br /&gt;
                checkThrottle(lstliPos, lst2tmpStr, lsttmpli);&lt;br /&gt;
 &lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
            //=======================&lt;br /&gt;
            //Process Global Messages&lt;br /&gt;
            //=======================&lt;br /&gt;
            if (llStringLength(message) &amp;gt;= 508)&lt;br /&gt;
            {&lt;br /&gt;
                if (((integer)message/channel) != 4958654)&lt;br /&gt;
                {&lt;br /&gt;
                    sayCache = (sayCache=[]) + sayCache + [id, message];&lt;br /&gt;
                    return; &lt;br /&gt;
                }&lt;br /&gt;
                message = &amp;quot;&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            message = rxTxtLot(id, message);&lt;br /&gt;
 &lt;br /&gt;
            lsttmpli = llCSV2List(message);&lt;br /&gt;
 &lt;br /&gt;
            if (llGetListLength(lsttmpli) &amp;gt;= 2)    &lt;br /&gt;
            {&lt;br /&gt;
                ImessageType = llList2Integer(lsttmpli, 0);&lt;br /&gt;
                lsttmpli = llDeleteSubList(lsttmpli, 0, 0);&lt;br /&gt;
                Imessage = llList2CSV(lsttmpli);        &lt;br /&gt;
 &lt;br /&gt;
                llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0, 0.25&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
                //Process Message Here&lt;br /&gt;
                if (ImessageType == 1001)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming Heartbeat&lt;br /&gt;
                    if ((integer)Imessage == priorityNumber)&lt;br /&gt;
                    {&lt;br /&gt;
                        llOwnerSay(&amp;quot;Priority Number Conflict!  Resetting Script...&amp;quot;);&lt;br /&gt;
                        llResetScript(); //Reset if conflicting priority number&lt;br /&gt;
                    }&lt;br /&gt;
                    lstliPos = llListFindList(translators, [id]);&lt;br /&gt;
                    if (lstliPos &amp;lt; 0) &lt;br /&gt;
                    {&lt;br /&gt;
                        translators = (translators=[]) + translators + [(integer)Imessage, id];&lt;br /&gt;
                        if ((isMaster &amp;gt; 0) &amp;amp;&amp;amp; (isInitialized))&lt;br /&gt;
                        {&lt;br /&gt;
                            txTxtLot((integer)Imessage, llList2CSV([1002, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
                            txTxtLot((integer)Imessage, llList2CSV([1004, options]));&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        translators = llListReplaceList(translators, [(integer)Imessage], lstliPos - 1, lstliPos - 1);&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if (ImessageType == 1002)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming agentsInTranslation Master Broadcast&lt;br /&gt;
                    if (isMaster == 0)&lt;br /&gt;
                    {&lt;br /&gt;
                        //llMessageLinked(LINK_THIS, 9458021, Imessage, &amp;quot;&amp;quot;);  &lt;br /&gt;
                        lsttmpli = llCSV2List(Imessage);&lt;br /&gt;
                        agentsInTranslation = [];&lt;br /&gt;
                        for (w = 0; w &amp;lt; llGetListLength(lsttmpli); w += 4)&lt;br /&gt;
                        {&lt;br /&gt;
                            agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [llList2Key(lsttmpli, w), llList2String(lsttmpli, w + 1), llList2Integer(lsttmpli, w + 2), llList2Integer(lsttmpli, w + 3)];&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if (ImessageType == 1003)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming agentsInTranslation dump from Slave&lt;br /&gt;
                    lsttmpli = llCSV2List(Imessage);&lt;br /&gt;
                    for (w = 0; w &amp;lt; llGetListLength(lsttmpli); w += 4)&lt;br /&gt;
                    {&lt;br /&gt;
                        addAgent(llList2Key(lsttmpli, w), llList2String(lsttmpli, w + 1), llList2Integer(lsttmpli, w + 2));&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if (ImessageType == 1004)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming Preferences&lt;br /&gt;
                    options = Imessage;&lt;br /&gt;
                    lsttmpli = llCSV2List(options);&lt;br /&gt;
                    showTranslation = llList2Integer(lsttmpli, 0);&lt;br /&gt;
                    tranObjects = llList2Integer(lsttmpli, 1);&lt;br /&gt;
                    autoLanguage = llList2Integer(lsttmpli, 2);&lt;br /&gt;
 &lt;br /&gt;
                    llMessageLinked(LINK_THIS, 3342977, Imessage, &amp;quot;&amp;quot;);  &lt;br /&gt;
                }&lt;br /&gt;
            }            &lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        //Translator Engine Code&lt;br /&gt;
        if ((llToLower(message) == &amp;quot;translator&amp;quot;) &amp;amp;&amp;amp; (isMaster &amp;gt; 0)) &lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS, 2540664, message, id);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ((!enabled) &amp;amp;&amp;amp; (isMaster == 1)) return;&lt;br /&gt;
 &lt;br /&gt;
        if (!tranObjects)&lt;br /&gt;
        {&lt;br /&gt;
            if (llGetAgentSize(id) != ZERO_VECTOR) return;&lt;br /&gt;
        } &lt;br /&gt;
        lstliPos = llListFindList(agentsInTranslation, [id]);&lt;br /&gt;
        if (lstliPos &amp;gt;= 0)&lt;br /&gt;
        {            &lt;br /&gt;
            spkrLan = llList2String(agentsInTranslation, lstliPos + 1);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            spkrLan = addNewAgent(id);&lt;br /&gt;
        } &lt;br /&gt;
        if (spkrLan == &amp;quot;xx&amp;quot;) return;  //Agent Opt-Out&lt;br /&gt;
         &lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;1, 1, 0&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
        //===============================&lt;br /&gt;
        //Formulate Translation Requests&lt;br /&gt;
        //===============================&lt;br /&gt;
        for (w = 0; w &amp;lt; llGetListLength(agentsInTranslation); w += 4)&lt;br /&gt;
        {&lt;br /&gt;
            //Loop through translation group and do appropriate translations as needed&lt;br /&gt;
            recepID = llList2Integer(agentsInTranslation, w + 3);&lt;br /&gt;
            recepLan =  checkLanguage(llList2Key(agentsInTranslation, w + 1)); &lt;br /&gt;
            if ((spkrLan != recepLan) &amp;amp;&amp;amp; (recepLan != &amp;quot;&amp;quot;) &amp;amp;&amp;amp; (recepLan != &amp;quot;xx&amp;quot;))&lt;br /&gt;
            {&lt;br /&gt;
                lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
 &lt;br /&gt;
                lstliPos = llListFindList(translationCache, [lanpair]);&lt;br /&gt;
                if (lstliPos &amp;lt; 0)&lt;br /&gt;
                {&lt;br /&gt;
                  translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                  translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        } &lt;br /&gt;
        //Process Requests&lt;br /&gt;
        if (llGetListLength(translationCache) &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            for (w = 0; w &amp;lt; llGetListLength(translationCache); w += 2)&lt;br /&gt;
            {&lt;br /&gt;
                //====================================&lt;br /&gt;
                //Translation&lt;br /&gt;
                //====================================&lt;br /&gt;
                //Forumulate and Send Translation Request&lt;br /&gt;
                lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, w), [&amp;quot;|&amp;quot;],[]), 1); &lt;br /&gt;
                checkThrottle(0, llEscapeURL(message) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, w + 1), llList2String(translationCache, w)]);&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
            spkrLan = &amp;quot;&amp;quot;; &lt;br /&gt;
        //====================================&lt;br /&gt;
        //Language Detection&lt;br /&gt;
        //====================================&lt;br /&gt;
        if (llGetAgentSize(id) != ZERO_VECTOR) //llList2Key(llGetObjectDetails(id, [OBJECT_CREATOR]), 0) == NULL_KEY)&lt;br /&gt;
        {&lt;br /&gt;
            if (((spkrLan == &amp;quot;&amp;quot;) || (llList2Integer(agentsInTranslation, llListFindList(agentsInTranslation, [id]) + 2) == TRUE)) || (isMaster == 2))&lt;br /&gt;
            {&lt;br /&gt;
                //Forumulate and Send Language Detect Request&lt;br /&gt;
                checkThrottle(1, llEscapeURL(message), [llGetTime(), id]);&lt;br /&gt;
            }       &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
    {&lt;br /&gt;
        string  htttmpStr; &lt;br /&gt;
        if (status != 200) &lt;br /&gt;
        {&lt;br /&gt;
            //llOwnerSay(&amp;quot;WWW Error:&amp;quot; + (string)status);&lt;br /&gt;
            llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;1, 0, 0&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
            //llOwnerSay(body);&lt;br /&gt;
            return;&lt;br /&gt;
        } &lt;br /&gt;
        //Process Resonse Code&lt;br /&gt;
        htttmpStr = llGetSubString(body, llSubStringIndex(body, &amp;quot;\&amp;quot;responseStatus\&amp;quot;:&amp;quot;), -1);&lt;br /&gt;
        status = (integer)llGetSubString(htttmpStr, 17, llSubStringIndex(htttmpStr, &amp;quot;}&amp;quot;) - 1);&lt;br /&gt;
        if (status != 200)&lt;br /&gt;
        {&lt;br /&gt;
            //llOwnerSay(&amp;quot;Language Server Returned Error Code: &amp;quot; + (string)status);&lt;br /&gt;
            //llOwnerSay(body);&lt;br /&gt;
            llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;1, 0, 0&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0, 0, 1&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
        llMessageLinked(LINK_THIS, 345149624, body, request_id);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(0.0);  // timer reset&lt;br /&gt;
        integer r;&lt;br /&gt;
        string  tmrtmpStr;&lt;br /&gt;
        list    tmrnewli;&lt;br /&gt;
        integer translatorCount = llGetListLength(translators)/2; &lt;br /&gt;
        if (isInitialized == FALSE)&lt;br /&gt;
        {&lt;br /&gt;
            enabled = TRUE;&lt;br /&gt;
            listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); &lt;br /&gt;
            llListen(777, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
            llMessageLinked(LINK_THIS, 6877259, (string)enabled, NULL_KEY);&lt;br /&gt;
            isInitialized = TRUE;&lt;br /&gt;
        } &lt;br /&gt;
        llMessageLinked(LINK_THIS, 94558323, llList2CSV(agentsInTranslation), &amp;quot;&amp;quot;);&lt;br /&gt;
        if (isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            for (r = 0; r &amp;lt; llGetListLength(agentsInTranslation); r += 4)&lt;br /&gt;
            {&lt;br /&gt;
                tmrtmpStr = llList2String(llGetObjectDetails(llList2Key(agentsInTranslation, r), [OBJECT_POS]), 0);&lt;br /&gt;
                if ((llVecDist(llGetPos(), (vector)tmrtmpStr) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tmrtmpStr != &amp;quot;&amp;quot;))&lt;br /&gt;
                {&lt;br /&gt;
                    tmrnewli = (tmrnewli=[]) + tmrnewli + llList2List(agentsInTranslation, r, r + 3);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            agentsInTranslation = tmrnewli;&lt;br /&gt;
            if ((llGetUnixTime() - lastHeartBeat) &amp;gt;= 5)&lt;br /&gt;
            {&lt;br /&gt;
                //Send heartbeat&lt;br /&gt;
                sendHeartbeat();&lt;br /&gt;
                lastHeartBeat = llGetUnixTime();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            if ((llGetUnixTime() - lastHeartBeat) &amp;gt;= `0 + llGetListLength(agentsInTranslation)*2 + llPow(translatorCount, 1.4) + translatorCount + ((1-llGetRegionTimeDilation()) * 5))&lt;br /&gt;
            {&lt;br /&gt;
                //Send heartbeat&lt;br /&gt;
                sendHeartbeat();&lt;br /&gt;
                lastHeartBeat = llGetUnixTime();&lt;br /&gt;
            }&lt;br /&gt;
        } &lt;br /&gt;
        //turn on and off scanner&lt;br /&gt;
        if ((autoLanguage) &amp;amp;&amp;amp; isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            llSensor(&amp;quot;&amp;quot;, NULL_KEY, AGENT, 20.0, PI);&lt;br /&gt;
        }&lt;br /&gt;
        llSetTimerEvent(4.0); // restart timer&lt;br /&gt;
        //llSetTimerEvent(4 + ((1-llGetRegionTimeDilation()) * 5));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=686692</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=686692"/>
		<updated>2009-12-14T20:08:09Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: /* THE CODE BELOW IS NOT TESTED */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribucion al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente codigo fué originalmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mi manera...&lt;br /&gt;
No os riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== THE CODE BELOW IS NOT TESTED ==&lt;br /&gt;
Que exagerado&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//November 12, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Web Server Services powered by Google &lt;br /&gt;
//Variables&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
list agentsInTranslationOptions;&lt;br /&gt;
list requestList;&lt;br /&gt;
integer listenID; &lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
integer showTranslation = FALSE;&lt;br /&gt;
integer tranObjects = TRUE; &lt;br /&gt;
integer lastHeartBeat;&lt;br /&gt;
list    languageCodes = [&lt;br /&gt;
&amp;quot;zh-CN&amp;quot;, &amp;quot;zh-TW&amp;quot;, &amp;quot;hr&amp;quot;,  &lt;br /&gt;
&amp;quot;bg&amp;quot;, &amp;quot;be&amp;quot;, &amp;quot;ca&amp;quot;,&lt;br /&gt;
&amp;quot;af&amp;quot;, &amp;quot;sq&amp;quot;, &amp;quot;ar&amp;quot;,   &lt;br /&gt;
&amp;quot;tl&amp;quot;, &amp;quot;fr&amp;quot;, &amp;quot;gl&amp;quot;,    &lt;br /&gt;
&amp;quot;fi&amp;quot;, &amp;quot;en&amp;quot;, &amp;quot;et&amp;quot;,     &lt;br /&gt;
&amp;quot;cs&amp;quot;, &amp;quot;da&amp;quot;, &amp;quot;nl&amp;quot;,  &lt;br /&gt;
&amp;quot;id&amp;quot;, &amp;quot;ga&amp;quot;, &amp;quot;it&amp;quot;,      &lt;br /&gt;
&amp;quot;hi&amp;quot;, &amp;quot;hu&amp;quot;, &amp;quot;is&amp;quot;, &lt;br /&gt;
&amp;quot;de&amp;quot;, &amp;quot;el&amp;quot;, &amp;quot;iw&amp;quot;,    &lt;br /&gt;
&amp;quot;mt&amp;quot;, &amp;quot;no&amp;quot;, &amp;quot;fa&amp;quot;,   &lt;br /&gt;
&amp;quot;lt&amp;quot;, &amp;quot;mk&amp;quot;, &amp;quot;ms&amp;quot;,   &lt;br /&gt;
&amp;quot;ja&amp;quot;, &amp;quot;ko&amp;quot;, &amp;quot;lv&amp;quot;,   &lt;br /&gt;
&amp;quot;sl&amp;quot;, &amp;quot;es&amp;quot;, &amp;quot;sw&amp;quot;, &lt;br /&gt;
&amp;quot;ru&amp;quot;, &amp;quot;sr&amp;quot;, &amp;quot;sk&amp;quot;, &lt;br /&gt;
&amp;quot;pl&amp;quot;, &amp;quot;pt-PT&amp;quot;, &amp;quot;ro&amp;quot;,&lt;br /&gt;
&amp;quot;yi&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;uk&amp;quot;, &amp;quot;vi&amp;quot;, &amp;quot;cy&amp;quot;,&lt;br /&gt;
&amp;quot;sv&amp;quot;,&amp;quot;th&amp;quot;, &amp;quot;tr&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
list    translators;&lt;br /&gt;
list    sayCache;&lt;br /&gt;
list    sayCachePrivate;&lt;br /&gt;
integer priorityNumber;&lt;br /&gt;
integer priorityNumListenID;&lt;br /&gt;
integer isInitialized = FALSE;&lt;br /&gt;
string  options; &lt;br /&gt;
//Options&lt;br /&gt;
//integer debug = TRUE;&lt;br /&gt;
integer broadcastChannel = -9999999; //note this is not the channel used by the HR Universal Translator&lt;br /&gt;
string  password = &amp;quot;password&amp;quot;; //note this is not the password used to encrypt comms of the HR Universal Translator&lt;br /&gt;
integer version = 190;&lt;br /&gt;
//&lt;br /&gt;
sendIM(key imid, string imstr)&lt;br /&gt;
{&lt;br /&gt;
    if (llGetParcelFlags(llGetPos()) &amp;amp; PARCEL_FLAG_ALLOW_SCRIPTS)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 85234119, imstr, imid); &lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_THIS, 85304563, imstr, imid);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//txTxtLot() = sendTextBatch()&lt;br /&gt;
txTxtLot(integer txch, string txtxt) &lt;br /&gt;
{&lt;br /&gt;
    txtxt = llXorBase64StringsCorrect(llStringToBase64(txtxt), llStringToBase64(password));&lt;br /&gt;
    while (llStringLength(txtxt) &amp;gt; 508) //If string is 509 characters or longer &lt;br /&gt;
    {&lt;br /&gt;
        llSay(txch, llGetSubString(txtxt, 0, 507)); //send 508 character chunk&lt;br /&gt;
        txtxt = llGetSubString(txtxt, 508, -1);  //delete 508 character chunk&lt;br /&gt;
    }&lt;br /&gt;
    llSay(txch, txtxt);  //send out any remainder chunk or original chunk&lt;br /&gt;
    //Perry Mizin Comment: I don´t understand the aim of the following if.    &lt;br /&gt;
    //Hank Ramos Comment: this line serves to &amp;quot;trigger&amp;quot; the receiver not to wait for another batch.  If the&lt;br /&gt;
    //message length is exactly 508 characters, the receiver things that another chunk of the message is coming.&lt;br /&gt;
    //This message serves to tell the receiver that the last chunk was the last chunk, not another regular chunk.&lt;br /&gt;
    if (llStringLength(txtxt) == 508)&lt;br /&gt;
        llSay(txch, (string)(txch*4958654));&lt;br /&gt;
    //Hank Ramos Comment: this just flashes the color of the bottom prim to show a message was sent&lt;br /&gt;
    llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0, 0.25&amp;gt;, &amp;quot;&amp;quot;); &lt;br /&gt;
}  &lt;br /&gt;
//string rxTxtLot() = string receiveTextBatch()&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer rxliPos;&lt;br /&gt;
    string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
    {&lt;br /&gt;
        rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
        rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
        sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
    rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
    return rxmsg;&lt;br /&gt;
}&lt;br /&gt;
//string rxTxtLot() = string receiveTextBatch() (Another way)&lt;br /&gt;
integer rxTxtLotBusy = FALSE; //Perry Mizin: added Busy Mode, this could fail or prevent fail&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    if (rxTxtLotBusy == FALSE)&lt;br /&gt;
    {&lt;br /&gt;
        rxTxtLotBusy = TRUE;&lt;br /&gt;
        integer rxliPos;&lt;br /&gt;
        string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
        if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
        {&lt;br /&gt;
            @rxin;&lt;br /&gt;
            rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
            rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
            sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
            if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
            {&lt;br /&gt;
                 jump rxin;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
        rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
        rxTxtLotBusy = FALSE;&lt;br /&gt;
        return rxmsg;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        //Perry Mizin: llSaySomething?&lt;br /&gt;
        return &amp;quot;&amp;quot;;        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string rxTxtLotPrv() = string receiveTextBatchPrivate()&lt;br /&gt;
string rxTxtLotPrv(key prxid, string prxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer prxliPos;&lt;br /&gt;
    string  prxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCachePrivate, (list)prxid))&lt;br /&gt;
    {&lt;br /&gt;
        prxliPos = llListFindList(sayCachePrivate, [prxid]);&lt;br /&gt;
        prxtmpStr = (prxtmpStr=&amp;quot;&amp;quot;) + prxtmpStr + llList2String(sayCachePrivate, prxliPos + 1);&lt;br /&gt;
        sayCachePrivate = llDeleteSubList(sayCachePrivate, prxliPos, prxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    prxmsg = prxtmpStr + prxmsg;&lt;br /&gt;
    prxmsg = llBase64ToString(llXorBase64StringsCorrect(prxmsg, llStringToBase64(password)));&lt;br /&gt;
    return prxmsg;&lt;br /&gt;
}&lt;br /&gt;
//updateTranslatorList()&lt;br /&gt;
updateTranslatorList()&lt;br /&gt;
{&lt;br /&gt;
    integer nx;&lt;br /&gt;
    integer xliLng;&lt;br /&gt;
    list    newList;&lt;br /&gt;
    string  tmpStrPos;&lt;br /&gt;
    integer newMaster;&lt;br /&gt;
    //Scan and remove translators not in the area&lt;br /&gt;
    xliLng = llGetListLength(translators);&lt;br /&gt;
    for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
    {&lt;br /&gt;
        tmpStrPos = llList2String(llGetObjectDetails(llList2Key(translators, nx + 1), [OBJECT_POS]), 0);&lt;br /&gt;
        if ((llVecDist(llGetPos(), (vector)tmpStrPos) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tmpStrPos != &amp;quot;&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            newList = (newList=[]) + newList +  llList2List(translators, nx, nx + 1);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    translators = newList;&lt;br /&gt;
    //llMessageLinked(LINK_THIS,65635544,(string)xliLng,&amp;quot;&amp;quot;); Perry Mizin: what is this necesary for?&lt;br /&gt;
    if (translators == [])&lt;br /&gt;
    {&lt;br /&gt;
        newMaster = 1;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        if (enabled)&lt;br /&gt;
        {&lt;br /&gt;
            xliLng = llGetListLength(translators);&lt;br /&gt;
            newMaster = 2;&lt;br /&gt;
            for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
            {&lt;br /&gt;
                //llOwnerSay(&amp;quot;Checking Priority Number(&amp;quot; +  (string)priorityNumber + &amp;quot;): &amp;quot; + (string)llList2Integer(translators, x));&lt;br /&gt;
                if (llList2Integer(translators, nx) &amp;gt; priorityNumber)&lt;br /&gt;
                {&lt;br /&gt;
                    newMaster = 0;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            newMaster = 0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster &amp;gt; 0) &amp;amp;&amp;amp; (newMaster == 0))&lt;br /&gt;
    {&lt;br /&gt;
        //We are being demoted from master to slave&lt;br /&gt;
        //Flush agentsInTranslation to master&lt;br /&gt;
        if (agentsInTranslation != [])&lt;br /&gt;
        {&lt;br /&gt;
            //Demotion Dump of agentsInTranslation to Master&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1003, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
            if (isInitialized == FALSE)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1004, options])); //error&lt;br /&gt;
        }&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster == 0) &amp;amp;&amp;amp; (newMaster &amp;gt; 0))&lt;br /&gt;
    {&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
        listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); &lt;br /&gt;
    }&lt;br /&gt;
    isMaster = newMaster;&lt;br /&gt;
    llMessageLinked(LINK_THIS, 34829304, (string)isMaster, &amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
//sendHeartbeat()&lt;br /&gt;
sendHeartbeat()&lt;br /&gt;
{&lt;br /&gt;
    updateTranslatorList();&lt;br /&gt;
    txTxtLot(broadcastChannel, llList2CSV([1001, priorityNumber]));&lt;br /&gt;
    //Broadcast agentList to Slaves&lt;br /&gt;
    if (isMaster == 2)&lt;br /&gt;
    {&lt;br /&gt;
        txTxtLot(broadcastChannel, llList2CSV([1002, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//checkThrottle()&lt;br /&gt;
checkThrottle(integer chkn, string chkmsg, list chkli)&lt;br /&gt;
{&lt;br /&gt;
    integer y;&lt;br /&gt;
    integer maxCount;&lt;br /&gt;
    float   chkoldTime;&lt;br /&gt;
    float   sleepTime;&lt;br /&gt;
    list    chknewli;&lt;br /&gt;
    key     returnValue;&lt;br /&gt;
    integer channelToSpeak; &lt;br /&gt;
    //loop though list and remove items older than 25 seconds&lt;br /&gt;
    for (y = 0; y &amp;lt; llGetListLength(requestList); y += 1)&lt;br /&gt;
    {&lt;br /&gt;
        chkoldTime = llList2Float(requestList, y);&lt;br /&gt;
        //Construct new list with only times less than 25 seconds&lt;br /&gt;
        if ((llGetTime() - chkoldTime) &amp;lt;= 25.0)&lt;br /&gt;
        { &lt;br /&gt;
            chknewli = (chknewli=[]) + chknewli + [chkoldTime];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    requestList = chknewli; &lt;br /&gt;
    y = llGetListLength(requestList);&lt;br /&gt;
    //Shunt all translations to linked translators if master&lt;br /&gt;
    if (isMaster == 2)&lt;br /&gt;
    {&lt;br /&gt;
        if (chkn == 0)&lt;br /&gt;
        {&lt;br /&gt;
            //Send HTTP request to other translator&lt;br /&gt;
            //Send out Request to Random Translator Channel&lt;br /&gt;
            channelToSpeak = llList2Integer(llListRandomize(llList2ListStrided(translators, 0, -1, 2), 1), 0);&lt;br /&gt;
            if (channelToSpeak &amp;gt; 0) &lt;br /&gt;
            {&lt;br /&gt;
                txTxtLot(channelToSpeak, llList2CSV([chkn, llList2CSV(chkli)]) + &amp;quot;~&amp;quot; + chkmsg);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if (y == 19)&lt;br /&gt;
    {&lt;br /&gt;
        sleepTime =  25.0 - (llGetTime() - llList2Float(requestList, 0));&lt;br /&gt;
        if (sleepTime &amp;gt; 0) &lt;br /&gt;
        {&lt;br /&gt;
            llSleep(sleepTime);&lt;br /&gt;
        }&lt;br /&gt;
        requestList = llDeleteSubList(requestList, 0, 0);&lt;br /&gt;
    }&lt;br /&gt;
    if (chkn == 0)&lt;br /&gt;
    {&lt;br /&gt;
        chkmsg = &amp;quot;translate?v=1.0&amp;amp;q=&amp;quot; + chkmsg;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        chkmsg = &amp;quot;detect?v=1.0&amp;amp;q=&amp;quot; + chkmsg;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    requestList = (requestList=[]) + requestList + (list)llGetTime();&lt;br /&gt;
    returnValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/&amp;quot; + chkmsg, [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot; &amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
    if (returnValue != NULL_KEY)&lt;br /&gt;
    {&lt;br /&gt;
        if (chkn == 0)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS, 235365342, llList2CSV(chkli), returnValue); &lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS, 235365343, llList2CSV(chkli), returnValue); &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llSleep(40.0); //Something has gone horribly wrong, sleep 40 seconds to clear throttle&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string checkLanguage()&lt;br /&gt;
string checkLanguage(string chklantmpStr)&lt;br /&gt;
{&lt;br /&gt;
    if (llGetSubString(chklantmpStr, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else if (chklantmpStr == &amp;quot;und&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;el&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if (~llListFindList(languageCodes, [chklantmpStr]))&lt;br /&gt;
    {&lt;br /&gt;
 &lt;br /&gt;
    } else {&lt;br /&gt;
        chklantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    chklantmpStr = llGetSubString(chklantmpStr, 0, 1);&lt;br /&gt;
    return chklantmpStr;&lt;br /&gt;
}&lt;br /&gt;
//addAgent()&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
    integer avliPos;&lt;br /&gt;
    integer idNum;&lt;br /&gt;
    if (~llListFindList(agentsInTranslation, (list)avid))&lt;br /&gt;
    {&lt;br /&gt;
        avliPos = llListFindList(agentsInTranslation, [avid]);&lt;br /&gt;
        agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, chklan], avliPos + 1, avliPos + 2);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        @at;&lt;br /&gt;
        idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
        if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
        {//it exists       &lt;br /&gt;
            jump at;&lt;br /&gt;
        }&lt;br /&gt;
        agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, chklan, idNum];&lt;br /&gt;
        llMessageLinked(LINK_THIS, 64562349, avlan, avid);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string addNewAgent()&lt;br /&gt;
string addNewAgent(key newavid)&lt;br /&gt;
{&lt;br /&gt;
    string speakerLan;&lt;br /&gt;
 &lt;br /&gt;
    if (llGetAgentSize(newavid) != ZERO_VECTOR)&lt;br /&gt;
    {&lt;br /&gt;
        speakerLan  = checkLanguage(llGetAgentLanguage(newavid));&lt;br /&gt;
        if (speakerLan == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
            addAgent(newavid, speakerLan, TRUE);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            addAgent(newavid, speakerLan, FALSE);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return speakerLan;&lt;br /&gt;
}&lt;br /&gt;
//key getAgentKey()&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
    if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
    {&lt;br /&gt;
        integer gkliPos = llListFindList(agentsInTranslation, [agentID]);&lt;br /&gt;
        return llList2Key(agentsInTranslation, gkliPos - 3);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//processHTTPResponse()&lt;br /&gt;
processHTTPResponse(integer ntype, string bodyStr, list paramsli)&lt;br /&gt;
{&lt;br /&gt;
    integer spkliPos;&lt;br /&gt;
    list    recepientList;&lt;br /&gt;
    key     recepientID;&lt;br /&gt;
    string  recepientLanguage;&lt;br /&gt;
    string  languagePair;&lt;br /&gt;
    key     speakerID;&lt;br /&gt;
    string  speakerName;&lt;br /&gt;
    string  speakerLanguage;&lt;br /&gt;
    string  translatedText;&lt;br /&gt;
    string  lantmpStr;&lt;br /&gt;
    integer z;&lt;br /&gt;
    integer speakerLanguageReliable;&lt;br /&gt;
    float   speakerLanguageConfidence;&lt;br /&gt;
    list    paramtmpli;&lt;br /&gt;
    //===================&lt;br /&gt;
    //Process Translation&lt;br /&gt;
    //===================&lt;br /&gt;
    if (ntype == 0)&lt;br /&gt;
    {&lt;br /&gt;
        speakerID  = llList2Key(paramsli, 1);&lt;br /&gt;
        speakerName = llKey2Name(speakerID);&lt;br /&gt;
        if (speakerName == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
        }&lt;br /&gt;
        recepientList = llParseString2List(llList2String(paramsli, 2), [&amp;quot;@&amp;quot;], []);&lt;br /&gt;
        paramtmpli = llParseStringKeepNulls(llList2String(paramsli, 3), [&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
        recepientLanguage = llList2String(paramtmpli, 1);&lt;br /&gt;
        languagePair = llDumpList2String(paramtmpli, &amp;quot;&amp;gt;&amp;gt;&amp;quot;); &lt;br /&gt;
        //Perform Text Cleanup&lt;br /&gt;
        z = llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;detectedSourceLanguage\&amp;quot;:\&amp;quot;&amp;quot;); &lt;br /&gt;
        if (z != -1)&lt;br /&gt;
        {&lt;br /&gt;
            translatedText  = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, z);&lt;br /&gt;
            speakerLanguage = checkLanguage(llGetSubString(bodyStr, z + 28, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;}, \&amp;quot;responseDetails\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
            spkliPos = llListFindList(agentsInTranslation, [speakerID]);&lt;br /&gt;
            if (spkliPos &amp;gt;= 0)&lt;br /&gt;
            {&lt;br /&gt;
                if (speakerLanguage != llList2String(agentsInTranslation, spkliPos + 1))&lt;br /&gt;
                {&lt;br /&gt;
                    agentsInTranslation = llListReplaceList(agentsInTranslation, [TRUE], spkliPos + 2, spkliPos + 2);  //Mark for recheck of actual spoken language.&lt;br /&gt;
                }&lt;br /&gt;
            }                   &lt;br /&gt;
        }&lt;br /&gt;
        else if (z == -1)&lt;br /&gt;
        {&lt;br /&gt;
            translatedText = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;}, \&amp;quot;responseDetails\&amp;quot;&amp;quot;));&lt;br /&gt;
        }&lt;br /&gt;
        //Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
        if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            lantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
            //Perry Mizin Comment: Probably I guess this is wrong, maybe I am wrong&lt;br /&gt;
            //Perry Mizin Comment: alternative reverse order: &amp;quot;Hello World&amp;quot; could be &amp;quot;World Hello&amp;quot;&lt;br /&gt;
            //Perry Mizin Comment: reverse order: &amp;quot;Hello World&amp;quot; is &amp;quot;dlroW olleH&amp;quot; or ,pl^ºM ºllªH,&lt;br /&gt;
            for(z = llStringLength(translatedText);z &amp;gt;= 0; z--)&lt;br /&gt;
            {&lt;br /&gt;
                lantmpStr = (lantmpStr=&amp;quot;&amp;quot;) + lantmpStr + llGetSubString(translatedText, z, z); &lt;br /&gt;
            }&lt;br /&gt;
            translatedText = lantmpStr;&lt;br /&gt;
        }   &lt;br /&gt;
        lantmpStr = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
        if (showTranslation)&lt;br /&gt;
        {&lt;br /&gt;
            sendIM(speakerID, lantmpStr);&lt;br /&gt;
        } &lt;br /&gt;
        for (z = 0; z &amp;lt; llGetListLength(recepientList); z += 1)&lt;br /&gt;
        {&lt;br /&gt;
            recepientID = getAgentKey(llList2Integer(recepientList, z));&lt;br /&gt;
            if (recepientID != &amp;quot;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, [recepientID]) + 1);&lt;br /&gt;
                if (recepientLanguage != speakerLanguage)&lt;br /&gt;
                {&lt;br /&gt;
                    sendIM(recepientID, lantmpStr);&lt;br /&gt;
                }&lt;br /&gt;
            }  &lt;br /&gt;
        }&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    //===========================&lt;br /&gt;
    //Process Language Detection&lt;br /&gt;
    //===========================&lt;br /&gt;
    if (ntype == 1)&lt;br /&gt;
    {&lt;br /&gt;
        speakerID = llList2Key(paramsli, 1);&lt;br /&gt;
        speakerLanguageReliable = llToLower(llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) + 15, llSubStringIndex(bodyStr, &amp;quot;,\&amp;quot;confidence\&amp;quot;:&amp;quot;) - 1)) == &amp;quot;true&amp;quot;;&lt;br /&gt;
        speakerLanguageConfidence = (float)llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;,\&amp;quot;confidence\&amp;quot;:&amp;quot;) + 14, llSubStringIndex(bodyStr, &amp;quot;}, \&amp;quot;responseDetails\&amp;quot;:&amp;quot;) - 1);&lt;br /&gt;
 &lt;br /&gt;
        spkliPos = llListFindList(agentsInTranslation, [speakerID]);&lt;br /&gt;
        if (((spkliPos &amp;lt; 0) &amp;amp;&amp;amp; (speakerLanguageReliable) || (speakerLanguageConfidence &amp;gt;= 0.08)))&lt;br /&gt;
        {&lt;br /&gt;
            //Analyze Data&lt;br /&gt;
            lantmpStr = checkLanguage(llToLower(llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1)));&lt;br /&gt;
            if (lantmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            } &lt;br /&gt;
            if (speakerLanguageConfidence &amp;lt; 0.14)&lt;br /&gt;
            {&lt;br /&gt;
                addAgent(speakerID, lantmpStr, TRUE);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                addAgent(speakerID, lantmpStr, FALSE);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        //Multiplexor Initialization&lt;br /&gt;
        priorityNumber = version*1000000 + llRound(llFrand(499999) + 50000);&lt;br /&gt;
        llListen(broadcastChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        priorityNumListenID = llListen(priorityNumber, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
        //Send out initial heartbeat&lt;br /&gt;
        lastHeartBeat = llGetUnixTime();&lt;br /&gt;
        txTxtLot(broadcastChannel, llList2CSV([1001, priorityNumber]));&lt;br /&gt;
 &lt;br /&gt;
        //Wait for the network to settle down&lt;br /&gt;
        llSetTimerEvent(5.0); &lt;br /&gt;
        //llSetTimerEvent(10 + ((1-llGetRegionTimeDilation()) * 1));       &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
    {&lt;br /&gt;
        list    ltmpli;&lt;br /&gt;
&lt;br /&gt;
        //Old Multiplexor&lt;br /&gt;
        if (num == 8434532)&lt;br /&gt;
        {&lt;br /&gt;
            enabled = (integer)lstr;&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 3342976)&lt;br /&gt;
        {&lt;br /&gt;
            //Send Preferences&lt;br /&gt;
            options = lstr;&lt;br /&gt;
            if (isInitialized == FALSE) return;&lt;br /&gt;
            ltmpli = llCSV2List(options);&lt;br /&gt;
            showTranslation = llList2Integer(ltmpli, 0);&lt;br /&gt;
            tranObjects = llList2Integer(ltmpli, 1);&lt;br /&gt;
            autoLanguage = llList2Integer(ltmpli, 2);&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1004, options]));&lt;br /&gt;
 &lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 9384610)&lt;br /&gt;
        {&lt;br /&gt;
            if (isMaster == 0) //markering&lt;br /&gt;
                //llMessageLinked(LINK_THIS, 5598321, llList2CSV([id, str, FALSE]), &amp;quot;&amp;quot;);&lt;br /&gt;
                txTxtLot(broadcastChannel, llList2CSV([1003, lid, lstr, FALSE]));&lt;br /&gt;
            else&lt;br /&gt;
                addAgent(lid, lstr, TRUE);&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 345149625)&lt;br /&gt;
        {&lt;br /&gt;
            //Return Translation&lt;br /&gt;
            processHTTPResponse(0, lstr, llCSV2List(lid));&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 345149626)&lt;br /&gt;
        {&lt;br /&gt;
            //Return Detection&lt;br /&gt;
            processHTTPResponse(1, lstr, llCSV2List(lid));&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    sensor(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        integer s;&lt;br /&gt;
        key     sid;&lt;br /&gt;
 &lt;br /&gt;
        for (s = 0; s &amp;lt; num_detected; s += 1)&lt;br /&gt;
        {&lt;br /&gt;
            sid = llDetectedKey(s);&lt;br /&gt;
            if (~llListFindList(agentsInTranslation, (list)sid))&lt;br /&gt;
            {&lt;br /&gt;
                &lt;br /&gt;
            } else {&lt;br /&gt;
                addNewAgent(sid);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        integer w;&lt;br /&gt;
        string  spkrLan;&lt;br /&gt;
        string  recepLan;&lt;br /&gt;
        integer recepID;&lt;br /&gt;
        integer lstliPos;&lt;br /&gt;
        string  lanpair;&lt;br /&gt;
        list    translationCache;&lt;br /&gt;
        list    lsttmpli;&lt;br /&gt;
        integer ImessageType;&lt;br /&gt;
        string  Imessage;&lt;br /&gt;
        string  lsttmpStr;&lt;br /&gt;
        string  lst2tmpStr;&lt;br /&gt;
 &lt;br /&gt;
        //Multiplexor Code&lt;br /&gt;
        if ((channel == broadcastChannel) || (channel == priorityNumber))&lt;br /&gt;
        {&lt;br /&gt;
            //==========================&lt;br /&gt;
            //Process Proxy HTTP Request&lt;br /&gt;
            //==========================&lt;br /&gt;
 &lt;br /&gt;
            if (channel == priorityNumber)&lt;br /&gt;
            {&lt;br /&gt;
                if (llStringLength(message) &amp;gt;= 508)&lt;br /&gt;
                {&lt;br /&gt;
                    if (((integer)message/channel) != 4958654)&lt;br /&gt;
                    {&lt;br /&gt;
                        sayCachePrivate = (sayCachePrivate=[]) + sayCachePrivate + [id, message];&lt;br /&gt;
                        return; &lt;br /&gt;
                    }&lt;br /&gt;
                    message = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                message = rxTxtLotPrv(id, message);&lt;br /&gt;
                //Received packet to translate&lt;br /&gt;
                llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0.05, 0.25&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
                lsttmpli = llParseString2List(message, [&amp;quot;~&amp;quot;], []);&lt;br /&gt;
                lsttmpStr = llList2String(lsttmpli, 0);&lt;br /&gt;
                lsttmpli = llDeleteSubList(lsttmpli, 0, 0);&lt;br /&gt;
 &lt;br /&gt;
                lst2tmpStr = llDumpList2String(lsttmpli, &amp;quot;|&amp;quot;);&lt;br /&gt;
                lsttmpli = llCSV2List(lsttmpStr);&lt;br /&gt;
                lstliPos = llList2Integer(lsttmpli, 0);&lt;br /&gt;
                lsttmpli = llDeleteSubList(lsttmpli, 0, 0);&lt;br /&gt;
 &lt;br /&gt;
                checkThrottle(lstliPos, lst2tmpStr, lsttmpli);&lt;br /&gt;
 &lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
            //=======================&lt;br /&gt;
            //Process Global Messages&lt;br /&gt;
            //=======================&lt;br /&gt;
            if (llStringLength(message) &amp;gt;= 508)&lt;br /&gt;
            {&lt;br /&gt;
                if (((integer)message/channel) != 4958654)&lt;br /&gt;
                {&lt;br /&gt;
                    sayCache = (sayCache=[]) + sayCache + [id, message];&lt;br /&gt;
                    return; &lt;br /&gt;
                }&lt;br /&gt;
                message = &amp;quot;&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            message = rxTxtLot(id, message);&lt;br /&gt;
 &lt;br /&gt;
            lsttmpli = llCSV2List(message);&lt;br /&gt;
 &lt;br /&gt;
            if (llGetListLength(lsttmpli) &amp;gt;= 2)    &lt;br /&gt;
            {&lt;br /&gt;
                ImessageType = llList2Integer(lsttmpli, 0);&lt;br /&gt;
                lsttmpli = llDeleteSubList(lsttmpli, 0, 0);&lt;br /&gt;
                Imessage = llList2CSV(lsttmpli);        &lt;br /&gt;
 &lt;br /&gt;
                llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0, 0.25&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
                //Process Message Here&lt;br /&gt;
                if (ImessageType == 1001)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming Heartbeat&lt;br /&gt;
                    if ((integer)Imessage == priorityNumber)&lt;br /&gt;
                    {&lt;br /&gt;
                        llOwnerSay(&amp;quot;Priority Number Conflict!  Resetting Script...&amp;quot;);&lt;br /&gt;
                        llResetScript(); //Reset if conflicting priority number&lt;br /&gt;
                    }&lt;br /&gt;
                    lstliPos = llListFindList(translators, [id]);&lt;br /&gt;
                    if (lstliPos &amp;lt; 0) &lt;br /&gt;
                    {&lt;br /&gt;
                        translators = (translators=[]) + translators + [(integer)Imessage, id];&lt;br /&gt;
                        if ((isMaster &amp;gt; 0) &amp;amp;&amp;amp; (isInitialized))&lt;br /&gt;
                        {&lt;br /&gt;
                            txTxtLot((integer)Imessage, llList2CSV([1002, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
                            txTxtLot((integer)Imessage, llList2CSV([1004, options]));&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        translators = llListReplaceList(translators, [(integer)Imessage], lstliPos - 1, lstliPos - 1);&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if (ImessageType == 1002)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming agentsInTranslation Master Broadcast&lt;br /&gt;
                    if (isMaster == 0)&lt;br /&gt;
                    {&lt;br /&gt;
                        //llMessageLinked(LINK_THIS, 9458021, Imessage, &amp;quot;&amp;quot;);  &lt;br /&gt;
                        lsttmpli = llCSV2List(Imessage);&lt;br /&gt;
                        agentsInTranslation = [];&lt;br /&gt;
                        for (w = 0; w &amp;lt; llGetListLength(lsttmpli); w += 4)&lt;br /&gt;
                        {&lt;br /&gt;
                            agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [llList2Key(lsttmpli, w), llList2String(lsttmpli, w + 1), llList2Integer(lsttmpli, w + 2), llList2Integer(lsttmpli, w + 3)];&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if (ImessageType == 1003)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming agentsInTranslation dump from Slave&lt;br /&gt;
                    lsttmpli = llCSV2List(Imessage);&lt;br /&gt;
                    for (w = 0; w &amp;lt; llGetListLength(lsttmpli); w += 4)&lt;br /&gt;
                    {&lt;br /&gt;
                        addAgent(llList2Key(lsttmpli, w), llList2String(lsttmpli, w + 1), llList2Integer(lsttmpli, w + 2));&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if (ImessageType == 1004)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming Preferences&lt;br /&gt;
                    options = Imessage;&lt;br /&gt;
                    lsttmpli = llCSV2List(options);&lt;br /&gt;
                    showTranslation = llList2Integer(lsttmpli, 0);&lt;br /&gt;
                    tranObjects = llList2Integer(lsttmpli, 1);&lt;br /&gt;
                    autoLanguage = llList2Integer(lsttmpli, 2);&lt;br /&gt;
 &lt;br /&gt;
                    llMessageLinked(LINK_THIS, 3342977, Imessage, &amp;quot;&amp;quot;);  &lt;br /&gt;
                }&lt;br /&gt;
            }            &lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        //Translator Engine Code&lt;br /&gt;
        if ((llToLower(message) == &amp;quot;translator&amp;quot;) &amp;amp;&amp;amp; (isMaster &amp;gt; 0)) &lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS, 2540664, message, id);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ((!enabled) &amp;amp;&amp;amp; (isMaster == 1)) return;&lt;br /&gt;
 &lt;br /&gt;
        if (!tranObjects)&lt;br /&gt;
        {&lt;br /&gt;
            if (llGetAgentSize(id) != ZERO_VECTOR) return;&lt;br /&gt;
        } &lt;br /&gt;
        lstliPos = llListFindList(agentsInTranslation, [id]);&lt;br /&gt;
        if (lstliPos &amp;gt;= 0)&lt;br /&gt;
        {            &lt;br /&gt;
            spkrLan = llList2String(agentsInTranslation, lstliPos + 1);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            spkrLan = addNewAgent(id);&lt;br /&gt;
        } &lt;br /&gt;
        if (spkrLan == &amp;quot;xx&amp;quot;) return;  //Agent Opt-Out&lt;br /&gt;
         &lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;1, 1, 0&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
        //===============================&lt;br /&gt;
        //Formulate Translation Requests&lt;br /&gt;
        //===============================&lt;br /&gt;
        for (w = 0; w &amp;lt; llGetListLength(agentsInTranslation); w += 4)&lt;br /&gt;
        {&lt;br /&gt;
            //Loop through translation group and do appropriate translations as needed&lt;br /&gt;
            recepID = llList2Integer(agentsInTranslation, w + 3);&lt;br /&gt;
            recepLan =  checkLanguage(llList2Key(agentsInTranslation, w + 1)); &lt;br /&gt;
            if ((spkrLan != recepLan) &amp;amp;&amp;amp; (recepLan != &amp;quot;&amp;quot;) &amp;amp;&amp;amp; (recepLan != &amp;quot;xx&amp;quot;))&lt;br /&gt;
            {&lt;br /&gt;
                lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
 &lt;br /&gt;
                lstliPos = llListFindList(translationCache, [lanpair]);&lt;br /&gt;
                if (lstliPos &amp;lt; 0)&lt;br /&gt;
                {&lt;br /&gt;
                  translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                  translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        } &lt;br /&gt;
        //Process Requests&lt;br /&gt;
        if (llGetListLength(translationCache) &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            for (w = 0; w &amp;lt; llGetListLength(translationCache); w += 2)&lt;br /&gt;
            {&lt;br /&gt;
                //====================================&lt;br /&gt;
                //Translation&lt;br /&gt;
                //====================================&lt;br /&gt;
                //Forumulate and Send Translation Request&lt;br /&gt;
                lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, w), [&amp;quot;|&amp;quot;],[]), 1); &lt;br /&gt;
                checkThrottle(0, llEscapeURL(message) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, w + 1), llList2String(translationCache, w)]);&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
            spkrLan = &amp;quot;&amp;quot;; &lt;br /&gt;
        //====================================&lt;br /&gt;
        //Language Detection&lt;br /&gt;
        //====================================&lt;br /&gt;
        if (llGetAgentSize(id) != ZERO_VECTOR) //llList2Key(llGetObjectDetails(id, [OBJECT_CREATOR]), 0) == NULL_KEY)&lt;br /&gt;
        {&lt;br /&gt;
            if (((spkrLan == &amp;quot;&amp;quot;) || (llList2Integer(agentsInTranslation, llListFindList(agentsInTranslation, [id]) + 2) == TRUE)) || (isMaster == 2))&lt;br /&gt;
            {&lt;br /&gt;
                //Forumulate and Send Language Detect Request&lt;br /&gt;
                checkThrottle(1, llEscapeURL(message), [llGetTime(), id]);&lt;br /&gt;
            }       &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
    {&lt;br /&gt;
        string  htttmpStr; &lt;br /&gt;
        if (status != 200) &lt;br /&gt;
        {&lt;br /&gt;
            //llOwnerSay(&amp;quot;WWW Error:&amp;quot; + (string)status);&lt;br /&gt;
            llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;1, 0, 0&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
            //llOwnerSay(body);&lt;br /&gt;
            return;&lt;br /&gt;
        } &lt;br /&gt;
        //Process Resonse Code&lt;br /&gt;
        htttmpStr = llGetSubString(body, llSubStringIndex(body, &amp;quot;\&amp;quot;responseStatus\&amp;quot;:&amp;quot;), -1);&lt;br /&gt;
        status = (integer)llGetSubString(htttmpStr, 17, llSubStringIndex(htttmpStr, &amp;quot;}&amp;quot;) - 1);&lt;br /&gt;
        if (status != 200)&lt;br /&gt;
        {&lt;br /&gt;
            //llOwnerSay(&amp;quot;Language Server Returned Error Code: &amp;quot; + (string)status);&lt;br /&gt;
            //llOwnerSay(body);&lt;br /&gt;
            llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;1, 0, 0&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0, 0, 1&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
        llMessageLinked(LINK_THIS, 345149624, body, request_id);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(0.0);  // timer reset&lt;br /&gt;
        integer r;&lt;br /&gt;
        string  tmrtmpStr;&lt;br /&gt;
        list    tmrnewli;&lt;br /&gt;
        integer translatorCount = llGetListLength(translators)/2; &lt;br /&gt;
        if (isInitialized == FALSE)&lt;br /&gt;
        {&lt;br /&gt;
            enabled = TRUE;&lt;br /&gt;
            listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); &lt;br /&gt;
            llListen(777, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
            llMessageLinked(LINK_THIS, 6877259, (string)enabled, NULL_KEY);&lt;br /&gt;
            isInitialized = TRUE;&lt;br /&gt;
        } &lt;br /&gt;
        llMessageLinked(LINK_THIS, 94558323, llList2CSV(agentsInTranslation), &amp;quot;&amp;quot;);&lt;br /&gt;
        if (isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            for (r = 0; r &amp;lt; llGetListLength(agentsInTranslation); r += 4)&lt;br /&gt;
            {&lt;br /&gt;
                tmrtmpStr = llList2String(llGetObjectDetails(llList2Key(agentsInTranslation, r), [OBJECT_POS]), 0);&lt;br /&gt;
                if ((llVecDist(llGetPos(), (vector)tmrtmpStr) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tmrtmpStr != &amp;quot;&amp;quot;))&lt;br /&gt;
                {&lt;br /&gt;
                    tmrnewli = (tmrnewli=[]) + tmrnewli + llList2List(agentsInTranslation, r, r + 3);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            agentsInTranslation = tmrnewli;&lt;br /&gt;
            if ((llGetUnixTime() - lastHeartBeat) &amp;gt;= 5)&lt;br /&gt;
            {&lt;br /&gt;
                //Send heartbeat&lt;br /&gt;
                sendHeartbeat();&lt;br /&gt;
                lastHeartBeat = llGetUnixTime();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            if ((llGetUnixTime() - lastHeartBeat) &amp;gt;= `0 + llGetListLength(agentsInTranslation)*2 + llPow(translatorCount, 1.4) + translatorCount + ((1-llGetRegionTimeDilation()) * 5))&lt;br /&gt;
            {&lt;br /&gt;
                //Send heartbeat&lt;br /&gt;
                sendHeartbeat();&lt;br /&gt;
                lastHeartBeat = llGetUnixTime();&lt;br /&gt;
            }&lt;br /&gt;
        } &lt;br /&gt;
        //turn on and off scanner&lt;br /&gt;
        if ((autoLanguage) &amp;amp;&amp;amp; isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            llSensor(&amp;quot;&amp;quot;, NULL_KEY, AGENT, 20.0, PI);&lt;br /&gt;
        }&lt;br /&gt;
        llSetTimerEvent(4.0); // restart timer&lt;br /&gt;
        //llSetTimerEvent(4 + ((1-llGetRegionTimeDilation()) * 5));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=686672</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=686672"/>
		<updated>2009-12-14T19:57:17Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: /* THE CODE BELOW IS NOT TESTED */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribucion al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente codigo fué originalmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mi manera...&lt;br /&gt;
No os riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== THE CODE BELOW IS NOT TESTED ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//November 12, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Web Server Services powered by Google&lt;br /&gt;
 &lt;br /&gt;
//Variables&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
list agentsInTranslationOptions;&lt;br /&gt;
list requestList;&lt;br /&gt;
integer listenID;&lt;br /&gt;
 &lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
integer showTranslation = FALSE;&lt;br /&gt;
integer tranObjects = TRUE;&lt;br /&gt;
 &lt;br /&gt;
integer lastHeartBeat;&lt;br /&gt;
list    languageCodes = [&lt;br /&gt;
&amp;quot;zh-CN&amp;quot;, &amp;quot;zh-TW&amp;quot;, &amp;quot;hr&amp;quot;,  &lt;br /&gt;
&amp;quot;bg&amp;quot;, &amp;quot;be&amp;quot;, &amp;quot;ca&amp;quot;,&lt;br /&gt;
&amp;quot;af&amp;quot;, &amp;quot;sq&amp;quot;, &amp;quot;ar&amp;quot;,   &lt;br /&gt;
 &lt;br /&gt;
&amp;quot;tl&amp;quot;, &amp;quot;fr&amp;quot;, &amp;quot;gl&amp;quot;,    &lt;br /&gt;
&amp;quot;fi&amp;quot;, &amp;quot;en&amp;quot;, &amp;quot;et&amp;quot;,     &lt;br /&gt;
&amp;quot;cs&amp;quot;, &amp;quot;da&amp;quot;, &amp;quot;nl&amp;quot;,  &lt;br /&gt;
 &lt;br /&gt;
&amp;quot;id&amp;quot;, &amp;quot;ga&amp;quot;, &amp;quot;it&amp;quot;,      &lt;br /&gt;
&amp;quot;hi&amp;quot;, &amp;quot;hu&amp;quot;, &amp;quot;is&amp;quot;, &lt;br /&gt;
&amp;quot;de&amp;quot;, &amp;quot;el&amp;quot;, &amp;quot;iw&amp;quot;,    &lt;br /&gt;
 &lt;br /&gt;
&amp;quot;mt&amp;quot;, &amp;quot;no&amp;quot;, &amp;quot;fa&amp;quot;,   &lt;br /&gt;
&amp;quot;lt&amp;quot;, &amp;quot;mk&amp;quot;, &amp;quot;ms&amp;quot;,   &lt;br /&gt;
&amp;quot;ja&amp;quot;, &amp;quot;ko&amp;quot;, &amp;quot;lv&amp;quot;,   &lt;br /&gt;
 &lt;br /&gt;
&amp;quot;sl&amp;quot;, &amp;quot;es&amp;quot;, &amp;quot;sw&amp;quot;, &lt;br /&gt;
&amp;quot;ru&amp;quot;, &amp;quot;sr&amp;quot;, &amp;quot;sk&amp;quot;, &lt;br /&gt;
&amp;quot;pl&amp;quot;, &amp;quot;pt-PT&amp;quot;, &amp;quot;ro&amp;quot;, &lt;br /&gt;
 &lt;br /&gt;
&amp;quot;yi&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;uk&amp;quot;, &amp;quot;vi&amp;quot;, &amp;quot;cy&amp;quot;,&lt;br /&gt;
&amp;quot;sv&amp;quot;,&amp;quot;th&amp;quot;, &amp;quot;tr&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
list    translators;&lt;br /&gt;
list    sayCache;&lt;br /&gt;
list    sayCachePrivate;&lt;br /&gt;
integer priorityNumber;&lt;br /&gt;
integer priorityNumListenID;&lt;br /&gt;
integer isInitialized = FALSE;&lt;br /&gt;
string  options;&lt;br /&gt;
 &lt;br /&gt;
//Options&lt;br /&gt;
//integer debug = TRUE;&lt;br /&gt;
integer broadcastChannel = -9999999; //note this is not the channel used by the HR Universal Translator&lt;br /&gt;
string  password = &amp;quot;password&amp;quot;; //note this is not the password used to encrypt comms of the HR Universal Translator&lt;br /&gt;
integer version = 190;&lt;br /&gt;
&lt;br /&gt;
sendIM(key imid, string imstr)&lt;br /&gt;
{&lt;br /&gt;
    if (llGetParcelFlags(llGetPos()) &amp;amp; PARCEL_FLAG_ALLOW_SCRIPTS)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 85234119, imstr, imid); &lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_THIS, 85304563, imstr, imid);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//txTxtLot() = sendTextBatch()&lt;br /&gt;
txTxtLot(integer txch, string txtxt) &lt;br /&gt;
{&lt;br /&gt;
    txtxt = llXorBase64StringsCorrect(llStringToBase64(txtxt), llStringToBase64(password));&lt;br /&gt;
    while (llStringLength(txtxt) &amp;gt; 508) //If string is 509 characters or longer &lt;br /&gt;
    {&lt;br /&gt;
        llSay(txch, llGetSubString(txtxt, 0, 507)); //send 508 character chunk&lt;br /&gt;
        txtxt = llGetSubString(txtxt, 508, -1);  //delete 508 character chunk&lt;br /&gt;
    }&lt;br /&gt;
    llSay(txch, txtxt);  //send out any remainder chunk or original chunk&lt;br /&gt;
    //Perry Mizin Comment: I don´t understand the aim of the following if.    &lt;br /&gt;
    //Hank Ramos Comment: this line serves to &amp;quot;trigger&amp;quot; the receiver not to wait for another batch.  If the&lt;br /&gt;
    //message length is exactly 508 characters, the receiver things that another chunk of the message is coming.&lt;br /&gt;
    //This message serves to tell the receiver that the last chunk was the last chunk, not another regular chunk.&lt;br /&gt;
    if (llStringLength(txtxt) == 508)&lt;br /&gt;
        llSay(txch, (string)(txch*4958654));&lt;br /&gt;
    //Hank Ramos Comment: this just flashes the color of the bottom prim to show a message was sent&lt;br /&gt;
    llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0, 0.25&amp;gt;, &amp;quot;&amp;quot;); &lt;br /&gt;
}  &lt;br /&gt;
//string rxTxtLot() = string receiveTextBatch()&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer rxliPos;&lt;br /&gt;
    string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
    {&lt;br /&gt;
        rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
        rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
        sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
    rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
    return rxmsg;&lt;br /&gt;
}&lt;br /&gt;
//string rxTxtLot() = string receiveTextBatch() (Another way)&lt;br /&gt;
integer rxTxtLotBusy = FALSE; //Perry Mizin: added Busy Mode, this could fail or prevent fail&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    if (rxTxtLotBusy == FALSE)&lt;br /&gt;
    {&lt;br /&gt;
        rxTxtLotBusy = TRUE;&lt;br /&gt;
        integer rxliPos;&lt;br /&gt;
        string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
        if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
        {&lt;br /&gt;
            @rxin;&lt;br /&gt;
            rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
            rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
            sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
            if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
            {&lt;br /&gt;
                 jump rxin;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
        rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
        rxTxtLotBusy = FALSE;&lt;br /&gt;
        return rxmsg;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        //Perry Mizin: llSaySomething?&lt;br /&gt;
        return &amp;quot;&amp;quot;;        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string rxTxtLotPrv() = string receiveTextBatchPrivate()&lt;br /&gt;
string rxTxtLotPrv(key prxid, string prxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer prxliPos;&lt;br /&gt;
    string  prxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCachePrivate, (list)prxid))&lt;br /&gt;
    {&lt;br /&gt;
        prxliPos = llListFindList(sayCachePrivate, [prxid]);&lt;br /&gt;
        prxtmpStr = (prxtmpStr=&amp;quot;&amp;quot;) + prxtmpStr + llList2String(sayCachePrivate, prxliPos + 1);&lt;br /&gt;
        sayCachePrivate = llDeleteSubList(sayCachePrivate, prxliPos, prxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    prxmsg = prxtmpStr + prxmsg;&lt;br /&gt;
    prxmsg = llBase64ToString(llXorBase64StringsCorrect(prxmsg, llStringToBase64(password)));&lt;br /&gt;
    return prxmsg;&lt;br /&gt;
}&lt;br /&gt;
//updateTranslatorList()&lt;br /&gt;
updateTranslatorList()&lt;br /&gt;
{&lt;br /&gt;
    integer nx;&lt;br /&gt;
    integer xliLng;&lt;br /&gt;
    list    newList;&lt;br /&gt;
    string  tmpStrPos;&lt;br /&gt;
    integer newMaster;&lt;br /&gt;
    //Scan and remove translators not in the area&lt;br /&gt;
    xliLng = llGetListLength(translators);&lt;br /&gt;
    for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
    {&lt;br /&gt;
        tmpStrPos = llList2String(llGetObjectDetails(llList2Key(translators, nx + 1), [OBJECT_POS]), 0);&lt;br /&gt;
        if ((llVecDist(llGetPos(), (vector)tmpStrPos) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tmpStrPos != &amp;quot;&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            newList = (newList=[]) + newList +  llList2List(translators, nx, nx + 1);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    translators = newList;&lt;br /&gt;
    //llMessageLinked(LINK_THIS,65635544,(string)xliLng,&amp;quot;&amp;quot;); Perry Mizin: what is this necesary for?&lt;br /&gt;
    if (translators == [])&lt;br /&gt;
    {&lt;br /&gt;
        newMaster = 1;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        if (enabled)&lt;br /&gt;
        {&lt;br /&gt;
            xliLng = llGetListLength(translators);&lt;br /&gt;
            newMaster = 2;&lt;br /&gt;
            for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
            {&lt;br /&gt;
                //llOwnerSay(&amp;quot;Checking Priority Number(&amp;quot; +  (string)priorityNumber + &amp;quot;): &amp;quot; + (string)llList2Integer(translators, x));&lt;br /&gt;
                if (llList2Integer(translators, nx) &amp;gt; priorityNumber)&lt;br /&gt;
                {&lt;br /&gt;
                    newMaster = 0;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            newMaster = 0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster &amp;gt; 0) &amp;amp;&amp;amp; (newMaster == 0))&lt;br /&gt;
    {&lt;br /&gt;
        //We are being demoted from master to slave&lt;br /&gt;
        //Flush agentsInTranslation to master&lt;br /&gt;
        if (agentsInTranslation != [])&lt;br /&gt;
        {&lt;br /&gt;
            //Demotion Dump of agentsInTranslation to Master&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1003, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
            if (isInitialized == FALSE)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1004, options])); //error&lt;br /&gt;
        }&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster == 0) &amp;amp;&amp;amp; (newMaster &amp;gt; 0))&lt;br /&gt;
    {&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
        listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); &lt;br /&gt;
    }&lt;br /&gt;
    isMaster = newMaster;&lt;br /&gt;
    llMessageLinked(LINK_THIS, 34829304, (string)isMaster, &amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
//sendHeartbeat()&lt;br /&gt;
sendHeartbeat()&lt;br /&gt;
{&lt;br /&gt;
    updateTranslatorList();&lt;br /&gt;
    txTxtLot(broadcastChannel, llList2CSV([1001, priorityNumber]));&lt;br /&gt;
    //Broadcast agentList to Slaves&lt;br /&gt;
    if (isMaster == 2)&lt;br /&gt;
    {&lt;br /&gt;
        txTxtLot(broadcastChannel, llList2CSV([1002, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//checkThrottle()&lt;br /&gt;
checkThrottle(integer chkn, string chkmsg, list chkli)&lt;br /&gt;
{&lt;br /&gt;
    integer y;&lt;br /&gt;
    integer maxCount;&lt;br /&gt;
    float   chkoldTime;&lt;br /&gt;
    float   sleepTime;&lt;br /&gt;
    list    chknewli;&lt;br /&gt;
    key     returnValue;&lt;br /&gt;
    integer channelToSpeak;&lt;br /&gt;
 &lt;br /&gt;
    //loop though list and remove items older than 25 seconds&lt;br /&gt;
    for (y = 0; y &amp;lt; llGetListLength(requestList); y += 1)&lt;br /&gt;
    {&lt;br /&gt;
        chkoldTime = llList2Float(requestList, y);&lt;br /&gt;
        //Construct new list with only times less than 25 seconds&lt;br /&gt;
        if ((llGetTime() - chkoldTime) &amp;lt;= 25.0)&lt;br /&gt;
        { &lt;br /&gt;
            chknewli = (chknewli=[]) + chknewli + [chkoldTime];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    requestList = chknewli;&lt;br /&gt;
 &lt;br /&gt;
    y = llGetListLength(requestList);&lt;br /&gt;
 &lt;br /&gt;
    //Shunt all translations to linked translators if master&lt;br /&gt;
    if (isMaster == 2)&lt;br /&gt;
    {&lt;br /&gt;
        if (chkn == 0)&lt;br /&gt;
        {&lt;br /&gt;
            //Send HTTP request to other translator&lt;br /&gt;
            //Send out Request to Random Translator Channel&lt;br /&gt;
            channelToSpeak = llList2Integer(llListRandomize(llList2ListStrided(translators, 0, -1, 2), 1), 0);&lt;br /&gt;
            if (channelToSpeak &amp;gt; 0) &lt;br /&gt;
            {&lt;br /&gt;
                txTxtLot(channelToSpeak, llList2CSV([chkn, llList2CSV(chkli)]) + &amp;quot;~&amp;quot; + chkmsg);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if (y == 19)&lt;br /&gt;
    {&lt;br /&gt;
        sleepTime =  25.0 - (llGetTime() - llList2Float(requestList, 0));&lt;br /&gt;
        if (sleepTime &amp;gt; 0) &lt;br /&gt;
        {&lt;br /&gt;
            llSleep(sleepTime);&lt;br /&gt;
        }&lt;br /&gt;
        requestList = llDeleteSubList(requestList, 0, 0);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    if (chkn == 0)&lt;br /&gt;
    {&lt;br /&gt;
        chkmsg = &amp;quot;translate?v=1.0&amp;amp;q=&amp;quot; + chkmsg;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        chkmsg = &amp;quot;detect?v=1.0&amp;amp;q=&amp;quot; + chkmsg;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    requestList = (requestList=[]) + requestList + (list)llGetTime();&lt;br /&gt;
    returnValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/&amp;quot; + chkmsg, [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot; &amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
    if (returnValue != NULL_KEY)&lt;br /&gt;
    {&lt;br /&gt;
        if (chkn == 0)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS, 235365342, llList2CSV(chkli), returnValue); &lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS, 235365343, llList2CSV(chkli), returnValue); &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llSleep(40.0); //Something has gone horribly wrong, sleep 40 seconds to clear throttle&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string checkLanguage()&lt;br /&gt;
string checkLanguage(string chklantmpStr)&lt;br /&gt;
{&lt;br /&gt;
    if (llGetSubString(chklantmpStr, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else if (chklantmpStr == &amp;quot;und&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;el&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if (~llListFindList(languageCodes, [chklantmpStr]))&lt;br /&gt;
    {&lt;br /&gt;
 &lt;br /&gt;
    } else {&lt;br /&gt;
        chklantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    chklantmpStr = llGetSubString(chklantmpStr, 0, 1);&lt;br /&gt;
    return chklantmpStr;&lt;br /&gt;
}&lt;br /&gt;
//addAgent()&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
    integer avliPos;&lt;br /&gt;
    integer idNum;&lt;br /&gt;
    if (~llListFindList(agentsInTranslation, (list)avid))&lt;br /&gt;
    {&lt;br /&gt;
        avliPos = llListFindList(agentsInTranslation, [avid]);&lt;br /&gt;
        agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, chklan], avliPos + 1, avliPos + 2);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        @at;&lt;br /&gt;
        idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
        if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
        {//it exists       &lt;br /&gt;
            jump at;&lt;br /&gt;
        }&lt;br /&gt;
        agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, chklan, idNum];&lt;br /&gt;
        llMessageLinked(LINK_THIS, 64562349, avlan, avid);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string addNewAgent()&lt;br /&gt;
string addNewAgent(key newavid)&lt;br /&gt;
{&lt;br /&gt;
    string speakerLan;&lt;br /&gt;
 &lt;br /&gt;
    if (llGetAgentSize(newavid) != ZERO_VECTOR)&lt;br /&gt;
    {&lt;br /&gt;
        speakerLan  = checkLanguage(llGetAgentLanguage(newavid));&lt;br /&gt;
        if (speakerLan == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
            addAgent(newavid, speakerLan, TRUE);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            addAgent(newavid, speakerLan, FALSE);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return speakerLan;&lt;br /&gt;
}&lt;br /&gt;
//key getAgentKey()&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
    if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
    {&lt;br /&gt;
        integer gkliPos = llListFindList(agentsInTranslation, [agentID]);&lt;br /&gt;
        return llList2Key(agentsInTranslation, gkliPos - 3);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//processHTTPResponse()&lt;br /&gt;
processHTTPResponse(integer ntype, string bodyStr, list paramsli)&lt;br /&gt;
{&lt;br /&gt;
    integer spkliPos;&lt;br /&gt;
    list    recepientList;&lt;br /&gt;
    key     recepientID;&lt;br /&gt;
    string  recepientLanguage;&lt;br /&gt;
    string  languagePair;&lt;br /&gt;
    key     speakerID;&lt;br /&gt;
    string  speakerName;&lt;br /&gt;
    string  speakerLanguage;&lt;br /&gt;
    string  translatedText;&lt;br /&gt;
    string  lantmpStr;&lt;br /&gt;
    integer z;&lt;br /&gt;
    integer speakerLanguageReliable;&lt;br /&gt;
    float   speakerLanguageConfidence;&lt;br /&gt;
    list    paramtmpli;&lt;br /&gt;
 &lt;br /&gt;
    //===================&lt;br /&gt;
    //Process Translation&lt;br /&gt;
    //===================&lt;br /&gt;
    if (ntype == 0)&lt;br /&gt;
    {&lt;br /&gt;
        speakerID  = llList2Key(paramsli, 1);&lt;br /&gt;
        speakerName = llKey2Name(speakerID);&lt;br /&gt;
        if (speakerName == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
        }&lt;br /&gt;
        recepientList = llParseString2List(llList2String(paramsli, 2), [&amp;quot;@&amp;quot;], []);&lt;br /&gt;
        paramtmpli = llParseStringKeepNulls(llList2String(paramsli, 3), [&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
        recepientLanguage = llList2String(paramtmpli, 1);&lt;br /&gt;
        languagePair = llDumpList2String(paramtmpli, &amp;quot;&amp;gt;&amp;gt;&amp;quot;); &lt;br /&gt;
 &lt;br /&gt;
        //Perform Text Cleanup&lt;br /&gt;
        z = llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;detectedSourceLanguage\&amp;quot;:\&amp;quot;&amp;quot;); &lt;br /&gt;
        if (z != -1)&lt;br /&gt;
        {&lt;br /&gt;
            translatedText  = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, z);&lt;br /&gt;
            speakerLanguage = checkLanguage(llGetSubString(bodyStr, z + 28, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;}, \&amp;quot;responseDetails\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
            spkliPos = llListFindList(agentsInTranslation, [speakerID]);&lt;br /&gt;
            if (spkliPos &amp;gt;= 0)&lt;br /&gt;
            {&lt;br /&gt;
                if (speakerLanguage != llList2String(agentsInTranslation, spkliPos + 1))&lt;br /&gt;
                {&lt;br /&gt;
                    agentsInTranslation = llListReplaceList(agentsInTranslation, [TRUE], spkliPos + 2, spkliPos + 2);  //Mark for recheck of actual spoken language.&lt;br /&gt;
                }&lt;br /&gt;
            }                   &lt;br /&gt;
        }&lt;br /&gt;
        else if (z == -1)&lt;br /&gt;
        {&lt;br /&gt;
            translatedText = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;}, \&amp;quot;responseDetails\&amp;quot;&amp;quot;));&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        //Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
        if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            lantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
            //Perry Mizin Comment: Probably I guess this is wrong, maybe I am wrong&lt;br /&gt;
            //Perry Mizin Comment: alternative reverse order: &amp;quot;Hello World&amp;quot; could be &amp;quot;World Hello&amp;quot;&lt;br /&gt;
            //Perry Mizin Comment: reverse order: &amp;quot;Hello World&amp;quot; is &amp;quot;dlroW olleH&amp;quot; or ,pl^ºM ºllªH,&lt;br /&gt;
            for(z = llStringLength(translatedText);z &amp;gt;= 0; z--)&lt;br /&gt;
            {&lt;br /&gt;
                lantmpStr = (lantmpStr=&amp;quot;&amp;quot;) + lantmpStr + llGetSubString(translatedText, z, z); &lt;br /&gt;
            }&lt;br /&gt;
            translatedText = lantmpStr;&lt;br /&gt;
        }   &lt;br /&gt;
        lantmpStr = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
        if (showTranslation)&lt;br /&gt;
        {&lt;br /&gt;
            sendIM(speakerID, lantmpStr);&lt;br /&gt;
        } &lt;br /&gt;
        for (z = 0; z &amp;lt; llGetListLength(recepientList); z += 1)&lt;br /&gt;
        {&lt;br /&gt;
            recepientID = getAgentKey(llList2Integer(recepientList, z));&lt;br /&gt;
            if (recepientID != &amp;quot;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, [recepientID]) + 1);&lt;br /&gt;
                if (recepientLanguage != speakerLanguage)&lt;br /&gt;
                {&lt;br /&gt;
                    sendIM(recepientID, lantmpStr);&lt;br /&gt;
                }&lt;br /&gt;
            }  &lt;br /&gt;
        }&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    //===========================&lt;br /&gt;
    //Process Language Detection&lt;br /&gt;
    //===========================&lt;br /&gt;
    if (ntype == 1)&lt;br /&gt;
    {&lt;br /&gt;
        speakerID = llList2Key(paramsli, 1);&lt;br /&gt;
        speakerLanguageReliable = llToLower(llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) + 15, llSubStringIndex(bodyStr, &amp;quot;,\&amp;quot;confidence\&amp;quot;:&amp;quot;) - 1)) == &amp;quot;true&amp;quot;;&lt;br /&gt;
        speakerLanguageConfidence = (float)llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;,\&amp;quot;confidence\&amp;quot;:&amp;quot;) + 14, llSubStringIndex(bodyStr, &amp;quot;}, \&amp;quot;responseDetails\&amp;quot;:&amp;quot;) - 1);&lt;br /&gt;
 &lt;br /&gt;
        spkliPos = llListFindList(agentsInTranslation, [speakerID]);&lt;br /&gt;
        if (((spkliPos &amp;lt; 0) &amp;amp;&amp;amp; (speakerLanguageReliable) || (speakerLanguageConfidence &amp;gt;= 0.08)))&lt;br /&gt;
        {&lt;br /&gt;
            //Analyze Data&lt;br /&gt;
            lantmpStr = checkLanguage(llToLower(llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1)));&lt;br /&gt;
            if (lantmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            } &lt;br /&gt;
            if (speakerLanguageConfidence &amp;lt; 0.14)&lt;br /&gt;
            {&lt;br /&gt;
                addAgent(speakerID, lantmpStr, TRUE);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                addAgent(speakerID, lantmpStr, FALSE);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        //Multiplexor Initialization&lt;br /&gt;
        priorityNumber = version*1000000 + llRound(llFrand(499999) + 50000);&lt;br /&gt;
        llListen(broadcastChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        priorityNumListenID = llListen(priorityNumber, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
        //Send out initial heartbeat&lt;br /&gt;
        lastHeartBeat = llGetUnixTime();&lt;br /&gt;
        txTxtLot(broadcastChannel, llList2CSV([1001, priorityNumber]));&lt;br /&gt;
 &lt;br /&gt;
        //Wait for the network to settle down&lt;br /&gt;
        llSetTimerEvent(5.0); &lt;br /&gt;
        //llSetTimerEvent(10 + ((1-llGetRegionTimeDilation()) * 1));       &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
    {&lt;br /&gt;
        list    ltmpli;&lt;br /&gt;
&lt;br /&gt;
        //Old Multiplexor&lt;br /&gt;
        if (num == 8434532)&lt;br /&gt;
        {&lt;br /&gt;
            enabled = (integer)lstr;&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 3342976)&lt;br /&gt;
        {&lt;br /&gt;
            //Send Preferences&lt;br /&gt;
            options = lstr;&lt;br /&gt;
            if (isInitialized == FALSE) return;&lt;br /&gt;
            ltmpli = llCSV2List(options);&lt;br /&gt;
            showTranslation = llList2Integer(ltmpli, 0);&lt;br /&gt;
            tranObjects = llList2Integer(ltmpli, 1);&lt;br /&gt;
            autoLanguage = llList2Integer(ltmpli, 2);&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1004, options]));&lt;br /&gt;
 &lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 9384610)&lt;br /&gt;
        {&lt;br /&gt;
            if (isMaster == 0) //markering&lt;br /&gt;
                //llMessageLinked(LINK_THIS, 5598321, llList2CSV([id, str, FALSE]), &amp;quot;&amp;quot;);&lt;br /&gt;
                txTxtLot(broadcastChannel, llList2CSV([1003, lid, lstr, FALSE]));&lt;br /&gt;
            else&lt;br /&gt;
                addAgent(lid, lstr, TRUE);&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 345149625)&lt;br /&gt;
        {&lt;br /&gt;
            //Return Translation&lt;br /&gt;
            processHTTPResponse(0, lstr, llCSV2List(lid));&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 345149626)&lt;br /&gt;
        {&lt;br /&gt;
            //Return Detection&lt;br /&gt;
            processHTTPResponse(1, lstr, llCSV2List(lid));&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    sensor(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        integer s;&lt;br /&gt;
        key     sid;&lt;br /&gt;
 &lt;br /&gt;
        for (s = 0; s &amp;lt; num_detected; s += 1)&lt;br /&gt;
        {&lt;br /&gt;
            sid = llDetectedKey(s);&lt;br /&gt;
            if (~llListFindList(agentsInTranslation, (list)sid))&lt;br /&gt;
            {&lt;br /&gt;
                &lt;br /&gt;
            } else {&lt;br /&gt;
                addNewAgent(sid);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        integer w;&lt;br /&gt;
        string  spkrLan;&lt;br /&gt;
        string  recepLan;&lt;br /&gt;
        integer recepID;&lt;br /&gt;
        integer lstliPos;&lt;br /&gt;
        string  lanpair;&lt;br /&gt;
        list    translationCache;&lt;br /&gt;
        list    lsttmpli;&lt;br /&gt;
        integer ImessageType;&lt;br /&gt;
        string  Imessage;&lt;br /&gt;
        string  lsttmpStr;&lt;br /&gt;
        string  lst2tmpStr;&lt;br /&gt;
 &lt;br /&gt;
        //Multiplexor Code&lt;br /&gt;
        if ((channel == broadcastChannel) || (channel == priorityNumber))&lt;br /&gt;
        {&lt;br /&gt;
            //==========================&lt;br /&gt;
            //Process Proxy HTTP Request&lt;br /&gt;
            //==========================&lt;br /&gt;
 &lt;br /&gt;
            if (channel == priorityNumber)&lt;br /&gt;
            {&lt;br /&gt;
                if (llStringLength(message) &amp;gt;= 508)&lt;br /&gt;
                {&lt;br /&gt;
                    if (((integer)message/channel) != 4958654)&lt;br /&gt;
                    {&lt;br /&gt;
                        sayCachePrivate = (sayCachePrivate=[]) + sayCachePrivate + [id, message];&lt;br /&gt;
                        return; &lt;br /&gt;
                    }&lt;br /&gt;
                    message = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                message = rxTxtLotPrv(id, message);&lt;br /&gt;
                //Received packet to translate&lt;br /&gt;
                llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0.05, 0.25&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
                lsttmpli = llParseString2List(message, [&amp;quot;~&amp;quot;], []);&lt;br /&gt;
                lsttmpStr = llList2String(lsttmpli, 0);&lt;br /&gt;
                lsttmpli = llDeleteSubList(lsttmpli, 0, 0);&lt;br /&gt;
 &lt;br /&gt;
                lst2tmpStr = llDumpList2String(lsttmpli, &amp;quot;|&amp;quot;);&lt;br /&gt;
                lsttmpli = llCSV2List(lsttmpStr);&lt;br /&gt;
                lstliPos = llList2Integer(lsttmpli, 0);&lt;br /&gt;
                lsttmpli = llDeleteSubList(lsttmpli, 0, 0);&lt;br /&gt;
 &lt;br /&gt;
                checkThrottle(lstliPos, lst2tmpStr, lsttmpli);&lt;br /&gt;
 &lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
            //=======================&lt;br /&gt;
            //Process Global Messages&lt;br /&gt;
            //=======================&lt;br /&gt;
            if (llStringLength(message) &amp;gt;= 508)&lt;br /&gt;
            {&lt;br /&gt;
                if (((integer)message/channel) != 4958654)&lt;br /&gt;
                {&lt;br /&gt;
                    sayCache = (sayCache=[]) + sayCache + [id, message];&lt;br /&gt;
                    return; &lt;br /&gt;
                }&lt;br /&gt;
                message = &amp;quot;&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            message = rxTxtLot(id, message);&lt;br /&gt;
 &lt;br /&gt;
            lsttmpli = llCSV2List(message);&lt;br /&gt;
 &lt;br /&gt;
            if (llGetListLength(lsttmpli) &amp;gt;= 2)    &lt;br /&gt;
            {&lt;br /&gt;
                ImessageType = llList2Integer(lsttmpli, 0);&lt;br /&gt;
                lsttmpli = llDeleteSubList(lsttmpli, 0, 0);&lt;br /&gt;
                Imessage = llList2CSV(lsttmpli);        &lt;br /&gt;
 &lt;br /&gt;
                llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0, 0.25&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
                //Process Message Here&lt;br /&gt;
                if (ImessageType == 1001)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming Heartbeat&lt;br /&gt;
                    if ((integer)Imessage == priorityNumber)&lt;br /&gt;
                    {&lt;br /&gt;
                        llOwnerSay(&amp;quot;Priority Number Conflict!  Resetting Script...&amp;quot;);&lt;br /&gt;
                        llResetScript(); //Reset if conflicting priority number&lt;br /&gt;
                    }&lt;br /&gt;
                    lstliPos = llListFindList(translators, [id]);&lt;br /&gt;
                    if (lstliPos &amp;lt; 0) &lt;br /&gt;
                    {&lt;br /&gt;
                        translators = (translators=[]) + translators + [(integer)Imessage, id];&lt;br /&gt;
                        if ((isMaster &amp;gt; 0) &amp;amp;&amp;amp; (isInitialized))&lt;br /&gt;
                        {&lt;br /&gt;
                            txTxtLot((integer)Imessage, llList2CSV([1002, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
                            txTxtLot((integer)Imessage, llList2CSV([1004, options]));&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        translators = llListReplaceList(translators, [(integer)Imessage], lstliPos - 1, lstliPos - 1);&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if (ImessageType == 1002)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming agentsInTranslation Master Broadcast&lt;br /&gt;
                    if (isMaster == 0)&lt;br /&gt;
                    {&lt;br /&gt;
                        //llMessageLinked(LINK_THIS, 9458021, Imessage, &amp;quot;&amp;quot;);  &lt;br /&gt;
                        lsttmpli = llCSV2List(Imessage);&lt;br /&gt;
                        agentsInTranslation = [];&lt;br /&gt;
                        for (w = 0; w &amp;lt; llGetListLength(lsttmpli); w += 4)&lt;br /&gt;
                        {&lt;br /&gt;
                            agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [llList2Key(lsttmpli, w), llList2String(lsttmpli, w + 1), llList2Integer(lsttmpli, w + 2), llList2Integer(lsttmpli, w + 3)];&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if (ImessageType == 1003)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming agentsInTranslation dump from Slave&lt;br /&gt;
                    lsttmpli = llCSV2List(Imessage);&lt;br /&gt;
                    for (w = 0; w &amp;lt; llGetListLength(lsttmpli); w += 4)&lt;br /&gt;
                    {&lt;br /&gt;
                        addAgent(llList2Key(lsttmpli, w), llList2String(lsttmpli, w + 1), llList2Integer(lsttmpli, w + 2));&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if (ImessageType == 1004)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming Preferences&lt;br /&gt;
                    options = Imessage;&lt;br /&gt;
                    lsttmpli = llCSV2List(options);&lt;br /&gt;
                    showTranslation = llList2Integer(lsttmpli, 0);&lt;br /&gt;
                    tranObjects = llList2Integer(lsttmpli, 1);&lt;br /&gt;
                    autoLanguage = llList2Integer(lsttmpli, 2);&lt;br /&gt;
 &lt;br /&gt;
                    llMessageLinked(LINK_THIS, 3342977, Imessage, &amp;quot;&amp;quot;);  &lt;br /&gt;
                }&lt;br /&gt;
            }            &lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        //Translator Engine Code&lt;br /&gt;
        if ((llToLower(message) == &amp;quot;translator&amp;quot;) &amp;amp;&amp;amp; (isMaster &amp;gt; 0)) &lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS, 2540664, message, id);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ((!enabled) &amp;amp;&amp;amp; (isMaster == 1)) return;&lt;br /&gt;
 &lt;br /&gt;
        if (!tranObjects)&lt;br /&gt;
        {&lt;br /&gt;
            if (llGetAgentSize(id) != ZERO_VECTOR) return;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        lstliPos = llListFindList(agentsInTranslation, [id]);&lt;br /&gt;
        if (lstliPos &amp;gt;= 0)&lt;br /&gt;
        {            &lt;br /&gt;
            spkrLan = llList2String(agentsInTranslation, lstliPos + 1);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            spkrLan = addNewAgent(id);&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        if (spkrLan == &amp;quot;xx&amp;quot;) return;  //Agent Opt-Out&lt;br /&gt;
 &lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;1, 1, 0&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
        //===============================&lt;br /&gt;
        //Formulate Translation Requests&lt;br /&gt;
        //===============================&lt;br /&gt;
        for (w = 0; w &amp;lt; llGetListLength(agentsInTranslation); w += 4)&lt;br /&gt;
        {&lt;br /&gt;
            //Loop through translation group and do appropriate translations as needed&lt;br /&gt;
            recepID = llList2Integer(agentsInTranslation, w + 3);&lt;br /&gt;
            recepLan =  checkLanguage(llList2Key(agentsInTranslation, w + 1)); &lt;br /&gt;
            if ((spkrLan != recepLan) &amp;amp;&amp;amp; (recepLan != &amp;quot;&amp;quot;) &amp;amp;&amp;amp; (recepLan != &amp;quot;xx&amp;quot;))&lt;br /&gt;
            {&lt;br /&gt;
                lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
 &lt;br /&gt;
                lstliPos = llListFindList(translationCache, [lanpair]);&lt;br /&gt;
                if (lstliPos &amp;lt; 0)&lt;br /&gt;
                {&lt;br /&gt;
                  translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                  translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        //Process Requests&lt;br /&gt;
        if (llGetListLength(translationCache) &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            for (w = 0; w &amp;lt; llGetListLength(translationCache); w += 2)&lt;br /&gt;
            {&lt;br /&gt;
                //====================================&lt;br /&gt;
                //Translation&lt;br /&gt;
                //====================================&lt;br /&gt;
                //Forumulate and Send Translation Request&lt;br /&gt;
                lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, w), [&amp;quot;|&amp;quot;],[]), 1); &lt;br /&gt;
                checkThrottle(0, llEscapeURL(message) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, w + 1), llList2String(translationCache, w)]);&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
            spkrLan = &amp;quot;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
        //====================================&lt;br /&gt;
        //Language Detection&lt;br /&gt;
        //====================================&lt;br /&gt;
        if (llGetAgentSize(id) != ZERO_VECTOR) //llList2Key(llGetObjectDetails(id, [OBJECT_CREATOR]), 0) == NULL_KEY)&lt;br /&gt;
        {&lt;br /&gt;
            if (((spkrLan == &amp;quot;&amp;quot;) || (llList2Integer(agentsInTranslation, llListFindList(agentsInTranslation, [id]) + 2) == TRUE)) || (isMaster == 2))&lt;br /&gt;
            {&lt;br /&gt;
                //Forumulate and Send Language Detect Request&lt;br /&gt;
                checkThrottle(1, llEscapeURL(message), [llGetTime(), id]);&lt;br /&gt;
            }       &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
    {&lt;br /&gt;
        string  htttmpStr;&lt;br /&gt;
 &lt;br /&gt;
        if (status != 200) &lt;br /&gt;
        {&lt;br /&gt;
            //llOwnerSay(&amp;quot;WWW Error:&amp;quot; + (string)status);&lt;br /&gt;
            llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;1, 0, 0&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
            //llOwnerSay(body);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        //Process Resonse Code&lt;br /&gt;
        htttmpStr = llGetSubString(body, llSubStringIndex(body, &amp;quot;\&amp;quot;responseStatus\&amp;quot;:&amp;quot;), -1);&lt;br /&gt;
        status = (integer)llGetSubString(htttmpStr, 17, llSubStringIndex(htttmpStr, &amp;quot;}&amp;quot;) - 1);&lt;br /&gt;
        if (status != 200)&lt;br /&gt;
        {&lt;br /&gt;
            //llOwnerSay(&amp;quot;Language Server Returned Error Code: &amp;quot; + (string)status);&lt;br /&gt;
            //llOwnerSay(body);&lt;br /&gt;
            llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;1, 0, 0&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0, 0, 1&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
        llMessageLinked(LINK_THIS, 345149624, body, request_id);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(0.0);  // timer reset&lt;br /&gt;
        integer r;&lt;br /&gt;
        string  tmrtmpStr;&lt;br /&gt;
        list    tmrnewli;&lt;br /&gt;
        integer translatorCount = llGetListLength(translators)/2;&lt;br /&gt;
 &lt;br /&gt;
        if (isInitialized == FALSE)&lt;br /&gt;
        {&lt;br /&gt;
            enabled = TRUE;&lt;br /&gt;
            listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); &lt;br /&gt;
            llListen(777, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
            llMessageLinked(LINK_THIS, 6877259, (string)enabled, NULL_KEY);&lt;br /&gt;
            isInitialized = TRUE;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        llMessageLinked(LINK_THIS, 94558323, llList2CSV(agentsInTranslation), &amp;quot;&amp;quot;);&lt;br /&gt;
        if (isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            for (r = 0; r &amp;lt; llGetListLength(agentsInTranslation); r += 4)&lt;br /&gt;
            {&lt;br /&gt;
                tmrtmpStr = llList2String(llGetObjectDetails(llList2Key(agentsInTranslation, r), [OBJECT_POS]), 0);&lt;br /&gt;
                if ((llVecDist(llGetPos(), (vector)tmrtmpStr) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tmrtmpStr != &amp;quot;&amp;quot;))&lt;br /&gt;
                {&lt;br /&gt;
                    tmrnewli = (tmrnewli=[]) + tmrnewli + llList2List(agentsInTranslation, r, r + 3);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
            agentsInTranslation = tmrnewli;&lt;br /&gt;
            if ((llGetUnixTime() - lastHeartBeat) &amp;gt;= 5)&lt;br /&gt;
            {&lt;br /&gt;
                //Send heartbeat&lt;br /&gt;
                sendHeartbeat();&lt;br /&gt;
                lastHeartBeat = llGetUnixTime();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            if ((llGetUnixTime() - lastHeartBeat) &amp;gt;= `0 + llGetListLength(agentsInTranslation)*2 + llPow(translatorCount, 1.4) + translatorCount + ((1-llGetRegionTimeDilation()) * 5))&lt;br /&gt;
            {&lt;br /&gt;
                //Send heartbeat&lt;br /&gt;
                sendHeartbeat();&lt;br /&gt;
                lastHeartBeat = llGetUnixTime();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        //turn on and off scanner&lt;br /&gt;
        if ((autoLanguage) &amp;amp;&amp;amp; isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            llSensor(&amp;quot;&amp;quot;, NULL_KEY, AGENT, 20.0, PI);&lt;br /&gt;
        }&lt;br /&gt;
        llSetTimerEvent(4.0); // restart timer&lt;br /&gt;
        //llSetTimerEvent(4 + ((1-llGetRegionTimeDilation()) * 5));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=686662</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=686662"/>
		<updated>2009-12-14T19:52:32Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: /* THE CODE BELOW IS NOT TESTED */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribucion al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente codigo fué originalmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mi manera...&lt;br /&gt;
No os riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== THE CODE BELOW IS NOT TESTED ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//November 12, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Web Server Services powered by Google&lt;br /&gt;
 &lt;br /&gt;
//Variables&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
list agentsInTranslationOptions;&lt;br /&gt;
list requestList;&lt;br /&gt;
integer listenID;&lt;br /&gt;
 &lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
integer showTranslation = FALSE;&lt;br /&gt;
integer tranObjects = TRUE;&lt;br /&gt;
 &lt;br /&gt;
integer lastHeartBeat;&lt;br /&gt;
list    languageCodes = [&lt;br /&gt;
&amp;quot;zh-CN&amp;quot;, &amp;quot;zh-TW&amp;quot;, &amp;quot;hr&amp;quot;,  &lt;br /&gt;
&amp;quot;bg&amp;quot;, &amp;quot;be&amp;quot;, &amp;quot;ca&amp;quot;,&lt;br /&gt;
&amp;quot;af&amp;quot;, &amp;quot;sq&amp;quot;, &amp;quot;ar&amp;quot;,   &lt;br /&gt;
 &lt;br /&gt;
&amp;quot;tl&amp;quot;, &amp;quot;fr&amp;quot;, &amp;quot;gl&amp;quot;,    &lt;br /&gt;
&amp;quot;fi&amp;quot;, &amp;quot;en&amp;quot;, &amp;quot;et&amp;quot;,     &lt;br /&gt;
&amp;quot;cs&amp;quot;, &amp;quot;da&amp;quot;, &amp;quot;nl&amp;quot;,  &lt;br /&gt;
 &lt;br /&gt;
&amp;quot;id&amp;quot;, &amp;quot;ga&amp;quot;, &amp;quot;it&amp;quot;,      &lt;br /&gt;
&amp;quot;hi&amp;quot;, &amp;quot;hu&amp;quot;, &amp;quot;is&amp;quot;, &lt;br /&gt;
&amp;quot;de&amp;quot;, &amp;quot;el&amp;quot;, &amp;quot;iw&amp;quot;,    &lt;br /&gt;
 &lt;br /&gt;
&amp;quot;mt&amp;quot;, &amp;quot;no&amp;quot;, &amp;quot;fa&amp;quot;,   &lt;br /&gt;
&amp;quot;lt&amp;quot;, &amp;quot;mk&amp;quot;, &amp;quot;ms&amp;quot;,   &lt;br /&gt;
&amp;quot;ja&amp;quot;, &amp;quot;ko&amp;quot;, &amp;quot;lv&amp;quot;,   &lt;br /&gt;
 &lt;br /&gt;
&amp;quot;sl&amp;quot;, &amp;quot;es&amp;quot;, &amp;quot;sw&amp;quot;, &lt;br /&gt;
&amp;quot;ru&amp;quot;, &amp;quot;sr&amp;quot;, &amp;quot;sk&amp;quot;, &lt;br /&gt;
&amp;quot;pl&amp;quot;, &amp;quot;pt-PT&amp;quot;, &amp;quot;ro&amp;quot;, &lt;br /&gt;
 &lt;br /&gt;
&amp;quot;yi&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;uk&amp;quot;, &amp;quot;vi&amp;quot;, &amp;quot;cy&amp;quot;,&lt;br /&gt;
&amp;quot;sv&amp;quot;,&amp;quot;th&amp;quot;, &amp;quot;tr&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
list    translators;&lt;br /&gt;
list    sayCache;&lt;br /&gt;
list    sayCachePrivate;&lt;br /&gt;
integer priorityNumber;&lt;br /&gt;
integer priorityNumListenID;&lt;br /&gt;
integer isInitialized = FALSE;&lt;br /&gt;
string  options;&lt;br /&gt;
 &lt;br /&gt;
//Options&lt;br /&gt;
//integer debug = TRUE;&lt;br /&gt;
integer broadcastChannel = -9999999; //note this is not the channel used by the HR Universal Translator&lt;br /&gt;
string  password = &amp;quot;password&amp;quot;; //note this is not the password used to encrypt comms of the HR Universal Translator&lt;br /&gt;
integer version = 190;&lt;br /&gt;
&lt;br /&gt;
sendIM(key imid, string imstr)&lt;br /&gt;
{&lt;br /&gt;
    if (llGetParcelFlags(llGetPos()) &amp;amp; PARCEL_FLAG_ALLOW_SCRIPTS)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 85234119, imstr, imid); &lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_THIS, 85304563, imstr, imid);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//txTxtLot() = sendTextBatch()&lt;br /&gt;
txTxtLot(integer txch, string txtxt) &lt;br /&gt;
{&lt;br /&gt;
    txtxt = llXorBase64StringsCorrect(llStringToBase64(txtxt), llStringToBase64(password));&lt;br /&gt;
    while (llStringLength(txtxt) &amp;gt; 508) //If string is 509 characters or longer &lt;br /&gt;
    {&lt;br /&gt;
        llSay(txch, llGetSubString(txtxt, 0, 507)); //send 508 character chunk&lt;br /&gt;
        txtxt = llGetSubString(txtxt, 508, -1);  //delete 508 character chunk&lt;br /&gt;
    }&lt;br /&gt;
    llSay(txch, txtxt);  //send out any remainder chunk or original chunk&lt;br /&gt;
    //Perry Mizin Comment: I don´t understand the aim of the following if.    &lt;br /&gt;
    //Hank Ramos Comment: this line serves to &amp;quot;trigger&amp;quot; the receiver not to wait for another batch.  If the&lt;br /&gt;
    //message length is exactly 508 characters, the receiver things that another chunk of the message is coming.&lt;br /&gt;
    //This message serves to tell the receiver that the last chunk was the last chunk, not another regular chunk.&lt;br /&gt;
    if (llStringLength(txtxt) == 508)&lt;br /&gt;
        llSay(txch, (string)(txch*4958654));&lt;br /&gt;
    //Hank Ramos Comment: this just flashes the color of the bottom prim to show a message was sent&lt;br /&gt;
    llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0, 0.25&amp;gt;, &amp;quot;&amp;quot;); &lt;br /&gt;
}  &lt;br /&gt;
//string rxTxtLot() = string receiveTextBatch()&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer rxliPos;&lt;br /&gt;
    string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
    {&lt;br /&gt;
        rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
        rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
        sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
    rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
    return rxmsg;&lt;br /&gt;
}&lt;br /&gt;
//string rxTxtLot() = string receiveTextBatch() (Another way)&lt;br /&gt;
integer rxTxtLotBusy = FALSE; //Perry Mizin: added Busy Mode, this could fail or prevent fail&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    if (rxTxtLotBusy == FALSE)&lt;br /&gt;
    {&lt;br /&gt;
        rxTxtLotBusy = TRUE;&lt;br /&gt;
        integer rxliPos;&lt;br /&gt;
        string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
        if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
        {&lt;br /&gt;
            @rxin;&lt;br /&gt;
            rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
            rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
            sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
            if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
            {&lt;br /&gt;
                 jump rxin;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
        rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
        rxTxtLotBusy = FALSE;&lt;br /&gt;
        return rxmsg;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        //Perry Mizin: llSaySomething?&lt;br /&gt;
        return &amp;quot;&amp;quot;;        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string rxTxtLotPrv() = string receiveTextBatchPrivate()&lt;br /&gt;
string rxTxtLotPrv(key prxid, string prxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer prxliPos;&lt;br /&gt;
    string  prxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCachePrivate, (list)prxid))&lt;br /&gt;
    {&lt;br /&gt;
        prxliPos = llListFindList(sayCachePrivate, [prxid]);&lt;br /&gt;
        prxtmpStr = (prxtmpStr=&amp;quot;&amp;quot;) + prxtmpStr + llList2String(sayCachePrivate, prxliPos + 1);&lt;br /&gt;
        sayCachePrivate = llDeleteSubList(sayCachePrivate, prxliPos, prxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    prxmsg = prxtmpStr + prxmsg;&lt;br /&gt;
    prxmsg = llBase64ToString(llXorBase64StringsCorrect(prxmsg, llStringToBase64(password)));&lt;br /&gt;
    return prxmsg;&lt;br /&gt;
}&lt;br /&gt;
//updateTranslatorList()&lt;br /&gt;
updateTranslatorList()&lt;br /&gt;
{&lt;br /&gt;
    integer nx;&lt;br /&gt;
    integer xliLng;&lt;br /&gt;
    list    newList;&lt;br /&gt;
    string  tmpStrPos;&lt;br /&gt;
    integer newMaster;&lt;br /&gt;
    //Scan and remove translators not in the area&lt;br /&gt;
    xliLng = llGetListLength(translators);&lt;br /&gt;
    for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
    {&lt;br /&gt;
        tmpStrPos = llList2String(llGetObjectDetails(llList2Key(translators, nx + 1), [OBJECT_POS]), 0);&lt;br /&gt;
        if ((llVecDist(llGetPos(), (vector)tmpStrPos) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tmpStrPos != &amp;quot;&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            newList = (newList=[]) + newList +  llList2List(translators, nx, nx + 1);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    translators = newList;&lt;br /&gt;
    //llMessageLinked(LINK_THIS,65635544,(string)xliLng,&amp;quot;&amp;quot;); Perry Mizin: what is this necesary for?&lt;br /&gt;
    if (translators == [])&lt;br /&gt;
    {&lt;br /&gt;
        newMaster = 1;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        if (enabled)&lt;br /&gt;
        {&lt;br /&gt;
            xliLng = llGetListLength(translators);&lt;br /&gt;
            newMaster = 2;&lt;br /&gt;
            for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
            {&lt;br /&gt;
                //llOwnerSay(&amp;quot;Checking Priority Number(&amp;quot; +  (string)priorityNumber + &amp;quot;): &amp;quot; + (string)llList2Integer(translators, x));&lt;br /&gt;
                if (llList2Integer(translators, nx) &amp;gt; priorityNumber)&lt;br /&gt;
                {&lt;br /&gt;
                    newMaster = 0;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            newMaster = 0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster &amp;gt; 0) &amp;amp;&amp;amp; (newMaster == 0))&lt;br /&gt;
    {&lt;br /&gt;
        //We are being demoted from master to slave&lt;br /&gt;
        //Flush agentsInTranslation to master&lt;br /&gt;
        if (agentsInTranslation != [])&lt;br /&gt;
        {&lt;br /&gt;
            //Demotion Dump of agentsInTranslation to Master&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1003, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
            if (isInitialized == FALSE)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1004, options])); //error&lt;br /&gt;
        }&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster == 0) &amp;amp;&amp;amp; (newMaster &amp;gt; 0))&lt;br /&gt;
    {&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
        listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); &lt;br /&gt;
    }&lt;br /&gt;
    isMaster = newMaster;&lt;br /&gt;
    llMessageLinked(LINK_THIS, 34829304, (string)isMaster, &amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
//sendHeartbeat()&lt;br /&gt;
sendHeartbeat()&lt;br /&gt;
{&lt;br /&gt;
    updateTranslatorList();&lt;br /&gt;
    txTxtLot(broadcastChannel, llList2CSV([1001, priorityNumber]));&lt;br /&gt;
    //Broadcast agentList to Slaves&lt;br /&gt;
    if (isMaster == 2)&lt;br /&gt;
    {&lt;br /&gt;
        txTxtLot(broadcastChannel, llList2CSV([1002, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//checkThrottle()&lt;br /&gt;
checkThrottle(integer chkn, string chkmsg, list chkli)&lt;br /&gt;
{&lt;br /&gt;
    integer y;&lt;br /&gt;
    integer maxCount;&lt;br /&gt;
    float   chkoldTime;&lt;br /&gt;
    float   sleepTime;&lt;br /&gt;
    list    chknewli;&lt;br /&gt;
    key     returnValue;&lt;br /&gt;
    integer channelToSpeak;&lt;br /&gt;
 &lt;br /&gt;
    //loop though list and remove items older than 25 seconds&lt;br /&gt;
    for (y = 0; y &amp;lt; llGetListLength(requestList); y += 1)&lt;br /&gt;
    {&lt;br /&gt;
        chkoldTime = llList2Float(requestList, y);&lt;br /&gt;
        //Construct new list with only times less than 25 seconds&lt;br /&gt;
        if ((llGetTime() - chkoldTime) &amp;lt;= 25.0)&lt;br /&gt;
        { &lt;br /&gt;
            chknewli = (chknewli=[]) + chknewli + [chkoldTime];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    requestList = chknewli;&lt;br /&gt;
 &lt;br /&gt;
    y = llGetListLength(requestList);&lt;br /&gt;
 &lt;br /&gt;
    //Shunt all translations to linked translators if master&lt;br /&gt;
    if (isMaster == 2)&lt;br /&gt;
    {&lt;br /&gt;
        if (chkn == 0)&lt;br /&gt;
        {&lt;br /&gt;
            //Send HTTP request to other translator&lt;br /&gt;
            //Send out Request to Random Translator Channel&lt;br /&gt;
            channelToSpeak = llList2Integer(llListRandomize(llList2ListStrided(translators, 0, -1, 2), 1), 0);&lt;br /&gt;
            if (channelToSpeak &amp;gt; 0) &lt;br /&gt;
            {&lt;br /&gt;
                txTxtLot(channelToSpeak, llList2CSV([chkn, llList2CSV(chkli)]) + &amp;quot;~&amp;quot; + chkmsg);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if (y == 19)&lt;br /&gt;
    {&lt;br /&gt;
        sleepTime =  25.0 - (llGetTime() - llList2Float(requestList, 0));&lt;br /&gt;
        if (sleepTime &amp;gt; 0) &lt;br /&gt;
        {&lt;br /&gt;
            llSleep(sleepTime);&lt;br /&gt;
        }&lt;br /&gt;
        requestList = llDeleteSubList(requestList, 0, 0);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    if (chkn == 0)&lt;br /&gt;
    {&lt;br /&gt;
        chkmsg = &amp;quot;translate?v=1.0&amp;amp;q=&amp;quot; + chkmsg;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        chkmsg = &amp;quot;detect?v=1.0&amp;amp;q=&amp;quot; + chkmsg;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    requestList = (requestList=[]) + requestList + (list)llGetTime();&lt;br /&gt;
    returnValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/&amp;quot; + chkmsg, [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot; &amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
    if (returnValue != NULL_KEY)&lt;br /&gt;
    {&lt;br /&gt;
        if (chkn == 0)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS, 235365342, llList2CSV(chkli), returnValue); &lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS, 235365343, llList2CSV(chkli), returnValue); &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llSleep(40.0); //Something has gone horribly wrong, sleep 40 seconds to clear throttle&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string checkLanguage()&lt;br /&gt;
string checkLanguage(string chklantmpStr)&lt;br /&gt;
{&lt;br /&gt;
    if (llGetSubString(chklantmpStr, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else if (chklantmpStr == &amp;quot;und&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        chklantmpStr = &amp;quot;el&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if (~llListFindList(languageCodes, [chklantmpStr]))&lt;br /&gt;
    {&lt;br /&gt;
 &lt;br /&gt;
    } else {&lt;br /&gt;
        chklantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    chklantmpStr = llGetSubString(chklantmpStr, 0, 1);&lt;br /&gt;
    return chklantmpStr;&lt;br /&gt;
}&lt;br /&gt;
//addAgent()&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
    integer avliPos;&lt;br /&gt;
    integer idNum;&lt;br /&gt;
    if (~llListFindList(agentsInTranslation, (list)avid))&lt;br /&gt;
    {&lt;br /&gt;
        avliPos = llListFindList(agentsInTranslation, [avid]);&lt;br /&gt;
        agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, chklan], avliPos + 1, avliPos + 2);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        @at;&lt;br /&gt;
        idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
        if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
        {//it exists       &lt;br /&gt;
            jump at;&lt;br /&gt;
        }&lt;br /&gt;
        agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, chklan, idNum];&lt;br /&gt;
        llMessageLinked(LINK_THIS, 64562349, avlan, avid);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string addNewAgent()&lt;br /&gt;
string addNewAgent(key newavid)&lt;br /&gt;
{&lt;br /&gt;
    string speakerLan;&lt;br /&gt;
 &lt;br /&gt;
    if (llGetAgentSize(newavid) != ZERO_VECTOR)&lt;br /&gt;
    {&lt;br /&gt;
        speakerLan  = checkLanguage(llGetAgentLanguage(newavid));&lt;br /&gt;
        if (speakerLan == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerLan = &amp;quot;en&amp;quot;;&lt;br /&gt;
            addAgent(newavid, speakerLan, TRUE);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            addAgent(newavid, speakerLan, FALSE);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return speakerLan;&lt;br /&gt;
}&lt;br /&gt;
//key getAgentKey()&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
    if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
    {&lt;br /&gt;
        integer gkliPos = llListFindList(agentsInTranslation, [agentID]);&lt;br /&gt;
        return llList2Key(agentsInTranslation, gkliPos - 3);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//processHTTPResponse()&lt;br /&gt;
processHTTPResponse(integer ntype, string bodyStr, list paramsli)&lt;br /&gt;
{&lt;br /&gt;
    integer spkliPos;&lt;br /&gt;
    list    recepientList;&lt;br /&gt;
    key     recepientID;&lt;br /&gt;
    string  recepientLanguage;&lt;br /&gt;
    string  languagePair;&lt;br /&gt;
    key     speakerID;&lt;br /&gt;
    string  speakerName;&lt;br /&gt;
    string  speakerLanguage;&lt;br /&gt;
    string  translatedText;&lt;br /&gt;
    string  lantmpStr;&lt;br /&gt;
    integer z;&lt;br /&gt;
    integer speakerLanguageReliable;&lt;br /&gt;
    float   speakerLanguageConfidence;&lt;br /&gt;
    list    paramtmpli;&lt;br /&gt;
 &lt;br /&gt;
    //===================&lt;br /&gt;
    //Process Translation&lt;br /&gt;
    //===================&lt;br /&gt;
    if (ntype == 0)&lt;br /&gt;
    {&lt;br /&gt;
        speakerID  = llList2Key(paramsli, 1);&lt;br /&gt;
        speakerName = llKey2Name(speakerID);&lt;br /&gt;
        if (speakerName == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
        }&lt;br /&gt;
        recepientList = llParseString2List(llList2String(paramsli, 2), [&amp;quot;@&amp;quot;], []);&lt;br /&gt;
        paramtmpli = llParseStringKeepNulls(llList2String(paramsli, 3), [&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
        recepientLanguage = llList2String(paramtmpli, 1);&lt;br /&gt;
        languagePair = llDumpList2String(paramtmpli, &amp;quot;&amp;gt;&amp;gt;&amp;quot;); &lt;br /&gt;
 &lt;br /&gt;
        //Perform Text Cleanup&lt;br /&gt;
        z = llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;detectedSourceLanguage\&amp;quot;:\&amp;quot;&amp;quot;); &lt;br /&gt;
        if (z != -1)&lt;br /&gt;
        {&lt;br /&gt;
            translatedText  = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, z);&lt;br /&gt;
            speakerLanguage = checkLanguage(llGetSubString(bodyStr, z + 28, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;}, \&amp;quot;responseDetails\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
            spkliPos = llListFindList(agentsInTranslation, [speakerID]);&lt;br /&gt;
            if (spkliPos &amp;gt;= 0)&lt;br /&gt;
            {&lt;br /&gt;
                if (speakerLanguage != llList2String(agentsInTranslation, spkliPos + 1))&lt;br /&gt;
                {&lt;br /&gt;
                    agentsInTranslation = llListReplaceList(agentsInTranslation, [TRUE], spkliPos + 2, spkliPos + 2);  //Mark for recheck of actual spoken language.&lt;br /&gt;
                }&lt;br /&gt;
            }                   &lt;br /&gt;
        }&lt;br /&gt;
        else if (z == -1)&lt;br /&gt;
        {&lt;br /&gt;
            translatedText = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;}, \&amp;quot;responseDetails\&amp;quot;&amp;quot;));&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        //Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
        if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            lantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
            //Perry Mizin Comment: Probably I guess this is wrong, maybe I am wrong&lt;br /&gt;
            //Perry Mizin Comment: alternative reverse order: &amp;quot;Hello World&amp;quot; could be &amp;quot;World Hello&amp;quot;&lt;br /&gt;
            //Perry Mizin Comment: reverse order: &amp;quot;Hello World&amp;quot; is &amp;quot;dlroW olleH&amp;quot; or ,pl^ºM ºllªH,&lt;br /&gt;
            for(z = llStringLength(translatedText);z &amp;gt;= 0; z--)&lt;br /&gt;
            {&lt;br /&gt;
                lantmpStr = (lantmpStr=&amp;quot;&amp;quot;) + lantmpStr + llGetSubString(translatedText, z, z); &lt;br /&gt;
            }&lt;br /&gt;
            translatedText = lantmpStr;&lt;br /&gt;
        }   &lt;br /&gt;
        lantmpStr = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
        if (showTranslation)&lt;br /&gt;
        {&lt;br /&gt;
            sendIM(speakerID, lantmpStr);&lt;br /&gt;
        } &lt;br /&gt;
        for (z = 0; z &amp;lt; llGetListLength(recepientList); z += 1)&lt;br /&gt;
        {&lt;br /&gt;
            recepientID = getAgentKey(llList2Integer(recepientList, z));&lt;br /&gt;
            if (recepientID != &amp;quot;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, [recepientID]) + 1);&lt;br /&gt;
                if (recepientLanguage != speakerLanguage)&lt;br /&gt;
                {&lt;br /&gt;
                    sendIM(recepientID, lantmpStr);&lt;br /&gt;
                }&lt;br /&gt;
            }  &lt;br /&gt;
        }&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    //===========================&lt;br /&gt;
    //Process Language Detection&lt;br /&gt;
    //===========================&lt;br /&gt;
    if (ntype == 1)&lt;br /&gt;
    {&lt;br /&gt;
        speakerID = llList2Key(paramsli, 1);&lt;br /&gt;
        speakerLanguageReliable = llToLower(llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) + 15, llSubStringIndex(bodyStr, &amp;quot;,\&amp;quot;confidence\&amp;quot;:&amp;quot;) - 1)) == &amp;quot;true&amp;quot;;&lt;br /&gt;
        speakerLanguageConfidence = (float)llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;,\&amp;quot;confidence\&amp;quot;:&amp;quot;) + 14, llSubStringIndex(bodyStr, &amp;quot;}, \&amp;quot;responseDetails\&amp;quot;:&amp;quot;) - 1);&lt;br /&gt;
 &lt;br /&gt;
        spkliPos = llListFindList(agentsInTranslation, [speakerID]);&lt;br /&gt;
        if (((spkliPos &amp;lt; 0) &amp;amp;&amp;amp; (speakerLanguageReliable) || (speakerLanguageConfidence &amp;gt;= 0.08)))&lt;br /&gt;
        {&lt;br /&gt;
            //Analyze Data&lt;br /&gt;
            lantmpStr = checkLanguage(llToLower(llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1)));&lt;br /&gt;
            if (lantmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            } &lt;br /&gt;
            if (speakerLanguageConfidence &amp;lt; 0.14)&lt;br /&gt;
            {&lt;br /&gt;
                addAgent(speakerID, lantmpStr, TRUE);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                addAgent(speakerID, lantmpStr, FALSE);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        //Multiplexor Initialization&lt;br /&gt;
        priorityNumber = version*1000000 + llRound(llFrand(499999) + 50000);&lt;br /&gt;
        llListen(broadcastChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        priorityNumListenID = llListen(priorityNumber, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
        //Send out initial heartbeat&lt;br /&gt;
        lastHeartBeat = llGetUnixTime();&lt;br /&gt;
        sendTextBatch(broadcastChannel, llList2CSV([1001, priorityNumber]));&lt;br /&gt;
 &lt;br /&gt;
        //Wait for the network to settle down&lt;br /&gt;
        llSetTimerEvent(5.0); &lt;br /&gt;
        //llSetTimerEvent(10 + ((1-llGetRegionTimeDilation()) * 1));       &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    link_message(integer sender_num, integer num, string lstr, key lid)&lt;br /&gt;
    {&lt;br /&gt;
        list    ltmpli;&lt;br /&gt;
&lt;br /&gt;
        //Old Multiplexor&lt;br /&gt;
        if (num == 8434532)&lt;br /&gt;
        {&lt;br /&gt;
            enabled = (integer)lstr;&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 3342976)&lt;br /&gt;
        {&lt;br /&gt;
            //Send Preferences&lt;br /&gt;
            options = lstr;&lt;br /&gt;
            if (isInitialized == FALSE) return;&lt;br /&gt;
            ltmpli = llCSV2List(options);&lt;br /&gt;
            showTranslation = llList2Integer(ltmpli, 0);&lt;br /&gt;
            tranObjects = llList2Integer(ltmpli, 1);&lt;br /&gt;
            autoLanguage = llList2Integer(ltmpli, 2);&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1004, options]));&lt;br /&gt;
 &lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 9384610)&lt;br /&gt;
        {&lt;br /&gt;
            if (isMaster == 0) //markering&lt;br /&gt;
                //llMessageLinked(LINK_THIS, 5598321, llList2CSV([id, str, FALSE]), &amp;quot;&amp;quot;);&lt;br /&gt;
                txTxtLot(broadcastChannel, llList2CSV([1003, lid, lstr, FALSE]));&lt;br /&gt;
            else&lt;br /&gt;
                addAgent(lid, lstr, TRUE);&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 345149625)&lt;br /&gt;
        {&lt;br /&gt;
            //Return Translation&lt;br /&gt;
            processHTTPResponse(0, lstr, llCSV2List(lid));&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 345149626)&lt;br /&gt;
        {&lt;br /&gt;
            //Return Detection&lt;br /&gt;
            processHTTPResponse(1, lstr, llCSV2List(lid));&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    sensor(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        integer s;&lt;br /&gt;
        key     sid;&lt;br /&gt;
 &lt;br /&gt;
        for (s = 0; s &amp;lt; num_detected; s += 1)&lt;br /&gt;
        {&lt;br /&gt;
            sid = llDetectedKey(s);&lt;br /&gt;
            if (~llListFindList(agentsInTranslation, (list)sid))&lt;br /&gt;
            {&lt;br /&gt;
                &lt;br /&gt;
            } else {&lt;br /&gt;
                addNewAgent(sid);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        integer w;&lt;br /&gt;
        string  spkrLan;&lt;br /&gt;
        string  recepLan;&lt;br /&gt;
        integer recepID;&lt;br /&gt;
        integer lstliPos;&lt;br /&gt;
        string  lanpair;&lt;br /&gt;
        list    translationCache;&lt;br /&gt;
        list    lsttmpli;&lt;br /&gt;
        integer ImessageType;&lt;br /&gt;
        string  Imessage;&lt;br /&gt;
        string  lsttmpStr;&lt;br /&gt;
        string  lst2tmpStr;&lt;br /&gt;
 &lt;br /&gt;
        //Multiplexor Code&lt;br /&gt;
        if ((channel == broadcastChannel) || (channel == priorityNumber))&lt;br /&gt;
        {&lt;br /&gt;
            //==========================&lt;br /&gt;
            //Process Proxy HTTP Request&lt;br /&gt;
            //==========================&lt;br /&gt;
 &lt;br /&gt;
            if (channel == priorityNumber)&lt;br /&gt;
            {&lt;br /&gt;
                if (llStringLength(message) &amp;gt;= 508)&lt;br /&gt;
                {&lt;br /&gt;
                    if (((integer)message/channel) != 4958654)&lt;br /&gt;
                    {&lt;br /&gt;
                        sayCachePrivate = (sayCachePrivate=[]) + sayCachePrivate + [id, message];&lt;br /&gt;
                        return; &lt;br /&gt;
                    }&lt;br /&gt;
                    message = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                message = rxTxtLotPrv(id, message);&lt;br /&gt;
                //Received packet to translate&lt;br /&gt;
                llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0.05, 0.25&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
                lsttmpli = llParseString2List(message, [&amp;quot;~&amp;quot;], []);&lt;br /&gt;
                lsttmpStr = llList2String(lsttmpli, 0);&lt;br /&gt;
                lsttmpli = llDeleteSubList(lsttmpli, 0, 0);&lt;br /&gt;
 &lt;br /&gt;
                lst2tmpStr = llDumpList2String(lsttmpli, &amp;quot;|&amp;quot;);&lt;br /&gt;
                lsttmpli = llCSV2List(lsttmpStr);&lt;br /&gt;
                lstliPos = llList2Integer(lsttmpli, 0);&lt;br /&gt;
                lsttmpli = llDeleteSubList(lsttmpli, 0, 0);&lt;br /&gt;
 &lt;br /&gt;
                checkThrottle(lstliPos, lst2tmpStr, lsttmpli);&lt;br /&gt;
 &lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
            //=======================&lt;br /&gt;
            //Process Global Messages&lt;br /&gt;
            //=======================&lt;br /&gt;
            if (llStringLength(message) &amp;gt;= 508)&lt;br /&gt;
            {&lt;br /&gt;
                if (((integer)message/channel) != 4958654)&lt;br /&gt;
                {&lt;br /&gt;
                    sayCache = (sayCache=[]) + sayCache + [id, message];&lt;br /&gt;
                    return; &lt;br /&gt;
                }&lt;br /&gt;
                message = &amp;quot;&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            message = receiveTextBatch(id, message);&lt;br /&gt;
 &lt;br /&gt;
            lsttmpli = llCSV2List(message);&lt;br /&gt;
 &lt;br /&gt;
            if (llGetListLength(lsttmpli) &amp;gt;= 2)    &lt;br /&gt;
            {&lt;br /&gt;
                ImessageType = llList2Integer(lsttmpli, 0);&lt;br /&gt;
                lsttmpli = llDeleteSubList(lsttmpli, 0, 0);&lt;br /&gt;
                Imessage = llList2CSV(lsttmpli);        &lt;br /&gt;
 &lt;br /&gt;
                llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0, 0.25&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
                //Process Message Here&lt;br /&gt;
                if (ImessageType == 1001)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming Heartbeat&lt;br /&gt;
                    if ((integer)Imessage == priorityNumber)&lt;br /&gt;
                    {&lt;br /&gt;
                        llOwnerSay(&amp;quot;Priority Number Conflict!  Resetting Script...&amp;quot;);&lt;br /&gt;
                        llResetScript(); //Reset if conflicting priority number&lt;br /&gt;
                    }&lt;br /&gt;
                    lstliPos = llListFindList(translators, [id]);&lt;br /&gt;
                    if (lstliPos &amp;lt; 0) &lt;br /&gt;
                    {&lt;br /&gt;
                        translators = (translators=[]) + translators + [(integer)Imessage, id];&lt;br /&gt;
                        if ((isMaster &amp;gt; 0) &amp;amp;&amp;amp; (isInitialized))&lt;br /&gt;
                        {&lt;br /&gt;
                            txTxtLot((integer)Imessage, llList2CSV([1002, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
                            txTxtLot((integer)Imessage, llList2CSV([1004, options]));&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        translators = llListReplaceList(translators, [(integer)Imessage], lstliPos - 1, lstliPos - 1);&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if (ImessageType == 1002)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming agentsInTranslation Master Broadcast&lt;br /&gt;
                    if (isMaster == 0)&lt;br /&gt;
                    {&lt;br /&gt;
                        //llMessageLinked(LINK_THIS, 9458021, Imessage, &amp;quot;&amp;quot;);  &lt;br /&gt;
                        lsttmpli = llCSV2List(Imessage);&lt;br /&gt;
                        agentsInTranslation = [];&lt;br /&gt;
                        for (w = 0; w &amp;lt; llGetListLength(lsttmpli); w += 4)&lt;br /&gt;
                        {&lt;br /&gt;
                            agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [llList2Key(lsttmpli, w), llList2String(lsttmpli, w + 1), llList2Integer(lsttmpli, w + 2), llList2Integer(lsttmpli, w + 3)];&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if (ImessageType == 1003)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming agentsInTranslation dump from Slave&lt;br /&gt;
                    lsttmpli = llCSV2List(Imessage);&lt;br /&gt;
                    for (w = 0; w &amp;lt; llGetListLength(lsttmpli); w += 4)&lt;br /&gt;
                    {&lt;br /&gt;
                        addAgent(llList2Key(lsttmpli, w), llList2String(lsttmpli, w + 1), llList2Integer(lsttmpli, w + 2));&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if (ImessageType == 1004)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming Preferences&lt;br /&gt;
                    options = Imessage;&lt;br /&gt;
                    lsttmpli = llCSV2List(options);&lt;br /&gt;
                    showTranslation = llList2Integer(lsttmpli, 0);&lt;br /&gt;
                    tranObjects = llList2Integer(lsttmpli, 1);&lt;br /&gt;
                    autoLanguage = llList2Integer(lsttmpli, 2);&lt;br /&gt;
 &lt;br /&gt;
                    llMessageLinked(LINK_THIS, 3342977, Imessage, &amp;quot;&amp;quot;);  &lt;br /&gt;
                }&lt;br /&gt;
            }            &lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        //Translator Engine Code&lt;br /&gt;
        if ((llToLower(message) == &amp;quot;translator&amp;quot;) &amp;amp;&amp;amp; (isMaster &amp;gt; 0)) &lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS, 2540664, message, id);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ((!enabled) &amp;amp;&amp;amp; (isMaster == 1)) return;&lt;br /&gt;
 &lt;br /&gt;
        if (!tranObjects)&lt;br /&gt;
        {&lt;br /&gt;
            if (llGetAgentSize(id) != ZERO_VECTOR) return;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        lstliPos = llListFindList(agentsInTranslation, [id]);&lt;br /&gt;
        if (lstliPos &amp;gt;= 0)&lt;br /&gt;
        {            &lt;br /&gt;
            spkrLan = llList2String(agentsInTranslation, lstliPos + 1);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            spkrLan = addNewAgent(id);&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        if (spkrLan == &amp;quot;xx&amp;quot;) return;  //Agent Opt-Out&lt;br /&gt;
 &lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;1, 1, 0&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
        //===============================&lt;br /&gt;
        //Formulate Translation Requests&lt;br /&gt;
        //===============================&lt;br /&gt;
        for (w = 0; w &amp;lt; llGetListLength(agentsInTranslation); w += 4)&lt;br /&gt;
        {&lt;br /&gt;
            //Loop through translation group and do appropriate translations as needed&lt;br /&gt;
            recepID = llList2Integer(agentsInTranslation, w + 3);&lt;br /&gt;
            recepLan =  checkLanguage(llList2Key(agentsInTranslation, w + 1)); &lt;br /&gt;
            if ((spkrLan != recepLan) &amp;amp;&amp;amp; (recepLan != &amp;quot;&amp;quot;) &amp;amp;&amp;amp; (recepLan != &amp;quot;xx&amp;quot;))&lt;br /&gt;
            {&lt;br /&gt;
                lanpair = spkrLan + &amp;quot;|&amp;quot; + recepLan;&lt;br /&gt;
 &lt;br /&gt;
                lstliPos = llListFindList(translationCache, [lanpair]);&lt;br /&gt;
                if (lstliPos &amp;lt; 0)&lt;br /&gt;
                {&lt;br /&gt;
                  translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                  translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + &amp;quot;@&amp;quot; + (string)recepID], lstliPos + 1, lstliPos + 1);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        //Process Requests&lt;br /&gt;
        if (llGetListLength(translationCache) &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            for (w = 0; w &amp;lt; llGetListLength(translationCache); w += 2)&lt;br /&gt;
            {&lt;br /&gt;
                //====================================&lt;br /&gt;
                //Translation&lt;br /&gt;
                //====================================&lt;br /&gt;
                //Forumulate and Send Translation Request&lt;br /&gt;
                lanpair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, w), [&amp;quot;|&amp;quot;],[]), 1); &lt;br /&gt;
                checkThrottle(0, llEscapeURL(message) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, w + 1), llList2String(translationCache, w)]);&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
            spkrLan = &amp;quot;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
        //====================================&lt;br /&gt;
        //Language Detection&lt;br /&gt;
        //====================================&lt;br /&gt;
        if (llGetAgentSize(id) != ZERO_VECTOR) //llList2Key(llGetObjectDetails(id, [OBJECT_CREATOR]), 0) == NULL_KEY)&lt;br /&gt;
        {&lt;br /&gt;
            if (((spkrLan == &amp;quot;&amp;quot;) || (llList2Integer(agentsInTranslation, llListFindList(agentsInTranslation, [id]) + 2) == TRUE)) || (isMaster == 2))&lt;br /&gt;
            {&lt;br /&gt;
                //Forumulate and Send Language Detect Request&lt;br /&gt;
                checkThrottle(1, llEscapeURL(message), [llGetTime(), id]);&lt;br /&gt;
            }       &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
    {&lt;br /&gt;
        string  htttmpStr;&lt;br /&gt;
 &lt;br /&gt;
        if (status != 200) &lt;br /&gt;
        {&lt;br /&gt;
            //llOwnerSay(&amp;quot;WWW Error:&amp;quot; + (string)status);&lt;br /&gt;
            llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;1, 0, 0&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
            //llOwnerSay(body);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        //Process Resonse Code&lt;br /&gt;
        htttmpStr = llGetSubString(body, llSubStringIndex(body, &amp;quot;\&amp;quot;responseStatus\&amp;quot;:&amp;quot;), -1);&lt;br /&gt;
        status = (integer)llGetSubString(htttmpStr, 17, llSubStringIndex(htttmpStr, &amp;quot;}&amp;quot;) - 1);&lt;br /&gt;
        if (status != 200)&lt;br /&gt;
        {&lt;br /&gt;
            //llOwnerSay(&amp;quot;Language Server Returned Error Code: &amp;quot; + (string)status);&lt;br /&gt;
            //llOwnerSay(body);&lt;br /&gt;
            llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;1, 0, 0&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0, 0, 1&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
        llMessageLinked(LINK_THIS, 345149624, body, request_id);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(0.0);  // timer reset&lt;br /&gt;
        integer r;&lt;br /&gt;
        string  tmrtmpStr;&lt;br /&gt;
        list    tmrnewli;&lt;br /&gt;
        integer translatorCount = llGetListLength(translators)/2;&lt;br /&gt;
 &lt;br /&gt;
        if (isInitialized == FALSE)&lt;br /&gt;
        {&lt;br /&gt;
            enabled = TRUE;&lt;br /&gt;
            listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); &lt;br /&gt;
            llListen(777, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
            llMessageLinked(LINK_THIS, 6877259, (string)enabled, NULL_KEY);&lt;br /&gt;
            isInitialized = TRUE;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        llMessageLinked(LINK_THIS, 94558323, llList2CSV(agentsInTranslation), &amp;quot;&amp;quot;);&lt;br /&gt;
        if (isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            for (r = 0; r &amp;lt; llGetListLength(agentsInTranslation); r += 4)&lt;br /&gt;
            {&lt;br /&gt;
                tmrtmpStr = llList2String(llGetObjectDetails(llList2Key(agentsInTranslation, r), [OBJECT_POS]), 0);&lt;br /&gt;
                if ((llVecDist(llGetPos(), (vector)tmrtmpStr) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tmrtmpStr != &amp;quot;&amp;quot;))&lt;br /&gt;
                {&lt;br /&gt;
                    tmrnewli = (tmrnewli=[]) + tmrnewli + llList2List(agentsInTranslation, r, r + 3);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
            agentsInTranslation = tmrnewli;&lt;br /&gt;
            if ((llGetUnixTime() - lastHeartBeat) &amp;gt;= 5)&lt;br /&gt;
            {&lt;br /&gt;
                //Send heartbeat&lt;br /&gt;
                sendHeartbeat();&lt;br /&gt;
                lastHeartBeat = llGetUnixTime();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            if ((llGetUnixTime() - lastHeartBeat) &amp;gt;= `0 + llGetListLength(agentsInTranslation)*2 + llPow(translatorCount, 1.4) + translatorCount + ((1-llGetRegionTimeDilation()) * 5))&lt;br /&gt;
            {&lt;br /&gt;
                //Send heartbeat&lt;br /&gt;
                sendHeartbeat();&lt;br /&gt;
                lastHeartBeat = llGetUnixTime();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        //turn on and off scanner&lt;br /&gt;
        if ((autoLanguage) &amp;amp;&amp;amp; isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            llSensor(&amp;quot;&amp;quot;, NULL_KEY, AGENT, 20.0, PI);&lt;br /&gt;
        }&lt;br /&gt;
        llSetTimerEvent(4.0); // restart timer&lt;br /&gt;
        //llSetTimerEvent(4 + ((1-llGetRegionTimeDilation()) * 5));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=686592</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=686592"/>
		<updated>2009-12-14T14:54:14Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: /* THE CODE BELOW IS NOT TESTED */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribucion al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente codigo fué originalmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mi manera...&lt;br /&gt;
No os riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== THE CODE BELOW IS NOT TESTED ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//txTxtLot() = sendTextBatch()&lt;br /&gt;
txTxtLot(integer txch, string txtxt) &lt;br /&gt;
{&lt;br /&gt;
    txtxt = llXorBase64StringsCorrect(llStringToBase64(txtxt), llStringToBase64(password));&lt;br /&gt;
    while (llStringLength(txtxt) &amp;gt; 508) //If string is 509 characters or longer &lt;br /&gt;
    {&lt;br /&gt;
        llSay(txch, llGetSubString(txtxt, 0, 507)); //send 508 character chunk&lt;br /&gt;
        txtxt = llGetSubString(txtxt, 508, -1);  //delete 508 character chunk&lt;br /&gt;
    }&lt;br /&gt;
    llSay(txch, txtxt);  //send out any remainder chunk or original chunk&lt;br /&gt;
    //Perry Mizin Comment: I don´t understand the aim of the following if.    &lt;br /&gt;
    //Hank Ramos Comment: this line serves to &amp;quot;trigger&amp;quot; the receiver not to wait for another batch.  If the&lt;br /&gt;
    //message length is exactly 508 characters, the receiver things that another chunk of the message is coming.&lt;br /&gt;
    //This message serves to tell the receiver that the last chunk was the last chunk, not another regular chunk.&lt;br /&gt;
    if (llStringLength(txtxt) == 508)&lt;br /&gt;
        llSay(txch, (string)(txch*4958654));&lt;br /&gt;
    //Hank Ramos Comment: this just flashes the color of the bottom prim to show a message was sent&lt;br /&gt;
    llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0, 0.25&amp;gt;, &amp;quot;&amp;quot;); &lt;br /&gt;
}  &lt;br /&gt;
//string rxTxtLot() = string receiveTextBatch()&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer rxliPos;&lt;br /&gt;
    string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
    {&lt;br /&gt;
        rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
        rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
        sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
    rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
    return rxmsg;&lt;br /&gt;
}&lt;br /&gt;
//string rxTxtLot() = string receiveTextBatch() (Another way)&lt;br /&gt;
integer rxTxtLotBusy = FALSE; //Perry Mizin: added Busy Mode, this could fail or prevent fail&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    if (rxTxtLotBusy == FALSE)&lt;br /&gt;
    {&lt;br /&gt;
        rxTxtLotBusy = TRUE;&lt;br /&gt;
        integer rxliPos;&lt;br /&gt;
        string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
        if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
        {&lt;br /&gt;
            @rxin;&lt;br /&gt;
            rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
            rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
            sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
            if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
            {&lt;br /&gt;
                 jump rxin;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
        rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
        rxTxtLotBusy = FALSE;&lt;br /&gt;
        return rxmsg;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        //Perry Mizin: llSaySomething?&lt;br /&gt;
        return &amp;quot;&amp;quot;;        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string rxTxtLotPrv() = string receiveTextBatchPrivate()&lt;br /&gt;
string rxTxtLotPrv(key prxid, string prxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer prxliPos;&lt;br /&gt;
    string  prxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCachePrivate, (list)prxid))&lt;br /&gt;
    {&lt;br /&gt;
        prxliPos = llListFindList(sayCachePrivate, [prxid]);&lt;br /&gt;
        prxtmpStr = (prxtmpStr=&amp;quot;&amp;quot;) + prxtmpStr + llList2String(sayCachePrivate, prxliPos + 1);&lt;br /&gt;
        sayCachePrivate = llDeleteSubList(sayCachePrivate, prxliPos, prxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    prxmsg = prxtmpStr + prxmsg;&lt;br /&gt;
    prxmsg = llBase64ToString(llXorBase64StringsCorrect(prxmsg, llStringToBase64(password)));&lt;br /&gt;
    return prxmsg;&lt;br /&gt;
}&lt;br /&gt;
//updateTranslatorList()&lt;br /&gt;
updateTranslatorList()&lt;br /&gt;
{&lt;br /&gt;
    integer nx;&lt;br /&gt;
    integer xliLng;&lt;br /&gt;
    list    newList;&lt;br /&gt;
    string  tmpStrPos;&lt;br /&gt;
    integer newMaster;&lt;br /&gt;
    //Scan and remove translators not in the area&lt;br /&gt;
    xliLng = llGetListLength(translators);&lt;br /&gt;
    for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
    {&lt;br /&gt;
        tmpStrPos = llList2String(llGetObjectDetails(llList2Key(translators, nx + 1), [OBJECT_POS]), 0);&lt;br /&gt;
        if ((llVecDist(llGetPos(), (vector)tmpStrPos) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tmpStrPos != &amp;quot;&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            newList = (newList=[]) + newList +  llList2List(translators, nx, nx + 1);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    translators = newList;&lt;br /&gt;
    //llMessageLinked(LINK_THIS,65635544,(string)xliLng,&amp;quot;&amp;quot;); Perry Mizin: what is this necesary for?&lt;br /&gt;
    if (translators == [])&lt;br /&gt;
    {&lt;br /&gt;
        newMaster = 1;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        if (enabled)&lt;br /&gt;
        {&lt;br /&gt;
            xliLng = llGetListLength(translators);&lt;br /&gt;
            newMaster = 2;&lt;br /&gt;
            for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
            {&lt;br /&gt;
                //llOwnerSay(&amp;quot;Checking Priority Number(&amp;quot; +  (string)priorityNumber + &amp;quot;): &amp;quot; + (string)llList2Integer(translators, x));&lt;br /&gt;
                if (llList2Integer(translators, nx) &amp;gt; priorityNumber)&lt;br /&gt;
                {&lt;br /&gt;
                    newMaster = 0;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            newMaster = 0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster &amp;gt; 0) &amp;amp;&amp;amp; (newMaster == 0))&lt;br /&gt;
    {&lt;br /&gt;
        //We are being demoted from master to slave&lt;br /&gt;
        //Flush agentsInTranslation to master&lt;br /&gt;
        if (agentsInTranslation != [])&lt;br /&gt;
        {&lt;br /&gt;
            //Demotion Dump of agentsInTranslation to Master&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1003, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
            if (isInitialized == FALSE)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1004, options])); //error&lt;br /&gt;
        }&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster == 0) &amp;amp;&amp;amp; (newMaster &amp;gt; 0))&lt;br /&gt;
    {&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
        listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); &lt;br /&gt;
    }&lt;br /&gt;
    isMaster = newMaster;&lt;br /&gt;
    llMessageLinked(LINK_THIS, 34829304, (string)isMaster, &amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
//sendHeartbeat()&lt;br /&gt;
sendHeartbeat()&lt;br /&gt;
{&lt;br /&gt;
    updateTranslatorList();&lt;br /&gt;
    txTxtLot(broadcastChannel, llList2CSV([1001, priorityNumber]));&lt;br /&gt;
    //Broadcast agentList to Slaves&lt;br /&gt;
    if (isMaster == 2)&lt;br /&gt;
    {&lt;br /&gt;
        txTxtLot(broadcastChannel, llList2CSV([1002, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string checkLanguage()&lt;br /&gt;
string checkLanguage(string tempString)&lt;br /&gt;
{&lt;br /&gt;
    if (llGetSubString(tempString, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        tempString = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else if (tempString == &amp;quot;und&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        tempString = &amp;quot;el&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if (~llListFindList(languageCodes, [tempString]))&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
    } else {&lt;br /&gt;
        tempString = &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    tempString = llGetSubString(tempString, 0, 1);&lt;br /&gt;
    return tempString;&lt;br /&gt;
}&lt;br /&gt;
//addAgent()&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
    integer avliPos;&lt;br /&gt;
    integer idNum;&lt;br /&gt;
    if (~llListFindList(agentsInTranslation, (list)avid))&lt;br /&gt;
    {&lt;br /&gt;
        avliPos = llListFindList(agentsInTranslation, [avid]);&lt;br /&gt;
        agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, chklan], avliPos + 1, avliPos + 2);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        @at;&lt;br /&gt;
        idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
        if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
        {//it exists       &lt;br /&gt;
            jump at;&lt;br /&gt;
        }&lt;br /&gt;
        agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, chklan, idNum];&lt;br /&gt;
        llMessageLinked(LINK_THIS, 64562349, avlan, avid);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string addNewAgent()&lt;br /&gt;
string addNewAgent(key id)&lt;br /&gt;
{&lt;br /&gt;
    string speakerLanguage;&lt;br /&gt;
 &lt;br /&gt;
    if (llGetAgentSize(id) != ZERO_VECTOR)&lt;br /&gt;
    {&lt;br /&gt;
        speakerLanguage  = checkLanguage(llGetAgentLanguage(id));&lt;br /&gt;
        if (speakerLanguage == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerLanguage = &amp;quot;en&amp;quot;;&lt;br /&gt;
            addAgent(id, speakerLanguage, TRUE);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            addAgent(id, speakerLanguage, FALSE);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return speakerLanguage;&lt;br /&gt;
}&lt;br /&gt;
//key getAgentKey()&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
    if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
    {&lt;br /&gt;
        integer gklistPos = llListFindList(agentsInTranslation, [agentID]);&lt;br /&gt;
        return llList2Key(agentsInTranslation, gklistPos - 3);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//processHTTPResponse()&lt;br /&gt;
processHTTPResponse(integer ntype, string bodyStr, list paramsli)&lt;br /&gt;
{&lt;br /&gt;
    integer spkliPos;&lt;br /&gt;
    list    recepientList;&lt;br /&gt;
    key     recepientID;&lt;br /&gt;
    string  recepientLanguage;&lt;br /&gt;
    string  languagePair;&lt;br /&gt;
    key     speakerID;&lt;br /&gt;
    string  speakerName;&lt;br /&gt;
    string  speakerLanguage;&lt;br /&gt;
    string  translatedText;&lt;br /&gt;
    string  lantmpStr;&lt;br /&gt;
    integer z;&lt;br /&gt;
    integer speakerLanguageReliable;&lt;br /&gt;
    float   speakerLanguageConfidence;&lt;br /&gt;
    list    paramtmpli;&lt;br /&gt;
 &lt;br /&gt;
    //===================&lt;br /&gt;
    //Process Translation&lt;br /&gt;
    //===================&lt;br /&gt;
    if (ntype == 0)&lt;br /&gt;
    {&lt;br /&gt;
        speakerID  = llList2Key(paramsli, 1);&lt;br /&gt;
        speakerName = llKey2Name(speakerID);&lt;br /&gt;
        if (speakerName == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
        }&lt;br /&gt;
        recepientList = llParseString2List(llList2String(paramsli, 2), [&amp;quot;@&amp;quot;], []);&lt;br /&gt;
        paramtmpli = llParseStringKeepNulls(llList2String(paramsli, 3), [&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
        recepientLanguage = llList2String(paramtmpli, 1);&lt;br /&gt;
        languagePair = llDumpList2String(paramtmpli, &amp;quot;&amp;gt;&amp;gt;&amp;quot;); &lt;br /&gt;
 &lt;br /&gt;
        //Perform Text Cleanup&lt;br /&gt;
        z = llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;detectedSourceLanguage\&amp;quot;:\&amp;quot;&amp;quot;); &lt;br /&gt;
        if (z != -1)&lt;br /&gt;
        {&lt;br /&gt;
            translatedText  = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, z);&lt;br /&gt;
            speakerLanguage = checkLanguage(llGetSubString(bodyStr, z + 28, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;}, \&amp;quot;responseDetails\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
            spkliPos = llListFindList(agentsInTranslation, [speakerID]);&lt;br /&gt;
            if (spkliPos &amp;gt;= 0)&lt;br /&gt;
            {&lt;br /&gt;
                if (speakerLanguage != llList2String(agentsInTranslation, spkliPos + 1))&lt;br /&gt;
                {&lt;br /&gt;
                    agentsInTranslation = llListReplaceList(agentsInTranslation, [TRUE], spkliPos + 2, spkliPos + 2);  //Mark for recheck of actual spoken language.&lt;br /&gt;
                }&lt;br /&gt;
            }                   &lt;br /&gt;
        }&lt;br /&gt;
        else if (z == -1)&lt;br /&gt;
        {&lt;br /&gt;
            translatedText = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;}, \&amp;quot;responseDetails\&amp;quot;&amp;quot;));&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        //Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
        if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            lantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
            //Perry Mizin Comment: Probably I guess this is wrong, maybe I am wrong&lt;br /&gt;
            //Perry Mizin Comment: alternative reverse order: &amp;quot;Hello World&amp;quot; could be &amp;quot;World Hello&amp;quot;&lt;br /&gt;
            //Perry Mizin Comment: reverse order: &amp;quot;Hello World&amp;quot; is &amp;quot;dlroW olleH&amp;quot;&lt;br /&gt;
            for(z = llStringLength(translatedText);z &amp;gt;= 0; z--)&lt;br /&gt;
            {&lt;br /&gt;
                lantmpStr = (lantmpStr=&amp;quot;&amp;quot;) + lantmpStr + llGetSubString(translatedText, z, z); &lt;br /&gt;
            }&lt;br /&gt;
            translatedText = lantmpStr;&lt;br /&gt;
        }   &lt;br /&gt;
        lantmpStr = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
        if (showTranslation)&lt;br /&gt;
        {&lt;br /&gt;
            sendIM(speakerID, lantmpStr);&lt;br /&gt;
        } &lt;br /&gt;
        for (z = 0; z &amp;lt; llGetListLength(recepientList); z += 1)&lt;br /&gt;
        {&lt;br /&gt;
            recepientID = getAgentKey(llList2Integer(recepientList, z));&lt;br /&gt;
            if (recepientID != &amp;quot;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, [recepientID]) + 1);&lt;br /&gt;
                if (recepientLanguage != speakerLanguage)&lt;br /&gt;
                {&lt;br /&gt;
                    sendIM(recepientID, lantmpStr);&lt;br /&gt;
                }&lt;br /&gt;
            }  &lt;br /&gt;
        }&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    //===========================&lt;br /&gt;
    //Process Language Detection&lt;br /&gt;
    //===========================&lt;br /&gt;
    if (ntype == 1)&lt;br /&gt;
    {&lt;br /&gt;
        speakerID = llList2Key(paramsli, 1);&lt;br /&gt;
        speakerLanguageReliable = llToLower(llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) + 15, llSubStringIndex(bodyStr, &amp;quot;,\&amp;quot;confidence\&amp;quot;:&amp;quot;) - 1)) == &amp;quot;true&amp;quot;;&lt;br /&gt;
        speakerLanguageConfidence = (float)llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;,\&amp;quot;confidence\&amp;quot;:&amp;quot;) + 14, llSubStringIndex(bodyStr, &amp;quot;}, \&amp;quot;responseDetails\&amp;quot;:&amp;quot;) - 1);&lt;br /&gt;
&lt;br /&gt;
        spkliPos = llListFindList(agentsInTranslation, [speakerID]);&lt;br /&gt;
        if (((spkliPos &amp;lt; 0) &amp;amp;&amp;amp; (speakerLanguageReliable) || (speakerLanguageConfidence &amp;gt;= 0.08)))&lt;br /&gt;
        {&lt;br /&gt;
            //Analyze Data&lt;br /&gt;
            lantmpStr = checkLanguage(llToLower(llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1)));&lt;br /&gt;
            if (lantmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            } &lt;br /&gt;
            if (speakerLanguageConfidence &amp;lt; 0.14)&lt;br /&gt;
            {&lt;br /&gt;
                addAgent(speakerID, lantmpStr, TRUE);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                addAgent(speakerID, lantmpStr, FALSE);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=686582</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=686582"/>
		<updated>2009-12-14T14:51:10Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: /* THE CODE BELOW IS NOT TESTED */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribucion al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente codigo fué originalmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mi manera...&lt;br /&gt;
No os riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== THE CODE BELOW IS NOT TESTED ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//txTxtLot() = sendTextBatch()&lt;br /&gt;
txTxtLot(integer txch, string txtxt) &lt;br /&gt;
{&lt;br /&gt;
    txtxt = llXorBase64StringsCorrect(llStringToBase64(txtxt), llStringToBase64(password));&lt;br /&gt;
    while (llStringLength(txtxt) &amp;gt; 508) //If string is 509 characters or longer &lt;br /&gt;
    {&lt;br /&gt;
        llSay(txch, llGetSubString(txtxt, 0, 507)); //send 508 character chunk&lt;br /&gt;
        txtxt = llGetSubString(txtxt, 508, -1);  //delete 508 character chunk&lt;br /&gt;
    }&lt;br /&gt;
    llSay(txch, txtxt);  //send out any remainder chunk or original chunk&lt;br /&gt;
    //Perry Mizin Comment: I don´t understand the aim of the following if.    &lt;br /&gt;
    //Hank Ramos Comment: this line serves to &amp;quot;trigger&amp;quot; the receiver not to wait for another batch.  If the&lt;br /&gt;
    //message length is exactly 508 characters, the receiver things that another chunk of the message is coming.&lt;br /&gt;
    //This message serves to tell the receiver that the last chunk was the last chunk, not another regular chunk.&lt;br /&gt;
    if (llStringLength(txtxt) == 508)&lt;br /&gt;
        llSay(txch, (string)(txch*4958654));&lt;br /&gt;
    //Hank Ramos Comment: this just flashes the color of the bottom prim to show a message was sent&lt;br /&gt;
    llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0, 0.25&amp;gt;, &amp;quot;&amp;quot;); &lt;br /&gt;
}  &lt;br /&gt;
//string rxTxtLot() = string receiveTextBatch()&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer rxliPos;&lt;br /&gt;
    string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
    {&lt;br /&gt;
        rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
        rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
        sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
    rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
    return rxmsg;&lt;br /&gt;
}&lt;br /&gt;
//string rxTxtLot() = string receiveTextBatch() (Another way)&lt;br /&gt;
integer rxTxtLotBusy = FALSE; //Perry Mizin: added Busy Mode, this could fail or prevent fail&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    if (rxTxtLotBusy == FALSE)&lt;br /&gt;
    {&lt;br /&gt;
        rxTxtLotBusy = TRUE;&lt;br /&gt;
        integer rxliPos;&lt;br /&gt;
        string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
        if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
        {&lt;br /&gt;
            @rxin;&lt;br /&gt;
            rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
            rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
            sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
            if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
            {&lt;br /&gt;
                 jump rxin;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
        rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
        rxTxtLotBusy = FALSE;&lt;br /&gt;
        return rxmsg;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        //Perry Mizin: llSaySomething?&lt;br /&gt;
        return &amp;quot;&amp;quot;;        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string rxTxtLotPrv() = string receiveTextBatchPrivate()&lt;br /&gt;
string rxTxtLotPrv(key prxid, string prxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer prxliPos;&lt;br /&gt;
    string  prxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCachePrivate, (list)prxid))&lt;br /&gt;
    {&lt;br /&gt;
        prxliPos = llListFindList(sayCachePrivate, [prxid]);&lt;br /&gt;
        prxtmpStr = (prxtmpStr=&amp;quot;&amp;quot;) + prxtmpStr + llList2String(sayCachePrivate, prxliPos + 1);&lt;br /&gt;
        sayCachePrivate = llDeleteSubList(sayCachePrivate, prxliPos, prxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    prxmsg = prxtmpStr + prxmsg;&lt;br /&gt;
    prxmsg = llBase64ToString(llXorBase64StringsCorrect(prxmsg, llStringToBase64(password)));&lt;br /&gt;
    return prxmsg;&lt;br /&gt;
}&lt;br /&gt;
//updateTranslatorList()&lt;br /&gt;
updateTranslatorList()&lt;br /&gt;
{&lt;br /&gt;
    integer nx;&lt;br /&gt;
    integer xliLng;&lt;br /&gt;
    list    newList;&lt;br /&gt;
    string  tmpStrPos;&lt;br /&gt;
    integer newMaster;&lt;br /&gt;
    //Scan and remove translators not in the area&lt;br /&gt;
    xliLng = llGetListLength(translators);&lt;br /&gt;
    for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
    {&lt;br /&gt;
        tmpStrPos = llList2String(llGetObjectDetails(llList2Key(translators, nx + 1), [OBJECT_POS]), 0);&lt;br /&gt;
        if ((llVecDist(llGetPos(), (vector)tmpStrPos) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tmpStrPos != &amp;quot;&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            newList = (newList=[]) + newList +  llList2List(translators, nx, nx + 1);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    translators = newList;&lt;br /&gt;
//    llMessageLinked(LINK_THIS, 65635544, (string)xliLng, &amp;quot;&amp;quot;); //Perry Mizin: what is this necesary for?&lt;br /&gt;
    if (translators == [])&lt;br /&gt;
    {&lt;br /&gt;
        newMaster = 1;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        if (enabled)&lt;br /&gt;
        {&lt;br /&gt;
            xliLng = llGetListLength(translators);&lt;br /&gt;
            newMaster = 2;&lt;br /&gt;
            for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
            {&lt;br /&gt;
                //llOwnerSay(&amp;quot;Checking Priority Number(&amp;quot; +  (string)priorityNumber + &amp;quot;): &amp;quot; + (string)llList2Integer(translators, x));&lt;br /&gt;
                if (llList2Integer(translators, nx) &amp;gt; priorityNumber)&lt;br /&gt;
                {&lt;br /&gt;
                    newMaster = 0;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            newMaster = 0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster &amp;gt; 0) &amp;amp;&amp;amp; (newMaster == 0))&lt;br /&gt;
    {&lt;br /&gt;
        //We are being demoted from master to slave&lt;br /&gt;
        //Flush agentsInTranslation to master&lt;br /&gt;
        if (agentsInTranslation != [])&lt;br /&gt;
        {&lt;br /&gt;
            //Demotion Dump of agentsInTranslation to Master&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1003, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
            if (isInitialized == FALSE)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1004, options])); //error&lt;br /&gt;
        }&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster == 0) &amp;amp;&amp;amp; (newMaster &amp;gt; 0))&lt;br /&gt;
    {&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
        listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); &lt;br /&gt;
    }&lt;br /&gt;
    isMaster = newMaster;&lt;br /&gt;
    llMessageLinked(LINK_THIS, 34829304, (string)isMaster, &amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
//sendHeartbeat()&lt;br /&gt;
sendHeartbeat()&lt;br /&gt;
{&lt;br /&gt;
    updateTranslatorList();&lt;br /&gt;
    txTxtLot(broadcastChannel, llList2CSV([1001, priorityNumber]));&lt;br /&gt;
    //Broadcast agentList to Slaves&lt;br /&gt;
    if (isMaster == 2)&lt;br /&gt;
    {&lt;br /&gt;
        txTxtLot(broadcastChannel, llList2CSV([1002, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string checkLanguage()&lt;br /&gt;
string checkLanguage(string tempString)&lt;br /&gt;
{&lt;br /&gt;
    if (llGetSubString(tempString, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        tempString = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else if (tempString == &amp;quot;und&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        tempString = &amp;quot;el&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if (~llListFindList(languageCodes, [tempString]))&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
    } else {&lt;br /&gt;
        tempString = &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    tempString = llGetSubString(tempString, 0, 1);&lt;br /&gt;
    return tempString;&lt;br /&gt;
}&lt;br /&gt;
//addAgent()&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
    integer avliPos;&lt;br /&gt;
    integer idNum;&lt;br /&gt;
    if (~llListFindList(agentsInTranslation, (list)avid))&lt;br /&gt;
    {&lt;br /&gt;
        avliPos = llListFindList(agentsInTranslation, [avid]);&lt;br /&gt;
        agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, chklan], avliPos + 1, avliPos + 2);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        @at;&lt;br /&gt;
        idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
        if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
        {//it exists       &lt;br /&gt;
            jump at;&lt;br /&gt;
        }&lt;br /&gt;
        agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, chklan, idNum];&lt;br /&gt;
        llMessageLinked(LINK_THIS, 64562349, avlan, avid);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//string addNewAgent()&lt;br /&gt;
string addNewAgent(key id)&lt;br /&gt;
{&lt;br /&gt;
    string speakerLanguage;&lt;br /&gt;
 &lt;br /&gt;
    if (llGetAgentSize(id) != ZERO_VECTOR)&lt;br /&gt;
    {&lt;br /&gt;
        speakerLanguage  = checkLanguage(llGetAgentLanguage(id));&lt;br /&gt;
        if (speakerLanguage == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerLanguage = &amp;quot;en&amp;quot;;&lt;br /&gt;
            addAgent(id, speakerLanguage, TRUE);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            addAgent(id, speakerLanguage, FALSE);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return speakerLanguage;&lt;br /&gt;
}&lt;br /&gt;
//key getAgentKey()&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
    if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
    {&lt;br /&gt;
        integer gklistPos = llListFindList(agentsInTranslation, [agentID]);&lt;br /&gt;
        return llList2Key(agentsInTranslation, gklistPos - 3);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//processHTTPResponse()&lt;br /&gt;
processHTTPResponse(integer ntype, string bodyStr, list paramsli)&lt;br /&gt;
{&lt;br /&gt;
    integer spkliPos;&lt;br /&gt;
    list    recepientList;&lt;br /&gt;
    key     recepientID;&lt;br /&gt;
    string  recepientLanguage;&lt;br /&gt;
    string  languagePair;&lt;br /&gt;
    key     speakerID;&lt;br /&gt;
    string  speakerName;&lt;br /&gt;
    string  speakerLanguage;&lt;br /&gt;
    string  translatedText;&lt;br /&gt;
    string  lantmpStr;&lt;br /&gt;
    integer z;&lt;br /&gt;
    integer speakerLanguageReliable;&lt;br /&gt;
    float   speakerLanguageConfidence;&lt;br /&gt;
    list    paramtmpli;&lt;br /&gt;
 &lt;br /&gt;
    //===================&lt;br /&gt;
    //Process Translation&lt;br /&gt;
    //===================&lt;br /&gt;
    if (ntype == 0)&lt;br /&gt;
    {&lt;br /&gt;
        speakerID  = llList2Key(paramsli, 1);&lt;br /&gt;
        speakerName = llKey2Name(speakerID);&lt;br /&gt;
        if (speakerName == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
        }&lt;br /&gt;
        recepientList = llParseString2List(llList2String(paramsli, 2), [&amp;quot;@&amp;quot;], []);&lt;br /&gt;
        paramtmpli = llParseStringKeepNulls(llList2String(paramsli, 3), [&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
        recepientLanguage = llList2String(paramtmpli, 1);&lt;br /&gt;
        languagePair = llDumpList2String(paramtmpli, &amp;quot;&amp;gt;&amp;gt;&amp;quot;); &lt;br /&gt;
 &lt;br /&gt;
        //Perform Text Cleanup&lt;br /&gt;
        z = llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;detectedSourceLanguage\&amp;quot;:\&amp;quot;&amp;quot;); &lt;br /&gt;
        if (z != -1)&lt;br /&gt;
        {&lt;br /&gt;
            translatedText  = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, z);&lt;br /&gt;
            speakerLanguage = checkLanguage(llGetSubString(bodyStr, z + 28, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;}, \&amp;quot;responseDetails\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
            spkliPos = llListFindList(agentsInTranslation, [speakerID]);&lt;br /&gt;
            if (spkliPos &amp;gt;= 0)&lt;br /&gt;
            {&lt;br /&gt;
                if (speakerLanguage != llList2String(agentsInTranslation, spkliPos + 1))&lt;br /&gt;
                {&lt;br /&gt;
                    agentsInTranslation = llListReplaceList(agentsInTranslation, [TRUE], spkliPos + 2, spkliPos + 2);  //Mark for recheck of actual spoken language.&lt;br /&gt;
                }&lt;br /&gt;
            }                   &lt;br /&gt;
        }&lt;br /&gt;
        else if (z == -1)&lt;br /&gt;
        {&lt;br /&gt;
            translatedText = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;}, \&amp;quot;responseDetails\&amp;quot;&amp;quot;));&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        //Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
        if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            lantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
            //Perry Mizin Comment: Maybe I guess this wrong, maybe I am wrong&lt;br /&gt;
            //Perry Mizin Comment: alternative reverse order: &amp;quot;Hello World&amp;quot; could be &amp;quot;World Hello&amp;quot;&lt;br /&gt;
            //Perry Mizin Comment: reverse order: &amp;quot;Hello World&amp;quot; is &amp;quot;dlroW olleH&amp;quot;&lt;br /&gt;
            for(z = llStringLength(translatedText);z &amp;gt;= 0; z--)&lt;br /&gt;
            {&lt;br /&gt;
                lantmpStr = (lantmpStr=&amp;quot;&amp;quot;) + lantmpStr + llGetSubString(translatedText, z, z); &lt;br /&gt;
            }&lt;br /&gt;
            translatedText = lantmpStr;&lt;br /&gt;
        }   &lt;br /&gt;
        lantmpStr = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
        if (showTranslation)&lt;br /&gt;
        {&lt;br /&gt;
            sendIM(speakerID, lantmpStr);&lt;br /&gt;
        } &lt;br /&gt;
        for (z = 0; z &amp;lt; llGetListLength(recepientList); z += 1)&lt;br /&gt;
        {&lt;br /&gt;
            recepientID = getAgentKey(llList2Integer(recepientList, z));&lt;br /&gt;
            if (recepientID != &amp;quot;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, [recepientID]) + 1);&lt;br /&gt;
                if (recepientLanguage != speakerLanguage)&lt;br /&gt;
                {&lt;br /&gt;
                    sendIM(recepientID, lantmpStr);&lt;br /&gt;
                }&lt;br /&gt;
            }  &lt;br /&gt;
        }&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    //===========================&lt;br /&gt;
    //Process Language Detection&lt;br /&gt;
    //===========================&lt;br /&gt;
    if (ntype == 1)&lt;br /&gt;
    {&lt;br /&gt;
        speakerID = llList2Key(paramsli, 1);&lt;br /&gt;
        speakerLanguageReliable = llToLower(llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) + 15, llSubStringIndex(bodyStr, &amp;quot;,\&amp;quot;confidence\&amp;quot;:&amp;quot;) - 1)) == &amp;quot;true&amp;quot;;&lt;br /&gt;
        speakerLanguageConfidence = (float)llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;,\&amp;quot;confidence\&amp;quot;:&amp;quot;) + 14, llSubStringIndex(bodyStr, &amp;quot;}, \&amp;quot;responseDetails\&amp;quot;:&amp;quot;) - 1);&lt;br /&gt;
&lt;br /&gt;
        spkliPos = llListFindList(agentsInTranslation, [speakerID]);&lt;br /&gt;
        if (((spkliPos &amp;lt; 0) &amp;amp;&amp;amp; (speakerLanguageReliable) || (speakerLanguageConfidence &amp;gt;= 0.08)))&lt;br /&gt;
        {&lt;br /&gt;
            //Analyze Data&lt;br /&gt;
            lantmpStr = checkLanguage(llToLower(llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1)));&lt;br /&gt;
            if (lantmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            } &lt;br /&gt;
            if (speakerLanguageConfidence &amp;lt; 0.14)&lt;br /&gt;
            {&lt;br /&gt;
                addAgent(speakerID, lantmpStr, TRUE);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                addAgent(speakerID, lantmpStr, FALSE);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=686562</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=686562"/>
		<updated>2009-12-14T14:48:29Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: /* THE CODE BELOW IS NOT TESTED */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribucion al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente codigo fué originalmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mi manera...&lt;br /&gt;
No os riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== THE CODE BELOW IS NOT TESTED ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//txTxtLot() = sendTextBatch()&lt;br /&gt;
&lt;br /&gt;
txTxtLot(integer txch, string txtxt) &lt;br /&gt;
{&lt;br /&gt;
    txtxt = llXorBase64StringsCorrect(llStringToBase64(txtxt), llStringToBase64(password));&lt;br /&gt;
    while (llStringLength(txtxt) &amp;gt; 508) //If string is 509 characters or longer &lt;br /&gt;
    {&lt;br /&gt;
        llSay(txch, llGetSubString(txtxt, 0, 507)); //send 508 character chunk&lt;br /&gt;
        txtxt = llGetSubString(txtxt, 508, -1);  //delete 508 character chunk&lt;br /&gt;
    }&lt;br /&gt;
    llSay(txch, txtxt);  //send out any remainder chunk or original chunk&lt;br /&gt;
    //Perry Mizin Comment: I don´t understand the aim of the following if.    &lt;br /&gt;
    //Hank Ramos Comment: this line serves to &amp;quot;trigger&amp;quot; the receiver not to wait for another batch.  If the&lt;br /&gt;
    //message length is exactly 508 characters, the receiver things that another chunk of the message is coming.&lt;br /&gt;
    //This message serves to tell the receiver that the last chunk was the last chunk, not another regular chunk.&lt;br /&gt;
    if (llStringLength(txtxt) == 508)&lt;br /&gt;
        llSay(txch, (string)(txch*4958654));&lt;br /&gt;
    //Hank Ramos Comment: this just flashes the color of the bottom prim to show a message was sent&lt;br /&gt;
    llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0, 0.25&amp;gt;, &amp;quot;&amp;quot;); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
//string rxTxtLot() = string receiveTextBatch()&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer rxliPos;&lt;br /&gt;
    string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
    {&lt;br /&gt;
        rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
        rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
        sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
    rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
    return rxmsg;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
integer rxTxtLotBusy = FALSE; //Perry Mizin: added Busy Mode, this could fail or prevent fail&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    if (rxTxtLotBusy == FALSE)&lt;br /&gt;
    {&lt;br /&gt;
        rxTxtLotBusy = TRUE;&lt;br /&gt;
        integer rxliPos;&lt;br /&gt;
        string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
        if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
        {&lt;br /&gt;
            @rxin;&lt;br /&gt;
            rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
            rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
            sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
            if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
            {&lt;br /&gt;
                 jump rxin;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
        rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
        rxTxtLotBusy = FALSE;&lt;br /&gt;
        return rxmsg;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        //Perry Mizin: llSaySomething?&lt;br /&gt;
        return &amp;quot;&amp;quot;;        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
//string rxTxtLotPrv() = string receiveTextBatchPrivate()&lt;br /&gt;
string rxTxtLotPrv(key prxid, string prxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer prxliPos;&lt;br /&gt;
    string  prxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCachePrivate, (list)prxid))&lt;br /&gt;
    {&lt;br /&gt;
        prxliPos = llListFindList(sayCachePrivate, [prxid]);&lt;br /&gt;
        prxtmpStr = (prxtmpStr=&amp;quot;&amp;quot;) + prxtmpStr + llList2String(sayCachePrivate, prxliPos + 1);&lt;br /&gt;
        sayCachePrivate = llDeleteSubList(sayCachePrivate, prxliPos, prxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    prxmsg = prxtmpStr + prxmsg;&lt;br /&gt;
    prxmsg = llBase64ToString(llXorBase64StringsCorrect(prxmsg, llStringToBase64(password)));&lt;br /&gt;
    return prxmsg;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//updateTranslatorList()&lt;br /&gt;
updateTranslatorList()&lt;br /&gt;
{&lt;br /&gt;
    integer nx;&lt;br /&gt;
    integer xliLng;&lt;br /&gt;
    list    newList;&lt;br /&gt;
    string  tmpStrPos;&lt;br /&gt;
    integer newMaster;&lt;br /&gt;
    //Scan and remove translators not in the area&lt;br /&gt;
    xliLng = llGetListLength(translators);&lt;br /&gt;
    for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
    {&lt;br /&gt;
        tmpStrPos = llList2String(llGetObjectDetails(llList2Key(translators, nx + 1), [OBJECT_POS]), 0);&lt;br /&gt;
        if ((llVecDist(llGetPos(), (vector)tmpStrPos) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tmpStrPos != &amp;quot;&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            newList = (newList=[]) + newList +  llList2List(translators, nx, nx + 1);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    translators = newList;&lt;br /&gt;
//    llMessageLinked(LINK_THIS, 65635544, (string)xliLng, &amp;quot;&amp;quot;); //Perry Mizin: what is this necesary for?&lt;br /&gt;
    if (translators == [])&lt;br /&gt;
    {&lt;br /&gt;
        newMaster = 1;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        if (enabled)&lt;br /&gt;
        {&lt;br /&gt;
            xliLng = llGetListLength(translators);&lt;br /&gt;
            newMaster = 2;&lt;br /&gt;
            for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
            {&lt;br /&gt;
                //llOwnerSay(&amp;quot;Checking Priority Number(&amp;quot; +  (string)priorityNumber + &amp;quot;): &amp;quot; + (string)llList2Integer(translators, x));&lt;br /&gt;
                if (llList2Integer(translators, nx) &amp;gt; priorityNumber)&lt;br /&gt;
                {&lt;br /&gt;
                    newMaster = 0;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            newMaster = 0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster &amp;gt; 0) &amp;amp;&amp;amp; (newMaster == 0))&lt;br /&gt;
    {&lt;br /&gt;
        //We are being demoted from master to slave&lt;br /&gt;
        //Flush agentsInTranslation to master&lt;br /&gt;
        if (agentsInTranslation != [])&lt;br /&gt;
        {&lt;br /&gt;
            //Demotion Dump of agentsInTranslation to Master&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1003, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
            if (isInitialized == FALSE)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1004, options])); //error&lt;br /&gt;
        }&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster == 0) &amp;amp;&amp;amp; (newMaster &amp;gt; 0))&lt;br /&gt;
    {&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
        listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); &lt;br /&gt;
    }&lt;br /&gt;
    isMaster = newMaster;&lt;br /&gt;
    llMessageLinked(LINK_THIS, 34829304, (string)isMaster, &amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//sendHeartbeat()&lt;br /&gt;
sendHeartbeat()&lt;br /&gt;
{&lt;br /&gt;
    updateTranslatorList();&lt;br /&gt;
    txTxtLot(broadcastChannel, llList2CSV([1001, priorityNumber]));&lt;br /&gt;
    //Broadcast agentList to Slaves&lt;br /&gt;
    if (isMaster == 2)&lt;br /&gt;
    {&lt;br /&gt;
        txTxtLot(broadcastChannel, llList2CSV([1002, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//string checkLanguage()&lt;br /&gt;
string checkLanguage(string tempString)&lt;br /&gt;
{&lt;br /&gt;
    if (llGetSubString(tempString, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        tempString = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else if (tempString == &amp;quot;und&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        tempString = &amp;quot;el&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if (~llListFindList(languageCodes, [tempString]))&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
    } else {&lt;br /&gt;
        tempString = &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    tempString = llGetSubString(tempString, 0, 1);&lt;br /&gt;
    return tempString;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//addAgent()&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
    integer avliPos;&lt;br /&gt;
    integer idNum;&lt;br /&gt;
    if (~llListFindList(agentsInTranslation, (list)avid))&lt;br /&gt;
    {&lt;br /&gt;
        avliPos = llListFindList(agentsInTranslation, [avid]);&lt;br /&gt;
        agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, chklan], avliPos + 1, avliPos + 2);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        @at;&lt;br /&gt;
        idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
        if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
        {//it exists       &lt;br /&gt;
            jump at;&lt;br /&gt;
        }&lt;br /&gt;
        agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, chklan, idNum];&lt;br /&gt;
        llMessageLinked(LINK_THIS, 64562349, avlan, avid);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//string addNewAgent()&lt;br /&gt;
string addNewAgent(key id)&lt;br /&gt;
{&lt;br /&gt;
    string speakerLanguage;&lt;br /&gt;
 &lt;br /&gt;
    if (llGetAgentSize(id) != ZERO_VECTOR)&lt;br /&gt;
    {&lt;br /&gt;
        speakerLanguage  = checkLanguage(llGetAgentLanguage(id));&lt;br /&gt;
        if (speakerLanguage == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerLanguage = &amp;quot;en&amp;quot;;&lt;br /&gt;
            addAgent(id, speakerLanguage, TRUE);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            addAgent(id, speakerLanguage, FALSE);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return speakerLanguage;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//key getAgentKey()&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
    if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
    {&lt;br /&gt;
        integer gklistPos = llListFindList(agentsInTranslation, [agentID]);&lt;br /&gt;
        return llList2Key(agentsInTranslation, gklistPos - 3);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//processHTTPResponse()&lt;br /&gt;
processHTTPResponse(integer ntype, string bodyStr, list paramsli)&lt;br /&gt;
{&lt;br /&gt;
    integer spkliPos;&lt;br /&gt;
    list    recepientList;&lt;br /&gt;
    key     recepientID;&lt;br /&gt;
    string  recepientLanguage;&lt;br /&gt;
    string  languagePair;&lt;br /&gt;
    key     speakerID;&lt;br /&gt;
    string  speakerName;&lt;br /&gt;
    string  speakerLanguage;&lt;br /&gt;
    string  translatedText;&lt;br /&gt;
    string  lantmpStr;&lt;br /&gt;
    integer z;&lt;br /&gt;
    integer speakerLanguageReliable;&lt;br /&gt;
    float   speakerLanguageConfidence;&lt;br /&gt;
    list    paramtmpli;&lt;br /&gt;
 &lt;br /&gt;
    //===================&lt;br /&gt;
    //Process Translation&lt;br /&gt;
    //===================&lt;br /&gt;
    if (ntype == 0)&lt;br /&gt;
    {&lt;br /&gt;
        speakerID  = llList2Key(paramsli, 1);&lt;br /&gt;
        speakerName = llKey2Name(speakerID);&lt;br /&gt;
        if (speakerName == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
        }&lt;br /&gt;
        recepientList = llParseString2List(llList2String(paramsli, 2), [&amp;quot;@&amp;quot;], []);&lt;br /&gt;
        paramtmpli = llParseStringKeepNulls(llList2String(paramsli, 3), [&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
        recepientLanguage = llList2String(paramtmpli, 1);&lt;br /&gt;
        languagePair = llDumpList2String(paramtmpli, &amp;quot;&amp;gt;&amp;gt;&amp;quot;); &lt;br /&gt;
 &lt;br /&gt;
        //Perform Text Cleanup&lt;br /&gt;
        z = llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;detectedSourceLanguage\&amp;quot;:\&amp;quot;&amp;quot;); &lt;br /&gt;
        if (z != -1)&lt;br /&gt;
        {&lt;br /&gt;
            translatedText  = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, z);&lt;br /&gt;
            speakerLanguage = checkLanguage(llGetSubString(bodyStr, z + 28, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;}, \&amp;quot;responseDetails\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
            spkliPos = llListFindList(agentsInTranslation, [speakerID]);&lt;br /&gt;
            if (spkliPos &amp;gt;= 0)&lt;br /&gt;
            {&lt;br /&gt;
                if (speakerLanguage != llList2String(agentsInTranslation, spkliPos + 1))&lt;br /&gt;
                {&lt;br /&gt;
                    agentsInTranslation = llListReplaceList(agentsInTranslation, [TRUE], spkliPos + 2, spkliPos + 2);  //Mark for recheck of actual spoken language.&lt;br /&gt;
                }&lt;br /&gt;
            }                   &lt;br /&gt;
        }&lt;br /&gt;
        else if (z == -1)&lt;br /&gt;
        {&lt;br /&gt;
            translatedText = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;}, \&amp;quot;responseDetails\&amp;quot;&amp;quot;));&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        //Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
        if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            lantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
            //Perry Mizin Comment: Maybe I guess this wrong, maybe I am wrong&lt;br /&gt;
            //Perry Mizin Comment: alternative reverse order: &amp;quot;Hello World&amp;quot; could be &amp;quot;World Hello&amp;quot;&lt;br /&gt;
            //Perry Mizin Comment: reverse order: &amp;quot;Hello World&amp;quot; is &amp;quot;dlroW olleH&amp;quot;&lt;br /&gt;
            for(z = llStringLength(translatedText);z &amp;gt;= 0; z--)&lt;br /&gt;
            {&lt;br /&gt;
                lantmpStr = (lantmpStr=&amp;quot;&amp;quot;) + lantmpStr + llGetSubString(translatedText, z, z); &lt;br /&gt;
            }&lt;br /&gt;
            translatedText = lantmpStr;&lt;br /&gt;
        }   &lt;br /&gt;
        lantmpStr = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
        if (showTranslation)&lt;br /&gt;
        {&lt;br /&gt;
            sendIM(speakerID, lantmpStr);&lt;br /&gt;
        } &lt;br /&gt;
        for (z = 0; z &amp;lt; llGetListLength(recepientList); z += 1)&lt;br /&gt;
        {&lt;br /&gt;
            recepientID = getAgentKey(llList2Integer(recepientList, z));&lt;br /&gt;
            if (recepientID != &amp;quot;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, [recepientID]) + 1);&lt;br /&gt;
                if (recepientLanguage != speakerLanguage)&lt;br /&gt;
                {&lt;br /&gt;
                    sendIM(recepientID, lantmpStr);&lt;br /&gt;
                }&lt;br /&gt;
            }  &lt;br /&gt;
        }&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    //===========================&lt;br /&gt;
    //Process Language Detection&lt;br /&gt;
    //===========================&lt;br /&gt;
    if (ntype == 1)&lt;br /&gt;
    {&lt;br /&gt;
        speakerID = llList2Key(paramsli, 1);&lt;br /&gt;
        speakerLanguageReliable = llToLower(llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) + 15, llSubStringIndex(bodyStr, &amp;quot;,\&amp;quot;confidence\&amp;quot;:&amp;quot;) - 1)) == &amp;quot;true&amp;quot;;&lt;br /&gt;
        speakerLanguageConfidence = (float)llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;,\&amp;quot;confidence\&amp;quot;:&amp;quot;) + 14, llSubStringIndex(bodyStr, &amp;quot;}, \&amp;quot;responseDetails\&amp;quot;:&amp;quot;) - 1);&lt;br /&gt;
&lt;br /&gt;
        spkliPos = llListFindList(agentsInTranslation, [speakerID]);&lt;br /&gt;
        if (((spkliPos &amp;lt; 0) &amp;amp;&amp;amp; (speakerLanguageReliable) || (speakerLanguageConfidence &amp;gt;= 0.08)))&lt;br /&gt;
        {&lt;br /&gt;
            //Analyze Data&lt;br /&gt;
            lantmpStr = checkLanguage(llToLower(llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1)));&lt;br /&gt;
            if (lantmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            } &lt;br /&gt;
            if (speakerLanguageConfidence &amp;lt; 0.14)&lt;br /&gt;
            {&lt;br /&gt;
                addAgent(speakerID, lantmpStr, TRUE);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                addAgent(speakerID, lantmpStr, FALSE);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=686543</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=686543"/>
		<updated>2009-12-14T11:54:29Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: /* THE CODE BELOW IS NOT TESTED */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribucion al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente codigo fué originalmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mi manera...&lt;br /&gt;
No os riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== THE CODE BELOW IS NOT TESTED ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;txTxtLot() = sendTextBatch()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
txTxtLot(integer txch, string txtxt) &lt;br /&gt;
{&lt;br /&gt;
    txtxt = llXorBase64StringsCorrect(llStringToBase64(txtxt), llStringToBase64(password));&lt;br /&gt;
    while (llStringLength(txtxt) &amp;gt; 508) //If string is 509 characters or longer &lt;br /&gt;
    {&lt;br /&gt;
        llSay(txch, llGetSubString(txtxt, 0, 507)); //send 508 character chunk&lt;br /&gt;
        txtxt = llGetSubString(txtxt, 508, -1);  //delete 508 character chunk&lt;br /&gt;
    }&lt;br /&gt;
    llSay(txch, txtxt);  //send out any remainder chunk or original chunk&lt;br /&gt;
    //Perry Mizin Comment: I don´t understand the aim of the following if.    &lt;br /&gt;
    //Hank Ramos Comment: this line serves to &amp;quot;trigger&amp;quot; the receiver not to wait for another batch.  If the&lt;br /&gt;
    //message length is exactly 508 characters, the receiver things that another chunk of the message is coming.&lt;br /&gt;
    //This message serves to tell the receiver that the last chunk was the last chunk, not another regular chunk.&lt;br /&gt;
    if (llStringLength(txtxt) == 508)&lt;br /&gt;
        llSay(txch, (string)(txch*4958654));&lt;br /&gt;
    //Hank Ramos Comment: this just flashes the color of the bottom prim to show a message was sent&lt;br /&gt;
    llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0, 0.25&amp;gt;, &amp;quot;&amp;quot;); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
&#039;&#039;&#039;string rxTxtLot() = string receiveTextBatch()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer rxliPos;&lt;br /&gt;
    string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
    {&lt;br /&gt;
        rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
        rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
        sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
    rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
    return rxmsg;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
integer rxTxtLotBusy = FALSE; //Perry Mizin: added Busy Mode, this could fail or prevent fail&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    if (rxTxtLotBusy == FALSE)&lt;br /&gt;
    {&lt;br /&gt;
        rxTxtLotBusy = TRUE;&lt;br /&gt;
        integer rxliPos;&lt;br /&gt;
        string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
        if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
        {&lt;br /&gt;
            @rxin;&lt;br /&gt;
            rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
            rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
            sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
            if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
            {&lt;br /&gt;
                 jump rxin;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
        rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
        rxTxtLotBusy = FALSE;&lt;br /&gt;
        return rxmsg;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        //Perry Mizin: llSaySomething?&lt;br /&gt;
        return &amp;quot;&amp;quot;;        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;string rxTxtLotPrv() = string receiveTextBatchPrivate()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
string rxTxtLotPrv(key prxid, string prxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer prxliPos;&lt;br /&gt;
    string  prxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCachePrivate, (list)prxid))&lt;br /&gt;
    {&lt;br /&gt;
        prxliPos = llListFindList(sayCachePrivate, [prxid]);&lt;br /&gt;
        prxtmpStr = (prxtmpStr=&amp;quot;&amp;quot;) + prxtmpStr + llList2String(sayCachePrivate, prxliPos + 1);&lt;br /&gt;
        sayCachePrivate = llDeleteSubList(sayCachePrivate, prxliPos, prxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    prxmsg = prxtmpStr + prxmsg;&lt;br /&gt;
    prxmsg = llBase64ToString(llXorBase64StringsCorrect(prxmsg, llStringToBase64(password)));&lt;br /&gt;
    return prxmsg;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;updateTranslatorList()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
updateTranslatorList()&lt;br /&gt;
{&lt;br /&gt;
    integer nx;&lt;br /&gt;
    integer xliLng;&lt;br /&gt;
    list    newList;&lt;br /&gt;
    string  tmpStrPos;&lt;br /&gt;
    integer newMaster;&lt;br /&gt;
    //Scan and remove translators not in the area&lt;br /&gt;
    xliLng = llGetListLength(translators);&lt;br /&gt;
    for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
    {&lt;br /&gt;
        tmpStrPos = llList2String(llGetObjectDetails(llList2Key(translators, nx + 1), [OBJECT_POS]), 0);&lt;br /&gt;
        if ((llVecDist(llGetPos(), (vector)tmpStrPos) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tmpStrPos != &amp;quot;&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            newList = (newList=[]) + newList +  llList2List(translators, nx, nx + 1);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    translators = newList;&lt;br /&gt;
//    llMessageLinked(LINK_THIS, 65635544, (string)xliLng, &amp;quot;&amp;quot;); //Perry Mizin: what is this necesary for?&lt;br /&gt;
    if (translators == [])&lt;br /&gt;
    {&lt;br /&gt;
        newMaster = 1;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        if (enabled)&lt;br /&gt;
        {&lt;br /&gt;
            xliLng = llGetListLength(translators);&lt;br /&gt;
            newMaster = 2;&lt;br /&gt;
            for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
            {&lt;br /&gt;
                //llOwnerSay(&amp;quot;Checking Priority Number(&amp;quot; +  (string)priorityNumber + &amp;quot;): &amp;quot; + (string)llList2Integer(translators, x));&lt;br /&gt;
                if (llList2Integer(translators, nx) &amp;gt; priorityNumber)&lt;br /&gt;
                {&lt;br /&gt;
                    newMaster = 0;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            newMaster = 0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster &amp;gt; 0) &amp;amp;&amp;amp; (newMaster == 0))&lt;br /&gt;
    {&lt;br /&gt;
        //We are being demoted from master to slave&lt;br /&gt;
        //Flush agentsInTranslation to master&lt;br /&gt;
        if (agentsInTranslation != [])&lt;br /&gt;
        {&lt;br /&gt;
            //Demotion Dump of agentsInTranslation to Master&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1003, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
            if (isInitialized == FALSE)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1004, options])); //error&lt;br /&gt;
        }&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster == 0) &amp;amp;&amp;amp; (newMaster &amp;gt; 0))&lt;br /&gt;
    {&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
        listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); &lt;br /&gt;
    }&lt;br /&gt;
    isMaster = newMaster;&lt;br /&gt;
    llMessageLinked(LINK_THIS, 34829304, (string)isMaster, &amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;sendHeartbeat()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
sendHeartbeat()&lt;br /&gt;
{&lt;br /&gt;
    updateTranslatorList();&lt;br /&gt;
    txTxtLot(broadcastChannel, llList2CSV([1001, priorityNumber]));&lt;br /&gt;
    //Broadcast agentList to Slaves&lt;br /&gt;
    if (isMaster == 2)&lt;br /&gt;
    {&lt;br /&gt;
        txTxtLot(broadcastChannel, llList2CSV([1002, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;string checkLanguage()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
string checkLanguage(string tempString)&lt;br /&gt;
{&lt;br /&gt;
    if (llGetSubString(tempString, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        tempString = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else if (tempString == &amp;quot;und&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        tempString = &amp;quot;el&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if (~llListFindList(languageCodes, [tempString]))&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
    } else {&lt;br /&gt;
        tempString = &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    tempString = llGetSubString(tempString, 0, 1);&lt;br /&gt;
    return tempString;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;addAgent()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
    integer avliPos;&lt;br /&gt;
    integer idNum;&lt;br /&gt;
    if (~llListFindList(agentsInTranslation, (list)avid))&lt;br /&gt;
    {&lt;br /&gt;
        avliPos = llListFindList(agentsInTranslation, [avid]);&lt;br /&gt;
        agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, chklan], avliPos + 1, avliPos + 2);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        @at;&lt;br /&gt;
        idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
        if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
        {//it exists       &lt;br /&gt;
            jump at;&lt;br /&gt;
        }&lt;br /&gt;
        agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, chklan, idNum];&lt;br /&gt;
        llMessageLinked(LINK_THIS, 64562349, avlan, avid);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;string addNewAgent()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
string addNewAgent(key id)&lt;br /&gt;
{&lt;br /&gt;
    string speakerLanguage;&lt;br /&gt;
 &lt;br /&gt;
    if (llGetAgentSize(id) != ZERO_VECTOR)&lt;br /&gt;
    {&lt;br /&gt;
        speakerLanguage  = checkLanguage(llGetAgentLanguage(id));&lt;br /&gt;
        if (speakerLanguage == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerLanguage = &amp;quot;en&amp;quot;;&lt;br /&gt;
            addAgent(id, speakerLanguage, TRUE);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            addAgent(id, speakerLanguage, FALSE);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return speakerLanguage;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;key getAgentKey()&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
    if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
    {&lt;br /&gt;
        integer gklistPos = llListFindList(agentsInTranslation, [agentID]);&lt;br /&gt;
        return llList2Key(agentsInTranslation, gklistPos - 3);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;processHTTPResponse()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
processHTTPResponse(integer ntype, string bodyStr, list paramsli)&lt;br /&gt;
{&lt;br /&gt;
    integer spkliPos;&lt;br /&gt;
    list    recepientList;&lt;br /&gt;
    key     recepientID;&lt;br /&gt;
    string  recepientLanguage;&lt;br /&gt;
    string  languagePair;&lt;br /&gt;
    key     speakerID;&lt;br /&gt;
    string  speakerName;&lt;br /&gt;
    string  speakerLanguage;&lt;br /&gt;
    string  translatedText;&lt;br /&gt;
    string  lantmpStr;&lt;br /&gt;
    integer z;&lt;br /&gt;
    integer speakerLanguageReliable;&lt;br /&gt;
    float   speakerLanguageConfidence;&lt;br /&gt;
    list    paramtmpli;&lt;br /&gt;
 &lt;br /&gt;
    //===================&lt;br /&gt;
    //Process Translation&lt;br /&gt;
    //===================&lt;br /&gt;
    if (ntype == 0)&lt;br /&gt;
    {&lt;br /&gt;
        speakerID  = llList2Key(paramsli, 1);&lt;br /&gt;
        speakerName = llKey2Name(speakerID);&lt;br /&gt;
        if (speakerName == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
        }&lt;br /&gt;
        recepientList = llParseString2List(llList2String(paramsli, 2), [&amp;quot;@&amp;quot;], []);&lt;br /&gt;
        paramtmpli = llParseStringKeepNulls(llList2String(paramsli, 3), [&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
        recepientLanguage = llList2String(paramtmpli, 1);&lt;br /&gt;
        languagePair = llDumpList2String(paramtmpli, &amp;quot;&amp;gt;&amp;gt;&amp;quot;); &lt;br /&gt;
 &lt;br /&gt;
        //Perform Text Cleanup&lt;br /&gt;
        z = llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;detectedSourceLanguage\&amp;quot;:\&amp;quot;&amp;quot;); &lt;br /&gt;
        if (z != -1)&lt;br /&gt;
        {&lt;br /&gt;
            translatedText  = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, z);&lt;br /&gt;
            speakerLanguage = checkLanguage(llGetSubString(bodyStr, z + 28, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;}, \&amp;quot;responseDetails\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
            spkliPos = llListFindList(agentsInTranslation, [speakerID]);&lt;br /&gt;
            if (spkliPos &amp;gt;= 0)&lt;br /&gt;
            {&lt;br /&gt;
                if (speakerLanguage != llList2String(agentsInTranslation, spkliPos + 1))&lt;br /&gt;
                {&lt;br /&gt;
                    agentsInTranslation = llListReplaceList(agentsInTranslation, [TRUE], spkliPos + 2, spkliPos + 2);  //Mark for recheck of actual spoken language.&lt;br /&gt;
                }&lt;br /&gt;
            }                   &lt;br /&gt;
        }&lt;br /&gt;
        else if (z == -1)&lt;br /&gt;
        {&lt;br /&gt;
            translatedText = llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;}, \&amp;quot;responseDetails\&amp;quot;&amp;quot;));&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        //Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
        if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            lantmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
            //Perry Mizin Comment: Maybe I guess this wrong, maybe I am wrong&lt;br /&gt;
            //Perry Mizin Comment: alternative reverse order: &amp;quot;Hello World&amp;quot; could be &amp;quot;World Hello&amp;quot;&lt;br /&gt;
            //Perry Mizin Comment: reverse order: &amp;quot;Hello World&amp;quot; is &amp;quot;dlroW olleH&amp;quot;&lt;br /&gt;
            for(z = llStringLength(translatedText);z &amp;gt;= 0; z--)&lt;br /&gt;
            {&lt;br /&gt;
                lantmpStr = (lantmpStr=&amp;quot;&amp;quot;) + lantmpStr + llGetSubString(translatedText, z, z); &lt;br /&gt;
            }&lt;br /&gt;
            translatedText = lantmpStr;&lt;br /&gt;
        }   &lt;br /&gt;
        lantmpStr = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
        if (showTranslation)&lt;br /&gt;
        {&lt;br /&gt;
            sendIM(speakerID, lantmpStr);&lt;br /&gt;
        } &lt;br /&gt;
        for (z = 0; z &amp;lt; llGetListLength(recepientList); z += 1)&lt;br /&gt;
        {&lt;br /&gt;
            recepientID = getAgentKey(llList2Integer(recepientList, z));&lt;br /&gt;
            if (recepientID != &amp;quot;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, [recepientID]) + 1);&lt;br /&gt;
                if (recepientLanguage != speakerLanguage)&lt;br /&gt;
                {&lt;br /&gt;
                    sendIM(recepientID, lantmpStr);&lt;br /&gt;
                }&lt;br /&gt;
            }  &lt;br /&gt;
        }&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    //===========================&lt;br /&gt;
    //Process Language Detection&lt;br /&gt;
    //===========================&lt;br /&gt;
    if (ntype == 1)&lt;br /&gt;
    {&lt;br /&gt;
        speakerID = llList2Key(paramsli, 1);&lt;br /&gt;
        speakerLanguageReliable = llToLower(llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) + 15, llSubStringIndex(bodyStr, &amp;quot;,\&amp;quot;confidence\&amp;quot;:&amp;quot;) - 1)) == &amp;quot;true&amp;quot;;&lt;br /&gt;
        speakerLanguageConfidence = (float)llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;,\&amp;quot;confidence\&amp;quot;:&amp;quot;) + 14, llSubStringIndex(bodyStr, &amp;quot;}, \&amp;quot;responseDetails\&amp;quot;:&amp;quot;) - 1);&lt;br /&gt;
&lt;br /&gt;
        spkliPos = llListFindList(agentsInTranslation, [speakerID]);&lt;br /&gt;
        if (((spkliPos &amp;lt; 0) &amp;amp;&amp;amp; (speakerLanguageReliable) || (speakerLanguageConfidence &amp;gt;= 0.08)))&lt;br /&gt;
        {&lt;br /&gt;
            //Analyze Data&lt;br /&gt;
            lantmpStr = checkLanguage(llToLower(llGetSubString(bodyStr, llSubStringIndex(bodyStr, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(bodyStr, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1)));&lt;br /&gt;
            if (lantmpStr == &amp;quot;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            } &lt;br /&gt;
            if (speakerLanguageConfidence &amp;lt; 0.14)&lt;br /&gt;
            {&lt;br /&gt;
                addAgent(speakerID, lantmpStr, TRUE);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                addAgent(speakerID, lantmpStr, FALSE);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=686523</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=686523"/>
		<updated>2009-12-14T10:59:33Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: /* THE CODE BELOW IS NOT TESTED */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribucion al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente codigo fué originalmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mi manera...&lt;br /&gt;
No os riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== THE CODE BELOW IS NOT TESTED ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;txTxtLot() = sendTextBatch()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
txTxtLot(integer txch, string txtxt) &lt;br /&gt;
{&lt;br /&gt;
    txtxt = llXorBase64StringsCorrect(llStringToBase64(txtxt), llStringToBase64(password));&lt;br /&gt;
    while (llStringLength(txtxt) &amp;gt; 508) //If string is 509 characters or longer &lt;br /&gt;
    {&lt;br /&gt;
        llSay(txch, llGetSubString(txtxt, 0, 507)); //send 508 character chunk&lt;br /&gt;
        txtxt = llGetSubString(txtxt, 508, -1);  //delete 508 character chunk&lt;br /&gt;
    }&lt;br /&gt;
    llSay(txch, txtxt);  //send out any remainder chunk or original chunk&lt;br /&gt;
    //Perry Mizin Comment: I don´t understand the aim of the following if.    &lt;br /&gt;
    //Hank Ramos Comment: this line serves to &amp;quot;trigger&amp;quot; the receiver not to wait for another batch.  If the&lt;br /&gt;
    //message length is exactly 508 characters, the receiver things that another chunk of the message is coming.&lt;br /&gt;
    //This message serves to tell the receiver that the last chunk was the last chunk, not another regular chunk.&lt;br /&gt;
    if (llStringLength(txtxt) == 508)&lt;br /&gt;
        llSay(txch, (string)(txch*4958654));&lt;br /&gt;
    //Hank Ramos Comment: this just flashes the color of the bottom prim to show a message was sent&lt;br /&gt;
    llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0, 0.25&amp;gt;, &amp;quot;&amp;quot;); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
&#039;&#039;&#039;string rxTxtLot() = string receiveTextBatch()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer rxliPos;&lt;br /&gt;
    string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
    {&lt;br /&gt;
        rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
        rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
        sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
    rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
    return rxmsg;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
integer rxTxtLotBusy = FALSE; //Perry Mizin: added Busy Mode, this could fail or prevent fail&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    if (rxTxtLotBusy == FALSE)&lt;br /&gt;
    {&lt;br /&gt;
        rxTxtLotBusy = TRUE;&lt;br /&gt;
        integer rxliPos;&lt;br /&gt;
        string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
        if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
        {&lt;br /&gt;
            @rxin;&lt;br /&gt;
            rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
            rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
            sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
            if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
            {&lt;br /&gt;
                 jump rxin;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
        rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
        rxTxtLotBusy = FALSE;&lt;br /&gt;
        return rxmsg;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        //Perry Mizin: llSaySomething?&lt;br /&gt;
        return &amp;quot;&amp;quot;;        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;string rxTxtLotPrv() = string receiveTextBatchPrivate()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
string rxTxtLotPrv(key prxid, string prxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer prxliPos;&lt;br /&gt;
    string  prxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCachePrivate, (list)prxid))&lt;br /&gt;
    {&lt;br /&gt;
        prxliPos = llListFindList(sayCachePrivate, [prxid]);&lt;br /&gt;
        prxtmpStr = (prxtmpStr=&amp;quot;&amp;quot;) + prxtmpStr + llList2String(sayCachePrivate, prxliPos + 1);&lt;br /&gt;
        sayCachePrivate = llDeleteSubList(sayCachePrivate, prxliPos, prxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    prxmsg = prxtmpStr + prxmsg;&lt;br /&gt;
    prxmsg = llBase64ToString(llXorBase64StringsCorrect(prxmsg, llStringToBase64(password)));&lt;br /&gt;
    return prxmsg;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;updateTranslatorList()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
updateTranslatorList()&lt;br /&gt;
{&lt;br /&gt;
    integer nx;&lt;br /&gt;
    integer xliLng;&lt;br /&gt;
    list    newList;&lt;br /&gt;
    string  tmpStrPos;&lt;br /&gt;
    integer newMaster;&lt;br /&gt;
    //Scan and remove translators not in the area&lt;br /&gt;
    xliLng = llGetListLength(translators);&lt;br /&gt;
    for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
    {&lt;br /&gt;
        tmpStrPos = llList2String(llGetObjectDetails(llList2Key(translators, nx + 1), [OBJECT_POS]), 0);&lt;br /&gt;
        if ((llVecDist(llGetPos(), (vector)tmpStrPos) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tmpStrPos != &amp;quot;&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            newList = (newList=[]) + newList +  llList2List(translators, nx, nx + 1);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    translators = newList;&lt;br /&gt;
//    llMessageLinked(LINK_THIS, 65635544, (string)xliLng, &amp;quot;&amp;quot;); //Perry Mizin: what is this necesary for?&lt;br /&gt;
    if (translators == [])&lt;br /&gt;
    {&lt;br /&gt;
        newMaster = 1;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        if (enabled)&lt;br /&gt;
        {&lt;br /&gt;
            xliLng = llGetListLength(translators);&lt;br /&gt;
            newMaster = 2;&lt;br /&gt;
            for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
            {&lt;br /&gt;
                //llOwnerSay(&amp;quot;Checking Priority Number(&amp;quot; +  (string)priorityNumber + &amp;quot;): &amp;quot; + (string)llList2Integer(translators, x));&lt;br /&gt;
                if (llList2Integer(translators, nx) &amp;gt; priorityNumber)&lt;br /&gt;
                {&lt;br /&gt;
                    newMaster = 0;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            newMaster = 0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster &amp;gt; 0) &amp;amp;&amp;amp; (newMaster == 0))&lt;br /&gt;
    {&lt;br /&gt;
        //We are being demoted from master to slave&lt;br /&gt;
        //Flush agentsInTranslation to master&lt;br /&gt;
        if (agentsInTranslation != [])&lt;br /&gt;
        {&lt;br /&gt;
            //Demotion Dump of agentsInTranslation to Master&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1003, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
            if (isInitialized == FALSE)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1004, options])); //error&lt;br /&gt;
        }&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster == 0) &amp;amp;&amp;amp; (newMaster &amp;gt; 0))&lt;br /&gt;
    {&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
        listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); &lt;br /&gt;
    }&lt;br /&gt;
    isMaster = newMaster;&lt;br /&gt;
    llMessageLinked(LINK_THIS, 34829304, (string)isMaster, &amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;sendHeartbeat()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
sendHeartbeat()&lt;br /&gt;
{&lt;br /&gt;
    updateTranslatorList();&lt;br /&gt;
    txTxtLot(broadcastChannel, llList2CSV([1001, priorityNumber]));&lt;br /&gt;
    //Broadcast agentList to Slaves&lt;br /&gt;
    if (isMaster == 2)&lt;br /&gt;
    {&lt;br /&gt;
        txTxtLot(broadcastChannel, llList2CSV([1002, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;string checkLanguage()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
string checkLanguage(string tempString)&lt;br /&gt;
{&lt;br /&gt;
    if (llGetSubString(tempString, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        tempString = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else if (tempString == &amp;quot;und&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        tempString = &amp;quot;el&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if (~llListFindList(languageCodes, [tempString]))&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
    } else {&lt;br /&gt;
        tempString = &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    tempString = llGetSubString(tempString, 0, 1);&lt;br /&gt;
    return tempString;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;addAgent()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
    integer avliPos;&lt;br /&gt;
    integer idNum;&lt;br /&gt;
    if (~llListFindList(agentsInTranslation, (list)avid))&lt;br /&gt;
    {&lt;br /&gt;
        avliPos = llListFindList(agentsInTranslation, [avid]);&lt;br /&gt;
        agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, chklan], avliPos + 1, avliPos + 2);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        @at;&lt;br /&gt;
        idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
        if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
        {//it exists       &lt;br /&gt;
            jump at;&lt;br /&gt;
        }&lt;br /&gt;
        agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, chklan, idNum];&lt;br /&gt;
        llMessageLinked(LINK_THIS, 64562349, avlan, avid);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;string addNewAgent()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
string addNewAgent(key id)&lt;br /&gt;
{&lt;br /&gt;
    string speakerLanguage;&lt;br /&gt;
 &lt;br /&gt;
    if (llGetAgentSize(id) != ZERO_VECTOR)&lt;br /&gt;
    {&lt;br /&gt;
        speakerLanguage  = checkLanguage(llGetAgentLanguage(id));&lt;br /&gt;
        if (speakerLanguage == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerLanguage = &amp;quot;en&amp;quot;;&lt;br /&gt;
            addAgent(id, speakerLanguage, TRUE);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            addAgent(id, speakerLanguage, FALSE);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return speakerLanguage;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;key getAgentKey()&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
    if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
    {&lt;br /&gt;
        integer gklistPos = llListFindList(agentsInTranslation, [agentID]);&lt;br /&gt;
        return llList2Key(agentsInTranslation, gklistPos - 3);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=686513</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=686513"/>
		<updated>2009-12-14T10:54:19Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: /* THE CODE BELOW IS NOT TESTED */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribucion al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente codigo fué originalmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mi manera...&lt;br /&gt;
No os riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== THE CODE BELOW IS NOT TESTED ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;txTxtLot() = sendTextBatch()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
txTxtLot(integer txch, string txtxt) &lt;br /&gt;
{&lt;br /&gt;
    txtxt = llXorBase64StringsCorrect(llStringToBase64(txtxt), llStringToBase64(password));&lt;br /&gt;
    while (llStringLength(txtxt) &amp;gt; 508) //If string is 509 characters or longer &lt;br /&gt;
    {&lt;br /&gt;
        llSay(txch, llGetSubString(txtxt, 0, 507)); //send 508 character chunk&lt;br /&gt;
        txtxt = llGetSubString(txtxt, 508, -1);  //delete 508 character chunk&lt;br /&gt;
    }&lt;br /&gt;
    llSay(txch, txtxt);  //send out any remainder chunk or original chunk&lt;br /&gt;
    //Perry Mizin Comment: I don´t understand the aim of the following if.    &lt;br /&gt;
    //Hank Ramos Comment: this line serves to &amp;quot;trigger&amp;quot; the receiver not to wait for another batch.  If the&lt;br /&gt;
    //message length is exactly 508 characters, the receiver things that another chunk of the message is coming.&lt;br /&gt;
    //This message serves to tell the receiver that the last chunk was the last chunk, not another regular chunk.&lt;br /&gt;
    if (llStringLength(txtxt) == 508)&lt;br /&gt;
        llSay(txch, (string)(txch*4958654));&lt;br /&gt;
    //Hank Ramos Comment: this just flashes the color of the bottom prim to show a message was sent&lt;br /&gt;
    llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0, 0.25&amp;gt;, &amp;quot;&amp;quot;); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
&#039;&#039;&#039;string rxTxtLot() = string receiveTextBatch()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer rxliPos;&lt;br /&gt;
    string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
    {&lt;br /&gt;
        rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
        rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
        sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
    rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
    return rxmsg;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
integer rxTxtLotBusy = FALSE; //Perry Mizin: added Busy Mode, this could fail or prevent fail&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    if (rxTxtLotBusy == FALSE)&lt;br /&gt;
    {&lt;br /&gt;
        rxTxtLotBusy = TRUE;&lt;br /&gt;
        integer rxliPos;&lt;br /&gt;
        string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
        if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
        {&lt;br /&gt;
            @rxin;&lt;br /&gt;
            rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
            rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
            sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
            if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
            {&lt;br /&gt;
                 jump rxin;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
        rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
        rxTxtLotBusy = FALSE;&lt;br /&gt;
        return rxmsg;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        //Perry Mizin: llSaySomething?&lt;br /&gt;
        return &amp;quot;&amp;quot;;        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;string rxTxtLotPrv() = string receiveTextBatchPrivate()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
string rxTxtLotPrv(key prxid, string prxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer prxliPos;&lt;br /&gt;
    string  prxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCachePrivate, (list)prxid))&lt;br /&gt;
    {&lt;br /&gt;
        prxliPos = llListFindList(sayCachePrivate, [prxid]);&lt;br /&gt;
        prxtmpStr = (prxtmpStr=&amp;quot;&amp;quot;) + prxtmpStr + llList2String(sayCachePrivate, prxliPos + 1);&lt;br /&gt;
        sayCachePrivate = llDeleteSubList(sayCachePrivate, prxliPos, prxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    prxmsg = prxtmpStr + prxmsg;&lt;br /&gt;
    prxmsg = llBase64ToString(llXorBase64StringsCorrect(prxmsg, llStringToBase64(password)));&lt;br /&gt;
    return prxmsg;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;updateTranslatorList()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
updateTranslatorList()&lt;br /&gt;
{&lt;br /&gt;
    integer nx;&lt;br /&gt;
    integer xliLng;&lt;br /&gt;
    list    newList;&lt;br /&gt;
    string  tmpStrPos;&lt;br /&gt;
    integer newMaster;&lt;br /&gt;
    //Scan and remove translators not in the area&lt;br /&gt;
    xliLng = llGetListLength(translators);&lt;br /&gt;
    for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
    {&lt;br /&gt;
        tmpStrPos = llList2String(llGetObjectDetails(llList2Key(translators, nx + 1), [OBJECT_POS]), 0);&lt;br /&gt;
        if ((llVecDist(llGetPos(), (vector)tmpStrPos) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tmpStrPos != &amp;quot;&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            newList = (newList=[]) + newList +  llList2List(translators, nx, nx + 1);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    translators = newList;&lt;br /&gt;
//    llMessageLinked(LINK_THIS, 65635544, (string)xliLng, &amp;quot;&amp;quot;); //Perry Mizin: what is this necesary for?&lt;br /&gt;
    if (translators == [])&lt;br /&gt;
    {&lt;br /&gt;
        newMaster = 1;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        if (enabled)&lt;br /&gt;
        {&lt;br /&gt;
            xliLng = llGetListLength(translators);&lt;br /&gt;
            newMaster = 2;&lt;br /&gt;
            for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
            {&lt;br /&gt;
                //llOwnerSay(&amp;quot;Checking Priority Number(&amp;quot; +  (string)priorityNumber + &amp;quot;): &amp;quot; + (string)llList2Integer(translators, x));&lt;br /&gt;
                if (llList2Integer(translators, nx) &amp;gt; priorityNumber)&lt;br /&gt;
                {&lt;br /&gt;
                    newMaster = 0;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            newMaster = 0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster &amp;gt; 0) &amp;amp;&amp;amp; (newMaster == 0))&lt;br /&gt;
    {&lt;br /&gt;
        //We are being demoted from master to slave&lt;br /&gt;
        //Flush agentsInTranslation to master&lt;br /&gt;
        if (agentsInTranslation != [])&lt;br /&gt;
        {&lt;br /&gt;
            //Demotion Dump of agentsInTranslation to Master&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1003, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
            if (isInitialized == FALSE)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1004, options])); //error&lt;br /&gt;
        }&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster == 0) &amp;amp;&amp;amp; (newMaster &amp;gt; 0))&lt;br /&gt;
    {&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
        listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); &lt;br /&gt;
    }&lt;br /&gt;
    isMaster = newMaster;&lt;br /&gt;
    llMessageLinked(LINK_THIS, 34829304, (string)isMaster, &amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;string checkLanguage()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
string checkLanguage(string tempString)&lt;br /&gt;
{&lt;br /&gt;
    if (llGetSubString(tempString, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        tempString = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else if (tempString == &amp;quot;und&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        tempString = &amp;quot;el&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if (~llListFindList(languageCodes, [tempString]))&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
    } else {&lt;br /&gt;
        tempString = &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    tempString = llGetSubString(tempString, 0, 1);&lt;br /&gt;
    return tempString;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;addAgent()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
    integer avliPos;&lt;br /&gt;
    integer idNum;&lt;br /&gt;
    if (~llListFindList(agentsInTranslation, (list)avid))&lt;br /&gt;
    {&lt;br /&gt;
        avliPos = llListFindList(agentsInTranslation, [avid]);&lt;br /&gt;
        agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, chklan], avliPos + 1, avliPos + 2);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        @at;&lt;br /&gt;
        idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
        if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
        {//it exists       &lt;br /&gt;
            jump at;&lt;br /&gt;
        }&lt;br /&gt;
        agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, chklan, idNum];&lt;br /&gt;
        llMessageLinked(LINK_THIS, 64562349, avlan, avid);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;string addNewAgent()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
string addNewAgent(key id)&lt;br /&gt;
{&lt;br /&gt;
    string speakerLanguage;&lt;br /&gt;
 &lt;br /&gt;
    if (llGetAgentSize(id) != ZERO_VECTOR)&lt;br /&gt;
    {&lt;br /&gt;
        speakerLanguage  = checkLanguage(llGetAgentLanguage(id));&lt;br /&gt;
        if (speakerLanguage == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerLanguage = &amp;quot;en&amp;quot;;&lt;br /&gt;
            addAgent(id, speakerLanguage, TRUE);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            addAgent(id, speakerLanguage, FALSE);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return speakerLanguage;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;key getAgentKey()&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
    if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
    {&lt;br /&gt;
        integer gklistPos = llListFindList(agentsInTranslation, [agentID]);&lt;br /&gt;
        return llList2Key(agentsInTranslation, gklistPos - 3);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=686503</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=686503"/>
		<updated>2009-12-14T10:52:00Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: /* THE CODE BELOW IS NOT TESTED */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribucion al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente codigo fué originalmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mi manera...&lt;br /&gt;
No os riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== THE CODE BELOW IS NOT TESTED ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;txTxtLot() = sendTextBatch()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
txTxtLot(integer txch, string txtxt) &lt;br /&gt;
{&lt;br /&gt;
    txtxt = llXorBase64StringsCorrect(llStringToBase64(txtxt), llStringToBase64(password));&lt;br /&gt;
    while (llStringLength(txtxt) &amp;gt; 508) //If string is 509 characters or longer &lt;br /&gt;
    {&lt;br /&gt;
        llSay(txch, llGetSubString(txtxt, 0, 507)); //send 508 character chunk&lt;br /&gt;
        txtxt = llGetSubString(txtxt, 508, -1);  //delete 508 character chunk&lt;br /&gt;
    }&lt;br /&gt;
    llSay(txch, txtxt);  //send out any remainder chunk or original chunk&lt;br /&gt;
    //Perry Mizin Comment: I don´t understand the aim of the following if.    &lt;br /&gt;
    //Hank Ramos Comment: this line serves to &amp;quot;trigger&amp;quot; the receiver not to wait for another batch.  If the&lt;br /&gt;
    //message length is exactly 508 characters, the receiver things that another chunk of the message is coming.&lt;br /&gt;
    //This message serves to tell the receiver that the last chunk was the last chunk, not another regular chunk.&lt;br /&gt;
    if (llStringLength(txtxt) == 508)&lt;br /&gt;
        llSay(txch, (string)(txch*4958654));&lt;br /&gt;
    //Hank Ramos Comment: this just flashes the color of the bottom prim to show a message was sent&lt;br /&gt;
    llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0, 0.25&amp;gt;, &amp;quot;&amp;quot;); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
&#039;&#039;&#039;string rxTxtLot() = string receiveTextBatch()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer rxliPos;&lt;br /&gt;
    string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
    {&lt;br /&gt;
        rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
        rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
        sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
    rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
    return rxmsg;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
integer rxTxtLotBusy = FALSE; //Perry Mizin: added Busy Mode, this could fail or prevent fail&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    if (rxTxtLotBusy == FALSE)&lt;br /&gt;
    {&lt;br /&gt;
        rxTxtLotBusy = TRUE;&lt;br /&gt;
        integer rxliPos;&lt;br /&gt;
        string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
        if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
        {&lt;br /&gt;
            @rxin;&lt;br /&gt;
            rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
            rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
            sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
            if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
            {&lt;br /&gt;
                 jump rxin;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
        rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
        rxTxtLotBusy = FALSE;&lt;br /&gt;
        return rxmsg;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        //Perry Mizin: llSaySomething?&lt;br /&gt;
        return &amp;quot;&amp;quot;;        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;string rxTxtLotPrv() = string receiveTextBatchPrivate()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
string rxTxtLotPrv(key prxid, string prxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer prxliPos;&lt;br /&gt;
    string  prxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCachePrivate, (list)prxid))&lt;br /&gt;
    {&lt;br /&gt;
        prxliPos = llListFindList(sayCachePrivate, [prxid]);&lt;br /&gt;
        prxtmpStr = (prxtmpStr=&amp;quot;&amp;quot;) + prxtmpStr + llList2String(sayCachePrivate, prxliPos + 1);&lt;br /&gt;
        sayCachePrivate = llDeleteSubList(sayCachePrivate, prxliPos, prxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    prxmsg = prxtmpStr + prxmsg;&lt;br /&gt;
    prxmsg = llBase64ToString(llXorBase64StringsCorrect(prxmsg, llStringToBase64(password)));&lt;br /&gt;
    return prxmsg;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;updateTranslatorList()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
updateTranslatorList()&lt;br /&gt;
{&lt;br /&gt;
    integer nx;&lt;br /&gt;
    integer xliLng;&lt;br /&gt;
    list    newList;&lt;br /&gt;
    string  tmpStrPos;&lt;br /&gt;
    integer newMaster;&lt;br /&gt;
    //Scan and remove translators not in the area&lt;br /&gt;
    xliLng = llGetListLength(translators);&lt;br /&gt;
    for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
    {&lt;br /&gt;
        tmpStrPos = llList2String(llGetObjectDetails(llList2Key(translators, nx + 1), [OBJECT_POS]), 0);&lt;br /&gt;
        if ((llVecDist(llGetPos(), (vector)tmpStrPos) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tmpStrPos != &amp;quot;&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            newList = (newList=[]) + newList +  llList2List(translators, nx, nx + 1);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    translators = newList;&lt;br /&gt;
//    llMessageLinked(LINK_THIS, 65635544, (string)xliLng, &amp;quot;&amp;quot;); //Perry Mizin: what is this necesary for?&lt;br /&gt;
    if (translators == [])&lt;br /&gt;
    {&lt;br /&gt;
        newMaster = 1;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        if (enabled)&lt;br /&gt;
        {&lt;br /&gt;
            xliLng = llGetListLength(translators);&lt;br /&gt;
            newMaster = 2;&lt;br /&gt;
            for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
            {&lt;br /&gt;
                //llOwnerSay(&amp;quot;Checking Priority Number(&amp;quot; +  (string)priorityNumber + &amp;quot;): &amp;quot; + (string)llList2Integer(translators, x));&lt;br /&gt;
                if (llList2Integer(translators, nx) &amp;gt; priorityNumber)&lt;br /&gt;
                {&lt;br /&gt;
                    newMaster = 0;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            newMaster = 0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster &amp;gt; 0) &amp;amp;&amp;amp; (newMaster == 0))&lt;br /&gt;
    {&lt;br /&gt;
        //We are being demoted from master to slave&lt;br /&gt;
        //Flush agentsInTranslation to master&lt;br /&gt;
        if (agentsInTranslation != [])&lt;br /&gt;
        {&lt;br /&gt;
            //Demotion Dump of agentsInTranslation to Master&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1003, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
            if (isInitialized == FALSE)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1004, options])); //error&lt;br /&gt;
        }&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster == 0) &amp;amp;&amp;amp; (newMaster &amp;gt; 0))&lt;br /&gt;
    {&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
        listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); &lt;br /&gt;
    }&lt;br /&gt;
    isMaster = newMaster;&lt;br /&gt;
    llMessageLinked(LINK_THIS, 34829304, (string)isMaster, &amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;string checkLanguage()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
string checkLanguage(string tempString)&lt;br /&gt;
{&lt;br /&gt;
    if (llGetSubString(tempString, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        tempString = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else if (tempString == &amp;quot;und&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        tempString = &amp;quot;el&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if (~llListFindList(languageCodes, [tempString]))&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
    } else {&lt;br /&gt;
        tempString = &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    tempString = llGetSubString(tempString, 0, 1);&lt;br /&gt;
    return tempString;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;addAgent()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
    integer avliPos;&lt;br /&gt;
    integer idNum;&lt;br /&gt;
    if (~llListFindList(agentsInTranslation, (list)avid))&lt;br /&gt;
    {&lt;br /&gt;
        avliPos = llListFindList(agentsInTranslation, [avid]);&lt;br /&gt;
        agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, chklan], liPos + 1, liPos + 2);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        @at;&lt;br /&gt;
        idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
        if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
        {//it exists       &lt;br /&gt;
            jump at;&lt;br /&gt;
        }&lt;br /&gt;
        agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, chklan, idNum];&lt;br /&gt;
        llMessageLinked(LINK_THIS, 64562349, avlan, avid);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;string addNewAgent()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
string addNewAgent(key id)&lt;br /&gt;
{&lt;br /&gt;
    string speakerLanguage;&lt;br /&gt;
 &lt;br /&gt;
    if (llGetAgentSize(id) != ZERO_VECTOR)&lt;br /&gt;
    {&lt;br /&gt;
        speakerLanguage  = checkLanguage(llGetAgentLanguage(id));&lt;br /&gt;
        if (speakerLanguage == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerLanguage = &amp;quot;en&amp;quot;;&lt;br /&gt;
            addAgent(id, speakerLanguage, TRUE);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            addAgent(id, speakerLanguage, FALSE);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return speakerLanguage;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;key getAgentKey()&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
    if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
    {&lt;br /&gt;
        integer gklistPos = llListFindList(agentsInTranslation, [agentID]);&lt;br /&gt;
        return llList2Key(agentsInTranslation, gklistPos - 3);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=686493</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=686493"/>
		<updated>2009-12-14T10:31:49Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: /* THE CODE BELOW IS NOT TESTED */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribucion al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente codigo fué originalmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mi manera...&lt;br /&gt;
No os riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== THE CODE BELOW IS NOT TESTED ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;txTxtLot() = sendTextBatch()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
txTxtLot(integer txch, string txtxt) &lt;br /&gt;
{&lt;br /&gt;
    txtxt = llXorBase64StringsCorrect(llStringToBase64(txtxt), llStringToBase64(password));&lt;br /&gt;
    while (llStringLength(txtxt) &amp;gt; 508) //If string is 509 characters or longer &lt;br /&gt;
    {&lt;br /&gt;
        llSay(txch, llGetSubString(txtxt, 0, 507)); //send 508 character chunk&lt;br /&gt;
        txtxt = llGetSubString(txtxt, 508, -1);  //delete 508 character chunk&lt;br /&gt;
    }&lt;br /&gt;
    llSay(txch, txtxt);  //send out any remainder chunk or original chunk&lt;br /&gt;
    //Perry Mizin Comment: I don´t understand the aim of the following if.    &lt;br /&gt;
    //Hank Ramos Comment: this line serves to &amp;quot;trigger&amp;quot; the receiver not to wait for another batch.  If the&lt;br /&gt;
    //message length is exactly 508 characters, the receiver things that another chunk of the message is coming.&lt;br /&gt;
    //This message serves to tell the receiver that the last chunk was the last chunk, not another regular chunk.&lt;br /&gt;
    if (llStringLength(txtxt) == 508)&lt;br /&gt;
        llSay(txch, (string)(txch*4958654));&lt;br /&gt;
    //Hank Ramos Comment: this just flashes the color of the bottom prim to show a message was sent&lt;br /&gt;
    llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0, 0.25&amp;gt;, &amp;quot;&amp;quot;); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
&#039;&#039;&#039;string rxTxtLot() = string receiveTextBatch()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer rxliPos;&lt;br /&gt;
    string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
    {&lt;br /&gt;
        rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
        rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
        sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
    rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
    return rxmsg;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
integer rxTxtLotBusy = FALSE; //Perry Mizin: added Busy Mode, this could fail or prevent fail&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    if (rxTxtLotBusy == FALSE)&lt;br /&gt;
    {&lt;br /&gt;
        rxTxtLotBusy = TRUE;&lt;br /&gt;
        integer rxliPos;&lt;br /&gt;
        string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
        if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
        {&lt;br /&gt;
            @rxin;&lt;br /&gt;
            rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
            rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
            sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
            if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
            {&lt;br /&gt;
                 jump rxin;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
        rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
        rxTxtLotBusy = FALSE;&lt;br /&gt;
        return rxmsg;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        //Perry Mizin: llSaySomething?&lt;br /&gt;
        return &amp;quot;&amp;quot;;        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;string rxTxtLotPrv() = string receiveTextBatchPrivate()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
string rxTxtLotPrv(key prxid, string prxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer prxliPos;&lt;br /&gt;
    string  prxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCachePrivate, (list)prxid))&lt;br /&gt;
    {&lt;br /&gt;
        prxliPos = llListFindList(sayCachePrivate, [prxid]);&lt;br /&gt;
        prxtmpStr = (prxtmpStr=&amp;quot;&amp;quot;) + prxtmpStr + llList2String(sayCachePrivate, prxliPos + 1);&lt;br /&gt;
        sayCachePrivate = llDeleteSubList(sayCachePrivate, prxliPos, prxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    prxmsg = prxtmpStr + prxmsg;&lt;br /&gt;
    prxmsg = llBase64ToString(llXorBase64StringsCorrect(prxmsg, llStringToBase64(password)));&lt;br /&gt;
    return prxmsg;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;updateTranslatorList()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
updateTranslatorList()&lt;br /&gt;
{&lt;br /&gt;
    integer nx;&lt;br /&gt;
    integer xliLng;&lt;br /&gt;
    list    newList;&lt;br /&gt;
    string  tmpStrPos;&lt;br /&gt;
    integer newMaster;&lt;br /&gt;
    //Scan and remove translators not in the area&lt;br /&gt;
    xliLng = llGetListLength(translators);&lt;br /&gt;
    for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
    {&lt;br /&gt;
        tmpStrPos = llList2String(llGetObjectDetails(llList2Key(translators, nx + 1), [OBJECT_POS]), 0);&lt;br /&gt;
        if ((llVecDist(llGetPos(), (vector)tmpStrPos) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tmpStrPos != &amp;quot;&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            newList = (newList=[]) + newList +  llList2List(translators, nx, nx + 1);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    translators = newList;&lt;br /&gt;
//    llMessageLinked(LINK_THIS, 65635544, (string)xliLng, &amp;quot;&amp;quot;); //Perry Mizin: what is this necesary for?&lt;br /&gt;
    if (translators == [])&lt;br /&gt;
    {&lt;br /&gt;
        newMaster = 1;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        if (enabled)&lt;br /&gt;
        {&lt;br /&gt;
            xliLng = llGetListLength(translators);&lt;br /&gt;
            newMaster = 2;&lt;br /&gt;
            for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
            {&lt;br /&gt;
                //llOwnerSay(&amp;quot;Checking Priority Number(&amp;quot; +  (string)priorityNumber + &amp;quot;): &amp;quot; + (string)llList2Integer(translators, x));&lt;br /&gt;
                if (llList2Integer(translators, nx) &amp;gt; priorityNumber)&lt;br /&gt;
                {&lt;br /&gt;
                    newMaster = 0;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            newMaster = 0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster &amp;gt; 0) &amp;amp;&amp;amp; (newMaster == 0))&lt;br /&gt;
    {&lt;br /&gt;
        //We are being demoted from master to slave&lt;br /&gt;
        //Flush agentsInTranslation to master&lt;br /&gt;
        if (agentsInTranslation != [])&lt;br /&gt;
        {&lt;br /&gt;
            //Demotion Dump of agentsInTranslation to Master&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1003, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
            if (isInitialized == FALSE)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1004, options])); //error&lt;br /&gt;
        }&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster == 0) &amp;amp;&amp;amp; (newMaster &amp;gt; 0))&lt;br /&gt;
    {&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
        listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); &lt;br /&gt;
    }&lt;br /&gt;
    isMaster = newMaster;&lt;br /&gt;
    llMessageLinked(LINK_THIS, 34829304, (string)isMaster, &amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
string checkLanguage()&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
string checkLanguage(string tempString)&lt;br /&gt;
{&lt;br /&gt;
    if (llGetSubString(tempString, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        tempString = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else if (tempString == &amp;quot;und&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        tempString = &amp;quot;el&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else if (llListFindList(languageCodes, [tempString]) == -1)&lt;br /&gt;
    {&lt;br /&gt;
        tempString = &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    tempString = llGetSubString(tempString, 0, 1);&lt;br /&gt;
    return tempString;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;addAgent()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
addAgent(key avid, string avlan, integer chklan)&lt;br /&gt;
{&lt;br /&gt;
    integer avliPos;&lt;br /&gt;
    integer idNum;&lt;br /&gt;
    if (~llListFindList(agentsInTranslation, (list)avid))&lt;br /&gt;
    {&lt;br /&gt;
        avliPos = llListFindList(agentsInTranslation, [avid]);&lt;br /&gt;
        agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, chklan], liPos + 1, liPos + 2);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        @at;&lt;br /&gt;
        idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
        if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
        {//it exists       &lt;br /&gt;
            jump at;&lt;br /&gt;
        }&lt;br /&gt;
        agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, chklan, idNum];&lt;br /&gt;
        llMessageLinked(LINK_THIS, 64562349, avlan, avid);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;string addNewAgent()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
string addNewAgent(key id)&lt;br /&gt;
{&lt;br /&gt;
    string speakerLanguage;&lt;br /&gt;
 &lt;br /&gt;
    if (llGetAgentSize(id) != ZERO_VECTOR)&lt;br /&gt;
    {&lt;br /&gt;
        speakerLanguage  = checkLanguage(llGetAgentLanguage(id));&lt;br /&gt;
        if (speakerLanguage == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerLanguage = &amp;quot;en&amp;quot;;&lt;br /&gt;
            addAgent(id, speakerLanguage, TRUE);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            addAgent(id, speakerLanguage, FALSE);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return speakerLanguage;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;key getAgentKey()&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
    if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
    {&lt;br /&gt;
        integer gklistPos = llListFindList(agentsInTranslation, [agentID]);&lt;br /&gt;
        return llList2Key(agentsInTranslation, gklistPos - 3);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=686483</id>
		<title>User talk:Perry Mizin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Perry_Mizin&amp;diff=686483"/>
		<updated>2009-12-14T10:17:43Z</updated>

		<summary type="html">&lt;p&gt;Perry Mizin: /* THE CODE BELOW IS NOT TESTED */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bienvenid@ ==&lt;br /&gt;
Hola, soy Perry Mizin y este será mi humilde intento de contribucion al proyecto &amp;quot;[[Universal Translator|Traductor Universal de Google]]&amp;quot; creado por [[User:Hank Ramos|Hank Ramos]]. &lt;br /&gt;
&lt;br /&gt;
El siguiente codigo fué originalmente creado por [[User:Hank Ramos|Hank Ramos]], empezaré modificando algunas funciones a mi manera...&lt;br /&gt;
No os riais&lt;br /&gt;
&lt;br /&gt;
== Welcome ==&lt;br /&gt;
Hello, I am Perry Mizin and this will be my humble try to contribute with the project &amp;quot;[[Universal Translator|Universal Google Translator]]&amp;quot; created by [[User:Hank Ramos|Hank Ramos]].&lt;br /&gt;
&lt;br /&gt;
The next code was originally created by [[User:Hank Ramos|Hank Ramos]], I will start modifiying some functions on my way...&lt;br /&gt;
Don´t laugh&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== THE CODE BELOW IS NOT TESTED ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;txTxtLot() = sendTextBatch()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
txTxtLot(integer txch, string txtxt) &lt;br /&gt;
{&lt;br /&gt;
    txtxt = llXorBase64StringsCorrect(llStringToBase64(txtxt), llStringToBase64(password));&lt;br /&gt;
    while (llStringLength(txtxt) &amp;gt; 508) //If string is 509 characters or longer &lt;br /&gt;
    {&lt;br /&gt;
        llSay(txch, llGetSubString(txtxt, 0, 507)); //send 508 character chunk&lt;br /&gt;
        txtxt = llGetSubString(txtxt, 508, -1);  //delete 508 character chunk&lt;br /&gt;
    }&lt;br /&gt;
    llSay(txch, txtxt);  //send out any remainder chunk or original chunk&lt;br /&gt;
    //Perry Mizin Comment: I don´t understand the aim of the following if.    &lt;br /&gt;
    //Hank Ramos Comment: this line serves to &amp;quot;trigger&amp;quot; the receiver not to wait for another batch.  If the&lt;br /&gt;
    //message length is exactly 508 characters, the receiver things that another chunk of the message is coming.&lt;br /&gt;
    //This message serves to tell the receiver that the last chunk was the last chunk, not another regular chunk.&lt;br /&gt;
    if (llStringLength(txtxt) == 508)&lt;br /&gt;
        llSay(txch, (string)(txch*4958654));&lt;br /&gt;
    //Hank Ramos Comment: this just flashes the color of the bottom prim to show a message was sent&lt;br /&gt;
    llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0, 0.25&amp;gt;, &amp;quot;&amp;quot;); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
&#039;&#039;&#039;string rxTxtLot() = string receiveTextBatch()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer rxliPos;&lt;br /&gt;
    string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
    {&lt;br /&gt;
        rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
        rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
        sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
    rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
    return rxmsg;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
integer rxTxtLotBusy = FALSE; //Perry Mizin: added Busy Mode, this could fail or prevent fail&lt;br /&gt;
string rxTxtLot(key rxid, string rxmsg)&lt;br /&gt;
{&lt;br /&gt;
    if (rxTxtLotBusy == FALSE)&lt;br /&gt;
    {&lt;br /&gt;
        rxTxtLotBusy = TRUE;&lt;br /&gt;
        integer rxliPos;&lt;br /&gt;
        string  rxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
        if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
        {&lt;br /&gt;
            @rxin;&lt;br /&gt;
            rxliPos = llListFindList(sayCache, [rxid]);&lt;br /&gt;
            rxtmpStr = (rxtmpStr=&amp;quot;&amp;quot;) + rxtmpStr + llList2String(sayCache, rxliPos + 1);&lt;br /&gt;
            sayCache = llDeleteSubList(sayCache, rxliPos, rxliPos + 1);&lt;br /&gt;
            if(~llListFindList(sayCache, (list)rxid))&lt;br /&gt;
            {&lt;br /&gt;
                 jump rxin;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        rxmsg = rxtmpStr + rxmsg;&lt;br /&gt;
        rxmsg = llBase64ToString(llXorBase64StringsCorrect(rxmsg, llStringToBase64(password)));&lt;br /&gt;
        rxTxtLotBusy = FALSE;&lt;br /&gt;
        return rxmsg;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        //Perry Mizin: llSaySomething?&lt;br /&gt;
        return &amp;quot;&amp;quot;;        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;string rxTxtLotPrv() = string receiveTextBatchPrivate()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
string rxTxtLotPrv(key prxid, string prxmsg)&lt;br /&gt;
{&lt;br /&gt;
    integer prxliPos;&lt;br /&gt;
    string  prxtmpStr = &amp;quot;&amp;quot;;&lt;br /&gt;
    while (~llListFindList(sayCachePrivate, (list)prxid))&lt;br /&gt;
    {&lt;br /&gt;
        prxliPos = llListFindList(sayCachePrivate, [prxid]);&lt;br /&gt;
        prxtmpStr = (prxtmpStr=&amp;quot;&amp;quot;) + prxtmpStr + llList2String(sayCachePrivate, prxliPos + 1);&lt;br /&gt;
        sayCachePrivate = llDeleteSubList(sayCachePrivate, prxliPos, prxliPos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    prxmsg = prxtmpStr + prxmsg;&lt;br /&gt;
    prxmsg = llBase64ToString(llXorBase64StringsCorrect(prxmsg, llStringToBase64(password)));&lt;br /&gt;
    return prxmsg;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;updateTranslatorList()&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
updateTranslatorList()&lt;br /&gt;
{&lt;br /&gt;
    integer nx;&lt;br /&gt;
    integer xliLng;&lt;br /&gt;
    list    newList;&lt;br /&gt;
    string  tmpStrPos;&lt;br /&gt;
    integer newMaster;&lt;br /&gt;
    //Scan and remove translators not in the area&lt;br /&gt;
    xliLng = llGetListLength(translators);&lt;br /&gt;
    for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
    {&lt;br /&gt;
        tmpStrPos = llList2String(llGetObjectDetails(llList2Key(translators, nx + 1), [OBJECT_POS]), 0);&lt;br /&gt;
        if ((llVecDist(llGetPos(), (vector)tmpStrPos) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tmpStrPos != &amp;quot;&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            newList = (newList=[]) + newList +  llList2List(translators, nx, nx + 1);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    translators = newList;&lt;br /&gt;
//    llMessageLinked(LINK_THIS, 65635544, (string)xliLng, &amp;quot;&amp;quot;); //Perry Mizin: what is this necesary for?&lt;br /&gt;
    if (translators == [])&lt;br /&gt;
    {&lt;br /&gt;
        newMaster = 1;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        if (enabled)&lt;br /&gt;
        {&lt;br /&gt;
            xliLng = llGetListLength(translators);&lt;br /&gt;
            newMaster = 2;&lt;br /&gt;
            for (nx = 0; nx &amp;lt; xliLng; nx += 2)&lt;br /&gt;
            {&lt;br /&gt;
                //llOwnerSay(&amp;quot;Checking Priority Number(&amp;quot; +  (string)priorityNumber + &amp;quot;): &amp;quot; + (string)llList2Integer(translators, x));&lt;br /&gt;
                if (llList2Integer(translators, nx) &amp;gt; priorityNumber)&lt;br /&gt;
                {&lt;br /&gt;
                    newMaster = 0;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            newMaster = 0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster &amp;gt; 0) &amp;amp;&amp;amp; (newMaster == 0))&lt;br /&gt;
    {&lt;br /&gt;
        //We are being demoted from master to slave&lt;br /&gt;
        //Flush agentsInTranslation to master&lt;br /&gt;
        if (agentsInTranslation != [])&lt;br /&gt;
        {&lt;br /&gt;
            //Demotion Dump of agentsInTranslation to Master&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1003, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
            if (isInitialized == FALSE)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            txTxtLot(broadcastChannel, llList2CSV([1004, options])); //error&lt;br /&gt;
        }&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster == 0) &amp;amp;&amp;amp; (newMaster &amp;gt; 0))&lt;br /&gt;
    {&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
        listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); &lt;br /&gt;
    }&lt;br /&gt;
    isMaster = newMaster;&lt;br /&gt;
    llMessageLinked(LINK_THIS, 34829304, (string)isMaster, &amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
string checkLanguage()&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
string checkLanguage(string tempString)&lt;br /&gt;
{&lt;br /&gt;
    if (llGetSubString(tempString, 0, 1) == &amp;quot;zh&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        tempString = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else if (tempString == &amp;quot;und&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        tempString = &amp;quot;el&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else if (llListFindList(languageCodes, [tempString]) == -1)&lt;br /&gt;
    {&lt;br /&gt;
        tempString = &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    tempString = llGetSubString(tempString, 0, 1);&lt;br /&gt;
    return tempString;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
addAgent()&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
addAgent(key id, string language, integer recheckLangauge)&lt;br /&gt;
{&lt;br /&gt;
    integer listPos;&lt;br /&gt;
    integer listPosID;&lt;br /&gt;
    integer idNum;&lt;br /&gt;
    string  tempString;&lt;br /&gt;
 &lt;br /&gt;
    if (llListFindList(agentsInTranslation,[id]) == -1)&lt;br /&gt;
    {&lt;br /&gt;
        @at;&lt;br /&gt;
        idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
        if(~llListFindList(agentsInTranslation, (list)idNum))&lt;br /&gt;
        {//it exists       &lt;br /&gt;
            jump at;&lt;br /&gt;
        }&lt;br /&gt;
        agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [id, language, recheckLangauge, idNum];&lt;br /&gt;
        llMessageLinked(LINK_THIS, 64562349, language, id);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        listPos = llListFindList(agentsInTranslation, [id]);&lt;br /&gt;
        agentsInTranslation = llListReplaceList(agentsInTranslation, [language, recheckLangauge], listPos + 1, listPos + 2);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
string addNewAgent()&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
string addNewAgent(key id)&lt;br /&gt;
{&lt;br /&gt;
    string speakerLanguage;&lt;br /&gt;
 &lt;br /&gt;
    if (llGetAgentSize(id) != ZERO_VECTOR)&lt;br /&gt;
    {&lt;br /&gt;
        speakerLanguage  = checkLanguage(llGetAgentLanguage(id));&lt;br /&gt;
        if (speakerLanguage == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerLanguage = &amp;quot;en&amp;quot;;&lt;br /&gt;
            addAgent(id, speakerLanguage, TRUE);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            addAgent(id, speakerLanguage, FALSE);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return speakerLanguage;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
key getAgentKey() &lt;br /&gt;
&amp;lt;ls&amp;gt;&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
    if(~llListFindList(agentsInTranslation, (list)agentID))&lt;br /&gt;
    {&lt;br /&gt;
        integer gklistPos = llListFindList(agentsInTranslation, [agentID]);&lt;br /&gt;
        return llList2Key(agentsInTranslation, gklistPos - 3);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Perry Mizin</name></author>
	</entry>
</feed>