Difference between revisions of "User talk:Perry Mizin"

From Second Life Wiki
Jump to navigation Jump to search
Line 56: Line 56:


THIS IS THE TRANSLATOR "mess" by now... I need to redo some things
THIS IS THE TRANSLATOR "mess" by now... I need to redo some things
'''THE CODE BELOW IS NOT TESTED'''


 
agentsinTranslation
<lsl>
<lsl>
//Personal Translator (Mod made in Perry Mizin)
//Personal Translator (Mod made in Perry Mizin)
//Universal Translator
//Universal Translator
//Version 1.9.0
//Version 1.9.0
//November 12, 2009
//December 25, 2009
//LSL Script copyright 2006-2009 by Hank Ramos
//LSL Script copyright 2006-2009 by Hank Ramos
//Translation Web Services powered by Google
//Translation Web Services powered by Google
//Spell Checker Web Services powered by Yahoo
//Spell Checker Web Services powered by Yahoo
//Variables
list requestedTranslations;
list tempDetections;
list agentsInTranslation;
list agentsInTranslation;
list spellchecks;
integer isInitialized = FALSE;
list corrections;
integer M = 1;
integer listenID;
integer listenID;
integer isMaster = 1;
integer isMaster = 1;
integer autoLanguage = TRUE;
integer autoLanguage = TRUE;
integer enabled = FALSE;
integer enabled = FALSE;
integer showTranslation = FALSE;
string SEPARATOR = "|%&|"; // for transmitting lists via linked messages
integer tranObjects = TRUE;
integer M = 1;
integer isInitialized = FALSE;
 
string  options;
sendIM(key imid, string imstr)
string tempcorrection;
key tempValue;
// Functions
integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex
{
{
    return ~llSubStringIndex(haystack, needle);
// llInstantMessage(key id , string message) causes the script to sleep for 2 seconds
if (llGetAgentSize(imid) == ZERO_VECTOR)
{ }
else
{
if (imid != llGetOwner())
{
llOwnerSay(imstr + " @" + llKey2Name(imid));  // llOwnerSay(string message) has no delay
}
}
if (M == 8)
{
llMessageLinked(LINK_THIS, 2334420, imstr, imid);
M = 1;
}
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;
}
}
}


sendIM(key imid, string imstr)
 
string checkLanguage(string chklantmpStr)
{
{
    // llInstantMessage(key id , string message) causes the script to sleep for 2 seconds
if (chklantmpStr == "")
    if (llGetAgentSize(imid) == ZERO_VECTOR)
{
    { }
chklantmpStr = "en";
    else
}
    {
else if (chklantmpStr == "und")
        if (imid != llGetOwner())
{
        {
chklantmpStr = "el";
            llOwnerSay(imstr + " @" + llKey2Name(imid));  // llOwnerSay(string message) has no delay
}
        }
else if (chklantmpStr == "Gh")
    }
{
    if (M == 8)
chklantmpStr = "en";
    {
}
        llMessageLinked(LINK_THIS, 2334420, imstr, imid);
if (llGetSubString(chklantmpStr, 0, 1) == "zh")
        M = 1;
{
    }
chklantmpStr = "zh-CN";
    else if (M == 7)
}
    {
else
        llMessageLinked(LINK_THIS, 2334430, imstr, imid);
{
        M = 8;
chklantmpStr = llGetSubString(chklantmpStr, 0, 1);
    }
}
    else if (M == 6)
return chklantmpStr;
    {
        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;
    }
}
}


DetectLanguage(string dtcmsg, key dtcid)
addAgent(key avid, string avlan, integer chklan)
{
{
    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"], " ");
integer avliPos;
    if (tempValue != NULL_KEY)
integer idNum;
    {
if (~llListFindList(agentsInTranslation, (list)avid))
        tempDetections = (tempDetections=[]) + tempDetections + [tempValue, dtcid];
{
    }
avliPos = llListFindList(agentsInTranslation, (list)avid);
agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, avlan, chklan], avliPos + 1, avliPos + 3);
}
else
{
@at;
idNum = llRound(llFrand(2000000)) + 1;
if(~llListFindList(agentsInTranslation, (list)idNum))
{
jump at;
}
agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, avlan, chklan, idNum]; // llMessageLinked(LINK_THIS, 64562349, avlan, avid);
}
}
}


CheckSpell(integer splnum, string splmsg)
string addNewAgent(key newavid)
{
{
    key spellValue;
string speakerLan;
    spellValue = llHTTPRequest("http://search.yahooapis.com/WebSearchService/V1/spellingSuggestion?appid=DNPjiabV34EOgXQ3kAu6.d7kf6v.JUGCn1bFUcSTFMSGCyCy_ALzbepYstlI7DrOGP0-&query=" + splmsg, [HTTP_METHOD, "GET", HTTP_MIMETYPE, "plain/text;charset=utf-8"], "");
if (llGetAgentSize(newavid) == ZERO_VECTOR)
    if (spellValue != NULL_KEY)
{
    {   // Translation
speakerLan = "en";
        spellchecks = (spellchecks=[]) + spellchecks + [spellValue, splnum];
addAgent(newavid, speakerLan, 4);
    }
}
else
{
speakerLan  = checkLanguage(llGetAgentLanguage(newavid));
if (speakerLan == "")
{
speakerLan = "en";
addAgent(newavid, speakerLan, 0);
}
else
{
addAgent(newavid, speakerLan, 0);
}
}
return speakerLan;
}
}


