feat: add i18n framework with Indonesian translation support (#124)
* feat: add i18n support with separate translation files - Extract translations from store.js to separate files for easier management - Add translation files for English (en.js), Indonesian (id.js), Turkish (tr.js), and Chinese (zh.js) - Load translations via window.translations object before Alpine store initialization - Add Bahasa Indonesia option to language selector * feat: translate remaining hardcoded UI strings - Update index.html to use t() for Menu and GitHub labels - Update views to translate Tier, Quota, Live, tier badges, and close button - Update components to use translated error messages and confirmation dialogs - Update utils to use translated validation and error messages - Update app-init.js to use translated OAuth success/error messages
This commit is contained in:
committed by
GitHub
parent
9ffb83ab74
commit
e2d03f9b25
327
public/js/translations/en.js
Normal file
327
public/js/translations/en.js
Normal file
@@ -0,0 +1,327 @@
|
||||
/**
|
||||
* English Translations
|
||||
*/
|
||||
window.translations = window.translations || {};
|
||||
window.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",
|
||||
fix: "Fix",
|
||||
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.",
|
||||
// UI Elements
|
||||
pageTitle: "Antigravity Console",
|
||||
live: "Live",
|
||||
tier: "Tier",
|
||||
quota: "Quota",
|
||||
tierUltra: "Ultra",
|
||||
tierPro: "Pro",
|
||||
tierFree: "Free",
|
||||
menu: "Menu",
|
||||
github: "GitHub",
|
||||
noData: "No data",
|
||||
// Error Messages
|
||||
operationFailed: "Operation failed",
|
||||
unknownError: "Unknown error",
|
||||
presetNameRequired: "Preset name is required",
|
||||
saveFailed: "Save failed",
|
||||
failedToSavePreset: "Failed to save preset",
|
||||
noPresetSelected: "No preset selected",
|
||||
deletePresetConfirm: "Delete preset \"{name}\"?",
|
||||
failedToDeletePreset: "Failed to delete preset",
|
||||
failedToChangePassword: "Failed to change password",
|
||||
passwordChangedSuccess: "Password changed successfully",
|
||||
debugModeToggled: "Debug mode {status}",
|
||||
tokenCacheToggled: "Token cache {status}",
|
||||
failedToUpdateTokenCache: "Failed to update token cache",
|
||||
failedToUpdateDebugMode: "Failed to update debug mode",
|
||||
failedToRefreshAccount: "Failed to refresh account",
|
||||
failedToDeleteAccount: "Failed to delete account",
|
||||
failedToReloadAccounts: "Failed to reload accounts",
|
||||
failedToUpdateModelConfig: "Failed to update model config",
|
||||
fieldUpdated: "{displayName} updated to {value}",
|
||||
failedToUpdateField: "Failed to update {displayName}",
|
||||
// Validation Messages
|
||||
mustBeValidNumber: "{fieldName} must be a valid number",
|
||||
mustBeAtLeast: "{fieldName} must be at least {min}",
|
||||
mustBeAtMost: "{fieldName} must be at most {max}",
|
||||
cannotBeEmpty: "{fieldName} cannot be empty",
|
||||
mustBeTrueOrFalse: "Value must be true or false",
|
||||
};
|
||||
Reference in New Issue
Block a user