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:
keyhan
2026-06-11 17:05:43 +03:30
parent 6c1133f534
commit fcba1ed93c
5 changed files with 463 additions and 190 deletions
+147
View File
@@ -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',
},
},
};