/* ucparts.jsx — 穿山甲 Web 用户中心 · atoms + i18n */
const UCLUCIDE = {
'layout-dashboard':'',
link:'',
ticket:'',
users:'',
copy:'',
'refresh-cw':'',
'qr-code':'',
download:'',
check:'',
'check-circle':'',
zap:'',
clock:'',
'shield-check':'',
crown:'',
'credit-card':'',
send:'',
'message-circle':'',
mail:'',
'shopping-bag':'',
'log-out':'',
'external-link':'',
gift:'',
smartphone:'',
lock:'',
'chevron-right':'',
'arrow-down':'',
};
function UCIcon({ name, size=18, stroke=2, color='currentColor', style={} }) {
return ;
}
function UCMark({ size=30, color='var(--accent)' }) {
return (
);
}
const UCSTRINGS = {
navOverview:{zh:'概览',en:'Overview'}, navSub:{zh:'订阅',en:'Subscription'}, navRedeem:{zh:'兑换 & 购买',en:'Redeem & buy'}, navInvite:{zh:'邀请返利',en:'Referral'},
signOut:{zh:'退出',en:'Sign out'},
/* login */
loginTitle:{zh:'登录用户中心',en:'Log in to your account'}, loginSub:{zh:'管理订阅、兑换激活码、查看用量',en:'Manage subscription, redeem codes, track usage'},
emailLabel:{zh:'邮箱',en:'Email'}, emailPh:{zh:'你的邮箱地址',en:'your@email.com'},
pwLabel:{zh:'密码',en:'Password'}, pwPh:{zh:'输入密码',en:'Enter password'},
doLogin:{zh:'登录',en:'Log in'}, forgotPw:{zh:'忘记密码?',en:'Forgot password?'},
noAccount:{zh:'没有账户?在 App 内注册',en:'No account? Sign up in the app'},
/* overview */
greeting:{zh:'欢迎回来',en:'Welcome back'},
curPlan:{zh:'当前套餐',en:'Current plan'}, freePlan:{zh:'免费版',en:'Free'}, proMember:{zh:'PRO 会员',en:'PRO member'},
expires:{zh:'有效期至',en:'Expires'}, renew:{zh:'续费 / 升级',en:'Renew / Upgrade'},
quotaToday:{zh:'今日剩余时长',en:'Time left today'}, dataToday:{zh:'今日已用流量',en:'Data used today'}, devices:{zh:'在线设备',en:'Devices online'},
quotaFree:{zh:'免费版 · 每日 10 分钟',en:'Free · 10 min/day'},
usageTitle:{zh:'近 7 日流量 (GB)',en:'Last 7 days (GB)'},
quickSub:{zh:'快速操作',en:'Quick actions'},
qaSub:{zh:'获取订阅链接',en:'Get subscription'}, qaRedeem:{zh:'兑换激活码',en:'Redeem a code'}, qaApp:{zh:'下载 App',en:'Download apps'},
/* subscription */
subTitle:{zh:'我的订阅',en:'My subscription'},
subDesc:{zh:'订阅链接是你的专属凭证,泄露后他人可使用你的额度。请勿分享。',en:'Your subscription link is a private credential. Never share it.'},
subCopy:{zh:'复制链接',en:'Copy link'}, subCopied:{zh:'已复制',en:'Copied'},
subReset:{zh:'重置链接',en:'Reset link'}, subResetSub:{zh:'旧链接立即失效,所有设备需重新导入',en:'Old link stops working; re-import on all devices'},
subResetOk:{zh:'已重置,请重新导入',en:'Reset — re-import on your devices'},
scanTitle:{zh:'扫码导入',en:'Scan to import'}, scanSub:{zh:'用穿山甲 App 或三方客户端扫码',en:'Scan with the Pangolin app or a 3rd-party client'},
importTitle:{zh:'一键导入三方客户端',en:'One-tap import'},
importSub:{zh:'已安装对应客户端时,点击即自动导入订阅。',en:'If the client is installed, tapping imports the subscription automatically.'},
fmtNote:{zh:'同一链接同时兼容 sing-box / Clash.Meta / v2ray 格式。',en:'One link serves sing-box / Clash.Meta / v2ray formats.'},
/* redeem */
redeemTitle:{zh:'兑换激活码',en:'Redeem a code'}, redeemPh:{zh:'输入激活码',en:'Enter activation code'}, redeemBtn:{zh:'激活',en:'Redeem'},
redeemOk:{zh:'激活成功 · 套餐已到账',en:'Activated — plan applied'},
buyTitle:{zh:'购买渠道',en:'Where to buy'},
buySub:{zh:'本站不直接收款。通过以下渠道购买激活码,回到本页兑换即可:',en:'We never take payment on this site. Buy a code via a channel below, then redeem here:'},
chStore:{zh:'自助发卡商店',en:'Self-serve store'}, chStoreSub:{zh:'支付宝 / 微信 · 自动发码',en:'Alipay / WeChat · instant code'},
chUsdtSub:{zh:'链上转账 · 最隐私 · 自动发码',en:'On-chain · most private · instant code'},
chEmail:{zh:'邮箱客服',en:'Email support'},
/* invite */
inviteTitle:{zh:'邀请返利',en:'Referral'},
inviteSub:{zh:'好友通过你的链接注册并付费,你获得其首单 20% 余额返利,可抵扣续费。',en:'When a friend signs up and pays via your link, you earn 20% of their first order as credit.'},
inviteLink:{zh:'我的邀请链接',en:'My invite link'},
invited:{zh:'已邀请',en:'Invited'}, paidUsers:{zh:'已付费',en:'Converted'}, earned:{zh:'累计返利',en:'Credit earned'},
inviteRecord:{zh:'邀请记录',en:'History'}, recEmpty:{zh:'暂无邀请记录',en:'No referrals yet'},
recRegistered:{zh:'已注册',en:'Registered'}, recPaid:{zh:'已付费',en:'Paid'},
/* 2FA */
twoFATitle:{zh:'双重认证',en:'Two-factor auth'},
twoFAHint:{zh:'你的账户已开启双重认证。请输入身份验证器 App 中的 6 位动态码。',en:'Two-factor auth is on for this account. Enter the 6-digit code from your authenticator app.'},
twoFAConfirm:{zh:'验证并登录',en:'Verify & log in'},
twoFABack:{zh:'返回上一步',en:'Back'},
};
function ucT(lang){ return k => { const v=UCSTRINGS[k]; return v?(v[lang]||k):k; }; }
Object.assign(window, { UCIcon, UCMark, UCSTRINGS, ucT });