1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
|
Option Explicit
' This file is part of OpenTTD.
' OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
' OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
' See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
Dim FSO
Set FSO = CreateObject("Scripting.FileSystemObject")
Dim inputfile, outputfile, langpath, extra_grf
inputfile = WScript.Arguments(0)
outputfile = WScript.Arguments(1)
langpath = WScript.Arguments(2)
If WScript.Arguments.Length > 3 Then
extra_grf = WScript.Arguments(3)
End If
Function GetExtraGrfHash
Dim WSO, exe, line
Set WSO = WScript.CreateObject("WScript.Shell")
Set exe = WSO.Exec("certutil -hashfile " & extra_grf & " MD5")
Do Until exe.StdOut.AtEndOfStream
line = exe.StdOut.ReadLine
If Len(line) = 32 Then GetExtraGrfHash = line
Loop
Set WSO = Nothing
End Function
' Simple insertion sort, copied from translations.awk
Sub ISort(a)
Dim i, j, n, hold
n = UBound(a)
For i = 1 To n
j = i
hold = a(j)
Do While a(j - 1) > hold
j = j - 1
a(j + 1) = a(j)
If j = 0 Then Exit Do
Loop
a(j) = hold
Next
End Sub
Sub Lookup(ini_key, str_id, outfile)
Dim folder, file, line, p, lang, i
' Ensure only complete string matches
str_id = str_id & " "
Set folder = FSO.GetFolder(langpath)
Dim output()
ReDim output(folder.Files.Count)
For Each file In folder.Files
If UCase(FSO.GetExtensionName(file.Name)) = "TXT" Then
Dim f
Set f = CreateObject("ADODB.Stream")
f.Charset = "utf-8"
f.LineSeparator = 10 ' Assume lines end with \n even for \r\n files
f.Open
f.LoadFromFile(file.Path)
Do Until f.EOS
line = Replace(f.ReadText(-2), Chr(13), "") ' Read a line and remove any \r
If InStr(1, line, "##isocode ") = 1 Then
p = Split(line)
lang = p(1)
ElseIf InStr(1, line, str_id) = 1 Then
p = Split(line, ":", 2)
If lang = "en_GB" Then
output(i) = ini_key & " = " & p(1)
Else
output(i) = ini_key & "." & lang & " = " & p(1)
End If
i = i + 1
End If
Loop
f.Close
End If
Next
ReDim Preserve output(i - 1)
ISort output
For Each line In output
outfile.WriteText line, 1
Next
End Sub
Dim line, p
Dim infile
Set infile = FSO.OpenTextFile(inputfile)
Dim outfile
Set outfile = CreateObject("ADODB.Stream")
outfile.Charset = "utf-8"
outfile.Open
Do Until infile.atEndOfStream
line = infile.ReadLine()
If InStr(1, line, "ORIG_EXTRA.GRF ") = 1 Then
p = Split(line, "=")
If Trim(p(1)) = "" Then
outfile.WriteText "ORIG_EXTRA.GRF = " & GetExtraGrfHash(), 1
Else
outfile.WriteText line, 1
End If
ElseIf InStr(1, line, "!! ") = 1 Then
p = Split(line)
Lookup p(1), p(2), outfile
Else
outfile.WriteText line, 1
End If
Loop
' UTF-8 Text ADO Stream includes BOM, so we need to remove it
Dim outfile_noBOM
Set outfile_noBOM = CreateObject("ADODB.Stream")
outfile_noBOM.Type = 1
outfile_noBOM.Open
' Copy Text stream to Binary stream, skiping the BOM
outfile.Position = 3
outfile.CopyTo outfile_noBOM
outfile.Close
' Write the Binary stream
outfile_noBOM.SaveToFile outputfile, 2
outfile_noBOM.Close
|