Translate(integer chkn, string chkmsg, list chkli)
key getAgentKey(integer agentID)
{
{
    key returnValue;
if(~llListFindList(agentsInTranslation, (list)agentID))
    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)
integer gkliPos = llListFindList(agentsInTranslation, (list)agentID);
    {   // Translation
return llList2Key(agentsInTranslation, gkliPos - 4);
        requestedTranslations = (requestedTranslations=[]) + requestedTranslations + [returnValue, llList2CSV(chkli)];
}
    }
else
    else
{
    {
return "";
        llSleep(25.0); // Something has gone horribly wrong, sleep 25 seconds to clear throttle
}
    }
}
}


string checkLanguage(string chklantmpStr)
string List2String(list input)
{ // converts list to a string
    return llDumpList2String(input, SEPARATOR);
}
 
list String2List(string inputstring)
{ // converts a separated string created with List2String back to a list
list output;
    output = llParseString2List(inputstring, [SEPARATOR], []); 
    return output;
}
 
default
{
state_entry()
{
llSetTimerEvent(1.0);
}
link_message(integer sender_num, integer num, string lstr, key lid)
{
integer w;
string  spkrLan;
string  recepLan;
integer recepID;
integer lnkliPos;
string  lanpair;
list    translationCache;
if (num == 6745676)
{
}
if (num == 9827491)
{
list txli = String2List(lstr);
key recepientID = getAgentKey(llList2Integer(txli,0));
string recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, (list)lid) + 1);
string speakerLanguage = llList2String(txli,1);
string txmessage = llList2String(txli,2);
if (recepientID != "")
{
if (recepientLanguage == speakerLanguage)
{ }
else
{
sendIM(lid,txmessage);
}
}
}
if (num == 6349160)
{
key speaker = lid;
string spkLan = lstr;
if (~llListFindList(agentsInTranslation, (list)speaker))
{
integer tmpavliPos = llListFindList(agentsInTranslation, (list)speaker);
string actlan = llList2String(agentsInTranslation, tmpavliPos + 1);
string tmplan = llList2String(agentsInTranslation, tmpavliPos + 2);
if (llList2Integer(agentsInTranslation, tmpavliPos + 3) >= 2)
{  // if anyone speaks on any different language 3 times in a row
addAgent(lid, lstr, 0);
}
if (actlan == lstr)
{  // reset language checker for speaker
agentsInTranslation = llListReplaceList(agentsInTranslation, [actlan, 0], tmpavliPos + 2, tmpavliPos + 3);
}
else
{
if (lstr == tmplan)
{  // if language of speaker is not the same as detected language
agentsInTranslation = llListReplaceList(agentsInTranslation,[llList2Integer(agentsInTranslation,tmpavliPos + 3) + 1] , tmpavliPos + 3, tmpavliPos + 3);
}
else
{
agentsInTranslation = llListReplaceList(agentsInTranslation,[lstr, 0] , tmpavliPos + 2, tmpavliPos + 3);
}
}
}
 
}
if (num == 922)
{
for (w = 0; w < llGetListLength(agentsInTranslation); w += 5)
{  // Loop through translation group and do appropriate translations as needed
recepID = llList2Integer(agentsInTranslation, w + 4);
recepLan =  checkLanguage(llList2String(agentsInTranslation, w + 1));
if (spkrLan == recepLan)
{ }
else
{
lanpair = spkrLan + "|" + recepLan;
if (~llListFindList(translationCache, (list)lanpair))
{
lnkliPos = llListFindList(translationCache, (list)lanpair);
translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lnkliPos + 1) + "@" + (string)recepID], lnkliPos + 1, lnkliPos + 1);
}
else
{
translationCache = (translationCache=[]) + translationCache + [lanpair, recepID];
}
}
}
}
}
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)
{
if(~llListFindList(agentsInTranslation, (list)id))
{ }
else
{
addNewAgent(id);
}
}
 
timer()
{
integer r;
vector  tmrVct;
list  newList;
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, mylanguage , 0 , llRound(llFrand(2000000)) + 1];
}
}
if (isMaster > 0)
{
for (r = 0; r < llGetListLength(agentsInTranslation); r += 5)
{
tmrVct = llList2Vector(llGetObjectDetails(llList2Key(agentsInTranslation, r), [OBJECT_POS]), 0);
if (llVecDist(llGetPos(), tmrVct) <= 20.0)
{
newList = (newList=[]) + newList + llList2List(agentsInTranslation, r, r + 4);
}
}
agentsInTranslation = newList;
newList = [];
}
if ((autoLanguage) && isMaster > 0)
{
llSensor("", NULL_KEY, AGENT, 20.0, PI);
}
llMessageLinked(LINK_THIS,7659759,List2String(agentsInTranslation),NULL_KEY);
llSetTimerEvent(4.0);  // restart timer
}
}
 
</lsl>
 
 
CheckSpell-DetectLanguage
<lsl>
//Personal Translator (Mod made in Perry Mizin)
//Universal Translator
//Version 1.9.0
//December 25, 2009
//LSL Script copyright 2006-2009 by Hank Ramos
//Translation Web Services powered by Google
//Spell Checker Web Services powered by Yahoo
key splValue;
key dtcValue;
integer autoLanguage = TRUE;
integer isMaster = 1;
integer enabled = TRUE;
integer showTranslation = TRUE;
integer tranObjects = TRUE;
integer SpellChecker = 1;
list tempDetections;
list spellchecks;
 
integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex
{
{
    if (chklantmpStr == "")
return ~llSubStringIndex(haystack, needle);
    {
        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)
DetectLanguage(string dtcmsg, key dtcid)
{
{
    integer avliPos;
dtcValue = 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"], " ");
    integer idNum;
llSleep(0.1);
    if (~llListFindList(agentsInTranslation, (list)avid))
if (dtcValue != NULL_KEY)
    {
{
        avliPos = llListFindList(agentsInTranslation, (list)avid);
tempDetections = (tempDetections=[]) + tempDetections + [dtcValue, dtcid];
        agentsInTranslation = llListReplaceList(agentsInTranslation, [avlan, avlan, chklan], avliPos + 1, avliPos + 3);
}
    }
else
    else
{
    {
llSleep(3.0); // Something has gone horribly wrong, sleep 3 seconds clear throttle
        @at;
}
        idNum = llRound(llFrand(2000000)) + 1;
        if(~llListFindList(agentsInTranslation, (list)idNum))
        {
            jump at;
        }
        agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, avlan, chklan, idNum];
        // llMessageLinked(LINK_THIS, 64562349, avlan, avid);
    }
}
}


string addNewAgent(key newavid)
CheckSpell(string splmsg, key splid)
{
{
    string speakerLan;
splValue = llHTTPRequest("http://search.yahooapis.com/WebSearchService/V1/spellingSuggestion?appid=DNPjiabV34EOgXQ3kAu6.d7kf6v.JUGCn1bFUcSTFMSGCyCy_ALzbepYstlI7DrOGP0-&query=" + llEscapeURL(splmsg), [HTTP_METHOD, "GET", HTTP_MIMETYPE, "plain/text;charset=utf-8"], "");
    if (llGetAgentSize(newavid) == ZERO_VECTOR)
llSleep(0.1);
    {
if (splValue != NULL_KEY)
        speakerLan = "en";
{   // Translation
        addAgent(newavid, speakerLan, 4);
spellchecks = (spellchecks=[]) + spellchecks + [splValue, splid, splmsg];
    }
}
    else
else
    {
{
        speakerLan  = checkLanguage(llGetAgentLanguage(newavid));
llSleep(3.0); // Something has gone horribly wrong, sleep 3 seconds clear throttle
        if (speakerLan == "")
}
        {
            speakerLan = "en";
            addAgent(newavid, speakerLan, 0);
        }
        else
        {
            addAgent(newavid, speakerLan, 0);
        }
    }
    return speakerLan;
}
}


key getAgentKey(integer agentID)
 
default
{
{
    if(~llListFindList(agentsInTranslation, (list)agentID))
state_entry()
    {
{
        integer gkliPos = llListFindList(agentsInTranslation, (list)agentID);
llListen(0,"","","");
        return llList2Key(agentsInTranslation, gkliPos - 4);
}
    }
 
    else
listen(integer channel, string name, key id, string message)
    {
{
        return "";
if ((!enabled) && (isMaster == 1))
    }
{
return;
}
if (!tranObjects)
{
if (llGetAgentSize(id) == ZERO_VECTOR)
{
return;
}
else
{
if (SpellChecker == 1)
{
CheckSpell(message, id);
}
else
{
llMessageLinked(LINK_THIS,98745920,message,id);
}
DetectLanguage(message, id);
}
}
else
{
if (SpellChecker == TRUE)
{
CheckSpell(message, id);
}
else
{
llMessageLinked(LINK_THIS,98745920,message,id);
}
DetectLanguage(message, id);
}
}
 
http_response(key request_id, integer status, list metadata, string body)
{  // Process Response Code
if (~llListFindList(spellchecks, (list)request_id))
{
integer splliPos = llListFindList(spellchecks, (list)request_id);
if(contains(body, "lt>") != 0)
{  // Yahoo Spell Checker correction
llMessageLinked(LINK_THIS, 98745920,llGetSubString(body, llSubStringIndex(body, "t>") + 2, llSubStringIndex(body, "</") - 1),llList2Key(spellchecks, splliPos + 1));
llOwnerSay(llGetSubString(body, llSubStringIndex(body, "t>") + 2, llSubStringIndex(body, "</") - 1));
spellchecks = llDeleteSubList(spellchecks,splliPos, splliPos + 2);
}
else
{
llMessageLinked(LINK_THIS,98745920,llList2String(spellchecks, splliPos + 2),llList2Key(spellchecks, splliPos + 1));
spellchecks = llDeleteSubList(spellchecks,splliPos, splliPos + 2);
}
}
if (~llListFindList(tempDetections, (list)request_id))
{  // Language Detection
integer tmpliPos = llListFindList(tempDetections, (list)request_id);
key speakerID = llList2Key(tempDetections, tmpliPos + 1);
tempDetections = llDeleteSubList(tempDetections, tmpliPos, tmpliPos + 3);
string htttmpStr = llToLower(llGetSubString(body, llSubStringIndex(body, "{\"language\":\"") + 13, llSubStringIndex(body, "\",\"isReliable\":") - 1));
if (contains(htttmpStr, "err") == 0 && contains(htttmpStr, "unn") == 0)
{  // We Trust the Google system, the Google´s guys are good and I am sure they will keep improving :-)
// Language Detected
llMessageLinked(LINK_THIS,6349160,htttmpStr,speakerID);
}
}
}
}
}


processHTTPResponse(integer ntype, string bodyStr, list httli)
</lsl>
 
 
Translator
<lsl>
//Personal Translator (Mod made in Perry Mizin)
//Universal Translator
//Version 1.9.0
//December 25, 2009
//LSL Script copyright 2006-2009 by Hank Ramos
//Translation Web Services powered by Google
//Spell Checker Web Services powered by Yahoo
integer tranObjects = TRUE;
integer SpellChecker = TRUE;
integer isMaster = 1;
integer enabled = FALSE;
key returnValue;
list requestedTranslations;
string SEPARATOR = "|%&|"; // for transmitting lists via linked messages
 
Translate(string chkmsg, list chkli)
{
{
    key    recepientID;
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"], "");
    key    speakerID;
if (returnValue != NULL_KEY)
    list    paramtmpli;
{   // Translation
    list    recepientList;
requestedTranslations = (requestedTranslations=[]) + requestedTranslations + [returnValue, llList2CSV(chkli)];
    string  recepientLanguage;
}
    string  languagePair;
else
    string  speakerName;
{
    string  speakerLanguage;
llSleep(25.0); // Something has gone horribly wrong, sleep 25 seconds to clear throttle
    string  translatedText;
}
    string  lantmpStr;
    integer z;
    //===================
    // 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;
    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)
            { }
            else
            {
                sendIM(recepientID, lantmpStr);
            }
        }
    }
    return;
}
}


