Add i18n foundation (fa-IR/en-US) and localize landing + auth.

Introduce path-prefixed locale routing under app/[lang] with a middleware
that detects locale from cookie/Accept-Language (default fa-IR) and
redirects. Add fa-IR (source of truth) and en-US dictionaries, a server
getDictionary, a client I18nProvider/useT, locale-aware Link + router
helpers, and a language switcher. The root [lang] layout sets html
lang/dir and the per-locale font (Peyda for fa, Inter for en).

Landing sections and the login/register/auth shell now read all copy from
the dictionaries; dashboard localization follows in a later commit.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
keyhan
2026-06-11 12:05:03 +03:30
parent 2b16846f67
commit 34993d417f
48 changed files with 785 additions and 200 deletions
+163
View File
@@ -0,0 +1,163 @@
// Persian (fa-IR) dictionary — the source of truth for the app's copy.
// The `Dictionary` type is derived from this object; en.ts must match its shape.
const fa = {
common: {
appName: 'ابربان',
login: 'ورود',
register: 'ثبت‌نام',
logout: 'خروج',
signOut: 'خروج از حساب',
dashboard: 'داشبورد',
backHome: 'بازگشت به خانه',
loading: 'در حال بارگذاری…',
save: 'ذخیره',
cancel: 'انصراف',
delete: 'حذف',
edit: 'ویرایش',
create: 'ایجاد',
back: 'بازگشت',
search: 'جستجو',
confirm: 'تأیید',
close: 'بستن',
yes: 'بله',
no: 'خیر',
currency: 'تومان',
currencyShort: 'ت',
},
language: {
label: 'زبان',
},
meta: {
title: 'ابربان | زیرساخت ابری، در کنترل تو',
description:
'ابربان؛ پلتفرم ابریِ خودسرویس روی کوبرنتیز. اپ خود را در چند ثانیه منتشر کن — دیتابیس مدیریت‌شده، دامنهٔ اختصاصی، SSL خودکار و لاگ زنده.',
},
roles: {
admin: 'مدیر',
technical: 'فنی',
sales: 'فروش',
},
landing: {
badge: 'پلتفرم ابریِ خودسرویس',
hero: {
title: 'ابربان',
tagline: 'زیرساخت ابری، در کنترل تو',
subtitle:
'اپلیکیشنت را در چند ثانیه روی کوبرنتیز منتشر کن — بدون دردسر سرور، بدون پیچیدگیِ DevOps.',
ctaPrimary: 'رایگان شروع کن',
ctaSecondary: 'ورود',
scrollHint: 'به دلِ ابرها بزن',
},
value: {
lead: 'یک پلتفرمِ ',
highlight: 'PaaS خودسرویس',
tail: ' روی کوبرنتیز — تمامِ قدرتِ زیرساختِ ابری، بدون پیچیدگیِ طوفانی‌اش.',
body: 'ابربان لایه‌های سختِ DevOps را برایت مدیریت می‌کند تا فقط روی محصولت تمرکز کنی.',
},
how: {
title: 'به سادگیِ سه قدم',
steps: [
{ n: '۱', title: 'کدت را بده', desc: 'ریپازیتوری یا اپت را وصل کن.' },
{ n: '۲', title: 'ما می‌سازیم', desc: 'ابربان به‌صورت خودکار بیلد و روی کوبرنتیز دیپلوی می‌کند.' },
{ n: '۳', title: 'آنلاین شو', desc: 'دامنه و SSL آماده است؛ اپت زنده می‌شود.' },
],
},
features: {
title: 'هرچه برای ساختن لازم داری',
subtitle: 'یک جعبه‌ابزارِ کامل برای انتشار و نگه‌داریِ اپ.',
items: [
{ title: 'دیپلوی برق‌آسا', desc: 'Node.js، لاراول و وردپرس را با یک کلیک منتشر کن؛ بیلد و انتشار خودکار.' },
{ title: 'دیتابیس مدیریت‌شده', desc: 'PostgreSQL، MySQL، Redis، RabbitMQ و Elasticsearch، آماده و پایدار.' },
{ title: 'SSL خودکار', desc: 'دامنهٔ اختصاصی وصل کن؛ گواهی SSL خودکار صادر و تمدید می‌شود.' },
{ title: 'لینک پیش‌نمایش', desc: 'برای هر دیپلوی یک Preview URL پایدار روی TLS بگیر و سریع تست کن.' },
{ title: 'لاگ زنده', desc: 'لاگ بیلد و اجرای اپ را همان لحظه و به‌صورت زنده دنبال کن.' },
{ title: 'اسنپ‌شات و بکاپ', desc: 'از وضعیت اپ اسنپ‌شات بگیر و هر زمان خواستی بازگردان.' },
{ title: 'بیلینگ شفاف', desc: 'کیف‌پول پیش‌پرداخت، فاکتور دقیق و مصرف لحظه‌ای — بدون سورپرایز.' },
{ title: 'پشتیبانی فارسی', desc: 'تیم پشتیبانی و سیستم تیکت، فارسی و همیشه کنارت.' },
],
},
trust: {
title: 'چرا تیم‌ها به ابربان اعتماد می‌کنند',
items: [
{ kpi: '< ۶۰ ثانیه', label: 'میانگین زمان دیپلوی' },
{ kpi: '۹۹٫۹٪', label: 'پایداریِ زیرساخت' },
{ kpi: 'TLS خودکار', label: 'امنیتِ پیش‌فرض' },
{ kpi: 'بومیِ ایران', label: 'بهینه برای کاربر ایرانی' },
],
},
finalCta: {
titleLead: 'آسمان صاف است؛ وقتِ ',
titleHighlight: 'زنده',
titleTail: ' کردنِ اپِ توست.',
body: 'همین حالا حسابت را بساز و اولین دیپلوی را تجربه کن.',
ctaPrimary: 'همین حالا شروع کن',
ctaSecondary: 'داشبورد',
},
footer: {
copyright: '© ابربان — همهٔ حقوق محفوظ است',
},
},
auth: {
backHome: 'بازگشت به خانه',
login: {
title: 'خوش آمدی',
subtitle: 'به حساب ابربان خود وارد شو',
altPrompt: 'هنوز حساب نداری؟',
altLabel: 'ثبت‌نام کن',
email: 'ایمیل',
password: 'رمز عبور',
submit: 'ورود',
submitting: 'در حال ورود…',
success: 'با موفقیت وارد شدی!',
error: 'ورود ناموفق بود',
},
register: {
title: 'ساخت حساب',
subtitle: 'در چند دقیقه اولین اپت را منتشر کن',
altPrompt: 'قبلاً حساب ساخته‌ای؟',
altLabel: 'وارد شو',
firstName: 'نام',
firstNamePlaceholder: 'مثلاً علی',
lastName: 'نام خانوادگی',
lastNamePlaceholder: 'مثلاً رضایی',
email: 'ایمیل',
password: 'رمز عبور',
passwordPlaceholder: 'حداقل ۸ کاراکتر',
submit: 'ساخت حساب',
submitting: 'در حال ساخت حساب…',
success: 'حساب با موفقیت ساخته شد!',
error: 'ثبت‌نام ناموفق بود',
},
},
nav: {
sectionAdmin: 'مدیریت',
sectionTechnical: 'فنی',
sectionSales: 'فروش',
walletBalanceTitle: 'موجودی کیف‌پول',
dashboard: 'داشبورد',
applications: 'اپلیکیشن‌ها',
services: 'دیتابیس‌ها و سرویس‌ها',
logs: 'لاگ‌ها',
newDeploy: 'دیپلوی جدید',
wallet: 'کیف‌پول',
invoices: 'فاکتورها',
tickets: 'تیکت‌ها',
users: 'کاربران',
allApplications: 'همهٔ اپلیکیشن‌ها',
billingPlans: 'پلن‌های صورت‌حساب',
clusters: 'کلاسترها',
clusterPools: 'پول‌های کلاستر',
allTickets: 'همهٔ تیکت‌ها',
technicalTickets: 'تیکت‌های فنی',
salesTickets: 'تیکت‌های فروش',
},
};
export type Dictionary = typeof fa;
export default fa;