Localize admin cluster and billing-plan pages.
Move the cluster management page (resource panel, tools install/uninstall flow, statuses/health) and the billing-plans page (pricing matrices, deploy defaults, add-ons, data-retention settings) onto the dictionaries with locale-aware dates and RTL-aware tables. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -581,6 +581,153 @@ const en: Dictionary = {
|
||||
clusterStatus: { active: 'active', inactive: 'inactive', error: 'error' },
|
||||
clusterHealth: { healthy: 'healthy', degraded: 'degraded', unhealthy: 'unhealthy', unknown: 'unknown' },
|
||||
},
|
||||
clusters: {
|
||||
title: 'Cluster Management',
|
||||
count: '{n} cluster(s) registered',
|
||||
addCluster: 'Add Cluster',
|
||||
registerNew: 'Register New Cluster',
|
||||
verifyNote: 'The system will verify the Kubernetes connection before registering.',
|
||||
name: 'Name',
|
||||
apiServer: 'API Server URL',
|
||||
region: 'Region',
|
||||
provider: 'Provider',
|
||||
selectProvider: 'Select provider',
|
||||
weight: 'Weight',
|
||||
tags: 'Tags',
|
||||
tagsPlaceholder: 'ssd, production, iran',
|
||||
description: 'Description',
|
||||
kubeconfig: 'Kubeconfig (YAML)',
|
||||
kubeconfigPlaceholder: 'Paste your kubeconfig here...',
|
||||
setDefault: 'Set as default cluster',
|
||||
verifying: 'Verifying connection & adding...',
|
||||
added: 'Cluster added & connection verified ✓',
|
||||
addFailed: 'Failed to add cluster',
|
||||
connectionOk: 'Connection OK — Kubernetes {version}',
|
||||
connectionFailed: 'Connection failed: {error}',
|
||||
testFailed: 'Failed to test connection',
|
||||
removed: 'Cluster removed',
|
||||
noClusters: 'No clusters registered yet.',
|
||||
noClustersHint: 'Add a Kubernetes cluster to start deploying applications.',
|
||||
defaultBadge: 'Default',
|
||||
healthBadge: 'health: {status}',
|
||||
weightBadge: 'weight {n}',
|
||||
resources: 'Resources',
|
||||
testing: 'Testing...',
|
||||
test: 'Test',
|
||||
remove: 'Remove',
|
||||
removeTitle: 'Remove Cluster',
|
||||
removeMessage: 'Are you sure you want to remove “{name}”?',
|
||||
loadingResources: 'Loading resources...',
|
||||
resourcesFailed: 'Failed to load resources',
|
||||
nodes: 'Nodes',
|
||||
pods: 'Pods',
|
||||
apps: 'Apps',
|
||||
totalCpu: 'Total CPU',
|
||||
cpuReserved: 'CPU Reserved',
|
||||
memReserved: 'Memory Reserved',
|
||||
memory: 'Memory',
|
||||
capacity: 'capacity',
|
||||
allocatable: 'allocatable',
|
||||
colName: 'Name',
|
||||
colStatus: 'Status',
|
||||
colRoles: 'Roles',
|
||||
colCpu: 'CPU (Cap / Alloc)',
|
||||
colMemory: 'Memory (Cap / Alloc)',
|
||||
toolsTitle: 'Tools Management',
|
||||
toolsSubtitle: 'Install and manage infrastructure tools per cluster. Nothing is installed automatically — add only what each cluster needs.',
|
||||
defaultSuffix: ' (default)',
|
||||
loadingTools: 'Loading tools…',
|
||||
toolsFailed: 'Failed to load tools for this cluster.',
|
||||
toolStatus: {
|
||||
installed: 'Installed',
|
||||
installing: 'Installing…',
|
||||
failed: 'Failed',
|
||||
not_installed: 'Not installed',
|
||||
unknown: 'Unknown',
|
||||
},
|
||||
requires: 'Requires:',
|
||||
uninstall: 'Uninstall',
|
||||
uninstalling: 'Removing…',
|
||||
install: 'Install',
|
||||
installing: 'Installing…',
|
||||
repair: 'Repair',
|
||||
confirmInstall: 'Confirm install',
|
||||
installRequiredFirst: 'Install required tools first',
|
||||
removeToolTitle: 'Remove {name}',
|
||||
removeToolMessage: 'Uninstall “{name}” from this cluster?',
|
||||
uninstallConfirm: 'Uninstall',
|
||||
installStarted: '{name} install started',
|
||||
installToolFailed: 'Failed to install {name}',
|
||||
toolRemoved: '{name} removed',
|
||||
removeToolFailed: 'Failed to remove {name}',
|
||||
fieldRequired: '{field} is required',
|
||||
clusterStatus: { active: 'active', maintenance: 'maintenance', inactive: 'inactive', error: 'error' },
|
||||
clusterHealth: { healthy: 'healthy', degraded: 'degraded', unhealthy: 'unhealthy', unknown: 'unknown' },
|
||||
na: 'N/A',
|
||||
},
|
||||
billing: {
|
||||
cycles: { hourly: 'Hourly', monthly: 'Monthly', yearly: 'Yearly' },
|
||||
resources: {
|
||||
base_fee: 'Base fee',
|
||||
cpu_per_core: 'CPU (per core)',
|
||||
memory_per_gb: 'Memory (per GB)',
|
||||
storage_per_gb: 'Storage (per GB)',
|
||||
database_addon: 'Database addon',
|
||||
redis_addon: 'Redis',
|
||||
rabbitmq_addon: 'RabbitMQ',
|
||||
elasticsearch_addon: 'Elasticsearch',
|
||||
custom_domain_addon: 'Custom domain + SSL',
|
||||
},
|
||||
resourceCol: 'Resource',
|
||||
title: 'Billing Plans',
|
||||
subtitle: 'Set unit prices per resource. Users choose CPU, memory, and storage when deploying; cost = their usage × these rates.',
|
||||
editPlans: 'Edit plans',
|
||||
saving: 'Saving...',
|
||||
save: 'Save',
|
||||
saved: 'Billing plans saved',
|
||||
saveFailed: 'Failed to save billing plans',
|
||||
howTitle: 'How billing works',
|
||||
howApps: 'Applications — user picks runtime resources in deploy; you set price per core, GB, base fee, and database addon. CPU and RAM in estimates bill proportionally (for example half the per-GB rate at half a gigabyte of memory).',
|
||||
howOptional: 'Optional services (Redis, RabbitMQ) — same unit matrix per service as runtimes; deploy wizard defaults are edited separately. CPU/RAM in the cost calculator bill in proportion to actual limits (e.g. 500Mi counts as 0.5× the per-GB memory rate).',
|
||||
howDefaults: 'Deploy defaults — optional prefill only; changing them does not change what existing apps pay unless the user chose those values at deploy.',
|
||||
noPricing: 'No pricing data',
|
||||
appRuntimes: 'Application runtimes',
|
||||
appRuntimesSub: 'Unit pricing per runtime (hourly / monthly / yearly)',
|
||||
unitPricesSuffix: '— unit prices',
|
||||
fillYearly: 'Fill yearly from monthly ×12',
|
||||
optionalServices: 'Optional services',
|
||||
optionalServicesSub: 'Unit pricing per service (hourly / monthly / yearly)',
|
||||
deployDefaults: 'Optional services — deploy defaults',
|
||||
deployDefaultsSub: 'Prefill CPU, memory, and storage when a user enables each service in the deploy wizard',
|
||||
addons: 'Add-ons',
|
||||
addonsSub: 'Flat fees not tied to a runtime',
|
||||
customDomainTitle: 'Custom domain + SSL',
|
||||
customDomainSub: 'Flat fee per billing cycle (not resource-based)',
|
||||
loggingNote: 'Prefilled limits for Fluent Bit log shippers (billed per enabled workload when logging is on).',
|
||||
logShipperCpuLimit: 'Log shipper CPU limit',
|
||||
logShipperMemoryLimit: 'Log shipper memory limit',
|
||||
defaultsNote: 'Shown when a user enables this service in deploy. They can change CPU, memory, and storage in Resources & Configuration; actual billing uses their choices × unit prices below.',
|
||||
cpuRequest: 'CPU request',
|
||||
cpuLimit: 'CPU limit',
|
||||
memoryRequest: 'Memory request',
|
||||
memoryLimit: 'Memory limit',
|
||||
storageGi: 'Storage (Gi)',
|
||||
oneCore: '1 core',
|
||||
twoCores: '2 cores',
|
||||
retentionTitle: 'Data Retention & Deletion Policy',
|
||||
edit: 'Edit',
|
||||
retentionSub: 'Configure how long user data is retained after plan expiration before permanent deletion.',
|
||||
hourlyPlans: 'Hourly Plans',
|
||||
monthlyPlans: 'Monthly Plans',
|
||||
yearlyPlans: 'Yearly Plans',
|
||||
deleteAfterHours: 'Delete after (hours):',
|
||||
deleteAfterDays: 'Delete after (days):',
|
||||
saveSettings: 'Save Settings',
|
||||
lifecycleSaved: 'Lifecycle settings updated',
|
||||
saveFailedShort: 'Failed to save',
|
||||
hours: 'hours',
|
||||
days: 'days',
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@@ -580,6 +580,153 @@ const fa = {
|
||||
clusterStatus: { active: 'فعال', inactive: 'غیرفعال', error: 'خطا' },
|
||||
clusterHealth: { healthy: 'سالم', degraded: 'نزولیافته', unhealthy: 'ناسالم', unknown: 'نامشخص' },
|
||||
},
|
||||
clusters: {
|
||||
title: 'مدیریت کلاسترها',
|
||||
count: '{n} کلاستر ثبتشده',
|
||||
addCluster: 'افزودن کلاستر',
|
||||
registerNew: 'ثبت کلاستر جدید',
|
||||
verifyNote: 'سیستم پیش از ثبت، اتصال کوبرنتیز را بررسی میکند.',
|
||||
name: 'نام',
|
||||
apiServer: 'آدرس API Server',
|
||||
region: 'منطقه',
|
||||
provider: 'ارائهدهنده',
|
||||
selectProvider: 'انتخاب ارائهدهنده',
|
||||
weight: 'وزن',
|
||||
tags: 'برچسبها',
|
||||
tagsPlaceholder: 'ssd, production, iran',
|
||||
description: 'توضیحات',
|
||||
kubeconfig: 'Kubeconfig (YAML)',
|
||||
kubeconfigPlaceholder: 'kubeconfig خود را اینجا بچسبان…',
|
||||
setDefault: 'تنظیم بهعنوان کلاستر پیشفرض',
|
||||
verifying: 'در حال بررسی اتصال و افزودن…',
|
||||
added: 'کلاستر افزوده و اتصال تأیید شد ✓',
|
||||
addFailed: 'افزودن کلاستر ناموفق بود',
|
||||
connectionOk: 'اتصال موفق — کوبرنتیز {version}',
|
||||
connectionFailed: 'اتصال ناموفق: {error}',
|
||||
testFailed: 'تست اتصال ناموفق بود',
|
||||
removed: 'کلاستر حذف شد',
|
||||
noClusters: 'هنوز کلاستری ثبت نشده.',
|
||||
noClustersHint: 'برای شروع انتشار اپها، یک کلاستر کوبرنتیز اضافه کن.',
|
||||
defaultBadge: 'پیشفرض',
|
||||
healthBadge: 'سلامت: {status}',
|
||||
weightBadge: 'وزن {n}',
|
||||
resources: 'منابع',
|
||||
testing: 'در حال تست…',
|
||||
test: 'تست',
|
||||
remove: 'حذف',
|
||||
removeTitle: 'حذف کلاستر',
|
||||
removeMessage: 'مطمئنی میخواهی «{name}» را حذف کنی؟',
|
||||
loadingResources: 'در حال بارگذاری منابع…',
|
||||
resourcesFailed: 'بارگذاری منابع ناموفق بود',
|
||||
nodes: 'نودها',
|
||||
pods: 'پادها',
|
||||
apps: 'اپها',
|
||||
totalCpu: 'کل CPU',
|
||||
cpuReserved: 'CPU رزروشده',
|
||||
memReserved: 'حافظهٔ رزروشده',
|
||||
memory: 'حافظه',
|
||||
capacity: 'ظرفیت',
|
||||
allocatable: 'قابلتخصیص',
|
||||
colName: 'نام',
|
||||
colStatus: 'وضعیت',
|
||||
colRoles: 'نقشها',
|
||||
colCpu: 'CPU (ظرفیت / تخصیص)',
|
||||
colMemory: 'حافظه (ظرفیت / تخصیص)',
|
||||
toolsTitle: 'مدیریت ابزارها',
|
||||
toolsSubtitle: 'ابزارهای زیرساخت را برای هر کلاستر نصب و مدیریت کن. هیچچیز بهصورت خودکار نصب نمیشود — فقط آنچه هر کلاستر نیاز دارد را اضافه کن.',
|
||||
defaultSuffix: ' (پیشفرض)',
|
||||
loadingTools: 'در حال بارگذاری ابزارها…',
|
||||
toolsFailed: 'بارگذاری ابزارهای این کلاستر ناموفق بود.',
|
||||
toolStatus: {
|
||||
installed: 'نصبشده',
|
||||
installing: 'در حال نصب…',
|
||||
failed: 'ناموفق',
|
||||
not_installed: 'نصبنشده',
|
||||
unknown: 'نامشخص',
|
||||
},
|
||||
requires: 'نیازمند:',
|
||||
uninstall: 'حذف نصب',
|
||||
uninstalling: 'در حال حذف…',
|
||||
install: 'نصب',
|
||||
installing: 'در حال نصب…',
|
||||
repair: 'تعمیر',
|
||||
confirmInstall: 'تأیید نصب',
|
||||
installRequiredFirst: 'اول ابزارهای موردنیاز را نصب کن',
|
||||
removeToolTitle: 'حذف {name}',
|
||||
removeToolMessage: '«{name}» از این کلاستر حذف شود؟',
|
||||
uninstallConfirm: 'حذف نصب',
|
||||
installStarted: '{name} نصب آغاز شد',
|
||||
installToolFailed: 'نصب {name} ناموفق بود',
|
||||
toolRemoved: '{name} حذف شد',
|
||||
removeToolFailed: 'حذف {name} ناموفق بود',
|
||||
fieldRequired: '{field} الزامی است',
|
||||
clusterStatus: { active: 'فعال', maintenance: 'تعمیر', inactive: 'غیرفعال', error: 'خطا' },
|
||||
clusterHealth: { healthy: 'سالم', degraded: 'نزولیافته', unhealthy: 'ناسالم', unknown: 'نامشخص' },
|
||||
na: 'نامشخص',
|
||||
},
|
||||
billing: {
|
||||
cycles: { hourly: 'ساعتی', monthly: 'ماهانه', yearly: 'سالانه' },
|
||||
resources: {
|
||||
base_fee: 'هزینهٔ پایه',
|
||||
cpu_per_core: 'CPU (هر هسته)',
|
||||
memory_per_gb: 'حافظه (هر GB)',
|
||||
storage_per_gb: 'فضای ذخیره (هر GB)',
|
||||
database_addon: 'افزونهٔ دیتابیس',
|
||||
redis_addon: 'Redis',
|
||||
rabbitmq_addon: 'RabbitMQ',
|
||||
elasticsearch_addon: 'Elasticsearch',
|
||||
custom_domain_addon: 'دامنهٔ اختصاصی + SSL',
|
||||
},
|
||||
resourceCol: 'منبع',
|
||||
title: 'پلنهای صورتحساب',
|
||||
subtitle: 'قیمت واحد هر منبع را تعیین کن. کاربران هنگام انتشار CPU، حافظه و فضای ذخیره را انتخاب میکنند؛ هزینه = مصرف آنها × این نرخها.',
|
||||
editPlans: 'ویرایش پلنها',
|
||||
saving: 'در حال ذخیره…',
|
||||
save: 'ذخیره',
|
||||
saved: 'پلنهای صورتحساب ذخیره شد',
|
||||
saveFailed: 'ذخیرهٔ پلنهای صورتحساب ناموفق بود',
|
||||
howTitle: 'صورتحساب چطور کار میکند',
|
||||
howApps: 'اپلیکیشنها — کاربر منابع رانتایم را در انتشار انتخاب میکند؛ تو قیمت هر هسته، GB، هزینهٔ پایه و افزونهٔ دیتابیس را تعیین میکنی. CPU و RAM در برآوردها بهتناسب صورتحساب میشوند (مثلاً نیمِ نرخِ هر GB برای نیم گیگابایت حافظه).',
|
||||
howOptional: 'سرویسهای اختیاری (Redis، RabbitMQ) — همان ماتریس واحد هر سرویس مثل رانتایمها؛ پیشفرضهای ویزارد انتشار جداگانه ویرایش میشوند. CPU/RAM در محاسبهگر هزینه بهتناسب محدودیتهای واقعی صورتحساب میشوند (مثلاً 500Mi معادل ۰٫۵× نرخِ حافظهٔ هر GB).',
|
||||
howDefaults: 'پیشفرضهای انتشار — فقط پیشپرکردنِ اختیاری؛ تغییر آنها هزینهٔ اپهای موجود را عوض نمیکند مگر کاربر همان مقادیر را هنگام انتشار انتخاب کرده باشد.',
|
||||
noPricing: 'دادهی قیمتی وجود ندارد',
|
||||
appRuntimes: 'رانتایمهای اپلیکیشن',
|
||||
appRuntimesSub: 'قیمتگذاری واحد هر رانتایم (ساعتی / ماهانه / سالانه)',
|
||||
unitPricesSuffix: '— قیمتهای واحد',
|
||||
fillYearly: 'پر کردن سالانه از ماهانه ×۱۲',
|
||||
optionalServices: 'سرویسهای اختیاری',
|
||||
optionalServicesSub: 'قیمتگذاری واحد هر سرویس (ساعتی / ماهانه / سالانه)',
|
||||
deployDefaults: 'سرویسهای اختیاری — پیشفرضهای انتشار',
|
||||
deployDefaultsSub: 'پیشپرکردن CPU، حافظه و فضای ذخیره هنگام فعالسازی هر سرویس در ویزارد انتشار',
|
||||
addons: 'افزونهها',
|
||||
addonsSub: 'هزینههای ثابت بدون وابستگی به رانتایم',
|
||||
customDomainTitle: 'دامنهٔ اختصاصی + SSL',
|
||||
customDomainSub: 'هزینهٔ ثابت در هر دورهٔ صورتحساب (نه بر اساس منابع)',
|
||||
loggingNote: 'محدودیتهای پیشپرشده برای ارسالکنندههای لاگ Fluent Bit (بهازای هر workload فعال هنگام روشنبودن لاگینگ صورتحساب میشود).',
|
||||
logShipperCpuLimit: 'محدودیت CPU ارسالکنندهٔ لاگ',
|
||||
logShipperMemoryLimit: 'محدودیت حافظهٔ ارسالکنندهٔ لاگ',
|
||||
defaultsNote: 'هنگامی که کاربر این سرویس را در انتشار فعال میکند نمایش داده میشود. او میتواند CPU، حافظه و فضای ذخیره را در «منابع و پیکربندی» تغییر دهد؛ صورتحساب واقعی از انتخابهای او × قیمتهای واحد زیر استفاده میکند.',
|
||||
cpuRequest: 'درخواست CPU',
|
||||
cpuLimit: 'محدودیت CPU',
|
||||
memoryRequest: 'درخواست حافظه',
|
||||
memoryLimit: 'محدودیت حافظه',
|
||||
storageGi: 'فضای ذخیره (Gi)',
|
||||
oneCore: '۱ هسته',
|
||||
twoCores: '۲ هسته',
|
||||
retentionTitle: 'سیاست نگهداری و حذف داده',
|
||||
edit: 'ویرایش',
|
||||
retentionSub: 'تنظیم کن دادههای کاربر پس از انقضای پلن چه مدت پیش از حذف دائمی نگه داشته شود.',
|
||||
hourlyPlans: 'پلنهای ساعتی',
|
||||
monthlyPlans: 'پلنهای ماهانه',
|
||||
yearlyPlans: 'پلنهای سالانه',
|
||||
deleteAfterHours: 'حذف پس از (ساعت):',
|
||||
deleteAfterDays: 'حذف پس از (روز):',
|
||||
saveSettings: 'ذخیرهٔ تنظیمات',
|
||||
lifecycleSaved: 'تنظیمات چرخهٔ عمر بهروزرسانی شد',
|
||||
saveFailedShort: 'ذخیره ناموفق بود',
|
||||
hours: 'ساعت',
|
||||
days: 'روز',
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user