default
processHTTPResponse(string bodyStr, list httli)
{
{
     state_entry()
key     recepientID;
    {
key    speakerID;
        llSetTimerEvent(5);
list    paramtmpli;
    }
list    recepientList;
string  recepientLanguage;
string  languagePair;
string  speakerName;
string  speakerLanguage;
string  translatedText;
string  lantmpStr;
integer z;
//===================
// 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;
for (z = 0; z < llGetListLength(recepientList); z += 1)
{
llMessageLinked(LINK_THIS,9827491, List2String( [ llList2Integer(recepientList, z), speakerLanguage , lantmpStr ] ),recepientID);
}
return;
}


    link_message(integer sender_num, integer num, string lstr, key lid)
string List2String(list input)
    {
{ // converts list to a string
        list ltmpli;
    return llDumpList2String(input, SEPARATOR);
        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)
list String2List(string inputstring)
    {
{ // converts a separated string created with List2String back to a list
        integer s;
list output;
        key sid;
    output = llParseString2List(inputstring, [SEPARATOR], []);  
        for (s = 0; s < num_detected; s += 1)
    return output;
        {
}
            sid = llDetectedKey(s);
            if (~llListFindList(agentsInTranslation, (list)sid))
            { }
            else
            {
                addNewAgent(sid);
            }
        }
    }


    no_sensor()
default
    { }
{
state_entry()
{
llSetTimerEvent(1.0);
}
link_message(integer sender_num, integer num, string lstr, key lid)
{
if (num == 2346017)
{
list txli = String2List(lstr);
Translate(llList2String(txli,0),[llGetTime(), lid, llList2String(txli,1),llList2Key(txli,2)]);
}
}
http_response(key request_id, integer status, list metadata, string body)
{  // Process Response Code
if (~llListFindList(requestedTranslations, (list)request_id))
{   // Translation
integer httliPos = llListFindList(requestedTranslations, (list)request_id);
processHTTPResponse(body, llCSV2List(llList2String(requestedTranslations, httliPos + 1)));
requestedTranslations = llDeleteSubList(requestedTranslations, httliPos, httliPos + 1);
return;
}


    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
        integer msgid = llRound(llFrand(2000000)) + 1;
        CheckSpell(msgid , llEscapeURL(message));
        llSleep(1.0);
        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 += 5)
            {    // Loop through translation group and do appropriate translations as needed
                recepID = llList2Integer(agentsInTranslation, w + 4);
                recepLan =  checkLanguage(llList2String(agentsInTranslation, w + 1));
                if (spkrLan == recepLan)
                { }
                else
                {
                    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
                if (~llListFindList(corrections, (list)msgid))
                {
                    message = llList2String(corrections, 1);
                    corrections = [];
                }
                else
                {
                    corrections = [];
                }
                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 + 4);
            recepLan =  checkLanguage(llList2String(agentsInTranslation , lstliPos + 1 ));
            if (spkrLan == recepLan)
            { }
            else
            {
                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)
timer()
    {   // Process Response Code
{
        integer httliPos;
llSetTimerEvent(0.0);
        if (~llListFindList(spellchecks, (list)request_id))
integer r;
        {
for (r = 0; r < llGetListLength(requestedTranslations); r += 2)
            if(contains(body, "lt>") != 0)
{
            {  // Yahoo Spell Checker correction
timeElapsed = llGetTime() - llList2Float(llCSV2List(llList2String(requestedTranslations, r + 1)), 0);
                integer httsplID = llList2Integer(spellchecks,  1);
if (timeElapsed < 20.0)
                corrections = (corrections=[]) + corrections + [httsplID, llGetSubString(body, llSubStringIndex(body, "t>") + 2, llSubStringIndex(body, "</") - 1)];
{
                llOwnerSay(llGetSubString(body, llSubStringIndex(body, "t>") + 2, llSubStringIndex(body, "</") - 1));
newList = (newList=[]) + newList + llList2List(requestedTranslations, r, r + 1);
                spellchecks = [];
}
            }
}
            else
requestedTranslations = newList;
            {
newList = [];
                spellchecks = [];
llSetTimerEvent(5.0);
            }
}
        }
}
        if (~llListFindList(requestedTranslations, (list)request_id))
</lsl>
        {  // Translation
            httliPos = llListFindList(requestedTranslations, (list)request_id);
            processHTTPResponse(0, body, llCSV2List(llList2String(requestedTranslations, httliPos + 1)));
            requestedTranslations = llDeleteSubList(requestedTranslations, httliPos, httliPos + 1);
            return;
        }
        if (~llListFindList(tempDetections, (list)request_id))
        {   // Language Detection
            integer tmpliPos = llListFindList(tempDetections, (list)request_id);
            key speakerID = llList2Key(tempDetections, tmpliPos + 1);
            tempDetections = llDeleteSubList(tempDetections, tmpliPos, tmpliPos + 3);
            string htttmpStr = llToLower(llGetSubString(body, llSubStringIndex(body, "{\"language\":\"") + 13, llSubStringIndex(body, "\",\"isReliable\":") - 1));
            if (contains(htttmpStr, "err") == 0 && contains(htttmpStr, "unn") == 0)
            {  // We Trust the Google system, the Google´s guys are good and I am sure they will keep improving :-)
                // Language Detected
                htttmpStr = checkLanguage(htttmpStr);
                if (~llListFindList(agentsInTranslation, (list)speakerID))
                {
                    integer tmpavliPos = llListFindList(agentsInTranslation, (list)speakerID);
string actlan = llList2String(agentsInTranslation, tmpavliPos + 1);
string tmplan = llList2String(agentsInTranslation, tmpavliPos + 2);
                    if (llList2Integer(agentsInTranslation, tmpavliPos + 3) >= 2)
                    {  // if anyone speaks on any different language 3 times in a row
                        addAgent(speakerID, htttmpStr, 0);
                    }
                    if (actlan == htttmpStr)
                    {  // reset language checker for speaker
                        agentsInTranslation = llListReplaceList(agentsInTranslation, [actlan, 0 ], tmpavliPos + 2, tmpavliPos + 3);
                    }
                    else
                    {
                        if ( htttmpStr == tmplan)
                        {  // if language of speaker is not the same as detected language
                            agentsInTranslation = llListReplaceList(agentsInTranslation,[llList2Integer(agentsInTranslation,tmpavliPos + 3) + 1] , tmpavliPos + 3, tmpavliPos + 3);
                        }
                        else
                        {
                            agentsInTranslation = llListReplaceList(agentsInTranslation,[htttmpStr, 0] , tmpavliPos + 2, tmpavliPos + 3);
                        }
                    }
                }
            }
        }
    }


    timer()
Formulator
    {
<lsl>
        integer r;
//Personal Translator (Mod made in Perry Mizin)
        vector  tmrVct;
//Universal Translator
        list  newList;
//Version 1.9.0
        float timeElapsed;
//December 25, 2009
        llSetTimerEvent(0.0);  // we better reset timer by way of precaution
//LSL Script copyright 2006-2009 by Hank Ramos
        if (isInitialized == FALSE)
//Translation Web Services powered by Google
        {
//Spell Checker Web Services powered by Yahoo
            enabled = TRUE;
list agentsInTranslation;
            listenID = llListen(0, "", "", "");
string SEPARATOR = "|%&|"; // for transmitting lists via linked messages
            llMessageLinked(LINK_THIS, 6877259, (string)enabled, NULL_KEY);
list String2List(string inputstring)
            isInitialized = TRUE;
{ // converts a separated string created with List2String back to a list
            string mylanguage = llGetAgentLanguage(llGetOwner());
list output;
            if (llStringLength(mylanguage) < 1)
    output = llParseString2List(inputstring, [SEPARATOR], []);  
            {
    return output;
                mylanguage = "en";
}
            }
string List2String(list input)
            if(~llListFindList(agentsInTranslation, (list)llGetOwner()))
{ // converts a list to a string
            {
    return llDumpList2String(input, SEPARATOR);
                integer ownerliPos = llListFindList(agentsInTranslation, (list)llGetOwner());
                agentsInTranslation = llListReplaceList(agentsInTranslation, [mylanguage] , ownerliPos + 1, ownerliPos + 1);
            }
            else
            {
                agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [llGetOwner() , mylanguage, mylanguage , 0 , llRound(llFrand(2000000)) + 1];
            }
        }
        for (r = 0; r < llGetListLength(tempDetections); r += 2)
        {
            timeElapsed = llGetTime() - llList2Float(llCSV2List(llList2String(tempDetections, r + 1)), 0);
            if (timeElapsed < 20.0)
            {
                newList = (newList=[]) + newList + llList2List(tempDetections, r, r + 1);
            }
        }
        tempDetections = newList;
        newList = [];
        for (r = 0; r < llGetListLength(requestedTranslations); r += 2)
        {
            timeElapsed = llGetTime() - llList2Float(llCSV2List(llList2String(requestedTranslations, r + 1)), 0);
            if (timeElapsed < 20.0)
            {
                newList = (newList=[]) + newList + llList2List(requestedTranslations, r, r + 1);
            }
        }
        requestedTranslations = newList;
        newList = [];
        if (isMaster > 0)
        {
            for (r = 0; r < llGetListLength(agentsInTranslation); r += 5)
            {
                tmrVct = llList2Vector(llGetObjectDetails(llList2Key(agentsInTranslation, r), [OBJECT_POS]), 0);
                if (llVecDist(llGetPos(), tmrVct) <= 20.0)
                {
                    newList = (newList=[]) + newList + llList2List(agentsInTranslation, r, r + 4);
                }
            }
            agentsInTranslation = newList;
            newList = [];
        }
        if ((autoLanguage) && isMaster > 0)
        {
            llSensor("", NULL_KEY, AGENT, 20.0, PI);
        }
        llSetTimerEvent(4.0);  // restart timer
    }
}
}


default
{
state_entry()
{
llSleep(0.5);
llMessageLinked(LINK_THIS,6745676,"",NULL_KEY);
}
link_message(integer sender_num, integer num, string lstr, key id)
{
if (num == 7659759)
{
agentsInTranslation = [];
agentsInTranslation = String2List(lstr);
}
if (num == 98745920)
{
integer w;
string  spkrLan;
string  recepLan;
integer recepID;
integer lstliPos;
string  lanpair;
list    translationCache;
//===============================
// Formulate Translation Requests
//===============================
for (w = 0; w < llGetListLength(agentsInTranslation); w += 5)
{    // Loop through translation group and do appropriate translations as needed
recepID = llList2Integer(agentsInTranslation, w + 4);
recepLan = llList2String(agentsInTranslation, w + 1);
if (spkrLan == recepLan)
{ }
else
{
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);
llMessageLinked(LINK_THIS,2346017,List2String( [llEscapeURL(lstr) + "&langpair=" + llEscapeURL(lanpair), llList2String(translationCache, w + 1), llList2String(translationCache, w)] ),id);
}
}
translationCache = [];
}
}


}
</lsl>
</lsl>

Revision as of 20:04, 24 December 2009

Bienvenid@

Hola, soy Perry Mizin y este será mi humilde intento de contribución al proyecto "Traductor Universal de Google" creado por Hank Ramos.

El siguiente código fué originálmente creado por Hank Ramos, empezaré modificando algunas funciones a mí manera... No ós 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 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? 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...

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. 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...

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 pero 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


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.

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.



ESTO ES EL TRADUCTOR "un lío" por ahora... Necesito rehacer algunas cosas

THIS IS THE TRANSLATOR "mess" by now... I need to redo some things THE CODE BELOW IS NOT TESTED

agentsinTranslation <lsl> //Personal Translator (Mod made in Perry Mizin) //Universal Translator //Version 1.9.0 //December 25, 2009 //LSL Script copyright 2006-2009 by Hank Ramos //Translation Web Services powered by Google //Spell Checker Web Services powered by Yahoo list agentsInTranslation; integer isInitialized = FALSE; integer listenID; integer isMaster = 1; integer autoLanguage = TRUE; integer enabled = FALSE; string SEPARATOR = "|%&|"; // for transmitting lists via linked messages integer M = 1;

sendIM(key imid, string imstr) { // llInstantMessage(key id , string message) causes the script to sleep for 2 seconds if (llGetAgentSize(imid) == ZERO_VECTOR) { } else { if (imid != llGetOwner()) { llOwnerSay(imstr + " @" + llKey2Name(imid)); // llOwnerSay(string message) has no delay } } if (M == 8) { llMessageLinked(LINK_THIS, 2334420, imstr, imid); M = 1; } 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; } }


string checkLanguage(string chklantmpStr) { if (chklantmpStr == "") { chklantmpStr = "en"; } else if (chklantmpStr == "und") { chklantmpStr = "el"; } else if (chklantmpStr == "Gh") { chklantmpStr = "en"; } 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, avlan, chklan], avliPos + 1, avliPos + 3); } else { @at; idNum = llRound(llFrand(2000000)) + 1; if(~llListFindList(agentsInTranslation, (list)idNum)) { jump at; } agentsInTranslation = (agentsInTranslation=[]) + agentsInTranslation + [avid, avlan, avlan, chklan, idNum]; // llMessageLinked(LINK_THIS, 64562349, avlan, avid); } }

string addNewAgent(key newavid) { string speakerLan; if (llGetAgentSize(newavid) == ZERO_VECTOR) { speakerLan = "en"; addAgent(newavid, speakerLan, 4); } else { 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 - 4); } else { return ""; } }

