如何让Intl.DisplayNames支持ISO 3166-2细分地区代码?
如何让Intl.DisplayNames支持ISO 3166-2细分地区代码?
我太懂你这种头疼的情况了——原生的Intl.DisplayNames用region类型时,确实只支持ISO 3166-1的国家/地区代码,像GB-ENG、GB-SCT这类ISO 3166-2的细分行政区代码是不在它的支持范围内的。这不是平台差异的问题,是API本身的设计限制,原生层面就是不支持的,不管怎么调整参数都没法让它识别这些细分代码。
那该怎么解决呢?给你几个实用的方案:
手动维护细分代码映射表
如果你只需要处理已知的几个细分代码(比如你遇到的英国四个地区),最简单直接的方式就是自己建一个小型映射表。这种方法不需要额外依赖,执行效率也高:// 先定义细分代码到名称的映射 const SUBDIVISION_MAP = { 'GB-ENG': 'England', 'GB-NIR': 'Northern Ireland', 'GB-SCT': 'Scotland', 'GB-WLS': 'Wales' }; // 然后在处理逻辑里先查这个表 fs.readdir("./static/foo", function (err, files) { for (let file of files) { const code = file.split(".")[0].toUpperCase(); let regionName; // 优先查细分映射表 if (SUBDIVISION_MAP[code]) { regionName = SUBDIVISION_MAP[code]; initFlag(regionName, file); continue; } // 没有匹配的细分代码,再用原生Intl尝试 try { regionName = COUNTRY_FINDER.of(code); initFlag(regionName, file); } catch (err) { console.error(`Could not initialize country "${code}"`); } } });使用支持细分代码的第三方库
如果以后需要处理更多国家的细分代码,手动维护映射表就不现实了。这时可以找专门维护ISO 3166全量数据的npm包,比如iso-3166-2或者country-region-data,这些库包含完整的ISO 3166-2代码和对应名称的映射,而且跨平台行为一致,不会有原生Intl的平台差异问题。降级到父国家代码(备选方案)
如果你的业务场景可以接受用父国家名称代替细分地区(比如把GB-ENG显示为United Kingdom),可以提取代码中的国家前缀部分(比如code.split('-')[0]),再用Intl获取父国家的名称。不过这个方案要看你的业务需求是否允许,毕竟它丢失了细分地区的信息。
总之,原生Intl.DisplayNames是100%不支持ISO 3166-2细分代码的,不用再尝试去“强制”它支持了,上面的几种方案更实际可靠。
内容来源于stack exchange
相关产品推荐
相关产品推荐

