예제 #1
0
def main():
    if len(sys.argv) != 3:
        usage()

    localexml = sys.argv[1]
    qtsrcdir = sys.argv[2]

    if not (os.path.isdir(qtsrcdir) and all(
            os.path.isfile(
                os.path.join(qtsrcdir, 'src', 'corelib', 'text', leaf))
            for leaf in ('qlocale_data_p.h', 'qlocale.h', 'qlocale.qdoc'))):
        usage()

    (data_temp_file,
     data_temp_file_path) = tempfile.mkstemp("qlocale_data_p.h", dir=qtsrcdir)
    data_temp_file = os.fdopen(data_temp_file, "w")
    qlocaledata_file = open(qtsrcdir + "/src/corelib/text/qlocale_data_p.h",
                            "r")
    s = qlocaledata_file.readline()
    while s and s != GENERATED_BLOCK_START:
        data_temp_file.write(s)
        s = qlocaledata_file.readline()
    data_temp_file.write(GENERATED_BLOCK_START)

    doc = xml.dom.minidom.parse(localexml)
    language_map = loadMap(doc, 'language')
    script_map = loadMap(doc, 'script')
    country_map = loadMap(doc, 'country')
    likely_subtags_map = loadLikelySubtagsMap(doc)
    default_map = {}
    for key in likely_subtags_map.keys():
        tmp = likely_subtags_map[key]
        if tmp["from"][1] == "AnyScript" and tmp["from"][
                2] == "AnyCountry" and tmp["to"][2] != "AnyCountry":
            default_map[(tmp["to"][0], tmp["to"][1])] = tmp["to"][2]
    locale_map = loadLocaleMap(doc, language_map, script_map, country_map,
                               likely_subtags_map)
    dupes = findDupes(language_map, country_map)

    cldr_version = firstChildText(doc.documentElement, "version")
    data_temp_file.write(generated_template %
                         (datetime.date.today(), cldr_version))

    # Likely subtags map
    data_temp_file.write("static const QLocaleId likely_subtags[] = {\n")
    index = 0
    for key in likely_subtags_map.keys():
        tmp = likely_subtags_map[key]
        from_language = languageNameToId(tmp["from"][0], language_map)
        from_script = scriptNameToId(tmp["from"][1], script_map)
        from_country = countryNameToId(tmp["from"][2], country_map)
        to_language = languageNameToId(tmp["to"][0], language_map)
        to_script = scriptNameToId(tmp["to"][1], script_map)
        to_country = countryNameToId(tmp["to"][2], country_map)

        cmnt_from = ""
        if from_language != 0:
            cmnt_from = cmnt_from + language_map[from_language][1]
        else:
            cmnt_from = cmnt_from + "und"
        if from_script != 0:
            if cmnt_from:
                cmnt_from = cmnt_from + "_"
            cmnt_from = cmnt_from + script_map[from_script][1]
        if from_country != 0:
            if cmnt_from:
                cmnt_from = cmnt_from + "_"
            cmnt_from = cmnt_from + country_map[from_country][1]
        cmnt_to = ""
        if to_language != 0:
            cmnt_to = cmnt_to + language_map[to_language][1]
        else:
            cmnt_to = cmnt_to + "und"
        if to_script != 0:
            if cmnt_to:
                cmnt_to = cmnt_to + "_"
            cmnt_to = cmnt_to + script_map[to_script][1]
        if to_country != 0:
            if cmnt_to:
                cmnt_to = cmnt_to + "_"
            cmnt_to = cmnt_to + country_map[to_country][1]

        data_temp_file.write("    ")
        data_temp_file.write("{ %3d, %3d, %3d }, { %3d, %3d, %3d }" %
                             (from_language, from_script, from_country,
                              to_language, to_script, to_country))
        index += 1
        if index != len(likely_subtags_map):
            data_temp_file.write(",")
        else:
            data_temp_file.write(" ")
        data_temp_file.write(" // %s -> %s\n" % (cmnt_from, cmnt_to))
    data_temp_file.write("};\n")

    data_temp_file.write("\n")

    # Locale index
    data_temp_file.write("static const quint16 locale_index[] = {\n")
    index = 0
    for key in language_map.keys():
        i = 0
        count = languageCount(key, locale_map)
        if count > 0:
            i = index
            index += count
        data_temp_file.write("%6d, // %s\n" % (i, language_map[key][0]))
    data_temp_file.write("     0 // trailing 0\n")
    data_temp_file.write("};\n\n")

    list_pattern_part_data = StringData('list_pattern_part_data')
    single_character_data = StringData('single_character_data')
    date_format_data = StringData('date_format_data')
    time_format_data = StringData('time_format_data')
    days_data = StringData('days_data')
    am_data = StringData('am_data')
    pm_data = StringData('pm_data')
    byte_unit_data = StringData('byte_unit_data')
    currency_symbol_data = StringData('currency_symbol_data')
    currency_display_name_data = StringData('currency_display_name_data')
    currency_format_data = StringData('currency_format_data')
    endonyms_data = StringData('endonyms_data')

    # Locale data
    data_temp_file.write("static const QLocaleData locale_data[] = {\n")
    # Table headings: keep each label centred in its field, matching line_format:
    data_temp_file.write(
        '   // '
        # Width 6 + comma:
        + ' lang  '  # IDs
        + 'script ' + '  terr '

        # Range entries (all start-indices, then all sizes):
        # Width 5 + comma:
        + 'lStrt '  # List pattern
        + 'lpMid ' + 'lpEnd ' + 'lPair ' + 'lDelm '  # List delimiter
        # Representing numbers:
        + ' dec  ' + 'group ' + 'prcnt ' + ' zero ' + 'minus ' + 'plus  ' +
        ' exp  '
        # Quotation marks
        + 'qtOpn ' + 'qtEnd ' + 'altQO ' + 'altQE ' + 'lDFmt '  # Date format
        + 'sDFmt ' + 'lTFmt '  # Time format
        + 'sTFmt ' + 'slDay '  # Day names
        + 'lDays ' + 'ssDys ' + 'sDays ' + 'snDay ' + 'nDays ' +
        '  am  '  # am/pm indicators
        + '  pm  ' + ' byte ' + 'siQnt ' + 'iecQn ' +
        'crSym '  # Currency formatting:
        + 'crDsp ' + 'crFmt ' + 'crFNg ' +
        'ntLng '  # Name of language in itself, and of territory:
        + 'ntTer '
        # Width 3 + comma for each size; no header
        + '    ' * 37

        # Strays (char array, bit-fields):
        # Width 8+4 + comma
        + '   currISO   '
        # Width 6 + comma:
        + 'curDgt '  # Currency digits
        + 'curRnd '  # Currencty rounding (unused: QTBUG-81343)
        + 'dow1st '  # First day of week
        + ' wknd+ '  # Week-end start/end days:
        + ' wknd-'
        # No trailing space on last entry (be sure to
        # pad before adding anything after it).
        + '\n')

    locale_keys = locale_map.keys()
    compareLocaleKeys.default_map = default_map
    compareLocaleKeys.locale_map = locale_map
    locale_keys.sort(compareLocaleKeys)

    line_format = (
        '    { '
        # Locale-identifier:
        + '%6d,' * 3
        # Offsets for starts of ranges:
        + '%5d,' * 37
        # Sizes for the same:
        + '%3d,' * 37

        # Currency ISO code:
        + ' %10s, '
        # Currency formatting:
        + '%6d,%6d'
        # Day of week and week-end:
        + ',%6d' * 3 + ' }')
    for key in locale_keys:
        l = locale_map[key]
        # Sequence of StringDataToken:
        ranges = (
            tuple(
                list_pattern_part_data.append(p) for p in  # 5 entries:
                (l.listPatternPartStart, l.listPatternPartMiddle,
                 l.listPatternPartEnd, l.listPatternPartTwo, l.listDelim)) +
            tuple(
                single_character_data.append(p) for p in  # 11 entries
                (l.decimal, l.group, l.percent, l.zero, l.minus, l.plus, l.exp,
                 l.quotationStart, l.quotationEnd, l.alternateQuotationStart,
                 l.alternateQuotationEnd)) + tuple(
                     date_format_data.append(f) for f in  # 2 entries:
                     (l.longDateFormat, l.shortDateFormat)) + tuple(
                         time_format_data.append(f) for f in  # 2 entries:
                         (l.longTimeFormat, l.shortTimeFormat)) +
            tuple(
                days_data.append(d) for d in  # 6 entries:
                (l.standaloneLongDays, l.longDays, l.standaloneShortDays,
                 l.shortDays, l.standaloneNarrowDays, l.narrowDays)) +
            (am_data.append(l.am), pm_data.append(l.pm)) +  # 2 entries:
            tuple(
                byte_unit_data.append(b) for b in  # 3 entries:
                (l.byte_unit, l.byte_si_quantified, l.byte_iec_quantified)) +
            (currency_symbol_data.append(l.currencySymbol),
             currency_display_name_data.append(l.currencyDisplayName),
             currency_format_data.append(l.currencyFormat),
             currency_format_data.append(l.currencyNegativeFormat),
             endonyms_data.append(l.languageEndonym),
             endonyms_data.append(l.countryEndonym))  # 6 entries
        )  # Total: 37 entries
        assert len(ranges) == 37

        data_temp_file.write(line_format %
                             ((key[0], key[1], key[2]) +
                              tuple(r.index
                                    for r in ranges) + tuple(r.length
                                                             for r in ranges) +
                              (
                                  currencyIsoCodeData(l.currencyIsoCode),
                                  l.currencyDigits,
                                  l.currencyRounding,  # unused (QTBUG-81343)
                                  l.firstDayOfWeek,
                                  l.weekendStart,
                                  l.weekendEnd)) + ", // %s/%s/%s\n" %
                             (l.language, l.script, l.country))
    data_temp_file.write(line_format  # All zeros, matching the format:
                         % ((0, ) * 3 + (0, ) * 37 * 2 +
                            (currencyIsoCodeData(0), ) + (0, ) * 2 +
                            (0, ) * 3) + " // trailing zeros\n")
    data_temp_file.write("};\n")

    # StringData tables:
    for data in (list_pattern_part_data, single_character_data,
                 date_format_data, time_format_data, days_data, byte_unit_data,
                 am_data, pm_data, currency_symbol_data,
                 currency_display_name_data, currency_format_data,
                 endonyms_data):
        data.write(data_temp_file)

    data_temp_file.write("\n")

    # Language name list
    data_temp_file.write("static const char language_name_list[] =\n")
    data_temp_file.write('"Default\\0"\n')
    for key in language_map.keys():
        if key == 0:
            continue
        data_temp_file.write('"' + language_map[key][0] + '\\0"\n')
    data_temp_file.write(";\n")

    data_temp_file.write("\n")

    # Language name index
    data_temp_file.write("static const quint16 language_name_index[] = {\n")
    data_temp_file.write("     0, // AnyLanguage\n")
    index = 8
    for key in language_map.keys():
        if key == 0:
            continue
        language = language_map[key][0]
        data_temp_file.write("%6d, // %s\n" % (index, language))
        index += len(language) + 1
    data_temp_file.write("};\n")

    data_temp_file.write("\n")

    # Script name list
    data_temp_file.write("static const char script_name_list[] =\n")
    data_temp_file.write('"Default\\0"\n')
    for key in script_map.keys():
        if key == 0:
            continue
        data_temp_file.write('"' + script_map[key][0] + '\\0"\n')
    data_temp_file.write(";\n")

    data_temp_file.write("\n")

    # Script name index
    data_temp_file.write("static const quint16 script_name_index[] = {\n")
    data_temp_file.write("     0, // AnyScript\n")
    index = 8
    for key in script_map.keys():
        if key == 0:
            continue
        script = script_map[key][0]
        data_temp_file.write("%6d, // %s\n" % (index, script))
        index += len(script) + 1
    data_temp_file.write("};\n")

    data_temp_file.write("\n")

    # Country name list
    data_temp_file.write("static const char country_name_list[] =\n")
    data_temp_file.write('"Default\\0"\n')
    for key in country_map.keys():
        if key == 0:
            continue
        data_temp_file.write('"' + country_map[key][0] + '\\0"\n')
    data_temp_file.write(";\n")

    data_temp_file.write("\n")

    # Country name index
    data_temp_file.write("static const quint16 country_name_index[] = {\n")
    data_temp_file.write("     0, // AnyCountry\n")
    index = 8
    for key in country_map.keys():
        if key == 0:
            continue
        country = country_map[key][0]
        data_temp_file.write("%6d, // %s\n" % (index, country))
        index += len(country) + 1
    data_temp_file.write("};\n")

    data_temp_file.write("\n")

    # Language code list
    data_temp_file.write("static const unsigned char language_code_list[] =\n")
    for key in language_map.keys():
        code = language_map[key][1]
        if len(code) == 2:
            code += r"\0"
        data_temp_file.write('"%2s" // %s\n' % (code, language_map[key][0]))
    data_temp_file.write(";\n")

    data_temp_file.write("\n")

    # Script code list
    data_temp_file.write("static const unsigned char script_code_list[] =\n")
    for key in script_map.keys():
        code = script_map[key][1]
        for i in range(4 - len(code)):
            code += "\\0"
        data_temp_file.write('"%2s" // %s\n' % (code, script_map[key][0]))
    data_temp_file.write(";\n")

    # Country code list
    data_temp_file.write("static const unsigned char country_code_list[] =\n")
    for key in country_map.keys():
        code = country_map[key][1]
        if len(code) == 2:
            code += "\\0"
        data_temp_file.write('"%2s" // %s\n' % (code, country_map[key][0]))
    data_temp_file.write(";\n")

    data_temp_file.write("\n")
    data_temp_file.write(GENERATED_BLOCK_END)
    s = qlocaledata_file.readline()
    # skip until end of the old block
    while s and s != GENERATED_BLOCK_END:
        s = qlocaledata_file.readline()

    s = qlocaledata_file.readline()
    while s:
        data_temp_file.write(s)
        s = qlocaledata_file.readline()
    data_temp_file.close()
    qlocaledata_file.close()

    os.remove(qtsrcdir + "/src/corelib/text/qlocale_data_p.h")
    os.rename(data_temp_file_path,
              qtsrcdir + "/src/corelib/text/qlocale_data_p.h")

    # Generate calendar data
    calendar_format = '      {%6d,%6d,%6d' + ',%5d' * 6 + ',%3d' * 6 + ' },'
    for calendar, stem in calendars.items():
        months_data = StringData('months_data')
        calendar_data_file = "q%scalendar_data_p.h" % stem
        calendar_template_file = open(
            os.path.join(qtsrcdir, 'src', 'corelib', 'time',
                         calendar_data_file), "r")
        (calendar_temp_file,
         calendar_temp_file_path) = tempfile.mkstemp(calendar_data_file,
                                                     dir=qtsrcdir)
        calendar_temp_file = os.fdopen(calendar_temp_file, "w")
        s = calendar_template_file.readline()
        while s and s != GENERATED_BLOCK_START:
            calendar_temp_file.write(s)
            s = calendar_template_file.readline()
        calendar_temp_file.write(GENERATED_BLOCK_START)
        calendar_temp_file.write(generated_template %
                                 (datetime.date.today(), cldr_version))
        calendar_temp_file.write(
            "static const QCalendarLocale locale_data[] = {\n")
        calendar_temp_file.write(
            '   // '
            # IDs, width 7 (6 + comma)
            + ' lang  ' + ' script' + ' terr  '
            # Month-name start-indices, width 6 (5 + comma):
            + 'sLng ' + 'long ' + 'sSrt ' + 'shrt ' + 'sNrw ' + 'naro '
            # No individual headers for the sizes.
            + 'Sizes...' + '\n')
        for key in locale_keys:
            l = locale_map[key]
            # Sequence of StringDataToken:
            try:
                # Twelve long month names can add up to more than 256 (e.g. kde_TZ: 264)
                ranges = (tuple(
                    months_data.append(m[calendar], 16)
                    for m in (l.standaloneLongMonths, l.longMonths)) + tuple(
                        months_data.append(m[calendar])
                        for m in (l.standaloneShortMonths, l.shortMonths,
                                  l.standaloneNarrowMonths, l.narrowMonths)))
            except ValueError as e:
                e.args += (l.language, l.script, l.country, stem)
                raise

            calendar_temp_file.write(calendar_format % (
                (key[0], key[1], key[2]) + tuple(r.index for r in ranges) +
                tuple(r.length for r in ranges)) + "// %s/%s/%s\n" %
                                     (l.language, l.script, l.country))
        calendar_temp_file.write(calendar_format % ((0, ) * (3 + 6 * 2)) +
                                 '// trailing zeros\n')
        calendar_temp_file.write("};\n")
        months_data.write(calendar_temp_file)
        s = calendar_template_file.readline()
        while s and s != GENERATED_BLOCK_END:
            s = calendar_template_file.readline()
        while s:
            calendar_temp_file.write(s)
            s = calendar_template_file.readline()
        os.rename(
            calendar_temp_file_path,
            os.path.join(qtsrcdir, 'src', 'corelib', 'time',
                         calendar_data_file))

    # qlocale.h

    (qlocaleh_temp_file,
     qlocaleh_temp_file_path) = tempfile.mkstemp("qlocale.h", dir=qtsrcdir)
    qlocaleh_temp_file = os.fdopen(qlocaleh_temp_file, "w")
    qlocaleh_file = open(qtsrcdir + "/src/corelib/text/qlocale.h", "r")
    s = qlocaleh_file.readline()
    while s and s != GENERATED_BLOCK_START:
        qlocaleh_temp_file.write(s)
        s = qlocaleh_file.readline()
    qlocaleh_temp_file.write(GENERATED_BLOCK_START)
    qlocaleh_temp_file.write(
        "// see qlocale_data_p.h for more info on generated data\n")

    # Language enum
    qlocaleh_temp_file.write("    enum Language {\n")
    language = None
    for key, value in language_map.items():
        language = fixedLanguageName(value[0], dupes)
        qlocaleh_temp_file.write("        " + language + " = " + str(key) +
                                 ",\n")

    qlocaleh_temp_file.write("\n        " + ",\n        ".join(
        '%s = %s' % pair for pair in sorted(language_aliases.items())) + ",\n")
    qlocaleh_temp_file.write("\n")
    qlocaleh_temp_file.write("        LastLanguage = " + language + "\n")
    qlocaleh_temp_file.write("    };\n\n")

    # Script enum
    qlocaleh_temp_file.write("    enum Script {\n")
    script = None
    for key, value in script_map.items():
        script = fixedScriptName(value[0], dupes)
        qlocaleh_temp_file.write("        " + script + " = " + str(key) +
                                 ",\n")
    qlocaleh_temp_file.write("\n        " + ",\n        ".join(
        '%s = %s' % pair for pair in sorted(script_aliases.items())) + ",\n")
    qlocaleh_temp_file.write("\n")
    qlocaleh_temp_file.write("        LastScript = " + script + "\n")
    qlocaleh_temp_file.write("    };\n\n")

    # Country enum
    qlocaleh_temp_file.write("    enum Country {\n")
    country = None
    for key, value in country_map.items():
        country = fixedCountryName(value[0], dupes)
        qlocaleh_temp_file.write("        " + country + " = " + str(key) +
                                 ",\n")
    qlocaleh_temp_file.write("\n        " + ",\n        ".join(
        '%s = %s' % pair for pair in sorted(country_aliases.items())) + ",\n")
    qlocaleh_temp_file.write("\n")
    qlocaleh_temp_file.write("        LastCountry = " + country + "\n")
    qlocaleh_temp_file.write("    };\n")

    qlocaleh_temp_file.write(GENERATED_BLOCK_END)
    s = qlocaleh_file.readline()
    # skip until end of the old block
    while s and s != GENERATED_BLOCK_END:
        s = qlocaleh_file.readline()

    s = qlocaleh_file.readline()
    while s:
        qlocaleh_temp_file.write(s)
        s = qlocaleh_file.readline()
    qlocaleh_temp_file.close()
    qlocaleh_file.close()

    os.remove(qtsrcdir + "/src/corelib/text/qlocale.h")
    os.rename(qlocaleh_temp_file_path,
              qtsrcdir + "/src/corelib/text/qlocale.h")

    # qlocale.qdoc

    (qlocaleqdoc_temp_file,
     qlocaleqdoc_temp_file_path) = tempfile.mkstemp("qlocale.qdoc",
                                                    dir=qtsrcdir)
    qlocaleqdoc_temp_file = os.fdopen(qlocaleqdoc_temp_file, "w")
    qlocaleqdoc_file = open(qtsrcdir + "/src/corelib/text/qlocale.qdoc", "r")
    s = qlocaleqdoc_file.readline()
    DOCSTRING = "    QLocale's data is based on Common Locale Data Repository "
    while s:
        if DOCSTRING in s:
            qlocaleqdoc_temp_file.write(DOCSTRING + "v" + cldr_version + ".\n")
        else:
            qlocaleqdoc_temp_file.write(s)
        s = qlocaleqdoc_file.readline()
    qlocaleqdoc_temp_file.close()
    qlocaleqdoc_file.close()

    os.remove(qtsrcdir + "/src/corelib/text/qlocale.qdoc")
    os.rename(qlocaleqdoc_temp_file_path,
              qtsrcdir + "/src/corelib/text/qlocale.qdoc")
