+
+
+
+
+ );
+}
diff --git a/frontend/components/sidebar-02/app-sidebar.tsx b/frontend/components/sidebar-02/app-sidebar.tsx
index 723c98a..5a7b904 100644
--- a/frontend/components/sidebar-02/app-sidebar.tsx
+++ b/frontend/components/sidebar-02/app-sidebar.tsx
@@ -15,6 +15,7 @@ import {
} from "@/components/ui/tooltip";
import { cn } from "@/lib/utils";
import { useAiAccess } from "@/lib/ai-policy";
+import { dirFor } from "@/lib/i18n/config";
import { useActiveRole, visibleNavItems } from "@/lib/roles";
import { motion } from "framer-motion";
import Image from "next/image";
@@ -27,7 +28,10 @@ import { useCallInvites } from "@/components/meetings/use-call-invites";
export function DashboardSidebar() {
const { state } = useSidebar();
- const { t } = useTranslation();
+ const { t, i18n } = useTranslation();
+ // Anchor the sidebar to the right for RTL locales (Arabic) so the whole shell
+ // mirrors instead of leaving the fixed sidebar pinned physically left.
+ const side = dirFor(i18n.language) === "rtl" ? "right" : "left";
const role = useActiveRole();
const { allowed: aiAllowed } = useAiAccess();
const isCollapsed = state === "collapsed";
@@ -54,7 +58,7 @@ export function DashboardSidebar() {
}));
return (
-
+
diff --git a/frontend/lib/i18n/locales/ar/translation.json b/frontend/lib/i18n/locales/ar/translation.json
index 997c018..3aa53a0 100644
--- a/frontend/lib/i18n/locales/ar/translation.json
+++ b/frontend/lib/i18n/locales/ar/translation.json
@@ -2033,7 +2033,11 @@
"savedBody": "تم تحديث موقع عيادتك.",
"invalidCoords": "يجب أن يكون خطا العرض والطول أرقامًا.",
"errorTitle": "تعذّر حفظ الموقع",
- "error": "يرجى المحاولة مرة أخرى."
+ "error": "يرجى المحاولة مرة أخرى.",
+ "useMyLocation": "استخدام موقعي الحالي",
+ "locating": "جارٍ تحديد الموقع…",
+ "geoUnsupported": "الموقع غير متاح على هذا الجهاز.",
+ "geoError": "تعذّر الحصول على موقعك. تحقّق من الأذونات وحاول مرة أخرى."
},
"signing": {
"keyTitle": "مفتاح التوقيع",
@@ -2145,6 +2149,16 @@
"savedBody": "تم تحديث تهيئة الذكاء الاصطناعي الخاصة بك.",
"saveFailedTitle": "تعذّر الحفظ",
"saveFailedBody": "فشل حفظ إعدادات الذكاء الاصطناعي. يرجى المحاولة مرة أخرى."
+ },
+ "portal": {
+ "title": "بوابة المريض",
+ "description": "شارك بوابة الحجز العامة لعيادتك مع المرضى — يمكنهم رؤية أطبائك وحجز المواعيد.",
+ "linkLabel": "رابط البوابة",
+ "linkDescription": "الصفحة العامة التي يفتحها المرضى للحجز في عيادتك.",
+ "open": "فتح البوابة",
+ "showQr": "عرض رمز QR",
+ "qrTitle": "رمز QR لبوابة المريض",
+ "qrDescription": "يمسح المرضى هذا لفتح بوابة عيادتك — أو يمسحونه في تطبيق محفظة Temetro للحجز."
}
},
"portal": {
diff --git a/frontend/lib/i18n/locales/de/translation.json b/frontend/lib/i18n/locales/de/translation.json
index d7044b7..6dfa832 100644
--- a/frontend/lib/i18n/locales/de/translation.json
+++ b/frontend/lib/i18n/locales/de/translation.json
@@ -2013,7 +2013,11 @@
"savedBody": "Der Standort Ihrer Klinik wurde aktualisiert.",
"invalidCoords": "Breiten- und Längengrad müssen Zahlen sein.",
"errorTitle": "Standort konnte nicht gespeichert werden",
- "error": "Bitte versuchen Sie es erneut."
+ "error": "Bitte versuchen Sie es erneut.",
+ "useMyLocation": "Aktuellen Standort verwenden",
+ "locating": "Standort wird ermittelt …",
+ "geoUnsupported": "Standort ist auf diesem Gerät nicht verfügbar.",
+ "geoError": "Standort konnte nicht ermittelt werden. Bitte Berechtigungen prüfen und erneut versuchen."
},
"signing": {
"keyTitle": "Signierschlüssel",
@@ -2125,6 +2129,16 @@
"savedBody": "Ihre KI-Konfiguration wurde aktualisiert.",
"saveFailedTitle": "Speichern fehlgeschlagen",
"saveFailedBody": "Das Speichern Ihrer KI-Einstellungen ist fehlgeschlagen. Bitte versuchen Sie es erneut."
+ },
+ "portal": {
+ "title": "Patientenportal",
+ "description": "Teilen Sie das öffentliche Buchungsportal Ihrer Klinik mit Patienten – sie können Ihre Ärzte sehen und Termine buchen.",
+ "linkLabel": "Portal-Link",
+ "linkDescription": "Die öffentliche Seite, die Patienten zum Buchen bei Ihrer Klinik öffnen.",
+ "open": "Portal öffnen",
+ "showQr": "QR-Code anzeigen",
+ "qrTitle": "Patientenportal-QR",
+ "qrDescription": "Patienten scannen dies, um das Portal Ihrer Klinik zu öffnen – oder scannen es in der Temetro-Wallet-App, um zu buchen."
}
},
"portal": {
diff --git a/frontend/lib/i18n/locales/en/translation.json b/frontend/lib/i18n/locales/en/translation.json
index 46c07b0..9ea1493 100644
--- a/frontend/lib/i18n/locales/en/translation.json
+++ b/frontend/lib/i18n/locales/en/translation.json
@@ -2013,7 +2013,11 @@
"savedBody": "Your clinic location has been updated.",
"invalidCoords": "Latitude and longitude must be numbers.",
"errorTitle": "Couldn't save location",
- "error": "Please try again."
+ "error": "Please try again.",
+ "useMyLocation": "Use my current location",
+ "locating": "Locating…",
+ "geoUnsupported": "Location isn't available on this device.",
+ "geoError": "Couldn't get your location. Check permissions and try again."
},
"signing": {
"keyTitle": "Signing key",
@@ -2125,6 +2129,16 @@
"savedBody": "Your AI configuration has been updated.",
"saveFailedTitle": "Could not save",
"saveFailedBody": "Saving your AI settings failed. Please try again."
+ },
+ "portal": {
+ "title": "Patient Portal",
+ "description": "Share your clinic's public booking portal with patients — they can view your doctors and book appointments.",
+ "linkLabel": "Portal link",
+ "linkDescription": "The public page patients open to book with your clinic.",
+ "open": "Open portal",
+ "showQr": "Show QR code",
+ "qrTitle": "Patient Portal QR",
+ "qrDescription": "Patients scan this to open your clinic's portal — or scan it in the Temetro wallet app to book."
}
},
"portal": {
diff --git a/frontend/lib/i18n/locales/fr/translation.json b/frontend/lib/i18n/locales/fr/translation.json
index be0cd88..f273b40 100644
--- a/frontend/lib/i18n/locales/fr/translation.json
+++ b/frontend/lib/i18n/locales/fr/translation.json
@@ -2013,7 +2013,11 @@
"savedBody": "L'emplacement de votre clinique a été mis à jour.",
"invalidCoords": "La latitude et la longitude doivent être des nombres.",
"errorTitle": "Impossible d'enregistrer l'emplacement",
- "error": "Veuillez réessayer."
+ "error": "Veuillez réessayer.",
+ "useMyLocation": "Utiliser ma position actuelle",
+ "locating": "Localisation…",
+ "geoUnsupported": "La localisation n'est pas disponible sur cet appareil.",
+ "geoError": "Impossible d'obtenir votre position. Vérifiez les autorisations et réessayez."
},
"signing": {
"keyTitle": "Clé de signature",
@@ -2125,6 +2129,16 @@
"savedBody": "Votre configuration d'IA a été mise à jour.",
"saveFailedTitle": "Impossible d'enregistrer",
"saveFailedBody": "L'enregistrement de vos paramètres d'IA a échoué. Veuillez réessayer."
+ },
+ "portal": {
+ "title": "Portail patient",
+ "description": "Partagez le portail de réservation public de votre clinique avec les patients — ils peuvent voir vos médecins et prendre rendez-vous.",
+ "linkLabel": "Lien du portail",
+ "linkDescription": "La page publique que les patients ouvrent pour réserver avec votre clinique.",
+ "open": "Ouvrir le portail",
+ "showQr": "Afficher le QR code",
+ "qrTitle": "QR du portail patient",
+ "qrDescription": "Les patients le scannent pour ouvrir le portail de votre clinique — ou le scannent dans l'application Temetro pour réserver."
}
},
"portal": {
diff --git a/frontend/lib/i18n/locales/so/translation.json b/frontend/lib/i18n/locales/so/translation.json
index 578ed24..7c8943a 100644
--- a/frontend/lib/i18n/locales/so/translation.json
+++ b/frontend/lib/i18n/locales/so/translation.json
@@ -2013,7 +2013,11 @@
"savedBody": "Goobta rugtaada waa la cusboonaysiiyay.",
"invalidCoords": "Latitude iyo longitude waa inay noqdaan tirooyin.",
"errorTitle": "Lama kaydin karin goobta",
- "error": "Fadlan mar kale isku day."
+ "error": "Fadlan mar kale isku day.",
+ "useMyLocation": "Isticmaal goobtayda hadda",
+ "locating": "Waa la helayaa goobta…",
+ "geoUnsupported": "Goobta laguma heli karo qalabkan.",
+ "geoError": "Lama heli karin goobtaada. Hubi oggolaanshaha oo isku day mar kale."
},
"signing": {
"keyTitle": "Furaha saxiixa",
@@ -2125,6 +2129,16 @@
"savedBody": "Qaabaynta AI-gaaga waa la cusbooneysiiyay.",
"saveFailedTitle": "Lama kaydin karin",
"saveFailedBody": "Kaydinta dejinta AI waa fashilantay. Fadlan isku day mar kale."
+ },
+ "portal": {
+ "title": "Boggaga Bukaanka",
+ "description": "La wadaag bukaannada boggaga ballanqaadka guud ee rugtaada — waxay arki karaan dhakhtarradaada oo ballan qaadan karaan.",
+ "linkLabel": "Linkiga boggaga",
+ "linkDescription": "Bogga guud ee bukaannadu furaan si ay ballan ugu qaataan rugtaada.",
+ "open": "Fur boggaga",
+ "showQr": "Muuji koodhka QR",
+ "qrTitle": "Koodhka QR ee Boggaga Bukaanka",
+ "qrDescription": "Bukaannadu waxay tan sawiraan si ay u furaan boggaga rugtaada — ama ku sawir abka Temetro wallet si aad ballan u qaadato."
}
},
"portal": {
diff --git a/frontend/package.json b/frontend/package.json
index 533b5c7..4e68314 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -1,6 +1,6 @@
{
"name": "frontend",
- "version": "0.9.0",
+ "version": "0.10.0",
"private": true,
"scripts": {
"dev": "next dev",
diff --git a/package.json b/package.json
index ca80788..530e001 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "temetro",
- "version": "0.9.0",
+ "version": "0.10.0",
"private": true,
"devDependencies": {
"shadcn": "^4.11.0"