OLD | NEW |
1 #!/usr/bin/python | 1 #!/usr/bin/env python |
2 # Copyright (c) 2011 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2011 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 """This script generates an rc file and header (setup_strings.{rc,h}) to be | 6 """This script generates an rc file and header (setup_strings.{rc,h}) to be |
7 included in setup.exe. The rc file includes translations for strings pulled | 7 included in setup.exe. The rc file includes translations for strings pulled |
8 from generated_resource.grd and the localized .xtb files. | 8 from generated_resource.grd and the localized .xtb files. |
9 | 9 |
10 The header file includes IDs for each string, but also has values to allow | 10 The header file includes IDs for each string, but also has values to allow |
11 getting a string based on a language offset. For example, the header file | 11 getting a string based on a language offset. For example, the header file |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
69 'IDS_INSTALL_MULTI_INSTALLATION_EXISTS', | 69 'IDS_INSTALL_MULTI_INSTALLATION_EXISTS', |
70 'IDS_INSTALL_READY_MODE_REQUIRES_CHROME', | 70 'IDS_INSTALL_READY_MODE_REQUIRES_CHROME', |
71 'IDS_INSTALL_INCONSISTENT_UPDATE_POLICY', | 71 'IDS_INSTALL_INCONSISTENT_UPDATE_POLICY', |
72 'IDS_OEM_MAIN_SHORTCUT_NAME', | 72 'IDS_OEM_MAIN_SHORTCUT_NAME', |
73 'IDS_SHORTCUT_TOOLTIP', | 73 'IDS_SHORTCUT_TOOLTIP', |
74 ] | 74 ] |
75 | 75 |
76 # The ID of the first resource string. | 76 # The ID of the first resource string. |
77 kFirstResourceID = 1600 | 77 kFirstResourceID = 1600 |
78 | 78 |
| 79 |
79 class TranslationStruct: | 80 class TranslationStruct: |
80 """A helper struct that holds information about a single translation.""" | 81 """A helper struct that holds information about a single translation.""" |
81 def __init__(self, resource_id_str, language, translation): | 82 def __init__(self, resource_id_str, language, translation): |
82 self.resource_id_str = resource_id_str | 83 self.resource_id_str = resource_id_str |
83 self.language = language | 84 self.language = language |
84 self.translation = translation | 85 self.translation = translation |
85 | 86 |
86 def __cmp__(self, other): | 87 def __cmp__(self, other): |
87 """Allow TranslationStructs to be sorted by id.""" | 88 """Allow TranslationStructs to be sorted by id.""" |
88 id_result = cmp(self.resource_id_str, other.resource_id_str) | 89 id_result = cmp(self.resource_id_str, other.resource_id_str) |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
145 for i, string_id in enumerate(kStringIds): | 146 for i, string_id in enumerate(kStringIds): |
146 translated_string = translation_nodes.get(translation_ids[i], | 147 translated_string = translation_nodes.get(translation_ids[i], |
147 message_texts[i]) | 148 message_texts[i]) |
148 translated_strings.append(TranslationStruct(string_id, | 149 translated_strings.append(TranslationStruct(string_id, |
149 language, | 150 language, |
150 translated_string)) | 151 translated_string)) |
151 | 152 |
152 translated_strings.sort() | 153 translated_strings.sort() |
153 return translated_strings | 154 return translated_strings |
154 | 155 |
| 156 |
155 def WriteRCFile(translated_strings, out_filename): | 157 def WriteRCFile(translated_strings, out_filename): |
156 """Writes a resource (rc) file with all the language strings provided in | 158 """Writes a resource (rc) file with all the language strings provided in |
157 |translated_strings|.""" | 159 |translated_strings|.""" |
158 kHeaderText = ( | 160 kHeaderText = ( |
159 u'#include "%s.h"\n\n' | 161 u'#include "%s.h"\n\n' |
160 u'STRINGTABLE\n' | 162 u'STRINGTABLE\n' |
161 u'BEGIN\n' | 163 u'BEGIN\n' |
162 ) % os.path.basename(out_filename) | 164 ) % os.path.basename(out_filename) |
163 kFooterText = ( | 165 kFooterText = ( |
164 u'END\n' | 166 u'END\n' |
165 ) | 167 ) |
166 lines = [kHeaderText] | 168 lines = [kHeaderText] |
167 for translation_struct in translated_strings: | 169 for translation_struct in translated_strings: |
168 # Escape special characters for the rc file. | 170 # Escape special characters for the rc file. |
169 translation = (translation_struct.translation.replace('"', '""') | 171 translation = (translation_struct.translation.replace('"', '""') |
170 .replace('\t', '\\t') | 172 .replace('\t', '\\t') |
171 .replace('\n', '\\n')) | 173 .replace('\n', '\\n')) |
172 lines.append(u' %s "%s"\n' % (translation_struct.resource_id_str + '_' | 174 lines.append(u' %s "%s"\n' % (translation_struct.resource_id_str + '_' |
173 + translation_struct.language, | 175 + translation_struct.language, |
174 translation)) | 176 translation)) |
175 lines.append(kFooterText) | 177 lines.append(kFooterText) |
176 outfile = open(out_filename + '.rc', 'wb') | 178 outfile = open(out_filename + '.rc', 'wb') |
177 outfile.write(''.join(lines).encode('utf-16')) | 179 outfile.write(''.join(lines).encode('utf-16')) |
178 outfile.close() | 180 outfile.close() |
179 | 181 |
| 182 |
180 def WriteHeaderFile(translated_strings, out_filename): | 183 def WriteHeaderFile(translated_strings, out_filename): |
181 """Writes a .h file with resource ids. This file can be included by the | 184 """Writes a .h file with resource ids. This file can be included by the |
182 executable to refer to identifiers.""" | 185 executable to refer to identifiers.""" |
183 lines = [] | 186 lines = [] |
184 do_languages_lines = ['#define DO_LANGUAGES'] | 187 do_languages_lines = ['#define DO_LANGUAGES'] |
185 | 188 |
186 # Write the values for how the languages ids are offset. | 189 # Write the values for how the languages ids are offset. |
187 seen_languages = set() | 190 seen_languages = set() |
188 offset_id = 0 | 191 offset_id = 0 |
189 for translation_struct in translated_strings: | 192 for translation_struct in translated_strings: |
(...skipping 22 matching lines...) Expand all Loading... |
212 translated_strings[0].language)) | 215 translated_strings[0].language)) |
213 | 216 |
214 outfile = open(out_filename + '.h', 'wb') | 217 outfile = open(out_filename + '.h', 'wb') |
215 outfile.write('\n'.join(lines)) | 218 outfile.write('\n'.join(lines)) |
216 outfile.write('\n#ifndef RC_INVOKED\n') | 219 outfile.write('\n#ifndef RC_INVOKED\n') |
217 outfile.write(' \\\n'.join(do_languages_lines)) | 220 outfile.write(' \\\n'.join(do_languages_lines)) |
218 # .rc files must end in a new line | 221 # .rc files must end in a new line |
219 outfile.write('\n#endif // ndef RC_INVOKED\n') | 222 outfile.write('\n#endif // ndef RC_INVOKED\n') |
220 outfile.close() | 223 outfile.close() |
221 | 224 |
| 225 |
222 def main(argv): | 226 def main(argv): |
| 227 # TODO: Use optparse to parse command line flags. |
| 228 if len(argv) < 2: |
| 229 print 'Usage:\n %s <output_directory> [branding]' % argv[0] |
| 230 return 1 |
223 branding = '' | 231 branding = '' |
224 if (len(sys.argv) > 2): | 232 if (len(sys.argv) > 2): |
225 branding = argv[2] | 233 branding = argv[2] |
226 translated_strings = CollectTranslatedStrings(branding) | 234 translated_strings = CollectTranslatedStrings(branding) |
227 kFilebase = os.path.join(argv[1], 'installer_util_strings') | 235 kFilebase = os.path.join(argv[1], 'installer_util_strings') |
228 WriteRCFile(translated_strings, kFilebase) | 236 WriteRCFile(translated_strings, kFilebase) |
229 WriteHeaderFile(translated_strings, kFilebase) | 237 WriteHeaderFile(translated_strings, kFilebase) |
| 238 return 0 |
| 239 |
230 | 240 |
231 if '__main__' == __name__: | 241 if '__main__' == __name__: |
232 if len(sys.argv) < 2: | 242 sys.exit(main(sys.argv)) |
233 print 'Usage:\n %s <output_directory> [branding]' % sys.argv[0] | |
234 sys.exit(1) | |
235 # Use optparse to parse command line flags. | |
236 main(sys.argv) | |
OLD | NEW |