Localize the application detail page.

Move the largest dashboard page (app detail) onto a dashboard.appDetail
dictionary: header actions, status/lifecycle banners, configuration,
deployment history, source upload, custom-domain + DNS guide, resources
& scaling, storage, rollback/snapshots, DB restore, service credentials,
renewal and upgrade modals — with localized statuses, locale-aware dates
and RTL-aware layout.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
keyhan
2026-06-11 23:45:16 +03:30
parent 8d423f8224
commit aca69fc5e6
4 changed files with 567 additions and 305 deletions
+140
View File
@@ -1017,6 +1017,146 @@ const en: Dictionary = {
insufficientRenew: 'Insufficient wallet balance. Top up your wallet or pay via invoice.',
cycles: { hourly: 'Hourly', monthly: 'Monthly', yearly: 'Yearly' },
},
appDetail: {
productTypeApp: 'Application',
cycles: { hourly: 'Hourly', monthly: 'Monthly', yearly: 'Yearly' },
deploy: 'Deploy', redeploy: 'Redeploy', start: 'Start', stop: 'Stop', restart: 'Restart',
preview: 'Preview', delete: 'Delete', renewNow: 'Renew Now', renewApplication: 'Renew Application',
rebuildTitle: 'Rebuild from latest source code', instantRollback: 'Instant rollback',
deploymentTriggered: 'Deployment triggered!', deployFailed: 'Failed to trigger deployment',
redeployStarted: 'Redeploy started', redeployFailed: 'Failed to trigger redeploy',
appStarted: 'Application started', startFailed: 'Failed to start application',
appStopped: 'Application stopped', stopFailed: 'Failed to stop application',
appRestarting: 'Application restarting...', restartFailed: 'Failed to restart application',
sourceUploaded: 'Source code uploaded successfully!', uploadFailed: 'Failed to upload source code',
uploadSourceFirst: 'Upload source code and click Deploy to get started',
sourceCodeUploaded: 'Source code uploaded',
fileMax10: 'File size must be at most 10 GB', fileZipOnly: 'Please upload a .zip or .tar.gz file',
previewHttps: 'Preview opened on HTTPS preview domain.', previewPort: 'Preview opened on port {port}',
previewFailed: 'Failed to get preview URL. Make sure the app is deployed.',
domainSet: 'Domain set. Please configure your DNS records.',
domainVerified: 'Domain verified successfully!',
customDomainRemoved: 'Custom domain removed',
removeDomainTitle: 'Remove Custom Domain',
removeDomainConfirm: 'Are you sure you want to remove "{domain}"? The website will only be accessible via the platform domain.',
remove: 'Remove',
copied: 'Copied!', copy: 'Copy',
resourcesUpdated: 'Resources updated', updateResourcesFailed: 'Failed to update resources',
resourcesUpdatedSuccess: 'Resources updated successfully!', noChanges: 'No changes to apply',
renewFirst: 'Renew the application before changing resources',
upgradedPaid: 'Resources upgraded! Paid {amount} Toman',
upgradeFailed: 'Failed to upgrade resources', calcFailed: 'Failed to calculate upgrade cost',
invoiceCreated: 'Invoice created. Choose how you want to pay.', invoiceFailed: 'Failed to create upgrade invoice',
dbRestored: 'Database restored successfully!', dbInvalidFile: 'Please upload a .sql, .dump, or .gz file',
fileMax500: 'File size must be less than 500MB', dbUploadFailed: 'Failed to upload database dump',
snapshotStarted: 'Snapshot creation started', snapshotCreateFailed: 'Failed to create snapshot',
snapshotDeleted: 'Snapshot deleted', snapshotDeleteFailed: 'Failed to delete snapshot',
deleteSnapshotTitle: 'Delete snapshot?', deleteSnapshotMessage: 'Delete "{label}"? The archived files will be permanently removed.',
deleteSnapshot: 'Delete snapshot',
rollbackFailed: 'Rollback failed', rollbackCompleted: 'Rollback completed:\n',
rollbackSnapTitle: 'Rollback to "{label}"?',
rollbackSnapMessage: 'This will restore:\n• App deployment via K8s revision (instant)\n• wp-content files (WordPress)\n• Database dump\n\nThe current state will be overwritten.',
rollbackRevTitle: 'Rollback to Revision {n}?',
rollbackRevMessage: 'This will rollback the Helm release to revision {n}.{cause}\n\nNo rebuild needed — takes effect in seconds.',
description: 'Description',
deleteAppTitle: 'Delete "{name}"?',
deleteAppMessage: 'This will permanently remove all Kubernetes resources, data, and deployment records.\n\n',
deleteAppCredit: 'Your remaining paid resources will appear on the dashboard for use on a new app at no extra charge.',
appDeleted: 'Application deleted', appDeletedCredit: 'Application deleted. Prepaid resources are on your dashboard.',
deleteAppFailed: 'Failed to delete application',
downloadInProgress: 'A download is already in progress. Please wait.',
downloading: 'Downloading {name}... This may take up to 15 minutes for large files.',
downloadedSuccess: '{name} downloaded successfully!',
downloadTimeout: 'Download timed out after 15 minutes. Try again or check server logs.',
downloadFailed: 'Failed to download {name}', downloadCurrentFailed: 'Failed to download current {name}',
configuration: 'Configuration', runtime: 'Runtime', image: 'Image', status: 'Status',
cpu: 'CPU', memory: 'Memory', replicas: 'Replicas', cluster: 'Cluster', pool: 'Pool', workload: 'Workload', port: 'Port',
cpuRequest: 'CPU Request', cpuLimit: 'CPU Limit', memoryRequest: 'Memory Request', memoryLimit: 'Memory Limit',
database: 'Database', databaseVolume: 'Database volume', gitConnected: 'Git repository connected',
deployMarker: 'Deploy marker', billing: 'Billing', name: 'Name', domain: 'Domain',
deploymentHistory: 'Deployment History', noDeployments: 'No deployments yet',
uploadToStart: 'Upload source code and click Deploy to get started',
sourceCode: 'Source Code', replace: 'Replace', uploadSourceClick: 'Upload source code and click Deploy to get started',
customDomain: 'Custom Domain', addCustomDomain: 'Add Custom Domain', setUpCustomDomain: 'Set Up Custom Domain',
platformDomain: 'Platform Domain', domainPlaceholder: 'example.com or www.example.com', dnsSetupGuide: 'DNS Setup Guide',
removeCustomDomain: 'Remove Custom Domain',
resourcesScaling: 'Resources & Scaling', monitor: 'Monitor', hide: 'Hide', show: 'Show',
liveUsage: 'Live usage', loadingMetrics: 'Loading metrics...', metrics: 'Metrics', pods: 'Pods', ready: 'Ready',
noMetrics: 'No metrics yet', storageUsage: 'Storage Usage', loadingStorageMetrics: 'Loading storage metrics...',
noStorageData: 'No storage data available', storageMetricsUnavailable: 'Storage metrics unavailable',
used: 'Used', applyChanges: 'Apply Changes', applying: 'Applying...', processing: 'Processing...',
newSnapshot: 'New Snapshot', creating: 'Creating...',
k8sRevisions: 'K8s Revisions', fileSnapshots: 'File Snapshots', fullSnapshots: 'Full snapshots',
loadingRevisions: 'Loading revisions...', noRevisions: 'No revisions available',
revisionsAfterDeploy: 'Revisions appear after the first deployment.',
loadingSnapshots: 'Loading snapshots...', noSnapshots: 'No snapshots yet',
maxSnapshots: 'Maximum 10 snapshots are kept. Older snapshots are automatically deleted.',
rollback: 'Rollback', instant: 'Instant', current: 'Current', full: 'Full',
instantRollbackTitle: 'Instant rollback to this revision',
rollbackSnapTitleBtn: 'Rollback to this snapshot (uses K8s revision + restores DB/wp-content)',
downloadCurrentState: 'Download Current State',
downloadCurrentNote: 'Download a copy of the current live files without creating a snapshot. Large files may take up to 15 minutes.',
downloadSource: 'Download source code', downloadWpContent: 'Download wp-content', downloadDatabaseDump: 'Download database dump',
sourceCodeArtifact: 'Source code', databaseDump: 'Database Dump', downloading2: 'Downloading...',
restoreDatabaseDump: 'Restore Database Dump', uploadSqlToRestore: 'Upload SQL dump to restore',
restoringDatabase: 'Restoring database...', restoreOutput: 'Restore Output',
dbOnlyInternal: 'Database is only accessible within the cluster. Not exposed externally.',
serviceCredentials: 'Service Credentials', serviceCredsAfterDeploy: 'Service passwords are available after the application is deployed.',
password: 'Password',
logs: 'Logs',
planExpiringSoon: 'Plan Expiring Soon', planExpires: 'Plan expires: {date}', extendPlan: 'Extend Plan',
renewService: 'Renew Application', wallet: 'Wallet', walletBalance: 'Wallet Balance', payFromWallet: 'Pay from wallet',
insufficientRenew: 'Insufficient wallet balance. Top up your wallet or pay via invoice.',
bestForMost: 'Best for most users', saveUpTo20: 'Save up to 20%',
confirmResourceUpgrade: 'Confirm Resource Upgrade', currentHourlyCost: 'Current hourly cost', newHourlyCost: 'New hourly cost',
remainingHours: 'Remaining hours in period', proratedAmount: 'Prorated amount to pay',
feeIncludedNote: 'This fee is included in the total cost calculation.', thisMayTake: 'This may take a few minutes',
cancel: 'Cancel',
private: 'Private', active: 'Active',
deployingBtn: 'Deploying...',
adjustCpuMemStorage: 'Adjust CPU / memory & storage',
calculating: 'Calculating…',
connectionInfoInternal: 'Connection Info (Internal Cluster)',
createInvoicePay: 'Create Invoice & Pay',
customDomainPending: 'Custom Domain — Pending DNS Verification',
customDomainFee: 'Custom domain fee:',
dragDrop: 'Drag & drop a',
fileHereBrowse: 'file here, or click to browse',
expandDiskNote: 'Expand disk in Adjust CPU / memory & storage below.',
maxSize10gb: 'Max size: 10 GB',
maxSize500mb: 'Max size: 500MB',
payAsYouGo: 'Pay as you go, auto-renews',
pickComponentNote: 'Pick which component to update. CPU and memory apply per workload; storage can only grow (expand). The main application may use billing for paid upgrades; database and optional services apply directly in the cluster.',
rabbitmqVolume: 'RabbitMQ (optional) volume',
redisVolume: 'Redis (optional) volume',
rollbackSnapshots: 'Rollback & Snapshots',
snapshotsAutoNote: 'Snapshots are created automatically before each deploy, or you can create one manually.',
snapshotsIncludeNote: 'include source code, database dump, and wp-content. Use these to restore data or download backups. Auto-created before each deploy.',
revisionsHelmNote: 'using Helm release revisions. Switches to a previous configuration in seconds — no rebuild needed. Up to 10 revisions are kept.',
record: 'record:',
cpuColon: 'CPU:', memoryColon: 'Memory:', sidecars: 'Sidecars:',
typeColon: 'Type:', valueColon: 'Value:', nameHost: 'Name/Host:', cnameTarget: 'CNAME Target:',
orText: 'or',
verifyDns: 'Verify DNS', checking: 'Checking...',
dnsStep1: '1. Log in to your domain registrar (e.g. Cloudflare, Namecheap, GoDaddy)',
dnsStep2: '2. Go to DNS management for your domain',
dnsStep3a: '3. Add a ', dnsStep3b: ' record:',
dnsStep4a: '4. If using a root domain (without www), use a registrar that supports CNAME flattening (e.g. Cloudflare), or use ',
dnsStep4b: ' instead.',
dnsStep5: '5. Wait 530 minutes for DNS propagation (up to 48 hours in some cases)',
dnsStep6a: '6. Click the ', dnsStep6b: ' button above',
scheduledForDeletion: 'Application Scheduled for Deletion!',
suspendedPayment: 'Application Suspended — Payment Required',
willBeDeletedOn: 'This application will be permanently deleted on {date}. Renew now to prevent data loss.',
soon: 'soon',
planExpiredRestore: 'Your plan has expired. Renew to restore service access.',
planExpiresEarly: 'Your plan expires on {date}. Renew early to avoid service interruption.',
selectBillingCycle: 'Select a billing cycle to renew "{name}"',
toman: 'Toman', tomanPerHour: 'Toman/hour',
walletShortBy: 'Wallet is short by {n} Toman. You can pay the delta by gateway on the invoice page.',
revision: 'Revision', hoursUnit: '{n} hours',
payFromWalletBtn: 'Pay from wallet', applyDirectly: 'Apply directly',
},
},
};