chromium/components/cronet/tools/generate_accept_languages.py

# Copyright 2017 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# This script generates a header containing a dictionary from locales to
# accept language strings from chromium's .xtb files.  It is not very
# robust at the moment, and makes some assumptions about the format of
# the files, including at least the following:
#   * assumes necessary data is contained only with files of the form
#     components/strings/components_locale_settings_${LANG}.xtb
#   * assumes ${LANG} is identified in the lang attribute of the root
#     element of the file's xml data
#   * assumes that there is only one relevant element with the
#     IDS_ACCEPT_LANGUAGES attribute

from __future__ import print_function

import os
import re
import sys
from xml.etree import ElementTree

STRINGS_DIR = sys.argv[2] + 'components/strings/'

# pylint: disable=inconsistent-return-statements
def extract_accept_langs(filename):
  tree = ElementTree.parse(STRINGS_DIR + filename).getroot()
  for child in tree:
    if child.get('id') == 'IDS_ACCEPT_LANGUAGES':
      return tree.get('lang'), child.text
# pylint: enable=inconsistent-return-statements

def gen_accept_langs_table():
  accept_langs_list = [extract_accept_langs(filename)
    for filename in os.listdir(STRINGS_DIR)
    if re.match(r'components_locale_settings_\S+.xtb', filename)]
  return dict(accept_langs for accept_langs in accept_langs_list
    if accept_langs)

HEADER = "static NSDictionary* const acceptLangs = @{"
def LINE(locale, accept_langs):
  return '  @"' + locale + '" : @"' + accept_langs + '",'
FOOTER = "};"

def main():
  with open(sys.argv[1] + "/accept_languages_table.h", "w+") as f:
    print(HEADER, file=f)
    for (locale, accept_langs) in gen_accept_langs_table().items():
      print(LINE(locale, accept_langs), file=f)
    print(FOOTER, file=f)

if __name__ == "__main__":
  main()