Skip to content

Commit d2c2f01

Browse files
committed
Add RTL support and new language translations (ar, ja, pl, ru, uk, zh)
1 parent 548a39a commit d2c2f01

File tree

11 files changed

+675
-13
lines changed

11 files changed

+675
-13
lines changed

public/css/rtl.css

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
/**
2+
* RTL (Right-to-Left) styles for Arabic and other RTL languages
3+
*/
4+
5+
html[dir="rtl"] {
6+
/* Base text direction */
7+
direction: rtl;
8+
text-align: right;
9+
}
10+
11+
/* Flip margins and paddings for RTL */
12+
html[dir="rtl"] .header-nav ul li {
13+
margin-right: 0;
14+
margin-left: 1.5rem;
15+
}
16+
17+
html[dir="rtl"] .header-nav {
18+
margin-left: 0;
19+
margin-right: auto;
20+
}
21+
22+
/* Flip floats */
23+
html[dir="rtl"] .float-left {
24+
float: right !important;
25+
}
26+
27+
html[dir="rtl"] .float-right {
28+
float: left !important;
29+
}
30+
31+
/* Flip text alignment */
32+
html[dir="rtl"] .text-left {
33+
text-align: right !important;
34+
}
35+
36+
html[dir="rtl"] .text-right {
37+
text-align: left !important;
38+
}
39+
40+
/* Flip margins */
41+
html[dir="rtl"] .ml-1,
42+
html[dir="rtl"] .ml-2,
43+
html[dir="rtl"] .ml-3,
44+
html[dir="rtl"] .ml-4,
45+
html[dir="rtl"] .ml-5 {
46+
margin-left: 0 !important;
47+
}
48+
49+
html[dir="rtl"] .mr-1,
50+
html[dir="rtl"] .mr-2,
51+
html[dir="rtl"] .mr-3,
52+
html[dir="rtl"] .mr-4,
53+
html[dir="rtl"] .mr-5 {
54+
margin-right: 0 !important;
55+
}
56+
57+
html[dir="rtl"] .ml-1 { margin-right: 0.25rem !important; }
58+
html[dir="rtl"] .ml-2 { margin-right: 0.5rem !important; }
59+
html[dir="rtl"] .ml-3 { margin-right: 1rem !important; }
60+
html[dir="rtl"] .ml-4 { margin-right: 1.5rem !important; }
61+
html[dir="rtl"] .ml-5 { margin-right: 3rem !important; }
62+
63+
html[dir="rtl"] .mr-1 { margin-left: 0.25rem !important; }
64+
html[dir="rtl"] .mr-2 { margin-left: 0.5rem !important; }
65+
html[dir="rtl"] .mr-3 { margin-left: 1rem !important; }
66+
html[dir="rtl"] .mr-4 { margin-left: 1.5rem !important; }
67+
html[dir="rtl"] .mr-5 { margin-left: 3rem !important; }
68+
69+
/* Flip paddings */
70+
html[dir="rtl"] .pl-1,
71+
html[dir="rtl"] .pl-2,
72+
html[dir="rtl"] .pl-3,
73+
html[dir="rtl"] .pl-4,
74+
html[dir="rtl"] .pl-5 {
75+
padding-left: 0 !important;
76+
}
77+
78+
html[dir="rtl"] .pr-1,
79+
html[dir="rtl"] .pr-2,
80+
html[dir="rtl"] .pr-3,
81+
html[dir="rtl"] .pr-4,
82+
html[dir="rtl"] .pr-5 {
83+
padding-right: 0 !important;
84+
}
85+
86+
html[dir="rtl"] .pl-1 { padding-right: 0.25rem !important; }
87+
html[dir="rtl"] .pl-2 { padding-right: 0.5rem !important; }
88+
html[dir="rtl"] .pl-3 { padding-right: 1rem !important; }
89+
html[dir="rtl"] .pl-4 { padding-right: 1.5rem !important; }
90+
html[dir="rtl"] .pl-5 { padding-right: 3rem !important; }
91+
92+
html[dir="rtl"] .pr-1 { padding-left: 0.25rem !important; }
93+
html[dir="rtl"] .pr-2 { padding-left: 0.5rem !important; }
94+
html[dir="rtl"] .pr-3 { padding-left: 1rem !important; }
95+
html[dir="rtl"] .pr-4 { padding-left: 1.5rem !important; }
96+
html[dir="rtl"] .pr-5 { padding-left: 3rem !important; }
97+
98+
/* Flip borders */
99+
html[dir="rtl"] .border-left {
100+
border-left: none !important;
101+
border-right: 1px solid var(--border-color) !important;
102+
}
103+
104+
html[dir="rtl"] .border-right {
105+
border-right: none !important;
106+
border-left: 1px solid var(--border-color) !important;
107+
}
108+
109+
/* Flip positions */
110+
html[dir="rtl"] .left-0 {
111+
left: auto !important;
112+
right: 0 !important;
113+
}
114+
115+
html[dir="rtl"] .right-0 {
116+
right: auto !important;
117+
left: 0 !important;
118+
}
119+
120+
/* Flip transforms */
121+
html[dir="rtl"] .translate-x-100 {
122+
transform: translateX(100%) !important;
123+
}
124+
125+
html[dir="rtl"] .translate-x-n100 {
126+
transform: translateX(-100%) !important;
127+
}
128+
129+
/* Flip flexbox */
130+
html[dir="rtl"] .justify-content-start {
131+
justify-content: flex-end !important;
132+
}
133+
134+
html[dir="rtl"] .justify-content-end {
135+
justify-content: flex-start !important;
136+
}
137+
138+
/* Flip icons and arrows */
139+
html[dir="rtl"] .icon-arrow-right::before {
140+
content: "\f060" !important; /* FontAwesome arrow-left */
141+
}
142+
143+
html[dir="rtl"] .icon-arrow-left::before {
144+
content: "\f061" !important; /* FontAwesome arrow-right */
145+
}
146+
147+
/* Flip dropdown menus */
148+
html[dir="rtl"] .dropdown-menu {
149+
text-align: right;
150+
left: auto;
151+
right: 0;
152+
}
153+
154+
/* Adjust form elements */
155+
html[dir="rtl"] input[type="text"],
156+
html[dir="rtl"] input[type="email"],
157+
html[dir="rtl"] input[type="password"],
158+
html[dir="rtl"] textarea {
159+
text-align: right;
160+
}
161+
162+
/* Adjust language switcher */
163+
html[dir="rtl"] .language-switcher {
164+
margin-left: 0;
165+
margin-right: 1rem;
166+
}
167+
168+
html[dir="rtl"] .language-switcher .dropdown-menu {
169+
left: auto;
170+
right: 0;
171+
}

