source: trunk/lang/res_translator.rb @ 709

Revision 709, 5.2 KB checked in by Eoin, 12 years ago (diff)
Line 
1# This ruby script ... has very little in the way of error checking ;-)
2
3require "iconv"
4require "yaml"
5require "rubyscript2exe"
6
7exit if RUBYSCRIPT2EXE.is_compiling?
8
9def compile_dlls(arg)
10
11        puts " - - Wrote new language file"
12       
13        puts "\n - Compiling 32bit resource file\n\n"
14       
15        system "call tools\\rc \"..\\res\\"+arg+".rc\""
16
17        system "call tools\\cvtres /MACHINE:X86 \"..\\res\\"+arg+".res\""
18        system "call tools\\link /NOENTRY /DLL /MACHINE:X86 /OUT:\".\\bin\\x86\\"+arg+".dll\" \"..\\res\\"+arg+".obj\""
19       
20        puts " - Compiling 64bit resource file\n\n"
21
22        system "call tools\\cvtres /MACHINE:AMD64 \"..\\res\\"+arg+".res\""
23        system "call tools\\link /NOENTRY /DLL /MACHINE:AMD64 /OUT:\".\\bin\\x64\\"+arg+".dll\" \"..\\res\\"+arg+".obj\""
24
25        puts " - Cleaning temp files\n\n"
26       
27#       system "del \"..\\res\\"+arg+".rc\""
28        system "del \"..\\res\\"+arg+".res\""
29        system "del \"..\\res\\"+arg+".obj\""
30       
31        puts " - Done\n\n"     
32end
33
34resource_dir = ARGV.shift
35resource_name = ARGV.shift
36
37resource_array = Array.new
38resource_filename = resource_dir+resource_name+'.rc'
39resource_original_file = ""
40
41ignore_filename = "ignore.yaml"
42ignore_array = Array.new
43
44begin
45        puts " + "+resource_filename
46        res_language_file = File.open(resource_filename, "r+b")
47
48        if resource_original_file = res_language_file.gets(nil)
49               
50                begin
51                        resource_original_file = Iconv.iconv('UTF-8', 'UTF-16LE', 
52                                resource_original_file).join
53                               
54                        puts " - loaded base resource file."   
55                rescue
56                        puts " ! Uincode conversion issue."
57                end     
58
59                resource_file = resource_original_file.clone
60               
61                begin   # Parse the translation file.   
62                        File.open(ignore_filename, File::CREAT) do |ignore_yaml_file|
63                                ignore_array = YAML::load( ignore_yaml_file ) 
64                        end
65                rescue
66                        puts " ! No ignore file."
67                end
68               
69                # First we strip comments so they don't confuse the map and also lines starting with '#'
70                resource_file.gsub!(/\/\/.*/, "\n")
71                resource_file.gsub!(/#.*/, "\n")
72                resource_file.gsub!(Regexp.new('\/\*.*?\*\/', Regexp::MULTILINE), "\n")
73
74                # Collect all strings in the resource file
75                resource_file.scan(/\".*?\"/) do |text_string|
76                        if (not ignore_array.include?(text_string))                             
77                               
78                                if text_string.include?(';')
79                                        # Split semicolon deliminated strings
80                                        text_string.delete('"').split(';').each {|s| resource_array.push('"'+s+'"') }                                   
81                                else
82                                        resource_array.push(text_string)
83                                end
84                               
85                        end
86                end
87               
88                resource_array.uniq!
89        end
90
91rescue
92        puts " ! Problem reading base resource file."
93        exit
94end     
95
96#       puts resource_array
97               
98ARGV.each do |arg| 
99
100        # Parse any translated strings already present.
101       
102        lang_filename = arg+".txt"
103        lang_map = Hash.new
104       
105        puts "\n + "+lang_filename
106       
107        File.open(lang_filename, 'r+') do |language_file|
108       
109                while lang_line = language_file.gets
110                        lang_line.scan(/(\".*?\")\s*--->\s*(\".*?\")/) do |original, trans| 
111                               
112                                if original.include?(';')
113                                        # Split semicolon deliminated strings
114                                       
115                                        o = original.delete('"').split(';')
116                                        t = trans.delete('"').split(';')
117                                         
118                                        o.each_index {|i| lang_map['"'+o[i]+'"'] = '"'+t[i]+'"' }                               
119                                else
120                                        lang_map[original] = trans
121                                end
122                        end
123                end
124        end
125       
126        puts " - - Scanned"     
127       
128#       puts lang_map
129       
130        begin   
131                if res_lang = resource_original_file.clone
132               
133                        res_lang.gsub!(/\".*?\"/) do |text_string|
134
135                                if text_string.include?(';')
136                                        # Rebuild semicolon deliminated strings
137                               
138                                        tmp = ''
139                                       
140                                        text_string.delete('"').split(';').each do |s| 
141                                       
142                                                if lang_map.has_key?('"'+s+'"')
143                                                        tmp = tmp+ lang_map['"'+s+'"'].delete('"') +';'
144                                                else           
145                                                        tmp = tmp+s+';' 
146                                                end                             
147                                        end
148                                       
149                                        tmp = '"'+tmp.chomp!(';')+'"'
150                                                                               
151                                else
152                                        if lang_map.has_key?(text_string)
153                                                lang_map[text_string]
154                                        else
155                                                text_string
156                                        end
157                                end
158                        end
159                       
160                       
161                        begin
162                                local_file = File.new(resource_dir+arg+'.rc', "w+b")
163                                local_file.print(Iconv.iconv('UTF-16LE', 'UTF-8', res_lang))
164                                local_file.close
165                                puts " - - Constructed localized resource file"         
166                        rescue
167                                puts " ! Problem writing localized resource file."
168                                next 
169                        end     
170                end
171               
172        rescue
173                puts " ! Problem reading/creating existing localized resource file."
174                next 
175        end             
176       
177        begin   
178                lang_file = File.new(lang_filename, 'w+')
179               
180                # Special case for 'English' and 'English.rtf' to bring them to the top of list.
181               
182                resource_array.delete('"English"')
183                if lang_map.has_key?('"English"')
184                        lang_file.print('"English"' + " ---> " + lang_map['"English"'] + "\n")
185                else
186                        lang_file.print('"English"' + " --->  ??? \n")
187                end
188                       
189                resource_array.delete('"English.rtf"')
190                if lang_map.has_key?('"English.rtf"')
191                        lang_file.print('"English.rtf"' + " ---> " + lang_map['"English.rtf"'] + "\n")
192                else
193                        lang_file.print('"English.rtf"' + " --->  ??? \n")
194                end     
195               
196                # Process rest alphabeticially [sic].
197
198                resource_array.sort.each do |value|     
199                        if lang_map.has_key?(value)
200                                lang_file.print(value + " ---> " + lang_map[value] + "\n")
201                        else
202                                lang_file.print(value + " --->  ??? \n")
203                        end
204                end     
205        rescue
206                puts " ! Problem writing new language file."
207                next 
208        end     
209       
210        compile_dlls(arg)
211end
212
213puts " - Completed sucessfully" 
Note: See TracBrowser for help on using the repository browser.