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
@@ -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: 'روز',
},
},
};