def _parseLocale(l): language = "AnyLanguage" script = "AnyScript" country = "AnyCountry" if l == "und": raise xpathlite.Error("we are treating unknown locale like C") items = l.split("_") language_code = items[0] if language_code != "und": language_id = enumdata.languageCodeToId(language_code) if language_id == -1: raise xpathlite.Error('unknown language code "%s"' % language_code) language = enumdata.language_list[language_id][0] if len(items) > 1: script_code = items[1] country_code = "" if len(items) > 2: country_code = items[2] if len(script_code) == 4: script_id = enumdata.scriptCodeToId(script_code) if script_id == -1: raise xpathlite.Error('unknown script code "%s"' % script_code) script = enumdata.script_list[script_id][0] else: country_code = script_code if country_code: country_id = enumdata.countryCodeToId(country_code) if country_id == -1: raise xpathlite.Error('unknown country code "%s"' % country_code) country = enumdata.country_list[country_id][0] return (language, script, country)
def _parseLocale(l): language = "AnyLanguage" script = "AnyScript" country = "AnyCountry" if l == "und": raise xpathlite.Error("we are treating unknown locale like C") parsed = splitLocale(l) language_code = parsed.next() script_code = country_code = '' try: script_code, country_code = parsed except ValueError: pass if language_code != "und": language_id = enumdata.languageCodeToId(language_code) if language_id == -1: raise xpathlite.Error('unknown language code "%s"' % language_code) language = enumdata.language_list[language_id][0] if script_code: script_id = enumdata.scriptCodeToId(script_code) if script_id == -1: raise xpathlite.Error('unknown script code "%s"' % script_code) script = enumdata.script_list[script_id][0] if country_code: country_id = enumdata.countryCodeToId(country_code) if country_id == -1: raise xpathlite.Error('unknown country code "%s"' % country_code) country = enumdata.country_list[country_id][0] return (language, script, country)
def _generateLocaleInfo(path, language_code, script_code, country_code, variant_code=""): if not path.endswith(".xml"): return {} if language_code == 'root': # just skip it return {} # we do not support variants # ### actually there is only one locale with variant: en_US_POSIX # does anybody care about it at all? if variant_code: raise xpathlite.Error('we do not support variants ("%s")' % variant_code) language_id = enumdata.languageCodeToId(language_code) if language_id <= 0: raise xpathlite.Error('unknown language code "%s"' % language_code) script_id = enumdata.scriptCodeToId(script_code) if script_id == -1: raise xpathlite.Error('unknown script code "%s"' % script_code) # we should handle fully qualified names with the territory if not country_code: return {} country_id = enumdata.countryCodeToId(country_code) if country_id <= 0: raise xpathlite.Error('unknown country code "%s"' % country_code) # 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 = dict( language=enumdata.language_list[language_id][0], language_code=language_code, language_id=language_id, script=enumdata.script_list[script_id][0], script_code=script_code, script_id=script_id, country=enumdata.country_list[country_id][0], country_code=country_code, country_id=country_id, variant_code=variant_code) (dir_name, file_name) = os.path.split(path) def from_supplement(tag, path=os.path.join(dir_name, '..', 'supplemental', 'supplementalData.xml')): return findTagsInFile(path, tag) currencies = from_supplement('currencyData/region[iso3166=%s]' % country_code) result['currencyIsoCode'] = '' result['currencyDigits'] = 2 result['currencyRounding'] = 1 if currencies: for e in currencies: if e[0] == 'currency': t = [x[1] == 'false' for x in e[1] if x[0] == 'tender'] if t and t[0]: pass elif not any(x[0] == 'to' for x in e[1]): result['currencyIsoCode'] = (x[1] for x in e[1] if x[0] == 'iso4217').next() break if result['currencyIsoCode']: t = from_supplement("currencyData/fractions/info[iso4217=%s]" % result['currencyIsoCode']) if t and t[0][0] == 'info': result['currencyDigits'] = (int(x[1]) for x in t[0][1] if x[0] == 'digits').next() result['currencyRounding'] = (int(x[1]) for x in t[0][1] if x[0] == 'rounding').next() numbering_system = None try: numbering_system = findEntry(path, "numbers/defaultNumberingSystem") except: pass def findEntryDef(path, xpath, value=''): try: return findEntry(path, xpath) except xpathlite.Error: return value def get_number_in_system(path, xpath, numbering_system): if numbering_system: try: return findEntry(path, xpath + "[numberSystem=" + numbering_system + "]") except xpathlite.Error: # in CLDR 1.9 number system was refactored for numbers (but not for currency) # so if previous findEntry doesn't work we should try this: try: return findEntry(path, xpath.replace("/symbols/", "/symbols[numberSystem=" + numbering_system + "]/")) except xpathlite.Error: # fallback to default 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) try: numbering_systems = {} for ns in findTagsInFile(os.path.join(cldr_dir, '..', 'supplemental', 'numberingSystems.xml'), 'numberingSystems'): tmp = {} id = "" for data in ns[1:][0]: # ns looks like this: [u'numberingSystem', [(u'digits', u'0123456789'), (u'type', u'numeric'), (u'id', u'latn')]] tmp[data[0]] = data[1] if data[0] == u"id": id = data[1] numbering_systems[id] = tmp result['zero'] = numbering_systems[numbering_system][u"digits"][0] except e: sys.stderr.write("Native zero detection problem:\n" + str(e) + "\n") 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['quotationStart'] = findEntry(path, "delimiters/quotationStart") result['quotationEnd'] = findEntry(path, "delimiters/quotationEnd") result['alternateQuotationStart'] = findEntry(path, "delimiters/alternateQuotationStart") result['alternateQuotationEnd'] = findEntry(path, "delimiters/alternateQuotationEnd") result['listPatternPartStart'] = parse_list_pattern_part_format(findEntry(path, "listPatterns/listPattern/listPatternPart[start]")) result['listPatternPartMiddle'] = parse_list_pattern_part_format(findEntry(path, "listPatterns/listPattern/listPatternPart[middle]")) result['listPatternPartEnd'] = parse_list_pattern_part_format(findEntry(path, "listPatterns/listPattern/listPatternPart[end]")) result['listPatternPartTwo'] = parse_list_pattern_part_format(findEntry(path, "listPatterns/listPattern/listPatternPart[2]")) 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")) endonym = None if country_code and script_code: endonym = findEntryDef(path, "localeDisplayNames/languages/language[type=%s_%s_%s]" % (language_code, script_code, country_code)) if not endonym and script_code: endonym = findEntryDef(path, "localeDisplayNames/languages/language[type=%s_%s]" % (language_code, script_code)) if not endonym and country_code: endonym = findEntryDef(path, "localeDisplayNames/languages/language[type=%s_%s]" % (language_code, country_code)) if not endonym: endonym = findEntryDef(path, "localeDisplayNames/languages/language[type=%s]" % (language_code)) result['language_endonym'] = endonym result['country_endonym'] = findEntryDef(path, "localeDisplayNames/territories/territory[type=%s]" % (country_code)) currency_format = get_number_in_system(path, "numbers/currencyFormats/currencyFormatLength/currencyFormat/pattern", numbering_system) currency_format = parse_number_format(currency_format, result) result['currencyFormat'] = currency_format[0] result['currencyNegativeFormat'] = '' if len(currency_format) > 1: result['currencyNegativeFormat'] = currency_format[1] result['currencySymbol'] = '' result['currencyDisplayName'] = '' if result['currencyIsoCode']: result['currencySymbol'] = findEntryDef(path, "numbers/currencies/currency[%s]/symbol" % result['currencyIsoCode']) result['currencyDisplayName'] = ';'.join( findEntryDef(path, 'numbers/currencies/currency[' + result['currencyIsoCode'] + ']/displayName' + tail) for tail in ['',] + [ '[count=%s]' % x for x in ('zero', 'one', 'two', 'few', 'many', 'other') ]) + ';' def findUnitDef(path, stem, fallback=''): # The displayName for a quantified unit in en.xml is kByte # instead of kB (etc.), so prefer any unitPattern provided: for count in ('many', 'few', 'two', 'other', 'zero', 'one'): try: ans = findEntry(path, stem + 'unitPattern[count=%s]' % count) except xpathlite.Error: continue # TODO: epxloit count-handling, instead of discarding placeholders if ans.startswith('{0}'): ans = ans[3:].lstrip() if ans: return ans return findEntryDef(path, stem + 'displayName', fallback) # First without quantifier, then quantified each way: result['byte_unit'] = findEntryDef( path, 'units/unitLength[type=long]/unit[type=digital-byte]/displayName', 'bytes') stem = 'units/unitLength[type=short]/unit[type=digital-%sbyte]/' known = [] # cases where we *do* have a given version: result['byte_si_quantified'] = ';'.join(unit_quantifiers(findUnitDef, path, stem, 'B', known)) # IEC 60027-2 # http://physics.nist.gov/cuu/Units/binary.html result['byte_iec_quantified'] = ';'.join(unit_quantifiers(findUnitDef, path, stem % '%sbi', 'iB', known)) # Used for month and day data: namings = ( ('standaloneLong', 'stand-alone', 'wide'), ('standaloneShort', 'stand-alone', 'abbreviated'), ('standaloneNarrow', 'stand-alone', 'narrow'), ('long', 'format', 'wide'), ('short', 'format', 'abbreviated'), ('narrow', 'format', 'narrow'), ) # Month data: for cal in ('gregorian',): # We shall want to add to this stem = 'dates/calendars/calendar[' + cal + ']/months/' for (key, mode, size) in namings: prop = 'monthContext[' + mode + ']/monthWidth[' + size + ']/' result[key + 'Months'] = ';'.join( findEntry(path, stem + prop + "month[%d]" % i) for i in range(1, 13)) + ';' # Day data (for Gregorian, at least): stem = 'dates/calendars/calendar[gregorian]/days/' days = ('sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat') for (key, mode, size) in namings: prop = 'dayContext[' + mode + ']/dayWidth[' + size + ']/day' result[key + 'Days'] = ';'.join( findEntry(path, stem + prop + '[' + day + ']') for day in days) + ';' return Locale(result)
def generateLocaleInfo(path): (dir_name, file_name) = os.path.split(path) if not path.endswith(".xml"): return {} # skip legacy/compatibility ones alias = findAlias(path) if alias: raise xpathlite.Error('alias to "%s"' % alias) 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 do not support variants # ### actually there is only one locale with variant: en_US_POSIX # does anybody care about it at all? if variant_code: raise xpathlite.Error('we do not support variants ("%s")' % variant_code) language_id = enumdata.languageCodeToId(language_code) if language_id <= 0: raise xpathlite.Error('unknown language code "%s"' % language_code) language = enumdata.language_list[language_id][0] script_id = enumdata.scriptCodeToId(script_code) if script_id == -1: raise xpathlite.Error('unknown script code "%s"' % script_code) script = enumdata.script_list[script_id][0] # we should handle fully qualified names with the territory if not country_code: return {} country_id = enumdata.countryCodeToId(country_code) if country_id <= 0: raise xpathlite.Error('unknown country code "%s"' % country_code) country = enumdata.country_list[country_id][0] # 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["script"] = script 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["script_id"] = script_id result["country_id"] = country_id supplementalPath = dir_name + "/../supplemental/supplementalData.xml" currencies = findTagsInFile(supplementalPath, "currencyData/region[iso3166=%s]" % country_code) result["currencyIsoCode"] = "" result["currencyDigits"] = 2 result["currencyRounding"] = 1 if currencies: for e in currencies: if e[0] == "currency": tender = True t = filter(lambda x: x[0] == "tender", e[1]) if t and t[0][1] == "false": tender = False if tender and not filter(lambda x: x[0] == "to", e[1]): result["currencyIsoCode"] = filter(lambda x: x[0] == "iso4217", e[1])[0][1] break if result["currencyIsoCode"]: t = findTagsInFile(supplementalPath, "currencyData/fractions/info[iso4217=%s]" % result["currencyIsoCode"]) if t and t[0][0] == "info": result["currencyDigits"] = int(filter(lambda x: x[0] == "digits", t[0][1])[0][1]) result["currencyRounding"] = int(filter(lambda x: x[0] == "rounding", t[0][1])[0][1]) numbering_system = None try: numbering_system = findEntry(path, "numbers/defaultNumberingSystem") except: pass def findEntryDef(path, xpath, value=""): try: return findEntry(path, xpath) except xpathlite.Error: return value def get_number_in_system(path, xpath, numbering_system): if numbering_system: try: return findEntry(path, xpath + "[numberSystem=" + numbering_system + "]") except xpathlite.Error: # in CLDR 1.9 number system was refactored for numbers (but not for currency) # so if previous findEntry doesn't work we should try this: try: return findEntry( path, xpath.replace("/symbols/", "/symbols[numberSystem=" + numbering_system + "]/") ) except xpathlite.Error: # fallback to default 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) try: numbering_systems = {} for ns in findTagsInFile(cldr_dir + "/../supplemental/numberingSystems.xml", "numberingSystems"): tmp = {} id = "" for data in ns[1:][ 0 ]: # ns looks like this: [u'numberingSystem', [(u'digits', u'0123456789'), (u'type', u'numeric'), (u'id', u'latn')]] tmp[data[0]] = data[1] if data[0] == u"id": id = data[1] numbering_systems[id] = tmp result["zero"] = numbering_systems[numbering_system][u"digits"][0] except e: sys.stderr.write("Native zero detection problem:\n" + str(e) + "\n") 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["quotationStart"] = findEntry(path, "delimiters/quotationStart") result["quotationEnd"] = findEntry(path, "delimiters/quotationEnd") result["alternateQuotationStart"] = findEntry(path, "delimiters/alternateQuotationStart") result["alternateQuotationEnd"] = findEntry(path, "delimiters/alternateQuotationEnd") result["listPatternPartStart"] = parse_list_pattern_part_format( findEntry(path, "listPatterns/listPattern/listPatternPart[start]") ) result["listPatternPartMiddle"] = parse_list_pattern_part_format( findEntry(path, "listPatterns/listPattern/listPatternPart[middle]") ) result["listPatternPartEnd"] = parse_list_pattern_part_format( findEntry(path, "listPatterns/listPattern/listPatternPart[end]") ) result["listPatternPartTwo"] = parse_list_pattern_part_format( findEntry(path, "listPatterns/listPattern/listPatternPart[2]") ) 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") ) endonym = None if country_code and script_code: endonym = findEntryDef( path, "localeDisplayNames/languages/language[type=%s_%s_%s]" % (language_code, script_code, country_code) ) if not endonym and script_code: endonym = findEntryDef(path, "localeDisplayNames/languages/language[type=%s_%s]" % (language_code, script_code)) if not endonym and country_code: endonym = findEntryDef( path, "localeDisplayNames/languages/language[type=%s_%s]" % (language_code, country_code) ) if not endonym: endonym = findEntryDef(path, "localeDisplayNames/languages/language[type=%s]" % (language_code)) result["language_endonym"] = endonym result["country_endonym"] = findEntryDef(path, "localeDisplayNames/territories/territory[type=%s]" % (country_code)) currency_format = get_number_in_system( path, "numbers/currencyFormats/currencyFormatLength/currencyFormat/pattern", numbering_system ) currency_format = parse_number_format(currency_format, result) result["currencyFormat"] = currency_format[0] result["currencyNegativeFormat"] = "" if len(currency_format) > 1: result["currencyNegativeFormat"] = currency_format[1] result["currencySymbol"] = "" result["currencyDisplayName"] = "" if result["currencyIsoCode"]: result["currencySymbol"] = findEntryDef( path, "numbers/currencies/currency[%s]/symbol" % result["currencyIsoCode"] ) display_name_path = "numbers/currencies/currency[%s]/displayName" % result["currencyIsoCode"] result["currencyDisplayName"] = ( findEntryDef(path, display_name_path) + ";" + findEntryDef(path, display_name_path + "[count=zero]") + ";" + findEntryDef(path, display_name_path + "[count=one]") + ";" + findEntryDef(path, display_name_path + "[count=two]") + ";" + findEntryDef(path, display_name_path + "[count=few]") + ";" + findEntryDef(path, display_name_path + "[count=many]") + ";" + findEntryDef(path, display_name_path + "[count=other]") + ";" ) 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 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 variants # ### actually there is only one locale with variant: en_US_POSIX # does anybody care about it at all? if variant_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] script_id = enumdata.scriptCodeToId(script_code) if script_code == -1: sys.stderr.write("unnknown script code \"" + script_code + "\"\n") return {} script = "AnyScript" if script_id != -1: script = enumdata.script_list[script_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['script'] = script 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['script_id'] = script_id result['country_id'] = country_id supplementalPath = dir_name + "/../supplemental/supplementalData.xml" currencies = findTagsInFile(supplementalPath, "currencyData/region[iso3166=%s]"%country_code); result['currencyIsoCode'] = '' result['currencyDigits'] = 2 result['currencyRounding'] = 1 if currencies: for e in currencies: if e[0] == 'currency': tender = True t = filter(lambda x: x[0] == 'tender', e[1]) if t and t[0][1] == 'false': tender = False; if tender and not filter(lambda x: x[0] == 'to', e[1]): result['currencyIsoCode'] = filter(lambda x: x[0] == 'iso4217', e[1])[0][1] break if result['currencyIsoCode']: t = findTagsInFile(supplementalPath, "currencyData/fractions/info[iso4217=%s]"%result['currencyIsoCode']); if t and t[0][0] == 'info': result['currencyDigits'] = int(filter(lambda x: x[0] == 'digits', t[0][1])[0][1]) result['currencyRounding'] = int(filter(lambda x: x[0] == 'rounding', t[0][1])[0][1]) numbering_system = None try: numbering_system = findEntry(path, "numbers/defaultNumberingSystem") except: pass def findEntryDef(path, xpath, value=''): try: return findEntry(path, xpath) except xpathlite.Error: return value 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['quotationStart'] = findEntry(path, "delimiters/quotationStart") result['quotationEnd'] = findEntry(path, "delimiters/quotationEnd") result['alternateQuotationStart'] = findEntry(path, "delimiters/alternateQuotationStart") result['alternateQuotationEnd'] = findEntry(path, "delimiters/alternateQuotationEnd") result['listPatternPartStart'] = parse_list_pattern_part_format(findEntry(path, "listPatterns/listPattern/listPatternPart[start]")) result['listPatternPartMiddle'] = parse_list_pattern_part_format(findEntry(path, "listPatterns/listPattern/listPatternPart[middle]")) result['listPatternPartEnd'] = parse_list_pattern_part_format(findEntry(path, "listPatterns/listPattern/listPatternPart[end]")) result['listPatternPartTwo'] = parse_list_pattern_part_format(findEntry(path, "listPatterns/listPattern/listPatternPart[2]")) 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")) endonym = None if country_code and script_code: endonym = findEntryDef(path, "localeDisplayNames/languages/language[type=%s_%s_%s]" % (language_code, script_code, country_code)) if not endonym and script_code: endonym = findEntryDef(path, "localeDisplayNames/languages/language[type=%s_%s]" % (language_code, script_code)) if not endonym and country_code: endonym = findEntryDef(path, "localeDisplayNames/languages/language[type=%s_%s]" % (language_code, country_code)) if not endonym: endonym = findEntryDef(path, "localeDisplayNames/languages/language[type=%s]" % (language_code)) result['language_endonym'] = endonym result['country_endonym'] = findEntryDef(path, "localeDisplayNames/territories/territory[type=%s]" % (country_code)) currency_format = get_number_in_system(path, "numbers/currencyFormats/currencyFormatLength/currencyFormat/pattern", numbering_system) currency_format = parse_number_format(currency_format, result) result['currencyFormat'] = currency_format[0] result['currencyNegativeFormat'] = '' if len(currency_format) > 1: result['currencyNegativeFormat'] = currency_format[1] result['currencySymbol'] = '' result['currencyDisplayName'] = '' if result['currencyIsoCode']: result['currencySymbol'] = findEntryDef(path, "numbers/currencies/currency[%s]/symbol" % result['currencyIsoCode']) display_name_path = "numbers/currencies/currency[%s]/displayName" % result['currencyIsoCode'] result['currencyDisplayName'] \ = findEntryDef(path, display_name_path) + ";" \ + findEntryDef(path, display_name_path + "[count=zero]") + ";" \ + findEntryDef(path, display_name_path + "[count=one]") + ";" \ + findEntryDef(path, display_name_path + "[count=two]") + ";" \ + findEntryDef(path, display_name_path + "[count=few]") + ";" \ + findEntryDef(path, display_name_path + "[count=many]") + ";" \ + findEntryDef(path, display_name_path + "[count=other]") + ";" 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 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 variants # ### actually there is only one locale with variant: en_US_POSIX # does anybody care about it at all? if variant_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] script_id = enumdata.scriptCodeToId(script_code) if script_code == -1: sys.stderr.write("unnknown script code \"" + script_code + "\"\n") return {} script = "AnyScript" if script_id != -1: script = enumdata.script_list[script_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['script'] = script 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['script_id'] = script_id result['country_id'] = country_id supplementalPath = dir_name + "/../supplemental/supplementalData.xml" currencies = findTagsInFile( supplementalPath, "currencyData/region[iso3166=%s]" % country_code) result['currencyIsoCode'] = '' result['currencyDigits'] = 2 result['currencyRounding'] = 1 if currencies: for e in currencies: if e[0] == 'currency': tender = True t = filter(lambda x: x[0] == 'tender', e[1]) if t and t[0][1] == 'false': tender = False if tender and not filter(lambda x: x[0] == 'to', e[1]): result['currencyIsoCode'] = filter( lambda x: x[0] == 'iso4217', e[1])[0][1] break if result['currencyIsoCode']: t = findTagsInFile( supplementalPath, "currencyData/fractions/info[iso4217=%s]" % result['currencyIsoCode']) if t and t[0][0] == 'info': result['currencyDigits'] = int( filter(lambda x: x[0] == 'digits', t[0][1])[0][1]) result['currencyRounding'] = int( filter(lambda x: x[0] == 'rounding', t[0][1])[0][1]) numbering_system = None try: numbering_system = findEntry(path, "numbers/defaultNumberingSystem") except: pass def findEntryDef(path, xpath, value=''): try: return findEntry(path, xpath) except xpathlite.Error: return value 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['quotationStart'] = findEntry(path, "delimiters/quotationStart") result['quotationEnd'] = findEntry(path, "delimiters/quotationEnd") result['alternateQuotationStart'] = findEntry( path, "delimiters/alternateQuotationStart") result['alternateQuotationEnd'] = findEntry( path, "delimiters/alternateQuotationEnd") result['listPatternPartStart'] = parse_list_pattern_part_format( findEntry(path, "listPatterns/listPattern/listPatternPart[start]")) result['listPatternPartMiddle'] = parse_list_pattern_part_format( findEntry(path, "listPatterns/listPattern/listPatternPart[middle]")) result['listPatternPartEnd'] = parse_list_pattern_part_format( findEntry(path, "listPatterns/listPattern/listPatternPart[end]")) result['listPatternPartTwo'] = parse_list_pattern_part_format( findEntry(path, "listPatterns/listPattern/listPatternPart[2]")) 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" )) endonym = None if country_code and script_code: endonym = findEntryDef( path, "localeDisplayNames/languages/language[type=%s_%s_%s]" % (language_code, script_code, country_code)) if not endonym and script_code: endonym = findEntryDef( path, "localeDisplayNames/languages/language[type=%s_%s]" % (language_code, script_code)) if not endonym and country_code: endonym = findEntryDef( path, "localeDisplayNames/languages/language[type=%s_%s]" % (language_code, country_code)) if not endonym: endonym = findEntryDef( path, "localeDisplayNames/languages/language[type=%s]" % (language_code)) result['language_endonym'] = endonym result['country_endonym'] = findEntryDef( path, "localeDisplayNames/territories/territory[type=%s]" % (country_code)) currency_format = get_number_in_system( path, "numbers/currencyFormats/currencyFormatLength/currencyFormat/pattern", numbering_system) currency_format = parse_number_format(currency_format, result) result['currencyFormat'] = currency_format[0] result['currencyNegativeFormat'] = '' if len(currency_format) > 1: result['currencyNegativeFormat'] = currency_format[1] result['currencySymbol'] = '' result['currencyDisplayName'] = '' if result['currencyIsoCode']: result['currencySymbol'] = findEntryDef( path, "numbers/currencies/currency[%s]/symbol" % result['currencyIsoCode']) display_name_path = "numbers/currencies/currency[%s]/displayName" % result[ 'currencyIsoCode'] result['currencyDisplayName'] \ = findEntryDef(path, display_name_path) + ";" \ + findEntryDef(path, display_name_path + "[count=zero]") + ";" \ + findEntryDef(path, display_name_path + "[count=one]") + ";" \ + findEntryDef(path, display_name_path + "[count=two]") + ";" \ + findEntryDef(path, display_name_path + "[count=few]") + ";" \ + findEntryDef(path, display_name_path + "[count=many]") + ";" \ + findEntryDef(path, display_name_path + "[count=other]") + ";" 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