웹 클라이언트에서 국가 코드 추출하기
작성일자 : 2025년 06월 15일
country-detection.ts
function getCountryFromLocale(): string | null {
try {
const locale = navigator.language || (navigator as any).userLanguage;
if (locale && locale.includes('-')) {
const countryCode = locale.split('-')[1];
return countryCode.toUpperCase();
}
return null;
} catch {
return null;
}
}
function getCountryFromTimezone(): string | null {
try {
const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
const timezoneCountryMap: Record<string, string> = {
// Asia
'Asia/Seoul': 'KR',
'Asia/Tokyo': 'JP',
'Asia/Shanghai': 'CN',
'Asia/Hong_Kong': 'HK',
'Asia/Singapore': 'SG',
'Asia/Taipei': 'TW',
'Asia/Bangkok': 'TH',
'Asia/Manila': 'PH',
'Asia/Jakarta': 'ID',
'Asia/Ho_Chi_Minh': 'VN',
'Asia/Kuala_Lumpur': 'MY',
'Asia/Kolkata': 'IN',
'Asia/Mumbai': 'IN',
'Asia/Dubai': 'AE',
'Asia/Riyadh': 'SA',
'Asia/Tehran': 'IR',
'Asia/Istanbul': 'TR',
'Asia/Jerusalem': 'IL',
'Asia/Tashkent': 'UZ',
'Asia/Almaty': 'KZ',
// North America
'America/New_York': 'US',
'America/Chicago': 'US',
'America/Denver': 'US',
'America/Los_Angeles': 'US',
'America/Phoenix': 'US',
'America/Anchorage': 'US',
'America/Toronto': 'CA',
'America/Vancouver': 'CA',
'America/Montreal': 'CA',
'America/Mexico_City': 'MX',
'America/Tijuana': 'MX',
// South America
'America/Sao_Paulo': 'BR',
'America/Buenos_Aires': 'AR',
'America/Santiago': 'CL',
'America/Lima': 'PE',
'America/Bogota': 'CO',
'America/Caracas': 'VE',
// Europe
'Europe/London': 'GB',
'Europe/Paris': 'FR',
'Europe/Berlin': 'DE',
'Europe/Rome': 'IT',
'Europe/Madrid': 'ES',
'Europe/Amsterdam': 'NL',
'Europe/Brussels': 'BE',
'Europe/Vienna': 'AT',
'Europe/Zurich': 'CH',
'Europe/Stockholm': 'SE',
'Europe/Copenhagen': 'DK',
'Europe/Oslo': 'NO',
'Europe/Helsinki': 'FI',
'Europe/Warsaw': 'PL',
'Europe/Prague': 'CZ',
'Europe/Budapest': 'HU',
'Europe/Bucharest': 'RO',
'Europe/Sofia': 'BG',
'Europe/Athens': 'GR',
'Europe/Moscow': 'RU',
'Europe/Kyiv': 'UA',
'Europe/Dublin': 'IE',
'Europe/Lisbon': 'PT',
// Africa
'Africa/Cairo': 'EG',
'Africa/Lagos': 'NG',
'Africa/Johannesburg': 'ZA',
'Africa/Casablanca': 'MA',
'Africa/Nairobi': 'KE',
'Africa/Algiers': 'DZ',
'Africa/Tunis': 'TN',
// Oceania
'Australia/Sydney': 'AU',
'Australia/Melbourne': 'AU',
'Australia/Brisbane': 'AU',
'Australia/Perth': 'AU',
'Australia/Adelaide': 'AU',
'Pacific/Auckland': 'NZ',
'Pacific/Fiji': 'FJ',
'Pacific/Honolulu': 'US',
// Additional
'Atlantic/Reykjavik': 'IS',
};
return timezoneCountryMap[timezone] || null;
} catch {
return null;
}
}
export function detectUserCountry(): string {
const timezoneCountry = getCountryFromTimezone();
if (timezoneCountry) {
return timezoneCountry;
}
const localeCountry = getCountryFromLocale();
if (localeCountry) {
return localeCountry;
}
return 'US';
}