Option Explicit '' ' This script gets the status of the translations. ' ' Copyright (C) 2007 by Tim Gerundt ' Released under the "GNU General Public License" ' ' ID line follows -- this is updated by SVN ' $Id$ Const ForReading = 1 Const SvnWebUrlLanguages = "http://winmerge.svn.sourceforge.net/viewvc/winmerge/trunk/Translations/WinMerge/" Dim oFSO, bRunFromCmd Set oFSO = CreateObject("Scripting.FileSystemObject") bRunFromCmd = False If LCase(oFSO.GetFileName(Wscript.FullName)) = "cscript.exe" Then bRunFromCmd = True End If Call Main '' ' ... Sub Main Dim oTranslationsStatus Dim oLanguages, sLanguage Dim StartTime, EndTime, Seconds StartTime = Time InfoBox "Creating translations status files...", 3 Set oTranslationsStatus = CreateObject("Scripting.Dictionary") If (bRunFromCmd = True) Then 'If run from command line... Wscript.Echo "English" End If oTranslationsStatus.Add "English", GetTranslationsStatusFromPoFile("English.pot") Set oLanguages = GetLanguages For Each sLanguage In oLanguages.Keys 'For all languages... If (bRunFromCmd = True) Then 'If run from command line... Wscript.Echo sLanguage End If oTranslationsStatus.Add sLanguage, GetTranslationsStatusFromPoFile(oLanguages(sLanguage)) Next CreateTranslationsStatusHtmlFile "TranslationsStatus.html", oTranslationsStatus CreateTranslationsStatusWikiFile "TranslationsStatus.wiki", oTranslationsStatus CreateTranslationsStatusXmlFile "TranslationsStatus.xml", oTranslationsStatus CreateTranslatorsListFile "Translators.html", oTranslationsStatus EndTime = Time Seconds = DateDiff("s", StartTime, EndTime) InfoBox "Translations status files created, after " & Seconds & " second(s).", 10 End Sub '' ' ... Function GetLanguages() Dim oLanguages, oFile, ext, name Set oLanguages = CreateObject("Scripting.Dictionary") For Each oFile In oFSO.GetFolder(".").Files 'For all subfolders in the current folder... ext = oFSO.GetExtensionName(oFile) name = oFSO.GetBaseName(oFile) If (ext = "po") Then oLanguages.Add name, oFile.Name End If Next Set GetLanguages = oLanguages End Function '' ' ... Class CStatus Public Count, Translated, Untranslated, Fuzzy Public PoRevisionDate, PotCreationDate Public Translators Private Sub Class_Initialize Count = 0 Translated = 0 Untranslated = 0 Fuzzy = 0 PoRevisionDate = "" PotCreationDate = "" Set Translators = CreateObject("Scripting.Dictionary") End Sub Public Sub AddTranslator(ByVal sTranslator, ByVal bMaintainer) Dim Translator Set Translator = New CTranslator Translator.Maintainer = bMaintainer Translator.Mail = Trim(GetRegExpSubMatch(sTranslator, "<(.*)>")) If (Translator.Mail <> "") Then 'If mail address exists... Translator.Name = Trim(GetRegExpSubMatch(sTranslator, "(.*) <.*>")) Else 'If mail address NOT exists... Translator.Name = sTranslator End If Translators.Add Translators.Count, Translator End Sub End Class '' ' ... Class CTranslator Public Name, Mail, Maintainer End Class '' ' ... Function GetTranslationsStatusFromPoFile(ByVal sPoPath) Dim oStatus, oTextFile, sLine Dim oMatch, iMsgStarted, sMsgId, sMsgStr, bFuzzy, bMaintainer Dim reMsgId, reMsgStr, reMsgContinued Set reMsgId = New RegExp reMsgId.Pattern = "^msgid ""(.*)""$" reMsgId.IgnoreCase = True Set reMsgStr = New RegExp reMsgStr.Pattern = "^msgstr ""(.*)""$" reMsgStr.IgnoreCase = True Set reMsgContinued = New RegExp reMsgContinued.Pattern = "^""(.*)""$" reMsgContinued.IgnoreCase = True Set oStatus = New CStatus If (oFSO.FileExists(sPoPath) = True) Then 'If the PO file exists... iMsgStarted = 0 sMsgId = "" sMsgStr = "" bFuzzy = False bMaintainer = False Set oTextFile = oFSO.OpenTextFile(sPoPath, ForReading, False, -1) Do Until oTextFile.AtEndOfStream = True 'For all lines... sLine = Trim(oTextFile.ReadLine) If (sLine <> "") Then 'If NOT empty line... If (Left(sLine, 1) <> "#") Then 'If NOT comment line... If reMsgId.Test(sLine) Then 'If "msgid"... iMsgStarted = 1 Set oMatch = reMsgId.Execute(sLine)(0) sMsgId = oMatch.SubMatches(0) ElseIf reMsgStr.Test(sLine) Then 'If "msgstr"... iMsgStarted = 2 Set oMatch = reMsgStr.Execute(sLine)(0) sMsgStr = oMatch.SubMatches(0) ElseIf reMsgContinued.Test(sLine) Then 'If "msgid" or "msgstr" continued... Set oMatch = reMsgContinued.Execute(sLine)(0) If (iMsgStarted = 1) Then sMsgId = sMsgId & oMatch.SubMatches(0) ElseIf (iMsgStarted = 2) Then sMsgStr = sMsgStr & oMatch.SubMatches(0) End If End If Else 'If comment line... iMsgStarted = -1 If (Left(sLine, 2) = "#,") Then 'If "Reference" line... If (InStr(sLine, "fuzzy") > 0) Then 'If "fuzzy"... bFuzzy = True End If ElseIf (sLine = "# Maintainer:") Then 'If maintainer list starts... bMaintainer = True ElseIf (sLine = "# Translators:") Then 'If translators list starts... bMaintainer = False ElseIf (Left(sLine, 4) = "# * ") Then 'If translator/maintainer... oStatus.AddTranslator Trim(Mid(sLine, 5)), bMaintainer End If End If Else 'If empty line iMsgStarted = 0 End If If (iMsgStarted = 0) Then 'If NOT inside a translation... If (sMsgId <> "") Then oStatus.Count = oStatus.Count + 1 If (bFuzzy = False) Then 'If NOT a fuzzy translation... If (sMsgStr <> "") Then oStatus.Translated = oStatus.Translated + 1 Else oStatus.Untranslated = oStatus.Untranslated + 1 End If Else 'If a fuzzy translation... oStatus.Fuzzy = oStatus.Fuzzy + 1 End If ElseIf(sMsgStr <> "") Then oStatus.PoRevisionDate = GetRegExpSubMatch(sMsgStr, "PO-Revision-Date: ([0-9 :\+\-]+)") oStatus.PotCreationDate = GetRegExpSubMatch(sMsgStr, "POT-Creation-Date: ([0-9 :\+\-]+)") End If sMsgId = "" sMsgStr = "" bFuzzy = False End If Loop oTextFile.Close End If Set GetTranslationsStatusFromPoFile = oStatus End Function '' ' ... Sub CreateTranslationsStatusHtmlFile(ByVal sHtmlPath, ByVal oTranslationsStatus) Dim oHtmlFile, sLanguage, oLanguageStatus, i Dim sMaintainerStart, sMaintainerEnd Set oHtmlFile = oFSO.CreateTextFile(sHtmlPath, True) oHtmlFile.WriteLine "" oHtmlFile.WriteLine "" oHtmlFile.WriteLine "" oHtmlFile.WriteLine " Translations Status" oHtmlFile.WriteLine " " oHtmlFile.WriteLine " " oHtmlFile.WriteLine "" oHtmlFile.WriteLine "" oHtmlFile.WriteLine "

