/* ----------------------------------------------------------------------------- This source file is part of OpenSpace3D For the latest info, see http://www.openspace3d.com Copyright (c) 2014 I-maginer This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA, or go to http://www.gnu.org/copyleft/lesser.txt ----------------------------------------------------------------------------- */ var lFilter = "Scene"::"Arial"::"SkyBox"::"SkyDome"::"SkyPlane"::"FileSystem"::"Ogre/SceneRoot"::"V3DdefaultResources":: "user"::" Player"::"Player"::"Collada"::"val > "::" inst"::" inst("::" (SkyBox)"::" (SkyDome)"::" (SkyPlane)"::"Compositor \""::nil;; var lIgnoreFiles = "os3dload.pkg"::"translate.pkg"::"relocateProject.pkg"::"os3dversion.pkg"::"relocateProjectInit.pkg"::nil;; var lIgnoreFunctions = "/*!"::"var "::"XMLgetMark"::"_DMSevent"::"getPluginInstanceParam"::"PluginRegisterAction"::"SendPluginEvent"::nil;; var sClientId = "OS3Dtranslator";; var sClientKey = "qkATFHscU6kta6NAfjeLAZfjlez";; var iWinW = 400;; var iWinH = 120;; var lLangs = ["french" "fr"]:: ["english" "en"]:: ["german" "de"]:: ["japanese" "ja"]:: ["italian" "it"]:: ["spanish" "es"]:: ["chinese" "zh"]:: ["portuguese" "pt"]:: ["portuguese-Brazil" "pt-br"]:: ["russian" "ru"]::nil;; var iCountToTranslate = 0;; fun cDsMainWin(winstr)= _closemachine; 0;; proto getTranslation = fun [[[S r1] r1] W S S S S] I;; fun findLineStart(mcont, frompos)= let frompos -> spos in ( let nth_char mcont spos -> char in while (char != 10) && (char != 12) && (char != 13) do ( set spos = spos - 1; set char = nth_char mcont spos; ); spos; );; fun findLineEnd(mcont, frompos)= let frompos -> spos in ( let nth_char mcont spos -> char in while (char != 10) && (char != 13) && (char != 25) do ( set spos = spos + 1; set char = nth_char mcont spos; ); spos; );; fun filterFunctions(mcont, spos)= let findLineStart mcont spos -> linestart in let findLineEnd mcont spos -> lineend in let sizelist lIgnoreFunctions -> size in let 0 -> i in let 0 -> found in ( while ((i < size) && !found) do ( //_fooS substr mcont linestart spos - linestart; let nth_list lIgnoreFunctions i -> funname in let strfind funname mcont linestart -> fpos in if (fpos == nil) || (fpos >= spos) then nil else ( set spos = lineend; set found = 1; ); set i = i + 1; ); spos; );; fun getQuotePos(mcont, pos)= let nil -> spos in let nil -> npos in let nil -> dpos in ( while (((set spos = (strfind (ctoa 34) mcont pos)) != nil) && (npos == nil)) do ( let filterFunctions mcont spos -> fpos in ( set pos = fpos + 1; //if ((nth_char mcont (spos -1)) == 92) then nil else if (fpos != spos) then nil else set npos = spos; ); ); set pos = npos + 1; if (npos == nil) then nil else while (((set spos = (strfind (ctoa 34) mcont pos)) != nil) && (dpos == nil)) do ( set pos = spos + 1; if (((nth_char mcont (spos -1)) == 92) && ((nth_char mcont (spos -2)) != 92)) then nil else // manage \ or \\ cases set dpos = spos; ); if (dpos == nil) then nil else [npos dpos]; );; fun filterText(mcont, sp, dp)= let substr mcont sp ((dp + 1) - sp) -> ftext in let substr ftext 1 (strlen ftext) - 2 -> ctext in if (((strlen ctext) < 2) || (!strcmp ctext " ") || ((atoi ctext) != 0) || ((atof ctext) != 0.0)) then nil else ( //_fooS strcatn (itoa sp)::" "::(itoa dp)::" "::ctext::nil; let (nth_char mcont sp - 1) -> prev in let (nth_char mcont sp + 1) -> snext in let (nth_char mcont dp + 1) -> next in let sizelist (strToListSep ctext " ") -> nbwords in let (strfind "APPBASEDIR" (substr mcont (sp - 12) 12) 0) != nil -> ispath in if (ispath) || (isStringInList lFilter ctext) || (!strcmp (substr ctext 0 4) "OS3D") || ((strfindi "*" ctext 0) != nil) || ((strfindi "_" ctext 0) != nil) || ((!strcmp ctoa snext (strlowercase (ctoa snext))) && (nbwords == 1))|| (!strcmp ctext (struppercase (strcat ctext ""))) || // hack to copy the string to allow uppercase comparizon (prev == 91) || ((prev == 58) && (nbwords == 1)) || (prev == 40) || (snext == 46) || (next == 93) || ((next == 58) && (nbwords == 1)) then nil else ftext; );; fun getFileTexts(file)= let _getpack _checkpack file -> mcont in let nil -> quotepos in let 0 -> pos in let nil -> ltext in ( while ((set quotepos = getQuotePos mcont pos) != nil) do ( let quotepos -> [sp dp] in let filterText mcont sp dp -> text in ( if (text == nil) then nil else set ltext = text::ltext; set pos = dp + 1; ); ); ltext; );; fun filterList(l, mask)= let nil -> fl in ( while (l != nil) do ( let hd l -> file in let getFileExt file -> ext in if (mask != nil) && !(isStringInListi mask ext) then nil else set fl = lcat fl file::nil; set l = tl l; ); fl; );; var nbDirsConverted = 0;; fun proceedPath(path, base)= let getlastPathDir path -> langbase in let getFilesFromDir path "pkg"::nil -> lfiles in let strcatn path::"/lang/"::langbase::".english.lang"::nil -> nfpath in let nil -> ltext in ( while (lfiles != nil) do ( let hd lfiles -> file in let getPathFile file nil -> [fdir fname] in if (isStringInListi lIgnoreFiles fname) then nil else ( let (getFileTexts file) -> ntext in if (ntext == nil) then nil else set ltext = lcat ntext ltext; ); //_storepack content path; set lfiles = tl lfiles; ); if (ltext == nil) then nil else ( let nil -> lref in let quicksort ltext @suppDoublonCaseSensivity -> sortedtext in let _getmodifypack nfpath -> wfile in ( _storepack "" nfpath; _appendpack "LANGUAGE english\n" wfile; _appendpack "LANGCODE en\n" wfile; let 1 -> n in let sizelist sortedtext -> size in while (sortedtext != nil) do ( let hd sortedtext -> text in let substr text 1 (strlen text) - 2 -> ctext in let if n < 10 then strcat "000" (itoa n) else if n < 100 then strcat "00" (itoa n) else if n < 1000 then strcat "0" (itoa n) else (itoa n) -> sn in let strcatn base::"_"::sn::nil -> tref in ( _appendpack strcatn tref::" "::ctext::"\n"::nil wfile; set lref = [text tref]::lref; set n = n + 1; ); set sortedtext = tl sortedtext; ); //load files again let getFilesFromDir path "pkg"::nil -> lfiles in while (lfiles != nil) do ( let hd lfiles -> file in let getPathFile file nil -> [fdir fname] in if ((isStringInListi lIgnoreFiles fname) || lref == nil) then nil else ( let _getpack _checkpack file -> mcont in ( let 0 -> i in let sizelist lref -> size in while (i < size) do ( let nth_list lref i -> [text tref] in let if (!strcmp (substr text ((strlen text) -2) 1) " ") then (strcatn "(strcat (loc \""::tref::"\") \" \")"::nil) else (strcatn "(loc \""::tref::"\")"::nil) -> code in ( set mcont = strreplace mcont text code; ); set i = i + 1; ); _storepack mcont file; ); ); set lfiles = tl lfiles; ); set nbDirsConverted = nbDirsConverted + 1; ); ); ); let _listofsubdir path -> ldirs in while (ldirs != nil) do ( let hd ldirs -> dir in let struppercase getlastPathDir dir -> dbase in proceedPath dir strcat "OS3D" dbase; set ldirs = tl ldirs; ); 0;; fun cbBtnProceed(ctrlbtn, ctrlpath)= let "OS3D" -> base in let getEdCtrlTextLineValue ctrlpath -> path in if ((strlen path) == 0) then nil else ( set nbDirsConverted = 0; proceedPath path base; //let filterList getFilesFromDirRecursive path "pkg"::nil -> lfiles in _DLGMessageBox _channel mainWindow.EDW_win "Done" strcatn (itoa nbDirsConverted)::" directories have been localized."::nil 0; 0; ); 0;; fun cbTranslated(url, data, p)= let p -> [wfile ref text flang lang lref translateurl access] in ( let XMLloadString data -> datastr in let strreplace utf8tostr (XMLgetData XMLgetMarkByValue datastr "string") "\n" "\\n" -> data in ( _appendpack strcatn ref::" "::data::"\n"::nil wfile; getTranslation lref wfile flang lang translateurl access; if (lref != nil) then nil else ( set iCountToTranslate = iCountToTranslate - 1; if (iCountToTranslate != 0) then nil else _DLGMessageBox _channel mainWindow.EDW_win "Done" "All translated." 0; ); XMLclose datastr; ); ); 0;; fun getAuthCode(data)= nth_list strToListSep data "\"" 7;; fun getTranslation(lref, wfile, flang, lang, translateurl, access)= let hd lref -> [ref ltext] in if (lref == nil) then nil else if (strcmpi ref "LANGUAGE") && (strcmpi ref "LANGCODE") then ( let strcatnSep ltext " " -> text in let switchstri lLangs lang -> slang in let switchstri lLangs flang -> fslang in let strcatn "text="::(strtoweb strtoutf8 addSlashes text)::"&to="::(slang)::"&from="::fslang::"&contentType=text/plain"::nil -> params in getUrlEx strcatn translateurl::"?"::params::nil nil (mkfun3 @cbTranslated [wfile ref text flang lang (tl lref) translateurl access]) access::nil 0; 0; ) else ( getTranslation tl lref wfile flang lang translateurl access; ); 0;; fun cbMSAuth(url, data, p)= let p -> [wfile lref flang lang] in let "http://api.microsofttranslator.com/v2/Http.svc/Translate" -> translateurl in let getAuthCode data -> authcode in let strcat "Authorization: Bearer " authcode -> access in ( //_DLGMessageBox _channel nil "debug" params 0; getTranslation lref wfile flang lang translateurl access; ); 0;; fun writeEnglish(lref, wfile, flang, lang)= if (lref == nil) then nil else let hd lref -> line in let strToListSep line " " -> [ref ltext] in ( if (!strcmpi ref "LANGUAGE") || (!strcmpi ref "LANGCODE") then nil else _appendpack strcatn ref::" "::(strcatnSep ltext " ")::"\n"::nil wfile; writeEnglish tl lref wfile flang lang; ); 0;; fun translate(lref, wfile, flang, lang)= let "https://datamarket.accesscontrol.windows.net/v2/OAuth2-13/" -> authurl in let strcatn "grant_type=client_credentials&scope="::(strtoweb "http://api.microsofttranslator.com")::"&client_id="::sClientId::"&client_secret="::sClientKey::nil -> params in postUrl authurl params mkfun3 @cbMSAuth [wfile lref flang lang]; 0;; fun translatePath(path, flang, lang, base)= let getlastPathDir path -> langbase in let strcatn path::"/lang/"::langbase::"."::flang::".lang"::nil -> deflangpath in let strcatn path::"/lang/"::langbase::"."::lang::".lang"::nil -> nlangpath in let switchstri lLangs lang -> slang in let strToListSep (_getpack _checkpack deflangpath) "\n" -> lref in //let strextr _getpack _checkpack deflangpath -> lref in if (lref == nil) || ((sizelist lref) == 1) then nil else let _getmodifypack nlangpath -> wfile in ( //_fooS strcat ">>>>>>>>>>>>> loc file : " deflangpath; _storepack "" nlangpath; _appendpack strcatn "LANGUAGE "::lang::"\n"::nil wfile; _appendpack strcatn "LANGCODE "::slang::"\n"::nil wfile; writeEnglish lref wfile flang lang; //translate lref wfile flang lang; ); let _listofsubdir path -> ldirs in while (ldirs != nil) do ( //_fooS strcat ">>>>>>>>>>>>> loc dir : " hd ldirs; let hd ldirs -> dir in let struppercase getlastPathDir dir -> dbase in translatePath dir flang lang strcat "OS3D" dbase; set ldirs = tl ldirs; ); 0;; fun countFilesToTranslate(path, lang)= let getlastPathDir path -> langbase in let strcatn path::"/lang/"::langbase::"."::lang::".lang"::nil -> deflangpath in let strextr _getpack _checkpack deflangpath -> lref in if (lref == nil) || ((sizelist lref) == 1) then nil else set iCountToTranslate = iCountToTranslate + 1; let _listofsubdir path -> ldirs in while (ldirs != nil) do ( let hd ldirs -> dir in countFilesToTranslate dir lang; set ldirs = tl ldirs; ); 0;; fun cbBtnTranslate(ctrlbtn, p)= let p -> [ctrlpath ctrllang] in let "english" -> flang in let "OS3D_" -> base in let getEdCtrlTextLineValue ctrlpath -> path in let getSelectedEdCtrlSelect ctrllang -> lang in if ((strlen path) == 0) then nil else ( set iCountToTranslate = 0; countFilesToTranslate path flang; translatePath path flang lang base; //_DLGMessageBox _channel mainWindow.EDW_win "Done" "All translated." 0; ); 0;; fun main()= _showconsole; let _GETdesktopSize -> [sw sh] in set mainWindow = crEdMainWindow _channel nil ((sw / 2) - (iWinW / 2)) ((sh / 2) - (iWinH / 2)) iWinW iWinH nil "OpenSpace3D Translation automation"; set mainWindow.EDW_modeFlag = mainWindow.EDW_modeFlag|EDWIN_GROUP; setEdwindowCbDestroy mainWindow @cDsMainWin; let 10 -> ypos in let iWinW -> iw in let iWinH -> ih in let crEdFrameWindow _channel mainWindow 0 0 iw ih EDWIN_RESIZE_MW nil "Paths" "Minimize / Restore" -> winfrm in let crEdWindow _channel winfrm 0 18 iw (ih - 20) WN_CHILDINSIDE|WN_NOBORDER EDWIN_RESIZE_MW nil nil -> winstr in let crEdCtrlLabel winstr 10 ((set ypos = 10) + 2) 180 20 "Directory path" nil -> labelx in let crEdCtrlTextLine winstr 195 ypos 170 20 "tools/os3deditor" nil EDWIN_RESIZE_MW -> ctrlpath in let crEdCtrlLabel winstr 10 ((set ypos = ypos + 25) + 2) 180 20 "Lang" nil -> labellang in let crEdCtrlSelect winstr 195 ypos 170 120 EDWIN_RESIZE_MW -> ctrllang in let crEdCtrlButton winstr((iw / 2) - 85) (ih - 45) 80 20 "Proceed" nil -> proceedbtn in let crEdCtrlButton winstr ((iw / 2) + 5) (ih - 45) 80 20 "Translate" nil -> translatebtn in ( let 0 -> i in let sizelist lLangs -> size in while (i < size) do ( let nth_list lLangs i -> [lang _] in addEdCtrlSelect ctrllang lang; set i = i + 1; ); setEdCtrlButtonCb proceedbtn mkfun2 @cbBtnProceed ctrlpath; setEdCtrlButtonCb translatebtn mkfun2 @cbBtnTranslate [ctrlpath ctrllang]; ); 0;;