diff -r 000000000000 -r 1918ee327afb util/local_database/cldr2qlocalexml.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/util/local_database/cldr2qlocalexml.py Mon Jan 11 14:00:40 2010 +0000 @@ -0,0 +1,499 @@ +#!/usr/bin/env python +############################################################################# +## +## Copyright (C) 2009 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 +import re + +findEntry = xpathlite.findEntry + +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) + + exp = re.compile(r"([a-z]+)_([A-Z]{2})\.xml") + m = exp.match(file_name) + if not m: + return {} + + language_code = m.group(1) + country_code = m.group(2) + + 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) + if country_id == -1: + sys.stderr.write("unnknown country code \"" + country_code + "\"\n") + return {} + country = enumdata.country_list[country_id][0] + + base = dir_name + "/" + language_code + "_" + country_code + + result = {} + result['base'] = base + + result['language'] = language + result['country'] = country + result['language_id'] = language_id + result['country_id'] = country_id + result['decimal'] = findEntry(base, "numbers/symbols/decimal") + result['group'] = findEntry(base, "numbers/symbols/group") + result['list'] = findEntry(base, "numbers/symbols/list") + result['percent'] = findEntry(base, "numbers/symbols/percentSign") + result['zero'] = findEntry(base, "numbers/symbols/nativeZeroDigit") + result['minus'] = findEntry(base, "numbers/symbols/minusSign") + result['plus'] = findEntry(base, "numbers/symbols/plusSign") + result['exp'] = findEntry(base, "numbers/symbols/exponential").lower() + result['am'] = findEntry(base, "dates/calendars/calendar[gregorian]/am", draft=DraftResolution.approved) + result['pm'] = findEntry(base, "dates/calendars/calendar[gregorian]/pm", draft=DraftResolution.approved) + result['longDateFormat'] = findEntry(base, "dates/calendars/calendar[gregorian]/dateFormats/dateFormatLength[full]/dateFormat/pattern") + result['shortDateFormat'] = findEntry(base, "dates/calendars/calendar[gregorian]/dateFormats/dateFormatLength[short]/dateFormat/pattern") + result['longTimeFormat'] = findEntry(base, "dates/calendars/calendar[gregorian]/timeFormats/timeFormatLength[full]/timeFormat/pattern") + result['shortTimeFormat'] = findEntry(base, "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(base, standalone_long_month_path + "[1]") + ";" \ + + findEntry(base, standalone_long_month_path + "[2]") + ";" \ + + findEntry(base, standalone_long_month_path + "[3]") + ";" \ + + findEntry(base, standalone_long_month_path + "[4]") + ";" \ + + findEntry(base, standalone_long_month_path + "[5]") + ";" \ + + findEntry(base, standalone_long_month_path + "[6]") + ";" \ + + findEntry(base, standalone_long_month_path + "[7]") + ";" \ + + findEntry(base, standalone_long_month_path + "[8]") + ";" \ + + findEntry(base, standalone_long_month_path + "[9]") + ";" \ + + findEntry(base, standalone_long_month_path + "[10]") + ";" \ + + findEntry(base, standalone_long_month_path + "[11]") + ";" \ + + findEntry(base, standalone_long_month_path + "[12]") + ";" + + standalone_short_month_path = "dates/calendars/calendar[gregorian]/months/monthContext[stand-alone]/monthWidth[abbreviated]/month" + result['standaloneShortMonths'] \ + = findEntry(base, standalone_short_month_path + "[1]") + ";" \ + + findEntry(base, standalone_short_month_path + "[2]") + ";" \ + + findEntry(base, standalone_short_month_path + "[3]") + ";" \ + + findEntry(base, standalone_short_month_path + "[4]") + ";" \ + + findEntry(base, standalone_short_month_path + "[5]") + ";" \ + + findEntry(base, standalone_short_month_path + "[6]") + ";" \ + + findEntry(base, standalone_short_month_path + "[7]") + ";" \ + + findEntry(base, standalone_short_month_path + "[8]") + ";" \ + + findEntry(base, standalone_short_month_path + "[9]") + ";" \ + + findEntry(base, standalone_short_month_path + "[10]") + ";" \ + + findEntry(base, standalone_short_month_path + "[11]") + ";" \ + + findEntry(base, standalone_short_month_path + "[12]") + ";" + + standalone_narrow_month_path = "dates/calendars/calendar[gregorian]/months/monthContext[stand-alone]/monthWidth[narrow]/month" + result['standaloneNarrowMonths'] \ + = findEntry(base, standalone_narrow_month_path + "[1]") + ";" \ + + findEntry(base, standalone_narrow_month_path + "[2]") + ";" \ + + findEntry(base, standalone_narrow_month_path + "[3]") + ";" \ + + findEntry(base, standalone_narrow_month_path + "[4]") + ";" \ + + findEntry(base, standalone_narrow_month_path + "[5]") + ";" \ + + findEntry(base, standalone_narrow_month_path + "[6]") + ";" \ + + findEntry(base, standalone_narrow_month_path + "[7]") + ";" \ + + findEntry(base, standalone_narrow_month_path + "[8]") + ";" \ + + findEntry(base, standalone_narrow_month_path + "[9]") + ";" \ + + findEntry(base, standalone_narrow_month_path + "[10]") + ";" \ + + findEntry(base, standalone_narrow_month_path + "[11]") + ";" \ + + findEntry(base, standalone_narrow_month_path + "[12]") + ";" + + long_month_path = "dates/calendars/calendar[gregorian]/months/monthContext[format]/monthWidth[wide]/month" + result['longMonths'] \ + = findEntry(base, long_month_path + "[1]") + ";" \ + + findEntry(base, long_month_path + "[2]") + ";" \ + + findEntry(base, long_month_path + "[3]") + ";" \ + + findEntry(base, long_month_path + "[4]") + ";" \ + + findEntry(base, long_month_path + "[5]") + ";" \ + + findEntry(base, long_month_path + "[6]") + ";" \ + + findEntry(base, long_month_path + "[7]") + ";" \ + + findEntry(base, long_month_path + "[8]") + ";" \ + + findEntry(base, long_month_path + "[9]") + ";" \ + + findEntry(base, long_month_path + "[10]") + ";" \ + + findEntry(base, long_month_path + "[11]") + ";" \ + + findEntry(base, long_month_path + "[12]") + ";" + + short_month_path = "dates/calendars/calendar[gregorian]/months/monthContext[format]/monthWidth[abbreviated]/month" + result['shortMonths'] \ + = findEntry(base, short_month_path + "[1]") + ";" \ + + findEntry(base, short_month_path + "[2]") + ";" \ + + findEntry(base, short_month_path + "[3]") + ";" \ + + findEntry(base, short_month_path + "[4]") + ";" \ + + findEntry(base, short_month_path + "[5]") + ";" \ + + findEntry(base, short_month_path + "[6]") + ";" \ + + findEntry(base, short_month_path + "[7]") + ";" \ + + findEntry(base, short_month_path + "[8]") + ";" \ + + findEntry(base, short_month_path + "[9]") + ";" \ + + findEntry(base, short_month_path + "[10]") + ";" \ + + findEntry(base, short_month_path + "[11]") + ";" \ + + findEntry(base, short_month_path + "[12]") + ";" + + narrow_month_path = "dates/calendars/calendar[gregorian]/months/monthContext[format]/monthWidth[narrow]/month" + result['narrowMonths'] \ + = findEntry(base, narrow_month_path + "[1]") + ";" \ + + findEntry(base, narrow_month_path + "[2]") + ";" \ + + findEntry(base, narrow_month_path + "[3]") + ";" \ + + findEntry(base, narrow_month_path + "[4]") + ";" \ + + findEntry(base, narrow_month_path + "[5]") + ";" \ + + findEntry(base, narrow_month_path + "[6]") + ";" \ + + findEntry(base, narrow_month_path + "[7]") + ";" \ + + findEntry(base, narrow_month_path + "[8]") + ";" \ + + findEntry(base, narrow_month_path + "[9]") + ";" \ + + findEntry(base, narrow_month_path + "[10]") + ";" \ + + findEntry(base, narrow_month_path + "[11]") + ";" \ + + findEntry(base, narrow_month_path + "[12]") + ";" + + long_day_path = "dates/calendars/calendar[gregorian]/days/dayContext[format]/dayWidth[wide]/day" + result['longDays'] \ + = findEntry(base, long_day_path + "[sun]") + ";" \ + + findEntry(base, long_day_path + "[mon]") + ";" \ + + findEntry(base, long_day_path + "[tue]") + ";" \ + + findEntry(base, long_day_path + "[wed]") + ";" \ + + findEntry(base, long_day_path + "[thu]") + ";" \ + + findEntry(base, long_day_path + "[fri]") + ";" \ + + findEntry(base, long_day_path + "[sat]") + ";" + + short_day_path = "dates/calendars/calendar[gregorian]/days/dayContext[format]/dayWidth[abbreviated]/day" + result['shortDays'] \ + = findEntry(base, short_day_path + "[sun]") + ";" \ + + findEntry(base, short_day_path + "[mon]") + ";" \ + + findEntry(base, short_day_path + "[tue]") + ";" \ + + findEntry(base, short_day_path + "[wed]") + ";" \ + + findEntry(base, short_day_path + "[thu]") + ";" \ + + findEntry(base, short_day_path + "[fri]") + ";" \ + + findEntry(base, short_day_path + "[sat]") + ";" + + narrow_day_path = "dates/calendars/calendar[gregorian]/days/dayContext[format]/dayWidth[narrow]/day" + result['narrowDays'] \ + = findEntry(base, narrow_day_path + "[sun]") + ";" \ + + findEntry(base, narrow_day_path + "[mon]") + ";" \ + + findEntry(base, narrow_day_path + "[tue]") + ";" \ + + findEntry(base, narrow_day_path + "[wed]") + ";" \ + + findEntry(base, narrow_day_path + "[thu]") + ";" \ + + findEntry(base, narrow_day_path + "[fri]") + ";" \ + + findEntry(base, narrow_day_path + "[sat]") + ";" + + standalone_long_day_path = "dates/calendars/calendar[gregorian]/days/dayContext[stand-alone]/dayWidth[wide]/day" + result['standaloneLongDays'] \ + = findEntry(base, standalone_long_day_path + "[sun]") + ";" \ + + findEntry(base, standalone_long_day_path + "[mon]") + ";" \ + + findEntry(base, standalone_long_day_path + "[tue]") + ";" \ + + findEntry(base, standalone_long_day_path + "[wed]") + ";" \ + + findEntry(base, standalone_long_day_path + "[thu]") + ";" \ + + findEntry(base, standalone_long_day_path + "[fri]") + ";" \ + + findEntry(base, standalone_long_day_path + "[sat]") + ";" + + standalone_short_day_path = "dates/calendars/calendar[gregorian]/days/dayContext[stand-alone]/dayWidth[abbreviated]/day" + result['standaloneShortDays'] \ + = findEntry(base, standalone_short_day_path + "[sun]") + ";" \ + + findEntry(base, standalone_short_day_path + "[mon]") + ";" \ + + findEntry(base, standalone_short_day_path + "[tue]") + ";" \ + + findEntry(base, standalone_short_day_path + "[wed]") + ";" \ + + findEntry(base, standalone_short_day_path + "[thu]") + ";" \ + + findEntry(base, standalone_short_day_path + "[fri]") + ";" \ + + findEntry(base, standalone_short_day_path + "[sat]") + ";" + + standalone_narrow_day_path = "dates/calendars/calendar[gregorian]/days/dayContext[stand-alone]/dayWidth[narrow]/day" + result['standaloneNarrowDays'] \ + = findEntry(base, standalone_narrow_day_path + "[sun]") + ";" \ + + findEntry(base, standalone_narrow_day_path + "[mon]") + ";" \ + + findEntry(base, standalone_narrow_day_path + "[tue]") + ";" \ + + findEntry(base, standalone_narrow_day_path + "[wed]") + ";" \ + + findEntry(base, standalone_narrow_day_path + "[thu]") + ";" \ + + findEntry(base, standalone_narrow_day_path + "[fri]") + ";" \ + + findEntry(base, 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 + +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['base'] + "" + print " " + l['language'] + "" + print " " + l['country'] + "" + 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 ""