Files
antigravity-claude-proxy/public/js/store.js
Yasin Köse cc64b93f32 Merge pull request #107 from YasinKose/main
Feat(ui): add Turkish language support and UI enhancements

Introduces Turkish language support and several UI/UX improvements to the web management interface.
2026-01-14 16:08:50 +08:00

915 lines
47 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.
/**
* Global Store for Antigravity Console
* Handles Translations, Toasts, and Shared Config
*/
document.addEventListener('alpine:init', () => {
Alpine.store('global', {
init() {
// Hash-based routing
const validTabs = ['dashboard', 'models', 'accounts', 'logs', 'settings'];
const getHash = () => window.location.hash.substring(1);
// 1. Initial load from hash
const initialHash = getHash();
if (validTabs.includes(initialHash)) {
this.activeTab = initialHash;
}
// 2. Sync State -> URL
Alpine.effect(() => {
if (validTabs.includes(this.activeTab) && getHash() !== this.activeTab) {
window.location.hash = this.activeTab;
}
});
// 3. Sync URL -> State (Back/Forward buttons)
window.addEventListener('hashchange', () => {
const hash = getHash();
if (validTabs.includes(hash) && this.activeTab !== hash) {
this.activeTab = hash;
}
});
},
// App State
version: '1.0.0',
activeTab: 'dashboard',
webuiPassword: localStorage.getItem('antigravity_webui_password') || '',
// i18n
lang: localStorage.getItem('app_lang') || 'en',
translations: {
en: {
dashboard: "Dashboard",
models: "Models",
accounts: "Accounts",
logs: "Logs",
settings: "Settings",
online: "ONLINE",
offline: "OFFLINE",
totalAccounts: "TOTAL ACCOUNTS",
active: "ACTIVE",
operational: "Operational",
rateLimited: "RATE LIMITED",
quotasDepleted: "{count}/{total} Quotas Depleted",
quotasDepletedTitle: "QUOTAS DEPLETED",
outOfTracked: "Out of {total} Tracked",
cooldown: "Cooldown",
searchPlaceholder: "Search models...",
allAccounts: "All Accounts",
stat: "STAT",
modelIdentity: "MODEL IDENTITY",
globalQuota: "GLOBAL QUOTA",
nextReset: "NEXT RESET",
distribution: "ACCOUNT DISTRIBUTION",
systemConfig: "System Configuration",
language: "Language",
pollingInterval: "Polling Interval",
maxDisplayLogs: "Max Displayed Logs",
showExhausted: "Show Exhausted Models",
showExhaustedDesc: "Display models even if they have 0% remaining quota.",
compactMode: "Compact Mode",
compactModeDesc: "Reduce padding in tables for higher information density.",
saveChanges: "Save Changes",
autoScroll: "Auto-scroll",
clearLogs: "Clear Logs",
accountManagement: "Account Management",
manageTokens: "Manage Google Account tokens and authorization states",
addAccount: "Add Account",
status: "STATUS",
enabled: "ENABLED",
health: "STATUS",
accountEmail: "ACCOUNT (EMAIL)",
source: "SOURCE",
projectId: "PROJECT ID",
sessionState: "SESSION STATE",
operations: "OPERATIONS",
delete: "Delete",
confirmDelete: "Are you sure you want to remove this account?",
cannotDeleteDatabase: "Cannot delete: This account is from Antigravity database (read-only)",
connectGoogle: "Connect Google Account",
reauthenticated: "re-authenticated",
added: "added",
successfully: "successfully",
accountAddedSuccess: "Account added successfully",
accountReauthSuccess: "Account re-authenticated successfully",
failedToGetAuthUrl: "Failed to get auth URL",
failedToStartOAuth: "Failed to start OAuth flow",
oauthInProgress: "OAuth in progress. Please complete authentication in the popup window...",
family: "Family",
model: "Model",
activeSuffix: "Active",
// Tabs
tabInterface: "Interface",
tabClaude: "Claude CLI",
tabModels: "Models",
tabServer: "Server Settings",
// Dashboard
linkedAccounts: "Linked Accounts",
noSignal: "NO SIGNAL DETECTED",
establishingUplink: "ESTABLISHING UPLINK...",
goToAccounts: "Go to Accounts",
// Settings - Models
modelsDesc: "Configure model visibility, pinning, and request routing.",
modelsPageDesc: "Real-time quota and status for all available models.",
showHidden: "Show Hidden Models",
hideHidden: "Hide Hidden Models",
hiddenOn: "Hidden: ON",
hiddenOff: "Hidden: OFF",
modelId: "Model ID",
actions: "Actions",
pinToTop: "Pin to top",
toggleVisibility: "Toggle Visibility",
noModels: "NO MODELS DETECTED",
modelMappingHint: "Server-side model routing. Claude Code users: see 'Claude CLI' tab for client-side setup.",
modelMapping: "Mapping (Target Model ID)",
// Settings - Claude
proxyConnection: "Proxy Connection",
modelSelection: "Model Selection",
defaultModelAliases: "DEFAULT MODEL ALIASES",
opusAlias: "Opus Alias",
sonnetAlias: "Sonnet Alias",
haikuAlias: "Haiku Alias",
claudeSettingsAlertPrefix: "Settings below directly modify",
claudeSettingsAlertSuffix: "Restart Claude CLI to apply.",
applyToClaude: "Apply to Claude CLI",
// Presets
configPresets: "Configuration Presets",
saveAsPreset: "Save as Preset",
deletePreset: "Delete Preset",
loadPreset: "Load preset into form",
load: "Load",
presetHint: "Select a preset to load it. Click \"Apply to Claude CLI\" to save changes.",
presetLoaded: "Preset loaded. Click \"Apply to Claude CLI\" to save.",
presetSaved: "Preset saved",
presetDeleted: "Preset deleted",
unsavedChangesTitle: "Unsaved Changes",
unsavedChangesMessage: "Your current configuration doesn't match any saved preset. If you switch, your current unsaved settings will be lost.",
loadAnyway: "Load Anyway",
savePresetTitle: "Save Preset",
savePresetDesc: "Save the current configuration as a reusable preset.",
presetName: "Preset Name",
presetNamePlaceholder: "e.g., My Work Setup",
savePreset: "Save Preset",
// Settings - Server
port: "Port",
uiVersion: "UI Version",
debugMode: "Debug Mode",
environment: "Environment",
serverReadOnly: "Settings managed via config.json. Restart server to apply changes.",
advancedSettings: "Advanced Settings",
reloadConfigTitle: "Reload Account Config",
reloadConfigDesc: "Force reload accounts.json from disk",
reload: "Reload",
// Config Specific
primaryModel: "Primary Model",
subAgentModel: "Sub-agent Model",
advancedOverrides: "Default Model Overrides",
opusModel: "Opus Model",
sonnetModel: "Sonnet Model",
haikuModel: "Haiku Model",
authToken: "Auth Token",
saveConfig: "Save to Claude CLI settings",
envVar: "Env",
// New Keys
systemName: "ANTIGRAVITY",
systemDesc: "CLAUDE PROXY SYSTEM",
connectGoogleDesc: "Connect a Google Workspace account to increase your API quota limit. The account will be used to proxy Claude requests via Antigravity.",
useCliCommand: "Use CLI Command",
close: "Close",
requestVolume: "Request Volume",
filter: "Filter",
all: "All",
none: "None",
noDataTracked: "No data tracked yet",
selectFamilies: "Select families to display",
selectModels: "Select models to display",
noLogsMatch: "No logs match filter",
connecting: "CONNECTING",
main: "Main",
system: "System",
refreshData: "Refresh Data",
connectionLost: "Connection Lost",
lastUpdated: "Last Updated",
grepLogs: "grep logs...",
noMatchingModels: "No matching models",
typeToSearch: "Type to search or select...",
or: "OR",
refreshingAccount: "Refreshing {email}...",
refreshedAccount: "Refreshed {email}",
refreshFailed: "Refresh failed",
accountToggled: "Account {email} {status}",
toggleFailed: "Toggle failed",
reauthenticating: "Re-authenticating {email}...",
authUrlFailed: "Failed to get auth URL",
deletedAccount: "Deleted {email}",
deleteFailed: "Delete failed",
accountsReloaded: "Accounts reloaded",
reloadFailed: "Reload failed",
claudeConfigSaved: "Claude configuration saved",
claudeConfigRestored: "Claude CLI restored to defaults",
saveConfigFailed: "Failed to save configuration",
restoreConfigFailed: "Failed to restore configuration",
restoreDefault: "Restore Default",
confirmRestoreTitle: "Confirm Restore",
confirmRestoreMessage: "Are you sure you want to restore Claude CLI to default settings? This will remove proxy configuration.",
confirmRestore: "Confirm Restore",
claudeActive: "Claude Active",
claudeEmpty: "Claude Empty",
geminiActive: "Gemini Active",
geminiEmpty: "Gemini Empty",
synced: "SYNCED",
syncing: "SYNCING...",
// Time range labels
last1Hour: "Last 1H",
last6Hours: "Last 6H",
last24Hours: "Last 24H",
last7Days: "Last 7D",
allTime: "All Time",
groupBy: "Group By",
// Additional
reloading: "Reloading...",
reloaded: "Reloaded",
lines: "lines",
enabledSeeLogs: "Enabled (See Logs)",
production: "Production",
configSaved: "Configuration Saved",
enterPassword: "Enter Web UI Password:",
ready: "READY",
depleted: "Depleted",
timeH: "H",
timeM: "M",
familyClaude: "Claude",
familyGemini: "Gemini",
familyOther: "Other",
enabledStatus: "enabled",
disabledStatus: "disabled",
logLevelInfo: "INFO",
logLevelSuccess: "SUCCESS",
logLevelWarn: "WARN",
logLevelError: "ERR",
totalColon: "Total:",
todayColon: "Today:",
hour1Colon: "1H:",
frequentModels: "Frequent",
smartTitle: "Auto-select top 5 most used models (24h)",
activeCount: "{count} Active",
allCaps: "ALL",
claudeCaps: "CLAUDE",
geminiCaps: "GEMINI",
modelMapping: "Mapping (Target Model ID)",
systemInfo: "System Information",
refresh: "Refresh",
runtimeConfig: "Runtime Configuration",
debugDesc: "Enable detailed logging (See Logs tab)",
networkRetry: "Network Retry Settings",
maxRetries: "Max Retries",
retryBaseDelay: "Retry Base Delay (ms)",
retryMaxDelay: "Retry Max Delay (ms)",
persistentSessions: "Persistent Sessions",
persistTokenDesc: "Save OAuth sessions to disk for faster restarts",
rateLimiting: "Account Rate Limiting & Timeouts",
defaultCooldown: "Default Cooldown",
defaultCooldownDesc: "Fallback cooldown when API doesn't provide a reset time.",
maxWaitThreshold: "Max Wait Before Error",
maxWaitDesc: "If all accounts are rate-limited longer than this, error immediately instead of waiting.",
saveConfigServer: "Save Configuration",
serverRestartAlert: "Changes saved to {path}. Restart server to apply some settings.",
changePassword: "Change WebUI Password",
changePasswordDesc: "Update the password for accessing this dashboard",
currentPassword: "Current Password",
newPassword: "New Password",
confirmNewPassword: "Confirm New Password",
passwordEmptyDesc: "Leave empty if no password set",
passwordLengthDesc: "At least 6 characters",
passwordConfirmDesc: "Re-enter new password",
cancel: "Cancel",
passwordsNotMatch: "Passwords do not match",
passwordTooShort: "Password must be at least 6 characters",
// Dashboard drill-down
clickToViewAllAccounts: "Click to view all accounts",
clickToViewModels: "Click to view Models page",
clickToViewLimitedAccounts: "Click to view rate-limited accounts",
clickToFilterClaude: "Click to filter Claude models",
clickToFilterGemini: "Click to filter Gemini models",
// Accounts page
searchAccounts: "Search accounts...",
noAccountsYet: "No Accounts Yet",
noAccountsDesc: "Get started by adding a Google account via OAuth, or use the CLI command to import credentials.",
addFirstAccount: "Add Your First Account",
noSearchResults: "No accounts match your search",
clearSearch: "Clear Search",
disabledAccountsNote: "<strong>Disabled accounts</strong> will not be used for request routing but remain in the configuration. Dashboard statistics only include enabled accounts.",
dangerousOperation: "⚠️ Dangerous Operation",
confirmDeletePrompt: "Are you sure you want to delete account",
deleteWarning: "⚠️ This action cannot be undone. All configuration and historical records will be permanently deleted.",
// OAuth progress
oauthWaiting: "Waiting for OAuth authorization...",
oauthWaitingDesc: "Please complete the authentication in the popup window. This may take up to 2 minutes.",
oauthCancelled: "OAuth authorization cancelled",
oauthTimeout: "⏱️ OAuth authorization timed out. Please try again.",
oauthWindowClosed: "OAuth window was closed. Authorization may be incomplete.",
cancelOAuth: "Cancel",
// MCP CLI & Gemini 1M
mcpCliExperimental: "Experimental MCP CLI",
mcpCliDesc: "Enables experimental MCP integration for reliable tool usage with reduced context consumption.",
gemini1mMode: "Gemini 1M Context Mode",
gemini1mDesc: "Appends [1m] suffix to Gemini models for 1M context window support.",
gemini1mWarning: "⚠ Large context may reduce Gemini-3-Pro performance.",
clickToSet: "Click to configure...",
none: "None",
// Quota Distribution
quotaDistribution: "Quota Distribution",
resetsIn: "Resets in {time}",
noQuotaData: "No quota data available for this account yet.",
},
zh: {
dashboard: "仪表盘",
models: "模型列表",
accounts: "账号管理",
logs: "运行日志",
settings: "系统设置",
online: "在线",
offline: "离线",
totalAccounts: "账号总数",
active: "活跃状态",
operational: "运行中",
rateLimited: "受限状态",
quotasDepleted: "{count}/{total} 配额耗尽",
quotasDepletedTitle: "配额耗尽数",
outOfTracked: "共追踪 {total} 个",
cooldown: "冷却中",
searchPlaceholder: "搜索模型...",
allAccounts: "所有账号",
stat: "状态",
modelIdentity: "模型标识",
globalQuota: "全局配额",
nextReset: "重置时间",
distribution: "账号分布",
systemConfig: "系统配置",
language: "语言设置",
pollingInterval: "数据轮询间隔",
maxDisplayLogs: "最大日志显示行数",
showExhausted: "显示耗尽模型",
showExhaustedDesc: "即使配额为 0% 也显示模型。",
compactMode: "紧凑模式",
compactModeDesc: "减少表格间距以显示更多信息。",
saveChanges: "保存更改",
autoScroll: "自动滚动",
clearLogs: "清除日志",
accountManagement: "账号管理",
manageTokens: "管理已授权的 Google 账号及其状态",
addAccount: "添加账号",
status: "状态",
enabled: "启用",
health: "状态",
accountEmail: "账号 (邮箱)",
source: "来源",
projectId: "项目 ID",
sessionState: "会话状态",
operations: "操作",
delete: "删除",
confirmDelete: "确定要移除此账号吗?",
cannotDeleteDatabase: "无法删除:此账号来自 Antigravity 数据库(只读)",
connectGoogle: "连接 Google 账号",
reauthenticated: "已重新认证",
added: "已添加",
successfully: "成功",
accountAddedSuccess: "账号添加成功",
accountReauthSuccess: "账号重新认证成功",
failedToGetAuthUrl: "获取认证链接失败",
failedToStartOAuth: "启动 OAuth 流程失败",
oauthInProgress: "OAuth 授权进行中,请在弹出窗口中完成认证...",
family: "系列",
model: "模型",
activeSuffix: "活跃",
manualReload: "重新加载配置",
// Tabs
tabInterface: "界面设置",
tabClaude: "Claude CLI",
tabModels: "模型管理",
tabServer: "服务器设置",
// Dashboard
linkedAccounts: "已关联账号",
noSignal: "无信号连接",
establishingUplink: "正在建立上行链路...",
goToAccounts: "前往账号管理",
// Settings - Models
modelsDesc: "配置模型的可见性、置顶和请求路由。",
modelsPageDesc: "所有可用模型的实时配额和状态。",
showHidden: "显示隐藏模型",
hideHidden: "隐藏被屏蔽模型",
hiddenOn: "隐藏模型: 显示",
hiddenOff: "隐藏模型: 隐藏",
modelId: "模型 ID",
actions: "操作",
pinToTop: "置顶",
toggleVisibility: "切换可见性",
noModels: "未检测到模型",
modelMappingHint: "服务端模型路由功能。Claude Code 用户请使用 'Claude CLI' 标签页以便捷配置。",
modelMapping: "映射 (目标模型 ID)",
// Settings - Claude
proxyConnection: "代理连接",
modelSelection: "模型选择",
defaultModelAliases: "默认模型映射 (别名)",
opusAlias: "Opus 别名",
sonnetAlias: "Sonnet 别名",
haikuAlias: "Haiku 别名",
claudeSettingsAlertPrefix: "以下设置直接修改",
claudeSettingsAlertSuffix: "重启 Claude CLI 生效。",
applyToClaude: "应用到 Claude CLI",
// Presets
configPresets: "配置预设",
saveAsPreset: "另存为预设",
deletePreset: "删除预设",
loadPreset: "加载预设到表单",
load: "加载",
presetHint: "选择预设以加载。点击“应用到 Claude CLI”以保存更改。",
presetLoaded: "预设已加载。点击“应用到 Claude CLI”以保存。",
presetSaved: "预设已保存",
presetDeleted: "预设已删除",
unsavedChangesTitle: "未保存的更改",
unsavedChangesMessage: "当前配置与任何已保存的预设都不匹配。如果切换预设,当前未保存的设置将会丢失。",
loadAnyway: "仍然加载",
savePresetTitle: "保存预设",
savePresetDesc: "将当前配置保存为可重复使用的预设。",
presetName: "预设名称",
presetNamePlaceholder: "例如:工作配置",
savePreset: "保存预设",
// Settings - Server
port: "端口",
uiVersion: "UI 版本",
debugMode: "调试模式",
environment: "运行环境",
serverReadOnly: "配置由 config.json 管理。重启服务器以应用更改。",
advancedSettings: "高级设置",
reloadConfigTitle: "重载账号配置",
reloadConfigDesc: "强制从磁盘重新读取 accounts.json",
reload: "重载",
// Config Specific
primaryModel: "主模型",
subAgentModel: "子代理模型",
advancedOverrides: "默认模型覆盖 (高级)",
opusModel: "Opus 模型",
sonnetModel: "Sonnet 模型",
haikuModel: "Haiku 模型",
authToken: "认证令牌",
saveConfig: "保存到 Claude CLI 设置",
envVar: "环境变量",
// New Keys
systemName: "ANTIGRAVITY",
systemDesc: "CLAUDE 代理系统",
connectGoogleDesc: "连接 Google Workspace 账号以增加 API 配额。该账号将用于通过 Antigravity 代理 Claude 请求。",
useCliCommand: "使用命令行",
close: "关闭",
requestVolume: "请求量",
filter: "筛选",
all: "全选",
none: "清空",
noDataTracked: "暂无追踪数据",
selectFamilies: "选择要显示的系列",
selectModels: "选择要显示的模型",
noLogsMatch: "没有符合过滤条件的日志",
connecting: "正在连接",
main: "主菜单",
system: "系统",
refreshData: "刷新数据",
connectionLost: "连接已断开",
lastUpdated: "最后更新",
grepLogs: "过滤日志...",
noMatchingModels: "没有匹配的模型",
typeToSearch: "输入以搜索或选择...",
or: "或",
refreshingAccount: "正在刷新 {email}...",
refreshedAccount: "已完成刷新 {email}",
refreshFailed: "刷新失败",
accountToggled: "账号 {email} 已{status}",
toggleFailed: "切换失败",
reauthenticating: "正在重新认证 {email}...",
authUrlFailed: "获取认证链接失败",
deletedAccount: "已删除 {email}",
deleteFailed: "删除失败",
accountsReloaded: "账号配置已重载",
reloadFailed: "重载失败",
claudeConfigSaved: "Claude 配置已保存",
claudeConfigRestored: "Claude CLI 已恢复默认设置",
saveConfigFailed: "保存配置失败",
restoreConfigFailed: "恢复配置失败",
restoreDefault: "恢复默认",
confirmRestoreTitle: "确认恢复",
confirmRestoreMessage: "确定要将 Claude CLI 恢复为默认设置吗?这将移除代理配置。",
confirmRestore: "确认恢复",
claudeActive: "Claude 活跃",
claudeEmpty: "Claude 耗尽",
geminiActive: "Gemini 活跃",
geminiEmpty: "Gemini 耗尽",
synced: "已同步",
syncing: "正在同步...",
// 时间范围标签
last1Hour: "最近 1 小时",
last6Hours: "最近 6 小时",
last24Hours: "最近 24 小时",
last7Days: "最近 7 天",
allTime: "最后全部",
groupBy: "分组方式",
// Additional
reloading: "正在重载...",
reloaded: "已重载",
lines: "行",
enabledSeeLogs: "已启用 (见日志)",
production: "生产环境",
configSaved: "配置已保存",
enterPassword: "请输入 Web UI 密码:",
ready: "就绪",
depleted: "已耗尽",
timeH: "时",
timeM: "分",
familyClaude: "Claude 系列",
familyGemini: "Gemini 系列",
familyOther: "其他系列",
enabledStatus: "已启用",
disabledStatus: "已禁用",
logLevelInfo: "信息",
logLevelSuccess: "成功",
logLevelWarn: "警告",
logLevelError: "错误",
totalColon: "总计:",
todayColon: "今日:",
hour1Colon: "1小时:",
frequentModels: "常用推荐",
smartTitle: "自动选出过去 24 小时最常用的 5 个模型",
activeCount: "{count} 活跃",
allCaps: "全部",
claudeCaps: "CLAUDE",
geminiCaps: "GEMINI",
modelMapping: "映射 (目标模型 ID)",
systemInfo: "系统信息",
refresh: "刷新",
runtimeConfig: "运行时配置",
debugDesc: "启用详细日志记录 (见运行日志)",
networkRetry: "网络重试设置",
maxRetries: "最大重试次数",
retryBaseDelay: "重试基础延迟 (毫秒)",
retryMaxDelay: "重试最大延迟 (毫秒)",
persistentSessions: "持久化登录会话",
persistTokenDesc: "将登录会话保存到磁盘以实现快速重启",
rateLimiting: "账号限流与超时",
defaultCooldown: "默认冷却时间",
defaultCooldownDesc: "当 API 未提供重置时间时的备用冷却时间。",
maxWaitThreshold: "最大等待阈值",
maxWaitDesc: "如果所有账号的限流时间超过此阈值,立即返回错误而非等待。",
saveConfigServer: "保存配置",
serverRestartAlert: "配置已保存至 {path}。部分更改可能需要重启服务器。",
changePassword: "修改 WebUI 密码",
changePasswordDesc: "更新访问此仪表盘的密码",
currentPassword: "当前密码",
newPassword: "新密码",
confirmNewPassword: "确认新密码",
passwordEmptyDesc: "如果未设置密码请留空",
passwordLengthDesc: "至少 6 个字符",
passwordConfirmDesc: "请再次输入新密码",
cancel: "取消",
passwordsNotMatch: "密码不匹配",
passwordTooShort: "密码至少需要 6 个字符",
// Dashboard drill-down
clickToViewAllAccounts: "点击查看所有账号",
clickToViewModels: "点击查看模型页面",
clickToViewLimitedAccounts: "点击查看受限账号",
clickToFilterClaude: "点击筛选 Claude 模型",
clickToFilterGemini: "点击筛选 Gemini 模型",
// 账号页面
searchAccounts: "搜索账号...",
noAccountsYet: "还没有添加任何账号",
noAccountsDesc: "点击上方的 \"添加账号\" 按钮通过 OAuth 添加 Google 账号,或者使用 CLI 命令导入凭证。",
addFirstAccount: "添加第一个账号",
noSearchResults: "没有找到匹配的账号",
clearSearch: "清除搜索",
disabledAccountsNote: "<strong>已禁用的账号</strong>不会用于请求路由,但仍保留在配置中。仪表盘统计数据仅包含已启用的账号。",
dangerousOperation: "⚠️ 危险操作",
confirmDeletePrompt: "确定要删除账号",
deleteWarning: "⚠️ 此操作不可撤销,账号的所有配置和历史记录将永久删除。",
// OAuth 进度
oauthWaiting: "等待 OAuth 授权中...",
oauthWaitingDesc: "请在弹出窗口中完成认证。此过程最长可能需要 2 分钟。",
oauthCancelled: "已取消 OAuth 授权",
oauthTimeout: "⏱️ OAuth 授权超时,请重试。",
oauthWindowClosed: "OAuth 窗口已关闭,授权可能未完成。",
cancelOAuth: "取消",
// MCP CLI & Gemini 1M
mcpCliExperimental: "实验性 MCP CLI",
mcpCliDesc: "启用实验性 MCP 集成,减少上下文消耗,提高工具调用可靠性。",
gemini1mMode: "Gemini 1M 上下文模式",
gemini1mDesc: "为 Gemini 模型添加 [1m] 后缀以支持 1M 上下文窗口。",
gemini1mWarning: "⚠ 大上下文可能降低 Gemini-3-Pro 性能。",
clickToSet: "点击进行配置...",
none: "无",
// Quota Distribution
quotaDistribution: "配额分布",
resetsIn: "{time} 后重置",
noQuotaData: "暂无此账号的配额数据。",
},
tr: {
dashboard: "Panel",
models: "Modeller",
accounts: "Hesaplar",
logs: "Günlükler",
settings: "Ayarlar",
online: "ÇEVRİMİÇİ",
offline: "ÇEVRİMDIŞI",
totalAccounts: "TOPLAM HESAP",
active: "AKTİF",
operational: "Çalışıyor",
rateLimited: "HIZ SINIRLANDI",
quotasDepleted: "{count}/{total} Kota Tükendi",
quotasDepletedTitle: "KOTA TÜKENDİ",
outOfTracked: "{total} Takip Edilen İçinden",
cooldown: "Soğuma",
searchPlaceholder: "Modelleri ara...",
allAccounts: "Tüm Hesaplar",
stat: "DURUM",
modelIdentity: "MODEL KİMLİĞİ",
globalQuota: "GENEL KOTA",
nextReset: "SONRAKİ SIFIRLAMA",
distribution: "HESAP DAĞILIMI",
systemConfig: "Sistem Yapılandırması",
language: "Dil",
pollingInterval: "Veri Güncelleme Aralığı",
maxDisplayLogs: "Maksimum Görüntülenen Günlük",
showExhausted: "Tükenmiş Modelleri Göster",
showExhaustedDesc: "%0 kotası kalan modelleri de göster.",
compactMode: "Kompakt Mod",
compactModeDesc: "Daha fazla bilgi göstermek için tablo boşluklarını azalt.",
saveChanges: "Değişiklikleri Kaydet",
autoScroll: "Otomatik Kaydır",
clearLogs: "Günlükleri Temizle",
accountManagement: "Hesap Yönetimi",
manageTokens: "Google Hesap jetonlarını ve yetkilendirme durumlarını yönet",
addAccount: "Hesap Ekle",
status: "DURUM",
enabled: "ETKİN",
health: "SAĞLIK",
accountEmail: "HESAP (E-POSTA)",
source: "KAYNAK",
projectId: "PROJE ID",
sessionState: "OTURUM DURUMU",
operations: "İŞLEMLER",
delete: "Sil",
confirmDelete: "Bu hesabı kaldırmak istediğinizden emin misiniz?",
cannotDeleteDatabase: "Silinemez: Bu hesap Antigravity veritabanından (salt okunur)",
connectGoogle: "Google Hesabı Bağla",
reauthenticated: "yeniden doğrulandı",
added: "eklendi",
successfully: "başarıyla",
accountAddedSuccess: "Hesap başarıyla eklendi",
accountReauthSuccess: "Hesap başarıyla yeniden doğrulandı",
failedToGetAuthUrl: "Yetkilendirme URL'si alınamadı",
failedToStartOAuth: "OAuth akışı başlatılamadı",
oauthInProgress: "OAuth devam ediyor. Lütfen açılır pencerede kimlik doğrulamayı tamamlayın...",
family: "Aile",
model: "Model",
activeSuffix: "Aktif",
manualReload: "Yapılandırmayı Yeniden Yükle",
// Tabs
tabInterface: "Arayüz",
tabClaude: "Claude CLI",
tabModels: "Modeller",
tabServer: "Sunucu Ayarları",
// Dashboard
linkedAccounts: "Bağlı Hesaplar",
noSignal: "SİNYAL YOK",
establishingUplink: "BAĞLANTI KURULUYOR...",
goToAccounts: "Hesaplara Git",
// Settings - Models
modelsDesc: "Model görünürlüğünü, sabitlemeyi ve istek yönlendirmeyi yapılandırın.",
modelsPageDesc: "Tüm mevcut modeller için gerçek zamanlı kota ve durum.",
showHidden: "Gizli Modelleri Göster",
hideHidden: "Gizli Modelleri Gizle",
hiddenOn: "Gizli: AÇIK",
hiddenOff: "Gizli: KAPALI",
modelId: "Model ID",
actions: "İşlemler",
pinToTop: "En Üste Sabitle",
toggleVisibility: "Görünürlüğü Değiştir",
noModels: "MODEL ALGILANMADI",
modelMappingHint: "Sunucu tarafı model yönlendirme. Claude Code kullanıcıları: istemci tarafı kurulumu için 'Claude CLI' sekmesine bakın.",
modelMapping: "Eşleştirme (Hedef Model ID)",
// Settings - Claude
proxyConnection: "Proxy Bağlantısı",
modelSelection: "Model Seçimi",
defaultModelAliases: "VARSAYILAN MODEL TAKMA ADLARI",
opusAlias: "Opus Takma Adı",
sonnetAlias: "Sonnet Takma Adı",
haikuAlias: "Haiku Takma Adı",
claudeSettingsAlertPrefix: "Aşağıdaki ayarlar doğrudan değiştirir",
claudeSettingsAlertSuffix: "Uygulamak için Claude CLI'yı yeniden başlatın.",
applyToClaude: "Claude CLI'ya Uygula",
// Settings - Server
port: "Port",
uiVersion: "Arayüz Sürümü",
debugMode: "Hata Ayıklama Modu",
environment: "Ortam",
serverReadOnly: "Ayarlar config.json üzerinden yönetilir. Değişiklikleri uygulamak için sunucuyu yeniden başlatın.",
advancedSettings: "Gelişmiş Ayarlar",
reloadConfigTitle: "Hesap Yapılandırmasını Yeniden Yükle",
reloadConfigDesc: "accounts.json dosyasını diskten yeniden yüklemeye zorla",
reload: "Yeniden Yükle",
// Config Specific
primaryModel: "Birincil Model",
subAgentModel: "Alt Ajan Modeli",
advancedOverrides: "Varsayılan Model Geçersiz Kılmaları",
opusModel: "Opus Modeli",
sonnetModel: "Sonnet Modeli",
haikuModel: "Haiku Modeli",
authToken: "Yetkilendirme Jetonu",
saveConfig: "Claude CLI ayarlarına kaydet",
envVar: "Ortam Değişkeni",
// New Keys
systemName: "ANTIGRAVITY",
systemDesc: "CLAUDE PROXY SİSTEMİ",
connectGoogleDesc: "API kota limitinizi artırmak için bir Google Workspace hesabı bağlayın. Bu hesap, Claude isteklerini Antigravity üzerinden vekil sunucu olarak kullanmak için kullanılacaktır.",
useCliCommand: "CLI Komutunu Kullan",
close: "Kapat",
requestVolume: "İstek Hacmi",
filter: "Filtrele",
all: "Tümü",
none: "Hiçbiri",
noDataTracked: "Henüz veri izlenmedi",
selectFamilies: "Görüntülenecek aileleri seçin",
selectModels: "Görüntülenecek modelleri seçin",
noLogsMatch: "Filtreyle eşleşen günlük yok",
connecting: "BAĞLANILIYOR",
main: "Ana",
system: "Sistem",
refreshData: "Verileri Yenile",
connectionLost: "Bağlantı Kaybedildi",
lastUpdated: "Son Güncelleme",
grepLogs: "günlükleri ara...",
noMatchingModels: "Eşleşen model yok",
typeToSearch: "Aramak veya seçmek için yazın...",
or: "VEYA",
refreshingAccount: "{email} yenileniyor...",
refreshedAccount: "{email} yenilendi",
refreshFailed: "Yenileme başarısız",
accountToggled: "Hesap {email} {status}",
toggleFailed: "Değiştirme başarısız",
reauthenticating: "{email} yeniden doğrulanıyor...",
authUrlFailed: "Yetkilendirme URL'si alınamadı",
deletedAccount: "{email} silindi",
deleteFailed: "Silme başarısız",
accountsReloaded: "Hesaplar yeniden yüklendi",
reloadFailed: "Yeniden yükleme başarısız",
claudeConfigSaved: "Claude yapılandırması kaydedildi",
claudeConfigRestored: "Claude CLI varsayılanlara geri yüklendi",
saveConfigFailed: "Yapılandırma kaydedilemedi",
restoreConfigFailed: "Yapılandırma geri yüklenemedi",
restoreDefault: "Varsayılana Dön",
confirmRestoreTitle: "Geri Yüklemeyi Onayla",
confirmRestoreMessage: "Claude CLI'yı varsayılan ayarlara geri yüklemek istediğinizden emin misiniz? Bu işlem proxy yapılandırmasını kaldıracaktır.",
confirmRestore: "Geri Yüklemeyi Onayla",
claudeActive: "Claude Aktif",
claudeEmpty: "Claude Boş",
geminiActive: "Gemini Aktif",
geminiEmpty: "Gemini Boş",
synced: "EŞİTLENDİ",
syncing: "EŞİTLENİYOR...",
// Time range labels
last1Hour: "Son 1S",
last6Hours: "Son 6S",
last24Hours: "Son 24S",
last7Days: "Son 7G",
allTime: "Tüm Zamanlar",
groupBy: "Gruplama Ölçütü",
// Additional
reloading: "Yeniden yükleniyor...",
reloaded: "Yeniden yüklendi",
lines: "satır",
enabledSeeLogs: "Etkin (Günlüklere Bak)",
production: "Üretim",
configSaved: "Yapılandırma Kaydedildi",
enterPassword: "Web UI Parolasını Girin:",
ready: "HAZIR",
depleted: "Tükendi",
timeH: "S",
timeM: "D",
familyClaude: "Claude",
familyGemini: "Gemini",
familyOther: "Diğer",
enabledStatus: "etkin",
disabledStatus: "devre dışı",
logLevelInfo: "BİLGİ",
logLevelSuccess: "BAŞARILI",
logLevelWarn: "UYARI",
logLevelError: "HATA",
totalColon: "Toplam:",
todayColon: "Bugün:",
hour1Colon: "1S:",
frequentModels: "Sık Kullanılan",
smartTitle: "En çok kullanılan 5 modeli otomatik seç (24s)",
activeCount: "{count} Aktif",
allCaps: "TÜMÜ",
claudeCaps: "CLAUDE",
geminiCaps: "GEMINI",
modelMapping: "Eşleştirme (Hedef Model ID)",
systemInfo: "Sistem Bilgisi",
refresh: "Yenile",
runtimeConfig: "Çalışma Zamanı Yapılandırması",
debugDesc: "Ayrıntılı günlük kaydını etkinleştir (Günlükler sekmesine bakın)",
networkRetry: "Ağ Yeniden Deneme Ayarları",
maxRetries: "Maksimum Deneme",
retryBaseDelay: "Yeniden Deneme Temel Gecikmesi (ms)",
retryMaxDelay: "Yeniden Deneme Maksimum Gecikmesi (ms)",
persistentSessions: "Kalıcı Oturumlar",
persistTokenDesc: "Daha hızlı yeniden başlatmalar için OAuth oturumlarını diske kaydet",
rateLimiting: "Hesap Hız Sınırlama ve Zaman Aşımları",
defaultCooldown: "Varsayılan Soğuma Süresi",
maxWaitThreshold: "Maksimum Bekleme Eşiği (Yapışkan)",
maxWaitDesc: "Yapışkan bir hesabın değiştirmeden önce sıfırlanması için beklenecek maksimum süre.",
saveConfigServer: "Yapılandırmayı Kaydet",
serverRestartAlert: "Değişiklikler {path} konumuna kaydedildi. Bazı ayarları uygulamak için sunucuyu yeniden başlatın.",
changePassword: "WebUI Parolasını Değiştir",
changePasswordDesc: "Bu panoya erişim parolasını güncelle",
currentPassword: "Mevcut Parola",
newPassword: "Yeni Parola",
confirmNewPassword: "Yeni Parolayı Onayla",
passwordEmptyDesc: "Parola ayarlanmamışsa boş bırakın",
passwordLengthDesc: "En az 6 karakter",
passwordConfirmDesc: "Yeni parolayı tekrar girin",
cancel: "İptal",
passwordsNotMatch: "Parolalar eşleşmiyor",
passwordTooShort: "Parola en az 6 karakter olmalıdır",
// Dashboard drill-down
clickToViewAllAccounts: "Tüm hesapları görüntülemek için tıklayın",
clickToViewModels: "Modeller sayfasını görüntülemek için tıklayın",
clickToViewLimitedAccounts: "Hız sınırı olan hesapları görüntülemek için tıklayın",
clickToFilterClaude: "Claude modellerini filtrelemek için tıklayın",
clickToFilterGemini: "Gemini modellerini filtrelemek için tıklayın",
// Accounts page
searchAccounts: "Hesap ara...",
noAccountsYet: "Henüz Hesap Yok",
noAccountsDesc: "OAuth üzerinden bir Google hesabı ekleyerek veya kimlik bilgilerini içe aktarmak için CLI komutunu kullanarak başlayın.",
addFirstAccount: "İlk Hesabınızı Ekleyin",
noSearchResults: "Aramanızla eşleşen hesap yok",
clearSearch: "Aramayı Temizle",
disabledAccountsNote: "<strong>Devre dışı bırakılan hesaplar</strong> istek yönlendirmesi için kullanılmayacak ancak yapılandırmada kalacaktır. Pano istatistikleri yalnızca etkin hesapları içerir.",
dangerousOperation: "⚠️ Tehlikeli İşlem",
confirmDeletePrompt: "Hesabı silmek istediğinizden emin misiniz",
deleteWarning: "⚠️ Bu işlem geri alınamaz. Tüm yapılandırma ve geçmiş kayıtları kalıcı olarak silinecektir.",
// OAuth progress
oauthWaiting: "OAuth yetkilendirmesi bekleniyor...",
oauthWaitingDesc: "Lütfen açılır pencerede kimlik doğrulamasını tamamlayın. Bu işlem 2 dakikaya kadar sürebilir.",
oauthCancelled: "OAuth yetkilendirmesi iptal edildi",
oauthTimeout: "⏱️ OAuth yetkilendirmesi zaman aşımına uğradı. Lütfen tekrar deneyin.",
oauthWindowClosed: "OAuth penceresi kapatıldı. Yetkilendirme tamamlanmamış olabilir.",
cancelOAuth: "İptal",
// MCP CLI & Gemini 1M
mcpCliExperimental: "Deneysel MCP CLI",
mcpCliDesc: "Daha az bağlam tüketimi ile güvenilir araç kullanımı için deneysel MCP entegrasyonunu etkinleştirir.",
gemini1mMode: "Gemini 1M Bağlam Modu",
gemini1mDesc: "1M bağlam penceresi desteği için Gemini modellerine [1m] son eki ekler.",
gemini1mWarning: "⚠ Büyük bağlam, Gemini-3-Pro performansını düşürebilir.",
clickToSet: "Yapılandırmak için tıklayın...",
none: "Hiçbiri",
// Quota Distribution
quotaDistribution: "Kota Dağılımı",
resetsIn: "{time} içinde sıfırlanır",
noQuotaData: "Bu hesap için henüz kota verisi yok.",
},
},
// Toast Messages
toast: null,
// OAuth Progress
oauthProgress: {
active: false,
current: 0,
max: 60,
cancel: null
},
t(key, params = {}) {
let str = this.translations[this.lang][key] || key;
if (typeof str === 'string') {
Object.keys(params).forEach(p => {
str = str.replace(`{${p}}`, params[p]);
});
}
return str;
},
setLang(l) {
this.lang = l;
localStorage.setItem('app_lang', l);
},
showToast(message, type = 'info') {
const id = Date.now();
this.toast = { message, type, id };
setTimeout(() => {
if (this.toast && this.toast.id === id) this.toast = null;
}, 3000);
}
});
});