Translations Status

" oHtmlFile.WriteLine "

Status from " & GetCreationDate() & ":

" oHtmlFile.WriteLine "" oHtmlFile.WriteLine " " oHtmlFile.WriteLine " " oHtmlFile.WriteLine " " oHtmlFile.WriteLine " " oHtmlFile.WriteLine " " oHtmlFile.WriteLine " " oHtmlFile.WriteLine " " oHtmlFile.WriteLine " " For Each sLanguage In oTranslationsStatus.Keys 'For all languages... If (sLanguage <> "English") Then 'If NOT English... Set oLanguageStatus = oTranslationsStatus(sLanguage) oHtmlFile.WriteLine " " oHtmlFile.WriteLine " " oHtmlFile.WriteLine " " oHtmlFile.WriteLine " " oHtmlFile.WriteLine " " oHtmlFile.WriteLine " " oHtmlFile.WriteLine " " oHtmlFile.WriteLine " " End If Next Set oLanguageStatus = oTranslationsStatus("English") oHtmlFile.WriteLine " " oHtmlFile.WriteLine " " oHtmlFile.WriteLine " " oHtmlFile.WriteLine " " oHtmlFile.WriteLine " " oHtmlFile.WriteLine " " oHtmlFile.WriteLine " " oHtmlFile.WriteLine " " oHtmlFile.WriteLine "
LanguageTotalTranslatedFuzzyUntranslatedLast Update
" & sLanguage & "" & oLanguageStatus.Count & "" & oLanguageStatus.Translated & "" & oLanguageStatus.Fuzzy & "" & oLanguageStatus.Untranslated & "" & Left(oLanguageStatus.PoRevisionDate, 10) & "
English" & oLanguageStatus.Count & "" & oLanguageStatus.Count & "00" & Left(oLanguageStatus.PotCreationDate, 10) & "
" oHtmlFile.WriteLine "