예제 #2
0
def main():
    if len(sys.argv) != 3:
        usage()

    localexml = sys.argv[1]
    qtsrcdir = sys.argv[2]

    if not (os.path.isdir(qtsrcdir) and all(
            os.path.isfile(
                os.path.join(qtsrcdir, 'src', 'corelib', 'tools', leaf))
            for leaf in ('qlocale_data_p.h', 'qlocale.h', 'qlocale.qdoc'))):
        usage()

    (data_temp_file, data_temp_file_path) = tempfile.mkstemp("qlocale_data_p",
                                                             dir=qtsrcdir)
    data_temp_file = os.fdopen(data_temp_file, "w")
    qlocaledata_file = open(qtsrcdir + "/src/corelib/tools/qlocale_data_p.h",
                            "r")
    s = qlocaledata_file.readline()
    while s and s != GENERATED_BLOCK_START:
        data_temp_file.write(s)
        s = qlocaledata_file.readline()
    data_temp_file.write(GENERATED_BLOCK_START)

    doc = xml.dom.minidom.parse(localexml)
    language_map = loadMap(doc, 'language')
    script_map = loadMap(doc, 'script')
    country_map = loadMap(doc, 'country')
    likely_subtags_map = loadLikelySubtagsMap(doc)
    default_map = {}
    for key in likely_subtags_map.keys():
        tmp = likely_subtags_map[key]
        if tmp["from"][1] == "AnyScript" and tmp["from"][
                2] == "AnyCountry" and tmp["to"][2] != "AnyCountry":
            default_map[(tmp["to"][0], tmp["to"][1])] = tmp["to"][2]
    locale_map = loadLocaleMap(doc, language_map, script_map, country_map,
                               likely_subtags_map)
    dupes = findDupes(language_map, country_map)

    cldr_version = firstChildText(doc.documentElement, "version")

    data_temp_file.write("""
/*
    This part of the file was generated on %s from the
    Common Locale Data Repository v%s

    http://www.unicode.org/cldr/

    Do not edit this section: instead regenerate it using
    cldr2qlocalexml.py and qlocalexml2cpp.py on updated (or
    edited) CLDR data; see qtbase/util/local_database/.
*/

""" % (str(datetime.date.today()), cldr_version))

    # Likely subtags map
    data_temp_file.write("static const QLocaleId likely_subtags[] = {\n")
    index = 0
    for key in likely_subtags_map.keys():
        tmp = likely_subtags_map[key]
        from_language = languageNameToId(tmp["from"][0], language_map)
        from_script = scriptNameToId(tmp["from"][1], script_map)
        from_country = countryNameToId(tmp["from"][2], country_map)
        to_language = languageNameToId(tmp["to"][0], language_map)
        to_script = scriptNameToId(tmp["to"][1], script_map)
        to_country = countryNameToId(tmp["to"][2], country_map)

        cmnt_from = ""
        if from_language != 0:
            cmnt_from = cmnt_from + language_map[from_language][1]
        else:
            cmnt_from = cmnt_from + "und"
        if from_script != 0:
            if cmnt_from:
                cmnt_from = cmnt_from + "_"
            cmnt_from = cmnt_from + script_map[from_script][1]
        if from_country != 0:
            if cmnt_from:
                cmnt_from = cmnt_from + "_"
            cmnt_from = cmnt_from + country_map[from_country][1]
        cmnt_to = ""
        if to_language != 0:
            cmnt_to = cmnt_to + language_map[to_language][1]
        else:
            cmnt_to = cmnt_to + "und"
        if to_script != 0:
            if cmnt_to:
                cmnt_to = cmnt_to + "_"
            cmnt_to = cmnt_to + script_map[to_script][1]
        if to_country != 0:
            if cmnt_to:
                cmnt_to = cmnt_to + "_"
            cmnt_to = cmnt_to + country_map[to_country][1]

        data_temp_file.write("    ")
        data_temp_file.write("{ %3d, %3d, %3d }, { %3d, %3d, %3d }" %
                             (from_language, from_script, from_country,
                              to_language, to_script, to_country))
        index += 1
        if index != len(likely_subtags_map):
            data_temp_file.write(",")
        else:
            data_temp_file.write(" ")
        data_temp_file.write(" // %s -> %s\n" % (cmnt_from, cmnt_to))
    data_temp_file.write("};\n")

    data_temp_file.write("\n")

    # Locale index
    data_temp_file.write("static const quint16 locale_index[] = {\n")
    index = 0
    for key in language_map.keys():
        i = 0
        count = languageCount(key, locale_map)
        if count > 0:
            i = index
            index += count
        data_temp_file.write("%6d, // %s\n" % (i, language_map[key][0]))
    data_temp_file.write("     0 // trailing 0\n")
    data_temp_file.write("};\n\n")

    list_pattern_part_data = StringData('list_pattern_part_data')
    date_format_data = StringData('date_format_data')
    time_format_data = StringData('time_format_data')
    months_data = StringData('months_data')
    days_data = StringData('days_data')
    am_data = StringData('am_data')
    pm_data = StringData('pm_data')
    byte_unit_data = StringData('byte_unit_data')
    currency_symbol_data = StringData('currency_symbol_data')
    currency_display_name_data = StringData('currency_display_name_data')
    currency_format_data = StringData('currency_format_data')
    endonyms_data = StringData('endonyms_data')

    # Locale data
    data_temp_file.write("static const QLocaleData locale_data[] = {\n")
    # Table headings: keep each label centred in its field, matching line_format:
    data_temp_file.write(
        '   // '
        # Width 6 + comma:
        + ' lang  '  # IDs
        + 'script ' + '  terr ' + '  dec  '  # Numeric punctuation:
        + ' group ' + ' list  '  # List delimiter
        + ' prcnt '  # Arithmetic symbols:
        + '  zero ' + ' minus ' + ' plus  ' + '  exp  '
        # Width 8 + comma - to make space for these wide labels !
        + ' quotOpn '  # Quotation marks
        + ' quotEnd ' + 'altQtOpn ' + 'altQtEnd '
        # Width 11 + comma:
        + '  lpStart   '  # List pattern
        + '   lpMid    ' + '   lpEnd    ' + '   lpTwo    ' +
        '   sDtFmt   '  # Date format
        + '   lDtFmt   ' + '   sTmFmt   '  # Time format
        + '   lTmFmt   ' + '  ssMonth   '  # Months
        + '  slMonth   ' + '  snMonth   ' + '   sMonth   ' + '   lMonth   ' +
        '   nMonth   ' + '   ssDays   '  # Days
        + '   slDays   ' + '   snDays   ' + '    sDays   ' + '    lDays   ' +
        '    nDays   ' + '     am     '  # am/pm indicators
        + '     pm     '
        # Width 8 + comma
        + '  byte   ' + ' siQuant ' + 'iecQuant '
        # Width 8+4 + comma
        + '   currISO   '
        # Width 11 + comma:
        + '  currSym   '  # Currency formatting:
        + ' currDsply  ' + '  currFmt   ' + ' currFmtNeg ' +
        '  endoLang  '  # Name of language in itself, and of country:
        + '  endoCntry '
        # Width 6 + comma:
        + 'curDgt '  # Currency number representation:
        + 'curRnd ' + 'dow1st '  # First day of week
        + ' wknd+ '  # Week-end start/end days:
        + ' wknd-'
        # No trailing space on last entry (be sure to
        # pad before adding anything after it).
        + '\n')

    locale_keys = locale_map.keys()
    compareLocaleKeys.default_map = default_map
    compareLocaleKeys.locale_map = locale_map
    locale_keys.sort(compareLocaleKeys)

    line_format = (
        '    { '
        # Locale-identifier:
        + '%6d,' * 3
        # Numeric formats, list delimiter:
        + '%6d,' * 8
        # Quotation marks:
        + '%8d,' * 4
        # List patterns, date/time formats, month/day names, am/pm:
        + '%11s,' * 22
        # SI/IEC byte-unit abbreviations:
        + '%8s,' * 3
        # Currency ISO code:
        + ' %10s, '
        # Currency and endonyms
        + '%11s,' * 6
        # Currency formatting:
        + '%6d,%6d'
        # Day of week and week-end:
        + ',%6d' * 3 + ' }')
    for key in locale_keys:
        l = locale_map[key]
        data_temp_file.write(line_format % (
            key[0], key[1], key[2], l.decimal, l.group, l.listDelim, l.percent,
            l.zero, l.minus, l.plus, l.exp, l.quotationStart, l.quotationEnd,
            l.alternateQuotationStart, l.alternateQuotationEnd,
            list_pattern_part_data.append(l.listPatternPartStart),
            list_pattern_part_data.append(l.listPatternPartMiddle),
            list_pattern_part_data.append(l.listPatternPartEnd),
            list_pattern_part_data.append(l.listPatternPartTwo),
            date_format_data.append(l.shortDateFormat),
            date_format_data.append(l.longDateFormat),
            time_format_data.append(l.shortTimeFormat),
            time_format_data.append(l.longTimeFormat),
            months_data.append(l.standaloneShortMonths),
            months_data.append(l.standaloneLongMonths),
            months_data.append(l.standaloneNarrowMonths),
            months_data.append(l.shortMonths), months_data.append(
                l.longMonths), months_data.append(l.narrowMonths),
            days_data.append(l.standaloneShortDays),
            days_data.append(l.standaloneLongDays),
            days_data.append(l.standaloneNarrowDays),
            days_data.append(l.shortDays), days_data.append(l.longDays),
            days_data.append(l.narrowDays), am_data.append(l.am),
            pm_data.append(l.pm), byte_unit_data.append(l.byte_unit),
            byte_unit_data.append(l.byte_si_quantified),
            byte_unit_data.append(l.byte_iec_quantified),
            currencyIsoCodeData(l.currencyIsoCode),
            currency_symbol_data.append(l.currencySymbol),
            currency_display_name_data.append(l.currencyDisplayName),
            currency_format_data.append(l.currencyFormat),
            currency_format_data.append(l.currencyNegativeFormat),
            endonyms_data.append(l.languageEndonym),
            endonyms_data.append(l.countryEndonym), l.currencyDigits, l.
            currencyRounding, l.firstDayOfWeek, l.weekendStart, l.weekendEnd) +
                             ", // %s/%s/%s\n" %
                             (l.language, l.script, l.country))
    data_temp_file.write(line_format  # All zeros, matching the format:
                         % ((0, ) * (3 + 8 + 4) + ("0,0", ) * (22 + 3) +
                            (currencyIsoCodeData(0), ) + ("0,0", ) * 6 +
                            (0, ) * (2 + 3)) + " // trailing 0s\n")
    data_temp_file.write("};\n")

    # StringData tables:
    for data in (list_pattern_part_data, date_format_data, time_format_data,
                 months_data, days_data, byte_unit_data, am_data, pm_data,
                 currency_symbol_data, currency_display_name_data,
                 currency_format_data, endonyms_data):
        data_temp_file.write("\nstatic const ushort %s[] = {\n" % data.name)
        data_temp_file.write(wrap_list(data.data))
        data_temp_file.write("\n};\n")

    data_temp_file.write("\n")

    # Language name list
    data_temp_file.write("static const char language_name_list[] =\n")
    data_temp_file.write('"Default\\0"\n')
    for key in language_map.keys():
        if key == 0:
            continue
        data_temp_file.write('"' + language_map[key][0] + '\\0"\n')
    data_temp_file.write(";\n")

    data_temp_file.write("\n")

    # Language name index
    data_temp_file.write("static const quint16 language_name_index[] = {\n")
    data_temp_file.write("     0, // AnyLanguage\n")
    index = 8
    for key in language_map.keys():
        if key == 0:
            continue
        language = language_map[key][0]
        data_temp_file.write("%6d, // %s\n" % (index, language))
        index += len(language) + 1
    data_temp_file.write("};\n")

    data_temp_file.write("\n")

    # Script name list
    data_temp_file.write("static const char script_name_list[] =\n")
    data_temp_file.write('"Default\\0"\n')
    for key in script_map.keys():
        if key == 0:
            continue
        data_temp_file.write('"' + script_map[key][0] + '\\0"\n')
    data_temp_file.write(";\n")

    data_temp_file.write("\n")

    # Script name index
    data_temp_file.write("static const quint16 script_name_index[] = {\n")
    data_temp_file.write("     0, // AnyScript\n")
    index = 8
    for key in script_map.keys():
        if key == 0:
            continue
        script = script_map[key][0]
        data_temp_file.write("%6d, // %s\n" % (index, script))
        index += len(script) + 1
    data_temp_file.write("};\n")

    data_temp_file.write("\n")

    # Country name list
    data_temp_file.write("static const char country_name_list[] =\n")
    data_temp_file.write('"Default\\0"\n')
    for key in country_map.keys():
        if key == 0:
            continue
        data_temp_file.write('"' + country_map[key][0] + '\\0"\n')
    data_temp_file.write(";\n")

    data_temp_file.write("\n")

    # Country name index
    data_temp_file.write("static const quint16 country_name_index[] = {\n")
    data_temp_file.write("     0, // AnyCountry\n")
    index = 8
    for key in country_map.keys():
        if key == 0:
            continue
        country = country_map[key][0]
        data_temp_file.write("%6d, // %s\n" % (index, country))
        index += len(country) + 1
    data_temp_file.write("};\n")

    data_temp_file.write("\n")

    # Language code list
    data_temp_file.write("static const unsigned char language_code_list[] =\n")
    for key in language_map.keys():
        code = language_map[key][1]
        if len(code) == 2:
            code += r"\0"
        data_temp_file.write('"%2s" // %s\n' % (code, language_map[key][0]))
    data_temp_file.write(";\n")

    data_temp_file.write("\n")

    # Script code list
    data_temp_file.write("static const unsigned char script_code_list[] =\n")
    for key in script_map.keys():
        code = script_map[key][1]
        for i in range(4 - len(code)):
            code += "\\0"
        data_temp_file.write('"%2s" // %s\n' % (code, script_map[key][0]))
    data_temp_file.write(";\n")

    # Country code list
    data_temp_file.write("static const unsigned char country_code_list[] =\n")
    for key in country_map.keys():
        code = country_map[key][1]
        if len(code) == 2:
            code += "\\0"
        data_temp_file.write('"%2s" // %s\n' % (code, country_map[key][0]))
    data_temp_file.write(";\n")

    data_temp_file.write("\n")
    data_temp_file.write(GENERATED_BLOCK_END)
    s = qlocaledata_file.readline()
    # skip until end of the old block
    while s and s != GENERATED_BLOCK_END:
        s = qlocaledata_file.readline()

    s = qlocaledata_file.readline()
    while s:
        data_temp_file.write(s)
        s = qlocaledata_file.readline()
    data_temp_file.close()
    qlocaledata_file.close()

    os.remove(qtsrcdir + "/src/corelib/tools/qlocale_data_p.h")
    os.rename(data_temp_file_path,
              qtsrcdir + "/src/corelib/tools/qlocale_data_p.h")

    # qlocale.h

    (qlocaleh_temp_file,
     qlocaleh_temp_file_path) = tempfile.mkstemp("qlocale.h", dir=qtsrcdir)
    qlocaleh_temp_file = os.fdopen(qlocaleh_temp_file, "w")
    qlocaleh_file = open(qtsrcdir + "/src/corelib/tools/qlocale.h", "r")
    s = qlocaleh_file.readline()
    while s and s != GENERATED_BLOCK_START:
        qlocaleh_temp_file.write(s)
        s = qlocaleh_file.readline()
    qlocaleh_temp_file.write(GENERATED_BLOCK_START)
    qlocaleh_temp_file.write(
        "// see qlocale_data_p.h for more info on generated data\n")

    # Language enum
    qlocaleh_temp_file.write("    enum Language {\n")
    language = None
    for key, value in language_map.items():
        language = fixedLanguageName(value[0], dupes)
        qlocaleh_temp_file.write("        " + language + " = " + str(key) +
                                 ",\n")

    qlocaleh_temp_file.write("\n        " + ",\n        ".join(
        '%s = %s' % pair for pair in sorted(language_aliases.items())) + ",\n")
    qlocaleh_temp_file.write("\n")
    qlocaleh_temp_file.write("        LastLanguage = " + language + "\n")
    qlocaleh_temp_file.write("    };\n")

    qlocaleh_temp_file.write("\n")

    # Script enum
    qlocaleh_temp_file.write("    enum Script {\n")
    script = None
    for key, value in script_map.items():
        script = fixedScriptName(value[0], dupes)
        qlocaleh_temp_file.write("        " + script + " = " + str(key) +
                                 ",\n")
    qlocaleh_temp_file.write("\n        " + ",\n        ".join(
        '%s = %s' % pair for pair in sorted(script_aliases.items())) + ",\n")
    qlocaleh_temp_file.write("\n")
    qlocaleh_temp_file.write("        LastScript = " + script + "\n")
    qlocaleh_temp_file.write("    };\n")

    # Country enum
    qlocaleh_temp_file.write("    enum Country {\n")
    country = None
    for key, value in country_map.items():
        country = fixedCountryName(value[0], dupes)
        qlocaleh_temp_file.write("        " + country + " = " + str(key) +
                                 ",\n")
    qlocaleh_temp_file.write("\n        " + ",\n        ".join(
        '%s = %s' % pair for pair in sorted(country_aliases.items())) + ",\n")
    qlocaleh_temp_file.write("\n")
    qlocaleh_temp_file.write("        LastCountry = " + country + "\n")
    qlocaleh_temp_file.write("    };\n")

    qlocaleh_temp_file.write(GENERATED_BLOCK_END)
    s = qlocaleh_file.readline()
    # skip until end of the old block
    while s and s != GENERATED_BLOCK_END:
        s = qlocaleh_file.readline()

    s = qlocaleh_file.readline()
    while s:
        qlocaleh_temp_file.write(s)
        s = qlocaleh_file.readline()
    qlocaleh_temp_file.close()
    qlocaleh_file.close()

    os.remove(qtsrcdir + "/src/corelib/tools/qlocale.h")
    os.rename(qlocaleh_temp_file_path,
              qtsrcdir + "/src/corelib/tools/qlocale.h")

    # qlocale.qdoc

    (qlocaleqdoc_temp_file,
     qlocaleqdoc_temp_file_path) = tempfile.mkstemp("qlocale.qdoc",
                                                    dir=qtsrcdir)
    qlocaleqdoc_temp_file = os.fdopen(qlocaleqdoc_temp_file, "w")
    qlocaleqdoc_file = open(qtsrcdir + "/src/corelib/tools/qlocale.qdoc", "r")
    s = qlocaleqdoc_file.readline()
    DOCSTRING = "    QLocale's data is based on Common Locale Data Repository "
    while s:
        if DOCSTRING in s:
            qlocaleqdoc_temp_file.write(DOCSTRING + "v" + cldr_version + ".\n")
        else:
            qlocaleqdoc_temp_file.write(s)
        s = qlocaleqdoc_file.readline()
    qlocaleqdoc_temp_file.close()
    qlocaleqdoc_file.close()

    os.remove(qtsrcdir + "/src/corelib/tools/qlocale.qdoc")
    os.rename(qlocaleqdoc_temp_file_path,
              qtsrcdir + "/src/corelib/tools/qlocale.qdoc")