- 新增 StepFun Plan 套餐预设 - 供应商编辑页 API Key 下方添加获取 Key 链接(支持推广链接) - 修复链接无法打开浏览器的问题(Rust open_external_url) - 无推广链接时回退打开官网 - 必填字段(供应商名称/API Key/请求地址)添加红色 * 标注 - 用户自定义预设方案文档
393 lines
13 KiB
TypeScript
393 lines
13 KiB
TypeScript
import type { TranslationKey } from "./zh";
|
||
|
||
export const enTranslations: Record<TranslationKey, string> = {
|
||
// App / global
|
||
appTitle: "Kimi Switch",
|
||
loading: "Loading...",
|
||
loadTimeout: "Loading is taking a while. Try restarting the app if it stays stuck.",
|
||
loadFailed: "Failed to load:",
|
||
retry: "Retry",
|
||
saveConfig: "Save Config",
|
||
reloadConfig: "Reload Config",
|
||
openConfigDir: "Open Config Dir",
|
||
unsavedConfirm: "You have unsaved changes. Are you sure you want to reload?",
|
||
validationNoApiKey: "Missing API key",
|
||
validationNoBaseUrl: "Missing base URL",
|
||
validationNoModels: "No models configured",
|
||
validationBlankModels: "Model entries with empty model id: {aliases}",
|
||
saveValidationConfirm:
|
||
"The following providers are not fully configured. Save anyway?\n\n{details}\n\n(Click OK to save to config.toml as-is; click Cancel to keep editing.)",
|
||
providerNotFound: "Provider not found",
|
||
backToList: "Back to list",
|
||
syncToOmp: "Sync to OMP",
|
||
syncedToOmp: "Synced to OMP: ",
|
||
ompOverwriteConfirm: "OMP already has provider \"{existing}\". Replace with \"{name}\"?",
|
||
deleteProviderConfirm: "Delete provider {name}?",
|
||
|
||
// Provider list
|
||
providers: "Providers",
|
||
dashboard: "Dashboard",
|
||
sessions: "Sessions",
|
||
addProvider: "Add Provider",
|
||
noProviders: "No providers yet",
|
||
addFirstProvider: "Add first provider",
|
||
noUrl: "No URL",
|
||
modelCount: "{count} models",
|
||
ompActive: "OMP Active",
|
||
defaultModel: "Default: {name}",
|
||
edit: "Edit",
|
||
delete: "Delete",
|
||
copyProvider: "Duplicate provider",
|
||
testConnectivity: "Test connectivity",
|
||
testing: "Testing...",
|
||
connectivityOk: "{name} reachable ({latency}ms)",
|
||
connectivitySlow: "{name} reachable but slow ({latency}ms)",
|
||
connectivityFail: "{name} unreachable: {error}",
|
||
copiedProvider: "Duplicated as {name}",
|
||
|
||
// Provider edit
|
||
editProvider: "Edit Provider",
|
||
back: "Back",
|
||
basicInfo: "Basic Info",
|
||
modelMapping: "Model Mapping",
|
||
configJson: "Config JSON",
|
||
providerName: "Provider Name",
|
||
note: "Note",
|
||
notePlaceholder: "e.g. company account",
|
||
officialUrl: "Official URL",
|
||
managedProvider: "Managed provider (no credentials needed)",
|
||
apiSettings: "API Settings",
|
||
apiFormat: "API Format",
|
||
authField: "Auth Field",
|
||
apiKey: "API Key",
|
||
getApiKeyLink: "Get API Key",
|
||
show: "Show",
|
||
hide: "Hide",
|
||
requestUrl: "Request URL",
|
||
fullUrl: "Full URL",
|
||
baseUrlHint: "Enter a {type} API-compatible endpoint without a trailing slash.",
|
||
envPairs: "Env pairs",
|
||
addEnv: "+ Add",
|
||
modelMappingDesc: "Display name only affects the /model menu; 1M declares context capability for Kimi Code.",
|
||
oneClickSetup: "One-click setup",
|
||
fetchModels: "Fetch models",
|
||
fetchingModels: "Fetching...",
|
||
discoveredModels: "Discovered {count} models",
|
||
addSelected: "Add selected",
|
||
alreadyAdded: "Added",
|
||
displayName: "Display name",
|
||
actualModel: "Actual model",
|
||
contextSize: "Context size",
|
||
supports1M: "Supports 1M",
|
||
default: "Default",
|
||
operation: "Operation",
|
||
isDefault: "Default",
|
||
setDefault: "Set default",
|
||
deleteModelConfirm: "Delete model {alias}?",
|
||
noModelMappings: "No model mappings",
|
||
addModelMapping: "+ Add model mapping",
|
||
readOnlyPreview: "Editable JSON",
|
||
apply: "Apply",
|
||
invalidJson: "Invalid JSON: {message}",
|
||
clickToSelectIcon: "Click to select icon",
|
||
clickToChangeIcon: "Click to change icon",
|
||
selectIcon: "Select icon",
|
||
clearIcon: "Clear icon",
|
||
iconPickerSearch: "Search icons",
|
||
iconPickerSearchPlaceholder: "Type an icon name...",
|
||
iconPickerNoResults: "No matching icons found",
|
||
|
||
// Agent / target
|
||
target: "Target",
|
||
targetKimi: "Kimi Code",
|
||
targetOmp: "OMP",
|
||
targetQwen: "Qwen Code",
|
||
agent: "Agent",
|
||
agentKimiCode: "Kimi Code",
|
||
agentPi: "Pi",
|
||
activate: "Activate",
|
||
activated: "Activated",
|
||
disabled: "Disabled",
|
||
switchTo: "Switch to",
|
||
inUse: "In use",
|
||
switchReloadHint: "After switching providers, run /reload in Kimi Code to apply the change.",
|
||
reloadCopiedHint: "Provider switched. /reload copied to clipboard; paste it in Kimi Code.",
|
||
unsavedChanges: "Unsaved changes",
|
||
qwenActivateNotImplemented: "Qwen Code activation will be implemented in a follow-up.",
|
||
agentSettings: "Global Settings",
|
||
enableThinking: "Enable thinking",
|
||
thinkingLevel: "Thinking level",
|
||
thinkingKeep: "Keep thinking content",
|
||
thinkingLow: "Low",
|
||
thinkingMedium: "Medium",
|
||
thinkingHigh: "High",
|
||
thinkingMax: "Max",
|
||
thinkingContextHint: "Thinking uses more context. Ensure the model context length and reserved size are sufficient.",
|
||
loopControlSettings: "Loop Control",
|
||
maxRetriesPerStep: "Max retries per step",
|
||
reservedContextSize: "Reserved context size",
|
||
backgroundSettings: "Background Tasks",
|
||
maxRunningTasks: "Max running tasks",
|
||
keepAliveOnExit: "Keep alive on exit",
|
||
permissionRules: "Permission Rules",
|
||
permissionDecision: "Decision",
|
||
permissionPattern: "Pattern",
|
||
permissionAllow: "Allow",
|
||
permissionDeny: "Deny",
|
||
permissionAsk: "Ask",
|
||
addRule: "+ Add rule",
|
||
addCommonRules: "Add common rules",
|
||
hooks: "Lifecycle Hooks",
|
||
hookEvent: "Event",
|
||
hookMatcher: "Matcher",
|
||
hookCommand: "Command",
|
||
hookTimeout: "Timeout",
|
||
addHook: "+ Add hook",
|
||
importConfig: "Import current config",
|
||
importConfigConfirm: "Importing will overwrite unsaved changes. Continue?",
|
||
importConfigFailed: "Import failed: {message}",
|
||
capabilities: "Capabilities",
|
||
fetchEnableThinking: "Enable thinking for fetched models",
|
||
capThinking: "Thinking",
|
||
capAlwaysThinking: "Always Thinking",
|
||
capImageIn: "Image Input",
|
||
capVideoIn: "Video Input",
|
||
capToolUse: "Tool Use",
|
||
customCapabilities: "Other capabilities (comma-separated)",
|
||
|
||
// Sessions
|
||
sessionsTitle: "Sessions",
|
||
sessionsSubtitle:
|
||
"Browse, preview, archive, or delete Kimi Code sessions by workspace. Archiving keeps data on disk.",
|
||
workspaces: "Workspaces",
|
||
workspaceIsolatedHint: "Sessions are isolated per workspace",
|
||
allWorkspaces: "All workspaces",
|
||
emptyWorkspace: "Empty",
|
||
deleteWorkspace: "Delete workspace",
|
||
noSessions: "No sessions",
|
||
statusActive: "Active",
|
||
statusArchived: "Archived",
|
||
statusAll: "All",
|
||
selectAll: "Select all",
|
||
deselectAll: "Deselect all",
|
||
selectedCount: "{n} selected",
|
||
archive: "Archive",
|
||
unarchive: "Unarchive",
|
||
sessionTitle: "Session",
|
||
workspace: "Workspace",
|
||
status: "Status",
|
||
size: "Size",
|
||
updated: "Updated",
|
||
actions: "Actions",
|
||
sessionsInView: "{n} sessions",
|
||
isolatedToWorkspace: "this workspace only",
|
||
openPreview: "Open preview",
|
||
scanning: "Scanning…",
|
||
refresh: "Refresh",
|
||
refreshing: "Refreshing…",
|
||
refreshed: "Refreshed",
|
||
cancel: "Cancel",
|
||
confirmDeleteTitle: "Delete session forever?",
|
||
confirmDeleteSession:
|
||
"This cannot be undone. Prefer archive if you only want it out of the way.",
|
||
confirmBulkTitle: "Delete selected forever?",
|
||
confirmBulkDelete: "Permanently delete {n} sessions. This cannot be undone.",
|
||
confirmDeleteWorkspaceTitle: "Delete empty workspace?",
|
||
confirmDeleteWorkspace: "Only workspaces with no sessions can be removed.",
|
||
deleteForever: "Delete forever",
|
||
previewTitle: "Session preview",
|
||
previewHint:
|
||
"Roles and truncated text only — secrets and raw tool dumps are omitted.",
|
||
previewEmpty: "No previewable messages",
|
||
previewTruncated: "Preview truncated",
|
||
roleUser: "User",
|
||
roleAssistant: "Assistant",
|
||
roleSystem: "System",
|
||
|
||
// Heatmap
|
||
noData: "No data",
|
||
heatLess: "Less",
|
||
heatMore: "More",
|
||
requests: "Requests",
|
||
cacheHitRate: "Cache hit rate",
|
||
|
||
// Daily detail modal
|
||
dayDetail: "Daily usage detail",
|
||
close: "Close",
|
||
totalTokens: "Total tokens",
|
||
cost: "Cost",
|
||
modelDistribution: "Model distribution",
|
||
providerDistribution: "Provider distribution",
|
||
modalEscHint: "Press Esc or click outside to close",
|
||
doubleClickHint: "Double-click for details",
|
||
|
||
// Languages
|
||
language: "Language",
|
||
zh: "中文",
|
||
en: "English",
|
||
|
||
// Theme & Settings
|
||
themeLight: "Light",
|
||
themeDark: "Dark",
|
||
themeAuto: "Auto",
|
||
settings: "Settings",
|
||
settingsTitle: "Settings",
|
||
settingsAppearance: "Appearance",
|
||
settingsUpdates: "Updates",
|
||
settingsAbout: "About",
|
||
checkUpdate: "Check for updates",
|
||
checking: "Checking…",
|
||
upToDate: "You're up to date",
|
||
updateAvailable: "Update available",
|
||
currentVersion: "Current version",
|
||
latestVersion: "Latest version",
|
||
downloadUpdate: "Download update",
|
||
downloading: "Downloading…",
|
||
downloadComplete: "Download complete, click to install",
|
||
install: "Install",
|
||
updateCheckFailed: "Update check failed",
|
||
lastChecked: "Last checked",
|
||
appDescription: "Windows desktop LLM provider config manager",
|
||
referenceProject: "Reference project",
|
||
|
||
// Validation errors
|
||
emptyProviderName: "Provider name is empty",
|
||
duplicateProviderName: "Duplicate provider name: {0}",
|
||
missingCredentials: "Provider '{0}' is missing credentials (api_key or env key)",
|
||
ambiguousCredentials: "Provider '{0}' has both direct and env credentials; only one source is allowed",
|
||
missingVertexProject: "Vertex provider '{0}' is missing GOOGLE_CLOUD_PROJECT or GOOGLE_CLOUD_LOCATION",
|
||
emptyModelAlias: "Model alias is empty",
|
||
duplicateModelAlias: "Duplicate model alias: {0}",
|
||
unknownModelProvider: "Model '{0}' references unknown provider '{1}'",
|
||
emptyModelId: "Model '{0}' has an empty model ID",
|
||
invalidMaxContextSize: "Model '{0}' has an invalid max_context_size",
|
||
|
||
// Dashboard — ranges / status
|
||
rangeToday: "Today",
|
||
range7d: "7d",
|
||
range30d: "30d",
|
||
rangeAll: "All",
|
||
dashLoadFailed: "Failed to load",
|
||
|
||
// Dashboard — KPI labels
|
||
kpiRequests: "Requests",
|
||
kpiInputOther: "Non-cached input",
|
||
kpiOutput: "Output",
|
||
kpiCacheRead: "Cache read",
|
||
kpiCacheCreation: "Cache creation",
|
||
kpiCacheHit: "Cache hit",
|
||
kpiCost: "Est. cost",
|
||
|
||
// Dashboard — cards
|
||
cardHeatmap: "Full-year heatmap",
|
||
cardHeatmapSub: "Coloured by token volume",
|
||
cardDailyTrend: "Usage trend",
|
||
cardDailyTrendSubCapped: "Last 30 days · {n} days total",
|
||
tabModelTrend: "Model usage trend",
|
||
tabProviderTrend: "Provider–model usage trend",
|
||
tabDailyTrend: "Daily usage trend",
|
||
providerUnknown: "Unknown provider",
|
||
cardDailyTrendSub: "{n} days",
|
||
cardModelUsage: "Model usage",
|
||
cardModelUsageSub: "{n} models",
|
||
cardRecent: "Recent requests",
|
||
cardRecentCapped: "Showing first {n} / {m}",
|
||
cardRecentCount: "{n} entries",
|
||
|
||
// Dashboard — table columns / units
|
||
colModel: "Model",
|
||
colTokens: "Tokens",
|
||
colCacheHit: "Cache hit",
|
||
colTime: "Time",
|
||
colInput: "Input",
|
||
colOutput: "Output",
|
||
colCacheRead: "Cache read",
|
||
unitTimes: "requests",
|
||
estimate: "est.",
|
||
collapse: "Collapse",
|
||
expandAll: "Expand all ({n})",
|
||
|
||
// Dashboard — pagination
|
||
paginationPage: "Page {x} / {y}",
|
||
paginationRange: "{x}–{y}",
|
||
paginationPerPage: "{n} per page",
|
||
pageFirst: "First",
|
||
pagePrev: "Previous",
|
||
pageNext: "Next",
|
||
pageLast: "Last",
|
||
|
||
// Dashboard — footer / attribution
|
||
footerScanned: "Scanned {n} files · {m} records",
|
||
dashboardAttribution: "Dashboard ported from",
|
||
sessionsAttribution: "Session manager ported from",
|
||
attributionSuffix: "(MIT, © JochenYang)",
|
||
|
||
// Sessions — preview
|
||
previewCollapseChars: "Collapse · {n} chars",
|
||
previewExpandChars: "Expand · {n} chars",
|
||
|
||
// Provider presets
|
||
presetPickerTitle: "Choose a provider preset",
|
||
presetSearchPlaceholder: "Search presets...",
|
||
presetSortOriginal: "Default",
|
||
presetSortAlpha: "A-Z",
|
||
presetNoResults: "No matching presets",
|
||
presetCustomConfig: "+ Custom configuration",
|
||
presetFooterHint: "Presets only pre-fill the form; every field stays editable afterwards.",
|
||
presetCategoryOfficial: "Official",
|
||
presetCategoryCnOfficial: "China",
|
||
presetCategoryThirdParty: "Third-party",
|
||
presetCategoryAggregator: "Aggregator",
|
||
presetNameAnthropic: "Anthropic",
|
||
presetNameKimiCoding: "Kimi For Coding",
|
||
presetNameMoonshot: "Moonshot Platform",
|
||
presetNameDeepseek: "DeepSeek",
|
||
presetNameZhipuApi: "Zhipu GLM (Pay-as-you-go)",
|
||
presetNameZhipuCoding: "Zhipu GLM Coding Plan",
|
||
presetNameZaiApi: "z.ai (Pay-as-you-go)",
|
||
presetNameZaiCoding: "z.ai Coding Plan",
|
||
presetNameBailian: "Alibaba Bailian",
|
||
presetNameMinimax: "MiniMax",
|
||
presetNameMinimaxTokenPlan: "MiniMax Token Plan",
|
||
presetNameStepfun: "StepFun",
|
||
presetNameStepfunPlan: "StepFun Plan",
|
||
presetNameSiliconflow: "SiliconFlow",
|
||
presetNameNovita: "Novita AI",
|
||
presetNameOpenrouter: "OpenRouter",
|
||
presetNameOpenai: "OpenAI",
|
||
presetNameGoogleGenai: "Google AI Studio",
|
||
presetNameVolcengine: "Volcengine Ark",
|
||
presetNameOpencodeGo: "OpenCode Go",
|
||
presetNameOpencodeZen: "OpenCode Zen",
|
||
|
||
// Provider usage
|
||
usageBalance: "Balance",
|
||
usageUsed: "used",
|
||
usageRemaining: "left",
|
||
usageRefresh: "Refresh",
|
||
usageRetry: "Retry",
|
||
usageQueryFailed: "Query failed",
|
||
usageNetworkError: "Network error",
|
||
usageInvalidKey: "Invalid API key",
|
||
usageResetIn: "resets in {time}",
|
||
usageResetDone: "reset",
|
||
usageLoading: "Querying…",
|
||
|
||
// Billing mode (subscription / pay-as-you-go)
|
||
billingTabSubscription: "Subscription",
|
||
billingTabPayAsYouGo: "Pay-as-you-go",
|
||
billingTabAll: "All",
|
||
billingBadgeSubscription: "Plan",
|
||
billingBadgePayAsYouGo: "PAYG",
|
||
|
||
// Usage trend line chart
|
||
trendLineTitle: "Usage Trend",
|
||
trendLineSub: "last {n} days",
|
||
trendLineLegendTokens: "Token usage",
|
||
trendLineLegendCacheHit: "Cache hit rate",
|
||
trendLineLegendRequests: "Requests",
|
||
trendLineShowRequests: "Show requests",
|
||
trendLineTooltip: "{date}\nTokens: {tokens}\nCache hit: {cache}\nRequests: {req}",
|
||
trendLineNoData: "No data",
|
||
};
|