Difference between revisions of "User talk:Perry Mizin"
Perry Mizin (talk | contribs) m (→OK) |
Perry Mizin (talk | contribs) m (→OK) |
||
Line 78: | Line 78: | ||
sendIM(key imid, string imstr) | sendIM(key imid, string imstr) | ||
{ | { // llInstantMessage(key id , string message) causes the script to sleep for 2 seconds | ||
if (M >= 10) | |||
{ | |||
llMessageLinked(LINK_THIS, 2334400, imstr, imid); | |||
M = 1; | |||
} | |||
else if (M == 9) | |||
{ | |||
llMessageLinked(LINK_THIS, 2334410, imstr, imid); | |||
M = 10; | |||
} | |||
else if (M == 8) | |||
{ | |||
llMessageLinked(LINK_THIS, 2334420, imstr, imid); | |||
M = 9; | |||
} | |||
else if (M == 7) | |||
{ | |||
llMessageLinked(LINK_THIS, 2334430, imstr, imid); | |||
M = 8; | |||
} | |||
else if (M == 6) | |||
{ | |||
llMessageLinked(LINK_THIS, 2334440, imstr, imid); | |||
M = 7; | |||
} | |||
else if (M == 5) | |||
{ | |||
llMessageLinked(LINK_THIS, 2334450, imstr, imid); | |||
M = 6; | |||
} | |||
else if (M == 4) | |||
{ | |||
llMessageLinked(LINK_THIS, 2334460, imstr, imid); | |||
M = 5; | |||
} | |||
else if (M == 3) | |||
{ | |||
llMessageLinked(LINK_THIS, 2334470, imstr, imid); | |||
M = 4; | |||
} | |||
else if (M == 2) | |||
{ | |||
llMessageLinked(LINK_THIS, 2334480, imstr, imid); | |||
M = 3; | |||
} | |||
else if (M == 1) | |||
{ | |||
llMessageLinked(LINK_THIS, 2334490, imstr, imid); | |||
M = 2; | |||
} | |||
if (showTranslation == TRUE) | |||
{ | |||
if (imid != llGetOwner()) | |||
{ | |||
llOwnerSay(imstr + " @" + llKey2Name(imid)); //llOwnerSay(string message) has no delay | |||
} | |||
} | |||
} | } | ||
detectLanguage(string dtcmsg, key dtckey) | detectLanguage(string dtcmsg, key dtckey) | ||
{ | { | ||
tempValue = llHTTPRequest("http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&q=" + llEscapeURL(dtcmsg), [HTTP_METHOD, "GET", HTTP_MIMETYPE, "plain/text;charset=utf-8"], " "); | |||
tempValue = llHTTPRequest("http://ajax.googleapis.com/ajax/services/language/" + dtcmsg, [HTTP_METHOD, "GET", HTTP_MIMETYPE, "plain/text;charset=utf-8"], " "); | |||
if (tempValue != NULL_KEY) | if (tempValue != NULL_KEY) | ||
{ | { | ||
Line 96: | Line 147: | ||
} | } | ||
Translate(integer chkn, string chkmsg, list chkli) | |||
{ | { | ||
key returnValue; | key returnValue; | ||
returnValue = llHTTPRequest("http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=" + chkmsg, [HTTP_METHOD, "GET", HTTP_MIMETYPE, "plain/text;charset=utf-8"], ""); | |||
returnValue = llHTTPRequest("http://ajax.googleapis.com/ajax/services/language/" + chkmsg, [HTTP_METHOD, "GET", HTTP_MIMETYPE, "plain/text;charset=utf-8"], ""); | |||
if (returnValue != NULL_KEY) | if (returnValue != NULL_KEY) | ||
{ | { //Translation | ||
requestedTranslations = (requestedTranslations=[]) + requestedTranslations + [returnValue, llList2CSV(chkli)]; | |||
} | } | ||
else | else | ||
{ | { | ||
llSleep( | llSleep(5.0); //Something has gone horribly wrong, sleep 5 seconds to clear throttle | ||
} | } | ||
} | } | ||
Line 153: | Line 200: | ||
} | } | ||
agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, chklan, idNum]; | agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, chklan, idNum]; | ||
llMessageLinked(LINK_THIS, 64562349, avlan, avid); | // llMessageLinked(LINK_THIS, 64562349, avlan, avid); | ||
} | } | ||
} | } | ||
Line 218: | Line 265: | ||
//Perform Text Cleanup | //Perform Text Cleanup | ||
translatedText = llGetSubString(bodyStr, llSubStringIndex(bodyStr, "{\"translatedText\":\"") + 18, llSubStringIndex(bodyStr, "\",\"detectedSourceLanguage\":\"")); | translatedText = llGetSubString(bodyStr, llSubStringIndex(bodyStr, "{\"translatedText\":\"") + 18, llSubStringIndex(bodyStr, "\",\"detectedSourceLanguage\":\"")); | ||
//Reverse order if Recepient Language is Hebrew or Arabic | //Reverse order if Recepient Language is Hebrew or Arabic | ||
if ((recepientLanguage == "iw") || (recepientLanguage == "ar")) | if ((recepientLanguage == "iw") || (recepientLanguage == "ar")) | ||
Line 264: | Line 310: | ||
} | } | ||
else if (num == 3342976) | else if (num == 3342976) | ||
{ | { //Send Preferences | ||
options = lstr; | options = lstr; | ||
if (isInitialized == FALSE) return; | if (isInitialized == FALSE) return; | ||
Line 278: | Line 323: | ||
{ | { | ||
integer s; | integer s; | ||
key | key sid; | ||
for (s = 0; s < num_detected; s += 1) | for (s = 0; s < num_detected; s += 1) | ||
{ | { | ||
sid = llDetectedKey(s); | sid = llDetectedKey(s); | ||
if (~llListFindList(agentsInTranslation, (list)sid)) | |||
{ } | |||
else | else | ||
{ | { | ||
Line 290: | Line 336: | ||
} | } | ||
no_sensor() | |||
{ } | |||
listen(integer channel, string name, key id, string message) | listen(integer channel, string name, key id, string message) | ||
Line 301: | Line 348: | ||
string lanpair; | string lanpair; | ||
list translationCache; | list translationCache; | ||
//Translator Engine Code | //Translator Engine Code | ||
if ((!enabled) && (isMaster == 1)) | if ((!enabled) && (isMaster == 1)) | ||
Line 321: | Line 367: | ||
{ | { | ||
detectLanguage(message, id); | detectLanguage(message, id); | ||
} | } | ||
if (~llListFindList(agentsInTranslation, (list)id)) | if (~llListFindList(agentsInTranslation, (list)id)) | ||
{ | { | ||
Line 332: | Line 377: | ||
spkrLan = addNewAgent(id); | spkrLan = addNewAgent(id); | ||
} | } | ||
//=============================== | |||
//Formulate Translation Requests | |||
//=============================== | |||
if (id == llGetOwner()) | if (id == llGetOwner()) | ||
{ // If speaker is owner | |||
// I will do this dirty cheat by now | |||
// There should exist another clean way to filter speakers & receivers, I need to think about this | |||
for (w = 0; w < llGetListLength(agentsInTranslation); w += 4) | for (w = 0; w < llGetListLength(agentsInTranslation); w += 4) | ||
{ | { //Loop through translation group and do appropriate translations as needed | ||
recepID = llList2Integer(agentsInTranslation, w + 3); | recepID = llList2Integer(agentsInTranslation, w + 3); | ||
recepLan = checkLanguage(llList2String(agentsInTranslation, w + 1)); | recepLan = checkLanguage(llList2String(agentsInTranslation, w + 1)); | ||
Line 355: | Line 401: | ||
} | } | ||
} | } | ||
} | } | ||
if (translationCache != []) | if (translationCache != []) | ||
{ | { //Process Requests | ||
for (w = 0; w < llGetListLength(translationCache); w += 2) | for (w = 0; w < llGetListLength(translationCache); w += 2) | ||
{ | { //==================================== | ||
//Translation | //Translation | ||
//==================================== | //==================================== | ||
//Forumulate and Send Translation Request | //Forumulate and Send Translation Request | ||
lanpair = "|" + llList2String(llParseStringKeepNulls(llList2String(translationCache, w), ["|"],[]), 1); | lanpair = "|" + llList2String(llParseStringKeepNulls(llList2String(translationCache, w), ["|"],[]), 1); | ||
Translate(0, llEscapeURL(message) + "&langpair=" + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, w + 1), llList2String(translationCache, w)]); | |||
} | } | ||
} | } | ||
} | } | ||
else | else | ||
{ | { // if speaker is not owner | ||
lstliPos = llListFindList(agentsInTranslation, (list)llGetOwner()); | lstliPos = llListFindList(agentsInTranslation, (list)llGetOwner()); | ||
recepID = llList2Integer(agentsInTranslation, lstliPos + 3); | recepID = llList2Integer(agentsInTranslation, lstliPos + 3); | ||
Line 388: | Line 432: | ||
} | } | ||
if (translationCache != []) | if (translationCache != []) | ||
{ | { //==================================== | ||
//Translation | |||
//==================================== | |||
//Forumulate and Send Translation Request | |||
lanpair = "|" + llList2String(llParseStringKeepNulls(llList2String(translationCache, lstliPos), ["|"],[]), 1); | |||
Translate(0, llEscapeURL(message) + "&langpair=" + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, lstliPos + 1), llList2String(translationCache, lstliPos)]); | |||
} | } | ||
} | } | ||
Line 401: | Line 444: | ||
http_response(key request_id, integer status, list metadata, string body) | http_response(key request_id, integer status, list metadata, string body) | ||
{ | { //Process Response Code | ||
integer httliPos; | integer httliPos; | ||
string htttmpStr; | string htttmpStr; | ||
if (~llListFindList(requestedTranslations, (list)request_id)) | if (~llListFindList(requestedTranslations, (list)request_id)) | ||
{ | { | ||
Line 414: | Line 455: | ||
} | } | ||
if (~llListFindList(tempDetections, (list)request_id)) | if (~llListFindList(tempDetections, (list)request_id)) | ||
{ // We Trust the Google system, the Google´s guys are good and I am sure they will keep improving :-) | |||
integer tmpliPos = llListFindList(tempDetections, (list)request_id); | integer tmpliPos = llListFindList(tempDetections, (list)request_id); | ||
key speakerID = llList2Key(tempDetections, tmpliPos + 1); | key speakerID = llList2Key(tempDetections, tmpliPos + 1); | ||
tempDetections = llDeleteSubList(tempDetections, tmpliPos, tmpliPos + 3); | tempDetections = llDeleteSubList(tempDetections, tmpliPos, tmpliPos + 3); | ||
string tmptmpStr = llToLower(llGetSubString(body, llSubStringIndex(body, "{\"language\":\"") + 13, llSubStringIndex(body, "\",\"isReliable\":") - 1)); | string tmptmpStr = llToLower(llGetSubString(body, llSubStringIndex(body, "{\"language\":\"") + 13, llSubStringIndex(body, "\",\"isReliable\":") - 1)); | ||
if ( tmptmpStr != "" && contains(tmptmpStr, "err") == 0 && contains(tmptmpStr, "unn") == 0 ) | |||
{ // if detects any language | |||
tmptmpStr = checkLanguage(tmptmpStr); | |||
if (~llListFindList(agentsInTranslation, (list)speakerID)) | if (~llListFindList(agentsInTranslation, (list)speakerID)) | ||
{ | { | ||
Line 427: | Line 468: | ||
string actlan = llList2String(agentsInTranslation, tmpavliPos + 1); | string actlan = llList2String(agentsInTranslation, tmpavliPos + 1); | ||
if (actlan != tmptmpStr) | if (actlan != tmptmpStr) | ||
{ | { // if language of speaker is not the same as detected language | ||
agentsInTranslation = llListReplaceList(agentsInTranslation,[llList2Integer(agentsInTranslation,tmpavliPos + 2) + 1] , tmpavliPos + 2, tmpavliPos + 2); | agentsInTranslation = llListReplaceList(agentsInTranslation,[llList2Integer(agentsInTranslation,tmpavliPos + 2) + 1] , tmpavliPos + 2, tmpavliPos + 2); | ||
} | } | ||
else | else | ||
{ | { // reset language checker for speaker | ||
agentsInTranslation = llListReplaceList(agentsInTranslation,[0], tmpavliPos + 2, tmpavliPos + 2); | agentsInTranslation = llListReplaceList(agentsInTranslation,[0], tmpavliPos + 2, tmpavliPos + 2); | ||
} | } | ||
if (llList2Integer(agentsInTranslation,tmpavliPos + 2) >= 3) | |||
{ // if anyone speaks on any language 3 times in a row | |||
addAgent(speakerID, tmptmpStr, 0); | |||
} | } | ||
} | } | ||
Line 451: | Line 485: | ||
timer() | timer() | ||
{ | |||
llSetTimerEvent(0.0); | llSetTimerEvent(0.0); // we better reset timer by way of precaution | ||
if (isInitialized == FALSE) | if (isInitialized == FALSE) | ||
{ | { | ||
Line 463: | Line 497: | ||
{ | { | ||
mylanguage = "en"; | mylanguage = "en"; | ||
} | |||
if(~llListFindList(agentsInTranslation, (list)llGetOwner()) | |||
{ | |||
integer ownerliPos = llListFindList(agentsInTranslation, (list)llGetOwner()); | |||
agentsInTranslation = llListReplaceList(agentsInTranslation,[mylanguage] , ownerliPos + 1, ownerliPos + 1); | |||
} | |||
else | |||
{ | |||
agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [llGetOwner() , mylanguage , 0 , llRound(llFrand(2000000)) + 1]; | |||
} | |||
} | } | ||
integer r; | integer r; | ||
Line 474: | Line 516: | ||
for (x = 0; x < llGetListLength(tempDetections); x += 2) | for (x = 0; x < llGetListLength(tempDetections); x += 2) | ||
{ | { | ||
timeElapsed = llGetTime() - llList2Float(llCSV2List(llList2String(tempDetections, x + 1)), 0); | |||
if (timeElapsed < 60.0) | |||
{ | |||
newList = (newList=[]) + newList + llList2List(tempDetections, x, x + 1); | |||
} | |||
} | } | ||
tempDetections = newList; | tempDetections = newList; |
Revision as of 12:38, 19 December 2009
Bienvenid@
Hola, soy Perry Mizin y este será mi humilde intento de contribucion al proyecto "Traductor Universal de Google" creado por Hank Ramos.
El siguiente codigo fué originalmente creado por Hank Ramos, empezaré modificando algunas funciones a mi manera... No os riais
Welcome
Hello, I am Perry Mizin and this will be my humble try to contribute with the project "Universal Google Translator" created by Hank Ramos.
The next code was originally created by Hank Ramos, I will start modifiying some functions on my way... Don´t laugh
OK
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? 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...
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. 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...
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?. I have tested a bit the code above already, and it seems to work altought i´m having some problems... 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...
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. 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...
Es dificil... me está costando pero ya veremos... Its difficult... i am struggling but we will see...
chu chu chu
De Güatemala a Güatepeor, Sin comentarios...
From Güatebad to Güateworse, No comments...
Buscando en Internet he encontrado este 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
Searching on the web I crossed in my way with this spell checker Yahoo´s API , I think that it only supports English language by now althought it would be interesting to add it to the project
ESTO ES EL TRADUCTOR "fracaso" por ahora... Necesito limpiar el codigo y rehacer algunas cosas
THIS IS THE TRANSLATOR "mess" by now... I need to clean the code and rework some things
<lsl>
//Personal Translator
//Universal Translator (Mods made in Perry Mizin)
//Version 1.9.0
//November 12, 2009
//LSL Script copyright 2006-2009 by Hank Ramos
//Web Server Services powered by Google
//Variables
list requestedTranslations;
list tempDetections;
list agentsInTranslation;
list requestList;
integer listenID;
integer isMaster = 1;
integer autoLanguage = TRUE;
integer enabled = FALSE;
integer showTranslation = FALSE;
integer tranObjects = TRUE;
integer isInitialized = FALSE;
string options;
key tempValue;
//Functions
integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex
{
return ~llSubStringIndex(haystack, needle);
}
sendIM(key imid, string imstr) { // llInstantMessage(key id , string message) causes the script to sleep for 2 seconds if (M >= 10) { llMessageLinked(LINK_THIS, 2334400, imstr, imid); M = 1; } else if (M == 9) { llMessageLinked(LINK_THIS, 2334410, imstr, imid); M = 10; } else if (M == 8) { llMessageLinked(LINK_THIS, 2334420, imstr, imid); M = 9; } else if (M == 7) { llMessageLinked(LINK_THIS, 2334430, imstr, imid); M = 8; } else if (M == 6) { llMessageLinked(LINK_THIS, 2334440, imstr, imid); M = 7; } else if (M == 5) { llMessageLinked(LINK_THIS, 2334450, imstr, imid); M = 6; } else if (M == 4) { llMessageLinked(LINK_THIS, 2334460, imstr, imid); M = 5; } else if (M == 3) { llMessageLinked(LINK_THIS, 2334470, imstr, imid); M = 4; } else if (M == 2) { llMessageLinked(LINK_THIS, 2334480, imstr, imid); M = 3; } else if (M == 1) { llMessageLinked(LINK_THIS, 2334490, imstr, imid); M = 2; } if (showTranslation == TRUE) { if (imid != llGetOwner()) { llOwnerSay(imstr + " @" + llKey2Name(imid)); //llOwnerSay(string message) has no delay } } }
detectLanguage(string dtcmsg, key dtckey) {
tempValue = llHTTPRequest("http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&q=" + llEscapeURL(dtcmsg), [HTTP_METHOD, "GET", HTTP_MIMETYPE, "plain/text;charset=utf-8"], " "); if (tempValue != NULL_KEY) { tempDetections = (tempDetections=[]) + tempDetections + [tempValue, dtckey]; }
}
Translate(integer chkn, string chkmsg, list chkli) {
key returnValue; returnValue = llHTTPRequest("http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=" + chkmsg, [HTTP_METHOD, "GET", HTTP_MIMETYPE, "plain/text;charset=utf-8"], ""); if (returnValue != NULL_KEY) { //Translation requestedTranslations = (requestedTranslations=[]) + requestedTranslations + [returnValue, llList2CSV(chkli)]; } else { llSleep(5.0); //Something has gone horribly wrong, sleep 5 seconds to clear throttle }
}
string checkLanguage(string chklantmpStr) {
if (chklantmpStr == "") { chklantmpStr = "en"; } else if (chklantmpStr == "und") { chklantmpStr = "el"; } if (llGetSubString(chklantmpStr, 0, 1) == "zh") { chklantmpStr = "zh-CN"; } else { chklantmpStr = llGetSubString(chklantmpStr, 0, 1); } return chklantmpStr;
}
addAgent(key avid, string avlan, integer chklan) {
integer avliPos; integer idNum; if (~llListFindList(agentsInTranslation, (list)avid)) { avliPos = llListFindList(agentsInTranslation, (list)avid); agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, chklan], avliPos + 1, avliPos + 2); } else { @at; idNum = llRound(llFrand(2000000)) + 1; if(~llListFindList(agentsInTranslation, (list)idNum)) { jump at; } agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, chklan, idNum]; // llMessageLinked(LINK_THIS, 64562349, avlan, avid); }
}
string addNewAgent(key newavid) {
string speakerLan; if (llGetAgentSize(newavid) != ZERO_VECTOR) { speakerLan = checkLanguage(llGetAgentLanguage(newavid)); if (speakerLan == "") { speakerLan = "en"; addAgent(newavid, speakerLan, 0); } else { addAgent(newavid, speakerLan, 0); } } return speakerLan;
}
key getAgentKey(integer agentID) {
if(~llListFindList(agentsInTranslation, (list)agentID)) { integer gkliPos = llListFindList(agentsInTranslation, (list)agentID); return llList2Key(agentsInTranslation, gkliPos - 3); } else { return ""; }
}
processHTTPResponse(integer ntype, string bodyStr, list httli) {
integer spkliPos; list recepientList; key recepientID; string recepientLanguage; string languagePair; key speakerID; string speakerName; string speakerLanguage; string translatedText; string lantmpStr; integer z; list paramtmpli; //=================== //Process Translation //=================== speakerID = llList2Key(httli, 1); speakerName = llKey2Name(speakerID); if (speakerName == "") { speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0); } recepientList = llParseString2List(llList2String(httli, 2), ["@"], []); paramtmpli = llParseStringKeepNulls(llList2String(httli, 3), ["|"],[]); recepientLanguage = llList2String(paramtmpli, 1); languagePair = llDumpList2String(paramtmpli, ">>"); //Perform Text Cleanup translatedText = llGetSubString(bodyStr, llSubStringIndex(bodyStr, "{\"translatedText\":\"") + 18, llSubStringIndex(bodyStr, "\",\"detectedSourceLanguage\":\"")); //Reverse order if Recepient Language is Hebrew or Arabic if ((recepientLanguage == "iw") || (recepientLanguage == "ar")) { lantmpStr = ""; for(z = llStringLength(translatedText);z >= 0; z--) { lantmpStr = (lantmpStr="") + lantmpStr + llGetSubString(translatedText, z, z); } translatedText = lantmpStr; } lantmpStr = speakerName + "(" + languagePair + "): " + translatedText; if (showTranslation) { sendIM(speakerID, lantmpStr); } for (z = 0; z < llGetListLength(recepientList); z += 1) { recepientID = getAgentKey(llList2Integer(recepientList, z)); if (recepientID != "") { recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, [recepientID]) + 1); if (recepientLanguage != speakerLanguage) { sendIM(recepientID, lantmpStr); } } } return;
}
default {
state_entry() { llSetTimerEvent(5); } link_message(integer sender_num, integer num, string lstr, key lid) { list ltmpli; if (num == 8434532) { enabled = (integer)lstr; } else if (num == 3342976) { //Send Preferences options = lstr; if (isInitialized == FALSE) return; ltmpli = llCSV2List(options); showTranslation = llList2Integer(ltmpli, 0); tranObjects = llList2Integer(ltmpli, 1); autoLanguage = llList2Integer(ltmpli, 2); } } sensor(integer num_detected) { integer s; key sid; for (s = 0; s < num_detected; s += 1) { sid = llDetectedKey(s);
if (~llListFindList(agentsInTranslation, (list)sid)) { }
else { addNewAgent(sid); } } }
no_sensor() { }
listen(integer channel, string name, key id, string message) { integer w; string spkrLan; string recepLan; integer recepID; integer lstliPos; string lanpair; list translationCache; //Translator Engine Code if ((!enabled) && (isMaster == 1)) { return; } if (!tranObjects) { if (llGetAgentSize(id) == ZERO_VECTOR) { return; } else { detectLanguage(message, id); } } else { detectLanguage(message, id); } if (~llListFindList(agentsInTranslation, (list)id)) { lstliPos = llListFindList(agentsInTranslation, (list)id); spkrLan = llList2String(agentsInTranslation, lstliPos + 1); } else { spkrLan = addNewAgent(id); } //=============================== //Formulate Translation Requests //=============================== if (id == llGetOwner())
{ // If speaker is owner // I will do this dirty cheat by now // There should exist another clean way to filter speakers & receivers, I need to think about this
for (w = 0; w < llGetListLength(agentsInTranslation); w += 4) { //Loop through translation group and do appropriate translations as needed recepID = llList2Integer(agentsInTranslation, w + 3); recepLan = checkLanguage(llList2String(agentsInTranslation, w + 1)); if (spkrLan != recepLan) { lanpair = spkrLan + "|" + recepLan; if (~llListFindList(translationCache, (list)lanpair)) { lstliPos = llListFindList(translationCache, (list)lanpair); translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + "@" + (string)recepID], lstliPos + 1, lstliPos + 1); } else { translationCache = (translationCache=[]) + translationCache + [lanpair, recepID]; } } } if (translationCache != []) { //Process Requests for (w = 0; w < llGetListLength(translationCache); w += 2) { //==================================== //Translation //==================================== //Forumulate and Send Translation Request lanpair = "|" + llList2String(llParseStringKeepNulls(llList2String(translationCache, w), ["|"],[]), 1); Translate(0, llEscapeURL(message) + "&langpair=" + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, w + 1), llList2String(translationCache, w)]); } } } else { // if speaker is not owner lstliPos = llListFindList(agentsInTranslation, (list)llGetOwner()); recepID = llList2Integer(agentsInTranslation, lstliPos + 3); recepLan = checkLanguage(llList2String(agentsInTranslation , lstliPos + 1 )); if (spkrLan != recepLan) { lanpair = spkrLan + "|" + recepLan; if (~llListFindList(translationCache, (list)lanpair)) { lstliPos = llListFindList(translationCache, (list)lanpair); translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lstliPos + 1) + "@" + (string)recepID], lstliPos + 1, lstliPos + 1); } else { translationCache = (translationCache=[]) + translationCache + [lanpair, recepID]; } if (translationCache != []) { //==================================== //Translation //==================================== //Forumulate and Send Translation Request lanpair = "|" + llList2String(llParseStringKeepNulls(llList2String(translationCache, lstliPos), ["|"],[]), 1); Translate(0, llEscapeURL(message) + "&langpair=" + llEscapeURL(lanpair), [llGetTime(), id , llList2String(translationCache, lstliPos + 1), llList2String(translationCache, lstliPos)]); } } } } http_response(key request_id, integer status, list metadata, string body) { //Process Response Code integer httliPos; string htttmpStr; if (~llListFindList(requestedTranslations, (list)request_id)) { httliPos = llListFindList(requestedTranslations, [request_id]); processHTTPResponse(0, body, llCSV2List(llList2String(requestedTranslations, httliPos + 1))); requestedTranslations = llDeleteSubList(requestedTranslations, httliPos, httliPos + 1); return; } if (~llListFindList(tempDetections, (list)request_id))
{ // We Trust the Google system, the Google´s guys are good and I am sure they will keep improving :-)
integer tmpliPos = llListFindList(tempDetections, (list)request_id); key speakerID = llList2Key(tempDetections, tmpliPos + 1); tempDetections = llDeleteSubList(tempDetections, tmpliPos, tmpliPos + 3); string tmptmpStr = llToLower(llGetSubString(body, llSubStringIndex(body, "{\"language\":\"") + 13, llSubStringIndex(body, "\",\"isReliable\":") - 1));
if ( tmptmpStr != "" && contains(tmptmpStr, "err") == 0 && contains(tmptmpStr, "unn") == 0 ) { // if detects any language tmptmpStr = checkLanguage(tmptmpStr);
if (~llListFindList(agentsInTranslation, (list)speakerID)) { integer tmpavliPos = llListFindList(agentsInTranslation, (list)speakerID); string actlan = llList2String(agentsInTranslation, tmpavliPos + 1); if (actlan != tmptmpStr) { // if language of speaker is not the same as detected language agentsInTranslation = llListReplaceList(agentsInTranslation,[llList2Integer(agentsInTranslation,tmpavliPos + 2) + 1] , tmpavliPos + 2, tmpavliPos + 2); } else { // reset language checker for speaker agentsInTranslation = llListReplaceList(agentsInTranslation,[0], tmpavliPos + 2, tmpavliPos + 2); }
if (llList2Integer(agentsInTranslation,tmpavliPos + 2) >= 3) { // if anyone speaks on any language 3 times in a row
addAgent(speakerID, tmptmpStr, 0); } } } } }
timer()
{
llSetTimerEvent(0.0); // we better reset timer by way of precaution if (isInitialized == FALSE) { enabled = TRUE; listenID = llListen(0, "", "", ""); llMessageLinked(LINK_THIS, 6877259, (string)enabled, NULL_KEY); isInitialized = TRUE; string mylanguage = llGetAgentLanguage(llGetOwner()); if (llStringLength(mylanguage) < 1) { mylanguage = "en";
} if(~llListFindList(agentsInTranslation, (list)llGetOwner()) { integer ownerliPos = llListFindList(agentsInTranslation, (list)llGetOwner()); agentsInTranslation = llListReplaceList(agentsInTranslation,[mylanguage] , ownerliPos + 1, ownerliPos + 1); } else { agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [llGetOwner() , mylanguage , 0 , llRound(llFrand(2000000)) + 1]; }
} integer r; string tmrtmpStr; list tmrnewli; integer x; list newList; float timeElapsed; for (x = 0; x < llGetListLength(tempDetections); x += 2) {
timeElapsed = llGetTime() - llList2Float(llCSV2List(llList2String(tempDetections, x + 1)), 0); if (timeElapsed < 60.0) { newList = (newList=[]) + newList + llList2List(tempDetections, x, x + 1); }
} tempDetections = newList; newList = []; for (x = 0; x < llGetListLength(requestedTranslations); x += 2) { timeElapsed = llGetTime() - llList2Float(llCSV2List(llList2String(requestedTranslations, x + 1)), 0); if (timeElapsed < 60.0) { newList = (newList=[]) + newList + llList2List(requestedTranslations, x, x + 1); } } requestedTranslations = newList; if (isMaster > 0) { for (r = 0; r < llGetListLength(agentsInTranslation); r += 4) { tmrtmpStr = llList2String(llGetObjectDetails(llList2Key(agentsInTranslation, r), [OBJECT_POS]), 0); if ((llVecDist(llGetPos(), (vector)tmrtmpStr) <= 20.0) && (tmrtmpStr != "")) { tmrnewli = (tmrnewli=[]) + tmrnewli + llList2List(agentsInTranslation, r, r + 3); } } agentsInTranslation = tmrnewli; } if ((autoLanguage) && isMaster > 0) { llSensor("", NULL_KEY, AGENT, 20.0, PI); } llSetTimerEvent(4.0); // restart timer }
}
</lsl>