Localize database-config, snapshots panel and new-service wizard.

Add components.dbConfig / components.snapshots and dashboard.servicesNew
dictionaries; move the managed-database config (engine, credentials, dump
upload, storage), the snapshots panel and the three-step new-service
wizard onto them. validateDbDumpStorage now takes a localized template.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
keyhan
2026-06-11 19:22:37 +03:30
parent 63e368f464
commit 96d24b50a1
6 changed files with 334 additions and 114 deletions
+103
View File
@@ -252,6 +252,69 @@ const en: Dictionary = {
mShort: 'm',
sShort: 's',
},
dbConfig: {
engine: 'Database engine',
version: 'Version',
credentials: 'Database credentials',
credentialsOptional: '(optional — auto-generated if empty)',
username: 'Username',
usernamePlaceholder: 'appuser',
password: 'Password',
passwordPlaceholder: 'Auto-generated',
generatePassword: 'Generate random password',
credentialsNote: 'Used for internal cluster access. Use temporary or permanent external access below after deploy.',
uploadDumpLabel: 'Optional: upload DB dump to restore at creation',
remove: 'Remove',
uploadHint: 'Upload a SQL dump to be restored after the database is created',
uploadConstraints: 'Optional • Max 500MB • .sql, .gz, .dump',
allowedFormats: 'Allowed: .sql, .gz, .dump',
maxSize: 'Max 500MB',
storageSize: 'Database storage size',
suggestedFromDump: 'Suggested from dump ({gi} GiB min fit)',
minimumGb: 'Minimum {n} GB',
mustFitDump: ' (must fit the uploaded dump)',
expansionOnly: ' • Only expansion allowed after creation',
storageTooSmallTitle: 'Storage too small',
ok: 'OK',
storageTooSmallDetail: 'Your database dump is about {dumpGi} GiB. Database storage must be at least {need} GiB (you selected {selected} GiB). Increase database storage, then try again.',
},
snapshots: {
title: 'Snapshots',
newSnapshot: 'New Snapshot',
creating: 'Creating…',
hide: 'Hide',
show: 'Show',
deployFirst: 'Deploy the service first',
waitCurrent: 'Wait for the current backup to finish',
infoNote: 'Database snapshots store a SQL dump you can download later. When progress reaches 100%, use the download button. Up to 10 snapshots are kept; oldest are removed automatically.',
loadingBackups: 'Loading backups…',
noBackups: 'No backups yet',
noBackupsHint: 'Click New backup to create your first database dump.',
defaultLabel: 'Database backup',
auto: 'Auto',
manual: 'Manual',
dumping: 'Dumping…',
preparing: 'Preparing dump…',
exporting: 'Exporting database…',
finalizing: 'Finalizing…',
creatingDump: 'Creating database dump…',
dump: 'Dump',
downloadTitle: 'Download database dump',
deleteTitle: 'Delete backup',
removeFailedTitle: 'Remove failed backup',
maxKept: 'Maximum 10 backups are kept.',
backupReady: 'Backup ready — you can download the dump now',
backupFailed: 'Backup failed',
backupStarted: 'Backup started — dump in progress',
createFailed: 'Failed to create backup',
backupDeleted: 'Backup deleted',
deleteFailed: 'Failed to delete backup',
downloadStarted: 'Download started',
downloadFailed: 'Failed to download database dump',
deleteConfirmTitle: 'Delete backup?',
deleteConfirmMessage: 'Delete “{label}”? The dump file will be permanently removed.',
snapStatus: { completed: 'completed', failed: 'failed' },
},
},
nav: {
@@ -802,6 +865,46 @@ const en: Dictionary = {
hours: 'hours',
days: 'days',
},
servicesNew: {
steps: ['Service type', 'Configuration', 'Review & pay'],
title: 'New managed service',
subtitle: 'Database, Redis, or RabbitMQ — billed like applications',
typeDatabase: 'Database',
typeDatabaseDesc: 'PostgreSQL, MySQL, MariaDB, MongoDB',
typeRedis: 'Redis',
typeRedisDesc: 'In-memory cache & store',
typeRabbitmq: 'RabbitMQ',
typeRabbitmqDesc: 'Message broker',
serviceName: 'Service name',
serviceNamePlaceholder: 'my-database',
nameHint: 'Lowercase letters, numbers, and hyphens only',
redisVersion: 'Redis version',
rabbitmqVersion: 'RabbitMQ version',
redisResources: 'Redis resources',
rabbitmqResources: 'RabbitMQ resources',
billingCycle: 'Billing cycle',
cycles: { hourly: 'Hourly', monthly: 'Monthly', yearly: 'Yearly' },
paymentMethod: 'Payment method',
wallet: 'Wallet',
insufficient: 'Insufficient',
payNow: 'Pay now',
pricingUnavailable: 'Pricing unavailable',
back: 'Back',
next: 'Next',
payProvision: 'Pay & provision',
provisioning: 'Provisioning service',
creatingService: 'Creating service',
uploadingDump: 'Uploading database dump',
payment: 'Payment',
deploying: 'Deploying',
provisionedSuccess: 'Service provisioned successfully',
deployFailed: 'Deploy failed',
paySucceededDeployFailed: 'Payment succeeded but deployment failed',
payProvisionFailed: 'Payment or provisioning failed',
payFailed: 'Payment failed',
insufficientBalance: 'Insufficient wallet balance',
serviceDesc: 'Service: {name} ({cycle})',
},
},
};