Files
thebet365/packages/shared/src/playerLocale.js
2026-06-13 17:38:25 +08:00

336 lines
14 KiB
JavaScript
Raw 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.
import { resolveTranslationFallback } from './locale';
export const PLAYER_POSITION_LABELS = {
FW: { 'zh-CN': '前锋', 'en-US': 'Forward', 'ms-MY': 'Penyerang' },
MF: { 'zh-CN': '中场', 'en-US': 'Midfielder', 'ms-MY': 'Pemain Tengah' },
DF: { 'zh-CN': '后卫', 'en-US': 'Defender', 'ms-MY': 'Pertahan' },
GK: { 'zh-CN': '守门员', 'en-US': 'Goalkeeper', 'ms-MY': 'Penjaga Gol' },
};
export const PLAYER_COUNTRY_LABELS = {
ARG: { 'zh-CN': '阿根廷', 'en-US': 'Argentina', 'ms-MY': 'Argentina' },
ESP: { 'zh-CN': '西班牙', 'en-US': 'Spain', 'ms-MY': 'Sepanyol' },
CRO: { 'zh-CN': '克罗地亚', 'en-US': 'Croatia', 'ms-MY': 'Croatia' },
URU: { 'zh-CN': '乌拉圭', 'en-US': 'Uruguay', 'ms-MY': 'Uruguay' },
TUR: { 'zh-CN': '土耳其', 'en-US': 'Turkey', 'ms-MY': 'Turki' },
USA: { 'zh-CN': '美国', 'en-US': 'USA', 'ms-MY': 'Amerika Syarikat' },
BRA: { 'zh-CN': '巴西', 'en-US': 'Brazil', 'ms-MY': 'Brazil' },
POR: { 'zh-CN': '葡萄牙', 'en-US': 'Portugal', 'ms-MY': 'Portugal' },
ENG: { 'zh-CN': '英格兰', 'en-US': 'England', 'ms-MY': 'England' },
FRA: { 'zh-CN': '法国', 'en-US': 'France', 'ms-MY': 'Perancis' },
NED: { 'zh-CN': '荷兰', 'en-US': 'Netherlands', 'ms-MY': 'Belanda' },
GER: { 'zh-CN': '德国', 'en-US': 'Germany', 'ms-MY': 'Jerman' },
NOR: { 'zh-CN': '挪威', 'en-US': 'Norway', 'ms-MY': 'Norway' },
MEX: { 'zh-CN': '墨西哥', 'en-US': 'Mexico', 'ms-MY': 'Mexico' },
EGY: { 'zh-CN': '埃及', 'en-US': 'Egypt', 'ms-MY': 'Mesir' },
SWE: { 'zh-CN': '瑞典', 'en-US': 'Sweden', 'ms-MY': 'Sweden' },
COL: { 'zh-CN': '哥伦比亚', 'en-US': 'Colombia', 'ms-MY': 'Colombia' },
MAR: { 'zh-CN': '摩洛哥', 'en-US': 'Morocco', 'ms-MY': 'Maghribi' },
BEL: { 'zh-CN': '比利时', 'en-US': 'Belgium', 'ms-MY': 'Belgium' },
};
/** key = BuiltinPlayer.id文件名去掉 .jpg */
export const PLAYER_LOCALE_META = {
'何塞·曼努埃尔·洛佩斯-前锋-阿根廷': {
name: { 'zh-CN': '何塞·曼努埃尔·洛佩斯', 'en-US': 'José Manuel López', 'ms-MY': 'José Manuel López' },
position: 'FW',
country: 'ARG',
},
'佩德里-中场-西班牙': {
name: { 'zh-CN': '佩德里', 'en-US': 'Pedri', 'ms-MY': 'Pedri' },
position: 'MF',
country: 'ESP',
},
'卢卡·莫德里奇-中场-克罗地亚': {
name: { 'zh-CN': '卢卡·莫德里奇', 'en-US': 'Luka Modrić', 'ms-MY': 'Luka Modrić' },
position: 'MF',
country: 'CRO',
},
'华金·皮克雷斯-中场-乌拉圭': {
name: { 'zh-CN': '华金·皮克雷斯', 'en-US': 'Joaquín Piquerez', 'ms-MY': 'Joaquín Piquerez' },
position: 'MF',
country: 'URU',
},
'乔治亚·德·阿拉斯凯塔-中场-乌拉圭': {
name: { 'zh-CN': '乔治亚·德·阿拉斯凯塔', 'en-US': 'Giorgian de Arrascaeta', 'ms-MY': 'Giorgian de Arrascaeta' },
position: 'MF',
country: 'URU',
},
'乌古尔坎·卡基尔-守門員-土耳其': {
name: { 'zh-CN': '乌古尔坎·卡基尔', 'en-US': 'Uğurcan Çakır', 'ms-MY': 'Uğurcan Çakır' },
position: 'GK',
country: 'TUR',
},
'亚历杭德罗·曾德哈斯-前锋-美国': {
name: { 'zh-CN': '亚历杭德罗·曾德哈斯', 'en-US': 'Alejandro Zendejas', 'ms-MY': 'Alejandro Zendejas' },
position: 'FW',
country: 'USA',
},
'恩德里克-前锋-巴西': {
name: { 'zh-CN': '恩德里克', 'en-US': 'Endrick', 'ms-MY': 'Endrick' },
position: 'FW',
country: 'BRA',
},
'克里斯蒂亚诺·罗纳尔多-前锋-葡萄牙': {
name: { 'zh-CN': '克里斯蒂亚诺·罗纳尔多', 'en-US': 'Cristiano Ronaldo', 'ms-MY': 'Cristiano Ronaldo' },
position: 'FW',
country: 'POR',
},
'克里斯蒂安·罗梅罗-后卫-阿根廷': {
name: { 'zh-CN': '克里斯蒂安·罗梅罗', 'en-US': 'Cristian Romero', 'ms-MY': 'Cristian Romero' },
position: 'DF',
country: 'ARG',
},
'内马尔-前锋-巴西': {
name: { 'zh-CN': '内马尔', 'en-US': 'Neymar', 'ms-MY': 'Neymar' },
position: 'FW',
country: 'BRA',
},
'凯南·耶尔德兹-前锋-土耳其': {
name: { 'zh-CN': '凯南·耶尔德兹', 'en-US': 'Kenan Yıldız', 'ms-MY': 'Kenan Yıldız' },
position: 'FW',
country: 'TUR',
},
'卡塞米罗-中场-巴西': {
name: { 'zh-CN': '卡塞米罗', 'en-US': 'Casemiro', 'ms-MY': 'Casemiro' },
position: 'MF',
country: 'BRA',
},
'卢卡斯·帕奎塔-中场-巴西': {
name: { 'zh-CN': '卢卡斯·帕奎塔', 'en-US': 'Lucas Paquetá', 'ms-MY': 'Lucas Paquetá' },
position: 'MF',
country: 'BRA',
},
'基利安·姆巴佩-前锋-法国': {
name: { 'zh-CN': '基利安·姆巴佩', 'en-US': 'Kylian Mbappé', 'ms-MY': 'Kylian Mbappé' },
position: 'FW',
country: 'FRA',
},
'孟菲斯·德派-前锋-荷兰': {
name: { 'zh-CN': '孟菲斯·德派', 'en-US': 'Memphis Depay', 'ms-MY': 'Memphis Depay' },
position: 'FW',
country: 'NED',
},
'奥斯曼·登贝莱-前锋-法国': {
name: { 'zh-CN': '奥斯曼·登贝莱', 'en-US': 'Ousmane Dembélé', 'ms-MY': 'Ousmane Dembélé' },
position: 'FW',
country: 'FRA',
},
'布鲁诺·吉马良斯-中场-巴西': {
name: { 'zh-CN': '布鲁诺·吉马良斯', 'en-US': 'Bruno Guimarães', 'ms-MY': 'Bruno Guimarães' },
position: 'MF',
country: 'BRA',
},
'布鲁诺·费尔南德斯-中场-葡萄牙': {
name: { 'zh-CN': '布鲁诺·费尔南德斯', 'en-US': 'Bruno Fernandes', 'ms-MY': 'Bruno Fernandes' },
position: 'MF',
country: 'POR',
},
'布卡约·萨卡-前锋-英格兰': {
name: { 'zh-CN': '布卡约·萨卡', 'en-US': 'Bukayo Saka', 'ms-MY': 'Bukayo Saka' },
position: 'FW',
country: 'ENG',
},
'德尼兹·居尔-前锋-土耳其': {
name: { 'zh-CN': '德尼兹·居尔', 'en-US': 'Deniz Gül', 'ms-MY': 'Deniz Gül' },
position: 'FW',
country: 'TUR',
},
'德尼兹·温达夫-前锋-德国': {
name: { 'zh-CN': '德尼兹·温达夫', 'en-US': 'Deniz Undav', 'ms-MY': 'Deniz Undav' },
position: 'FW',
country: 'GER',
},
'拉斐尔·迪亚斯·贝洛利-前锋-巴西': {
name: { 'zh-CN': '拉斐尔·迪亚斯·贝洛利', 'en-US': 'Raphinha', 'ms-MY': 'Raphinha' },
position: 'FW',
country: 'BRA',
},
'拉明·亚马尔-前锋-西班牙': {
name: { 'zh-CN': '拉明·亚马尔', 'en-US': 'Lamine Yamal', 'ms-MY': 'Lamine Yamal' },
position: 'FW',
country: 'ESP',
},
'朱利安·阿尔瓦雷斯-前锋-阿根廷': {
name: { 'zh-CN': '朱利安·阿尔瓦雷斯', 'en-US': 'Julián Álvarez', 'ms-MY': 'Julián Álvarez' },
position: 'FW',
country: 'ARG',
},
'梅西-前锋-阿根廷': {
name: { 'zh-CN': '梅西', 'en-US': 'Lionel Messi', 'ms-MY': 'Lionel Messi' },
position: 'FW',
country: 'ARG',
},
'迈克尔·奥利塞-前锋-法国': {
name: { 'zh-CN': '迈克尔·奥利塞', 'en-US': 'Michael Olise', 'ms-MY': 'Michael Olise' },
position: 'FW',
country: 'FRA',
},
'穆罕默德·萨拉赫-前锋-埃及': {
name: { 'zh-CN': '穆罕默德·萨拉赫', 'en-US': 'Mohamed Salah', 'ms-MY': 'Mohamed Salah' },
position: 'FW',
country: 'EGY',
},
'维尼修斯·儒尼奥尔-前锋-巴西': {
name: { 'zh-CN': '维尼修斯·儒尼奥尔', 'en-US': 'Vinícius Júnior', 'ms-MY': 'Vinícius Júnior' },
position: 'FW',
country: 'BRA',
},
'维克托·哲凯赖什-前锋-瑞典': {
name: { 'zh-CN': '维克托·哲凯赖什', 'en-US': 'Viktor Gyökeres', 'ms-MY': 'Viktor Gyökeres' },
position: 'FW',
country: 'SWE',
},
'圣地亚哥·吉梅内斯-前锋-墨西哥': {
name: { 'zh-CN': '圣地亚哥·吉梅内斯', 'en-US': 'Santiago Giménez', 'ms-MY': 'Santiago Giménez' },
position: 'FW',
country: 'MEX',
},
'埃德森·阿尔瓦雷斯-后卫-墨西哥': {
name: { 'zh-CN': '埃德森·阿尔瓦雷斯', 'en-US': 'Edson Álvarez', 'ms-MY': 'Edson Álvarez' },
position: 'DF',
country: 'MEX',
},
'埃贝雷奇·埃泽-中场-英格兰': {
name: { 'zh-CN': '埃贝雷奇·埃泽', 'en-US': 'Eberechi Eze', 'ms-MY': 'Eberechi Eze' },
position: 'MF',
country: 'ENG',
},
'埃尔林·哈兰德-前锋-挪威': {
name: { 'zh-CN': '埃尔林·哈兰德', 'en-US': 'Erling Haaland', 'ms-MY': 'Erling Haaland' },
position: 'FW',
country: 'NOR',
},
'蒂博·库尔图瓦-守門員-比利时': {
name: { 'zh-CN': '蒂博·库尔图瓦', 'en-US': 'Thibaut Courtois', 'ms-MY': 'Thibaut Courtois' },
position: 'GK',
country: 'BEL',
},
'曼努埃尔·诺伊尔-守門員-德国': {
name: { 'zh-CN': '曼努埃尔·诺伊尔', 'en-US': 'Manuel Neuer', 'ms-MY': 'Manuel Neuer' },
position: 'GK',
country: 'GER',
},
'祖德·贝林厄姆-中场-英格兰': {
name: { 'zh-CN': '祖德·贝林厄姆', 'en-US': 'Jude Bellingham', 'ms-MY': 'Jude Bellingham' },
position: 'MF',
country: 'ENG',
},
'伦纳特·卡尔-中场-德国': {
name: { 'zh-CN': '伦纳特·卡尔', 'en-US': 'Lennart Karl', 'ms-MY': 'Lennart Karl' },
position: 'MF',
country: 'GER',
},
'费德里科·巴尔韦德-中场-乌拉圭': {
name: { 'zh-CN': '费德里科·巴尔韦德', 'en-US': 'Federico Valverde', 'ms-MY': 'Federico Valverde' },
position: 'MF',
country: 'URU',
},
'贾马尔·慕斯拉-中场-德国': {
name: { 'zh-CN': '贾马尔·慕斯拉', 'en-US': 'Jamal Musiala', 'ms-MY': 'Jamal Musiala' },
position: 'MF',
country: 'GER',
},
'路易斯·迪亚斯-前锋-哥伦比亚': {
name: { 'zh-CN': '路易斯·迪亚斯', 'en-US': 'Luis Díaz', 'ms-MY': 'Luis Díaz' },
position: 'FW',
country: 'COL',
},
'阿什拉夫·哈基米-后卫-摩洛哥': {
name: { 'zh-CN': '阿什拉夫·哈基米', 'en-US': 'Achraf Hakimi', 'ms-MY': 'Achraf Hakimi' },
position: 'DF',
country: 'MAR',
},
'阿利松·贝克尔-守門員-巴西': {
name: { 'zh-CN': '阿利松·贝克尔', 'en-US': 'Alisson Becker', 'ms-MY': 'Alisson Becker' },
position: 'GK',
country: 'BRA',
},
'阿尔达·居莱尔-前锋-土耳其': {
name: { 'zh-CN': '阿尔达·居莱尔', 'en-US': 'Arda Güler', 'ms-MY': 'Arda Güler' },
position: 'FW',
country: 'TUR',
},
'马西斯·拉扬·切尔基-中场-法国': {
name: { 'zh-CN': '马西斯·拉扬·切尔基', 'en-US': 'Rayan Cherki', 'ms-MY': 'Rayan Cherki' },
position: 'MF',
country: 'FRA',
},
'马库斯·拉什福德-前锋-英格兰': {
name: { 'zh-CN': '马库斯·拉什福德', 'en-US': 'Marcus Rashford', 'ms-MY': 'Marcus Rashford' },
position: 'FW',
country: 'ENG',
},
'哈里·凯恩-前锋-英格兰': {
name: { 'zh-CN': '哈里·凯恩', 'en-US': 'Harry Kane', 'ms-MY': 'Harry Kane' },
position: 'FW',
country: 'ENG',
},
'尼科·威廉斯-前锋-西班牙': {
name: { 'zh-CN': '尼科·威廉斯', 'en-US': 'Nico Williams', 'ms-MY': 'Nico Williams' },
position: 'FW',
country: 'ESP',
},
'巴勃罗·加维-中场-西班牙': {
name: { 'zh-CN': '巴勃罗·加维', 'en-US': 'Pablo Gavi', 'ms-MY': 'Pablo Gavi' },
position: 'MF',
country: 'ESP',
},
'吉列尔莫·奥乔亚-守門員-墨西哥': {
name: { 'zh-CN': '吉列尔莫·奥乔亚', 'en-US': 'Guillermo Ochoa', 'ms-MY': 'Guillermo Ochoa' },
position: 'GK',
country: 'MEX',
},
};
function mapPositionFromZh(position) {
if (position.includes('守') || position.includes('门') || position.includes('門'))
return 'GK';
if (position.includes('后') || position.includes('後'))
return 'DF';
if (position.includes('中'))
return 'MF';
return 'FW';
}
export function getPlayerLocaleMeta(player) {
const meta = PLAYER_LOCALE_META[player.id];
if (meta)
return meta;
return {
name: { 'zh-CN': player.name },
position: mapPositionFromZh(player.position),
country: '',
};
}
export function getPlayerDisplayName(player, locale) {
const meta = getPlayerLocaleMeta(player);
return resolveTranslationFallback(meta.name, locale) || player.name;
}
export function getPlayerPositionLabel(player, locale) {
const meta = getPlayerLocaleMeta(player);
const labels = PLAYER_POSITION_LABELS[meta.position];
return resolveTranslationFallback(labels, locale) || player.position;
}
export function getPlayerCountryLabel(player, locale) {
const meta = getPlayerLocaleMeta(player);
if (!meta.country)
return player.country;
const labels = PLAYER_COUNTRY_LABELS[meta.country];
return resolveTranslationFallback(labels ?? {}, locale) || player.country;
}
export function getPlayerSearchTokens(player) {
const meta = getPlayerLocaleMeta(player);
const tokens = new Set();
for (const value of Object.values(meta.name)) {
if (value)
tokens.add(value.toLowerCase());
}
for (const loc of ['zh-CN', 'en-US', 'ms-MY']) {
tokens.add(getPlayerPositionLabel(player, loc).toLowerCase());
tokens.add(getPlayerCountryLabel(player, loc).toLowerCase());
}
tokens.add(player.name.toLowerCase());
tokens.add(player.position.toLowerCase());
tokens.add(player.country.toLowerCase());
return [...tokens];
}
export function formatPlayerMeta(player, locale) {
return `${getPlayerPositionLabel(player, locale)} · ${getPlayerCountryLabel(player, locale)}`;
}