/opt/mawid/apps/dashboard/lib
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);
}