From: Aarni Koskela Date: Tue, 8 Jul 2025 10:01:45 +0000 (+0300) Subject: Use canonical IANA zone names in zone_territories X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fheads%2Fimprove-zone-map;p=thirdparty%2Fbabel.git Use canonical IANA zone names in zone_territories Refs #1218 --- diff --git a/scripts/import_cldr.py b/scripts/import_cldr.py index bcd5898e..26366abd 100755 --- a/scripts/import_cldr.py +++ b/scripts/import_cldr.py @@ -238,13 +238,22 @@ def parse_global(srcdir, sup): for key_elem in bcp47_timezone.findall('.//keyword/key'): if key_elem.attrib['name'] == 'tz': for elem in key_elem.findall('type'): - if 'deprecated' not in elem.attrib: - aliases = str(elem.attrib['alias']).split() - tzid = aliases.pop(0) - territory = _zone_territory_map.get(tzid, '001') - territory_zones.setdefault(territory, []).append(tzid) - zone_territories[tzid] = territory - for alias in aliases: + if 'deprecated' in elem.attrib: + continue + aliases = str(elem.attrib['alias']).split() + iana = elem.attrib.get('iana') + tzid = iana or aliases[0] # Use the IANA ID if available, otherwise the first alias + territory = '001' + # The windowsZones map might use an alias to refer to a timezone, + # so can't just do a simple dict lookup. + for cand in (tzid, *aliases): + if cand in _zone_territory_map: + territory = _zone_territory_map[cand] + break + territory_zones.setdefault(territory, []).append(tzid) + zone_territories[tzid] = territory + for alias in aliases: + if alias != tzid: zone_aliases[alias] = tzid break diff --git a/tests/test_core.py b/tests/test_core.py index 8c215de4..fc0c12d6 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -55,10 +55,18 @@ def test_ignore_invalid_locales_in_lc_ctype(monkeypatch): default_locale('LC_CTYPE') -def test_get_global(): - assert core.get_global('zone_aliases')['GMT'] == 'Etc/GMT' - assert core.get_global('zone_aliases')['UTC'] == 'Etc/UTC' - assert core.get_global('zone_territories')['Europe/Berlin'] == 'DE' +def test_zone_aliases_and_territories(): + aliases = core.get_global('zone_aliases') + territories = core.get_global('zone_territories') + assert aliases['GMT'] == 'Etc/GMT' + assert aliases['UTC'] == 'Etc/UTC' + assert territories['Europe/Berlin'] == 'DE' + # Check that the canonical (IANA) names are used in `territories`, + # but that aliases are still available. + assert territories['Africa/Asmara'] == 'ER' + assert aliases['Africa/Asmera'] == 'Africa/Asmara' + assert territories['Europe/Kyiv'] == 'UA' + assert aliases['Europe/Kiev'] == 'Europe/Kyiv' def test_hash():