Localize applications and services list pages.

Move the apps and managed-services list pages onto the i18n dictionaries
(titles, table headers, lifecycle/expiry labels, delete confirmations,
toast messages) and the locale-aware Link, reusing the shared status and
lifecycle/expiry copy. Add RTL-aware table alignment and icon spacing.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
keyhan
2026-06-11 12:28:59 +03:30
parent e0964e6528
commit 2bc86c03b8
5 changed files with 181 additions and 73 deletions
+43
View File
@@ -206,6 +206,49 @@ const en: Dictionary = {
replica: 'replica',
replicaPlural: 'replicas',
},
apps: {
title: 'My Applications',
count: '{n} application(s)',
newApplication: 'New Application',
noApplications: 'No applications yet',
emptyDesc: 'Deploy your first application to get started.',
deployFirst: 'Deploy your first app',
colApplication: 'Application',
colRuntime: 'Runtime',
colStatus: 'Status',
colServiceStatus: 'Service Status',
colExpiry: 'Expiry',
colActions: 'Actions',
view: 'View',
lifecycle: {
active: 'Active',
suspended: 'Suspended — Unpaid',
pending_deletion: 'Pending Deletion',
deleted: 'Deleted',
},
expired: 'Expired',
daysHours: '{d}d {h}h remaining',
hours: '{h}h remaining',
mins: '{m}m remaining',
noPlan: 'No plan',
deleteTitle: 'Delete Application',
deleteMessage:
'Permanently delete “{name}” and all its data?\n\nIf your plan still has time left, the prepaid resources will appear on your dashboard for use on a new app at no extra charge.',
deleted: 'Application deleted',
deletedWithCredit: 'Application deleted. Your prepaid resources are shown on the dashboard.',
},
services: {
title: 'Databases & Services',
subtitle: 'Standalone databases, Redis, and RabbitMQ — {n} service(s)',
newService: 'New Service',
noServices: 'No managed services yet',
emptyDesc: 'Provision a database, Redis, or RabbitMQ without deploying a full application.',
createFirst: 'Create your first service',
deleteTitle: 'Delete service?',
deleteMessage: 'Permanently delete “{name}”? This cannot be undone.',
deleted: 'Service deleted',
deletedWithCredit: 'Service deleted. Prepaid resources are on your dashboard.',
},
},
};
+43
View File
@@ -205,6 +205,49 @@ const fa = {
replica: 'نمونه',
replicaPlural: 'نمونه',
},
apps: {
title: 'اپلیکیشن‌های من',
count: '{n} اپلیکیشن',
newApplication: 'اپلیکیشن جدید',
noApplications: 'هنوز اپلیکیشنی نداری',
emptyDesc: 'برای شروع، اولین اپلیکیشنت را منتشر کن.',
deployFirst: 'اولین اپت را منتشر کن',
colApplication: 'اپلیکیشن',
colRuntime: 'محیط اجرا',
colStatus: 'وضعیت',
colServiceStatus: 'وضعیت سرویس',
colExpiry: 'انقضا',
colActions: 'عملیات',
view: 'مشاهده',
lifecycle: {
active: 'فعال',
suspended: 'معلق — پرداخت‌نشده',
pending_deletion: 'در انتظار حذف',
deleted: 'حذف‌شده',
},
expired: 'منقضی شده',
daysHours: '{d} روز و {h} ساعت باقی‌مانده',
hours: '{h} ساعت باقی‌مانده',
mins: '{m} دقیقه باقی‌مانده',
noPlan: 'بدون پلن',
deleteTitle: 'حذف اپلیکیشن',
deleteMessage:
'اپلیکیشن «{name}» و همهٔ داده‌هایش برای همیشه حذف شود؟\n\nاگر از پلنت زمان باقی مانده باشد، منابع پیش‌پرداخت‌شده روی داشبوردت نمایش داده می‌شود تا بدون هزینهٔ اضافه روی اپ جدید استفاده کنی.',
deleted: 'اپلیکیشن حذف شد',
deletedWithCredit: 'اپلیکیشن حذف شد. منابع پیش‌پرداختت روی داشبورد نمایش داده می‌شود.',
},
services: {
title: 'دیتابیس‌ها و سرویس‌ها',
subtitle: 'دیتابیس‌های مستقل، Redis و RabbitMQ — {n} سرویس',
newService: 'سرویس جدید',
noServices: 'هنوز سرویس مدیریت‌شده‌ای نداری',
emptyDesc: 'بدون انتشار یک اپلیکیشن کامل، یک دیتابیس، Redis یا RabbitMQ بساز.',
createFirst: 'اولین سرویست را بساز',
deleteTitle: 'حذف سرویس؟',
deleteMessage: 'سرویس «{name}» برای همیشه حذف شود؟ این عمل قابل بازگشت نیست.',
deleted: 'سرویس حذف شد',
deletedWithCredit: 'سرویس حذف شد. منابع پیش‌پرداختت روی داشبورد است.',
},
},
};