From c0bc0c70aa97ddb360a3388a86c3042a4e19fce0 Mon Sep 17 00:00:00 2001 From: Simon Rozman Date: Fri, 16 Sep 2016 14:42:17 +0200 Subject: [PATCH] MSI.wsf enhancements - IDT2PO arguments reordered to make job reusable for POT extraction - IDTTranslate job added to replace "rcxgettext.exe idtp" functionality --- IDT.js | 161 +++++++++++++------ MSI.wsf | 207 ++++++++++++++----------- PO.js | 454 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ String.js | 121 ++++++--------- 4 files changed, 732 insertions(+), 211 deletions(-) create mode 100644 PO.js diff --git a/IDT.js b/IDT.js index 46f6067..355ff3f 100644 --- a/IDT.js +++ b/IDT.js @@ -19,29 +19,50 @@ */ /*@cc_on @*/ -/*@if (! @__IDT_JS__) @*/ -/*@set @__IDT_JS__ = true @*/ +/*@if (! @_escapeIDT_JS__) @*/ +/*@set @_escapeIDT_JS__ = true @*/ - -function CodePageToId(codepage) +var escapeIDT_stat = null; +function escapeIDT(str) { - switch (codepage) { - case 932 : return "shift-jis"; - case 936 : return "gb2312"; - case 949 : return "euc-kr"; - case 950 : return "big5"; - case 874 : - case 1250: - case 1251: - case 1252: - case 1253: - case 1254: - case 1255: - case 1256: - case 1257: - case 1258: return "windows-" + codepage; - default : throw new Error("Unsupported code page."); + if (!escapeIDT_stat) { + escapeIDT_stat = { + "re_lf": new RegExp("\n", "g"), + "re_cr": new RegExp("\r", "g"), + "re_tab": new RegExp("\t", "g") + }; } + + if (str == null) return null; + switch (typeof(str)) { + case "string": break; + case "undefined": return null; + default: try { str = str.toString(); } catch (err) { return null; } + } + + return str.replace(escapeIDT_stat.re_lf, "\\n").replace(escapeIDT_stat.re_cr, "\\r").replace(escapeIDT_stat.re_tab, "\\t"); +} + + +var unescapeIDT_stat = null; +function unescapeIDT(str) +{ + if (!unescapeIDT_stat) { + unescapeIDT_stat = { + "re_lf": new RegExp("\\\\n", "g"), + "re_cr": new RegExp("\\\\r", "g"), + "re_tab": new RegExp("\\\\t", "g") + }; + } + + if (str == null) return null; + switch (typeof(str)) { + case "string": break; + case "undefined": return null; + default: try { str = str.toString(); } catch (err) { return null; } + } + + return str.replace(unescapeIDT_stat.re_lf, "\n").replace(unescapeIDT_stat.re_cr, "\r").replace(unescapeIDT_stat.re_tab, "\t"); } @@ -53,7 +74,7 @@ function IDT(path) dat.Open(); try { - // IDT is text file, uses CRLF line breaks and Windows 1252 header. + // IDT is text file, uses MSDOS line breaks and Windows 1252 header. dat.Type = adTypeText; dat.LineSeparator = adCRLF; dat.Charset = "windows-1252"; @@ -63,7 +84,7 @@ function IDT(path) var parseRow = function(row) { for (var col in row) - row[col] = CRLF2LF(_unC(row[col])); + row[col] = CRLF2LF(unescapeIDT(row[col])); return row; } @@ -93,32 +114,76 @@ function IDT(path) dat.Charset = CodePageToId(this.codepage); // Skip header. - dat.ReadText(adReadLine); - dat.ReadText(adReadLine); - dat.ReadText(adReadLine); + dat.SkipLine(); + dat.SkipLine(); + dat.SkipLine(); // Parse data and build associative array. this.data = new Array(); + this.linenum = new Array(); + var linenum = 4; while (!dat.EOS) { line = parseRow(dat.ReadText(adReadLine).split("\t")); var key = new Array(); for (var i in this.key) key.push(line[this.key[i]]); this.data[key] = line; + this.linenum[key] = linenum++; } } finally { dat.Close(); } } + +IDT.prototype.save = function(path) +{ + // Build output IDT file in memory. + var dat = WScript.CreateObject("ADODB.Stream"); + dat.Open(); + try { + // IDT is text file, uses MSDOS line breaks, and specific encoding (optional). + dat.Type = adTypeText; + dat.LineSeparator = adCRLF; + if ("codepage" in this) + dat.Charset = CodePageToId(this.codepage); + + var buildRow = function(row) { + for (var col in row) + row[col] = escapeIDT(LF2CRLF(row[col])); + return row; + } + + // Write header. + dat.WriteText(buildRow(this.columns).join("\t"), adWriteLine); + dat.WriteText(buildRow(this.types ).join("\t"), adWriteLine); + var meta = new Array(); + if (WScript.Arguments.Named.Exists("CP")) + meta.push(WScript.Arguments.Named("CP")); + meta.push(this.table); + for (var key in this.key) + meta.push(this.columns[this.key[key]]); + dat.WriteText(buildRow(meta).join("\t"), adWriteLine); + + // Save data. + for (var key in this.data) + dat.WriteText(buildRow(this.data[key]).join("\t"), adWriteLine); + + // Save to file. + dat.SaveToFile(path, adSaveCreateOverWrite); + } finally { + dat.Close(); + } +} + /*@end @*/ // SIG // Begin signature block // SIG // MIIXmAYJKoZIhvcNAQcCoIIXiTCCF4UCAQExCzAJBgUr // SIG // DgMCGgUAMGcGCisGAQQBgjcCAQSgWTBXMDIGCisGAQQB // SIG // gjcCAR4wJAIBAQQQEODJBs441BGiowAQS9NQkAIBAAIB -// SIG // AAIBAAIBAAIBADAhMAkGBSsOAwIaBQAEFM8VLy9MohNO -// SIG // CzcQIdkRVyOGdiKcoIISyDCCA+4wggNXoAMCAQICEH6T +// SIG // AAIBAAIBAAIBADAhMAkGBSsOAwIaBQAEFDK3v7xPfQA4 +// SIG // KZZoKH2KE80Twx3HoIISyDCCA+4wggNXoAMCAQICEH6T // SIG // 6/t8xk5Z6kuad9QG/DswDQYJKoZIhvcNAQEFBQAwgYsx // SIG // CzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENh // SIG // cGUxFDASBgNVBAcTC0R1cmJhbnZpbGxlMQ8wDQYDVQQK @@ -272,30 +337,30 @@ function IDT(path) // SIG // OWQwCQYFKw4DAhoFAKBwMBAGCisGAQQBgjcCAQwxAjAA // SIG // MBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisG // SIG // AQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMCMGCSqGSIb3 -// SIG // DQEJBDEWBBTfJgGHRKQ2tinqe14PycjEqCboeTANBgkq -// SIG // hkiG9w0BAQEFAASCAQAdZIIOXCs3tEP8LMe5TFe9UL1d -// SIG // A+9n5HmR9CglRlSImbMohrztrWc2aSZ/G3ITRUdsszHV -// SIG // smqtKGN6Ci6nosFuvrMdRLIqx6xQt/DpBTPPMd0VARGJ -// SIG // uR6sZP77IR0zoLnIKxhW7dZe3GEM5sZbuHE0xWOb+ZVB -// SIG // +5GNoXiCZLN8YO2P+QOrG0csrcL21sZUP1PLYHCUTjt3 -// SIG // 9Mz/0WfSh8Y5YE/LKeFFrx6xWZRPzQOk9pnxO/oQUjkS -// SIG // orbbKtB7X0eSWY+tQBwEblFTlxZpVQZYjzI6o3jHN5xy -// SIG // 7ILoVfXXoI/dJi83/WSuK8p4IIWR3Z050SWjpdRsSpja -// SIG // QPqiM5NjoYICCzCCAgcGCSqGSIb3DQEJBjGCAfgwggH0 +// SIG // DQEJBDEWBBT3K5DzXHaaaztTUWYcKscHz5goHTANBgkq +// SIG // hkiG9w0BAQEFAASCAQBCIQ7y8ZVmNZke0OJsfe38h/25 +// SIG // VCuB1bCSqiqF7+el2gXbKcQSMSpbF+PqG6HjtzMiFncJ +// SIG // myApTJ+AyBh8ScoRwa+XoOeIV+TPwW2UKy1FUUJ7TAi7 +// SIG // /R7LhYq2xuhcAt6S0kxXy/qDJhhhPSXovi1d1dlNHINT +// SIG // wPy9yPeTqD8eSug3xYvt6rsKtQEqJyITIjeU4YIQWDDw +// SIG // UfdCLhybrtbvyZ881KICrkol/u3DzPF6L9CiHayFYXUO +// SIG // ToJOGPiGOAedHLWFpFG0QdYZvQogtzZcYuFtZWbTx/ud +// SIG // SSXr5BOydkUZ0qjAQoIWuUZbdhGfPoVGQOPUzQVChKYj +// SIG // yn/1DQrfoYICCzCCAgcGCSqGSIb3DQEJBjGCAfgwggH0 // SIG // AgEBMHIwXjELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5 // SIG // bWFudGVjIENvcnBvcmF0aW9uMTAwLgYDVQQDEydTeW1h // SIG // bnRlYyBUaW1lIFN0YW1waW5nIFNlcnZpY2VzIENBIC0g // SIG // RzICEA7P9DjI/r81bgTYapgbGlAwCQYFKw4DAhoFAKBd // SIG // MBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZI -// SIG // hvcNAQkFMQ8XDTE2MDkxNTA5NTQxNlowIwYJKoZIhvcN -// SIG // AQkEMRYEFOYsLSnDfzdhw/4I8pCP0bgfeIz9MA0GCSqG -// SIG // SIb3DQEBAQUABIIBAJqxWik7hDX5hTBagi4lQlhzhvTA -// SIG // y/771WsTQ/zKHfcxmS4ArMbZuuabEMnit58NmX7FAzij -// SIG // U7I+i/bnLl/PArICQ/CSUAG6gfyQY02hMdq82zdsX5yd -// SIG // me13e/4YHxSigRnr+k90BbvkKRbdEWgRgxLMhe/WAZ/W -// SIG // wM7VucTmX4MpcX5eUa85rsUkLMicl2dpGBV8X1cZaA79 -// SIG // Tv3vpQPiXQ2OMr+Mew6ZL687pYVxOLgnG4WYNZxopoeG -// SIG // 9n/wZL0iHWQSxB5sQCyEBztGxDjCxKGKyy9XSVzXC3L+ -// SIG // 0Ax68XmDRzh0ntkIo3oPCQscaVEgh8PI0ZwlY66u1phb -// SIG // BtAzkCM= +// SIG // hvcNAQkFMQ8XDTE2MDkxNjEyMzczMlowIwYJKoZIhvcN +// SIG // AQkEMRYEFHa81Osey4h4aGVWL2y16ek6c50BMA0GCSqG +// SIG // SIb3DQEBAQUABIIBAIyk3446yLyAYUB/wxL7SYuRdyBQ +// SIG // zVPGxWbW73lgTAPzWMqWVtkEOPEe1z6T1us5Ss9OFQ8g +// SIG // P3VbDUfvIxNA2q0a2Z+GgS8tyrlQK1WswLdv11mmVmGa +// SIG // c4+FG5pZu0KEHkzAhTfq6H6DPg+fz46OTCyxYaNIYzHp +// SIG // azs8tyylmjFS9jEo57Fo+Px23ISqEmBsGVx8vEMY0+N7 +// SIG // UOh1sVj8XTHrZi9DHAvs+JX1o5XcYW+9tRiQshrXgba6 +// SIG // QVSb21e5G7lPMPWD1tGLfbCqKhDYqHFCy5RnQbfYaWTh +// SIG // ZnjfmfQ9+/2MWbRdFNqscheuMcasYaEQWFsTiMV/p7D6 +// SIG // MP2TGpo= // SIG // End signature block diff --git a/MSI.wsf b/MSI.wsf index a4f4404..5812075 100644 --- a/MSI.wsf +++ b/MSI.wsf @@ -458,15 +458,95 @@ - Extract strings to translate by comparing two IDT files. - - + Extract strings to translate. If already translated IDT file is available, extract translations of matching rows (by IDT key column(s)). + + + + + + Translate IDT file. + + + + + + + +