Okay, criticize away (Chaz cringes at the thought of everything he's doing wrong -- I've only been at this scripting stuff really for about a month.)
[1] NOTECARD
referred to in script below as "glossary"
looks like this. Each line has same term in 4 different languages.
[CODE
]AdminNo=You are not an administrator, Vous n'etes pas administrateur, Sie sind nicht ein Verwalter, Non siete un amministratore
AdminMode=Open in maintenance mode. Click to close when done, Ouvert pour travail. Clicquer quand fini., Offnet fur Arbeit. Linksklicken zu schliessen, Aperto per lavoro. Clica per chiudere
Admins=Administrators, Administrateurs, Verwaltern, Amministratori
[/CODE
]etc.
[2] SCRIPT
[PHP
]//___________________ Variables
string CardNameLang = ".Language";
string CardName = "~glossary";
key LangRequest;
key Request;
integer tI;
integer x;
integer i;
string Action;
string Lang;
string LangParam = "Language=";
integer linkmsgnum;
string linkmsgstr;
key linkmsgkey;
list TempList;
string linksender;
string LangProper;
string msgtmp;
list ParamsList;
integer ParamsListCount;
string Resend;
list TermsList;
string tmp02;
list tmp03;
string tmp04;
string AccessNo;//for buttons
string AdminAsk; //~for menu
string AdminNo; //~for menu
string AdminMode;
string Admins; //~for menu, doors
string BaseNo; //for ~config
string BtnDone;//for buttons
string BtnGo; //for buttons
string BtnPressed; //for buttons
string BtnSound; //for buttons
string BtnSoundNo; //for buttons
string CarDone;//for ~cpu
string CfgCard; //for ~cpu, ~config
string CpuDone; //for ~cpu, ~config
string CpuGo; //for ~cpu, ~config
string DataDone; //for ~config
string DefaultSpeed; //for ~config
string DoorDone; //for doors
string DoorSound; //for doors
string ElvCome; //for buttons
string ElvFlrDsp;
string ElvID; //~for menu
string FlrHeightMatch; //for ~config
string FlrHere; //for ~move
string FlrNo;//for ~cpu
string FlrNumNo; //for buttons & doors
string FlrReq;//for ~cpu
string ForFlr; //for buttons & doors
string GoBtnCfg;//for ~cpu
string GoCar; //for ~config
string GoCfg; //for ~config
string GoDoorCfg;//for ~cpu
string HeightsNo; //for ~config
string Here; //for ~move
string MemoryAdded;//for ~memory
string MenuConfirm; //for ~menu
string MenuDone; //for ~menu
string MenuHeader; //~for menu
string PermsDone; //for ~cpu
string PermsGo; //for ~config
string Pos; //for ~menu
string RightGrp;//for ~cpu
string SetFor;//for doors & buttons
string TimeOut; //~for menu
string TransDone; //~for here
string tmpac;
string tmpbtnonboard;
string tmpconfig;
string tmpcpu;
string tmpcpudoors;
string tmpcpubtnremote;
string tmpelevatorfloordisplay;
string tmpmemory;
string tmpmenu;
string tmpmove;
//had to do separate and concatenate later, even tho was nowhere near theoretical list max.
list ParamsListDefault1 = ["AccessNo=","AdminAsk=","AdminNo=", "AdminMode=", "Admins=", "BaseNo=", "BtnDone=", "BtnGo=", "BtnPressed=", "BtnSound=", "BtnSoundNo=", "CarDone=", "CfgCard=", "CpuDone=", "CpuGo=","DataDone=", "DefaultSpeed=", "DoorDone=", "DoorSound=", "ElvCome=", "ElvFlrDsp=", "ElvID=", "FlrHeightMatch=", "FlrHere=", "FlrNo=", "FlrNumNo=", "FlrReq=", "ForFlr="];
list ParamsListDefault2 = ["GoBtnCfg=", "GoCar=", "GoCfg=", "GoDoorCfg=", "HeightsNo=", "Here=" , "MemoryAdded=", "MenuConfirm=", "MenuDone=" , "MenuHeader=", "PermsDone=", "PermsGo=","Pos=", "RightGrp=", "SetFor=", "TimeOut=", "TransDone=" ];
//___________________ Functions
string GetValue( string sString )
{
integer iGo;
string sValue = "";
string sbValue = "";
iGo = llSubStringIndex( sString, "=" ) + 1;
if( iGo )
{
sValue = llGetSubString( sString, iGo, llStringLength(sString) - 1 );
if( sValue )
{
sbValue = llToLower( sValue );
if( sbValue == "true" )
sValue = "1";
if( sbValue == "false" )
sValue = "0";
return( sValue );
}
}
return(NULL_KEY);
}
integer StringLeftICompare( string sLeftMatch, string sLongString )
{
integer iLength;
iLength = llStringLength( sLeftMatch ) - 1;
if( llToLower(llGetSubString( sLongString, 0, iLength ) ) == llToLower(sLeftMatch) )
return( TRUE );
return( FALSE );
}
string str_replace(string source, string test, string replace)
{
list list_source = llParseString2List(source, [], [test]);
integer i;
string return_str = "";
for (i = 0; i < llGetListLength(list_source); i += 1) {
if (llList2String(list_source, i) == test) {
return_str += replace;
} else {
return_str += llList2String(list_source, i);
}
}
return return_str;
}
Translation () {
//tried to loop and virtualize all the following, but not possible to put Variables in a list
//http://forums.secondlife.com/showthread.php?t=202864
AccessNo=llList2String(TermsList, 0);
AdminAsk= llList2String(TermsList, 1);
AdminNo=llList2String(TermsList, 2);
AdminMode=llList2String(TermsList, 3);
Admins=llList2String(TermsList, 4);
BaseNo=llList2String(TermsList, 5);
BtnDone=llList2String(TermsList, 6);
BtnGo=llList2String(TermsList, 7);
BtnPressed=llList2String(TermsList,

;
BtnSound=llList2String(TermsList, 9);
BtnSoundNo=llList2String(TermsList, 10);
CarDone=llList2String(TermsList, 11);
CfgCard=llList2String(TermsList, 12);
CpuDone=llList2String(TermsList, 13);
CpuGo=llList2String(TermsList, 14);
DataDone=llList2String(TermsList, 15);
DefaultSpeed=llList2String(TermsList, 16);
DoorDone=llList2String(TermsList, 17);
DoorSound=llList2String(TermsList, 1

;
ElvCome=llList2String(TermsList, 19);
ElvFlrDsp=llList2String(TermsList, 20);
ElvID=llList2String(TermsList, 21);
FlrHeightMatch=llList2String(TermsList, 22);
FlrHere=llList2String(TermsList, 23);
FlrNo=llList2String(TermsList, 24);
FlrNumNo=llList2String(TermsList, 25);
FlrReq=llList2String(TermsList, 26);
ForFlr=llList2String(TermsList, 27);
GoBtnCfg=llList2String(TermsList, 2

;
GoCar=llList2String(TermsList, 29);
GoCfg=llList2String(TermsList, 30);
GoDoorCfg=llList2String(TermsList, 31);
HeightsNo=llList2String(TermsList, 32);
Here=llList2String(TermsList, 33);
MemoryAdded=llList2String(TermsList, 34);
MenuConfirm=llList2String(TermsList, 35);
MenuDone=llList2String(TermsList, 36);
MenuHeader=llList2String(TermsList, 37);
PermsDone=llList2String(TermsList, 3

;
PermsGo=llList2String(TermsList, 39);
Pos=llList2String(TermsList, 40);
RightGrp=llList2String(TermsList, 41);
SetFor=llList2String(TermsList, 42);
TimeOut=llList2String(TermsList, 43);
TransDone=llList2String(TermsList, 44);
tmpac = Lang + "##" + CfgCard + "##" + PermsGo + "##" + PermsDone;
tmpbtnonboard = Lang + "##" + BtnSound + "##" + BtnSoundNo + "##" + BtnGo + "##" + BtnPressed + "##" + BtnDone + "##" + CfgCard + "##" + ElvCome + "##" + FlrNumNo + "##" + ForFlr;
tmpconfig = Lang + "##" + DataDone + "##" + DefaultSpeed + "##" + FlrHeightMatch + "##" + GoCfg + "##" + BaseNo + "##" + HeightsNo + "##" + CfgCard;
tmpcpu = Lang + "##" + CpuGo + "##" + CpuDone + "##" + FlrNo + "##" + FlrReq + "##" + GoDoorCfg + "##" + RightGrp + "##" + GoBtnCfg + "##" + AccessNo;
//don't add lang to these 2 following remote, cpu adds it
tmpcpubtnremote = BtnSound + "##" + BtnSoundNo + "##" + BtnGo + "##" + BtnPressed + "##" + BtnDone + "##" + CfgCard + "##" + ElvCome + "##" + FlrNumNo + "##" + ForFlr;
tmpcpudoors = Admins + "##" + CfgCard + "##" + SetFor + "##" + DoorSound + "##" + DoorDone + "##" + ForFlr + "##" + FlrNumNo + "##" + AdminMode;
tmpelevatorfloordisplay = Lang + "##" + ElvFlrDsp + "##" + "";
tmpmenu = Lang + "##" + AdminNo + "##" + Admins + "##" + AdminAsk + "##" + ElvID + "##" + MenuHeader + "##" + Pos + "##" + TimeOut + "##" + MenuDone + "##" + MenuConfirm;
tmpmemory = Lang + "##" + MemoryAdded;
tmpmove = Lang + "##" + GoCar + "##" + Here + "##" + FlrHere + "##" + CarDone;
if (Resend == "Yes"

{
//llMessageLinked(LINK_SET, 200, Lang, llGetKey());
//llSay(0,"trans resend " + Lang);
llMessageLinked(LINK_THIS, 1300, tmpac, llGetKey());
llMessageLinked(LINK_THIS, 1503, tmpmenu, llGetKey());
llMessageLinked(LINK_THIS, 107, "Send Updated Info to Remotes", llGetKey()); //command to ~cpu
llMessageLinked(LINK_THIS, 101, tmpmemory, llGetKey());
llMessageLinked(LINK_THIS, 1415, tmpcpu, llGetKey());
llMessageLinked(LINK_THIS, 1418, tmpcpudoors, llGetKey());
llMessageLinked(LINK_THIS, 1419, tmpcpubtnremote, llGetKey());
llMessageLinked(LINK_THIS, 1628, tmpmove, llGetKey());
llMessageLinked(LINK_ALL_CHILDREN,1733,linksender + "##" + tmpbtnonboard, llGetKey());
llMessageLinked(LINK_ALL_CHILDREN, 1743, tmpelevatorfloordisplay, llGetKey());
llMessageLinked(LINK_THIS, 150, tmpconfig, llGetKey());
Resend = "";
//llSay(0,"translator sent out new translations " + Lang);
}
llWhisper(0,TransDone);
TermsList = [];
}
LangSwitch() {
if (Lang == "French"

{
LangProper = "Francais";
x = 1;
}
else if (Lang == "German"

{
LangProper = "Deutsch";
x = 2;
}
else if (Lang == "Italian"

{
x = 3;
LangProper = "Italiano";
}
else {
//English or default
LangProper = "English";
x = 0;
}
}
analyse_linkmsg(integer linkmsgnum, string linkmsgstr,key linkmsgkey) {
linksender = (string)linkmsgkey;
integer tmp01;
integer dest;
//this script sends out messages in the 1000s to identify it, thus 1000 added to request channel
list channels = [1, 300, 415, 418, 419, 503, 628, 743, 832];
list msgs = [tmpmemory, tmpac, tmpcpu, tmpcpudoors, tmpcpubtnremote, tmpmenu, tmpmove, tmpelevatorfloordisplay, linksender + "##" + tmpbtnonboard];
for (i = 0; i <= llGetListLength( channels ) + 1; i++) {
tmp01 = llList2Integer(channels, i);
if (tmp01 == linkmsgnum) {
tmp02 = llList2String(msgs,i);
if (linkmsgnum == 1) {
dest = 101;
}
else {
dest = 1000 + linkmsgnum;
}
llMessageLinked(LINK_SET, dest, tmp02, llGetKey());
}
}
tmp02 = "";
msgs = [];
}
//___________________States
default
{
state_entry()
{
if(llGetInventoryType(CardNameLang) == INVENTORY_NONE) {
llWhisper(0,CfgCard + ": " + CardNameLang);
return;
}
else {
LangRequest = llGetNotecardLine(CardNameLang, tI = 0 );
}
}
on_rez(integer p) {
llResetScript();
}
dataserver( key myLangQuery, string sData ) {
if ( LangRequest == myLangQuery ) {
//llSay(0, "starting language data query"

;
if ( sData == EOF ) {
LangRequest = "";
sData = "";
state translate;
}
else {
if (llGetSubString(sData, 0 ,0) != "#" && llStringTrim(sData, STRING_TRIM) != ""

{
sData = llStringTrim(sData, STRING_TRIM);
if( StringLeftICompare(LangParam, sData) ) {
Lang = llStringTrim((string)GetValue( sData ),STRING_TRIM);
//being cautious here in case user type francais vs Francais. if they used an accent despite instructions not to, oh well.
if ((Lang == LangParam) || (Lang == ""

) {
Lang = "English";
}
else if (llToLower(Lang) == "deutsch"

{
Lang = "German";
}
else if (llToLower(Lang) == "francais"

{
Lang = "French";
}
else if (llToLower(Lang) == "italiano"

{
Lang = "Italian";
}
else{
Lang = "English";
}
}
}
LangRequest = llGetNotecardLine( CardNameLang, ++tI );
}
}
}
}
state translate {
state_entry() {
LangSwitch();
llWhisper(0,"Initialisation...." + LangProper);
if(llGetInventoryType(CardName) == INVENTORY_NONE) {
return;
}
else {
//from start. List of all the string=terms to be looked up
ParamsList = ParamsListDefault1 + ParamsListDefault2;
ParamsListCount = llGetListLength( ParamsList ) + 1;
Request = llGetNotecardLine(CardName, tI = 0 );
}
}
dataserver( key myQuery, string sData ) {
if ( Request == myQuery ) {
//llSay(0, "starting params query"

;
//desperate attempt to release memory
if ( sData == EOF ) {
ParamsList = [];
Request = "";
tmp03 = [];
tmp04 = "";
sData = "";
state ready;
}
else {
for (i = 0; i <= ParamsListCount; i++) {
string tmp01 = llList2String(ParamsList, i);
//string tmp02 = llStringTrim(str_replace(tmp01, "=",""

,STRING_TRIM);
//llSay(0,(string)i);
//llSay(0, "looking for" + tmp01);
if (llGetSubString(sData, 0 ,0) != "#" && llStringTrim(sData, STRING_TRIM) != ""

{
sData = llStringTrim(sData, STRING_TRIM);
if( StringLeftICompare(tmp01, sData) ) {
tmp03 = llCSV2List((string)GetValue( sData ));
tmp04 = llList2String(tmp03,x);
TermsList = (TermsList=[]) + TermsList + tmp04;
ParamsList = llDeleteSubList(ParamsList, i, i);
jump Next;
}
}
}
@ Next;
Request = llGetNotecardLine( CardName, ++tI );
}
}
}
}
state ready {
state_entry() {
//llSay(0,llDumpList2String(TermsList, " + "

);
Translation();
llSay(0, "trans memory at startup: " + (string)llGetFreeMemory());
//llSay(0,Lang);
if (Action != "Language Switch"

{
llMessageLinked(LINK_THIS,150,tmpconfig,NULL_KEY);
llMessageLinked(LINK_THIS,108,tmpmemory,NULL_KEY);
}
}
link_message(integer sender_num, integer num, string str, key id){
//llSay(0,(string)num + " from " + (string)sender_num + " saying " + str);
linkmsgnum = num;
linkmsgstr = str;
linkmsgkey = id;
if (linkmsgnum == 500) {
//from menu.
//all separate translation linkmsg deliveries need to be bundled as well
//at end of translation. Linkmsgnum of 500 means that someone has changed
//language via menu so fresh translations have to be sent out
TempList = llParseStringKeepNulls(str,["##"],[]);
Action = llList2String(TempList, 0);
//llSay(0, "Action" + Action);
Lang = llList2String(TempList, 1);
//llSay(0,"translator heard " + (string)100);
Resend = "Yes";
state translate;
}
else {
analyse_linkmsg(linkmsgnum,linkmsgstr,linkmsgkey);
}
}
}
[/PHP
]