Localize the deploy wizard.

Move the multi-step deploy wizard (app type/runtime, source, versions &
database, optional services, resources & cluster assignment, custom
domain + DNS, env vars, cost/payment, review and the provisioning
overlay) onto a dashboard.deployWizard dictionary, with localized runtime
descriptions, billing cycles, stage labels and RTL-aware controls.

This completes full fa-IR/en-US localization of the dashboard.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
keyhan
2026-06-12 00:48:45 +03:30
parent aca69fc5e6
commit e43274e9a2
4 changed files with 483 additions and 257 deletions
File diff suppressed because it is too large Load Diff
+129
View File
@@ -1157,6 +1157,135 @@ const en: Dictionary = {
revision: 'Revision', hoursUnit: '{n} hours', revision: 'Revision', hoursUnit: '{n} hours',
payFromWalletBtn: 'Pay from wallet', applyDirectly: 'Apply directly', payFromWalletBtn: 'Pay from wallet', applyDirectly: 'Apply directly',
}, },
deployWizard: {
cycles: { hourly: 'Hourly', monthly: 'Monthly', yearly: 'Yearly' },
deployNewApp: 'Deploy New Application',
followSteps: 'Follow the steps to deploy your app to the cloud.',
basicInfo: 'Basic Information',
appType: 'Application Type',
appName: 'Application Name',
descriptionOptional: 'Description (optional)',
whatDoesApp: 'What does this app do?',
nameHint: 'Lowercase letters, numbers, and hyphens only',
source: 'Source',
sourceCode: 'Source Code',
gitRepository: 'Git Repository',
uploadZip: 'Upload ZIP',
uploadAZip: 'Upload a ZIP',
repositoryUrl: 'Repository URL',
branch: 'Branch',
accessToken: 'Access Token',
auth: 'Auth',
tokenProvided: 'Token provided',
versionsDatabase: 'Versions & Database',
runtime: 'Runtime',
nodeVersion: 'Node.js Version', phpVersion: 'PHP Version', pythonVersion: 'Python Version',
goVersion: 'Go Version', wordpressVersion: 'WordPress Version',
database: 'Database',
databaseCredentials: 'Database Credentials',
dbUsername: 'DB Username', dbPassword: 'DB Password', dbStorage: 'DB Storage', dbDump: 'DB Dump',
databaseStorageSize: 'Database Storage Size',
username: 'Username', password: 'Password', autoGenerated: 'Auto-generated',
generatePassword: 'Generate random password',
dbCredsNote: 'These credentials are used for internal cluster communication only. The database is not exposed externally.',
optionalDbDump: 'Optional: Upload DB dump to restore at creation',
uploadSqlNote: 'Upload a SQL dump to be restored after the database is created',
uploadDbDumpHint: 'You can also upload a SQL database dump in the next step to restore your data.',
optionalServices: 'Optional Services',
configurePerService: 'Configure resources for each enabled service separately from your application.',
redisResources: 'Redis resources', rabbitmqResources: 'RabbitMQ resources',
centralizedLogging: 'Centralized logging', logsViaFluentBit: 'Logs collected via Fluent Bit sidecar',
logFilePaths: 'Log File Paths',
specifyLogFiles: 'Specify which log files to collect. Leave empty for default paths based on runtime.',
defaultPathsByRuntime: 'Default paths by runtime:',
resourcesConfig: 'Resources & Configuration',
applicationWorkload: 'Application workload',
cpu: 'CPU', memory: 'Memory', storage: 'Storage', replicas: 'Replicas', port: 'Port',
cpuRequest: 'CPU Request', cpuLimit: 'CPU Limit', memoryRequest: 'Memory Request', memoryLimit: 'Memory Limit',
clusterAssignment: 'Cluster Assignment',
useDefaultCluster: 'Use default cluster', defaultClusterUsed: 'Default cluster will be used',
pickSpecificCluster: 'Pick a specific cluster', pickClusterPool: 'Pick a cluster pool',
loadBalanced: 'Load Balanced', cluster: 'Cluster',
noClustersAvailable: 'No clusters available', noClusterPools: 'No cluster pools configured',
askAdminPool: 'Ask your admin to create a cluster pool', defaultClusterWillBeUsed: 'Default cluster will be used',
customDomain: 'Custom Domain', domainAddress: 'Domain Address',
dnsSetupRequired: 'DNS Setup Required', dnsNotVerified: 'DNS Not Verified', verifyDnsRecords: 'Verify DNS Records',
checkingDns: 'Checking DNS...', dnsVerified: 'DNS verified!', dnsVerifiedProceed: 'DNS verified! You can proceed.',
mustVerifyDns: 'You must verify DNS before proceeding. SSL will be provisioned automatically after deployment.',
requiredCnameRecord: 'Required CNAME record:',
record: 'record:', typeColon: 'Type:', nameHost: 'Name/Host:', valueColon: 'Value:', cnameTarget: 'CNAME Target:', versionColon: 'Version:',
yourPlatformDomain: 'your app Platform Domain (after creation)',
environmentVariables: 'Environment Variables', envVars: 'Env Vars',
uploadEnvFile: 'Upload .env file', add: 'Add', clear: 'Clear', remove: 'Remove',
reviewDeploy: 'Review & Deploy',
costEstimate: 'Cost Estimate', calculating: 'Calculating...', breakdown: 'Breakdown',
additionalCharges: 'Additional charges (you pay)', coveredByCredit: 'Covered by prepaid credit',
customDomainFee: 'Custom domain fee:', feeIncludedNote: 'This fee is included in the total cost calculation.',
prepaidCreditApplied: 'Prepaid credit applied', prepaidCreditPricing: 'Prepaid credit pricing',
deployWithCredit: 'Deploy with prepaid credit',
noChargeCovered: 'No additional charges — fully covered.',
noPaymentCredit: 'No payment required — your prepaid resource credit covers this deployment.',
noPricingPlans: 'No pricing plans defined yet',
paymentMethod: 'Payment Method', payFromWallet: 'Pay from Wallet', payNow: 'Pay Now', onlineGateway: 'Online payment gateway',
insufficientBalance: 'Insufficient balance', toman: 'Toman',
payDeploy: 'Pay & Deploy', deployApplication: 'Deploy Application',
processingPayment: 'Processing payment', creatingApplication: 'Creating application', startingDeployment: 'Starting deployment',
stageCreating: 'Creating application...', stageUploadingSource: 'Uploading source code...',
stageUploadingDb: 'Uploading database dump...', stagePaying: 'Processing payment...',
stageDeploying: 'Starting deployment...', stageRedirecting: 'Redirecting...', stageError: 'An error occurred',
deploymentFailed: 'Deployment Failed', success: 'Success!', deployingApplication: 'Deploying Application',
appTypeApplication: 'Application', appTypeDatabase: 'Database',
inMemoryCache: 'In-memory cache & store', messageBroker: 'Message broker',
wordpressOfficial: 'WordPress (Official Image)',
freshInstall: 'Fresh Install', migrateExisting: 'Migrate Existing Site',
freshInstallNote: 'Start with a clean WordPress. Install themes & plugins via the admin panel.',
migrateNote: 'Upload your WordPress files (wp-content, themes, plugins) and optionally a DB dump.',
dragWpZip: 'Drag & drop your WordPress ZIP here',
dragProjectZip: 'Drag & drop your project ZIP here',
stratLeastApps: 'Least Apps', stratLeastLoaded: 'Least Loaded', stratRoundRobin: 'Round Robin',
stratWeightedRR: 'Weighted RR', stratWeightedResource: 'Weighted Resource', stratRegionBased: 'Region Based',
default: 'Default', manual: 'Manual', none: 'None',
appCreatedDeploying: 'Application created! Triggering deployment...',
paymentSuccessDeploying: 'Payment successful! Deploying...',
insufficientWallet: 'Insufficient wallet balance. Please top up or use payment gateway.',
archiveMax10: 'Archive must be at most 10 GB', fileMax10: 'File size must be at most 10 GB',
onlyZipAllowed: 'Only .zip or .tar.gz files are allowed', envReadFailed: 'Failed to read environment file',
dnsCheckFailed: 'Failed to check DNS. Please try again.',
allowedDumpFormats: 'Allowed: .sql, .gz, .dump', maxSize500: 'Max 500MB',
storageTooSmall: 'Storage too small',
anyCustom: 'Any custom',
ofYourEntire: 'of your entire',
uploadAZipContaining: 'Upload a ZIP containing your WordPress files. Supported structures:',
zipWithFullRoot: 'ZIP with full WordPress root (',
filesAtRoot: 'files at root level',
directoryFullRoot: 'directory (the full WordPress root):',
zipWith: 'ZIP with',
containingWpFiles: ' containing your WordPress files. Supported structures:',
wpContentDesc: ' — themes, plugins, uploads',
wpConfigDesc: ' — custom configuration (optional)',
anyCustomA: 'Any custom ', anyCustomB: ' files at root level',
folderMax10: ' folder • Max 10 GB',
fullRootSuffix: ', ...) • Max 10 GB',
invalidDomainFormat: 'Invalid domain format. Use a format like example.com or www.example.com',
dnsNotConfigured: 'DNS records are not configured correctly. Please set up the CNAME record and wait for propagation before proceeding.',
dnsVerifyFailed: 'Failed to verify DNS. Please check your domain settings and try again.',
platformDomainArrow: 'your app Platform Domain (after creation)',
runtimeDescs: {
nodejs: 'Express, NestJS, Fastify',
laravel: 'PHP, Composer, Artisan',
wordpress: 'Official image',
go: 'Gin, Echo, Fiber',
python: 'Flask, FastAPI',
django: 'Python web framework',
php: 'Plain PHP apps',
dotnet: 'ASP.NET Core',
},
noValidEnvVars: 'No valid environment variables found in file',
appDataStorage: 'Application data storage',
wordpressFreshInstall: 'WordPress (Fresh Install)',
automaticAllocator: 'Automatic allocator',
back: 'Back', next: 'Next',
},
}, },
}; };
+135
View File
@@ -1169,6 +1169,141 @@ const fa = {
revision: 'نسخهٔ', hoursUnit: '{n} ساعت', revision: 'نسخهٔ', hoursUnit: '{n} ساعت',
payFromWalletBtn: 'پرداخت از کیف‌پول', applyDirectly: 'اعمال مستقیم', payFromWalletBtn: 'پرداخت از کیف‌پول', applyDirectly: 'اعمال مستقیم',
}, },
deployWizard: {
cycles: { hourly: 'ساعتی', monthly: 'ماهانه', yearly: 'سالانه' },
deployNewApp: 'انتشار اپلیکیشن جدید',
followSteps: 'برای انتشار اپت روی ابر، مراحل را دنبال کن.',
basicInfo: 'اطلاعات پایه',
appType: 'نوع اپلیکیشن',
appName: 'نام اپلیکیشن',
descriptionOptional: 'توضیحات (اختیاری)',
whatDoesApp: 'این اپ چه کاری انجام می‌دهد؟',
nameHint: 'فقط حروف کوچک، اعداد و خط تیره',
source: 'منبع',
sourceCode: 'سورس‌کد',
gitRepository: 'مخزن Git',
uploadZip: 'آپلود ZIP',
uploadAZip: 'آپلود یک ZIP',
repositoryUrl: 'آدرس مخزن',
branch: 'شاخه',
accessToken: 'توکن دسترسی',
auth: 'احراز هویت',
tokenProvided: 'توکن داده شد',
versionsDatabase: 'نسخه‌ها و دیتابیس',
runtime: 'رانتایم',
nodeVersion: 'نسخهٔ Node.js', phpVersion: 'نسخهٔ PHP', pythonVersion: 'نسخهٔ Python',
goVersion: 'نسخهٔ Go', wordpressVersion: 'نسخهٔ WordPress',
database: 'دیتابیس',
databaseCredentials: 'اطلاعات ورود دیتابیس',
dbUsername: 'نام کاربری دیتابیس', dbPassword: 'رمز دیتابیس', dbStorage: 'فضای دیتابیس', dbDump: 'dump دیتابیس',
databaseStorageSize: 'اندازهٔ فضای ذخیرهٔ دیتابیس',
username: 'نام کاربری', password: 'رمز عبور', autoGenerated: 'تولید خودکار',
generatePassword: 'تولید رمز تصادفی',
dbCredsNote: 'این اطلاعات فقط برای ارتباط داخلی کلاستر استفاده می‌شوند. دیتابیس به‌صورت خارجی expose نمی‌شود.',
optionalDbDump: 'اختیاری: آپلود dump دیتابیس برای بازیابی هنگام ساخت',
uploadSqlNote: 'یک SQL dump آپلود کن تا پس از ساخت دیتابیس بازیابی شود',
uploadDbDumpHint: 'در مرحلهٔ بعد می‌توانی یک dump دیتابیس SQL برای بازیابی داده‌هایت آپلود کنی.',
optionalServices: 'سرویس‌های اختیاری',
configurePerService: 'منابع هر سرویسِ فعال را جدا از اپلیکیشن خود پیکربندی کن.',
redisResources: 'منابع Redis', rabbitmqResources: 'منابع RabbitMQ',
centralizedLogging: 'لاگینگ متمرکز', logsViaFluentBit: 'لاگ‌ها از طریق سایدکار Fluent Bit جمع‌آوری می‌شوند',
logFilePaths: 'مسیر فایل‌های لاگ',
specifyLogFiles: 'مشخص کن کدام فایل‌های لاگ جمع‌آوری شوند. برای مسیرهای پیش‌فرض بر اساس رانتایم، خالی بگذار.',
defaultPathsByRuntime: 'مسیرهای پیش‌فرض بر اساس رانتایم:',
resourcesConfig: 'منابع و پیکربندی',
applicationWorkload: 'workload اپلیکیشن',
cpu: 'CPU', memory: 'حافظه', storage: 'فضای ذخیره', replicas: 'رپلیکاها', port: 'پورت',
cpuRequest: 'درخواست CPU', cpuLimit: 'محدودیت CPU', memoryRequest: 'درخواست حافظه', memoryLimit: 'محدودیت حافظه',
clusterAssignment: 'تخصیص کلاستر',
useDefaultCluster: 'استفاده از کلاستر پیش‌فرض', defaultClusterUsed: 'کلاستر پیش‌فرض استفاده خواهد شد',
pickSpecificCluster: 'انتخاب یک کلاستر مشخص', pickClusterPool: 'انتخاب یک پول کلاستر',
loadBalanced: 'متوازن‌شده', cluster: 'کلاستر',
noClustersAvailable: 'کلاستری در دسترس نیست', noClusterPools: 'هیچ پول کلاستری پیکربندی نشده',
askAdminPool: 'از مدیر بخواه یک پول کلاستر بسازد', defaultClusterWillBeUsed: 'کلاستر پیش‌فرض استفاده خواهد شد',
customDomain: 'دامنهٔ اختصاصی', domainAddress: 'آدرس دامنه',
dnsSetupRequired: 'تنظیم DNS لازم است', dnsNotVerified: 'DNS تأیید نشده', verifyDnsRecords: 'تأیید رکوردهای DNS',
checkingDns: 'در حال بررسی DNS…', dnsVerified: 'DNS تأیید شد', dnsVerifiedProceed: 'DNS تأیید شد! می‌توانی ادامه بدهی.',
mustVerifyDns: 'پیش از ادامه باید DNS را تأیید کنی. SSL پس از انتشار به‌صورت خودکار صادر می‌شود.',
requiredCnameRecord: 'رکورد CNAME موردنیاز:',
record: 'رکورد:', typeColon: 'نوع:', nameHost: 'نام/هاست:', valueColon: 'مقدار:', cnameTarget: 'مقصد CNAME:', versionColon: 'نسخه:',
yourPlatformDomain: 'دامنهٔ پلتفرمِ اپت (پس از ساخت)',
environmentVariables: 'متغیرهای محیطی', envVars: 'متغیرهای محیط',
uploadEnvFile: 'آپلود فایل .env', add: 'افزودن', clear: 'پاک‌کردن', remove: 'حذف',
reviewDeploy: 'بررسی و انتشار',
costEstimate: 'برآورد هزینه', calculating: 'در حال محاسبه…', breakdown: 'تفکیک',
additionalCharges: 'هزینه‌های اضافه (پرداختی شما)', coveredByCredit: 'پوشش‌داده‌شده با اعتبار پیش‌پرداخت',
customDomainFee: 'هزینهٔ دامنهٔ اختصاصی:', feeIncludedNote: 'این هزینه در محاسبهٔ هزینهٔ کل لحاظ شده است.',
prepaidCreditApplied: 'اعتبار پیش‌پرداخت اعمال شد', prepaidCreditPricing: 'قیمت‌گذاری اعتبار پیش‌پرداخت',
deployWithCredit: 'انتشار با اعتبار پیش‌پرداخت',
noChargeCovered: 'بدون هزینهٔ اضافه — کاملاً پوشش داده شده.',
noPaymentCredit: 'نیازی به پرداخت نیست — اعتبار منابع پیش‌پرداختت این انتشار را پوشش می‌دهد.',
noPricingPlans: 'هنوز پلن قیمتی تعریف نشده',
paymentMethod: 'روش پرداخت', payFromWallet: 'پرداخت از کیف‌پول', payNow: 'پرداخت', onlineGateway: 'درگاه پرداخت آنلاین',
insufficientBalance: 'موجودی ناکافی', toman: 'تومان',
payDeploy: 'پرداخت و انتشار', deployApplication: 'انتشار اپلیکیشن',
processingPayment: 'در حال پردازش پرداخت', creatingApplication: 'ساخت اپلیکیشن', startingDeployment: 'شروع انتشار',
stageCreating: 'در حال ساخت اپلیکیشن…', stageUploadingSource: 'در حال آپلود سورس‌کد…',
stageUploadingDb: 'در حال آپلود dump دیتابیس…', stagePaying: 'در حال پردازش پرداخت…',
stageDeploying: 'در حال شروع انتشار…', stageRedirecting: 'در حال انتقال…', stageError: 'خطایی رخ داد',
deploymentFailed: 'انتشار ناموفق بود', success: 'موفق!', deployingApplication: 'در حال انتشار اپلیکیشن',
// app types
appTypeApplication: 'اپلیکیشن', appTypeDatabase: 'دیتابیس',
// service types descriptions
inMemoryCache: 'کش و ذخیرهٔ درون‌حافظه‌ای', messageBroker: 'بروکر پیام',
// wordpress
wordpressOfficial: 'WordPress (ایمیج رسمی)',
freshInstall: 'نصب تازه', migrateExisting: 'انتقال سایت موجود',
freshInstallNote: 'با یک WordPress تمیز شروع کن. تم‌ها و افزونه‌ها را از پنل مدیریت نصب کن.',
migrateNote: 'فایل‌های WordPress خود (wp-content، تم‌ها، افزونه‌ها) و در صورت تمایل یک dump دیتابیس را آپلود کن.',
dragWpZip: 'فایل ZIP وردپرس خود را اینجا بکش و رها کن',
dragProjectZip: 'فایل ZIP پروژهٔ خود را اینجا بکش و رها کن',
// strategies
stratLeastApps: 'کمترین اپ', stratLeastLoaded: 'کم‌بارترین', stratRoundRobin: 'چرخشی',
stratWeightedRR: 'چرخشی وزن‌دار', stratWeightedResource: 'منابع وزن‌دار', stratRegionBased: 'بر اساس منطقه',
default: 'پیش‌فرض', manual: 'دستی', none: 'هیچ‌کدام',
// toasts
appCreatedDeploying: 'اپلیکیشن ساخته شد! در حال آغاز انتشار…',
paymentSuccessDeploying: 'پرداخت موفق! در حال انتشار…',
insufficientWallet: 'موجودی کیف‌پول کافی نیست. لطفاً شارژ کن یا از درگاه پرداخت استفاده کن.',
archiveMax10: 'آرشیو باید حداکثر ۱۰ گیگابایت باشد', fileMax10: 'حجم فایل باید حداکثر ۱۰ گیگابایت باشد',
onlyZipAllowed: 'فقط فایل‌های .zip یا .tar.gz مجاز هستند', envReadFailed: 'خواندن فایل محیطی ناموفق بود',
dnsCheckFailed: 'بررسی DNS ناموفق بود. لطفاً دوباره تلاش کن.',
allowedDumpFormats: 'مجاز: .sql، .gz، .dump', maxSize500: 'حداکثر ۵۰۰ مگابایت',
storageTooSmall: 'فضای ذخیره خیلی کم است',
// misc fragments
anyCustom: 'هر',
ofYourEntire: 'از کل',
uploadAZipContaining: 'یک ZIP حاوی فایل‌های WordPress خود آپلود کن. ساختارهای پشتیبانی‌شده:',
zipWithFullRoot: 'ZIP با ریشهٔ کامل WordPress (',
filesAtRoot: 'فایل‌ها در سطح ریشه',
directoryFullRoot: 'پوشه (ریشهٔ کامل WordPress):',
zipWith: 'ZIP با',
containingWpFiles: ' حاوی فایل‌های WordPress خود. ساختارهای پشتیبانی‌شده:',
wpContentDesc: ' — تم‌ها، افزونه‌ها، آپلودها',
wpConfigDesc: ' — پیکربندی سفارشی (اختیاری)',
anyCustomA: 'هر فایل ', anyCustomB: ' سفارشی در سطح ریشه',
folderMax10: ' پوشه • حداکثر ۱۰ گیگابایت',
fullRootSuffix: '، ...) • حداکثر ۱۰ گیگابایت',
invalidDomainFormat: 'فرمت دامنه نامعتبر است. از فرمتی مثل example.com یا www.example.com استفاده کن',
dnsNotConfigured: 'رکوردهای DNS درست تنظیم نشده‌اند. رکورد CNAME را تنظیم کن و پیش از ادامه منتظر انتشار آن بمان.',
dnsVerifyFailed: 'تأیید DNS ناموفق بود. تنظیمات دامنه‌ات را بررسی کن و دوباره تلاش کن.',
platformDomainArrow: 'دامنهٔ پلتفرمِ اپت (پس از ساخت)',
runtimeDescs: {
nodejs: 'Express، NestJS، Fastify',
laravel: 'PHP، Composer، Artisan',
wordpress: 'تصویر رسمی',
go: 'Gin، Echo، Fiber',
python: 'Flask، FastAPI',
django: 'فریم‌ورک وب پایتون',
php: 'اپ‌های PHP ساده',
dotnet: 'ASP.NET Core',
},
noValidEnvVars: 'هیچ متغیر محیطی معتبری در فایل پیدا نشد',
appDataStorage: 'فضای ذخیرهٔ دادهٔ اپلیکیشن',
wordpressFreshInstall: 'WordPress (نصب تازه)',
automaticAllocator: 'تخصیص‌دهندهٔ خودکار',
back: 'بازگشت', next: 'بعدی',
},
}, },
}; };
File diff suppressed because one or more lines are too long