Files
wr.do/lib/contries.ts
2025-06-01 13:49:29 +08:00

593 lines
15 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

export const countryMap = {
BO: "Bolivia, Plurinational State of",
CG: "Congo, Republic of the",
KP: "North Korea",
KR: "South Korea",
MD: "Moldova, Republic of",
RU: "Russia",
VA: "Holy See",
AF: "Afghanistan",
AL: "Albania",
DZ: "Algeria",
AD: "Andorra",
AO: "Angola",
AG: "Antigua and Barbuda",
AR: "Argentina",
AM: "Armenia",
AU: "Australia",
AT: "Austria",
AZ: "Azerbaijan",
BS: "Bahamas",
BH: "Bahrain",
BD: "Bangladesh",
BB: "Barbados",
BY: "Belarus",
BE: "Belgium",
BZ: "Belize",
BJ: "Benin",
BT: "Bhutan",
BA: "Bosnia and Herzegovina",
BW: "Botswana",
BR: "Brazil",
BN: "Brunei Darussalam",
BG: "Bulgaria",
BF: "Burkina Faso",
BI: "Burundi",
CV: "Cabo Verde",
KH: "Cambodia",
CM: "Cameroon",
CA: "Canada",
CF: "Central African Republic",
TD: "Chad",
CL: "Chile",
CN: "China",
CO: "Colombia",
KM: "Comoros",
CD: "Congo, Democratic Republic of the",
CR: "Costa Rica",
CI: "Côte d'Ivoire",
HR: "Croatia",
CU: "Cuba",
CY: "Cyprus",
CZ: "Czechia",
DK: "Denmark",
DJ: "Djibouti",
DM: "Dominica",
DO: "Dominican Republic",
EC: "Ecuador",
EG: "Egypt",
SV: "El Salvador",
GQ: "Equatorial Guinea",
ER: "Eritrea",
EE: "Estonia",
SZ: "Eswatini",
ET: "Ethiopia",
FJ: "Fiji",
FI: "Finland",
FR: "France",
GA: "Gabon",
GM: "Gambia",
GE: "Georgia",
DE: "Germany",
GH: "Ghana",
GR: "Greece",
GD: "Grenada",
GT: "Guatemala",
GN: "Guinea",
GW: "Guinea-Bissau",
GY: "Guyana",
HT: "Haiti",
HN: "Honduras",
HU: "Hungary",
HK: "Hong Kong,China",
IS: "Iceland",
IN: "India",
ID: "Indonesia",
IR: "Iran",
IQ: "Iraq",
IE: "Ireland",
IL: "Israel",
IT: "Italy",
JM: "Jamaica",
JP: "Japan",
JO: "Jordan",
KZ: "Kazakhstan",
KE: "Kenya",
KI: "Kiribati",
KW: "Kuwait",
KG: "Kyrgyzstan",
LA: "Lao People's Democratic Republic",
LV: "Latvia",
LB: "Lebanon",
LS: "Lesotho",
LR: "Liberia",
LY: "Libya",
LI: "Liechtenstein",
LT: "Lithuania",
LU: "Luxembourg",
MG: "Madagascar",
MW: "Malawi",
MY: "Malaysia",
MV: "Maldives",
ML: "Mali",
MT: "Malta",
MH: "Marshall Islands",
MR: "Mauritania",
MU: "Mauritius",
MX: "Mexico",
FM: "Micronesia, Federated States of",
MC: "Monaco",
MN: "Mongolia",
ME: "Montenegro",
MA: "Morocco",
MZ: "Mozambique",
MM: "Myanmar",
NA: "Namibia",
NR: "Nauru",
NP: "Nepal",
NL: "Netherlands",
NZ: "New Zealand",
NI: "Nicaragua",
NE: "Niger",
NG: "Nigeria",
NU: "Niue",
MK: "North Macedonia",
NO: "Norway",
OM: "Oman",
PK: "Pakistan",
PW: "Palau",
PA: "Panama",
PG: "Papua New Guinea",
PY: "Paraguay",
PE: "Peru",
PH: "Philippines",
PL: "Poland",
PT: "Portugal",
QA: "Qatar",
RO: "Romania",
RW: "Rwanda",
KN: "Saint Kitts and Nevis",
LC: "Saint Lucia",
VC: "Saint Vincent and the Grenadines",
WS: "Samoa",
SM: "San Marino",
ST: "Sao Tome and Principe",
SA: "Saudi Arabia",
SN: "Senegal",
RS: "Serbia",
SC: "Seychelles",
SL: "Sierra Leone",
SG: "Singapore",
SK: "Slovakia",
SI: "Slovenia",
SB: "Solomon Islands",
SO: "Somalia",
ZA: "South Africa",
SS: "South Sudan",
ES: "Spain",
LK: "Sri Lanka",
SD: "Sudan",
SR: "Suriname",
SE: "Sweden",
CH: "Switzerland",
SY: "Syrian Arab Republic",
TJ: "Tajikistan",
TZ: "Tanzania",
TH: "Thailand",
TL: "Timor-Leste",
TG: "Togo",
TK: "Tokelau",
TO: "Tonga",
TT: "Trinidad and Tobago",
TN: "Tunisia",
TR: "Turkey",
TM: "Turkmenistan",
TV: "Tuvalu",
UG: "Uganda",
UA: "Ukraine",
AE: "United Arab Emirates",
GB: "United Kingdom",
US: "United States",
UY: "Uruguay",
UZ: "Uzbekistan",
VU: "Vanuatu",
VE: "Venezuela",
VN: "Vietnam",
YE: "Yemen",
ZM: "Zambia",
ZW: "Zimbabwe",
AQ: "Antarctica",
AS: "American Samoa",
AX: "Åland Islands",
BM: "Bermuda",
MO: "Macao,China",
PS: "Palestine, State of",
PR: "Puerto Rico",
TW: "Taiwan,China",
XK: "Kosovo",
};
export const getCountryName = (code: string) => {
return countryMap[code.toUpperCase()] || code;
};
const vendorMap = [
// 手机厂商
{ prefix: /^CPH/i, vendor: "OPPO" }, // OPPO 智能手机
{ prefix: /^V\d/i, vendor: "Vivo" }, // Vivo 智能手机
{ prefix: /^(M\d|220\d|230\d|240\d)/i, vendor: "Xiaomi" }, // 小米/Redmi 智能手机
{ prefix: /^RMX/i, vendor: "Realme" }, // Realme 智能手机
{ prefix: /^SM-/i, vendor: "Samsung" }, // 三星智能手机/平板
{
prefix: /^(ANA|STF|VOG|JNY|LYA|TAS|DBR|ADY|FNE|REP|NOP|ROD)/i,
vendor: "Huawei",
},
{ prefix: /^iPhone/i, vendor: "iPhone" }, // 苹果 iPhone
{ prefix: /^(IN|KB|LE|CPH\d{4})/i, vendor: "OnePlus" }, // OnePlus 智能手机
{ prefix: /^(TA-\d|\d{4}$)/i, vendor: "Nokia" }, // 诺基亚智能手机/功能机
{ prefix: /^XQ-/i, vendor: "Sony" }, // 索尼 Xperia 智能手机
{ prefix: /^XT/i, vendor: "Motorola" }, // 摩托罗拉智能手机
{ prefix: /^(GP|G[0-9A-Z]{3})/i, vendor: "Google" }, // Google Pixel 智能手机
{ prefix: /^LM-/i, vendor: "LG" }, // LG 智能手机
{ prefix: /^ASUS-/i, vendor: "Asus" }, // 华硕智能手机
// 平板厂商
{ prefix: /^iPad/i, vendor: "Apple" }, // 苹果 iPad
{ prefix: /^(TBL-|TB-)/i, vendor: "Lenovo" }, // 联想平板
// 电脑厂商
{ prefix: /^MacBook/i, vendor: "MacBook" }, // 苹果 MacBook
{ prefix: /^(A1\d{2}|A2\d{2})/i, vendor: "Apple" }, // 苹果 MacBook 内部型号
{ prefix: /^(XPS|Latitude|Inspiron)/i, vendor: "Dell" }, // 戴尔笔记本
{ prefix: /^(Pavilion|EliteBook|ProBook|Envy)/i, vendor: "HP" }, // 惠普电脑
{ prefix: /^(ThinkPad|IdeaPad|Legion)/i, vendor: "Lenovo" }, // 联想笔记本
{ prefix: /^(ROG|ZenBook|VivoBook|G[5-9]|Strix)/i, vendor: "Asus" }, // 华硕笔记本
{ prefix: /^(Acer-|Predator|Nitro)/i, vendor: "Acer" }, // 宏碁笔记本/游戏设备
{ prefix: /^Surface/i, vendor: "Microsoft" }, // 微软 Surface
{ prefix: /^(MateBook|MagicBook)/i, vendor: "Huawei" }, // 华为笔记本
// 其他设备
{ prefix: /^Watch/i, vendor: "Apple Watch" }, // 苹果 Watch
{ prefix: /^GT-/i, vendor: "Huawei Watch" }, // 华为手表
{ prefix: /^MiBand/i, vendor: "Xiaomi Watch" }, // 小米手环
];
export const getDeviceVendor = (model: string) => {
const upperModel = model.toUpperCase();
for (const { prefix, vendor } of vendorMap) {
if (typeof prefix === "string" && upperModel.startsWith(prefix)) {
return vendor;
} else if (prefix instanceof RegExp && prefix.test(upperModel)) {
return vendor;
}
}
return model;
};
export function getRegionName(regionCode: string) {
const regionMap = {
// Vercel/Cloudflare 地区代码
hkg1: "Hong Kong",
sin1: "Singapore",
iad1: "Washington D.C. (US East)",
gru1: "São Paulo (Brazil)",
sfo1: "San Francisco (US West)",
cdg1: "Paris (France)",
cle1: "Cleveland (US Central)",
cpt1: "Cape Town (South Africa)",
// AWS 地区代码
"us-east-1": "N. Virginia (US East)",
"us-west-1": "N. California (US West)",
"us-west-2": "Oregon (US West)",
"eu-west-1": "Ireland (Europe)",
"eu-central-1": "Frankfurt (Europe)",
"ap-southeast-1": "Singapore (Asia Pacific)",
"ap-northeast-1": "Tokyo (Asia Pacific)",
"ap-south-1": "Mumbai (Asia Pacific)",
// Cloudflare 地区代码
lhr: "London (UK)",
fra: "Frankfurt (Germany)",
ams: "Amsterdam (Netherlands)",
nrt: "Tokyo (Japan)",
icn: "Seoul (South Korea)",
syd: "Sydney (Australia)",
yyz: "Toronto (Canada)",
mia: "Miami (US Southeast)",
lax: "Los Angeles (US West)",
ord: "Chicago (US Central)",
atl: "Atlanta (US Southeast)",
dfw: "Dallas (US Central)",
sea: "Seattle (US West)",
bos: "Boston (US Northeast)",
ewr: "Newark (US Northeast)",
jfk: "New York (US Northeast)",
// 其他常见地区代码
pdx1: "Portland (US West)",
bom1: "Mumbai (India)",
syd1: "Sydney (Australia)",
nrt1: "Tokyo (Japan)",
fra1: "Frankfurt (Germany)",
lon1: "London (UK)",
ams1: "Amsterdam (Netherlands)",
tor1: "Toronto (Canada)",
nyc1: "New York (US East)",
dub1: "Dublin (Ireland)",
blr1: "Bangalore (India)",
sgp1: "Singapore",
hnd1: "Tokyo Haneda (Japan)",
kix1: "Osaka (Japan)",
icn1: "Seoul (South Korea)",
bkk1: "Bangkok (Thailand)",
mnl1: "Manila (Philippines)",
jkt1: "Jakarta (Indonesia)",
mel1: "Melbourne (Australia)",
per1: "Perth (Australia)",
akl1: "Auckland (New Zealand)",
mad1: "Madrid (Spain)",
bcn1: "Barcelona (Spain)",
mxp1: "Milan (Italy)",
vie1: "Vienna (Austria)",
zrh1: "Zurich (Switzerland)",
sto1: "Stockholm (Sweden)",
hel1: "Helsinki (Finland)",
cph1: "Copenhagen (Denmark)",
osl1: "Oslo (Norway)",
waw1: "Warsaw (Poland)",
prg1: "Prague (Czech Republic)",
bud1: "Budapest (Hungary)",
buh1: "Bucharest (Romania)",
sof1: "Sofia (Bulgaria)",
ath1: "Athens (Greece)",
ist1: "Istanbul (Turkey)",
tlv1: "Tel Aviv (Israel)",
cai1: "Cairo (Egypt)",
jnb1: "Johannesburg (South Africa)",
lag1: "Lagos (Nigeria)",
nbo1: "Nairobi (Kenya)",
dxb1: "Dubai (UAE)",
bah1: "Bahrain",
khi1: "Karachi (Pakistan)",
del1: "Delhi (India)",
ccj1: "Kolkata (India)",
maa1: "Chennai (India)",
hyd1: "Hyderabad (India)",
pnq1: "Pune (India)",
};
return regionMap[regionCode.toLowerCase()] || regionCode.toUpperCase();
}
export function getLanguageName(langCode: string) {
// 统一转换为小写处理大小写不一致
const normalizedCode = langCode.toLowerCase();
const languageMap = {
// 英语系列
en: "English",
"en-us": "English (United States)",
"en-gb": "English (United Kingdom)",
"en-ca": "English (Canada)",
"en-au": "English (Australia)",
"en-nz": "English (New Zealand)",
"en-ie": "English (Ireland)",
"en-za": "English (South Africa)",
"en-in": "English (India)",
// 中文系列
zh: "Chinese",
"zh-cn": "Chinese (Simplified)",
"zh-tw": "Chinese (Traditional)",
"zh-hk": "Chinese (Hong Kong)",
"zh-sg": "Chinese (Singapore)",
// 法语系列
fr: "French",
"fr-fr": "French (France)",
"fr-ca": "French (Canada)",
"fr-be": "French (Belgium)",
"fr-ch": "French (Switzerland)",
// 德语系列
de: "German",
"de-de": "German (Germany)",
"de-at": "German (Austria)",
"de-ch": "German (Switzerland)",
// 西班牙语系列
es: "Spanish",
"es-es": "Spanish (Spain)",
"es-mx": "Spanish (Mexico)",
"es-ar": "Spanish (Argentina)",
"es-co": "Spanish (Colombia)",
"es-cl": "Spanish (Chile)",
// 葡萄牙语系列
pt: "Portuguese",
"pt-pt": "Portuguese (Portugal)",
"pt-br": "Portuguese (Brazil)",
// 意大利语
it: "Italian",
"it-it": "Italian (Italy)",
// 俄语
ru: "Russian",
"ru-ru": "Russian (Russia)",
// 日语
ja: "Japanese",
"ja-jp": "Japanese (Japan)",
// 韩语
ko: "Korean",
"ko-kr": "Korean (South Korea)",
// 阿拉伯语
ar: "Arabic",
"ar-sa": "Arabic (Saudi Arabia)",
"ar-ae": "Arabic (UAE)",
"ar-eg": "Arabic (Egypt)",
// 荷兰语
nl: "Dutch",
"nl-nl": "Dutch (Netherlands)",
"nl-be": "Dutch (Belgium)",
// 北欧语言
sv: "Swedish",
"sv-se": "Swedish (Sweden)",
da: "Danish",
"da-dk": "Danish (Denmark)",
no: "Norwegian",
"no-no": "Norwegian (Norway)",
"nb-no": "Norwegian Bokmål",
"nn-no": "Norwegian Nynorsk",
fi: "Finnish",
"fi-fi": "Finnish (Finland)",
// 其他常见语言
hi: "Hindi",
"hi-in": "Hindi (India)",
th: "Thai",
"th-th": "Thai (Thailand)",
vi: "Vietnamese",
"vi-vn": "Vietnamese (Vietnam)",
tr: "Turkish",
"tr-tr": "Turkish (Turkey)",
pl: "Polish",
"pl-pl": "Polish (Poland)",
cs: "Czech",
"cs-cz": "Czech (Czech Republic)",
sk: "Slovak",
"sk-sk": "Slovak (Slovakia)",
hu: "Hungarian",
"hu-hu": "Hungarian (Hungary)",
ro: "Romanian",
"ro-ro": "Romanian (Romania)",
bg: "Bulgarian",
"bg-bg": "Bulgarian (Bulgaria)",
hr: "Croatian",
"hr-hr": "Croatian (Croatia)",
sr: "Serbian",
"sr-rs": "Serbian (Serbia)",
sl: "Slovenian",
"sl-si": "Slovenian (Slovenia)",
et: "Estonian",
"et-ee": "Estonian (Estonia)",
lv: "Latvian",
"lv-lv": "Latvian (Latvia)",
lt: "Lithuanian",
"lt-lt": "Lithuanian (Lithuania)",
el: "Greek",
"el-gr": "Greek (Greece)",
he: "Hebrew",
"he-il": "Hebrew (Israel)",
fa: "Persian",
"fa-ir": "Persian (Iran)",
ur: "Urdu",
"ur-pk": "Urdu (Pakistan)",
bn: "Bengali",
"bn-bd": "Bengali (Bangladesh)",
ta: "Tamil",
"ta-in": "Tamil (India)",
te: "Telugu",
"te-in": "Telugu (India)",
ml: "Malayalam",
"ml-in": "Malayalam (India)",
kn: "Kannada",
"kn-in": "Kannada (India)",
gu: "Gujarati",
"gu-in": "Gujarati (India)",
pa: "Punjabi",
"pa-in": "Punjabi (India)",
mr: "Marathi",
"mr-in": "Marathi (India)",
ne: "Nepali",
"ne-np": "Nepali (Nepal)",
si: "Sinhala",
"si-lk": "Sinhala (Sri Lanka)",
my: "Myanmar",
"my-mm": "Myanmar (Myanmar)",
km: "Khmer",
"km-kh": "Khmer (Cambodia)",
lo: "Lao",
"lo-la": "Lao (Laos)",
ka: "Georgian",
"ka-ge": "Georgian (Georgia)",
hy: "Armenian",
"hy-am": "Armenian (Armenia)",
az: "Azerbaijani",
"az-az": "Azerbaijani (Azerbaijan)",
kk: "Kazakh",
"kk-kz": "Kazakh (Kazakhstan)",
ky: "Kyrgyz",
"ky-kg": "Kyrgyz (Kyrgyzstan)",
uz: "Uzbek",
"uz-uz": "Uzbek (Uzbekistan)",
tg: "Tajik",
"tg-tj": "Tajik (Tajikistan)",
mn: "Mongolian",
"mn-mn": "Mongolian (Mongolia)",
bo: "Tibetan",
"bo-cn": "Tibetan (China)",
ug: "Uyghur",
"ug-cn": "Uyghur (China)",
id: "Indonesian",
"id-id": "Indonesian (Indonesia)",
ms: "Malay",
"ms-my": "Malay (Malaysia)",
tl: "Filipino",
"tl-ph": "Filipino (Philippines)",
sw: "Swahili",
"sw-ke": "Swahili (Kenya)",
am: "Amharic",
"am-et": "Amharic (Ethiopia)",
ha: "Hausa",
"ha-ng": "Hausa (Nigeria)",
yo: "Yoruba",
"yo-ng": "Yoruba (Nigeria)",
ig: "Igbo",
"ig-ng": "Igbo (Nigeria)",
zu: "Zulu",
"zu-za": "Zulu (South Africa)",
xh: "Xhosa",
"xh-za": "Xhosa (South Africa)",
af: "Afrikaans",
"af-za": "Afrikaans (South Africa)",
};
// 如果找到精确匹配,返回对应值
if (languageMap[normalizedCode]) {
return languageMap[normalizedCode];
}
// 如果没有精确匹配,尝试匹配语言部分(如 en-xx -> English
const langPart = normalizedCode.split("-")[0];
if (languageMap[langPart]) {
return languageMap[langPart];
}
// 如果都没有匹配,返回原始值(大写)
return langCode.toUpperCase();
}
export function getEngineName(engine: string) {
const engineMap = {
Blink: "Chrome Engine",
WebKit: "Safari Engine",
Gecko: "Firefox Engine",
Trident: "IE Engine",
EdgeHTML: "Edge Engine",
Presto: "Opera Engine",
};
return engineMap[engine] || `${engine} Engine`;
}
export function getBotName(bot: boolean) {
return bot === true ? "Bot" : "Human";
}