summaryrefslogtreecommitdiff
path: root/media/baseset/translations.vbs
blob: c167886930bdaf3d1e7426f240f617791e925810 (plain)
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