| Index: grit/node/structure.py | 
| diff --git a/grit/node/structure.py b/grit/node/structure.py | 
| index e7cda61ba8651ca2a4293af0df976bfacf57cb05..5b30037d1d2ec1860fb7137f68a2fb32b5449613 100644 | 
| --- a/grit/node/structure.py | 
| +++ b/grit/node/structure.py | 
| @@ -26,15 +26,6 @@ import grit.gather.txt | 
| import grit.format.rc | 
| import grit.format.rc_header | 
|  | 
| -# RTL languages | 
| -# TODO(jennyz): remove this fixed set of RTL language array | 
| -# when generic expand_variable code is added by grit team. | 
| -_RTL_LANGS = [ | 
| -  'ar', | 
| -  'iw', | 
| -  'ur', | 
| -] | 
| - | 
| # Type of the gatherer to use for each type attribute | 
| _GATHERERS = { | 
| 'accelerators' : grit.gather.rc.Accelerators, | 
| @@ -185,6 +176,21 @@ class StructureNode(base.Node): | 
| return self.attrs['type'] in [ | 
| 'tr_html', 'admin_template', 'txt', 'muppet', 'igoogle'] | 
|  | 
| +  def ExpandVariables(self): | 
| +    '''Variable expansion on structures is controlled by an XML attribute. | 
| + | 
| +    However, old files assume that expansion is always on for Rc files. | 
| + | 
| +    Returns: | 
| +      A boolean. | 
| +    ''' | 
| +    attrs = self.GetRoot().attrs | 
| +    if 'grit_version' in attrs and attrs['grit_version'] > 1: | 
| +      return self.attrs['expand_variables'] == 'true' | 
| +    else: | 
| +      return (self.attrs['expand_variables'] == 'true' or | 
| +              self.attrs['file'].lower().endswith('.rc')) | 
| + | 
| def FileForLanguage(self, lang, output_dir, create_file=True, | 
| return_if_not_generated=True): | 
| '''Returns the filename of the file associated with this structure, | 
| @@ -225,15 +231,11 @@ class StructureNode(base.Node): | 
| file_object = util.WrapOutputStream(file(filename, 'wb'), | 
| self._GetOutputEncoding()) | 
| file_contents = util.FixLineEnd(text, self.GetLineEnd()) | 
| -      if self.attrs['expand_variables'] == 'true': | 
| -        file_contents = file_contents.replace('[GRITLANGCODE]', lang) | 
| -        # TODO(jennyz): remove this hard coded logic for expanding | 
| -        # [GRITDIR] variable for RTL languages when the generic | 
| -        # expand_variable code is added by grit team. | 
| -        if lang in _RTL_LANGS : | 
| -          file_contents = file_contents.replace('[GRITDIR]', 'dir="RTL"') | 
| -        else : | 
| -          file_contents = file_contents.replace('[GRITDIR]', 'dir="LTR"') | 
| +      if self.ExpandVariables(): | 
| +        # Note that we reapply substitution a second time here. | 
| +        # This is because a) we need to look inside placeholders | 
| +        # b) the substitution values are language-dependent | 
| +        file_contents = self.GetRoot().substituter.Substitute(file_contents) | 
| if self._ShouldAddBom(): | 
| file_object.write(constants.BOM) | 
| file_object.write(file_contents) | 
| @@ -264,7 +266,7 @@ class StructureNode(base.Node): | 
| ''' | 
| return self.attrs['output_encoding'].endswith('-sig') | 
|  | 
| -  # static method | 
| +  @staticmethod | 
| def Construct(parent, name, type, file, encoding='cp1252'): | 
| '''Creates a new node which is a child of 'parent', with attributes set | 
| by parameters of the same name. | 
| @@ -277,5 +279,14 @@ class StructureNode(base.Node): | 
| node.HandleAttribute('encoding', encoding) | 
| node.EndParsing() | 
| return node | 
| -  Construct = staticmethod(Construct) | 
| + | 
| +  def SubstituteMessages(self, substituter): | 
| +    '''Propagates substitution to gatherer. | 
| + | 
| +    Args: | 
| +      substituter: a grit.util.Substituter object. | 
| +    ''' | 
| +    assert self.gatherer | 
| +    if self.ExpandVariables(): | 
| +      self.gatherer.SubstituteMessages(substituter) | 
|  | 
|  |