zh_TW is not a locale that the CLDR has. The canonical name of that locale is zh_Hant_TW. There is a ticket open on adding support for fuzzy locales that dynamically find the most appropriate data file.
With regards to why zh_CN does not resolve: the likely subtag expansion in Babel is currently very buggy and limited. Also related to not having fuzzy locales. There is already #30 that tracks this.
Babel>=1.0,<1.3 has a bug where some OpenStack supported
locales like 'zh_CN' and 'zh_TW', aren't supported, see:
In Babel 1.3 they fixed the bug and they support these locales, but
they are still not explicitly "listed" by locale_identifiers(). That's
why we add the locales if necessary so they are listed as supported
otherwise when validating supported locales for the transalated log, we
would fail to allow them even if there are .mo files for
Babel parses locale 'zh_Hant' as 'zh_Hant_TW', which accepts solely
underscores and rejects any dashes. Though I don't know if this follows
the standard ISO lang code format, it is the status quo. And all the
settings can be easily switched.