codex-proxy / shared /i18n /translations.ts
icebear0828
fix: update checker shows correct status + version display + dark mode fixes
3cf831b
raw
history blame
9.8 kB
export const translations = {
en: {
serverOnline: "Server Online",
addAccount: "Add Account",
toggleTheme: "Toggle theme",
connectedAccounts: "Connected Accounts",
connectedAccountsDesc:
"Manage your AI model proxy services and usage limits.",
loadingAccounts: "Loading accounts...",
noAccounts: 'No accounts connected. Click "Add Account" to get started.',
deleteAccount: "Delete account",
removeConfirm: "Remove this account?",
accountAdded: "Account added successfully!",
active: "Active",
expired: "Expired",
rateLimited: "Rate Limited",
refreshing: "Refreshing",
disabled: "Disabled",
freeTier: "Free Tier",
totalRequests: "Total Requests",
tokensUsed: "Tokens Used",
windowRequests: "Requests (Window)",
windowTokens: "Tokens (Window)",
totalAll: "Total",
windowLabel: "window",
rateLimit: "Rate Limit",
limitReached: "Limit Reached",
used: "Used",
ok: "OK",
resetsAt: "Resets at",
apiConfig: "API Configuration",
baseProxyUrl: "Base Proxy URL",
defaultModel: "Default Model",
yourApiKey: "Your API Key",
apiKeyHint:
"Use this key to authenticate requests to the proxy. Do not share it.",
copyUrl: "Copy URL",
copyApiKey: "Copy API Key",
anthropicSetup: "Anthropic SDK Setup",
anthropicCopyAllHint: "Copy all env vars \u2014 paste into terminal or .env file",
integrationExamples: "Integration Examples",
copy: "Copy",
addStep1:
'Complete the login in the popup window (if blocked, right-click "Add Account" and open the link in a new tab).',
addStep2:
'After login, the browser will redirect to a <code class="text-xs bg-slate-100 dark:bg-bg-dark px-1.5 py-0.5 rounded">localhost:1455/auth/callback?...</code> page (it may show "unable to connect" \u2014 that\'s normal).',
addStep3:
'Copy the <strong class="text-slate-700 dark:text-text-main">full URL</strong> from the address bar and paste it below.',
pasteCallback: "Paste callback URL here",
submit: "Submit",
submitting: "Submitting...",
pleasePassCallback: "Please paste the callback URL",
failedStartLogin: "Failed to start login",
failedExchangeCode: "Failed to exchange code",
failedDeleteAccount: "Failed to delete account.",
networkError: "Network error: ",
copied: "Copied!",
copyFailed: "Failed",
refresh: "Refresh",
updatedAt: "Updated at",
footer: "\u00a9 2025 Codex Proxy. All rights reserved.",
starOnGithub: "Star",
checkForUpdates: "Check for Updates",
checkingUpdates: "Checking...",
upToDate: "Up to date",
updateApplied: "Update complete, please restart server",
fingerprintUpdated: "Fingerprint updated",
fingerprintUpdating: "Updating fingerprint...",
proxyUpdating: "Updating proxy...",
proxyBehind: "behind",
dockerUpdateHint: "Run: docker compose up -d --build",
managedByDesktop: "Managed by desktop app",
lastChecked: "Last checked",
never: "never",
commits: "commits",
proxyPool: "Proxy Pool",
proxyPoolDesc: "Manage upstream proxies for different accounts.",
addProxy: "Add Proxy",
proxyName: "Name",
proxyUrl: "Proxy URL",
proxyProtocol: "Protocol",
proxyHost: "Host",
proxyPort: "Port",
proxyUsername: "Username",
proxyPassword: "Password",
proxyOptional: "optional",
noProxies: "No proxies configured. Add one to route accounts through different IPs.",
proxyActive: "Active",
proxyUnreachable: "Unreachable",
proxyDisabled: "Disabled",
exitIp: "Exit IP",
latency: "Latency",
checkHealth: "Check",
checkAllHealth: "Check All",
enableProxy: "Enable",
disableProxy: "Disable",
deleteProxy: "Delete proxy",
removeProxyConfirm: "Remove this proxy?",
proxyAssignment: "Proxy",
globalDefault: "Global Default",
directNoProxy: "Direct (No Proxy)",
autoRoundRobin: "Auto (Round-Robin)",
healthInterval: "Health check interval",
minutes: "min",
},
zh: {
serverOnline: "\u670d\u52a1\u8fd0\u884c\u4e2d",
addAccount: "\u6dfb\u52a0\u8d26\u6237",
toggleTheme: "\u5207\u6362\u4e3b\u9898",
connectedAccounts: "\u5df2\u8fde\u63a5\u8d26\u6237",
connectedAccountsDesc:
"\u7ba1\u7406\u4f60\u7684 AI \u6a21\u578b\u4ee3\u7406\u670d\u52a1\u548c\u7528\u91cf\u9650\u5236\u3002",
loadingAccounts: "\u6b63\u5728\u52a0\u8f7d\u8d26\u6237...",
noAccounts:
"\u6682\u65e0\u5df2\u8fde\u63a5\u7684\u8d26\u6237\u3002\u70b9\u51fb\u300c\u6dfb\u52a0\u8d26\u6237\u300d\u5f00\u59cb\u4f7f\u7528\u3002",
deleteAccount: "\u5220\u9664\u8d26\u6237",
removeConfirm:
"\u786e\u5b9a\u8981\u79fb\u9664\u6b64\u8d26\u6237\u5417\uff1f",
accountAdded: "\u8d26\u6237\u6dfb\u52a0\u6210\u529f\uff01",
active: "\u6d3b\u8dc3",
expired: "\u5df2\u8fc7\u671f",
rateLimited: "\u5df2\u9650\u901f",
refreshing: "\u5237\u65b0\u4e2d",
disabled: "\u5df2\u7981\u7528",
freeTier: "\u514d\u8d39\u7248",
totalRequests: "\u603b\u8bf7\u6c42\u6570",
tokensUsed: "Token \u7528\u91cf",
windowRequests: "\u8bf7\u6c42\u6570\uff08\u7a97\u53e3\uff09",
windowTokens: "Token\uff08\u7a97\u53e3\uff09",
totalAll: "\u7d2f\u8ba1",
windowLabel: "\u7a97\u53e3",
rateLimit: "\u901f\u7387\u9650\u5236",
limitReached: "\u5df2\u8fbe\u4e0a\u9650",
used: "\u5df2\u4f7f\u7528",
ok: "\u6b63\u5e38",
resetsAt: "\u91cd\u7f6e\u65f6\u95f4",
apiConfig: "API \u914d\u7f6e",
baseProxyUrl: "\u4ee3\u7406 URL",
defaultModel: "\u9ed8\u8ba4\u6a21\u578b",
yourApiKey: "API \u5bc6\u94a5",
apiKeyHint:
"\u4f7f\u7528\u6b64\u5bc6\u94a5\u5411\u4ee3\u7406\u53d1\u9001\u8ba4\u8bc1\u8bf7\u6c42\uff0c\u8bf7\u52ff\u6cc4\u9732\u3002",
copyUrl: "\u590d\u5236 URL",
copyApiKey: "\u590d\u5236 API \u5bc6\u94a5",
anthropicSetup: "Anthropic SDK \u914d\u7f6e",
anthropicCopyAllHint: "\u590d\u5236\u6240\u6709\u73af\u5883\u53d8\u91cf \u2014 \u7c98\u8d34\u5230\u7ec8\u7aef\u6216 .env \u6587\u4ef6",
integrationExamples: "\u96c6\u6210\u793a\u4f8b",
copy: "\u590d\u5236",
addStep1:
"\u5728\u5f39\u51fa\u7684\u7a97\u53e3\u4e2d\u5b8c\u6210\u767b\u5f55\uff08\u5982\u5f39\u7a97\u88ab\u62e6\u622a\uff0c\u53f3\u952e\u300c\u6dfb\u52a0\u8d26\u6237\u300d\u6309\u94ae\u5728\u65b0\u6807\u7b7e\u9875\u6253\u5f00\u94fe\u63a5\uff09\u3002",
addStep2:
'\u767b\u5f55\u6210\u529f\u540e\uff0c\u6d4f\u89c8\u5668\u4f1a\u8df3\u8f6c\u5230 <code class="text-xs bg-slate-100 dark:bg-bg-dark px-1.5 py-0.5 rounded">localhost:1455/auth/callback?...</code> \u9875\u9762\uff08\u53ef\u80fd\u663e\u793a\u201c\u65e0\u6cd5\u8bbf\u95ee\u201d\u2014\u2014\u8fd9\u662f\u6b63\u5e38\u7684\uff09\u3002',
addStep3:
'\u590d\u5236\u5730\u5740\u680f\u4e2d\u7684<strong class="text-slate-700 dark:text-text-main">\u5b8c\u6574 URL</strong>\uff0c\u7c98\u8d34\u5230\u4e0b\u65b9\u8f93\u5165\u6846\u3002',
pasteCallback: "\u7c98\u8d34\u56de\u8c03 URL",
submit: "\u63d0\u4ea4",
submitting: "\u63d0\u4ea4\u4e2d...",
pleasePassCallback: "\u8bf7\u7c98\u8d34\u56de\u8c03 URL",
failedStartLogin: "\u767b\u5f55\u542f\u52a8\u5931\u8d25",
failedExchangeCode: "\u6388\u6743\u7801\u4ea4\u6362\u5931\u8d25",
failedDeleteAccount: "\u5220\u9664\u8d26\u6237\u5931\u8d25\u3002",
networkError: "\u7f51\u7edc\u9519\u8bef\uff1a",
copied: "\u5df2\u590d\u5236\uff01",
copyFailed: "\u5931\u8d25",
refresh: "\u5237\u65b0",
updatedAt: "\u66f4\u65b0\u4e8e",
footer:
"\u00a9 2025 Codex Proxy\u3002\u4fdd\u7559\u6240\u6709\u6743\u5229\u3002",
starOnGithub: "\u6536\u85cf",
checkForUpdates: "\u68c0\u67e5\u66f4\u65b0",
checkingUpdates: "\u68c0\u67e5\u4e2d...",
upToDate: "\u5df2\u662f\u6700\u65b0",
updateApplied: "\u66f4\u65b0\u5b8c\u6210\uff0c\u8bf7\u91cd\u542f\u670d\u52a1",
fingerprintUpdated: "\u6307\u7eb9\u5df2\u66f4\u65b0",
fingerprintUpdating: "\u6307\u7eb9\u66f4\u65b0\u4e2d...",
proxyUpdating: "\u6b63\u5728\u66f4\u65b0\u4ee3\u7406...",
proxyBehind: "\u843d\u540e",
dockerUpdateHint: "\u8bf7\u6267\u884c: docker compose up -d --build",
managedByDesktop: "\u7531\u684c\u9762\u5e94\u7528\u7ba1\u7406",
lastChecked: "\u4e0a\u6b21\u68c0\u67e5",
never: "\u4ece\u672a",
commits: "\u4e2a\u63d0\u4ea4",
proxyPool: "\u4ee3\u7406\u6c60",
proxyPoolDesc: "\u7ba1\u7406\u4e0d\u540c\u8d26\u53f7\u7684\u4e0a\u6e38\u4ee3\u7406\u3002",
addProxy: "\u6dfb\u52a0\u4ee3\u7406",
proxyName: "\u540d\u79f0",
proxyUrl: "\u4ee3\u7406 URL",
proxyProtocol: "\u534f\u8bae",
proxyHost: "\u4e3b\u673a",
proxyPort: "\u7aef\u53e3",
proxyUsername: "\u7528\u6237\u540d",
proxyPassword: "\u5bc6\u7801",
proxyOptional: "\u53ef\u9009",
noProxies: "\u672a\u914d\u7f6e\u4ee3\u7406\u3002\u6dfb\u52a0\u4e00\u4e2a\u4ee5\u901a\u8fc7\u4e0d\u540c IP \u8def\u7531\u8d26\u53f7\u3002",
proxyActive: "\u6d3b\u8dc3",
proxyUnreachable: "\u4e0d\u53ef\u8fbe",
proxyDisabled: "\u5df2\u7981\u7528",
exitIp: "\u51fa\u53e3 IP",
latency: "\u5ef6\u8fdf",
checkHealth: "\u68c0\u67e5",
checkAllHealth: "\u68c0\u67e5\u5168\u90e8",
enableProxy: "\u542f\u7528",
disableProxy: "\u7981\u7528",
deleteProxy: "\u5220\u9664\u4ee3\u7406",
removeProxyConfirm: "\u786e\u5b9a\u8981\u79fb\u9664\u6b64\u4ee3\u7406\u5417\uff1f",
proxyAssignment: "\u4ee3\u7406",
globalDefault: "\u5168\u5c40\u9ed8\u8ba4",
directNoProxy: "\u76f4\u8fde\uff08\u65e0\u4ee3\u7406\uff09",
autoRoundRobin: "\u81ea\u52a8\u8f6e\u8f6c",
healthInterval: "\u5065\u5eb7\u68c0\u67e5\u95f4\u9694",
minutes: "\u5206\u949f",
},
} as const;
export type LangCode = keyof typeof translations;
export type TranslationKey = keyof (typeof translations)["en"];