// Maps ADIF DXCC entity numbers to ISO-3166 alpha-2 codes (flagcdn slugs), // so we can show the contacted entity's flag in the UI. // // Why not emoji flags? Windows does NOT render regional-indicator flag // emoji (it shows the two letters instead), and this is a Windows app — so // we use flagcdn.com PNGs keyed by ISO code instead. // // Numbers are taken verbatim from internal/dxcc/adif_numbers.go so they're // guaranteed correct. Coverage is the commonly-worked entities; an unknown // DXCC number simply yields no flag (graceful — better than a wrong one). // // French overseas territories (Corsica, Guadeloupe, Martinique, Réunion, // New Caledonia, French Polynesia…) are mapped to "fr": they fly the French // tricolore and several of their ISO codes aren't served by flagcdn. const DXCC_ISO: Record = { // North America 1: 'ca', 291: 'us', 6: 'us', 110: 'us', 50: 'mx', 202: 'pr', 285: 'vi', 91: 'vg', 69: 'ky', 82: 'jm', 60: 'bs', 64: 'bm', 78: 'ht', 72: 'do', 70: 'cu', 62: 'bb', 90: 'tt', 77: 'gd', 97: 'lc', 98: 'vc', 95: 'dm', 96: 'ms', 249: 'kn', 94: 'ag', 89: 'tc', 79: 'fr', 84: 'fr', 63: 'fr', // Central America 66: 'bz', 80: 'hn', 74: 'sv', 86: 'ni', 308: 'cr', 88: 'pa', 76: 'gt', // South America 116: 'co', 120: 'ec', 71: 'ec', 136: 'pe', 104: 'bo', 112: 'cl', 100: 'ar', 144: 'uy', 132: 'py', 108: 'br', 148: 've', 129: 'gy', 140: 'sr', 216: 'co', // Western Europe 227: 'fr', 214: 'fr', 230: 'de', 209: 'be', 263: 'nl', 254: 'lu', 287: 'ch', 251: 'li', 206: 'at', 248: 'it', 225: 'it', 281: 'es', 272: 'pt', 203: 'ad', 278: 'sm', 295: 'va', 260: 'mc', // British Isles 223: 'gb-eng', 279: 'gb-sct', 294: 'gb-wls', 265: 'gb-nir', 245: 'ie', 114: 'im', 122: 'je', 106: 'gg', // Central / Eastern Europe 269: 'pl', 503: 'cz', 504: 'sk', 239: 'hu', 275: 'ro', 212: 'bg', 296: 'rs', 514: 'me', 499: 'si', 497: 'hr', 501: 'ba', 502: 'mk', 522: 'xk', 7: 'al', // Greece / Mediterranean 236: 'gr', 45: 'gr', 40: 'gr', 180: 'gr', 215: 'cy', 257: 'mt', 390: 'tr', // Nordic / Baltic 221: 'dk', 222: 'fo', 237: 'gl', 284: 'se', 266: 'no', 224: 'fi', 5: 'ax', 242: 'is', 52: 'ee', 145: 'lv', 146: 'lt', // Eastern Europe / Caucasus / Russia 27: 'by', 288: 'ua', 179: 'md', 75: 'ge', 14: 'am', 18: 'az', 54: 'ru', 15: 'ru', 126: 'ru', // Middle East 336: 'il', 342: 'jo', 354: 'lb', 384: 'sy', 378: 'sa', 391: 'ae', 304: 'bh', 348: 'kw', 376: 'qa', 370: 'om', 492: 'ye', 330: 'ir', 333: 'iq', // North Africa 478: 'eg', 436: 'ly', 400: 'dz', 446: 'ma', 302: 'eh', 474: 'tn', // Sub-Saharan Africa 462: 'za', 464: 'na', 402: 'bw', 452: 'zw', 482: 'zm', 181: 'mz', 438: 'mg', 165: 'mu', 453: 'fr', 379: 'sc', 430: 'ke', 470: 'tz', 286: 'ug', 53: 'et', 51: 'er', 466: 'sd', 521: 'ss', 450: 'ng', 424: 'gh', 406: 'cm', 456: 'sn', 434: 'lr', 458: 'sl', 416: 'bj', 483: 'tg', 428: 'ci', 442: 'ml', 187: 'ne', 410: 'td', 32: 'cv', 420: 'ga', 444: 'mr', 382: 'dj', 454: 'rw', 107: 'gn', 39: 'km', 169: 'fr', // Asia 339: 'jp', 137: 'kr', 344: 'kp', 318: 'cn', 324: 'in', 372: 'pk', 315: 'lk', 369: 'np', 305: 'bd', 306: 'bt', 309: 'mm', 299: 'my', 46: 'my', 381: 'sg', 327: 'id', 375: 'ph', 345: 'bn', 312: 'kh', 143: 'la', 387: 'th', 293: 'vn', 130: 'kz', 292: 'uz', 280: 'tm', 262: 'tj', 135: 'kg', 3: 'af', 159: 'mv', 363: 'mn', 321: 'hk', 386: 'tw', 511: 'tl', // Oceania 150: 'au', 163: 'pg', 185: 'sb', 158: 'vu', 176: 'fj', 190: 'ws', 170: 'nz', 162: 'fr', 175: 'fr', 160: 'to', 282: 'tv', 301: 'ki', 188: 'nu', 168: 'mh', 189: 'nf', 147: 'au', }; // flagURL returns a flagcdn PNG URL for the given DXCC entity number, or '' // when we don't have a mapping. Height ~20px by default (retina-friendly). export function flagURL(dxcc?: number): string { if (!dxcc) return ''; const iso = DXCC_ISO[dxcc]; return iso ? `https://flagcdn.com/h20/${iso}.png` : ''; }