public/i18n/ar.json

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
{
2+
"app_name": "convert2doc",
3+
"navigation": {
4+
"dashboard": "لوحة التحكم",
5+
"api_docs": "وثائق API",
6+
"api_keys": "مفاتيح API",
7+
"state_demo": "عرض الحالة",
8+
"i18n_demo": "عرض i18n",
9+
"login": "تسجيل الدخول",
10+
"register": "تسجيل",
11+
"settings": "الإعدادات",
12+
"logout": "تسجيل الخروج",
13+
"theme": "السمة",
14+
"language": "اللغة"
15+
},
16+
"errors": {
17+
"page_not_found": "404 - الصفحة غير موجودة",
18+
"page_not_found_message": "الصفحة \"${path}\" غير موجودة.",
19+
"go_back_home": "العودة إلى الصفحة الرئيسية",
20+
"error_loading_page": "خطأ في تحميل الصفحة",
21+
"login_failed": "فشل تسجيل الدخول: ",
22+
"invalid_credentials": "بيانات الاعتماد غير صالحة. يرجى التحقق من بريدك الإلكتروني وكلمة المرور.",
23+
"auth_server_error": "خطأ في خادم المصادقة. يرجى المحاولة مرة أخرى لاحقًا.",
24+
"registration_failed": "فشل التسجيل: ",
25+
"passwords_not_match": "كلمات المرور غير متطابقة"
26+
},
27+
"auth": {
28+
"email": "البريد الإلكتروني",
29+
"password": "كلمة المرور",
30+
"confirm_password": "تأكيد كلمة المرور",
31+
"new_password": "كلمة مرور جديدة",
32+
"logging_in": "جاري تسجيل الدخول...",
33+
"checking_auth": "جاري التحقق من حالة المصادقة...",
34+
"change_password_required": "لأسباب أمنية، يرجى تغيير كلمة المرور الافتراضية قبل المتابعة.",
35+
"login_successful": "تم تسجيل الدخول بنجاح، جاري إعادة التوجيه إلى صفحة مفاتيح API",
36+
"profile_updated": "تم تحديث الملف الشخصي بنجاح!",
37+
"password_changed": "تم تغيير كلمة المرور بنجاح!",
38+
"delete_account_confirm": "هل أنت متأكد أنك تريد حذف حسابك؟ لا يمكن التراجع عن هذا الإجراء.",
39+
"delete_account": "حذف الحساب",
40+
"delete": "حذف",
41+
"cancel": "إلغاء"
42+
},
43+
"subscription": {
44+
"active_subscription_required": "تحتاج إلى اشتراك نشط للوصول إلى لوحة التحكم.",
45+
"processing": "جاري المعالجة...",
46+
"registration_successful": "تم التسجيل بنجاح!",
47+
"payment_instructions": "يرجى إرسال <strong>${amount} USD</strong> (<strong>${cryptoAmount} ${coin}</strong>) إلى العنوان أدناه:",
48+
"amount": "المبلغ:",
49+
"address": "العنوان:",
50+
"copy": "نسخ",
51+
"copied": "تم النسخ!",
52+
"waiting_payment": "في انتظار تأكيد الدفع...",
53+
"payment_received": "تم استلام الدفع! جاري إعادة التوجيه إلى لوحة التحكم الخاصة بك..."
54+
},
55+
"common": {
56+
"save": "حفظ",
57+
"cancel": "إلغاء",
58+
"submit": "إرسال",
59+
"loading": "جاري التحميل...",
60+
"success": "نجاح",
61+
"error": "خطأ",
62+
"warning": "تحذير",
63+
"info": "معلومات",
64+
"yes": "نعم",
65+
"no": "لا",
66+
"back": "رجوع",
67+
"next": "التالي",
68+
"continue": "متابعة",
69+
"check_status": "التحقق من حالة الدفع"
70+
}
71+
}