string List2String(list input) { // converts list to a string

   return llDumpList2String(input, SEPARATOR);

}

list String2List(string inputstring) { // converts a separated string created with List2String back to a list list output;

   output = llParseString2List(inputstring, [SEPARATOR], []);   
   return output;

}

default { state_entry() {

llSetTimerEvent(1.0); }

link_message(integer sender_num, integer num, string lstr, key lid) { integer w; string spkrLan; string recepLan; integer recepID; integer lnkliPos; string lanpair; list translationCache; if (num == 6745676) {

} if (num == 9827491) { list txli = String2List(lstr); key recepientID = getAgentKey(llList2Integer(txli,0)); string recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, (list)lid) + 1); string speakerLanguage = llList2String(txli,1); string txmessage = llList2String(txli,2); if (recepientID != "") { if (recepientLanguage == speakerLanguage) { } else { sendIM(lid,txmessage); } } } if (num == 6349160) { key speaker = lid; string spkLan = lstr; if (~llListFindList(agentsInTranslation, (list)speaker)) { integer tmpavliPos = llListFindList(agentsInTranslation, (list)speaker); string actlan = llList2String(agentsInTranslation, tmpavliPos + 1); string tmplan = llList2String(agentsInTranslation, tmpavliPos + 2); if (llList2Integer(agentsInTranslation, tmpavliPos + 3) >= 2) { // if anyone speaks on any different language 3 times in a row addAgent(lid, lstr, 0); } if (actlan == lstr) { // reset language checker for speaker agentsInTranslation = llListReplaceList(agentsInTranslation, [actlan, 0], tmpavliPos + 2, tmpavliPos + 3); } else { if (lstr == tmplan) { // if language of speaker is not the same as detected language agentsInTranslation = llListReplaceList(agentsInTranslation,[llList2Integer(agentsInTranslation,tmpavliPos + 3) + 1] , tmpavliPos + 3, tmpavliPos + 3); } else { agentsInTranslation = llListReplaceList(agentsInTranslation,[lstr, 0] , tmpavliPos + 2, tmpavliPos + 3); } } }


} if (num == 922) { for (w = 0; w < llGetListLength(agentsInTranslation); w += 5) { // Loop through translation group and do appropriate translations as needed recepID = llList2Integer(agentsInTranslation, w + 4); recepLan = checkLanguage(llList2String(agentsInTranslation, w + 1)); if (spkrLan == recepLan) { } else { lanpair = spkrLan + "|" + recepLan; if (~llListFindList(translationCache, (list)lanpair)) { lnkliPos = llListFindList(translationCache, (list)lanpair); translationCache = llListReplaceList(translationCache, [llList2String(translationCache, lnkliPos + 1) + "@" + (string)recepID], lnkliPos + 1, lnkliPos + 1); } else { translationCache = (translationCache=[]) + translationCache + [lanpair, recepID]; } } } } }

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) { if(~llListFindList(agentsInTranslation, (list)id)) { } else { addNewAgent(id); } }

timer() { integer r; vector tmrVct; list newList; 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, mylanguage , 0 , llRound(llFrand(2000000)) + 1]; } } if (isMaster > 0) { for (r = 0; r < llGetListLength(agentsInTranslation); r += 5) { tmrVct = llList2Vector(llGetObjectDetails(llList2Key(agentsInTranslation, r), [OBJECT_POS]), 0); if (llVecDist(llGetPos(), tmrVct) <= 20.0) { newList = (newList=[]) + newList + llList2List(agentsInTranslation, r, r + 4); } } agentsInTranslation = newList; newList = []; } if ((autoLanguage) && isMaster > 0) { llSensor("", NULL_KEY, AGENT, 20.0, PI); } llMessageLinked(LINK_THIS,7659759,List2String(agentsInTranslation),NULL_KEY); llSetTimerEvent(4.0); // restart timer } }

</lsl>


CheckSpell-DetectLanguage <lsl> //Personal Translator (Mod made in Perry Mizin) //Universal Translator //Version 1.9.0 //December 25, 2009 //LSL Script copyright 2006-2009 by Hank Ramos //Translation Web Services powered by Google //Spell Checker Web Services powered by Yahoo key splValue; key dtcValue; integer autoLanguage = TRUE; integer isMaster = 1; integer enabled = TRUE; integer showTranslation = TRUE; integer tranObjects = TRUE; integer SpellChecker = 1; list tempDetections; list spellchecks;

integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex { return ~llSubStringIndex(haystack, needle); }

DetectLanguage(string dtcmsg, key dtcid) { dtcValue = 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"], " "); llSleep(0.1); if (dtcValue != NULL_KEY) { tempDetections = (tempDetections=[]) + tempDetections + [dtcValue, dtcid]; } else { llSleep(3.0); // Something has gone horribly wrong, sleep 3 seconds clear throttle } }

CheckSpell(string splmsg, key splid) { splValue = llHTTPRequest("http://search.yahooapis.com/WebSearchService/V1/spellingSuggestion?appid=DNPjiabV34EOgXQ3kAu6.d7kf6v.JUGCn1bFUcSTFMSGCyCy_ALzbepYstlI7DrOGP0-&query=" + llEscapeURL(splmsg), [HTTP_METHOD, "GET", HTTP_MIMETYPE, "plain/text;charset=utf-8"], ""); llSleep(0.1); if (splValue != NULL_KEY) { // Translation spellchecks = (spellchecks=[]) + spellchecks + [splValue, splid, splmsg]; } else { llSleep(3.0); // Something has gone horribly wrong, sleep 3 seconds clear throttle } }


default { state_entry() { llListen(0,"","",""); }

listen(integer channel, string name, key id, string message) { if ((!enabled) && (isMaster == 1)) { return; } if (!tranObjects) { if (llGetAgentSize(id) == ZERO_VECTOR) { return; } else { if (SpellChecker == 1) { CheckSpell(message, id); } else { llMessageLinked(LINK_THIS,98745920,message,id); } DetectLanguage(message, id); } } else { if (SpellChecker == TRUE) { CheckSpell(message, id); } else { llMessageLinked(LINK_THIS,98745920,message,id); } DetectLanguage(message, id); } }

http_response(key request_id, integer status, list metadata, string body) { // Process Response Code if (~llListFindList(spellchecks, (list)request_id)) { integer splliPos = llListFindList(spellchecks, (list)request_id); if(contains(body, "lt>") != 0) { // Yahoo Spell Checker correction llMessageLinked(LINK_THIS, 98745920,llGetSubString(body, llSubStringIndex(body, "t>") + 2, llSubStringIndex(body, "</") - 1),llList2Key(spellchecks, splliPos + 1)); llOwnerSay(llGetSubString(body, llSubStringIndex(body, "t>") + 2, llSubStringIndex(body, "</") - 1)); spellchecks = llDeleteSubList(spellchecks,splliPos, splliPos + 2); } else { llMessageLinked(LINK_THIS,98745920,llList2String(spellchecks, splliPos + 2),llList2Key(spellchecks, splliPos + 1)); spellchecks = llDeleteSubList(spellchecks,splliPos, splliPos + 2); } } if (~llListFindList(tempDetections, (list)request_id)) { // Language Detection integer tmpliPos = llListFindList(tempDetections, (list)request_id); key speakerID = llList2Key(tempDetections, tmpliPos + 1); tempDetections = llDeleteSubList(tempDetections, tmpliPos, tmpliPos + 3); string htttmpStr = llToLower(llGetSubString(body, llSubStringIndex(body, "{\"language\":\"") + 13, llSubStringIndex(body, "\",\"isReliable\":") - 1)); if (contains(htttmpStr, "err") == 0 && contains(htttmpStr, "unn") == 0) { // We Trust the Google system, the Google´s guys are good and I am sure they will keep improving :-) // Language Detected llMessageLinked(LINK_THIS,6349160,htttmpStr,speakerID); } } } }

</lsl>


Translator <lsl> //Personal Translator (Mod made in Perry Mizin) //Universal Translator //Version 1.9.0 //December 25, 2009 //LSL Script copyright 2006-2009 by Hank Ramos //Translation Web Services powered by Google //Spell Checker Web Services powered by Yahoo integer tranObjects = TRUE; integer SpellChecker = TRUE; integer isMaster = 1; integer enabled = FALSE; key returnValue; list requestedTranslations; string SEPARATOR = "|%&|"; // for transmitting lists via linked messages

Translate(string chkmsg, list chkli) { 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(25.0); // Something has gone horribly wrong, sleep 25 seconds to clear throttle } }

processHTTPResponse(string bodyStr, list httli) { key recepientID; key speakerID; list paramtmpli; list recepientList; string recepientLanguage; string languagePair; string speakerName; string speakerLanguage; string translatedText; string lantmpStr; integer z; //=================== // 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; for (z = 0; z < llGetListLength(recepientList); z += 1) { llMessageLinked(LINK_THIS,9827491, List2String( [ llList2Integer(recepientList, z), speakerLanguage , lantmpStr ] ),recepientID); } return; }

string List2String(list input) { // converts list to a string

   return llDumpList2String(input, SEPARATOR);

}

list String2List(string inputstring) { // converts a separated string created with List2String back to a list list output;

   output = llParseString2List(inputstring, [SEPARATOR], []);   
   return output;

}

default { state_entry() { llSetTimerEvent(1.0); } link_message(integer sender_num, integer num, string lstr, key lid) { if (num == 2346017) { list txli = String2List(lstr); Translate(llList2String(txli,0),[llGetTime(), lid, llList2String(txli,1),llList2Key(txli,2)]); } } http_response(key request_id, integer status, list metadata, string body) { // Process Response Code if (~llListFindList(requestedTranslations, (list)request_id)) { // Translation integer httliPos = llListFindList(requestedTranslations, (list)request_id); processHTTPResponse(body, llCSV2List(llList2String(requestedTranslations, httliPos + 1))); requestedTranslations = llDeleteSubList(requestedTranslations, httliPos, httliPos + 1); return; }

}

timer() { llSetTimerEvent(0.0); integer r; for (r = 0; r < llGetListLength(requestedTranslations); r += 2) { timeElapsed = llGetTime() - llList2Float(llCSV2List(llList2String(requestedTranslations, r + 1)), 0); if (timeElapsed < 20.0) { newList = (newList=[]) + newList + llList2List(requestedTranslations, r, r + 1); } } requestedTranslations = newList; newList = []; llSetTimerEvent(5.0); } } </lsl>

Formulator <lsl> //Personal Translator (Mod made in Perry Mizin) //Universal Translator //Version 1.9.0 //December 25, 2009 //LSL Script copyright 2006-2009 by Hank Ramos //Translation Web Services powered by Google //Spell Checker Web Services powered by Yahoo list agentsInTranslation; string SEPARATOR = "|%&|"; // for transmitting lists via linked messages list String2List(string inputstring) { // converts a separated string created with List2String back to a list list output;

   output = llParseString2List(inputstring, [SEPARATOR], []);   
   return output;

} string List2String(list input) { // converts a list to a string

   return llDumpList2String(input, SEPARATOR);

}

default { state_entry() { llSleep(0.5); llMessageLinked(LINK_THIS,6745676,"",NULL_KEY); } link_message(integer sender_num, integer num, string lstr, key id) { if (num == 7659759) { agentsInTranslation = []; agentsInTranslation = String2List(lstr); } if (num == 98745920) { integer w; string spkrLan; string recepLan; integer recepID; integer lstliPos; string lanpair; list translationCache; //=============================== // Formulate Translation Requests //=============================== for (w = 0; w < llGetListLength(agentsInTranslation); w += 5) { // Loop through translation group and do appropriate translations as needed recepID = llList2Integer(agentsInTranslation, w + 4); recepLan = llList2String(agentsInTranslation, w + 1); if (spkrLan == recepLan) { } else { 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); llMessageLinked(LINK_THIS,2346017,List2String( [llEscapeURL(lstr) + "&langpair=" + llEscapeURL(lanpair), llList2String(translationCache, w + 1), llList2String(translationCache, w)] ),id); } } translationCache = []; } }

} </lsl>