Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(103)

Side by Side Diff: grit/format/rc.py

Issue 9965022: Allow substitution of messages as variables in other messages. (Closed) Base URL: https://grit-i18n.googlecode.com/svn/trunk
Patch Set: Fix unit tests for policy writers. Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2012 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 '''Support for formatting an RC file for compilation. 6 '''Support for formatting an RC file for compilation.
7 ''' 7 '''
8 8
9 import os 9 import os
10 import types 10 import types
11 import re 11 import re
12 12
13 from grit import lazy_re 13 from grit import lazy_re
14 from grit import util 14 from grit import util
15 from grit.format import interface 15 from grit.format import interface
16 from grit.node import misc
17
16 18
17 ''' 19 '''
18 This dictionary defines the langauge charset pair lookup table, which is used 20 This dictionary defines the langauge charset pair lookup table, which is used
19 for replacing the GRIT expand variables for language info in Product Version 21 for replacing the GRIT expand variables for language info in Product Version
20 resource. The key is the language ISO country code, and the value 22 resource. The key is the language ISO country code, and the value
21 is the language and character-set pair, which is a hexadecimal string 23 is the language and character-set pair, which is a hexadecimal string
22 consisting of the concatenation of the language and character-set identifiers. 24 consisting of the concatenation of the language and character-set identifiers.
23 The first 4 digit of the value is the hex value of LCID, the remaining 25 The first 4 digit of the value is the hex value of LCID, the remaining
24 4 digits is the hex value of character-set id(code page)of the language. 26 4 digits is the hex value of character-set id(code page)of the language.
25 27
(...skipping 14 matching lines...) Expand all
40 END 42 END
41 BLOCK "VarFileInfo" 43 BLOCK "VarFileInfo"
42 BEGIN 44 BEGIN
43 VALUE "Translation", [GRITVERLANGID], [GRITVERCHARSETID] 45 VALUE "Translation", [GRITVERLANGID], [GRITVERCHARSETID]
44 END 46 END
45 END 47 END
46 48
47 ''' 49 '''
48 50
49 _LANGUAGE_CHARSET_PAIR = { 51 _LANGUAGE_CHARSET_PAIR = {
50 'ar' : '040104e8', 52 # Language neutral LCID, unicode(1200) code page.
51 'fi' : '040b04e4', 53 'neutral' : '000004b0',
52 'ko' : '041203b5', 54 # LANG_USER_DEFAULT LCID, unicode(1200) code page.
53 'es' : '040a04e4', 55 'userdefault' : '040004b0',
54 'bg' : '040204e3', 56 'ar' : '040104e8',
57 'fi' : '040b04e4',
58 'ko' : '041203b5',
59 'es' : '040a04e4',
60 'bg' : '040204e3',
55 # No codepage for filipino, use unicode(1200). 61 # No codepage for filipino, use unicode(1200).
56 'fil' : '046404b0', 62 'fil' : '046404e4',
57 'fr' : '040c04e4', 63 'fr' : '040c04e4',
58 'lv' : '042604e9', 64 'lv' : '042604e9',
59 'sv' : '041d04e4', 65 'sv' : '041d04e4',
60 'ca' : '040304e4', 66 'ca' : '040304e4',
61 'de' : '040704e4', 67 'de' : '040704e4',
62 'lt' : '042704e9', 68 'lt' : '042704e9',
63 # Do not use! This is only around for backwards 69 # Do not use! This is only around for backwards
64 # compatibility. Use file instead. 70 # compatibility and will be removed - use fil instead
65 'tl' : '0c0004b0', 71 'tl' : '0c0004b0',
66 'zh-CN' : '080403a8', 72 'zh-CN' : '080403a8',
67 'el' : '040804e5', 73 'zh-TW' : '040403b6',
68 'no' : '041404e4', 74 'zh-HK' : '0c0403b6',
69 'th' : '041e036a', 75 'el' : '040804e5',
70 'zh-TW' : '040403b6', 76 'no' : '041404e4',
71 'iw' : '040d04e7', 77 'th' : '041e036a',
72 'pl' : '041504e2', 78 'he' : '040d04e7',
73 'tr' : '041f04e6', 79 'iw' : '040d04e7',
74 'hr' : '041a04e4', 80 'pl' : '041504e2',
75 # No codepage for hindi, use unicode(1200). 81 'tr' : '041f04e6',
76 'hi' : '043904b0', 82 'hr' : '041a04e4',
77 'pt-PT' : '081604e4', 83 # No codepage for Hindi, use unicode(1200).
78 'pt-BR' : '041604e4', 84 'hi' : '043904b0',
79 'uk' : '042204e3', 85 'pt-PT' : '081604e4',
80 'cs' : '040504e2', 86 'pt-BR' : '041604e4',
81 'hu' : '040e04e2', 87 'uk' : '042204e3',
82 'ro' : '041804e2', 88 'cs' : '040504e2',
83 # No codepage for urdu, use unicode(1200). 89 'hu' : '040e04e2',
84 'ur' : '042004b0', 90 'ro' : '041804e2',
85 'da' : '040604e4', 91 # No codepage for Urdu, use unicode(1200).
86 'is' : '040f04e4', 92 'ur' : '042004b0',
87 'ru' : '041904e3', 93 'da' : '040604e4',
88 'vi' : '042a04ea', 94 'is' : '040f04e4',
89 'nl' : '041304e4', 95 'ru' : '041904e3',
90 'id' : '042104e4', 96 'vi' : '042a04ea',
91 'sr' : '081a04e2', 97 'nl' : '041304e4',
92 'en-GB' : '0809040e', 98 'id' : '042104e4',
93 'it' : '041004e4', 99 'sr' : '081a04e2',
94 'sk' : '041b04e2', 100 'en-GB' : '0809040e',
95 'et' : '042504e9', 101 'it' : '041004e4',
96 'ja' : '041103a4', 102 'sk' : '041b04e2',
97 'sl' : '042404e2', 103 'et' : '042504e9',
98 'en' : '040904b0', 104 'ja' : '041103a4',
99 'fake_bidi' : '040d04e7', 105 'sl' : '042404e2',
106 'en' : '040904b0',
107 # LCID for Mexico; Windows does not support L.A. LCID.
108 'es-419' : '080a04e4',
109 # No codepage for Bengali, use unicode(1200).
110 'bn' : '044504b0',
111 'fa' : '042904e8',
112 # No codepage for Gujarati, use unicode(1200).
113 'gu' : '044704b0',
114 # No codepage for Kannada, use unicode(1200).
115 'kn' : '044b04b0',
116 # Malay (Malaysia) [ms-MY]
117 'ms' : '043e04e4',
118 # No codepage for Malayalam, use unicode(1200).
119 'ml' : '044c04b0',
120 # No codepage for Marathi, use unicode(1200).
121 'mr' : '044e04b0',
122 # No codepage for Oriya , use unicode(1200).
123 'or' : '044804b0',
124 # No codepage for Tamil, use unicode(1200).
125 'ta' : '044904b0',
126 # No codepage for Telugu, use unicode(1200).
127 'te' : '044a04b0',
128 # No codepage for Amharic, use unicode(1200). >= Vista.
129 'am' : '045e04b0',
130 'sw' : '044104e4',
131 'af' : '043604e4',
132 'eu' : '042d04e4',
133 'fr-CA' : '0c0c04e4',
134 'gl' : '045604e4',
135 # No codepage for Zulu, use unicode(1200).
136 'zu' : '043504b0',
137 'fake-bidi' : '040d04e7',
100 } 138 }
101 139
140 # There is no appropriate sublang for Spanish (Latin America) [es-419], so we
141 # use Mexico. SUBLANG_DEFAULT would incorrectly map to Spain. Unlike other
142 # Latin American countries, Mexican Spanish is supported by VERSIONINFO:
143 # http://msdn.microsoft.com/en-us/library/aa381058.aspx
144
102 _LANGUAGE_DIRECTIVE_PAIR = { 145 _LANGUAGE_DIRECTIVE_PAIR = {
103 'ar' : 'LANG_ARABIC, SUBLANG_DEFAULT', 146 'neutral' : 'LANG_NEUTRAL, SUBLANG_NEUTRAL',
104 'fi' : 'LANG_FINNISH, SUBLANG_DEFAULT', 147 'userdefault' : 'LANG_NEUTRAL, SUBLANG_DEFAULT',
105 'ko' : 'LANG_KOREAN, SUBLANG_KOREAN', 148 'ar' : 'LANG_ARABIC, SUBLANG_DEFAULT',
106 'es' : 'LANG_SPANISH, SUBLANG_SPANISH_MODERN', 149 'fi' : 'LANG_FINNISH, SUBLANG_DEFAULT',
107 'bg' : 'LANG_BULGARIAN, SUBLANG_DEFAULT', 150 'ko' : 'LANG_KOREAN, SUBLANG_KOREAN',
108 'fil' : '100, SUBLANG_DEFAULT', # LANG_FILIPINO is not in winnt.h 151 'es' : 'LANG_SPANISH, SUBLANG_SPANISH_MODERN',
109 'fr' : 'LANG_FRENCH, SUBLANG_FRENCH', 152 'bg' : 'LANG_BULGARIAN, SUBLANG_DEFAULT',
110 'lv' : 'LANG_LATVIAN, SUBLANG_DEFAULT', 153 # LANG_FILIPINO (100) not in VC 7 winnt.h.
111 'sv' : 'LANG_SWEDISH, SUBLANG_SWEDISH', 154 'fil' : '100, SUBLANG_DEFAULT',
112 'ca' : 'LANG_CATALAN, SUBLANG_DEFAULT', 155 'fr' : 'LANG_FRENCH, SUBLANG_FRENCH',
113 'de' : 'LANG_GERMAN, SUBLANG_GERMAN', 156 'lv' : 'LANG_LATVIAN, SUBLANG_DEFAULT',
114 'lt' : 'LANG_LITHUANIAN, SUBLANG_LITHUANIAN', 157 'sv' : 'LANG_SWEDISH, SUBLANG_SWEDISH',
115 'tl' : 'LANG_NEUTRAL, SUBLANG_DEFAULT', # Do not use! See above. 158 'ca' : 'LANG_CATALAN, SUBLANG_DEFAULT',
116 'zh-CN' : 'LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED', 159 'de' : 'LANG_GERMAN, SUBLANG_GERMAN',
117 'el' : 'LANG_GREEK, SUBLANG_DEFAULT', 160 'lt' : 'LANG_LITHUANIAN, SUBLANG_LITHUANIAN',
118 'no' : 'LANG_NORWEGIAN, SUBLANG_DEFAULT', 161 # Do not use! See above.
119 'th' : 'LANG_THAI, SUBLANG_DEFAULT', 162 'tl' : 'LANG_NEUTRAL, SUBLANG_DEFAULT',
120 'zh-TW' : 'LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL', 163 'zh-CN' : 'LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED',
121 'iw' : 'LANG_HEBREW, SUBLANG_DEFAULT', 164 'zh-TW' : 'LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL',
122 'pl' : 'LANG_POLISH, SUBLANG_DEFAULT', 165 'zh-HK' : 'LANG_CHINESE, SUBLANG_CHINESE_HONGKONG',
123 'tr' : 'LANG_TURKISH, SUBLANG_DEFAULT', 166 'el' : 'LANG_GREEK, SUBLANG_DEFAULT',
124 'hr' : 'LANG_CROATIAN, SUBLANG_DEFAULT', 167 'no' : 'LANG_NORWEGIAN, SUBLANG_DEFAULT',
125 'hi' : 'LANG_HINDI, SUBLANG_DEFAULT', 168 'th' : 'LANG_THAI, SUBLANG_DEFAULT',
126 'pt-BR' : 'LANG_PORTUGUESE, SUBLANG_DEFAULT', 169 'he' : 'LANG_HEBREW, SUBLANG_DEFAULT',
127 'pt-PT' : 'LANG_PORTUGUESE, SUBLANG_PORTUGUESE', 170 'iw' : 'LANG_HEBREW, SUBLANG_DEFAULT',
128 'uk' : 'LANG_UKRAINIAN, SUBLANG_DEFAULT', 171 'pl' : 'LANG_POLISH, SUBLANG_DEFAULT',
129 'cs' : 'LANG_CZECH, SUBLANG_DEFAULT', 172 'tr' : 'LANG_TURKISH, SUBLANG_DEFAULT',
130 'hu' : 'LANG_HUNGARIAN, SUBLANG_DEFAULT', 173 'hr' : 'LANG_CROATIAN, SUBLANG_DEFAULT',
131 'ro' : 'LANG_ROMANIAN, SUBLANG_DEFAULT', 174 'hi' : 'LANG_HINDI, SUBLANG_DEFAULT',
132 'ur' : 'LANG_URDU, SUBLANG_DEFAULT', 175 'pt-PT' : 'LANG_PORTUGUESE, SUBLANG_PORTUGUESE',
133 'da' : 'LANG_DANISH, SUBLANG_DEFAULT', 176 'pt-BR' : 'LANG_PORTUGUESE, SUBLANG_DEFAULT',
134 'is' : 'LANG_ICELANDIC, SUBLANG_DEFAULT', 177 'uk' : 'LANG_UKRAINIAN, SUBLANG_DEFAULT',
135 'ru' : 'LANG_RUSSIAN, SUBLANG_DEFAULT', 178 'cs' : 'LANG_CZECH, SUBLANG_DEFAULT',
136 'vi' : 'LANG_VIETNAMESE, SUBLANG_DEFAULT', 179 'hu' : 'LANG_HUNGARIAN, SUBLANG_DEFAULT',
137 'nl' : 'LANG_DUTCH, SUBLANG_DEFAULT', 180 'ro' : 'LANG_ROMANIAN, SUBLANG_DEFAULT',
138 'id' : 'LANG_INDONESIAN, SUBLANG_DEFAULT', 181 'ur' : 'LANG_URDU, SUBLANG_DEFAULT',
139 'sr' : 'LANG_SERBIAN, SUBLANG_SERBIAN_CYRILLIC', 182 'da' : 'LANG_DANISH, SUBLANG_DEFAULT',
140 'en-GB' : 'LANG_ENGLISH, SUBLANG_ENGLISH_UK', 183 'is' : 'LANG_ICELANDIC, SUBLANG_DEFAULT',
141 'it' : 'LANG_ITALIAN, SUBLANG_DEFAULT', 184 'ru' : 'LANG_RUSSIAN, SUBLANG_DEFAULT',
142 'sk' : 'LANG_SLOVAK, SUBLANG_DEFAULT', 185 'vi' : 'LANG_VIETNAMESE, SUBLANG_DEFAULT',
143 'et' : 'LANG_ESTONIAN, SUBLANG_DEFAULT', 186 'nl' : 'LANG_DUTCH, SUBLANG_DEFAULT',
144 'ja' : 'LANG_JAPANESE, SUBLANG_DEFAULT', 187 'id' : 'LANG_INDONESIAN, SUBLANG_DEFAULT',
145 'sl' : 'LANG_SLOVENIAN, SUBLANG_DEFAULT', 188 'sr' : 'LANG_SERBIAN, SUBLANG_SERBIAN_CYRILLIC',
146 'en' : 'LANG_ENGLISH, SUBLANG_ENGLISH_US', 189 'en-GB' : 'LANG_ENGLISH, SUBLANG_ENGLISH_UK',
147 'fake_bidi' : 'LANG_HEBREW, SUBLANG_DEFAULT', 190 'it' : 'LANG_ITALIAN, SUBLANG_DEFAULT',
191 'sk' : 'LANG_SLOVAK, SUBLANG_DEFAULT',
192 'et' : 'LANG_ESTONIAN, SUBLANG_DEFAULT',
193 'ja' : 'LANG_JAPANESE, SUBLANG_DEFAULT',
194 'sl' : 'LANG_SLOVENIAN, SUBLANG_DEFAULT',
195 'en' : 'LANG_ENGLISH, SUBLANG_ENGLISH_US',
196 # No L.A. sublang exists.
197 'es-419' : 'LANG_SPANISH, SUBLANG_SPANISH_MEXICAN',
198 'bn' : 'LANG_BENGALI, SUBLANG_DEFAULT',
199 'fa' : 'LANG_PERSIAN, SUBLANG_DEFAULT',
200 'gu' : 'LANG_GUJARATI, SUBLANG_DEFAULT',
201 'kn' : 'LANG_KANNADA, SUBLANG_DEFAULT',
202 'ms' : 'LANG_MALAY, SUBLANG_DEFAULT',
203 'ml' : 'LANG_MALAYALAM, SUBLANG_DEFAULT',
204 'mr' : 'LANG_MARATHI, SUBLANG_DEFAULT',
205 'or' : 'LANG_ORIYA, SUBLANG_DEFAULT',
206 'ta' : 'LANG_TAMIL, SUBLANG_DEFAULT',
207 'te' : 'LANG_TELUGU, SUBLANG_DEFAULT',
208 'am' : 'LANG_AMHARIC, SUBLANG_DEFAULT',
209 'sw' : 'LANG_SWAHILI, SUBLANG_DEFAULT',
210 'af' : 'LANG_AFRIKAANS, SUBLANG_DEFAULT',
211 'eu' : 'LANG_BASQUE, SUBLANG_DEFAULT',
212 'fr-CA' : 'LANG_FRENCH, SUBLANG_FRENCH_CANADIAN',
213 'gl' : 'LANG_GALICIAN, SUBLANG_DEFAULT',
214 'zu' : 'LANG_ZULU, SUBLANG_DEFAULT',
215 'fake-bidi' : 'LANG_HEBREW, SUBLANG_DEFAULT',
148 } 216 }
149 217
150 def GetLangCharsetPair(language) : 218 def GetLangCharsetPair(language):
151 if _LANGUAGE_CHARSET_PAIR.has_key(language) : 219 if _LANGUAGE_CHARSET_PAIR.has_key(language):
152 return _LANGUAGE_CHARSET_PAIR[language] 220 return _LANGUAGE_CHARSET_PAIR[language]
153 else : 221 else:
154 print 'Warning:GetLangCharsetPair() found undefined language %s' %(language) 222 print 'Warning:GetLangCharsetPair() found undefined language %s' %(language)
155 return '' 223 return ''
156 224
157 def GetLangDirectivePair(language) : 225 def GetLangDirectivePair(language):
158 if _LANGUAGE_DIRECTIVE_PAIR.has_key(language) : 226 if _LANGUAGE_DIRECTIVE_PAIR.has_key(language):
159 return _LANGUAGE_DIRECTIVE_PAIR[language] 227 return _LANGUAGE_DIRECTIVE_PAIR[language]
160 else : 228 else:
161 print 'Warning:GetLangDirectivePair() found undefined language %s' % (langua ge) 229 print 'Warning:GetLangDirectivePair() found undefined language %s' % (langua ge)
162 return 'unknown language: see tools/grit/format/rc.py' 230 return 'unknown language: see tools/grit/format/rc.py'
163 231
164 def GetLangIdHex(language) : 232 def GetLangIdHex(language):
165 if _LANGUAGE_CHARSET_PAIR.has_key(language) : 233 if _LANGUAGE_CHARSET_PAIR.has_key(language):
166 langcharset = _LANGUAGE_CHARSET_PAIR[language] 234 langcharset = _LANGUAGE_CHARSET_PAIR[language]
167 lang_id = '0x' + langcharset[0:4] 235 lang_id = '0x' + langcharset[0:4]
168 return lang_id 236 return lang_id
169 else : 237 else:
170 print 'Warning:GetLangIdHex() found undefined language %s' %(language) 238 print 'Warning:GetLangIdHex() found undefined language %s' %(language)
171 return '' 239 return ''
172 240
173 241
174 def GetCharsetIdDecimal(language) : 242 def GetCharsetIdDecimal(language):
175 if _LANGUAGE_CHARSET_PAIR.has_key(language) : 243 if _LANGUAGE_CHARSET_PAIR.has_key(language):
176 langcharset = _LANGUAGE_CHARSET_PAIR[language] 244 langcharset = _LANGUAGE_CHARSET_PAIR[language]
177 charset_decimal = int(langcharset[4:], 16) 245 charset_decimal = int(langcharset[4:], 16)
178 return str(charset_decimal) 246 return str(charset_decimal)
179 else : 247 else:
180 print 'Warning:GetCharsetIdDecimal() found undefined language %s' %(language ) 248 print 'Warning:GetCharsetIdDecimal() found undefined language %s' %(language )
181 return '' 249 return ''
182 250
183 251
184 def GetUnifiedLangCode(language) : 252 def GetUnifiedLangCode(language) :
185 r = re.compile('([a-z]{1,2})_([a-z]{1,2})') 253 r = re.compile('([a-z]{1,2})_([a-z]{1,2})')
186 if r.match(language) : 254 if r.match(language) :
187 underscore = language.find('_') 255 underscore = language.find('_')
188 return language[0:underscore] + '-' + language[underscore + 1:].upper() 256 return language[0:underscore] + '-' + language[underscore + 1:].upper()
189 else : 257 else :
190 return language 258 return language
191 259
192 260
261 def RcSubstitutions(substituter, lang):
262 '''Add language-based substitutions for Rc files to the substitutor.'''
263 unified_lang_code = GetUnifiedLangCode(lang)
264 substituter.AddSubstitutions({
265 'GRITVERLANGCHARSETHEX': GetLangCharsetPair(unified_lang_code),
266 'GRITVERLANGID': GetLangIdHex(unified_lang_code),
267 'GRITVERCHARSETID': GetCharsetIdDecimal(unified_lang_code)})
268
269
193 class TopLevel(interface.ItemFormatter): 270 class TopLevel(interface.ItemFormatter):
194 '''Writes out the required preamble for RC files.''' 271 '''Writes out the required preamble for RC files.'''
195 def Format(self, item, lang='en', begin_item=True, output_dir='.'): 272 def Format(self, item, lang='en', output_dir='.'):
196 assert isinstance(lang, types.StringTypes) 273 assert isinstance(lang, types.StringTypes)
197 if not begin_item: 274 assert isinstance(item, misc.GritNode)
198 return '' 275 # Find the location of the resource header file, so that we can include
199 else: 276 # it.
200 # Find the location of the resource header file, so that we can include 277 resource_header = 'resource.h' # fall back to this
201 # it. 278 language_directive = ''
202 resource_header = 'resource.h' # fall back to this 279 for output in item.GetRoot().GetOutputFiles():
203 language_directive = '' 280 if output.attrs['type'] == 'rc_header':
204 for output in item.GetRoot().GetOutputFiles(): 281 resource_header = os.path.abspath(output.GetOutputFilename())
205 if output.attrs['type'] == 'rc_header': 282 resource_header = util.MakeRelativePath(output_dir, resource_header)
206 resource_header = os.path.abspath(output.GetOutputFilename()) 283 if output.attrs['lang'] != lang:
207 resource_header = util.MakeRelativePath(output_dir, resource_header) 284 continue
208 if output.attrs['lang'] != lang: 285 if output.attrs['language_section'] == '':
209 continue 286 # If no language_section is requested, no directive is added
210 if output.attrs['language_section'] == '': 287 # (Used when the generated rc will be included from another rc
211 # If no language_section is requested, no directive is added 288 # file that will have the appropriate language directive)
212 # (Used when the generated rc will be included from another rc 289 language_directive = ''
213 # file that will have the appropriate language directive) 290 elif output.attrs['language_section'] == 'neutral':
214 language_directive = '' 291 # If a neutral language section is requested (default), add a
215 elif output.attrs['language_section'] == 'neutral': 292 # neutral language directive
216 # If a neutral language section is requested (default), add a 293 language_directive = 'LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL'
217 # neutral language directive 294 elif output.attrs['language_section'] == 'lang':
218 language_directive = 'LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL' 295 language_directive = 'LANGUAGE %s' % GetLangDirectivePair(lang)
219 elif output.attrs['language_section'] == 'lang': 296 resource_header = resource_header.replace('\\', '\\\\')
220 language_directive = 'LANGUAGE %s' % GetLangDirectivePair(lang) 297 return '''// Copyright (c) Google Inc. %d
221 resource_header = resource_header.replace('\\', '\\\\')
222 return '''// Copyright (c) Google Inc. %d
223 // All rights reserved. 298 // All rights reserved.
224 // This file is automatically generated by GRIT. Do not edit. 299 // This file is automatically generated by GRIT. Do not edit.
225 300
226 #include "%s" 301 #include "%s"
227 #include <winresrc.h> 302 #include <winresrc.h>
228 #ifdef IDC_STATIC 303 #ifdef IDC_STATIC
229 #undef IDC_STATIC 304 #undef IDC_STATIC
230 #endif 305 #endif
231 #define IDC_STATIC (-1) 306 #define IDC_STATIC (-1)
232 307
233 %s 308 %s
234 309
235 310
236 ''' % (util.GetCurrentYear(), resource_header, language_directive) 311 ''' % (util.GetCurrentYear(), resource_header, language_directive)
237 # end Format() function 312 # end Format() function
238 313
239 314
240 315
241 class StringTable(interface.ItemFormatter): 316 class StringTable(interface.ItemFormatter):
242 '''Surrounds a collection of string messages with the required begin and 317 '''Surrounds a collection of string messages with the required begin and
243 end blocks to declare a string table.''' 318 end blocks to declare a string table.'''
244 319
245 def Format(self, item, lang='en', begin_item=True, output_dir='.'): 320 def Format(self, item, lang='en', output_dir='.'):
246 assert isinstance(lang, types.StringTypes) 321 assert isinstance(lang, types.StringTypes)
247 if begin_item: 322 return 'STRINGTABLE\nBEGIN\n'
248 return 'STRINGTABLE\nBEGIN\n' 323
249 else: 324 def FormatEnd(self, item, lang='en', output_dir='.'):
250 return 'END\n\n' 325 assert isinstance(lang, types.StringTypes)
326 return 'END\n\n'
251 327
252 328
253 class Message(interface.ItemFormatter): 329 class Message(interface.ItemFormatter):
254 '''Writes out a single message to a string table.''' 330 '''Writes out a single message to a string table.'''
255 331
256 def Format(self, item, lang='en', begin_item=True, output_dir='.'): 332 def Format(self, item, lang='en', output_dir='.'):
257 from grit.node import message 333 from grit.node import message
258 if not begin_item:
259 return ''
260
261 assert isinstance(lang, types.StringTypes) 334 assert isinstance(lang, types.StringTypes)
262 assert isinstance(item, message.MessageNode) 335 assert isinstance(item, message.MessageNode)
263 336
264 message = item.ws_at_start + item.Translate(lang) + item.ws_at_end 337 message = item.ws_at_start + item.Translate(lang) + item.ws_at_end
265 # Escape quotation marks (RC format uses doubling-up 338 # Escape quotation marks (RC format uses doubling-up
266 message = message.replace('"', '""') 339 message = message.replace('"', '""')
267 # Replace linebreaks with a \n escape 340 # Replace linebreaks with a \n escape
268 message = util.LINEBREAKS.sub(r'\\n', message) 341 message = util.LINEBREAKS.sub(r'\\n', message)
342 substituter = getattr(item.GetRoot(), 'substituter', None)
343 if substituter:
344 message = substituter.Substitute(message)
269 345
270 name_attr = item.GetTextualIds()[0] 346 name_attr = item.GetTextualIds()[0]
271 347
272 return ' %-15s "%s"\n' % (name_attr, message) 348 return ' %-15s "%s"\n' % (name_attr, message)
273 349
274 350
275 class RcSection(interface.ItemFormatter): 351 class RcSection(interface.ItemFormatter):
276 '''Writes out an .rc file section.''' 352 '''Writes out an .rc file section.'''
277 353
278 def Format(self, item, lang='en', begin_item=True, output_dir='.'): 354 def Format(self, item, lang='en', output_dir='.'):
279 if not begin_item:
280 return ''
281
282 assert isinstance(lang, types.StringTypes) 355 assert isinstance(lang, types.StringTypes)
283 from grit.node import structure 356 from grit.node import structure
284 assert isinstance(item, structure.StructureNode) 357 assert isinstance(item, structure.StructureNode)
285 358
286 if item.IsExcludedFromRc(): 359 if item.IsExcludedFromRc():
287 return '' 360 return ''
288 else: 361 else:
289 text = item.gatherer.Translate( 362 text = item.gatherer.Translate(
290 lang, skeleton_gatherer=item.GetSkeletonGatherer(), 363 lang, skeleton_gatherer=item.GetSkeletonGatherer(),
291 pseudo_if_not_available=item.PseudoIsAllowed(), 364 pseudo_if_not_available=item.PseudoIsAllowed(),
292 fallback_to_english=item.ShouldFallbackToEnglish()) + '\n\n' 365 fallback_to_english=item.ShouldFallbackToEnglish()) + '\n\n'
293 366
294 # Replace the language expand_variables in version rc info. 367 # Replace the language expand_variables in version rc info.
295 unified_lang_code = GetUnifiedLangCode(lang) 368 if item.ExpandVariables():
296 if text.find('[GRITVERLANGCHARSETHEX]') != -1: 369 substituter = getattr(item.GetRoot(), 'substituter', None)
297 text = text.replace('[GRITVERLANGCHARSETHEX]', 370 if substituter:
298 GetLangCharsetPair(unified_lang_code)) 371 text = substituter.Substitute(text)
299 if text.find('[GRITVERLANGID]') != -1:
300 text = text.replace('[GRITVERLANGID]', GetLangIdHex(unified_lang_code))
301 if text.find('[GRITVERCHARSETID]') != -1:
302 text = text.replace('[GRITVERCHARSETID]',
303 GetCharsetIdDecimal(unified_lang_code))
304 372
305 return text 373 return text
306 374
307 375
308 class RcInclude(interface.ItemFormatter): 376 class RcInclude(interface.ItemFormatter):
309 '''Writes out an item that is included in an .rc file (e.g. an ICON)''' 377 '''Writes out an item that is included in an .rc file (e.g. an ICON)'''
310 378
311 def __init__(self, type, filenameWithoutPath = 0, relative_path = 0, 379 def __init__(self, type, filenameWithoutPath = 0, relative_path = 0,
312 flatten_html = 0): 380 flatten_html = 0):
313 '''Indicates to the instance what the type of the resource include is, 381 '''Indicates to the instance what the type of the resource include is,
314 e.g. 'ICON' or 'HTML'. Case must be correct, i.e. if the type is all-caps 382 e.g. 'ICON' or 'HTML'. Case must be correct, i.e. if the type is all-caps
315 the parameter should be all-caps. 383 the parameter should be all-caps.
316 384
317 Args: 385 Args:
318 type: 'ICON' 386 type: 'ICON'
319 ''' 387 '''
320 self.type_ = type 388 self.type_ = type
321 self.filenameWithoutPath = filenameWithoutPath 389 self.filenameWithoutPath = filenameWithoutPath
322 self.relative_path_ = relative_path 390 self.relative_path_ = relative_path
323 self.flatten_html = flatten_html 391 self.flatten_html = flatten_html
324 392
325 def Format(self, item, lang='en', begin_item=True, output_dir='.'): 393 def Format(self, item, lang='en', output_dir='.'):
326 if not begin_item:
327 return ''
328
329 assert isinstance(lang, types.StringTypes) 394 assert isinstance(lang, types.StringTypes)
330 from grit.node import structure 395 from grit.node import structure
331 from grit.node import include 396 from grit.node import include
332 assert isinstance(item, (structure.StructureNode, include.IncludeNode)) 397 assert isinstance(item, (structure.StructureNode, include.IncludeNode))
333 assert (isinstance(item, include.IncludeNode) or 398 assert (isinstance(item, include.IncludeNode) or
334 item.attrs['type'] in ['tr_html', 'admin_template', 'txt', 'muppet'] ) 399 item.attrs['type'] in ['tr_html', 'admin_template', 'txt', 'muppet'] )
335 400
336 # By default, we use relative pathnames to included resources so that 401 # By default, we use relative pathnames to included resources so that
337 # sharing the resulting .rc files is possible. 402 # sharing the resulting .rc files is possible.
338 # 403 #
339 # The FileForLanguage() Function has the side effect of generating the file 404 # The FileForLanguage() Function has the side effect of generating the file
340 # if needed (e.g. if it is an HTML file include). 405 # if needed (e.g. if it is an HTML file include).
341 filename = os.path.abspath(item.FileForLanguage(lang, output_dir)) 406 filename = os.path.abspath(item.FileForLanguage(lang, output_dir))
342 if self.flatten_html: 407 if self.flatten_html:
343 filename = item.Flatten(output_dir) 408 filename = item.Flatten(output_dir)
344 elif self.filenameWithoutPath: 409 elif self.filenameWithoutPath:
345 filename = os.path.basename(filename) 410 filename = os.path.basename(filename)
346 elif self.relative_path_: 411 elif self.relative_path_:
347 filename = util.MakeRelativePath(output_dir, filename) 412 filename = util.MakeRelativePath(output_dir, filename)
348 413
349 filename = filename.replace('\\', '\\\\') # escape for the RC format 414 filename = filename.replace('\\', '\\\\') # escape for the RC format
350 415
351 if isinstance(item, structure.StructureNode) and item.IsExcludedFromRc(): 416 if isinstance(item, structure.StructureNode) and item.IsExcludedFromRc():
352 return '' 417 return ''
353 else: 418 else:
354 return '%-18s %-18s "%s"\n' % (item.attrs['name'], self.type_, filename) 419 return '%-18s %-18s "%s"\n' % (item.attrs['name'], self.type_, filename)
355 420
OLDNEW
« no previous file with comments | « grit/format/policy_templates/writers/writer_unittest_common.py ('k') | grit/format/rc_header.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698