public/i18n/ja.json

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
{
2+
"app_name": "convert2doc",
3+
"navigation": {
4+
"dashboard": "ダッシュボード",
5+
"api_docs": "API ドキュメント",
6+
"api_keys": "API キー",
7+
"state_demo": "ステートデモ",
8+
"i18n_demo": "i18n デモ",
9+
"login": "ログイン",
10+
"register": "登録",
11+
"settings": "設定",
12+
"logout": "ログアウト",
13+
"theme": "テーマ",
14+
"language": "言語"
15+
},
16+
"errors": {
17+
"page_not_found": "404 - ページが見つかりません",
18+
"page_not_found_message": "ページ \"${path}\" が見つかりませんでした。",
19+
"go_back_home": "ホームに戻る",
20+
"error_loading_page": "ページの読み込みエラー",
21+
"login_failed": "ログイン失敗: ",
22+
"invalid_credentials": "認証情報が無効です。メールアドレスとパスワードを確認してください。",
23+
"auth_server_error": "認証サーバーエラー。後でもう一度お試しください。",
24+
"registration_failed": "登録失敗: ",
25+
"passwords_not_match": "パスワードが一致しません"
26+
},
27+
"auth": {
28+
"email": "メールアドレス",
29+
"password": "パスワード",
30+
"confirm_password": "パスワードの確認",
31+
"new_password": "新しいパスワード",
32+
"logging_in": "ログイン中...",
33+
"checking_auth": "認証状態を確認中...",
34+
"change_password_required": "セキュリティ上の理由から、続行する前にデフォルトのパスワードを変更してください。",
35+
"login_successful": "ログイン成功、API キーページにリダイレクトします",
36+
"profile_updated": "プロフィールが正常に更新されました!",
37+
"password_changed": "パスワードが正常に変更されました!",
38+
"delete_account_confirm": "アカウントを削除してもよろしいですか?この操作は元に戻せません。",
39+
"delete_account": "アカウントを削除",
40+
"delete": "削除",
41+
"cancel": "キャンセル"
42+
},
43+
"subscription": {
44+
"active_subscription_required": "ダッシュボードにアクセスするには有効なサブスクリプションが必要です。",
45+
"processing": "処理中...",
46+
"registration_successful": "登録成功!",
47+
"payment_instructions": "<strong>${amount} USD</strong> (<strong>${cryptoAmount} ${coin}</strong>) を以下のアドレスに送信してください:",
48+
"amount": "金額:",
49+
"address": "アドレス:",
50+
"copy": "コピー",
51+
"copied": "コピーしました!",
52+
"waiting_payment": "支払い確認を待っています...",
53+
"payment_received": "支払いを受け取りました!ダッシュボードにリダイレクトします..."
54+
},
55+
"common": {
56+
"save": "保存",
57+
"cancel": "キャンセル",
58+
"submit": "送信",
59+
"loading": "読み込み中...",
60+
"success": "成功",
61+
"error": "エラー",
62+
"warning": "警告",
63+
"info": "情報",
64+
"yes": "はい",
65+
"no": "いいえ",
66+
"back": "戻る",
67+
"next": "次へ",
68+
"continue": "続ける",
69+
"check_status": "支払い状況を確認"
70+
}
71+
}

