diff options
-rw-r--r-- | tools/lpgen/translate.js | 236 | ||||
-rw-r--r-- | tools/lpgen/translate.js.bat | 2 |
2 files changed, 238 insertions, 0 deletions
diff --git a/tools/lpgen/translate.js b/tools/lpgen/translate.js new file mode 100644 index 0000000000..a8b000ed26 --- /dev/null +++ b/tools/lpgen/translate.js @@ -0,0 +1,236 @@ +//**********************************************************************************// +//* Name: translate.js *// +//* Language: JScript *// +//* Function: Parse Miranda-NG translation templates and get translated strings*// +//* Usage: cscript /nologo translate.js to run generation in batches *// +//* Usage: cscript /nologo translate.js /log:"yes" to enable console logging*// +//* Usage: cscript /nologo translate.js /path:"path\file" for one template *// +//* Author: BasiL *// +//**********************************************************************************// + +//Init Variables +//Create FileSystemObject FSO +var FSO=WScript.CreateObject("Scripting.FileSystemObject"); +//FileSystemObject vars +var ForReading=1; +var TristateUseDefault=-2; +var overwritefile=true; +var unicode=false; +//disabling log by default +var log="no" +//Path variables +var scriptpath=FSO.GetParentFolderName(WScript.ScriptFullName); +//crazy way to get path two layers upper "\tools\lpgen\" +var trunk=FSO.GetFolder(FSO.GetParentFolderName(FSO.GetParentFolderName(scriptpath))); +//plugins path +var plugins=FSO.BuildPath(trunk,"langpacks\\ru\\Plugins\\"); +//init translate db arrays +CoreTranslateDB=new Array; +DupesTranslateDB=new Array; + +//*********************************************************************************// +// Checking command line parameters *// +//*********************************************************************************// + +// if console param /log: specified, put it to var log. To enable log, specify /log:"yes" +if (WScript.Arguments.Named.Item("log")) log=WScript.Arguments.Named.Item("log").toLowerCase(); + +//If script run by double click, open choose folder dialog to choose plugin folder to parse. If Cancel pressed, quit script. +if (WScript.FullName.toLowerCase().charAt(WScript.FullName.length - 11)=="w") { + WScript.Echo("Please run from command line!"); + WScript.Quit(); +} + +//when /plugin: specified, parse only this path and quit +if (WScript.Arguments.Named.Item("path")) { + //First, generate DB of translations from Core and Dupes files + DupesAndCoreTranslationDB(); + //Path from command line: + var cmdline_file=new String(WScript.Arguments.Named.Item("path")); + //init array for our file translation + var cmdline_file_array=new Array; + //Output filename variable + var traslated_cmdline_file=new String(FSO.BuildPath(scriptpath,FSO.GetFileName(cmdline_file))); + if (log=="yes") WScript.Echo("translating "+cmdline_file); + //Call TranslateTemplateFile for path specified in command line argument /path:"path/to/template", output result to "scriptpath" + TranslateTemplateFile(WScript.Arguments.Named.Item("path"),cmdline_file_array); + //Output result to scriptpath folder. + WriteToFile(cmdline_file_array,traslated_cmdline_file); + if (log=="yes") WScript.Echo("translated file here: "+traslated_cmdline_file); + //We are done, quit. + WScript.Quit(); +} + +//*********************************************************************************// +// Main part *// +//*********************************************************************************// + +if (log=="yes") WScript.Echo("Translation begin"); +//Generate Translation DB as two-dimensional array of Dupes and Core translations. +DupesAndCoreTranslationDB (); + +//Array for translated core +Traslate_Core=new Array; +if (log=="yes") WScript.Echo("Translating Core"); +//Call function for translate core template +TranslateTemplateFile(FSO.BuildPath(trunk,"langpacks\\en\\=CORE=.txt"),Traslate_Core); +//var with translated core template file path +Translated_Core=trunk+"\\langpacks\\en\\translated_=CORE=.txt" +if (log=="yes") WScript.Echo("Output to: "+Translated_Core); +//output traslated core into file +WriteToFile(Traslate_Core,Translated_Core); + +//Init array of template files +TemplateFilesArray=new Array; +//Find all template files and put them to array +FindFiles(FSO.BuildPath(trunk,"langpacks\\en\\plugins\\"),"\\.txt$",TemplateFilesArray) +//create enumerator filesenum from filelist +filesenum=new Enumerator(TemplateFilesArray); +//cycle through file list + while (!filesenum.atEnd()) { + //intit Array with translated strings + TranslatedTemplate=new Array; + //curfile is our current file in files enumerator + curfile=filesenum.item(); + //Log output to console + if (log=="yes") WScript.Echo("translating "+curfile); + //path to result file + traslatedtemplatefile=trunk+"\\langpacks\\en\\plugins\\translated_"+FSO.GetFileName(curfile); + //now put strings from template and translations into array + TranslateTemplateFile(curfile,TranslatedTemplate); + //Write array into file; + WriteToFile(TranslatedTemplate,traslatedtemplatefile); + //Log output to console + if (log=="yes") WScript.Echo("Output to: "+traslatedtemplatefile); + //move to next file + filesenum.moveNext(); + }; +if (log=="yes") WScript.Echo("Translation end"); + + +//*********************************************************************************// +// Functions *// +//*********************************************************************************// + +//Generate DB with translations from Core and Dupes files +function DupesAndCoreTranslationDB () { +//path variables +var CoreTranslateFile=FSO.BuildPath(trunk,"langpacks\\ru\\=CORE=.txt"); +var DupesTranslateFile=FSO.BuildPath(trunk,"langpacks\\ru\\=DUPES=.txt"); +//Generate Core and Dupes translate DBs +GenerateTransalteArray(CoreTranslateFile,CoreTranslateDB); +GenerateTransalteArray(DupesTranslateFile,DupesTranslateDB); +} + +//Generate two-dimensional array with english sting + translated string from langpack file +function GenerateTransalteArray (file,array) { +//if file does not exist, it's a core, we do not need do the job again, so return. +if (!FSO.FileExists(file)) return; +//open file +var translatefile=FSO.GetFile(file).OpenAsTextStream(ForReading, TristateUseDefault); +//read file into var +var translatefiletext=translatefile.ReadAll(); +//"find" - RegularExpression, first string have to start with [ and end with]. Next string - translation +var find=/(^\[.+?\])\r\n(.+?)(?=\r)/mg; +//While our "find" RegExp return a results, push strings into array. +while ((string = find.exec(translatefiletext)) != null) { + //first, init empty var + var string; + //now, push first match as original string [....], second match is a translation + array.push([string[1],string[2]]); + } +//close file +translatefile.Close(); +} + +//Generate array with stirngs from translation template, adding founded translation, if exist. +function TranslateTemplateFile(Template_file,array) { + //init Arrays: + //1) PluginTranslate from plugins translate file + PluginTranslateDB=new Array; + //2) Global translate DB + GlobalPluginTranslateDB=new Array; + //Generate PluginTranslate DB + GenerateTransalteArray(FSO.BuildPath(plugins,FSO.GetFileName(Template_file)),PluginTranslateDB); + //Concatenate three translate DB in order: Plugin transalte, than Dupes and ending with Core translate DB + GlobalPluginTranslateDB=PluginTranslateDB.concat(DupesTranslateDB).concat(CoreTranslateDB); + //If file zero size, return; + if (FSO.GetFile(Template_file).Size==0) return; + //access file + template_file_stream=FSO.GetFile(Template_file).OpenAsTextStream(ForReading, TristateUseDefault); + //Reading line-by-line + while (!template_file_stream.AtEndOfStream) { + //clear up variable + englishstring=""; + //read on line into rcline + line=template_file_stream.ReadLine(); + //Push line int array, we need all lines from template + array.push(line); + //find string covered by[] using regexp + englishstring=line.match(/\[.+\]/); + //If current line is english string covered by [], try to find translation in global db + if (englishstring) { + //uncomment next string for more verbose log output + //if (log=="yes") WScript.Echo("lookin for "+englishstring); + + //add string to array, firstly find our string in global translate DB + //if translation not found (thus, FindTranslation return nothing), empty line will be added. + array.push(FindTranslation(englishstring,GlobalPluginTranslateDB)); + } + } + //closing file + template_file_stream.Close(); +}; + +//Cycle trough array and find translation for given string in translate_array +function FindTranslation (string, translate_array) { +//cycle trough array length +for (i=0;i<=translate_array.length-1;i++) { + //check if the string match our first [0] colomn of array with english strings + if (translate_array[i][0]==string) { + //yes, we we have this string, so return second [1] colomn of array + return translate_array[i][1] + } + }; +} + +//Recourse find all files in "path" with file RegExp mask "name" and return file list into filelistarray +function FindFiles (path,name,filelistarray) { + //Init vars + var Folder, Folders, Files, file, filename; + // second param "name" is our case insensive RegExp + var filemask=new RegExp(name,"i"); + //Put path into var Folder + Folder=FSO.GetFolder(path); + //put subFolders into var + Folders=new Enumerator(Folder.SubFolders); + //Create Enumerator with Folder files inside + Files=new Enumerator(Folder.Files); + //Cycle by files in Folder + while (!Files.atEnd()) { + //file is a next file + file=Files.item(); + //put file name into filename + filename=FSO.GetFileName(file); + //if filename is our name mask, do the job. + if (filemask.test(filename)) filelistarray.push(file); + //move to next file + Files.moveNext(); + }; + //Cycle by subfolders + while (!Folders.atEnd()) { + FindFiles(Folders.item().Path,name,filelistarray); + //WScript.Echo(Folders.item().Path); + Folders.moveNext(); + }; +}; + +//Put array of strings into file +function WriteToFile (array,file) { + //Create file + outfile=FSO.CreateTextFile(file, overwritefile , unicode) + //Finally, write strings from array to file + for (i=0;i<=array.length-1;i++) outfile.WriteLine(array[i]); + //Close file + outfile.Close(); +};
\ No newline at end of file diff --git a/tools/lpgen/translate.js.bat b/tools/lpgen/translate.js.bat new file mode 100644 index 0000000000..0423fdc708 --- /dev/null +++ b/tools/lpgen/translate.js.bat @@ -0,0 +1,2 @@ +rem echo off
+cscript /nologo translate.js
\ No newline at end of file |