ICU-21073 Fix ICU Data Build Tool in "locale" mode.
diff --git a/.ci-builds/data-filter.json b/.ci-builds/data-filter.json
index d2dd74d..ffde995 100644
--- a/.ci-builds/data-filter.json
+++ b/.ci-builds/data-filter.json
@@ -1,6 +1,6 @@
 {
   "localeFilter": {
-    "filterType": "language",
+    "filterType": "locale",
     "whitelist": [
       "en",
       "de",
diff --git a/docs/userguide/icu_data/buildtool.md b/docs/userguide/icu_data/buildtool.md
index aa34b8e..7c3eadc 100644
--- a/docs/userguide/icu_data/buildtool.md
+++ b/docs/userguide/icu_data/buildtool.md
@@ -202,7 +202,7 @@
 | Region Display <br/> Names | `"region_tree"` | region/\*.txt | **1.1 MiB** |
 | Rule-Based <br/> Number Formatting <br/> (Spellout, Ordinals) | `"rbnf_tree"` | rbnf/\*.txt | 538 KiB |
 | StringPrep | `"stringprep"` | sprep/\*.txt | 193 KiB |
-| Time Zones | `"misc"` <br/> `"zone_tree"` | misc/metaZones.txt <br/> misc/timezoneTypes.txt <br/> misc/windowsZones.txt <br/> misc/zoneinfo64.txt <br/> zone/\*.txt | 41 KiB <br/> 20 KiB <br/> 22 KiB <br/> 151 KiB <br/> **2.7 MiB** |
+| Time Zones | `"misc"` <br/> `"zone_tree"` <br/> `"zone_supplemental"` | misc/metaZones.txt <br/> misc/timezoneTypes.txt <br/> misc/windowsZones.txt <br/> misc/zoneinfo64.txt <br/> zone/\*.txt <br/> zone/tzdbNames.txt | 41 KiB <br/> 20 KiB <br/> 22 KiB <br/> 151 KiB <br/> **2.7 MiB** <br/> 4.8 KiB |
 | Transliteration | `"translit"` | translit/\*.txt | 685 KiB |
 | Unicode Character <br/> Names | `"unames"` | in/unames.icu | 269 KiB |
 | Unicode Text Layout | `"ulayout"` | in/ulayout.icu | 14 KiB |
diff --git a/icu4c/source/data/BUILDRULES.py b/icu4c/source/data/BUILDRULES.py
index 2338afd..e6ddea9 100644
--- a/icu4c/source/data/BUILDRULES.py
+++ b/icu4c/source/data/BUILDRULES.py
@@ -33,6 +33,7 @@
     requests += generate_unames(config, io, common_vars)
     requests += generate_misc(config, io, common_vars)
     requests += generate_curr_supplemental(config, io, common_vars)
+    requests += generate_zone_supplemental(config, io, common_vars)
     requests += generate_translit(config, io, common_vars)
 
     # Res Tree Files
@@ -399,6 +400,29 @@
     ]
 
 
+def generate_zone_supplemental(config, io, common_vars):
+    # tzdbNames Res File
+    input_file = InFile("zone/tzdbNames.txt")
+    input_basename = "tzdbNames.txt"
+    output_file = OutFile("zone/tzdbNames.res")
+    return [
+        SingleExecutionRequest(
+            name = "zone_supplemental_res",
+            category = "zone_supplemental",
+            dep_targets = [],
+            input_files = [input_file],
+            output_files = [output_file],
+            tool = IcuTool("genrb"),
+            args = "-s {IN_DIR}/zone -d {OUT_DIR}/zone -i {OUT_DIR} "
+                "-k "
+                "{INPUT_BASENAME}",
+            format_with = {
+                "INPUT_BASENAME": input_basename
+            }
+        )
+    ]
+
+
 def generate_translit(config, io, common_vars):
     input_files = [
         InFile("translit/root.txt"),
@@ -444,10 +468,11 @@
     requests = []
     category = "%s_tree" % sub_dir
     out_prefix = "%s/" % out_sub_dir if out_sub_dir else ""
-    # TODO: Clean this up for curr
     input_files = [InFile(filename) for filename in io.glob("%s/*.txt" % sub_dir)]
     if sub_dir == "curr":
         input_files.remove(InFile("curr/supplementalData.txt"))
+    if sub_dir == "zone":
+        input_files.remove(InFile("zone/tzdbNames.txt"))
     input_basenames = [v.filename[len(sub_dir)+1:] for v in input_files]
     output_files = [
         OutFile("%s%s.res" % (out_prefix, v[:-4]))
diff --git a/icu4c/source/python/icutools/databuilder/filtration.py b/icu4c/source/python/icutools/databuilder/filtration.py
index acdba0e..554013a 100644
--- a/icu4c/source/python/icutools/databuilder/filtration.py
+++ b/icu4c/source/python/icutools/databuilder/filtration.py
@@ -217,7 +217,7 @@
             return "root"
         i = locale.rfind("_")
         if i < 0:
-            assert locale == "root"
+            assert locale == "root", "Invalid locale: %s/%s" % (tree, locale)
             return None
         return locale[:i]