#!/usr/bin/env python ############################################################################# ## ## Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ## All rights reserved. ## Contact: Nokia Corporation (qt-info@nokia.com) ## ## This file is part of the test suite of the Qt Toolkit. ## ## $QT_BEGIN_LICENSE:LGPL$ ## No Commercial Usage ## This file contains pre-release code and may not be distributed. ## You may use this file in accordance with the terms and conditions ## contained in the Technology Preview License Agreement accompanying ## this package. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 2.1 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 2.1 requirements ## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ## ## In addition, as a special exception, Nokia gives you certain additional ## rights. These rights are described in the Nokia Qt LGPL Exception ## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ## ## If you have questions regarding the use of this file, please contact ## Nokia at qt-info@nokia.com. ## ## ## ## ## ## ## ## ## $QT_END_LICENSE$ ## ############################################################################# import os import sys import enumdata import xpathlite from xpathlite import DraftResolution from dateconverter import convert_date import re findEntry = xpathlite.findEntry findEntryInFile = xpathlite._findEntryInFile def ordStr(c): if len(c) == 1: return str(ord(c)) return "##########" # the following functions are supposed to fix the problem with QLocale # returning a character instead of strings for QLocale::exponential() # and others. So we fallback to default values in these cases. def fixOrdStrExp(c): if len(c) == 1: return str(ord(c)) return str(ord('e')) def fixOrdStrPercent(c): if len(c) == 1: return str(ord(c)) return str(ord('%')) def fixOrdStrList(c): if len(c) == 1: return str(ord(c)) return str(ord(';')) def generateLocaleInfo(path): (dir_name, file_name) = os.path.split(path) if not path.endswith(".xml"): return {} language_code = findEntryInFile(path, "identity/language", attribute="type")[0] if language_code == 'root': # just skip it return {} country_code = findEntryInFile(path, "identity/territory", attribute="type")[0] script_code = findEntryInFile(path, "identity/script", attribute="type")[0] variant_code = findEntryInFile(path, "identity/variant", attribute="type")[0] # we should handle fully qualified names with the territory if not country_code: return {} # we do not support scripts and variants if variant_code or script_code: return {} language_id = enumdata.languageCodeToId(language_code) if language_id == -1: sys.stderr.write("unnknown language code \"" + language_code + "\"\n") return {} language = enumdata.language_list[language_id][0] country_id = enumdata.countryCodeToId(country_code) country = "" if country_id != -1: country = enumdata.country_list[country_id][0] if country == "": sys.stderr.write("unnknown country code \"" + country_code + "\"\n") return {} # So we say we accept only those values that have "contributed" or # "approved" resolution. see http://www.unicode.org/cldr/process.html # But we only respect the resolution for new datas for backward # compatibility. draft = DraftResolution.contributed result = {} result['language'] = language result['country'] = country result['language_code'] = language_code result['country_code'] = country_code result['script_code'] = script_code result['variant_code'] = variant_code result['language_id'] = language_id result['country_id'] = country_id numberingSystem = None try: numbering_system = findEntry(path, "numbers/defaultNumberingSystem") except: pass def get_number_in_system(path, xpath, numbering_system): if numbering_system: try: return findEntry(path, xpath + "[numberSystem=" + numbering_system + "]") except xpathlite.Error: pass return findEntry(path, xpath) result['decimal'] = get_number_in_system(path, "numbers/symbols/decimal", numbering_system) result['group'] = get_number_in_system(path, "numbers/symbols/group", numbering_system) result['list'] = get_number_in_system(path, "numbers/symbols/list", numbering_system) result['percent'] = get_number_in_system(path, "numbers/symbols/percentSign", numbering_system) result['zero'] = get_number_in_system(path, "numbers/symbols/nativeZeroDigit", numbering_system) result['minus'] = get_number_in_system(path, "numbers/symbols/minusSign", numbering_system) result['plus'] = get_number_in_system(path, "numbers/symbols/plusSign", numbering_system) result['exp'] = get_number_in_system(path, "numbers/symbols/exponential", numbering_system).lower() result['am'] = findEntry(path, "dates/calendars/calendar[gregorian]/dayPeriods/dayPeriodContext[format]/dayPeriodWidth[wide]/dayPeriod[am]", draft) result['pm'] = findEntry(path, "dates/calendars/calendar[gregorian]/dayPeriods/dayPeriodContext[format]/dayPeriodWidth[wide]/dayPeriod[pm]", draft) result['longDateFormat'] = convert_date(findEntry(path, "dates/calendars/calendar[gregorian]/dateFormats/dateFormatLength[full]/dateFormat/pattern")) result['shortDateFormat'] = convert_date(findEntry(path, "dates/calendars/calendar[gregorian]/dateFormats/dateFormatLength[short]/dateFormat/pattern")) result['longTimeFormat'] = convert_date(findEntry(path, "dates/calendars/calendar[gregorian]/timeFormats/timeFormatLength[full]/timeFormat/pattern")) result['shortTimeFormat'] = convert_date(findEntry(path, "dates/calendars/calendar[gregorian]/timeFormats/timeFormatLength[short]/timeFormat/pattern")) standalone_long_month_path = "dates/calendars/calendar[gregorian]/months/monthContext[stand-alone]/monthWidth[wide]/month" result['standaloneLongMonths'] \ = findEntry(path, standalone_long_month_path + "[1]") + ";" \ + findEntry(path, standalone_long_month_path + "[2]") + ";" \ + findEntry(path, standalone_long_month_path + "[3]") + ";" \ + findEntry(path, standalone_long_month_path + "[4]") + ";" \ + findEntry(path, standalone_long_month_path + "[5]") + ";" \ + findEntry(path, standalone_long_month_path + "[6]") + ";" \ + findEntry(path, standalone_long_month_path + "[7]") + ";" \ + findEntry(path, standalone_long_month_path + "[8]") + ";" \ + findEntry(path, standalone_long_month_path + "[9]") + ";" \ + findEntry(path, standalone_long_month_path + "[10]") + ";" \ + findEntry(path, standalone_long_month_path + "[11]") + ";" \ + findEntry(path, standalone_long_month_path + "[12]") + ";" standalone_short_month_path = "dates/calendars/calendar[gregorian]/months/monthContext[stand-alone]/monthWidth[abbreviated]/month" result['standaloneShortMonths'] \ = findEntry(path, standalone_short_month_path + "[1]") + ";" \ + findEntry(path, standalone_short_month_path + "[2]") + ";" \ + findEntry(path, standalone_short_month_path + "[3]") + ";" \ + findEntry(path, standalone_short_month_path + "[4]") + ";" \ + findEntry(path, standalone_short_month_path + "[5]") + ";" \ + findEntry(path, standalone_short_month_path + "[6]") + ";" \ + findEntry(path, standalone_short_month_path + "[7]") + ";" \ + findEntry(path, standalone_short_month_path + "[8]") + ";" \ + findEntry(path, standalone_short_month_path + "[9]") + ";" \ + findEntry(path, standalone_short_month_path + "[10]") + ";" \ + findEntry(path, standalone_short_month_path + "[11]") + ";" \ + findEntry(path, standalone_short_month_path + "[12]") + ";" standalone_narrow_month_path = "dates/calendars/calendar[gregorian]/months/monthContext[stand-alone]/monthWidth[narrow]/month" result['standaloneNarrowMonths'] \ = findEntry(path, standalone_narrow_month_path + "[1]") + ";" \ + findEntry(path, standalone_narrow_month_path + "[2]") + ";" \ + findEntry(path, standalone_narrow_month_path + "[3]") + ";" \ + findEntry(path, standalone_narrow_month_path + "[4]") + ";" \ + findEntry(path, standalone_narrow_month_path + "[5]") + ";" \ + findEntry(path, standalone_narrow_month_path + "[6]") + ";" \ + findEntry(path, standalone_narrow_month_path + "[7]") + ";" \ + findEntry(path, standalone_narrow_month_path + "[8]") + ";" \ + findEntry(path, standalone_narrow_month_path + "[9]") + ";" \ + findEntry(path, standalone_narrow_month_path + "[10]") + ";" \ + findEntry(path, standalone_narrow_month_path + "[11]") + ";" \ + findEntry(path, standalone_narrow_month_path + "[12]") + ";" long_month_path = "dates/calendars/calendar[gregorian]/months/monthContext[format]/monthWidth[wide]/month" result['longMonths'] \ = findEntry(path, long_month_path + "[1]") + ";" \ + findEntry(path, long_month_path + "[2]") + ";" \ + findEntry(path, long_month_path + "[3]") + ";" \ + findEntry(path, long_month_path + "[4]") + ";" \ + findEntry(path, long_month_path + "[5]") + ";" \ + findEntry(path, long_month_path + "[6]") + ";" \ + findEntry(path, long_month_path + "[7]") + ";" \ + findEntry(path, long_month_path + "[8]") + ";" \ + findEntry(path, long_month_path + "[9]") + ";" \ + findEntry(path, long_month_path + "[10]") + ";" \ + findEntry(path, long_month_path + "[11]") + ";" \ + findEntry(path, long_month_path + "[12]") + ";" short_month_path = "dates/calendars/calendar[gregorian]/months/monthContext[format]/monthWidth[abbreviated]/month" result['shortMonths'] \ = findEntry(path, short_month_path + "[1]") + ";" \ + findEntry(path, short_month_path + "[2]") + ";" \ + findEntry(path, short_month_path + "[3]") + ";" \ + findEntry(path, short_month_path + "[4]") + ";" \ + findEntry(path, short_month_path + "[5]") + ";" \ + findEntry(path, short_month_path + "[6]") + ";" \ + findEntry(path, short_month_path + "[7]") + ";" \ + findEntry(path, short_month_path + "[8]") + ";" \ + findEntry(path, short_month_path + "[9]") + ";" \ + findEntry(path, short_month_path + "[10]") + ";" \ + findEntry(path, short_month_path + "[11]") + ";" \ + findEntry(path, short_month_path + "[12]") + ";" narrow_month_path = "dates/calendars/calendar[gregorian]/months/monthContext[format]/monthWidth[narrow]/month" result['narrowMonths'] \ = findEntry(path, narrow_month_path + "[1]") + ";" \ + findEntry(path, narrow_month_path + "[2]") + ";" \ + findEntry(path, narrow_month_path + "[3]") + ";" \ + findEntry(path, narrow_month_path + "[4]") + ";" \ + findEntry(path, narrow_month_path + "[5]") + ";" \ + findEntry(path, narrow_month_path + "[6]") + ";" \ + findEntry(path, narrow_month_path + "[7]") + ";" \ + findEntry(path, narrow_month_path + "[8]") + ";" \ + findEntry(path, narrow_month_path + "[9]") + ";" \ + findEntry(path, narrow_month_path + "[10]") + ";" \ + findEntry(path, narrow_month_path + "[11]") + ";" \ + findEntry(path, narrow_month_path + "[12]") + ";" long_day_path = "dates/calendars/calendar[gregorian]/days/dayContext[format]/dayWidth[wide]/day" result['longDays'] \ = findEntry(path, long_day_path + "[sun]") + ";" \ + findEntry(path, long_day_path + "[mon]") + ";" \ + findEntry(path, long_day_path + "[tue]") + ";" \ + findEntry(path, long_day_path + "[wed]") + ";" \ + findEntry(path, long_day_path + "[thu]") + ";" \ + findEntry(path, long_day_path + "[fri]") + ";" \ + findEntry(path, long_day_path + "[sat]") + ";" short_day_path = "dates/calendars/calendar[gregorian]/days/dayContext[format]/dayWidth[abbreviated]/day" result['shortDays'] \ = findEntry(path, short_day_path + "[sun]") + ";" \ + findEntry(path, short_day_path + "[mon]") + ";" \ + findEntry(path, short_day_path + "[tue]") + ";" \ + findEntry(path, short_day_path + "[wed]") + ";" \ + findEntry(path, short_day_path + "[thu]") + ";" \ + findEntry(path, short_day_path + "[fri]") + ";" \ + findEntry(path, short_day_path + "[sat]") + ";" narrow_day_path = "dates/calendars/calendar[gregorian]/days/dayContext[format]/dayWidth[narrow]/day" result['narrowDays'] \ = findEntry(path, narrow_day_path + "[sun]") + ";" \ + findEntry(path, narrow_day_path + "[mon]") + ";" \ + findEntry(path, narrow_day_path + "[tue]") + ";" \ + findEntry(path, narrow_day_path + "[wed]") + ";" \ + findEntry(path, narrow_day_path + "[thu]") + ";" \ + findEntry(path, narrow_day_path + "[fri]") + ";" \ + findEntry(path, narrow_day_path + "[sat]") + ";" standalone_long_day_path = "dates/calendars/calendar[gregorian]/days/dayContext[stand-alone]/dayWidth[wide]/day" result['standaloneLongDays'] \ = findEntry(path, standalone_long_day_path + "[sun]") + ";" \ + findEntry(path, standalone_long_day_path + "[mon]") + ";" \ + findEntry(path, standalone_long_day_path + "[tue]") + ";" \ + findEntry(path, standalone_long_day_path + "[wed]") + ";" \ + findEntry(path, standalone_long_day_path + "[thu]") + ";" \ + findEntry(path, standalone_long_day_path + "[fri]") + ";" \ + findEntry(path, standalone_long_day_path + "[sat]") + ";" standalone_short_day_path = "dates/calendars/calendar[gregorian]/days/dayContext[stand-alone]/dayWidth[abbreviated]/day" result['standaloneShortDays'] \ = findEntry(path, standalone_short_day_path + "[sun]") + ";" \ + findEntry(path, standalone_short_day_path + "[mon]") + ";" \ + findEntry(path, standalone_short_day_path + "[tue]") + ";" \ + findEntry(path, standalone_short_day_path + "[wed]") + ";" \ + findEntry(path, standalone_short_day_path + "[thu]") + ";" \ + findEntry(path, standalone_short_day_path + "[fri]") + ";" \ + findEntry(path, standalone_short_day_path + "[sat]") + ";" standalone_narrow_day_path = "dates/calendars/calendar[gregorian]/days/dayContext[stand-alone]/dayWidth[narrow]/day" result['standaloneNarrowDays'] \ = findEntry(path, standalone_narrow_day_path + "[sun]") + ";" \ + findEntry(path, standalone_narrow_day_path + "[mon]") + ";" \ + findEntry(path, standalone_narrow_day_path + "[tue]") + ";" \ + findEntry(path, standalone_narrow_day_path + "[wed]") + ";" \ + findEntry(path, standalone_narrow_day_path + "[thu]") + ";" \ + findEntry(path, standalone_narrow_day_path + "[fri]") + ";" \ + findEntry(path, standalone_narrow_day_path + "[sat]") + ";" return result def addEscapes(s): result = '' for c in s: n = ord(c) if n < 128: result += c else: result += "\\x" result += "%02x" % (n) return result def unicodeStr(s): utf8 = s.encode('utf-8') return "" + str(len(utf8)) + "" + addEscapes(utf8) + "" def usage(): print "Usage: cldr2qlocalexml.py " sys.exit() if len(sys.argv) != 2: usage() cldr_dir = sys.argv[1] if not os.path.isdir(cldr_dir): usage() cldr_files = os.listdir(cldr_dir) locale_database = {} for file in cldr_files: l = generateLocaleInfo(cldr_dir + "/" + file) if not l: sys.stderr.write("skipping file \"" + file + "\"\n") continue locale_database[(l['language_id'], l['country_id'], l['script_code'], l['variant_code'])] = l locale_keys = locale_database.keys() locale_keys.sort() print "" print " " for id in enumdata.language_list: l = enumdata.language_list[id] print " " print " " + l[0] + "" print " " + str(id) + "" print " " + l[1] + "" print " " print " " print " " for id in enumdata.country_list: l = enumdata.country_list[id] print " " print " " + l[0] + "" print " " + str(id) + "" print " " + l[1] + "" print " " print " " print \ " \n\ \n\ Afrikaans\n\ SouthAfrica\n\ \n\ \n\ Afan\n\ Ethiopia\n\ \n\ \n\ Afar\n\ Djibouti\n\ \n\ \n\ Arabic\n\ SaudiArabia\n\ \n\ \n\ Chinese\n\ China\n\ \n\ \n\ Dutch\n\ Netherlands\n\ \n\ \n\ English\n\ UnitedStates\n\ \n\ \n\ French\n\ France\n\ \n\ \n\ German\n\ Germany\n\ \n\ \n\ Greek\n\ Greece\n\ \n\ \n\ Italian\n\ Italy\n\ \n\ \n\ Malay\n\ Malaysia\n\ \n\ \n\ Portuguese\n\ Portugal\n\ \n\ \n\ Russian\n\ RussianFederation\n\ \n\ \n\ Serbian\n\ SerbiaAndMontenegro\n\ \n\ \n\ SerboCroatian\n\ SerbiaAndMontenegro\n\ \n\ \n\ Somali\n\ Somalia\n\ \n\ \n\ Spanish\n\ Spain\n\ \n\ \n\ Swahili\n\ Kenya\n\ \n\ \n\ Swedish\n\ Sweden\n\ \n\ \n\ Tigrinya\n\ Eritrea\n\ \n\ \n\ Uzbek\n\ Uzbekistan\n\ \n\ \n\ Persian\n\ Iran\n\ \n\ " print " " print \ " \n\ C\n\ AnyCountry\n\ 46\n\ 44\n\ 59\n\ 37\n\ 48\n\ 45\n\ 43\n\ 101\n\ AM\n\ PM\n\ EEEE, d MMMM yyyy\n\ d MMM yyyy\n\ HH:mm:ss z\n\ HH:mm:ss\n\ January;February;March;April;May;June;July;August;September;October;November;December;\n\ Jan;Feb;Mar;Apr;May;Jun;Jul;Aug;Sep;Oct;Nov;Dec;\n\ J;F;M;A;M;J;J;A;S;O;N;D;\n\ January;February;March;April;May;June;July;August;September;October;November;December;\n\ Jan;Feb;Mar;Apr;May;Jun;Jul;Aug;Sep;Oct;Nov;Dec;\n\ 1;2;3;4;5;6;7;8;9;10;11;12;\n\ Sunday;Monday;Tuesday;Wednesday;Thursday;Friday;Saturday;\n\ Sun;Mon;Tue;Wed;Thu;Fri;Sat;\n\ 7;1;2;3;4;5;6;\n\ Sunday;Monday;Tuesday;Wednesday;Thursday;Friday;Saturday;\n\ Sun;Mon;Tue;Wed;Thu;Fri;Sat;\n\ S;M;T;W;T;F;S;\n\ " for key in locale_keys: l = locale_database[key] print " " print " " + l['language'] + "" print " " + l['country'] + "" print " " + l['language_code'] + "" print " " + l['country_code'] + "" print " " + ordStr(l['decimal']) + "" print " " + ordStr(l['group']) + "" print " " + fixOrdStrList(l['list']) + "" print " " + fixOrdStrPercent(l['percent']) + "" print " " + ordStr(l['zero']) + "" print " " + ordStr(l['minus']) + "" print " " + ordStr(l['plus']) + "" print " " + fixOrdStrExp(l['exp']) + "" print " " + l['am'].encode('utf-8') + "" print " " + l['pm'].encode('utf-8') + "" print " " + l['longDateFormat'].encode('utf-8') + "" print " " + l['shortDateFormat'].encode('utf-8') + "" print " " + l['longTimeFormat'].encode('utf-8') + "" print " " + l['shortTimeFormat'].encode('utf-8') + "" print " " + l['standaloneLongMonths'].encode('utf-8') + "" print " "+ l['standaloneShortMonths'].encode('utf-8') + "" print " "+ l['standaloneNarrowMonths'].encode('utf-8') + "" print " " + l['longMonths'].encode('utf-8') + "" print " " + l['shortMonths'].encode('utf-8') + "" print " " + l['narrowMonths'].encode('utf-8') + "" print " " + l['longDays'].encode('utf-8') + "" print " " + l['shortDays'].encode('utf-8') + "" print " " + l['narrowDays'].encode('utf-8') + "" print " " + l['standaloneLongDays'].encode('utf-8') + "" print " " + l['standaloneShortDays'].encode('utf-8') + "" print " " + l['standaloneNarrowDays'].encode('utf-8') + "" print " " print " " print ""