Translators

" oHtmlFile.WriteLine "" oHtmlFile.WriteLine " " oHtmlFile.WriteLine " " oHtmlFile.WriteLine " " oHtmlFile.WriteLine " " For Each sLanguage In oTranslationsStatus.Keys 'For all languages... If (sLanguage <> "English") Then 'If NOT English... Set oLanguageStatus = oTranslationsStatus(sLanguage) oHtmlFile.WriteLine " " oHtmlFile.WriteLine " " oHtmlFile.WriteLine " " oHtmlFile.WriteLine " " End If Next oHtmlFile.WriteLine "
LanguageTranslator(s)
" & sLanguage & "" For i = 0 To oLanguageStatus.Translators.Count - 1 'For all translators... sMaintainerStart = "" sMaintainerEnd = "" If (oLanguageStatus.Translators(i).Maintainer = True) Then 'If maintainer... sMaintainerStart = "" sMaintainerEnd = "" End If If (oLanguageStatus.Translators(i).Mail <> "") Then 'If mail address exists... oHtmlFile.WriteLine " " & sMaintainerStart & "" & oLanguageStatus.Translators(i).Name & "" & sMaintainerEnd & "
" Else 'If mail address NOT exists... oHtmlFile.WriteLine " " & sMaintainerStart & oLanguageStatus.Translators(i).Name & sMaintainerEnd & "
" End If Next oHtmlFile.WriteLine "
" oHtmlFile.WriteLine "" oHtmlFile.WriteLine "" oHtmlFile.Close End Sub '' ' ... Sub CreateTranslationsStatusWikiFile(ByVal sWikiPath, ByVal oTranslationsStatus) Dim oWikiFile, sLanguage, oLanguageStatus Set oWikiFile = oFSO.CreateTextFile(sWikiPath, True) oWikiFile.WriteLine "== Translations Status ==" oWikiFile.WriteLine "Status from '''" & GetCreationDate() & "''':" oWikiFile.WriteLine "{| class=""wikitable"" border=""1""" oWikiFile.WriteLine "! Language" oWikiFile.WriteLine "! Total" oWikiFile.WriteLine "! Translated" oWikiFile.WriteLine "! Fuzzy" oWikiFile.WriteLine "! Untranslated" oWikiFile.WriteLine "! Last Update" For Each sLanguage In oTranslationsStatus.Keys 'For all languages... If (sLanguage <> "English") Then 'If NOT English... Set oLanguageStatus = oTranslationsStatus(sLanguage) oWikiFile.WriteLine "|-" oWikiFile.WriteLine "|align=""left""| " & sLanguage oWikiFile.WriteLine "|align=""right""| " & oLanguageStatus.Count oWikiFile.WriteLine "|align=""right""| " & oLanguageStatus.Translated oWikiFile.WriteLine "|align=""right""| " & oLanguageStatus.Fuzzy oWikiFile.WriteLine "|align=""right""| " & oLanguageStatus.Untranslated oWikiFile.WriteLine "|align=""center""| " & Left(oLanguageStatus.PoRevisionDate, 10) End If Next Set oLanguageStatus = oTranslationsStatus("English") oWikiFile.WriteLine "|-" oWikiFile.WriteLine "|align=""left""| English" oWikiFile.WriteLine "|align=""right""| " & oLanguageStatus.Count oWikiFile.WriteLine "|align=""right""| " & oLanguageStatus.Count oWikiFile.WriteLine "|align=""right""| 0" oWikiFile.WriteLine "|align=""right""| 0" oWikiFile.WriteLine "|align=""center""| " & Left(oLanguageStatus.PotCreationDate, 10) oWikiFile.WriteLine "|}" oWikiFile.Close End Sub '' ' ... Sub CreateTranslationsStatusXmlFile(ByVal sXmlPath, ByVal oTranslationsStatus) Dim oXmlFile, sLanguage, oLanguageStatus, i Set oXmlFile = oFSO.CreateTextFile(sXmlPath, True) oXmlFile.WriteLine "" oXmlFile.WriteLine " " & GetCreationDate() & "" For Each sLanguage In oTranslationsStatus.Keys 'For all languages... If (sLanguage <> "English") Then 'If NOT English... Set oLanguageStatus = oTranslationsStatus(sLanguage) oXmlFile.WriteLine " " oXmlFile.WriteLine " " & sLanguage & "" oXmlFile.WriteLine " " & sLanguage & ".po" oXmlFile.WriteLine " " & Left(oLanguageStatus.PoRevisionDate, 10) & "" oXmlFile.WriteLine " " oXmlFile.WriteLine " " & oLanguageStatus.Count & "" oXmlFile.WriteLine " " & oLanguageStatus.Translated & "" oXmlFile.WriteLine " " & oLanguageStatus.Fuzzy & "" oXmlFile.WriteLine " " & oLanguageStatus.Untranslated & "" oXmlFile.WriteLine " " oXmlFile.WriteLine " " For i = 0 To oLanguageStatus.Translators.Count - 1 'For all translators... If (oLanguageStatus.Translators(i).Maintainer = True) Then 'If maintainer... oXmlFile.WriteLine " " Else 'If NOT maintainer... oXmlFile.WriteLine " " End If oXmlFile.WriteLine " " & oLanguageStatus.Translators(i).Name & "" If (oLanguageStatus.Translators(i).Mail <> "") Then 'If mail address exists... oXmlFile.WriteLine " " & oLanguageStatus.Translators(i).Mail & "" End If oXmlFile.WriteLine " " Next oXmlFile.WriteLine " " oXmlFile.WriteLine " " End If Next Set oLanguageStatus = oTranslationsStatus("English") oXmlFile.WriteLine " " oXmlFile.WriteLine " English" oXmlFile.WriteLine " English.pot" oXmlFile.WriteLine " " & Left(oLanguageStatus.PotCreationDate, 10) & "" oXmlFile.WriteLine " " oXmlFile.WriteLine " " & oLanguageStatus.Count & "" oXmlFile.WriteLine " " & oLanguageStatus.Count & "" oXmlFile.WriteLine " 0" oXmlFile.WriteLine " 0" oXmlFile.WriteLine " " oXmlFile.WriteLine " " oXmlFile.WriteLine "" oXmlFile.Close End Sub '' ' ... Sub CreateTranslatorsListFile(ByVal sHtmlPath, ByVal oTranslationsStatus) Dim oHtmlFile, sLanguage, oLanguageStatus, i Dim sLastUpdated, sMaintainer, sTranslators Set oHtmlFile = oFSO.CreateTextFile(sHtmlPath, True) oHtmlFile.WriteLine "" oHtmlFile.WriteLine "" oHtmlFile.WriteLine "" oHtmlFile.WriteLine " WinMerge Translators" oHtmlFile.WriteLine " " oHtmlFile.WriteLine " " oHtmlFile.WriteLine "" oHtmlFile.WriteLine "" oHtmlFile.WriteLine "

WinMerge Translators

" oHtmlFile.WriteLine "" For Each sLanguage In oTranslationsStatus.Keys 'For all languages... If (sLanguage <> "English") Then 'If NOT English... sMaintainer = "" sTranslators = "" Set oLanguageStatus = oTranslationsStatus(sLanguage) oHtmlFile.WriteLine "

" & sLanguage & "

" oHtmlFile.WriteLine "
" For i = 0 To oLanguageStatus.Translators.Count - 1 'For all translators... If (oLanguageStatus.Translators(i).Maintainer = True) Then 'If maintainer... If (oLanguageStatus.Translators(i).Mail <> "") Then 'If mail address exists... sMaintainer = "
" & oLanguageStatus.Translators(i).Name & "
" Else 'If mail address NOT exists... sMaintainer = "
" & oLanguageStatus.Translators(i).Name & "
" End If Else 'If NO maintainer... If (oLanguageStatus.Translators(i).Mail <> "") Then 'If mail address exists... sTranslators = sTranslators & "
" & oLanguageStatus.Translators(i).Name & "
" Else 'If mail address NOT exists... sTranslators = sTranslators & "
" & oLanguageStatus.Translators(i).Name & "
" End If End If Next If (sMaintainer <> "") Then 'If maintainer exists... oHtmlFile.WriteLine "
Maintainer:
" oHtmlFile.WriteLine " " & sMaintainer End If If (sTranslators <> "") Then 'If translators exists... oHtmlFile.WriteLine "
Translators:
" oHtmlFile.WriteLine " " & sTranslators End If sLastUpdated = Left(oLanguageStatus.PoRevisionDate, 10) If (sLastUpdated <> "") Then 'If PO revision date exists... oHtmlFile.WriteLine "
Last Update:
" oHtmlFile.WriteLine "
" & Left(oLanguageStatus.PoRevisionDate, 10) & "
" End If oHtmlFile.WriteLine "
Translation File:
" oHtmlFile.WriteLine "
" & sLanguage & ".po
" oHtmlFile.WriteLine "
" End If Next oHtmlFile.WriteLine "

Status from " & GetCreationDate() & ". Look at winmerge.org for updates.

" oHtmlFile.WriteLine "" oHtmlFile.WriteLine "" oHtmlFile.Close End Sub '' ' ... Function FoundRegExpMatch(ByVal sString, ByVal sPattern, ByRef oMatchReturn) Dim oRegExp, oMatches Set oRegExp = New RegExp oRegExp.Pattern = sPattern oRegExp.IgnoreCase = True oMatchReturn = Null FoundRegExpMatch = False If (oRegExp.Test(sString) = True) Then Set oMatches = oRegExp.Execute(sString) Set oMatchReturn = oMatches(0) FoundRegExpMatch = True End If End Function '' ' ... Function GetRegExpSubMatch(ByVal sString, ByVal sPattern) Dim oMatch GetRegExpSubMatch = "" If (FoundRegExpMatch(sString, sPattern, oMatch)) Then 'If pattern found... GetRegExpSubMatch = oMatch.SubMatches(0) End If End Function '' ' ... Function GetCreationDate() Dim oNow, sYear, sMonth, sDay, sHour, sMinute oNow = Now() sYear = Year(oNow) sMonth = Month(oNow) If (sMonth < 10) Then sMonth = "0" & sMonth sDay = Day(oNow) If (sDay < 10) Then sDay = "0" & sDay GetCreationDate = sYear & "-" & sMonth & "-" & sDay End Function '' ' ... Function InfoBox(ByVal sText, ByVal iSecondsToWait) Dim oShell If (bRunFromCmd = False) Then 'If run from command line... Set oShell = Wscript.CreateObject("WScript.Shell") InfoBox = oShell.Popup(sText, iSecondsToWait, Wscript.ScriptName, 64) Else 'If NOT run from command line... Wscript.Echo sText End If End Function