public/i18n/pl.json

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
{
2+
"app_name": "convert2doc",
3+
"navigation": {
4+
"dashboard": "Panel sterowania",
5+
"api_docs": "Dokumentacja API",
6+
"api_keys": "Klucze API",
7+
"state_demo": "Demo stanu",
8+
"i18n_demo": "Demo i18n",
9+
"login": "Logowanie",
10+
"register": "Rejestracja",
11+
"settings": "Ustawienia",
12+
"logout": "Wyloguj",
13+
"theme": "Motyw",
14+
"language": "Język"
15+
},
16+
"errors": {
17+
"page_not_found": "404 - Nie znaleziono strony",
18+
"page_not_found_message": "Strona \"${path}\" nie została znaleziona.",
19+
"go_back_home": "Wróć do strony głównej",
20+
"error_loading_page": "Błąd ładowania strony",
21+
"login_failed": "Logowanie nie powiodło się: ",
22+
"invalid_credentials": "Nieprawidłowe dane logowania. Sprawdź swój email i hasło.",
23+
"auth_server_error": "Błąd serwera uwierzytelniania. Spróbuj ponownie później.",
24+
"registration_failed": "Rejestracja nie powiodła się: ",
25+
"passwords_not_match": "Hasła nie są zgodne"
26+
},
27+
"auth": {
28+
"email": "Email",
29+
"password": "Hasło",
30+
"confirm_password": "Potwierdź hasło",
31+
"new_password": "Nowe hasło",
32+
"logging_in": "Logowanie...",
33+
"checking_auth": "Sprawdzanie statusu uwierzytelnienia...",
34+
"change_password_required": "Ze względów bezpieczeństwa, zmień domyślne hasło przed kontynuowaniem.",
35+
"login_successful": "Logowanie udane, przekierowywanie do strony kluczy API",
36+
"profile_updated": "Profil zaktualizowany pomyślnie!",
37+
"password_changed": "Hasło zmienione pomyślnie!",
38+
"delete_account_confirm": "Czy na pewno chcesz usunąć swoje konto? Tej operacji nie można cofnąć.",
39+
"delete_account": "Usuń konto",
40+
"delete": "Usuń",
41+
"cancel": "Anuluj"
42+
},
43+
"subscription": {
44+
"active_subscription_required": "Potrzebujesz aktywnej subskrypcji, aby uzyskać dostęp do panelu sterowania.",
45+
"processing": "Przetwarzanie...",
46+
"registration_successful": "Rejestracja udana!",
47+
"payment_instructions": "Proszę wysłać <strong>${amount} USD</strong> (<strong>${cryptoAmount} ${coin}</strong>) na poniższy adres:",
48+
"amount": "Kwota:",
49+
"address": "Adres:",
50+
"copy": "Kopiuj",
51+
"copied": "Skopiowano!",
52+
"waiting_payment": "Oczekiwanie na potwierdzenie płatności...",
53+
"payment_received": "Płatność otrzymana! Przekierowywanie do panelu sterowania..."
54+
},
55+
"common": {
56+
"save": "Zapisz",
57+
"cancel": "Anuluj",
58+
"submit": "Wyślij",
59+
"loading": "Ładowanie...",
60+
"success": "Sukces",
61+
"error": "Błąd",
62+
"warning": "Ostrzeżenie",
63+
"info": "Informacja",
64+
"yes": "Tak",
65+
"no": "Nie",
66+
"back": "Wstecz",
67+
"next": "Dalej",
68+
"continue": "Kontynuuj",
69+
"check_status": "Sprawdź status płatności"
70+
}
71+
}

0 commit comments

Comments
 (0)