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.
+
+
+
+
+
+
+
+
+