summaryrefslogtreecommitdiff
path: root/tools/lpgen
diff options
context:
space:
mode:
authorBasil <basil@miranda-ng.org>2013-02-08 05:11:55 +0000
committerBasil <basil@miranda-ng.org>2013-02-08 05:11:55 +0000
commit7a58165c7cac595d416860b148406fba05b46188 (patch)
tree72582794190214c977a93cf04b14fd44123f84b2 /tools/lpgen
parent6926497ec600395e44f9878de06d386d4c80d4e3 (diff)
cosmetics
git-svn-id: http://svn.miranda-ng.org/main/trunk@3463 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'tools/lpgen')
-rw-r--r--tools/lpgen/translate.js712
1 files changed, 356 insertions, 356 deletions
diff --git a/tools/lpgen/translate.js b/tools/lpgen/translate.js
index f9ae910c46..62adecd9d5 100644
--- a/tools/lpgen/translate.js
+++ b/tools/lpgen/translate.js
@@ -1,357 +1,357 @@
-//*****************************************************************************************//
-//* Name: translate.js *//
-//* Language: JScript *//
-//* Function: Parse Miranda-NG translation templates and get translated strings *//
-//* Author: BasiL *//
-//* 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 /plugin:"path\file" for one template *//
-//* Usage: cscript /nologo translate.js /path:"path\folder" - translate folder *//
-//* Usage: cscript /nologo translate.js /core:"path\=core=.txt" use core file *//
-//* Usage: cscript /nologo translate.js /dupes:"path\=dupes=.txt" use dupes file *//
-//* Usage: cscript /nologo translate.js /out:"path\folder" output result to folder *//
-//* Usage: cscript /nologo translate.js /outfile:"path\file" output result to one file*//
-//* Usage: cscript /nologo translate.js /langpack:"path\lang.txt" - Full langpack *//
-//* Usage: cscript /nologo translate.js /noref:"yes" - remove ref. ";file path\file" *//
-//* Note: script will use following sequense to find a translation for string: *//
-//* 1) Try to get translation from a same file name. Example: /langpack/english/plugin/ *//
-//* /TabSRMM.txt strings will be checked in file named TabSRMM.txt in folder from /path: *//
-//* if you specify a "path" - /path:"path\folder", so look in path\folder\TabSRMM.txt *//
-//* 2) If not find in step 1), check a string in file DUPES, specified in /dupes parameter*//
-//* 3) If still not found, try to find trasnlation in /core file *//
-//* 4) Still no luck? Well, check a /langpack:"/path/lang.txt" as a last place. *//
-//* Example1: cscript /nologo translate.js /core:"path\lang.txt" /path:"path/german" *//
-//* will translate english templates using plugins translation from path\german and if *//
-//* translation not found, try to find translation in path\lang.txt *//
-//* Example2: cscript /nologo translate.js /plugin:"path\file" /langpack:"path\lang.txt" *//
-//* will translate path\file using translation from path\lang.txt *//
-//* Example3: cscript /nologo translate.js /langpack:"path\lang.txt" /outfile:"path\file"*//
-//* will translate all /english/* templates using lang.txt & output langpack in path\file *//
-//*****************************************************************************************//
-
-//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=false;
-//output translated templates in separated files by default
-var outfile=false;
-//do not remove refference to source file, where we found a translation string
-var noref=false;
-//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)));
-//stream - our variable for output UTF-8 files with BOM
-var stream= new ActiveXObject("ADODB.Stream");
-//stream var tune
-stream.Type = 2; // text mode
-stream.Charset = "utf-8";
-//init translate dictionaries
-CoreTranslateDict=WScript.CreateObject("Scripting.Dictionary");
-DupesTranslateDict=WScript.CreateObject("Scripting.Dictionary");
-LangpackTranslateDict=WScript.CreateObject("Scripting.Dictionary");
-
-//*********************************************************************************//
-// 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=true;
-
-// if console param /noref: specified, put it to var noref. To remove reff's to files, specifry /noref:"yes"
-if (WScript.Arguments.Named.Item("noref")) noref=true;
-
-// if console pararm /outpfile:"\path\filename.txt" given, put it to var outfile.
-if (WScript.Arguments.Named.Item("outfile")) {
- outfile=true;
- full_langpack_file=WScript.Arguments.Named.Item("outfile");
- }
-// if param /out specified, build a path and put it into var.
-if (WScript.Arguments.Named.Item("out")) {
- var out=WScript.Arguments.Named.Item("out");
- if (!FSO.FolderExists(out)) {
- WScript.Echo("Output folder "+out+" does not exist!\nPlease, create it first!");
- WScript.Quit();}
- };
-
-//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("plugin")) {
- //First, generate DB of translations from Core and Dupes files
- checkparams();
- GenerateDictionaries();
- //plugin from command line:
- var cmdline_file=new String(WScript.Arguments.Named.Item("plugin"));
- //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) 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("plugin"),cmdline_file_array);
- //Output result to scriptpath folder.
- WriteToUnicodeFile(cmdline_file_array,traslated_cmdline_file);
- if (log) WScript.Echo("translated file here: "+traslated_cmdline_file);
- //We are done, quit.
- WScript.Quit();
-}
-
-
-//*********************************************************************************//
-// Main part *//
-//*********************************************************************************//
-//first, check we have files with translated stirngs specified.
-checkparams();
-if (log) WScript.Echo("Translation begin");
-
-//Generate translation dictionaries from /core, /dupes and /langpack files.
-GenerateDictionaries ();
-
-//Array for translated core & full langpack file
-Translate_Core=new Array;
-full_langpack=new Array;
-if (log) WScript.Echo("Translating Core");
-//Call function for translate core template
-TranslateTemplateFile(FSO.BuildPath(trunk,"langpacks\\english\\=CORE=.txt"),Translate_Core);
-//var with translated core template file path
-Translated_Core=trunk+"\\langpacks\\english\\translated_=CORE=.txt";
-//if "out" specified, redefine output to this path
-if (out) Translated_Core=out+"\\=CORE=.txt";
-//output traslated core into file, if outfile not specified
-if (!outfile) WriteToFile(Translate_Core,Translated_Core);
-//loggin output
-if (log & !outfile) WScript.Echo("Output to: "+Translated_Core);
-//if output to full langpack, concatenate arrays;
-if (outfile) full_langpack=full_langpack.concat(Translate_Core);
-
-//Init array of template files
-TemplateFilesArray=new Array;
-//Find all template files and put them to array
-FindFiles(FSO.BuildPath(trunk,"langpacks\\english\\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) WScript.Echo("translating "+curfile);
- //path to result file
- traslatedtemplatefile=trunk+"\\langpacks\\english\\plugins\\translated_"+FSO.GetFileName(curfile);
- //if out key specified, output to this folder
- if (out) traslatedtemplatefile=out+"\\"+FSO.GetFileName(curfile);
- //now put strings from template and translations into array
- TranslateTemplateFile(curfile,TranslatedTemplate);
- //Write array into file, if outfile not specified
- if (!outfile) WriteToFile(TranslatedTemplate,traslatedtemplatefile);
- //if we will output one file only, concatenate array
- if (outfile) full_langpack=full_langpack.concat(TranslatedTemplate);
- //Log output to console
- if (log & !outfile) WScript.Echo("Output to: "+traslatedtemplatefile);
- //move to next file
- filesenum.moveNext();
- };
-//if output to one langpack file, write a finall array Translate_Core into UTF-8 file with BOM
-if (outfile) {
- WriteToUnicodeFile(full_langpack,full_langpack_file);
- WScript.Echo("Langpack file in "+full_langpack_file);
-}
-if (log) WScript.Echo("Translation end");
-
-
-//*********************************************************************************//
-// Functions *//
-//*********************************************************************************//
-
-//when /core: and /path: are NOT specified, thus we don't have any langpack file(s) to get translated strings. Thus all other job are uselessg
-function checkparams() {
-if (!WScript.Arguments.Named.Item("langpack") && !WScript.Arguments.Named.Item("path")) {
- WScript.Echo("you didn't specify /langpack: or /path: parameter, there is no files with translated strings!");
- WScript.Quit();
- };
-}
-
-//Check file existense. If file not found, quit.
-function CheckFileExist(file) {
- if (!FSO.FileExists(file)) {
- WScript.Echo("Can't find "+file)
- };
-}
-
-//Generate DB with translations from Core and Dupes files
-function GenerateDictionaries () {
-//path variables
-if (WScript.Arguments.Named.Item("core")) {
- //Check file /core:"path" exist or not
- CheckFileExist(WScript.Arguments.Named.Item("core"));
- //Generate dictionanry
- GenerateTransalteDict(WScript.Arguments.Named.Item("core"),CoreTranslateDict);
- }
-if (WScript.Arguments.Named.Item("dupes")) {
- CheckFileExist(WScript.Arguments.Named.Item("dupes"));
- GenerateTransalteDict(WScript.Arguments.Named.Item("dupes"),DupesTranslateDict);
- }
-if (WScript.Arguments.Named.Item("langpack")) {
- CheckFileExist(WScript.Arguments.Named.Item("langpack"));
- GenerateTransalteDict(WScript.Arguments.Named.Item("langpack"),LangpackTranslateDict);
- }
-}
-
-//Generate Dictionary with english sting + translated string from file
-function GenerateTransalteDict (file,dictionary) {
-//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
-stream.Open();
-stream.LoadFromFile(file);
-//read file into var
-var translatefiletext=stream.ReadText();
-//"find" - RegularExpression, first string have to start with [ and end with]. Next string - translation
-var find=/(^\[.+?\])\r\n(.+?)(?=$)/mg;
-//While our "find" RegExp return a results, add strings into dictionary.
-while ((string = find.exec(translatefiletext)) != null) {
- //first, init empty var
- var string;
- //first match as original string [....], is a key of dictionary, second match is a translation - item of key in dictionary
- var key=string[1];
- var item=string[2];
- //add key-item pair into dictionary, if not exists already
- if (!dictionary.Exists(key))
- dictionary.Add(key,item);
- //use also different variants of Miranda name for translations from old langpacks
- key = key.replace("Miranda IM", "Miranda NG");
- item = item.replace("Miranda IM", "Miranda NG");
- if (!dictionary.Exists(key))
- dictionary.Add(key,item);
- key = key.replace("Miranda NG", "Miranda");
- item = item.replace("Miranda NG", "Miranda");
- if (!dictionary.Exists(key))
- dictionary.Add(key,item);
- }
-//close file
-stream.Close();
-}
-
-//Generate array with stirngs from translation template, adding founded translation, if exist.
-function TranslateTemplateFile(Template_file,array) {
- //Init PluginTranslate Dictionary from plugins translate file
- var PluginTranslateDict=WScript.CreateObject("Scripting.Dictionary");
- // if /path:"" specified, this is a folder with plugin translations, use it to find out our translation.
- if (WScript.Arguments.Named.Item("path")) {
- //Generate PluginTranslate Dictionary
- GenerateTransalteDict(FSO.BuildPath(WScript.Arguments.Named.Item("path"),FSO.GetFileName(Template_file)),PluginTranslateDict);
- }
- //If file zero size, return;
- if (FSO.GetFile(Template_file).Size==0) return;
- //access file
- stream.Open();
- stream.LoadFromFile(Template_file);
- //Reading line-by-line
- while (!stream.EOS) {
- //clear up variable
- englishstring="";
- //read on line
- var line=stream.ReadText(-2);
- //Push line int array, we need all lines from template
- //array.push(line);
- //If we need refference to "; file source\file\path" in template or langpack, put into array every line
- if (!noref) array.push(line);
- if (noref) {
- reffline=line.match(/^;file.+/);
- if (!reffline) 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) WScript.Echo("lookin' for "+englishstring);
- //firstly find our string exist in Plugin translate DB dictionary
- if (PluginTranslateDict.Exists(line)) {
- //yes, we have translation, put translation into array
- array.push(PluginTranslateDict.Item(line));
- } else {
- //If we do not foud sting in plugin translation, check Dupes and if found, put to array
- if (DupesTranslateDict.Exists(line)) {
- array.push(DupesTranslateDict.Item(line));
- } else {
- //not found in dupes? Check CORE
- if (CoreTranslateDict.Exists(line)) {
- array.push(CoreTranslateDict.Item(line));
- } else {
- //Sill no luck? Check Langpack...
- if (LangpackTranslateDict.Exists(line)) {
- array.push(LangpackTranslateDict.Item(line));
- } else {
- //no translation found, put empty line
- array.push("");
- }
- }
- }
- }
- }
- }
- //closing file
- stream.Close();
-};
-
-//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
- out_file=FSO.CreateTextFile(file, overwritefile , unicode)
- //Finally, write strings from array to file
- for (i=0;i<=array.length-1;i++) out_file.WriteLine(array[i]);
- //Close file
- out_file.Close();
-};
-//Write UTF-8 file
-function WriteToUnicodeFile(array,langpack) {
-stream.Open();
-for (i=0;i<=array.length-1;i++) stream.WriteText(array[i]+"\r\n");
-stream.SaveToFile(langpack, 2);
-stream.Close();
+//*****************************************************************************************//
+//* Name: translate.js *//
+//* Language: JScript *//
+//* Function: Parse Miranda-NG translation templates and get translated strings *//
+//* Author: BasiL *//
+//* 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 /plugin:"path\file" for one template *//
+//* Usage: cscript /nologo translate.js /path:"path\folder" - translate folder *//
+//* Usage: cscript /nologo translate.js /core:"path\=core=.txt" use core file *//
+//* Usage: cscript /nologo translate.js /dupes:"path\=dupes=.txt" use dupes file *//
+//* Usage: cscript /nologo translate.js /out:"path\folder" output result to folder *//
+//* Usage: cscript /nologo translate.js /outfile:"path\file" output result to one file*//
+//* Usage: cscript /nologo translate.js /langpack:"path\lang.txt" - Full langpack *//
+//* Usage: cscript /nologo translate.js /noref:"yes" - remove ref. ";file path\file" *//
+//* Note: script will use following sequense to find a translation for string: *//
+//* 1) Try to get translation from a same file name. Example: /langpack/english/plugin/ *//
+//* /TabSRMM.txt strings will be checked in file named TabSRMM.txt in folder from /path: *//
+//* if you specify a "path" - /path:"path\folder", so look in path\folder\TabSRMM.txt *//
+//* 2) If not find in step 1), check a string in file DUPES, specified in /dupes parameter*//
+//* 3) If still not found, try to find trasnlation in /core file *//
+//* 4) Still no luck? Well, check a /langpack:"/path/lang.txt" as a last place. *//
+//* Example1: cscript /nologo translate.js /core:"path\lang.txt" /path:"path/german" *//
+//* will translate english templates using plugins translation from path\german and if *//
+//* translation not found, try to find translation in path\lang.txt *//
+//* Example2: cscript /nologo translate.js /plugin:"path\file" /langpack:"path\lang.txt" *//
+//* will translate path\file using translation from path\lang.txt *//
+//* Example3: cscript /nologo translate.js /langpack:"path\lang.txt" /outfile:"path\file"*//
+//* will translate all /english/* templates using lang.txt & output langpack in path\file *//
+//*****************************************************************************************//
+
+//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=false;
+//output translated templates in separated files by default
+var outfile=false;
+//do not remove refference to source file, where we found a translation string
+var noref=false;
+//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)));
+//stream - our variable for output UTF-8 files with BOM
+var stream= new ActiveXObject("ADODB.Stream");
+//stream var tune
+stream.Type = 2; // text mode
+stream.Charset = "utf-8";
+//init translate dictionaries
+CoreTranslateDict=WScript.CreateObject("Scripting.Dictionary");
+DupesTranslateDict=WScript.CreateObject("Scripting.Dictionary");
+LangpackTranslateDict=WScript.CreateObject("Scripting.Dictionary");
+
+//*********************************************************************************//
+// 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=true;
+
+// if console param /noref: specified, put it to var noref. To remove reff's to files, specifry /noref:"yes"
+if (WScript.Arguments.Named.Item("noref")) noref=true;
+
+// if console pararm /outpfile:"\path\filename.txt" given, put it to var outfile.
+if (WScript.Arguments.Named.Item("outfile")) {
+ outfile=true;
+ full_langpack_file=WScript.Arguments.Named.Item("outfile");
+ }
+// if param /out specified, build a path and put it into var.
+if (WScript.Arguments.Named.Item("out")) {
+ var out=WScript.Arguments.Named.Item("out");
+ if (!FSO.FolderExists(out)) {
+ WScript.Echo("Output folder "+out+" does not exist!\nPlease, create it first!");
+ WScript.Quit();}
+ };
+
+//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("plugin")) {
+ //First, generate DB of translations from Core and Dupes files
+ checkparams();
+ GenerateDictionaries();
+ //plugin from command line:
+ var cmdline_file=new String(WScript.Arguments.Named.Item("plugin"));
+ //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) 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("plugin"),cmdline_file_array);
+ //Output result to scriptpath folder.
+ WriteToUnicodeFile(cmdline_file_array,traslated_cmdline_file);
+ if (log) WScript.Echo("translated file here: "+traslated_cmdline_file);
+ //We are done, quit.
+ WScript.Quit();
+}
+
+
+//*********************************************************************************//
+// Main part *//
+//*********************************************************************************//
+//first, check we have files with translated stirngs specified.
+checkparams();
+if (log) WScript.Echo("Translation begin");
+
+//Generate translation dictionaries from /core, /dupes and /langpack files.
+GenerateDictionaries ();
+
+//Array for translated core & full langpack file
+Translate_Core=new Array;
+full_langpack=new Array;
+if (log) WScript.Echo("Translating Core");
+//Call function for translate core template
+TranslateTemplateFile(FSO.BuildPath(trunk,"langpacks\\english\\=CORE=.txt"),Translate_Core);
+//var with translated core template file path
+Translated_Core=trunk+"\\langpacks\\english\\translated_=CORE=.txt";
+//if "out" specified, redefine output to this path
+if (out) Translated_Core=out+"\\=CORE=.txt";
+//output traslated core into file, if outfile not specified
+if (!outfile) WriteToFile(Translate_Core,Translated_Core);
+//loggin output
+if (log & !outfile) WScript.Echo("Output to: "+Translated_Core);
+//if output to full langpack, concatenate arrays;
+if (outfile) full_langpack=full_langpack.concat(Translate_Core);
+
+//Init array of template files
+TemplateFilesArray=new Array;
+//Find all template files and put them to array
+FindFiles(FSO.BuildPath(trunk,"langpacks\\english\\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) WScript.Echo("translating "+curfile);
+ //path to result file
+ traslatedtemplatefile=trunk+"\\langpacks\\english\\plugins\\translated_"+FSO.GetFileName(curfile);
+ //if out key specified, output to this folder
+ if (out) traslatedtemplatefile=out+"\\"+FSO.GetFileName(curfile);
+ //now put strings from template and translations into array
+ TranslateTemplateFile(curfile,TranslatedTemplate);
+ //Write array into file, if outfile not specified
+ if (!outfile) WriteToFile(TranslatedTemplate,traslatedtemplatefile);
+ //if we will output one file only, concatenate array
+ if (outfile) full_langpack=full_langpack.concat(TranslatedTemplate);
+ //Log output to console
+ if (log & !outfile) WScript.Echo("Output to: "+traslatedtemplatefile);
+ //move to next file
+ filesenum.moveNext();
+ };
+//if output to one langpack file, write a final array Translate_Core into UTF-8 file with BOM
+if (outfile) {
+ WriteToUnicodeFile(full_langpack,full_langpack_file);
+ WScript.Echo("Langpack file in "+full_langpack_file);
+}
+if (log) WScript.Echo("Translation end");
+
+
+//*********************************************************************************//
+// Functions *//
+//*********************************************************************************//
+
+//when /core: and /path: are NOT specified, thus we don't have any langpack file(s) to get translated strings. Thus all other job are uselessg
+function checkparams() {
+if (!WScript.Arguments.Named.Item("langpack") && !WScript.Arguments.Named.Item("path")) {
+ WScript.Echo("you didn't specify /langpack: or /path: parameter, there is no files with translated strings!");
+ WScript.Quit();
+ };
+}
+
+//Check file existense. If file not found, quit.
+function CheckFileExist(file) {
+ if (!FSO.FileExists(file)) {
+ WScript.Echo("Can't find "+file)
+ };
+}
+
+//Generate DB with translations from Core and Dupes files
+function GenerateDictionaries () {
+//path variables
+if (WScript.Arguments.Named.Item("core")) {
+ //Check file /core:"path" exist or not
+ CheckFileExist(WScript.Arguments.Named.Item("core"));
+ //Generate dictionanry
+ GenerateTransalteDict(WScript.Arguments.Named.Item("core"),CoreTranslateDict);
+ }
+if (WScript.Arguments.Named.Item("dupes")) {
+ CheckFileExist(WScript.Arguments.Named.Item("dupes"));
+ GenerateTransalteDict(WScript.Arguments.Named.Item("dupes"),DupesTranslateDict);
+ }
+if (WScript.Arguments.Named.Item("langpack")) {
+ CheckFileExist(WScript.Arguments.Named.Item("langpack"));
+ GenerateTransalteDict(WScript.Arguments.Named.Item("langpack"),LangpackTranslateDict);
+ }
+}
+
+//Generate Dictionary with english sting + translated string from file
+function GenerateTransalteDict (file,dictionary) {
+//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
+stream.Open();
+stream.LoadFromFile(file);
+//read file into var
+var translatefiletext=stream.ReadText();
+//"find" - RegularExpression, first string have to start with [ and end with]. Next string - translation
+var find=/(^\[.+?\])\r\n(.+?)(?=$)/mg;
+//While our "find" RegExp return a results, add strings into dictionary.
+while ((string = find.exec(translatefiletext)) != null) {
+ //first, init empty var
+ var string;
+ //first match as original string [....], is a key of dictionary, second match is a translation - item of key in dictionary
+ var key=string[1];
+ var item=string[2];
+ //add key-item pair into dictionary, if not exists already
+ if (!dictionary.Exists(key))
+ dictionary.Add(key,item);
+ //use also different variants of Miranda name for translations from old langpacks
+ key = key.replace("Miranda IM", "Miranda NG");
+ item = item.replace("Miranda IM", "Miranda NG");
+ if (!dictionary.Exists(key))
+ dictionary.Add(key,item);
+ key = key.replace("Miranda NG", "Miranda");
+ item = item.replace("Miranda NG", "Miranda");
+ if (!dictionary.Exists(key))
+ dictionary.Add(key,item);
+ }
+//close file
+stream.Close();
+}
+
+//Generate array with stirngs from translation template, adding founded translation, if exist.
+function TranslateTemplateFile(Template_file,array) {
+ //Init PluginTranslate Dictionary from plugins translate file
+ var PluginTranslateDict=WScript.CreateObject("Scripting.Dictionary");
+ // if /path:"" specified, this is a folder with plugin translations, use it to find out our translation.
+ if (WScript.Arguments.Named.Item("path")) {
+ //Generate PluginTranslate Dictionary
+ GenerateTransalteDict(FSO.BuildPath(WScript.Arguments.Named.Item("path"),FSO.GetFileName(Template_file)),PluginTranslateDict);
+ }
+ //If file zero size, return;
+ if (FSO.GetFile(Template_file).Size==0) return;
+ //access file
+ stream.Open();
+ stream.LoadFromFile(Template_file);
+ //Reading line-by-line
+ while (!stream.EOS) {
+ //clear up variable
+ englishstring="";
+ //read on line
+ var line=stream.ReadText(-2);
+ //Push line int array, we need all lines from template
+ //array.push(line);
+ //If we need refference to "; file source\file\path" in template or langpack, put into array every line
+ if (!noref) array.push(line);
+ if (noref) {
+ reffline=line.match(/^;file.+/);
+ if (!reffline) 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) WScript.Echo("lookin' for "+englishstring);
+ //firstly find our string exist in Plugin translate DB dictionary
+ if (PluginTranslateDict.Exists(line)) {
+ //yes, we have translation, put translation into array
+ array.push(PluginTranslateDict.Item(line));
+ } else {
+ //If we do not foud sting in plugin translation, check Dupes and if found, put to array
+ if (DupesTranslateDict.Exists(line)) {
+ array.push(DupesTranslateDict.Item(line));
+ } else {
+ //not found in dupes? Check CORE
+ if (CoreTranslateDict.Exists(line)) {
+ array.push(CoreTranslateDict.Item(line));
+ } else {
+ //Sill no luck? Check Langpack...
+ if (LangpackTranslateDict.Exists(line)) {
+ array.push(LangpackTranslateDict.Item(line));
+ } else {
+ //no translation found, put empty line
+ array.push("");
+ }
+ }
+ }
+ }
+ }
+ }
+ //closing file
+ stream.Close();
+};
+
+//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
+ out_file=FSO.CreateTextFile(file, overwritefile , unicode)
+ //Finally, write strings from array to file
+ for (i=0;i<=array.length-1;i++) out_file.WriteLine(array[i]);
+ //Close file
+ out_file.Close();
+};
+//Write UTF-8 file
+function WriteToUnicodeFile(array,langpack) {
+stream.Open();
+for (i=0;i<=array.length-1;i++) stream.WriteText(array[i]+"\r\n");
+stream.SaveToFile(langpack, 2);
+stream.Close();
} \ No newline at end of file