| Index: build/toolchain/mac/copy_bundle_data.py | 
| diff --git a/build/toolchain/mac/copy_bundle_data.py b/build/toolchain/mac/copy_bundle_data.py | 
| index 976591c08ee309a1df86d71d3bd6ce66d3865edc..15127a0ce9bfc6a7fb17d9a91f7fc4f9df3c6d7b 100644 | 
| --- a/build/toolchain/mac/copy_bundle_data.py | 
| +++ b/build/toolchain/mac/copy_bundle_data.py | 
| @@ -8,7 +8,7 @@ import shutil | 
| import sys | 
|  | 
|  | 
| -def detect_encoding(data, default_encoding='UTF-8'): | 
| +def DetectEncoding(data, default_encoding='UTF-8'): | 
| """Detects the encoding used by |data| from the Byte-Order-Mark if present. | 
|  | 
| Args: | 
| @@ -31,7 +31,7 @@ def detect_encoding(data, default_encoding='UTF-8'): | 
| return default_encoding | 
|  | 
|  | 
| -def copy_strings_file(source, dest): | 
| +def CopyStringsFile(source, dest, strings_format): | 
| """Copies a .strings file from |source| to |dest| and convert it to UTF-16. | 
|  | 
| Args: | 
| @@ -46,18 +46,34 @@ def copy_strings_file(source, dest): | 
| #     CFPropertyListCreateFromXMLData(): Old-style plist parser: missing | 
| #     semicolon in dictionary. | 
| # on invalid files. Do the same kind of validation. | 
| -  from CoreFoundation import CFDataCreate, CFPropertyListCreateFromXMLData | 
| -  cfdata = CFDataCreate(None, data, len(data)) | 
| -  _, error = CFPropertyListCreateFromXMLData(None, cfdata, 0, None) | 
| +  import CoreFoundation as CF | 
| +  cfdata = CF.CFDataCreate(None, data, len(data)) | 
| +  plist, error = CF.CFPropertyListCreateFromXMLData(None, cfdata, 0, None) | 
| if error: | 
| raise ValueError(error) | 
|  | 
| -  encoding = detect_encoding(data) | 
| -  with open(dest, 'wb') as dest_file: | 
| -    dest_file.write(data.decode(encoding).encode('UTF-16')) | 
| - | 
| - | 
| -def copy_file(source, dest): | 
| +  if strings_format == 'legacy': | 
| +    encoding = DetectEncoding(data) | 
| +    with open(dest, 'wb') as dest_file: | 
| +      dest_file.write(data.decode(encoding).encode('UTF-16')) | 
| +  else: | 
| +    cfformat = { | 
| +      'xml1': CF.kCFPropertyListXMLFormat_v1_0, | 
| +      'binary1': CF.kCFPropertyListBinaryFormat_v1_0, | 
| +    }[strings_format] | 
| +    cfdata, error = CF.CFPropertyListCreateData( | 
| +        None, plist, CF.kCFPropertyListBinaryFormat_v1_0, | 
| +        0, None) | 
| +    if error: | 
| +      raise ValueError(error) | 
| + | 
| +    data = CF.CFDataGetBytes( | 
| +        cfdata, CF.CFRangeMake(0, CF.CFDataGetLength(cfdata)), None) | 
| +    with open(dest, 'wb') as dest_file: | 
| +      dest_file.write(data) | 
| + | 
| + | 
| +def CopyFile(source, dest, strings_format): | 
| """Copies a file or directory from |source| to |dest|. | 
|  | 
| Args: | 
| @@ -79,20 +95,23 @@ def copy_file(source, dest): | 
|  | 
| _, extension = os.path.splitext(source) | 
| if extension == '.strings': | 
| -    copy_strings_file(source, dest) | 
| +    CopyStringsFile(source, dest, strings_format) | 
| return | 
|  | 
| shutil.copy(source, dest) | 
|  | 
|  | 
| -def main(): | 
| +def Main(): | 
| parser = argparse.ArgumentParser( | 
| description='copy source to destination for the creation of a bundle') | 
| +  parser.add_argument('--strings-format', | 
| +      choices=('xml1', 'binary1', 'legacy'), default='legacy', | 
| +      help='convert .strings file to format (default: %(default)s)') | 
| parser.add_argument('source', help='path to source file or directory') | 
| parser.add_argument('dest', help='path to destination') | 
| args = parser.parse_args() | 
|  | 
| -  copy_file(args.source, args.dest) | 
| +  CopyFile(args.source, args.dest, args.strings_format) | 
|  | 
| if __name__ == '__main__': | 
| -  main() | 
| +  sys.exit(Main()) | 
|  |