]> git.ipfire.org Git - thirdparty/babel.git/commitdiff
Use canonical IANA zone names in zone_territories (#1220)
authorAarni Koskela <akx@iki.fi>
Mon, 29 Dec 2025 11:49:10 +0000 (13:49 +0200)
committerGitHub <noreply@github.com>
Mon, 29 Dec 2025 11:49:10 +0000 (13:49 +0200)
Refs #1218

scripts/import_cldr.py
tests/test_core.py

index ba441e84ed318e95ec6f38f57dd530c331bb51ec..400150b197b05190c4dc9e9fd57d8d7a774e062c 100755 (executable)
@@ -251,13 +251,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
 
index e5e9644e538e4216eb0e0a83de74f7f74f179b92..461d7078268be7d31a45710675573c707c9382ae 100644 (file)
@@ -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():