این پروژه شامل پشتیبانی کامل از RTL (Right-to-Left) برای زبان فارسی است. تمام کامپوننتها، متنها و چیدمانها به صورت خودکار با تغییر زبان تنظیم میشوند.
- تغییر بین فارسی و انگلیسی با یک کلیک
- ذخیرهسازی زبان انتخاب شده در localStorage
- تنظیم خودکار HTML lang و dir attributes
- تراز متن خودکار (راست برای فارسی، چپ برای انگلیسی)
- تغییر جهت flexbox و grid
- تنظیم margin و padding به صورت خودکار
- انیمیشنهای RTL-aware
- پشتیبانی از موبایل و دسکتاپ
- انیمیشنهای نرم و زیبا
- طراحی glassmorphism مدرن
ابتدا RTLProvider را در layout اصلی اضافه کنید:
// app/layout.tsx
import { RTLProvider } from '@/components/rtl-provider'
export default function RootLayout({ children }) {
return (
<html lang="fa" dir="rtl">
<body className="rtl">
<RTLProvider initialLanguage="fa">
{children}
</RTLProvider>
</body>
</html>
)
}در کامپوننتهای خود از useRTLContext استفاده کنید:
import { useRTLContext } from '@/components/rtl-provider'
function MyComponent() {
const {
language,
isRTL,
setLanguage,
toggleLanguage,
getTextAlignment,
getFlexDirection
} = useRTLContext()
return (
<div className={isRTL ? 'rtl' : 'ltr'}>
<h1 className={`text-${getTextAlignment('left')}`}>
{isRTL ? 'عنوان فارسی' : 'English Title'}
</h1>
<div className={`flex ${getFlexDirection('row')}`}>
<button onClick={toggleLanguage}>
{isRTL ? 'تغییر به انگلیسی' : 'Switch to Persian'}
</button>
</div>
</div>
)
}کامپوننت تغییر زبان آماده استفاده:
import { LanguageSwitcher } from '@/components/ui/language-switcher'
function Header() {
return (
<header>
<LanguageSwitcher
variant="compact"
size="sm"
showLabel={true}
showFlag={true}
/>
</header>
)
}.rtl- فعالسازی RTL.ltr- فعالسازی LTR
.rtl .text-left { text-align: right; }
.rtl .text-right { text-align: left; }
.rtl .text-center { text-align: center; }.rtl .flex-row { flex-direction: row-reverse; }
.rtl .justify-start { justify-content: flex-end; }
.rtl .justify-end { justify-content: flex-start; }.rtl .ml-auto { margin-left: unset; margin-right: auto; }
.rtl .pl-4 { padding-left: unset; padding-right: 1rem; }کامپوننت تغییر زبان با سه variant:
default- کامل با پرچم و نام زبانcompact- فشردهicon-only- فقط آیکون
کامپوننت نمایش عملکرد RTL شامل:
- تست تراز متنها
- نمایش دکمهها و فرمها
- نمایش جداول و لیستها
- انیمیشنهای RTL
const {
language, // 'fa' | 'en'
isRTL, // boolean
setLanguage, // (lang: Language) => void
toggleLanguage, // () => void
getTextDirection, // () => 'rtl' | 'ltr'
getTextAlignment, // (default: 'left'|'right'|'center') => string
getFlexDirection, // (default: 'row'|'row-reverse') => string
getMargin, // (default: string) => string
getPadding // (default: string) => string
} = useRTL()const { getTextAlignment } = useRTLContext()
<h2 className={`text-${getTextAlignment('left')}`}>
{isRTL ? 'عنوان فارسی' : 'English Title'}
</h2>const { getFlexDirection } = useRTLContext()
<div className={`flex ${getFlexDirection('row')} gap-4`}>
<div>Item 1</div>
<div>Item 2</div>
</div>const { isRTL } = useRTLContext()
<div className={`transition-all duration-500 ${
isRTL
? 'transform translate-x-4 rotate-12'
: 'transform translate-x-0 rotate-0'
}`}>
Content
</div>برای تست عملکرد RTL، به صفحه /rtl-demo بروید. این صفحه شامل:
- نمایش تمام ویژگیهای RTL
- تست تراز متنها
- تست دکمهها و فرمها
- تست جداول و لیستها
- انیمیشنهای RTL
- از
getTextAlignment()برای تراز خودکار استفاده کنید text-centerهمیشه در وسط قرار میگیردtext-leftوtext-rightبر اساس RTL تنظیم میشوند
- از
getFlexDirection()برای جهت flexbox استفاده کنید - از
getMargin()وgetPadding()برای margin و padding استفاده کنید
- انیمیشنها باید RTL-aware باشند
- از transform های مناسب برای هر جهت استفاده کنید
- فونت Tanha برای فارسی استفاده میشود
- فونتهای سیستم برای انگلیسی استفاده میشوند
- مطمئن شوید
RTLProviderدر layout اضافه شده - مطمئن شوید کلاس
rtlبه body اضافه شده - مطمئن شوید CSS های RTL بارگذاری شدهاند
- از
getTextAlignment()استفاده کنید - مطمئن شوید کلاس
rtlفعال است - CSS های RTL را بررسی کنید
- از transform های RTL-aware استفاده کنید
- انیمیشنها را برای هر جهت جداگانه تعریف کنید
برای سوالات و مشکلات:
- فایل
RTL_README.mdرا مطالعه کنید - کامپوننت
RTLDemoرا بررسی کنید - CSS های RTL در
globals.cssرا بررسی کنید - Hook
useRTLرا مطالعه کنید
نکته: این سیستم RTL به صورت کامل با Tailwind CSS سازگار است و تمام کلاسهای موجود را پشتیبانی میکند.