/opt/mawid/apps/dashboard/lib
NameSizeModeActions
api.ts23220644editdlrm
i18n.tsx77180644editdlrm
Edit: /opt/mawid/apps/dashboard/lib/i18n.tsx (7718B)
'use client'; /** * Dashboard UI translations (tr / ar / en) with RTL support for Arabic. * Patient-facing strings live in @mawid/shared — this file is owner-UI only. */ import { createContext, useCallback, useContext, useEffect, useState } from 'react'; export type UiLang = 'tr' | 'ar' | 'en'; const dict = { // shell appName: { tr: 'Mawid', ar: 'موعد', en: 'Mawid' }, calendar: { tr: 'Takvim', ar: 'التقويم', en: 'Calendar' }, patients: { tr: 'Hastalar', ar: 'المرضى', en: 'Patients' }, conversations: { tr: 'Konuşmalar', ar: 'المحادثات', en: 'Conversations' }, settings: { tr: 'Ayarlar', ar: 'الإعدادات', en: 'Settings' }, logout: { tr: 'Çıkış', ar: 'خروج', en: 'Log out' }, loading: { tr: 'Yükleniyor…', ar: 'جار التحميل…', en: 'Loading…' }, save: { tr: 'Kaydet', ar: 'حفظ', en: 'Save' }, saved: { tr: 'Kaydedildi ✓', ar: 'تم الحفظ ✓', en: 'Saved ✓' }, close: { tr: 'Kapat', ar: 'إغلاق', en: 'Close' }, add: { tr: 'Ekle', ar: 'إضافة', en: 'Add' }, remove: { tr: 'Sil', ar: 'حذف', en: 'Remove' }, back: { tr: 'Geri', ar: 'رجوع', en: 'Back' }, // login loginTitle: { tr: 'Klinik girişi', ar: 'دخول العيادة', en: 'Clinic sign in' }, email: { tr: 'E-posta', ar: 'البريد الإلكتروني', en: 'Email' }, password: { tr: 'Şifre', ar: 'كلمة المرور', en: 'Password' }, signIn: { tr: 'Giriş yap', ar: 'تسجيل الدخول', en: 'Sign in' }, loginFailed: { tr: 'Giriş başarısız', ar: 'فشل تسجيل الدخول', en: 'Sign in failed' }, // calendar today: { tr: 'Bugün', ar: 'اليوم', en: 'Today' }, newAppointment: { tr: 'Yeni randevu', ar: 'موعد جديد', en: 'New appointment' }, st_pending: { tr: 'Onay bekliyor', ar: 'بانتظار التأكيد', en: 'Pending' }, st_confirmed: { tr: 'Onaylı', ar: 'مأكد', en: 'Confirmed' }, st_cancelled: { tr: 'İptal', ar: 'ملغى', en: 'Cancelled' }, st_completed: { tr: 'Tamamlandı', ar: 'مكتمل', en: 'Completed' }, st_no_show: { tr: 'Gelmedi', ar: 'لم يحضر', en: 'No-show' }, atRisk: { tr: 'Onaysız risk', ar: 'خطر عدم حضور', en: 'Unconfirmed risk' }, confirm: { tr: 'Onayla', ar: 'تأكيد', en: 'Confirm' }, complete: { tr: 'Tamamlandı işaretle', ar: 'اكتمل', en: 'Mark completed' }, markNoShow: { tr: 'Gelmedi işaretle', ar: 'لم يحضر', en: 'Mark no-show' }, cancelAppt: { tr: 'Randevuyu iptal et', ar: 'إلغاء الموعد', en: 'Cancel appointment' }, reschedule: { tr: 'Yeniden planla', ar: 'إعادة جدولة', en: 'Reschedule' }, patient: { tr: 'Hasta', ar: 'المريض', en: 'Patient' }, service: { tr: 'Hizmet', ar: 'الخدمة', en: 'Service' }, staff: { tr: 'Personel', ar: 'الطبيب', en: 'Staff' }, pickSlot: { tr: 'Uygun saat seçin', ar: 'اختر وقتاً متاحاً', en: 'Pick an available slot' }, noSlots: { tr: 'Uygun saat yok', ar: 'لا توجد أوقات متاحة', en: 'No available slots' }, searchPatient: { tr: 'Hasta ara…', ar: 'ابحث عن مريض…', en: 'Search patient…' }, // summary card weeklySummary: { tr: 'Haftalık özet', ar: 'ملخص الأسبوع', en: 'Weekly summary' }, sAppointments: { tr: 'Randevu', ar: 'مواعيد', en: 'Appointments' }, sCancellations: { tr: 'İptal', ar: 'إلغاءات', en: 'Cancellations' }, sNoShows: { tr: 'Gelmeyen', ar: 'لم يحضروا', en: 'No-shows' }, sPrevented: { tr: 'Hatırlatmayla onaylanan', ar: 'مأكد بعد التذكير', en: 'Confirmed after reminder' }, sRefilled: { tr: 'Listeden doldurulan', ar: 'معبأ من الانتظار', en: 'Refilled from waitlist' }, // patients search: { tr: 'Ara…', ar: 'بحث…', en: 'Search…' }, name: { tr: 'İsim', ar: 'الاسم', en: 'Name' }, phone: { tr: 'Telefon', ar: 'الهاتف', en: 'Phone' }, language: { tr: 'Dil', ar: 'اللغة', en: 'Language' }, notes: { tr: 'Notlar', ar: 'ملاحظات', en: 'Notes' }, tags: { tr: 'Etiketler (virgülle)', ar: 'وسوم (بفواصل)', en: 'Tags (comma-separated)' }, history: { tr: 'Randevu geçmişi', ar: 'سجل المواعيد', en: 'Appointment history' }, noResults: { tr: 'Sonuç yok', ar: 'لا نتائج', en: 'No results' }, // conversations takeover: { tr: 'Devral', ar: 'استلام المحادثة', en: 'Take over' }, resumeAgent: { tr: 'Asistanı devam ettir', ar: 'إعادة تفعيل المساعد', en: 'Resume agent' }, agentPaused: { tr: 'Asistan duraklatıldı', ar: 'المساعد متوقف', en: 'Agent paused' }, agentActive: { tr: 'Asistan aktif', ar: 'المساعد فعال', en: 'Agent active' }, noMessages: { tr: 'Mesaj yok', ar: 'لا رسائل', en: 'No messages' }, // settings clinicInfo: { tr: 'Klinik bilgileri', ar: 'معلومات العيادة', en: 'Clinic info' }, clinicName: { tr: 'Klinik adı', ar: 'اسم العيادة', en: 'Clinic name' }, timezone: { tr: 'Saat dilimi', ar: 'المنطقة الزمنية', en: 'Timezone' }, defaultLanguage: { tr: 'Varsayılan dil', ar: 'اللغة الافتراضية', en: 'Default language' }, ownerWaPhone: { tr: 'Sahibin WhatsApp numarası', ar: 'رقم واتساب المالك', en: 'Owner WhatsApp number', }, reminderOffsets: { tr: 'Hatırlatma saatleri (saat önce)', ar: 'أوقات التذكير (ساعات قبل الموعد)', en: 'Reminder offsets (hours before)', }, workingHours: { tr: 'Çalışma saatleri', ar: 'ساعات العمل', en: 'Working hours' }, addInterval: { tr: 'Aralık ekle', ar: 'إضافة فترة', en: 'Add interval' }, services: { tr: 'Hizmetler', ar: 'الخدمات', en: 'Services' }, duration: { tr: 'Süre (dk)', ar: 'المدة (د)', en: 'Duration (min)' }, price: { tr: 'Fiyat', ar: 'السعر', en: 'Price' }, active: { tr: 'Aktif', ar: 'فعال', en: 'Active' }, staffSection: { tr: 'Personel', ar: 'الطاقم', en: 'Staff' }, role: { tr: 'Rol', ar: 'الدور', en: 'Role' }, offersServices: { tr: 'Verdiği hizmetler', ar: 'الخدمات المقدمة', en: 'Offers services' }, day_mon: { tr: 'Pzt', ar: 'الاثنين', en: 'Mon' }, day_tue: { tr: 'Sal', ar: 'الثلاثاء', en: 'Tue' }, day_wed: { tr: 'Çar', ar: 'الأربعاء', en: 'Wed' }, day_thu: { tr: 'Per', ar: 'الخميس', en: 'Thu' }, day_fri: { tr: 'Cum', ar: 'الجمعة', en: 'Fri' }, day_sat: { tr: 'Cmt', ar: 'السبت', en: 'Sat' }, day_sun: { tr: 'Paz', ar: 'الأحد', en: 'Sun' }, } as const; export type UiKey = keyof typeof dict; interface LangContextValue { lang: UiLang; setLang: (lang: UiLang) => void; t: (key: UiKey) => string; } const LangContext = createContext({ lang: 'tr', setLang: () => {}, t: (key) => dict[key].tr, }); export function LangProvider({ children }: { children: React.ReactNode }) { const [lang, setLangState] = useState('tr'); useEffect(() => { const stored = localStorage.getItem('mawid_lang') as UiLang | null; if (stored && ['tr', 'ar', 'en'].includes(stored)) setLangState(stored); }, []); useEffect(() => { document.documentElement.lang = lang; document.documentElement.dir = lang === 'ar' ? 'rtl' : 'ltr'; }, [lang]); const setLang = useCallback((next: UiLang) => { localStorage.setItem('mawid_lang', next); setLangState(next); }, []); const t = useCallback((key: UiKey) => dict[key][lang], [lang]); return {children}; } export function useLang() { return useContext(LangContext); }