From 09d4ff419113d37608eef3ed662da7c181622a4d Mon Sep 17 00:00:00 2001 From: Arthrevs Date: Tue, 26 May 2026 19:30:30 +0530 Subject: [PATCH 1/4] feat: smart recenter and on-demand road routing --- frontend/src/components/RealMap.jsx | 175 +++++++++++++++++++++++----- frontend/src/final-design.css | 15 ++- 2 files changed, 157 insertions(+), 33 deletions(-) diff --git a/frontend/src/components/RealMap.jsx b/frontend/src/components/RealMap.jsx index fdeec90..b0f09b5 100644 --- a/frontend/src/components/RealMap.jsx +++ b/frontend/src/components/RealMap.jsx @@ -1,8 +1,9 @@ -import React, { useEffect, useMemo, useRef, useState } from 'react'; -import { MapContainer, TileLayer, Marker, ZoomControl, useMap, Polyline, Popup } from 'react-leaflet'; +import React, { useEffect, useMemo, useRef, useState, useCallback } from 'react'; +import { MapContainer, TileLayer, Marker, ZoomControl, useMap, useMapEvents, Polyline, Popup } from 'react-leaflet'; import ContactCard from './ContactCard'; import L from 'leaflet'; import 'leaflet/dist/leaflet.css'; +import { fetchOSRMPolyline } from '../utils/routeCache'; /** * Real GPS-anchored map using Leaflet + OpenStreetMap tiles. @@ -128,6 +129,14 @@ function MapResizer() { return null; } +/** Listens for clicks on the map background to clear the active route. */ +function MapClickHandler({ onMapClick }) { + useMapEvents({ + click: () => onMapClick?.(), + }); + return null; +} + /** Tile-load listener — flips off the loading shimmer when the first * batch of CartoDB tiles has actually rendered. */ function TileLoadSignal({ onLoad }) { @@ -161,6 +170,9 @@ const RealMap = React.forwardRef(function RealMap( ) { const internalMapRef = useRef(null); const [tilesLoaded, setTilesLoaded] = useState(false); + const [activeRouteId, setActiveRouteId] = useState(null); + const [activeRouteCoords, setActiveRouteCoords] = useState(null); + const [routeLoading, setRouteLoading] = useState(false); // Default fallback (India centroid) until GPS arrives — better than a blank screen. const lat = location?.lat ?? 20.5937; @@ -176,6 +188,43 @@ const RealMap = React.forwardRef(function RealMap( [contacts], ); + /** Fetch OSRM road route for a specific contact marker. */ + const handleMarkerClick = useCallback(async (contact) => { + const cId = contact.id || `${contact.lat},${contact.lon}`; + // If same marker tapped again, just toggle off + if (activeRouteId === cId) { + setActiveRouteId(null); + setActiveRouteCoords(null); + return; + } + setActiveRouteId(cId); + setActiveRouteCoords(null); + setRouteLoading(true); + try { + const polyline = await fetchOSRMPolyline( + { lat, lon }, + { lat: contact.lat, lon: contact.lon } + ); + if (polyline) { + // OSRM returns [lon, lat] pairs — convert to [lat, lon] for Leaflet + setActiveRouteCoords(polyline.map(([lng, lt]) => [lt, lng])); + } else { + // Fallback: keep straight line if OSRM fails + setActiveRouteCoords(null); + } + } catch { + setActiveRouteCoords(null); + } finally { + setRouteLoading(false); + } + }, [activeRouteId, lat, lon]); + + /** Clear active route when user taps map background or popup closes. */ + const clearActiveRoute = useCallback(() => { + setActiveRouteId(null); + setActiveRouteCoords(null); + }, []); + return (
{/* Loading shimmer — fades out once tiles render */} @@ -220,36 +269,76 @@ const RealMap = React.forwardRef(function RealMap( + {hasGps && ( )} - {serviceMarkers.map((c) => ( - - {hasGps && ( - { + const cId = c.id || `${c.lat},${c.lon}`; + const isActive = activeRouteId === cId; + const hasRoadRoute = isActive && activeRouteCoords; + + return ( + + {hasGps && hasRoadRoute && ( + /* Glowing road polyline — underlay (glow) + overlay (sharp line) */ + <> + + + + )} + {hasGps && !hasRoadRoute && ( + + )} + handleMarkerClick(c), + popupclose: clearActiveRoute, }} - interactive={false} - /> - )} - - - - - - - ))} + > + + + + + + ); + })} {/* Custom Zoom Panel Overlay */} @@ -285,10 +374,36 @@ const RealMap = React.forwardRef(function RealMap( title="Recenter" onClick={(e) => { e.preventDefault(); - if (internalMapRef.current) { - const targetZoom = serviceMarkers?.length > 0 ? zoom + 1 : zoom; - internalMapRef.current.setView([lat, lon], targetZoom, { animate: true, duration: 0.6 }); - } + if (!internalMapRef.current) return; + const map = internalMapRef.current; + const container = map.getContainer(); + const containerH = container.offsetHeight; + + // Measure the top toolbar and bottom SOS bar heights + const toolbar = document.querySelector('.toolbar'); + const sosBar = document.querySelector('.glass-sos-container') || document.querySelector('.dock-interactive-zone'); + const topH = toolbar ? toolbar.offsetHeight + toolbar.getBoundingClientRect().top - container.getBoundingClientRect().top : 56; + const bottomH = sosBar ? containerH - (sosBar.getBoundingClientRect().top - container.getBoundingClientRect().top) : 80; + + // Visible area between top bar and SOS bar + const visibleH = containerH - topH - bottomH; + // The visible midpoint (from top of container) = topH + visibleH/2 + const visibleMid = topH + visibleH / 2; + // The geometric center is containerH/2 + const geomCenter = containerH / 2; + // panBy positive Y = viewport shifts down = dot moves UP on screen + // We want the dot at visibleMid (above geomCenter), so offset is positive + const offsetY = geomCenter - visibleMid; + + // Zoom in 25% more than base zoom + const targetZoom = Math.min(zoom + 2, 18); + + // First center on the user location at the target zoom + map.setView([lat, lon], targetZoom, { animate: true, duration: 0.6 }); + // Then shift by the offset so the dot is in the visible center + setTimeout(() => { + map.panBy([0, offsetY], { animate: true, duration: 0.3 }); + }, 650); }} > diff --git a/frontend/src/final-design.css b/frontend/src/final-design.css index 6787d28..a694d2f 100644 --- a/frontend/src/final-design.css +++ b/frontend/src/final-design.css @@ -4137,6 +4137,15 @@ background: #F4F4F4 !important; } +/* Route loading pulse animation */ +@keyframes rs-route-pulse { + 0%, 100% { opacity: 0.7; } + 50% { opacity: 1; } +} +.rs-route-loading { + animation: rs-route-pulse 1s ease-in-out infinite; +} + /* Pop box size reduction (approx 45% smaller) */ .rs-custom-popup .leaflet-popup-content { min-width: 170px !important; @@ -5563,7 +5572,7 @@ /* left: SOS label */ .sos-label { - font-size: 13px; + font-size: 14.5px; font-weight: 800; color: #fff; letter-spacing: 0.06em; @@ -5572,7 +5581,7 @@ /* arrow */ .arrow-sep { - font-size: 12px; + font-size: 13px; font-weight: 400; color: rgba(255,255,255,0.4); flex-shrink: 0; @@ -5580,7 +5589,7 @@ /* destination */ .sos-dest { - font-size: 13px; /* matched to SOS */ + font-size: 14.5px; /* matched to SOS */ font-weight: 800; /* matched to SOS */ color: #fff; /* matched to SOS */ letter-spacing: 0.01em; From d32e9c16456ec9397f36fb93d032a1788afcdef2 Mon Sep 17 00:00:00 2001 From: Arthrevs Date: Thu, 28 May 2026 13:11:19 +0530 Subject: [PATCH 2/4] Update translations and fix styling --- frontend/src/components/ContactCard.jsx | 64 ++- frontend/src/components/MapHero.jsx | 6 +- frontend/src/components/RealMap.jsx | 118 ++---- frontend/src/final-design.css | 171 ++++---- frontend/src/i18n/am.json | 198 ++++----- frontend/src/i18n/ar.json | 316 +++++++------- frontend/src/i18n/as.json | 214 +++++----- frontend/src/i18n/bn.json | 358 ++++++++-------- frontend/src/i18n/brx.json | 534 ++++++++++++------------ frontend/src/i18n/de.json | 268 ++++++------ frontend/src/i18n/doi.json | 448 ++++++++++---------- frontend/src/i18n/el.json | 260 ++++++------ 12 files changed, 1467 insertions(+), 1488 deletions(-) diff --git a/frontend/src/components/ContactCard.jsx b/frontend/src/components/ContactCard.jsx index 736f1a6..cb1b5cc 100644 --- a/frontend/src/components/ContactCard.jsx +++ b/frontend/src/components/ContactCard.jsx @@ -1,6 +1,6 @@ import React from 'react'; import { useTranslation } from 'react-i18next'; -import { Hospital, Shield, Ambulance, Truck, Wrench, Cog, Car, PhoneCall, Navigation, Zap } from 'lucide-react'; +import { Hospital, Shield, Ambulance, Truck, Wrench, Cog, Car, PhoneCall, Phone, Navigation, Zap } from 'lucide-react'; import { guardedTelDial } from '../utils/demoMode'; const CATEGORY_CONFIG = { @@ -36,40 +36,38 @@ export default function ContactCard({ contact, isLast, variant }) { else if (typeof distance === 'number' && distance >= 4) statusAttr = 'far'; if (variant === 'popup') { + let catClass = 'cat-neutral'; + if (cat === 'hospital' || cat === 'ambulance') catClass = 'cat-medical'; + else if (cat === 'police') catClass = 'cat-police'; + else if (cat === 'fire') catClass = 'cat-fire'; + return ( -
-
{name}
-
- {callHref ? ( - guardedTelDial(e, phoneClean, name)} - > - - {phone} - - ) : ( -
- - {t('actions.no_phone')} -
- )} -
-
-
{kmValue} {t('card.km', 'KM')}
- {mapsHref && ( - - - {t('actions.directions')} - +
+
{name}
+
+
+ {callHref && ( + <> + +
+ )} + +
); diff --git a/frontend/src/components/MapHero.jsx b/frontend/src/components/MapHero.jsx index 6aa4480..6d2b966 100644 --- a/frontend/src/components/MapHero.jsx +++ b/frontend/src/components/MapHero.jsx @@ -282,13 +282,13 @@ export default function MapHero({ )} {demoMode && onTestCrash && ( )} diff --git a/frontend/src/components/RealMap.jsx b/frontend/src/components/RealMap.jsx index b0f09b5..2c99c67 100644 --- a/frontend/src/components/RealMap.jsx +++ b/frontend/src/components/RealMap.jsx @@ -1,9 +1,8 @@ -import React, { useEffect, useMemo, useRef, useState, useCallback } from 'react'; -import { MapContainer, TileLayer, Marker, ZoomControl, useMap, useMapEvents, Polyline, Popup } from 'react-leaflet'; -import ContactCard from './ContactCard'; +import React, { useEffect, useRef, useState, useMemo, useCallback } from 'react'; +import { MapContainer, TileLayer, Marker, Popup, useMap, useMapEvents } from 'react-leaflet'; import L from 'leaflet'; import 'leaflet/dist/leaflet.css'; -import { fetchOSRMPolyline } from '../utils/routeCache'; +import ContactCard from './ContactCard'; /** * Real GPS-anchored map using Leaflet + OpenStreetMap tiles. @@ -89,6 +88,7 @@ function buildServiceIcon(contact) { `, iconSize: [60, 80], iconAnchor: [30, 80], + popupAnchor: [0, -85], }); } @@ -169,10 +169,9 @@ const RealMap = React.forwardRef(function RealMap( externalRef ) { const internalMapRef = useRef(null); + const preTapViewRef = useRef(null); // saves { center, zoom } before marker tap const [tilesLoaded, setTilesLoaded] = useState(false); - const [activeRouteId, setActiveRouteId] = useState(null); - const [activeRouteCoords, setActiveRouteCoords] = useState(null); - const [routeLoading, setRouteLoading] = useState(false); + const [activeMarkerId, setActiveMarkerId] = useState(null); // Default fallback (India centroid) until GPS arrives — better than a blank screen. const lat = location?.lat ?? 20.5937; @@ -188,41 +187,40 @@ const RealMap = React.forwardRef(function RealMap( [contacts], ); - /** Fetch OSRM road route for a specific contact marker. */ - const handleMarkerClick = useCallback(async (contact) => { + const handleMarkerClick = useCallback((contact) => { const cId = contact.id || `${contact.lat},${contact.lon}`; + const map = internalMapRef.current; + if (!map) return; + // If same marker tapped again, just toggle off - if (activeRouteId === cId) { - setActiveRouteId(null); - setActiveRouteCoords(null); + if (activeMarkerId === cId) { + setActiveMarkerId(null); + if (preTapViewRef.current) { + map.setView(preTapViewRef.current.center, preTapViewRef.current.zoom, { animate: true, duration: 0.5 }); + preTapViewRef.current = null; + } return; } - setActiveRouteId(cId); - setActiveRouteCoords(null); - setRouteLoading(true); - try { - const polyline = await fetchOSRMPolyline( - { lat, lon }, - { lat: contact.lat, lon: contact.lon } - ); - if (polyline) { - // OSRM returns [lon, lat] pairs — convert to [lat, lon] for Leaflet - setActiveRouteCoords(polyline.map(([lng, lt]) => [lt, lng])); - } else { - // Fallback: keep straight line if OSRM fails - setActiveRouteCoords(null); - } - } catch { - setActiveRouteCoords(null); - } finally { - setRouteLoading(false); + + // Save current map state before any changes + if (!preTapViewRef.current) { + preTapViewRef.current = { center: map.getCenter(), zoom: map.getZoom() }; } - }, [activeRouteId, lat, lon]); + + setActiveMarkerId(cId); + // Zoom in by 1 level (brings marker closer to user's view) + const targetZoom = Math.min(map.getMaxZoom() || 18, map.getZoom() + 1); + + map.setView([contact.lat, contact.lon], targetZoom, { animate: true, duration: 0.5 }); + }, [activeMarkerId]); - /** Clear active route when user taps map background or popup closes. */ - const clearActiveRoute = useCallback(() => { - setActiveRouteId(null); - setActiveRouteCoords(null); + const clearActiveMarker = useCallback(() => { + setActiveMarkerId(null); + const map = internalMapRef.current; + if (map && preTapViewRef.current) { + map.setView(preTapViewRef.current.center, preTapViewRef.current.zoom, { animate: true, duration: 0.5 }); + preTapViewRef.current = null; + } }, []); return ( @@ -269,7 +267,7 @@ const RealMap = React.forwardRef(function RealMap( - + {hasGps && ( @@ -277,59 +275,15 @@ const RealMap = React.forwardRef(function RealMap( {serviceMarkers.map((c) => { const cId = c.id || `${c.lat},${c.lon}`; - const isActive = activeRouteId === cId; - const hasRoadRoute = isActive && activeRouteCoords; - return ( - {hasGps && hasRoadRoute && ( - /* Glowing road polyline — underlay (glow) + overlay (sharp line) */ - <> - - - - )} - {hasGps && !hasRoadRoute && ( - - )} handleMarkerClick(c), - popupclose: clearActiveRoute, + popupclose: clearActiveMarker, }} > diff --git a/frontend/src/final-design.css b/frontend/src/final-design.css index a694d2f..db2b0c5 100644 --- a/frontend/src/final-design.css +++ b/frontend/src/final-design.css @@ -4190,8 +4190,7 @@ .app.theme-dark .svc-card, .app.theme-dark .mh-dock-card, .app.theme-dark .medical-card, -.app.theme-dark .lang-card, -.app.theme-dark .rs-popup-card { +.app.theme-dark .lang-card { background: var(--rs-navy-soft) !important; border-color: rgba(255, 255, 255, 0.1) !important; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.5) !important; @@ -4211,94 +4210,83 @@ color: #94A3B8 !important; } -/* Custom Popup Variant Layout */ -.popup-variant-card { - display: flex; +/* ----------------------------------------------------------------------- + Custom Popup Variant Layout (Native-Glass Transparent) + ----------------------------------------------------------------------- */ +.rs-popup-card-v2 { + display: inline-flex; flex-direction: column; - background: transparent; - color: #0F172A; - gap: 10px; - padding: 4px; + border-radius: 10px; + overflow: hidden; + border: 2px solid var(--cat, rgba(255,255,255,0.35)); + background: rgba(10, 12, 20, 0.10); + max-width: 210px; } - -.app.theme-dark .popup-variant-card { - color: #FFFFFF; +.app.theme-light .rs-popup-card-v2 { + background: rgba(255,255,255,0.10); + border: 2px solid var(--cat, rgba(0,0,0,0.2)); } -.popup-variant-card .popup-name { - font-family: var(--rs-font-display); - font-size: 13px; +.cat-medical { --cat: rgba(34,197,94,0.75); --name-color: #22c55e; } /* Green */ +.cat-police { --cat: rgba(59,130,246,0.75); --name-color: #3b82f6; } /* Blue */ +.cat-fire { --cat: rgba(239,68,68,0.75); --name-color: #ef4444; } /* Red */ +.cat-neutral { --cat: rgba(168,85,247,0.75); --name-color: #a855f7; } /* Purple */ +.app.theme-light .rs-popup-card-v2.cat-neutral { --cat: rgba(147,51,234,0.75); --name-color: #9333ea; } + +.rs-popup-card-v2 .card-name { + font-size: 12px; font-weight: 700; + letter-spacing: -0.01em; line-height: 1.3; + padding: 7px 10px 6px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + color: var(--name-color, rgba(255,255,255,0.92)); + background: #ffffff; } +.app.theme-light .rs-popup-card-v2 .card-name { background: #ffffff; color: var(--name-color, rgba(0,0,0,0.88)); } -.popup-variant-card .popup-phone-row { - display: flex; - justify-content: flex-start; -} - -.popup-variant-card .call-btn { - display: inline-flex; - align-items: center; - gap: 6px; - background: #2563EB; - color: #FFFFFF; - padding: 8px 12px; - border-radius: 8px; - font-weight: 600; - font-size: 13px; - text-decoration: none; -} +.rs-popup-card-v2 .card-rule { height: 1px; flex-shrink: 0; background: var(--cat, rgba(255,255,255,0.1)); } +.app.theme-light .rs-popup-card-v2 .card-rule { background: var(--cat, rgba(0,0,0,0.1)); } -.popup-variant-card .popup-bottom-row { +.rs-popup-card-v2 .card-actions { display: flex; - align-items: center; - justify-content: space-between; -} - -.popup-variant-card .popup-km-text { - font-family: var(--rs-font-display); - font-weight: 800; - font-size: 16px; - color: #0F172A; -} - -.app.theme-dark .popup-variant-card .popup-km-text { - color: #FFFFFF; + align-items: stretch; + width: 100%; } -.popup-variant-card .maps-link { - display: inline-flex; +.rs-popup-card-v2 .ic-btn { + flex: 1; + display: flex; align-items: center; - gap: 6px; - color: #1D4ED8; - font-weight: 600; - font-size: 13px; - text-decoration: none; + justify-content: center; + min-height: 30px; + height: 100%; + border: none; background: transparent; - border: 1px solid #CBD5E1; - padding: 6px 12px; - border-radius: 6px; + cursor: pointer; + outline: none; + -webkit-tap-highlight-color: transparent; + transition: background 0.1s, transform 0.1s; } - -.app.theme-dark .popup-variant-card .maps-link { - color: #60A5FA; - border-color: rgba(255, 255, 255, 0.2); +.rs-popup-svg { + width: clamp(13px, 45%, 18px); + height: clamp(13px, 45%, 18px); + transition: all 0.2s ease; } +.rs-popup-card-v2 .ic-btn:active { transform: scale(0.88); } -.rs-custom-popup .popup-variant-card { - background: #FFFFFF; - border-radius: 12px; - padding: 12px; - box-shadow: 0 4px 12px rgba(0,0,0,0.15); - border: 1px solid rgba(0,0,0,0.08); -} +.rs-popup-card-v2 .ic-btn svg { stroke: none !important; fill: #ffffff; } +.rs-popup-card-v2 .btn-call svg { stroke: none !important; fill: #3b82f6 !important; } +.app.theme-light .rs-popup-card-v2 .ic-btn svg { stroke: none !important; fill: #000000; } +.app.theme-light .rs-popup-card-v2 .btn-call svg { stroke: none !important; fill: #2563eb !important; } -.app.theme-dark .rs-custom-popup .popup-variant-card { - background: var(--rs-navy-soft); - border: 1px solid rgba(255,255,255,0.1); - box-shadow: 0 4px 12px rgba(0,0,0,0.5); -} +.rs-popup-card-v2 .ic-btn:active { background: rgba(255,255,255,0.08); } +.app.theme-light .rs-popup-card-v2 .ic-btn:active { background: rgba(0,0,0,0.06); } + +.rs-popup-card-v2 .ic-sep { width: 1px; flex-shrink: 0; align-self: stretch; background: var(--cat, rgba(255,255,255,0.1)); } +.app.theme-light .rs-popup-card-v2 .ic-sep { background: var(--cat, rgba(0,0,0,0.1)); } /* Ensure header buttons start from extreme left */ .mh-top-row { @@ -4648,6 +4636,45 @@ .toolbar-light .btn-icon:hover svg { stroke: rgba(0,0,0,1); } .toolbar-light .btn-icon:active { transform: scale(0.88); } +/* DEMO CRASH BUTTON */ +.btn-demo-crash { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 2px; + height: 42px; + padding: 0 8px; + border-radius: 8px; + background: transparent; + border: 1px solid rgba(0, 0, 0, 0.4); + color: inherit; + cursor: pointer; + outline: none; + transition: background 0.16s ease, transform 0.1s ease, border-color 0.16s ease; + flex-shrink: 0; +} +.btn-demo-crash .demo-crash-text { + font-size: 8px; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.02em; +} +.toolbar-dark .btn-demo-crash { + border: 1px solid rgba(255, 255, 255, 0.2); + color: rgba(255, 255, 255, 0.9); +} +.toolbar-dark .btn-demo-crash svg { stroke: rgba(255,255,255,0.9); } +.toolbar-dark .btn-demo-crash:hover { background: rgba(255,255,255,0.08); border-color: rgba(255,255,255,0.4); } +.toolbar-dark .btn-demo-crash:active { transform: scale(0.95); } + +.toolbar-light .btn-demo-crash { + border: 1px solid rgba(0, 0, 0, 0.3); +} +.toolbar-light .btn-demo-crash svg { stroke: rgba(0,0,0,0.85); } +.toolbar-light .btn-demo-crash:hover { background: rgba(0,0,0,0.06); border-color: rgba(0,0,0,0.5); } +.toolbar-light .btn-demo-crash:active { transform: scale(0.95); } + /* TOOLTIP */ .tip { position: absolute; diff --git a/frontend/src/i18n/am.json b/frontend/src/i18n/am.json index 2a51f8e..e75e406 100644 --- a/frontend/src/i18n/am.json +++ b/frontend/src/i18n/am.json @@ -4,26 +4,26 @@ "lang.subtitle": "በደንብ የሚረዱትን ቋንቋ ይምረጡ። ቆይተው መለወጥ ይችላሉ።", "lang.continue": "ቀጥል", "location.finding": "አካባቢን እየፈለገ ነው...", - "location.waiting": "ምልክት እየጠበቀ...", + "location.waiting": "ሲግናል በመጠበቅ ላይ...", "location.cached": "የተቀመጠ", "status.online": "ኦንላይን", "status.offline": "ኦፍላይን", - "status.connecting": "ግንኙነት…", - "sos.send": "SOS — አካባቢ ላክ", - "sos.waiting": "SOS — GPS እየጠበቀ", + "status.connecting": "ሰርቨር በማንቃት ላይ…", + "sos.send": "ኤስኦኤስ — አካባቢ ላክ", + "sos.waiting": "ኤስኦኤስ — ጂፒኤስ በመጠበቅ ላይ", "sos.sent": "አካባቢ ተልኳል", - "sos.no_contact_warning": "የአስቸኳይ አድራሻ የለም — ለቀጥታ SOS በ Medical ID ላይ ይጨምሩ", - "sos.copy_coords": "GPS ኮኦርዲኔት ቅዳ", - "sos.copied": "ተቀዳ", - "sos.to_contacts": "ኤስኦኤስ → {{ስም}}", + "sos.no_contact_warning": "የአደጋ ጊዜ እውቂያ የለም — ለቀጥታ ኤስኦኤስ በህክምና መታወቂያ ላይ ይጨምሩ", + "sos.copy_coords": "የጂፒኤስ መጋጠሚያዎችን ቅዳ", + "sos.copied": "ተቀድቷል", + "sos.to_contacts": "ኤስኦኤስ → {{name}}", "emergency.ambulance": "አምቡላንስ", "emergency.police": "ፖሊስ", "emergency.fire": "እሳት አደጋ", "emergency.disaster": "አደጋ", "actions.plan_trip": "ጉዞ አቅድ", "actions.medical_id": "የህክምና መታወቂያ", - "actions.medical_id_unset": "Medical ID አዋቅር — ለቀጥታ SOS ያስፈልጋል", - "actions.test_crash": "ሙከራ አደጋ", + "actions.medical_id_unset": "የህክምና መታወቂያ አዋቅር — ለቀጥታ ኤስኦኤስ ያስፈልጋል", + "actions.test_crash": "የብልሽት ሙከራ", "dock.nearest": "በቅርብ ያሉ {{count}} · ለመደወል ይንኩ", "dock.see_all": "ሁሉንም ይመልከቱ", "category.hospital": "ሆስፒታል", @@ -35,18 +35,18 @@ "category.puncture": "ጎማ ጥገና", "category.showroom": "ሾው ሩም", "crash.detected": "አደጋ ተገኝቷል", - "crash.choose_mode": "SOS እንዴት ይላክ?", + "crash.choose_mode": "ኤስኦኤስ እንዴት ይላክ?", "crash.auto": "ራስ-ሰር ላክ", "crash.manual": "በእጅ", "crash.cancel": "ሰርዝ — የተሳሳተ ማንቂያ", - "crash.pin_prompt": "ለመሰረዝ PIN አስገባ", - "crash.countdown": "በ {{n}} ሰከንድ ውስጥ ይላካል", + "crash.pin_prompt": "ለመሰረዝ ፒን አስገባ", + "crash.countdown": "በ{{n}} ሰከንድ ውስጥ ይላካል", "medical_id.title": "የህክምና መታወቂያ", "medical_id.name": "ሙሉ ስም", "medical_id.blood_type": "የደም ቡድን", "medical_id.allergies": "አለርጂዎች", "medical_id.conditions": "የጤና ሁኔታዎች", - "medical_id.contacts": "የአስቸኳይ አድራሻዎች", + "medical_id.contacts": "የአደጋ ጊዜ እውቂያዎች", "medical_id.save": "አስቀምጥ", "medical_id.cancel": "ሰርዝ", "header.emergency_numbers": "የአደጋ ቁጥሮች", @@ -54,8 +54,8 @@ "header.nearby_services": "አጠገብ ያሉ አገልግሎቶች", "header.searching": "በመፈለግ ላይ...", "header.found": "{{n}} ተገኝቷል", - "header.prioritised": "ቅድሚያ ተሰጥቷል", - "header.ai": "AI", + "header.prioritised": "ቅድሚያ የተሰጣቸው", + "header.ai": "ኤአይ", "actions.prioritise": "ለሁኔታዬ ቅድሚያ ስጥ", "actions.re_prioritise": "እንደገና ቅድሚያ ስጥ", "actions.directions": "አቅጣጫዎች", @@ -72,11 +72,11 @@ "card.closed": "ዝግ", "card.unknown_status": "ሁኔታ አይታወቅም", "footer.offline_fallback": "አገልጋዩን መድረስ አልተቻለም — የማሳያ ውሂብ። የአደጋ ቁጥሮች ሁልጊዜ ከመስመር ውጭ ይሰራሉ።", - "track.share_prompt": "አዳኞች ጋር ቀጥታ ቦታ ያጋሩ:", + "track.share_prompt": "ከአዳኞች ጋር ቀጥታ ቦታ ያጋሩ:", "track.copy_link": "ሊንክ ቅዳ", "track.copied": "ተቀድቷል!", - "track.creating": "ቀጥታ ሊንክ እየፈጠሩ...", - "track.failed": "ቀጥታ ሊንክ ከበስተ ኢንተርኔት አይገኝም", + "track.creating": "ቀጥታ ሊንክ እየተፈጠረ ነው...", + "track.failed": "ከመስመር ውጭ ቀጥታ ሊንክ አይገኝም", "actions.set_location": "ቦታን በእጅ ያዘጋጁ", "status.manual": "ማንዋል", "manual_location.title": "አካባቢን አዘጋጅ", @@ -85,114 +85,114 @@ "manual_location.search_address": "አድራሻ ይፈልጉ", "manual_location.search_placeholder": "ከተማ፣ አድራሻ ወይም መጋጠሚያዎች", "manual_location.searching": "በመፈለግ ላይ…", - "manual_location.no_results": "ምንም ውጤቶች አልተገኙም።", + "manual_location.no_results": "ምንም ውጤቶች አልተገኙም", "manual_location.tap_hint": "አካባቢዎን ለማዘጋጀት በካርታው ላይ የትኛውም ቦታ ላይ መታ ያድርጉ", "actions.change_language": "ቋንቋ ቀይር", "medical_id.badge": "የህክምና መታወቂያ", "medical_id.welcome_title": "የእርስዎን ያዋቅሩ", - "medical_id.welcome_subtitle": "ንቃተ ህሊና ከሌለዎት ፓራሜዲኮች ይህንን ማግኘት ይችላሉ።", - "medical_id.subtitle": "30 ሰከንድ አካባቢ ይወስዳል · በዚህ መሳሪያ ላይ ብቻ ተከማችቷል።", - "medical_id.privacy_title": "የእርስዎ ውሂብ ከዚህ መሣሪያ ፈጽሞ አይወጣም።", - "medical_id.privacy_text": "በአገር ውስጥ ብቻ ተከማችቷል። ወደ ማንኛውም አገልጋይ በጭራሽ አልተሰቀለም። ኤስ.ኦ.ኤስ ሲነቃ ብቻ ለድንገተኛ አደጋ አገልግሎቶች መጋራት።", + "medical_id.welcome_subtitle": "ንቃተ ህሊና ከሌለዎት ፓራሜዲኮች ይህንን ማግኘት ይችላሉ", + "medical_id.subtitle": "30 ሰከንድ አካባቢ ይወስዳል · በዚህ መሳሪያ ላይ ብቻ ይቀመጣል", + "medical_id.privacy_title": "የእርስዎ ውሂብ ከዚህ መሣሪያ ፈጽሞ አይወጣም", + "medical_id.privacy_text": "በመሳሪያዎ ላይ ብቻ ተከማችቷል። ወደ ማንኛውም አገልጋይ በጭራሽ አልተሰቀለም። ኤስኦኤስ ሲነቃ ብቻ ለድንገተኛ አደጋ አገልግሎቶች ይጋራል።", "medical_id.profile_completion": "የመገለጫ ማጠናቀቅ", "medical_id.personal": "ግላዊ", - "medical_id.name_placeholder": "ለምሳሌ. አርጁን ሻርማ", + "medical_id.name_placeholder": "ለምሳሌ፦ አርጁን ሻርማ", "medical_id.age": "ዕድሜ (ዓመታት)", "medical_id.months": "ወራት", - "medical_id.months_hint": "(<1 አመት ከሆነ)", - "medical_id.months_note": "የወራት መስክ - ከ 1 ዓመት በታች ለሆኑ ህጻናት አስፈላጊ ነው", + "medical_id.months_hint": "(ከ1 ዓመት በታች ከሆነ)", + "medical_id.months_note": "የወራት መስክ — ከ 1 ዓመት በታች ለሆኑ ህጻናት አስፈላጊ ነው", "medical_id.medical_details": "የሕክምና ዝርዝሮች", "medical_id.select_blood_type": "የደም ዓይነት ይምረጡ", - "medical_id.allergies_placeholder": "ለምሳሌ. ፔኒሲሊን, ኦቾሎኒ, ላቲክስ", - "medical_id.conditions_placeholder": "ለምሳሌ. አስም, የስኳር በሽታ ዓይነት 2", - "medical_id.medications_placeholder": "ለምሳሌ. metformin, salbutamol", + "medical_id.allergies_placeholder": "ለምሳሌ፦ ፔኒሲሊን፣ ኦቾሎኒ፣ ላቲክስ", + "medical_id.conditions_placeholder": "ለምሳሌ፦ አስም፣ የስኳር በሽታ ዓይነት 2", + "medical_id.medications_placeholder": "ለምሳሌ፦ ሜትፎርሚን፣ ሳልቡታሞል", "medical_id.contacts_label": "የአደጋ ጊዜ እውቂያዎች", - "medical_id.contacts_hint": "የኤስ ኦ ኤስ መልእክቶች ለሁሉም እውቂያዎች በአንድ ጊዜ ይላካሉ።", + "medical_id.contacts_hint": "የኤስኦኤስ መልእክቶች ለሁሉም እውቂያዎች በአንድ ጊዜ ይላካሉ።", "medical_id.contact1_label": "እውቂያ 1", "medical_id.contact2_label": "እውቂያ 2", "medical_id.contact3_label": "እውቂያ 3", "medical_id.name_label": "ስም", - "medical_id.example_mum": "ለምሳሌ. እማዬ ፣ አባ ፣ ራህል", - "medical_id.leave_blank": "ለመዝለል ባዶውን ይተዉት።", + "medical_id.example_mum": "ለምሳሌ፦ እማዬ፣ አባዬ፣ ራህል", + "medical_id.leave_blank": "ለመዝለል ባዶውን ይተዉት", "medical_id.phone_label": "ስልክ ቁጥር", - "medical_id.phone_placeholder": "ለምሳሌ. 9198765432 እ.ኤ.አ", + "medical_id.phone_placeholder": "ለምሳሌ፦ 9198765432", "medical_id.organ_donor_section": "የአካል ልገሳ", "medical_id.organ_donor": "እኔ የአካል ለጋሽ ነኝ", "medical_id.organ_donor_sub": "ለአደጋ ጊዜ ምላሽ ሰጪዎች የሚታይ", "medical_id.saved": "የህክምና መታወቂያ ተቀምጧል", - "medical_id.close": "ገጠመ", - "medical_id.skip": "ለአሁን ዝለል - በኋላ አቀናብር", - "plan_trip.placeholder": "ከተማ ፣ ከተማ ወይም የመሬት ምልክት", - "plan_trip.error_not_found": "ያንን ቦታ ማግኘት አልቻልኩም።", + "medical_id.close": "ዝጋ", + "medical_id.skip": "ለአሁን ዝለል — በኋላ አቀናብር", + "plan_trip.placeholder": "ከተማ፣ መንደር ወይም የመሬት ምልክት", + "plan_trip.error_not_found": "ያንን ቦታ ማግኘት አልተቻለም።", "plan_trip.use_current": "የአሁኑን ቦታ ተጠቀም", "plan_trip.offline_mode": "ከመስመር ውጭ ሁነታ", "plan_trip.title": "ከመስመር ውጭ ጉዞ ያቅዱ", - "plan_trip.subtitle": "በመስመር ላይ ሳለ መሸጎጫ ሆስፒታሎች እና ፖሊስ በመንገድዎ ላይ - በሴሉላር የሞተ ዞኖች ውስጥ ይሰራል።", + "plan_trip.subtitle": "በመስመር ላይ ሳሉ በመንገድዎ ላይ ያሉ ሆስፒታሎችን እና ፖሊስ ጣቢያዎችን ያስቀምጡ — የሞባይል ኔትወርክ በሌለበት ይሰራል።", "plan_trip.from": "ከ", - "plan_trip.to": "ለ", + "plan_trip.to": "ወደ", "plan_trip.quick_fill": "ፈጣን መድረሻዎች", - "plan_trip.info_idle": "በዚህ መስመር ላይ ያሉ ሆስፒታሎች፣ፖሊስ ጣቢያዎች እና የጥገና አገልግሎቶች ከመስመር ውጭ ጥቅም ላይ እንዲውሉ ይደረጋል።", - "plan_trip.info_done": "መንገድ ተደብቋል። የአደጋ ጊዜ እውቂያዎች አሁን ያለ በይነመረብ ይገኛሉ።", - "plan_trip.info_error": "ማንኛውንም የመንገድ ነጥቦችን መሸጎጫ ማድረግ አልተቻለም። ግንኙነትን ይፈትሹ እና እንደገና ይሞክሩ።", - "plan_trip.caching": "በመሸጎጥ ላይ...", - "plan_trip.cached": "የተሸጎጠ መንገድ", + "plan_trip.info_idle": "በዚህ መስመር ላይ ያሉ ሆስፒታሎች፣ ፖሊስ ጣቢያዎች እና የጥገና አገልግሎቶች ከመስመር ውጭ ጥቅም ላይ እንዲውሉ ይቀመጣሉ።", + "plan_trip.info_done": "መንገዱ ተቀምጧል። የአደጋ ጊዜ እውቂያዎች አሁን ያለ በይነመረብ ይገኛሉ።", + "plan_trip.info_error": "የመንገድ ነጥቦችን ማስቀመጥ አልተቻለም። ግንኙነትን ይፈትሹ እና እንደገና ይሞክሩ።", + "plan_trip.caching": "በማስቀመጥ ላይ...", + "plan_trip.cached": "የተቀመጠ መንገድ", "plan_trip.plan_offline": "ከመስመር ውጭ ጉዞን ያቅዱ", - "plan_trip.cancel": "ሰርዝ - ተመለስ", + "plan_trip.cancel": "ሰርዝ — ተመለስ", "city.chennai": "ቼናይ", "city.bengaluru": "ቤንጋሉሩ", - "city.coimbatore": "Coimbatore", + "city.coimbatore": "ኮይምባቶር", "city.mumbai": "ሙምባይ", "city.delhi": "ዴሊ", "city.hyderabad": "ሃይደራባድ", "city.kolkata": "ኮልካታ", "city.pune": "ፑን", "triage.injured_q": "የተጎዳ ሰው አለ?", - "triage.yes_injured": "አዎ ተጎድቷል።", - "triage.no_injured": "ምንም ጉዳት የለም።", + "triage.yes_injured": "አዎ፣ ተጎድቷል", + "triage.no_injured": "ምንም ጉዳት የለም", "triage.blocking_q": "ተሽከርካሪው መንገዱን እየዘጋው ነው?", - "triage.yes_blocking": "አዎ፣ ማገድ", - "triage.no_blocking": "መንገዱ ግልጽ ነው።", + "triage.yes_blocking": "አዎ፣ ዘግቷል", + "triage.no_blocking": "መንገዱ ክፍት ነው", "triage.summary_idle": "ቅድሚያ የሚሰጠውን ምክር ለማግኘት ሁለቱንም ጥያቄዎች ይመልሱ።", - "triage.summary_injured": "ጉዳት ደረሰበት - አምቡላንስ (108) በቅድሚያ ቅድሚያ ይሰጣል.", - "triage.summary_blocked": "መንገድ ተዘግቷል - ፖሊስ (100) እና ተጎታች ይመከራል።", - "triage.summary_clear": "ምንም ጉዳት የለም፣ መንገድ ጥርት - የጥገና ወይም የመጎተት አገልግሎቶች ይጠቁማሉ።", - "triage.label": "ፈጣን ልዩነት", - "triage.title": "ምን ሆነ፧", - "triage.subtitle": "ሁለት ጥያቄዎች - ለእርስዎ ሁኔታ ትክክለኛውን እርዳታ ቅድሚያ እንሰጣለን.", - "triage.sos_btn": "ኤስ.ኦ.ኤስ", - "triage.prioritising": "⏳ ቅድሚያ መስጠት...", + "triage.summary_injured": "ጉዳት ተገልጿል — አምቡላንስ (108) ቅድሚያ ይሰጠዋል።", + "triage.summary_blocked": "መንገድ ተዘግቷል — ፖሊስ (100) እና ጎታች ይመከራል።", + "triage.summary_clear": "ምንም ጉዳት የለም፣ መንገድ ክፍት ነው — የጥገና ወይም የመጎተት አገልግሎቶች ይመከራሉ።", + "triage.label": "ፈጣን ቅድሚያ መለየት", + "triage.title": "ምን ተፈጠረ?", + "triage.subtitle": "ሁለት ጥያቄዎች — ለእርስዎ ሁኔታ ትክክለኛውን እርዳታ ቅድሚያ እንሰጣለን።", + "triage.sos_btn": "ኤስኦኤስ", + "triage.prioritising": "⏳ ቅድሚያ በመስጠት ላይ...", "triage.get_help": "ቅድሚያ የሚሰጠው እርዳታ ያግኙ", - "triage.answer_both": "ሁለቱንም ጥያቄዎች መልሱ", - "triage.skip": "ዝለል - ሁሉንም እውቂያዎች አሳይ", + "triage.answer_both": "ሁለቱንም ጥያቄዎች ይመልሱ", + "triage.skip": "ዝለል — ሁሉንም እውቂያዎች አሳይ", "medical_id.medications": "የአሁን መድሃኒቶች", "medical_id.optional": "አማራጭ", "medical_id.conditions_short": "ሁኔታዎች", "medical_id.organ_donor_label": "የአካል ለጋሽ", "medical_id.yes": "አዎ", "medical_id.edit": "አርትዕ", - "medical_id.empty_hint": "የህክምና መታወቂያ ገና አልተዘጋጀም። አርትዕ ይንኩ።", + "medical_id.empty_hint": "የህክምና መታወቂያ ገና አልተዘጋጀም። ፓራሜዲኮች የሚፈልጉትን መረጃ (የደም ዓይነት፣ አለርጂዎች፣ የአደጋ ጊዜ እውቂያዎች ወዘተ) ለመጨመር አርትዕን ይንኩ።", "medical_id.clear_all": "ሁሉንም አጽዳ", "medical_id.confirm_clear": "ሁሉንም የህክምና መታወቂያ ውሂብ ማጽዳት?", - "medical_id.contact_n": "የአደጋ ጊዜ ግንኙነት {{n}}", + "medical_id.contact_n": "የአደጋ ጊዜ እውቂያ {{n}}", "medical_id.contact1_name": "እውቂያ 1 ስም", "medical_id.contact1_phone": "እውቂያ 1 ስልክ", "medical_id.contact2_name": "እውቂያ 2 ስም", "medical_id.contact2_phone": "እውቂያ 2 ስልክ", "medical_id.contact3_name": "እውቂያ 3 ስም", "medical_id.contact3_phone": "እውቂያ 3 ስልክ", - "plan_trip.cache_route": "ለመስመር ውጭ አጠቃቀም መንገድ ይዘዘ", + "plan_trip.cache_route": "ለመስመር ውጭ አጠቃቀም መንገድ ያስቀምጡ", "plan_trip.close": "ዝጋ", "plan_trip.done": "ተጠናቅቋል", "actions.refresh_location": "ቦታ ያድሱ", "tooltip.test_crash": "የአደጋ ማንቂያ ሙከራ", "tooltip.manual_location": "በእጅ የተቀናበረ አካባቢ በመጠቀም ላይ", - "tooltip.backend_warming": "ከጀርባ እያነቃ ነው — ከተጠባባቂ በኋላ የመጀመሪያው ጥያቄ 30–55 ሰከንድ ሊወስድ ይችላል", - "tooltip.backend_fallback": "ከጀርባ ያልተመለሰ ቀጥታ ውሂብ — እንደገና ስንሞክር ቅድመ-የተጫነ ማውጫ እያሳየ ነው", - "tooltip.copy_gps": "GPS ቅዳ", - "tooltip.send_immediate_sos": "ፈጣን SOS ላክ", + "tooltip.backend_warming": "ሰርቨር በማንቃት ላይ — ከእረፍት በኋላ የመጀመሪያው ጥያቄ ከ30–55 ሰከንድ ሊወስድ ይችላል", + "tooltip.backend_fallback": "ሰርቨር ቀጥታ ውሂብ አልመለሰም — እንደገና ስንሞክር አስቀድሞ የተጫነ ማውጫ እያሳየ ነው", + "tooltip.copy_gps": "ጂፒኤስ ቅዳ", + "tooltip.send_immediate_sos": "ፈጣን ኤስኦኤስ ላክ", "common.close": "ዝጋ", "common.back": "ተመለስ", - "sos.sms_emergency": "🚨 ድንገተኛ — እርዳታ ያስፈልገኛል።", + "sos.sms_emergency": "🚨 ድንገተኛ አደጋ — እርዳታ ያስፈልገኛል።", "sos.sms_name": "ስም", "sos.sms_blood": "ደም", "sos.sms_allergies": "አለርጂዎች", @@ -200,47 +200,47 @@ "sos.sms_plus_code": "ፕላስ ኮድ", "sos.sms_near": "አቅራቢያ", "sos.sms_coords": "መጋጠሚያዎች", - "sos.sms_footer": "በ RoadSOS ራስ-ሰር ተልኳል።", + "sos.sms_footer": "በሮድኤስኦኤስ ራስ-ሰር የተላከ።", "dispatch.accident": "በ{{place}} ላይ የመንገድ አደጋ።", - "dispatch.injured_blocking": "በቦታው ላይ የቆሰሉ ሰዎች አሉ። ተሽከርካሪው ትራፊክ እያገደ ነው።", - "dispatch.injured_clear": "በቦታው ላይ የቆሰሉ ሰዎች አሉ። ተሽከርካሪው ትራፊክ አያግድም።", - "dispatch.no_injury_blocking": "ምንም ጉዳት አልተዘገበም። ተሽከርካሪው ትራፊክ እያገደ ነው።", + "dispatch.injured_blocking": "በቦታው ላይ የቆሰሉ ሰዎች አሉ። ተሽከርካሪው መንገዱን ዘግቷል።", + "dispatch.injured_clear": "በቦታው ላይ የቆሰሉ ሰዎች አሉ። ተሽከርካሪው መንገዱን አልዘጋም።", + "dispatch.no_injury_blocking": "ምንም ጉዳት አልተዘገበም። ተሽከርካሪው መንገዱን ዘግቷል።", "dispatch.minor": "ቀላል ክስተት። ምንም ጉዳት አልተዘገበም።", "dispatch.send_services": "እባክዎ ድንገተኛ አደጋ አገልግሎቶችን ወዲያውኑ ይላኩ።", "dispatch.plus_code": "የቦታ ፕላስ ኮድ", - "dispatch.gps_coords": "GPS መጋጠሚያዎች", - "dispatch.status_dispatched": "ኤስኦኤስ ተሰራጭቷል።", - "dispatch.status_shared": "አካባቢ ተጋርቷል።", + "dispatch.gps_coords": "የጂፒኤስ መጋጠሚያዎች", + "dispatch.status_dispatched": "ኤስኦኤስ ተሰራጭቷል", + "dispatch.status_shared": "አካባቢ ተጋርቷል", "dispatch.help_on_way": "እርዳታ በመንገድ ላይ ነው።", - "dispatch.circle_notified": "ክበብዎ እንዲታወቅ ተደርጓል።", - "dispatch.eta_kicker": "አምቡላንስ ኢታ", + "dispatch.circle_notified": "ለክበብዎ ማሳወቂያ ደርሷል።", + "dispatch.eta_kicker": "የአምቡላንስ መድረሻ ጊዜ", "dispatch.eta_unit": "ደቂቃ", "dispatch.what_we_sent": "የላክነው", "dispatch.live_updating": "ቀጥታ ስርጭት · በማዘመን ላይ", - "dispatch.location": "LOCATION", + "dispatch.location": "አካባቢ", "dispatch.speed": "በተጽዕኖ ውስጥ ፍጥነት", - "dispatch.triage": "TRIAGE", + "dispatch.triage": "ቅድሚያ መለየት", "dispatch.battery": "ባትሪ", - "dispatch.captured": "ተይዟል።", - "dispatch.who_alerted": "ማን ማስጠንቀቂያ ተሰጥቶታል።", + "dispatch.captured": "ተይዟል", + "dispatch.who_alerted": "ማን ማስጠንቀቂያ ተሰጥቶታል", "dispatch.your_circle": "የእርስዎ ክበብ", "dispatch.role_emergency": "ድንገተኛ አደጋ", "dispatch.role_hospital": "ሆስፒታል", - "dispatch.status_received": "ተቀበሉ", - "dispatch.status_alerted": "ማስጠንቀቂያ ተሰጥቶታል።", + "dispatch.status_received": "ተቀብለዋል", + "dispatch.status_alerted": "ማስጠንቀቂያ ተሰጥቷል", "dispatch.time_instant": "ቅጽበታዊ", "dispatch.time_just_now": "ልክ አሁን", - "dispatch.close": "ገጠመ", + "dispatch.close": "ዝጋ", "scene.photo_label": "የአደጋ ቦታ ፎቶ", - "scene.photo_hint": "SOS በሚነቃበት ጊዜ ራስ-ሰር ተነስቷል", - "scene.capturing": "ትዕይንት እየተነሣ ነው…", + "scene.photo_hint": "ኤስኦኤስ በሚነቃበት ጊዜ ራስ-ሰር ተነስቷል", + "scene.capturing": "ትዕይንት እየተነሳ ነው…", "scene.no_camera": "የትዕይንት ፎቶ አይገኝም", "tutorial.skip": "ዝለል", "tutorial.next": "ቀጣይ", "tutorial.yes": "አዎ", "tutorial.no": "አይ", "tutorial.step1": "የመተግበሪያውን ማጋዥ ስልጠና ይፈልጋሉ?", - "tutorial.step2": "ይህ ሁሉንም ተግባራዊ አዝራሮች ያቀፈ ከላይኛው አሞሌ ነው", + "tutorial.step2": "ይህ ሁሉንም ተግባራዊ አዝራሮች ያቀፈ የላይኛው አሞሌ ነው", "tutorial.step3": "እዚህ የበይነመረብ ግንኙነት ሁኔታን ማረጋገጥ ይችላሉ — ኦንላይን፣ ኦፍላይን ወይም ግንኙነት", "tutorial.step4": "ይህ የባህሪያት ስም፣ መረጃ እና የአደጋ ሙከራ ማሳያ ያለበት የጎን ምናሌ ነው", "tutorial.step5": "ይህ ስለ መተግበሪያችን ሁሉም ባህሪያት እና ማብሪያ/ማጥፊያዎች መረጃ ይዟል", @@ -251,27 +251,27 @@ "sidebar.plan_trip": "ከመስመር ውጭ ጉዞን ያቅዱ", "sidebar.manual_location": "በእጅ አካባቢ", "sidebar.toggle_theme": "ጨለማ / ቀላል ሁነታ", - "sidebar.recenter": "የእኔ አካባቢ የቅርብ ጊዜ", + "sidebar.recenter": "አካባቢዬን ማዕከል አድርግ", "sidebar.tutorial": "አጋዥ ስልጠና", - "sidebar.shortcut_info": "የእነዚህ አዝራሮች አቋራጭ እዚህ እንደተሰጡት ተጓዳኝ ምልክቶች በዋናው ማያ ገጽ ላይ ተሰጥቷል - ባህሪያት ከ 1 እስከ 5 በላይኛው አሞሌ ላይ እና 6 በማያ ገጽዎ በቀኝ በኩል።", + "sidebar.shortcut_info": "የእነዚህ አዝራሮች አቋራጭ ከዚህ በታች ከተሰጡት ተጓዳኝ ምልክቶች ጋር በዋናው ማያ ገጽ ላይ ተሰጥተዋል — ባህሪያት ከ 1 እስከ 5 በላይኛው አሞሌ ላይ እና 6 በማያ ገጽዎ በቀኝ በኩል።", "sidebar.crash_test_info": "የእኛን የብልሽት ሙከራ ማሳያ ለማየት ወደዚህ ሊንክ መሄድ ይችላሉ፡-", "sidebar.open_crash_test": "የብልሽት ሙከራ ማሳያን ክፈት", "dispatcher.call_dispatcher": "ዲስፓቸር ይደውሉ", - "dispatcher.in_control": "ቁጥጥር ውስጥ ነዎት", + "dispatcher.in_control": "ቁጥጥሩ በእጅዎ ነው", "dispatcher.explain_location": "ሁኔታውን ያብራሩ እና አካባቢዎን ያጋሩ።", "dispatcher.loc_approx": "አካባቢ ግምታዊ", - "dispatcher.acquiring_gps": "GPS በማግኘት ላይ...", + "dispatcher.acquiring_gps": "ጂፒኤስ በማግኘት ላይ...", "dispatcher.select_service": "አገልግሎት ይምረጡ", "dispatcher.ambulance": "አምቡላንስ", "dispatcher.police": "ፖሊስ", "dispatcher.general": "አጠቃላይ", "dispatcher.plus_code": "ፕላስ ኮድ", - "dispatcher.close_go_back": "ዝጋ - ወደ እውቂያዎች ተመለስ", + "dispatcher.close_go_back": "ዝጋ — ወደ እውቂያዎች ተመለስ", "crash_alert.call_dispatcher": "ዲስፓቸር ይደውሉ", - "crash_alert.you_re_in_control": "ቁጥጥር ውስጥ ነዎት", + "crash_alert.you_re_in_control": "ቁጥጥሩ በእጅዎ ነው", "crash_alert.explain_situation": "ሁኔታውን ያብራሩ እና አካባቢዎን ያጋሩ።", "crash_alert.location_approximate": "አካባቢ ግምታዊ", - "crash_alert.acquiring_gps": "GPS በማግኘት ላይ...", + "crash_alert.acquiring_gps": "ጂፒኤስ በማግኘት ላይ...", "crash_alert.select_service": "አገልግሎት ይምረጡ", "crash_alert.ambulance": "አምቡላንስ", "crash_alert.police": "ፖሊስ", @@ -279,7 +279,7 @@ "crash_alert.plus_code_label": "ፕላስ ኮድ", "crash_choosing.crash_detected": "አደጋ ተገኝቷል", "crash_choosing.do_not_panic": "አትደናገጡ", - "crash_choosing.seconds_until": "ሰከንዶች ለራስ-ሰር SOS", + "crash_choosing.seconds_until": "ሰከንዶች እስከ ራስ-ሰር ኤስኦኤስ", "crash_choosing.deceleration": "በ{{speed}} ኪ.ሜ/ሰ ድንገተኛ ፍጥነት ቅነሳ።", "crash_choosing.emergency_contacts": "የአደጋ ጊዜ እውቂያዎች", "crash_choosing.no_contacts": "ምንም እውቂያ አልተዘጋጀም", @@ -289,8 +289,8 @@ "crash_choosing.manual": "በእጅ", "crash_choosing.manual_desc": "እኔ እደውላለሁ — እውቂያዎች ይነገራቸዋል", "crash_choosing.im_ok_cancel": "ደህና ነኝ — ሰርዝ", - "crash_choosing.false_alarm": "የተሳሳተ ማንቂያ? ለማጥፋት PIN ያስገቡ:", + "crash_choosing.false_alarm": "የተሳሳተ ማንቂያ? ለማጥፋት ፒን ያስገቡ:", "crash_choosing.stop_alarm": "ማንቂያ አቁም", - "crash_choosing.incorrect_pin": "ትክክል ያልሆነ PIN", - "crash_choosing.send_sos_now": "አሁን SOS ላክ" + "crash_choosing.incorrect_pin": "ትክክል ያልሆነ ፒን", + "crash_choosing.send_sos_now": "አሁን ኤስኦኤስ ላክ" } \ No newline at end of file diff --git a/frontend/src/i18n/ar.json b/frontend/src/i18n/ar.json index 8c4abb0..9cb3e70 100644 --- a/frontend/src/i18n/ar.json +++ b/frontend/src/i18n/ar.json @@ -8,11 +8,11 @@ "location.cached": "محفوظ", "status.online": "متصل", "status.offline": "غير متصل", - "status.connecting": "جارٍ الاتصال…", + "status.connecting": "تنشيط الخادم…", "sos.send": "SOS — إرسال الموقع", "sos.waiting": "SOS — في انتظار GPS", "sos.sent": "تم إرسال الموقع", - "sos.no_contact_warning": "لا يوجد جهة اتصال للطوارئ — أضف واحدة في Medical ID للـ SOS المباشر", + "sos.no_contact_warning": "لا توجد جهة اتصال للطوارئ — أضف واحدة في الهوية الطبية لـ SOS المباشر", "sos.copy_coords": "نسخ إحداثيات GPS", "sos.copied": "تم النسخ", "sos.to_contacts": "SOS ← {{name}}", @@ -20,11 +20,11 @@ "emergency.police": "شرطة", "emergency.fire": "إطفاء", "emergency.disaster": "كوارث", - "actions.plan_trip": "خطط للرحلة", + "actions.plan_trip": "خطط لرحلة", "actions.medical_id": "الهوية الطبية", - "actions.medical_id_unset": "أعد Medical ID — مطلوب لـ SOS المباشر", + "actions.medical_id_unset": "إعداد الهوية الطبية — مطلوب لـ SOS المباشر", "actions.test_crash": "اختبار حادث", - "dock.nearest": "الأقرب {{count}} · اضغط للاتصال", + "dock.nearest": "أقرب {{count}} · اضغط للاتصال", "dock.see_all": "عرض الكل", "category.hospital": "مستشفى", "category.police": "شرطة", @@ -35,7 +35,7 @@ "category.puncture": "تصليح إطارات", "category.showroom": "معرض سيارات", "crash.detected": "تم اكتشاف حادث", - "crash.choose_mode": "كيف ترسل SOS؟", + "crash.choose_mode": "كيف نرسل SOS؟", "crash.auto": "إرسال تلقائي", "crash.manual": "يدوي", "crash.cancel": "إلغاء — إنذار خاطئ", @@ -52,22 +52,22 @@ "header.emergency_numbers": "أرقام الطوارئ", "header.always_offline": "دائمًا دون اتصال", "header.nearby_services": "الخدمات القريبة", - "header.searching": "جارٍ البحث...", - "header.found": "{{n}} موجود", - "header.prioritised": "تم تحديد الأولويات", + "header.searching": "جاري البحث...", + "header.found": "تم العثور على {{n}}", + "header.prioritised": "ذات أولوية", "header.ai": "الذكاء الاصطناعي", - "actions.prioritise": "تحديد الأولويات لحالتي", - "actions.re_prioritise": "إعادة تحديد الأولويات", + "actions.prioritise": "تحديد الأولوية لحالتي", + "actions.re_prioritise": "إعادة تحديد الأولوية", "actions.directions": "الاتجاهات", "actions.no_phone": "لا يوجد هاتف", "filters.all": "الكل", - "filters.puncture": "ثقب", - "loading.finding": "البحث عن المساعدة القريبة...", - "loading.subtitle": "البحث في المستشفيات والشرطة وغيرها", + "filters.puncture": "ثقب إطار", + "loading.finding": "جاري البحث عن مساعدة قريبة...", + "loading.subtitle": "البحث عن مستشفيات، شرطة، والمزيد", "loading.error": "تعذر تحميل جهات الاتصال", "list.empty_all": "لم يتم العثور على خدمات. اتصل برقم الطوارئ الوطني أعلاه.", "list.empty_category": "لا توجد خدمات في هذه الفئة", - "list.cached_results": "عرض نتائج مخزنة من {{date}}", + "list.cached_results": "عرض نتائج محفوظة من {{date}}", "card.open": "مفتوح", "card.closed": "مغلق", "card.unknown_status": "الحالة غير معروفة", @@ -77,67 +77,67 @@ "track.copied": "تم النسخ!", "track.creating": "جاري إنشاء رابط مباشر...", "track.failed": "الرابط المباشر غير متاح دون اتصال", - "actions.set_location": "ضبط الموقع يدويًا", + "actions.set_location": "تحديد الموقع يدويًا", "status.manual": "يدوي", - "manual_location.title": "تعيين الموقع", + "manual_location.title": "تحديد الموقع", "manual_location.choose_method": "كيف تريد تحديد موقعك؟", "manual_location.tap_map": "اضغط على الخريطة", - "manual_location.search_address": "عنوان البحث", - "manual_location.search_placeholder": "المدينة أو العنوان أو الإحداثيات", - "manual_location.searching": "البحث…", + "manual_location.search_address": "البحث عن عنوان", + "manual_location.search_placeholder": "المدينة، العنوان، أو الإحداثيات", + "manual_location.searching": "جاري البحث…", "manual_location.no_results": "لم يتم العثور على نتائج", - "manual_location.tap_hint": "انقر في أي مكان على الخريطة لتعيين موقعك", + "manual_location.tap_hint": "اضغط في أي مكان على الخريطة لتحديد موقعك", "actions.change_language": "تغيير اللغة", "medical_id.badge": "الهوية الطبية", - "medical_id.welcome_title": "إعداد الخاص بك", + "medical_id.welcome_title": "إعداد هويتك", "medical_id.welcome_subtitle": "يمكن للمسعفين الوصول إلى هذا إذا كنت فاقدًا للوعي", - "medical_id.subtitle": "يستغرق حوالي 30 ثانية · يتم تخزينه على هذا الجهاز فقط", - "medical_id.privacy_title": "بياناتك لا تترك هذا الجهاز أبدًا", - "medical_id.privacy_text": "مخزنة محليا فقط. لم يتم الرفع مطلقًا على أي خادم. تتم مشاركتها مع خدمات الطوارئ فقط عند تنشيط SOS.", - "medical_id.profile_completion": "استكمال الملف الشخصي", + "medical_id.subtitle": "يستغرق حوالي ٣٠ ثانية · يُخزن على هذا الجهاز فقط", + "medical_id.privacy_title": "بياناتك لا تغادر هذا الجهاز أبدًا", + "medical_id.privacy_text": "تُخزن محلياً فقط. لا تُرفع أبداً على أي خادم. تُشارك مع خدمات الطوارئ فقط عند تفعيل SOS.", + "medical_id.profile_completion": "اكتمال الملف الشخصي", "medical_id.personal": "شخصي", - "medical_id.name_placeholder": "على سبيل المثال أرجون شارما", + "medical_id.name_placeholder": "مثل: أرجون شارما", "medical_id.age": "العمر (سنوات)", - "medical_id.months": "شهور", - "medical_id.months_hint": "(إذا <1 سنة)", - "medical_id.months_note": "حقل الأشهر - ضروري للأطفال أقل من سنة واحدة", + "medical_id.months": "أشهر", + "medical_id.months_hint": "(إذا كان أقل من سنة)", + "medical_id.months_note": "حقل الأشهر — ضروري للأطفال أقل من سنة", "medical_id.medical_details": "التفاصيل الطبية", "medical_id.select_blood_type": "اختر فصيلة الدم", - "medical_id.allergies_placeholder": "على سبيل المثال البنسلين والفول السوداني واللاتكس", - "medical_id.conditions_placeholder": "على سبيل المثال الربو، مرض السكري من النوع 2", - "medical_id.medications_placeholder": "على سبيل المثال الميتفورمين، السالبوتامول", - "medical_id.contacts_label": "اتصالات الطوارئ", + "medical_id.allergies_placeholder": "مثل: البنسلين، الفول السوداني، اللاتكس", + "medical_id.conditions_placeholder": "مثل: الربو، السكري من النوع ٢", + "medical_id.medications_placeholder": "مثل: الميتفورمين، السالبوتامول", + "medical_id.contacts_label": "جهات اتصال الطوارئ", "medical_id.contacts_hint": "سيتم إرسال رسائل SOS إلى جميع جهات الاتصال في وقت واحد.", - "medical_id.contact1_label": "الاتصال 1", - "medical_id.contact2_label": "الاتصال 2", - "medical_id.contact3_label": "الاتصال 3", - "medical_id.name_label": "اسم", - "medical_id.example_mum": "على سبيل المثال أمي، أبي، راهول", + "medical_id.contact1_label": "جهة اتصال ١", + "medical_id.contact2_label": "جهة اتصال ٢", + "medical_id.contact3_label": "جهة اتصال ٣", + "medical_id.name_label": "الاسم", + "medical_id.example_mum": "مثل: أمي، أبي، راهول", "medical_id.leave_blank": "اتركه فارغًا للتخطي", - "medical_id.phone_label": "رقم التليفون", - "medical_id.phone_placeholder": "على سبيل المثال 9198765432", + "medical_id.phone_label": "رقم الهاتف", + "medical_id.phone_placeholder": "مثل: ٩١٩٨٧٦٥٤٣٢", "medical_id.organ_donor_section": "التبرع بالأعضاء", "medical_id.organ_donor": "أنا متبرع بالأعضاء", - "medical_id.organ_donor_sub": "مرئية لمستجيبي الطوارئ", + "medical_id.organ_donor_sub": "يظهر لمستجيبي الطوارئ", "medical_id.saved": "تم حفظ الهوية الطبية", - "medical_id.close": "يغلق", - "medical_id.skip": "تخطي الآن - قم بالإعداد لاحقًا", - "plan_trip.placeholder": "المدينة أو البلدة أو المعلم", - "plan_trip.error_not_found": "لا يمكن العثور على هذا المكان.", + "medical_id.close": "إغلاق", + "medical_id.skip": "تخطي الآن — الإعداد لاحقًا", + "plan_trip.placeholder": "المدينة، البلدة، أو المعلم", + "plan_trip.error_not_found": "تعذر العثور على هذا المكان.", "plan_trip.use_current": "استخدام الموقع الحالي", - "plan_trip.offline_mode": "وضع غير متصل بالشبكة", - "plan_trip.title": "خطط لرحلة دون اتصال بالإنترنت", - "plan_trip.subtitle": "قم بتخزين المستشفيات والشرطة مؤقتًا على طول طريقك أثناء الاتصال بالإنترنت - ويعمل في المناطق الميتة الخلوية.", + "plan_trip.offline_mode": "وضع دون اتصال", + "plan_trip.title": "خطط لرحلة دون اتصال", + "plan_trip.subtitle": "احفظ المستشفيات والشرطة على مسارك أثناء الاتصال بالإنترنت — لتعمل في المناطق معدومة التغطية.", "plan_trip.from": "من", - "plan_trip.to": "ل", + "plan_trip.to": "إلى", "plan_trip.quick_fill": "وجهات سريعة", - "plan_trip.info_idle": "سيتم حفظ المستشفيات ومراكز الشرطة وخدمات الإصلاح على طول هذا الطريق للاستخدام دون اتصال بالإنترنت.", - "plan_trip.info_done": "تم تخزين المسار مؤقتًا. اتصالات الطوارئ متاحة الآن دون الإنترنت.", - "plan_trip.info_error": "لا يمكن تخزين أي نقاط الطريق. تحقق من الاتصال وحاول مرة أخرى.", - "plan_trip.caching": "التخزين المؤقت...", - "plan_trip.cached": "الطريق مخبأة", - "plan_trip.plan_offline": "خطة رحلة دون اتصال", - "plan_trip.cancel": "إلغاء - العودة", + "plan_trip.info_idle": "سيتم حفظ المستشفيات، مراكز الشرطة، وخدمات الإصلاح على طول هذا المسار للاستخدام دون اتصال.", + "plan_trip.info_done": "تم حفظ المسار. جهات اتصال الطوارئ متاحة الآن دون إنترنت.", + "plan_trip.info_error": "تعذر حفظ نقاط المسار. تحقق من الاتصال وحاول مرة أخرى.", + "plan_trip.caching": "جاري الحفظ...", + "plan_trip.cached": "مسار محفوظ", + "plan_trip.plan_offline": "تخطيط رحلة دون اتصال", + "plan_trip.cancel": "إلغاء — رجوع", "city.chennai": "تشيناي", "city.bengaluru": "بنغالورو", "city.coimbatore": "كويمباتور", @@ -146,22 +146,22 @@ "city.hyderabad": "حيدر أباد", "city.kolkata": "كولكاتا", "city.pune": "بيون", - "triage.injured_q": "هل أصيب أحد؟", - "triage.yes_injured": "نعم مجروح", - "triage.no_injured": "لا إصابات", - "triage.blocking_q": "هل المركبة تسد الطريق؟", - "triage.yes_blocking": "نعم المنع", - "triage.no_blocking": "الطريق واضح", + "triage.injured_q": "هل يوجد مصابون؟", + "triage.yes_injured": "نعم، توجد إصابات", + "triage.no_injured": "لا توجد إصابات", + "triage.blocking_q": "هل تعيق المركبة الطريق؟", + "triage.yes_blocking": "نعم، تعيقه", + "triage.no_blocking": "الطريق سالك", "triage.summary_idle": "أجب عن كلا السؤالين للحصول على توصية ذات أولوية.", - "triage.summary_injured": "تم الإبلاغ عن إصابة - سيتم إعطاء الأولوية لسيارة الإسعاف (108) أولاً.", - "triage.summary_blocked": "الطريق مسدود - يوصى بالشرطة (100) والقطر.", - "triage.summary_clear": "لا توجد إصابات، الطريق خالٍ — يُقترح تقديم خدمات الإصلاح أو القطر.", - "triage.label": "الفرز السريع", + "triage.summary_injured": "يوجد مصابون — سيتم إعطاء الأولوية لسيارة الإسعاف (١٠٨) أولاً.", + "triage.summary_blocked": "الطريق مسدود — يُنصح بالشرطة (١٠٠) وخدمة السحب.", + "triage.summary_clear": "لا توجد إصابات، الطريق سالك — يُنصح بخدمات الإصلاح أو السحب.", + "triage.label": "فرز سريع", "triage.title": "ماذا حدث؟", - "triage.subtitle": "سؤالان – سنعطي الأولوية للمساعدة المناسبة لموقفك.", + "triage.subtitle": "سؤالان — سنعطي الأولوية للمساعدة المناسبة لموقفك.", "triage.sos_btn": "SOS", - "triage.prioritising": "⏳ تحديد الأولويات...", - "triage.get_help": "احصل على المساعدة ذات الأولوية", + "triage.prioritising": "⏳ جاري تحديد الأولوية...", + "triage.get_help": "احصل على مساعدة ذات أولوية", "triage.answer_both": "أجب عن كلا السؤالين", "triage.skip": "تخطي — إظهار كافة جهات الاتصال", "medical_id.medications": "الأدوية الحالية", @@ -170,127 +170,127 @@ "medical_id.organ_donor_label": "متبرع بالأعضاء", "medical_id.yes": "نعم", "medical_id.edit": "تعديل", - "medical_id.empty_hint": "لم يتم تعيين البطاقة الطبية بعد. اضغط على تعديل.", + "medical_id.empty_hint": "لم يتم إعداد الهوية الطبية بعد. اضغط على تعديل.", "medical_id.clear_all": "مسح الكل", - "medical_id.confirm_clear": "هل تريد مسح جميع بيانات البطاقة الطبية؟", - "medical_id.contact_n": "جهة اتصال للطوارئ {{n}}", - "medical_id.contact1_name": "Contact 1 name", - "medical_id.contact1_phone": "Contact 1 phone", - "medical_id.contact2_name": "Contact 2 name", - "medical_id.contact2_phone": "Contact 2 phone", - "medical_id.contact3_name": "Contact 3 name", - "medical_id.contact3_phone": "Contact 3 phone", - "plan_trip.cache_route": "تخزين المسار للاستخدام دون اتصال", + "medical_id.confirm_clear": "هل تريد مسح جميع بيانات الهوية الطبية؟", + "medical_id.contact_n": "جهة اتصال الطوارئ {{n}}", + "medical_id.contact1_name": "اسم جهة الاتصال ١", + "medical_id.contact1_phone": "هاتف جهة الاتصال ١", + "medical_id.contact2_name": "اسم جهة الاتصال ٢", + "medical_id.contact2_phone": "هاتف جهة الاتصال ٢", + "medical_id.contact3_name": "اسم جهة الاتصال ٣", + "medical_id.contact3_phone": "هاتف جهة الاتصال ٣", + "plan_trip.cache_route": "حفظ المسار للاستخدام دون اتصال", "plan_trip.close": "إغلاق", "plan_trip.done": "تم", "actions.refresh_location": "تحديث الموقع", "tooltip.test_crash": "تنبيه اختبار حادث", - "tooltip.manual_location": "الموقع المحدد يدوياً قيد الاستخدام", - "tooltip.backend_warming": "الخادم يستيقظ — قد يستغرق الطلب الأول بعد الخمول 30–55 ثانية", - "tooltip.backend_fallback": "لم يُرجع الخادم بيانات حية — نعرض الدليل المخزن أثناء إعادة المحاولة", + "tooltip.manual_location": "استخدام الموقع المحدد يدوياً", + "tooltip.backend_warming": "جاري تنشيط الخادم — قد يستغرق الطلب الأول بعد الخمول ٣٠-٥٥ ثانية", + "tooltip.backend_fallback": "لم يُرجع الخادم بيانات مباشرة — يتم عرض الدليل المحفوظ أثناء إعادة المحاولة", "tooltip.copy_gps": "نسخ GPS", "tooltip.send_immediate_sos": "إرسال SOS فوري", "common.close": "إغلاق", "common.back": "رجوع", "sos.sms_emergency": "🚨 طوارئ — أحتاج إلى مساعدة.", "sos.sms_name": "الاسم", - "sos.sms_blood": "فصيلة الدم", + "sos.sms_blood": "الدم", "sos.sms_allergies": "الحساسية", - "sos.sms_conditions": "الحالات الطبية", - "sos.sms_plus_code": "الرمز الإضافي", + "sos.sms_conditions": "الحالات", + "sos.sms_plus_code": "رمز بلس", "sos.sms_near": "بالقرب من", "sos.sms_coords": "الإحداثيات", "sos.sms_footer": "أُرسل تلقائيًا بواسطة RoadSOS.", - "dispatch.accident": "Road accident at {{place}}.", - "dispatch.injured_blocking": "Injured persons on scene. Vehicle is blocking traffic.", - "dispatch.injured_clear": "Injured persons on scene. Vehicle is not blocking traffic.", - "dispatch.no_injury_blocking": "No injuries reported. Vehicle is blocking traffic.", - "dispatch.minor": "Minor incident. No injuries reported.", - "dispatch.send_services": "Please send emergency services immediately.", - "dispatch.plus_code": "Location plus code", - "dispatch.gps_coords": "GPS coordinates", + "dispatch.accident": "حادث سير في {{place}}.", + "dispatch.injured_blocking": "يوجد مصابون في الموقع. المركبة تعيق حركة المرور.", + "dispatch.injured_clear": "يوجد مصابون في الموقع. المركبة لا تعيق حركة المرور.", + "dispatch.no_injury_blocking": "لم يتم الإبلاغ عن إصابات. المركبة تعيق حركة المرور.", + "dispatch.minor": "حادث بسيط. لم يتم الإبلاغ عن إصابات.", + "dispatch.send_services": "يرجى إرسال خدمات الطوارئ فوراً.", + "dispatch.plus_code": "رمز الموقع (Plus Code)", + "dispatch.gps_coords": "إحداثيات GPS", "dispatch.status_dispatched": "تم إرسال SOS", - "dispatch.status_shared": "الموقع مشترك", + "dispatch.status_shared": "تمت مشاركة الموقع", "dispatch.help_on_way": "المساعدة في الطريق.", - "dispatch.circle_notified": "لقد تم إخطار دائرتك.", - "dispatch.eta_kicker": "سيارة الإسعاف المتوقعة", + "dispatch.circle_notified": "تم إخطار دائرتك.", + "dispatch.eta_kicker": "وقت وصول الإسعاف", "dispatch.eta_unit": "دقيقة", "dispatch.what_we_sent": "ما أرسلناه", - "dispatch.live_updating": "مباشر · التحديث", - "dispatch.location": "موقع", - "dispatch.speed": "السرعة عند التأثير", + "dispatch.live_updating": "مباشر · جاري التحديث", + "dispatch.location": "الموقع", + "dispatch.speed": "السرعة عند الاصطدام", "dispatch.triage": "الفرز", - "dispatch.battery": "بطارية", - "dispatch.captured": "تم التقاطها", + "dispatch.battery": "البطارية", + "dispatch.captured": "تم الالتقاط", "dispatch.who_alerted": "من تم تنبيهه", "dispatch.your_circle": "دائرتك", - "dispatch.role_emergency": "طارئ", + "dispatch.role_emergency": "طوارئ", "dispatch.role_hospital": "مستشفى", - "dispatch.status_received": "تلقى", + "dispatch.status_received": "تم الاستلام", "dispatch.status_alerted": "تم التنبيه", "dispatch.time_instant": "فوري", "dispatch.time_just_now": "الآن", - "dispatch.close": "يغلق", - "scene.photo_label": "Accident scene photo", - "scene.photo_hint": "Captured automatically at time of SOS", - "scene.capturing": "Capturing scene…", - "scene.no_camera": "Scene photo unavailable", - "tutorial.skip": "Skip", - "tutorial.next": "Next", - "tutorial.yes": "YES", - "tutorial.no": "NO", - "tutorial.step1": "Do you want a tutorial of the app", - "tutorial.step2": "This is the top bar it consist of all functional buttons", - "tutorial.step3": "Here you can check for the status of internet connection whether it is online, offline or connecting", - "tutorial.step4": "This is the side menu which contains features name, information and demo to our test crash", - "tutorial.step5": "This contains information on all available features and switches of our app", - "tutorial.step6": "Would you like to see how the demo crash test works with the help of a video", + "dispatch.close": "إغلاق", + "scene.photo_label": "صورة موقع الحادث", + "scene.photo_hint": "يتم التقاطها تلقائيًا عند تفعيل SOS", + "scene.capturing": "جاري التقاط المشهد...", + "scene.no_camera": "صورة المشهد غير متوفرة", + "tutorial.skip": "تخطي", + "tutorial.next": "التالي", + "tutorial.yes": "نعم", + "tutorial.no": "لا", + "tutorial.step1": "هل تريد جولة تعليمية للتطبيق؟", + "tutorial.step2": "هذا هو الشريط العلوي، ويحتوي على جميع الأزرار الوظيفية", + "tutorial.step3": "هنا يمكنك التحقق من حالة الاتصال بالإنترنت ما إذا كان متصلاً، غير متصل، أو جاري الاتصال", + "tutorial.step4": "هذه هي القائمة الجانبية التي تحتوي على أسماء الميزات، المعلومات، وعرض تجريبي لاختبار الحادث", + "tutorial.step5": "يحتوي هذا على معلومات حول جميع الميزات والمفاتيح المتاحة في تطبيقنا", + "tutorial.step6": "هل ترغب في رؤية كيفية عمل العرض التجريبي لاختبار الحادث من خلال مقطع فيديو؟", "sidebar.menu": "القائمة", "sidebar.medical_card": "بطاقتك الطبية", "sidebar.language": "اللغة", - "sidebar.plan_trip": "خطة رحلة دون اتصال", - "sidebar.manual_location": "الموقع اليدوي", - "sidebar.toggle_theme": "وضع الظلام / الضوء", - "sidebar.recenter": "قم بإعادة تحديد موقعي مؤخرًا", - "sidebar.tutorial": "البرنامج التعليمي", - "sidebar.shortcut_info": "يتم توفير الاختصار لهذه الأزرار على الشاشة الرئيسية مع الرموز المقابلة كما هو موضح هنا - الميزات من 1 إلى 5 موجودة في الشريط العلوي و6 على الجانب الأيمن من شاشتك.", - "sidebar.crash_test_info": "للتحقق من العرض التوضيحي لاختبار التصادم، يمكنك الانتقال إلى هذا الرابط:", - "sidebar.open_crash_test": "افتح العرض التجريبي لاختبار الأعطال", - "dispatcher.call_dispatcher": "اتصل بالمرسل", - "dispatcher.in_control": "أنت تحت السيطرة", + "sidebar.plan_trip": "تخطيط رحلة دون اتصال", + "sidebar.manual_location": "تحديد الموقع يدويًا", + "sidebar.toggle_theme": "الوضع الداكن / الفاتح", + "sidebar.recenter": "توسيط موقعي", + "sidebar.tutorial": "جولة تعليمية", + "sidebar.shortcut_info": "تتوفر اختصارات هذه الأزرار على الشاشة الرئيسية برموزها المقابلة هنا — الميزات من ١ إلى ٥ موجودة في الشريط العلوي، و ٦ على الجانب الأيمن من شاشتك.", + "sidebar.crash_test_info": "لمشاهدة العرض التجريبي لاختبار الحادث، يمكنك الانتقال إلى هذا الرابط:", + "sidebar.open_crash_test": "افتح العرض التجريبي لاختبار الحادث", + "dispatcher.call_dispatcher": "الاتصال بموظف الطوارئ", + "dispatcher.in_control": "زمام الأمور بيدك", "dispatcher.explain_location": "اشرح الموقف وشارك موقعك.", "dispatcher.loc_approx": "الموقع تقريبي", - "dispatcher.acquiring_gps": "الحصول على نظام تحديد المواقع...", + "dispatcher.acquiring_gps": "جاري الحصول على إحداثيات GPS...", "dispatcher.select_service": "اختر خدمة", - "dispatcher.ambulance": "سيارة إسعاف", - "dispatcher.police": "الشرطة", + "dispatcher.ambulance": "إسعاف", + "dispatcher.police": "شرطة", "dispatcher.general": "عام", "dispatcher.plus_code": "رمز بلس", "dispatcher.close_go_back": "إغلاق — العودة إلى جهات الاتصال", - "crash_alert.call_dispatcher": "Call a Dispatcher", - "crash_alert.you_re_in_control": "You're in Control", - "crash_alert.explain_situation": "Explain the situation and share your location.", - "crash_alert.location_approximate": "Location approximate", - "crash_alert.acquiring_gps": "Acquiring GPS...", - "crash_alert.select_service": "Select a service", - "crash_alert.ambulance": "Ambulance", - "crash_alert.police": "Police", - "crash_alert.general": "General", - "crash_alert.plus_code_label": "Plus Code", - "crash_choosing.crash_detected": "CRASH DETECTED", - "crash_choosing.do_not_panic": "DO NOT PANIC", - "crash_choosing.seconds_until": "seconds until auto-SOS", - "crash_choosing.deceleration": "Sudden deceleration at {{speed}} km/h.", - "crash_choosing.emergency_contacts": "emergency contacts", - "crash_choosing.no_contacts": "no contacts set", - "crash_choosing.will_be_alerted": "will be alerted.", - "crash_choosing.automatic": "Automatic", - "crash_choosing.auto_desc": "Calls + notifies contacts", - "crash_choosing.manual": "Manual", - "crash_choosing.manual_desc": "I'll call — contacts notified", - "crash_choosing.im_ok_cancel": "I'M OK — CANCEL", - "crash_choosing.false_alarm": "False alarm? Enter PIN to silence:", - "crash_choosing.stop_alarm": "Stop alarm", - "crash_choosing.incorrect_pin": "Incorrect PIN", - "crash_choosing.send_sos_now": "Send SOS now" + "crash_alert.call_dispatcher": "الاتصال بموظف الطوارئ", + "crash_alert.you_re_in_control": "زمام الأمور بيدك", + "crash_alert.explain_situation": "اشرح الموقف وشارك موقعك.", + "crash_alert.location_approximate": "الموقع تقريبي", + "crash_alert.acquiring_gps": "جاري الحصول على إحداثيات GPS...", + "crash_alert.select_service": "اختر خدمة", + "crash_alert.ambulance": "إسعاف", + "crash_alert.police": "شرطة", + "crash_alert.general": "عام", + "crash_alert.plus_code_label": "رمز بلس", + "crash_choosing.crash_detected": "تم اكتشاف حادث", + "crash_choosing.do_not_panic": "لا تذعر", + "crash_choosing.seconds_until": "ثوانٍ حتى إرسال SOS التلقائي", + "crash_choosing.deceleration": "تباطؤ مفاجئ بسرعة {{speed}} كم/ساعة.", + "crash_choosing.emergency_contacts": "جهات اتصال الطوارئ", + "crash_choosing.no_contacts": "لم يتم إعداد جهات اتصال", + "crash_choosing.will_be_alerted": "سيتم تنبيههم.", + "crash_choosing.automatic": "تلقائي", + "crash_choosing.auto_desc": "اتصال + إشعار جهات الاتصال", + "crash_choosing.manual": "يدوي", + "crash_choosing.manual_desc": "سأتصل — مع إشعار جهات الاتصال", + "crash_choosing.im_ok_cancel": "أنا بخير — إلغاء", + "crash_choosing.false_alarm": "إنذار خاطئ؟ أدخل PIN للإيقاف:", + "crash_choosing.stop_alarm": "إيقاف الإنذار", + "crash_choosing.incorrect_pin": "رقم PIN غير صحيح", + "crash_choosing.send_sos_now": "إرسال SOS الآن" } \ No newline at end of file diff --git a/frontend/src/i18n/as.json b/frontend/src/i18n/as.json index 3396492..e3a4b36 100644 --- a/frontend/src/i18n/as.json +++ b/frontend/src/i18n/as.json @@ -3,19 +3,19 @@ "lang.title": "আপোনাৰ ভাষা বাছনি কৰক", "lang.subtitle": "আপুনি যি ভাষা সবাতোকৈ ভালকৈ বুজে সেইটো বাছনি কৰক। পিছত সলনি কৰিব পাৰিব।", "lang.continue": "আগবাঢ়ক", - "location.finding": "অৱস্থান বিচাৰি আছে...", + "location.finding": "অৱস্থান বিচৰা হৈছে...", "location.waiting": "ছিগন্যালৰ অপেক্ষাত...", "location.cached": "সংৰক্ষিত", "status.online": "অনলাইন", "status.offline": "অফলাইন", - "status.connecting": "সংযোগ হৈ আছে…", + "status.connecting": "চাৰ্ভাৰ সক্ৰিয় কৰা হৈছে…", "sos.send": "SOS — অৱস্থান পঠিয়াওক", "sos.waiting": "SOS — GPS ৰ অপেক্ষা", "sos.sent": "অৱস্থান পঠোৱা হ'ল", "sos.no_contact_warning": "জৰুৰীকালীন সম্পৰ্ক নাই — পোনপটীয়া SOS ৰ বাবে Medical ID ত যোগ কৰক", "sos.copy_coords": "GPS স্থানাংক কপি কৰক", "sos.copied": "কপি হ'ল", - "sos.to_contacts": "SOS → {{নাম}}", + "sos.to_contacts": "SOS → {{name}}", "emergency.ambulance": "এম্বুলেন্স", "emergency.police": "আৰক্ষী", "emergency.fire": "অগ্নিনিৰ্বাপক", @@ -23,7 +23,7 @@ "actions.plan_trip": "যাত্ৰা পৰিকল্পনা", "actions.medical_id": "মেডিকেল আইডি", "actions.medical_id_unset": "Medical ID ছেট কৰক — পোনপটীয়া SOS ৰ বাবে প্ৰয়োজনীয়", - "actions.test_crash": "টেষ্ট দুৰ্ঘটনা", + "actions.test_crash": "দুৰ্ঘটনা পৰীক্ষা", "dock.nearest": "ওচৰৰ {{count}} · কল কৰিবলৈ টেপ কৰক", "dock.see_all": "সকলো চাওক", "category.hospital": "চিকিৎসালয়", @@ -32,110 +32,110 @@ "category.fire": "অগ্নিনিৰ্বাপক", "category.towing": "টোইং", "category.repair": "মেৰামতি", - "category.puncture": "পঙ্কচাৰ", + "category.puncture": "পংচাৰ", "category.showroom": "শ্ব'ৰূম", "crash.detected": "দুৰ্ঘটনা চিনাক্ত হ'ল", "crash.choose_mode": "SOS কেনেকৈ পঠিয়াব?", - "crash.auto": "স্বয়ং-পঠিয়াওক", + "crash.auto": "স্বয়ংক্ৰিয়ভাৱে পঠিয়াওক", "crash.manual": "মেনুৱেল", "crash.cancel": "বাতিল — ভুল অলাৰ্ম", "crash.pin_prompt": "বাতিল কৰিবলৈ PIN দিয়ক", - "crash.countdown": "{{n}} ছেকেণ্ডত পঠিয়াইছে", + "crash.countdown": "{{n}} ছেকেণ্ডত পঠোৱা হ'ব", "medical_id.title": "মেডিকেল আইডি", "medical_id.name": "সম্পূৰ্ণ নাম", - "medical_id.blood_type": "ৰক্তৰ গ্ৰুপ", + "medical_id.blood_type": "তেজৰ গ্ৰুপ", "medical_id.allergies": "এলাৰ্জী", "medical_id.conditions": "চিকিৎসা অৱস্থা", "medical_id.contacts": "জৰুৰীকালীন সম্পৰ্ক", - "medical_id.save": "সংৰক্ষণ", - "medical_id.cancel": "বাতিল", + "medical_id.save": "সংৰক্ষণ কৰক", + "medical_id.cancel": "বাতিল কৰক", "header.emergency_numbers": "জৰুৰীকালীন নম্বৰ", "header.always_offline": "সদায় অফলাইন", - "header.nearby_services": "ওচৰৰ সেৱা", - "header.searching": "বিচাৰি আছে...", + "header.nearby_services": "ওচৰৰ সেৱাসমূহ", + "header.searching": "বিচৰা হৈছে...", "header.found": "{{n}} পোৱা গ'ল", "header.prioritised": "অগ্ৰাধিকাৰ দিয়া হ'ল", "header.ai": "এ আই", "actions.prioritise": "মোৰ পৰিস্থিতিৰ বাবে অগ্ৰাধিকাৰ দিয়ক", "actions.re_prioritise": "পুনৰ অগ্ৰাধিকাৰ দিয়ক", - "actions.directions": "দিশ", + "actions.directions": "দিশ নিৰ্দেশনা", "actions.no_phone": "ফোন নাই", "filters.all": "সকলো", "filters.puncture": "পংচাৰ", - "loading.finding": "ওচৰৰ সহায় বিচাৰি আছে...", - "loading.subtitle": "চিকিৎসালয়, আৰক্ষী আদি বিচাৰি আছে", - "loading.error": "সম্পৰ্ক ল'ড কৰিব নোৱাৰিলে", + "loading.finding": "ওচৰৰ সহায় বিচৰা হৈছে...", + "loading.subtitle": "চিকিৎসালয়, আৰক্ষী আদি বিচৰা হৈছে", + "loading.error": "যোগাযোগ ল'ড কৰিব পৰা নগ'ল", "list.empty_all": "কোনো সেৱা পোৱা নগ'ল। ওপৰৰ ৰাষ্ট্ৰীয় জৰুৰীকালীন নম্বৰত কল কৰক।", "list.empty_category": "এই বিভাগত কোনো সেৱা নাই", "list.cached_results": "{{date}} ৰ সংৰক্ষিত ফলাফল দেখুৱাইছে", "card.open": "খোলা", "card.closed": "বন্ধ", "card.unknown_status": "অৱস্থা অজ্ঞাত", - "footer.offline_fallback": "চাৰ্ভাৰলৈ যাব নোৱাৰিলে — ডেম' তথ্য দেখুৱাইছে। জৰুৰীকালীন নম্বৰ সদায় অফলাইনত কাম কৰে।", + "footer.offline_fallback": "চাৰ্ভাৰৰ সৈতে সংযোগ কৰিব পৰা নগ'ল — ডেম' তথ্য দেখুওৱা হৈছে। জৰুৰীকালীন নম্বৰে সদায় অফলাইনত কাম কৰে।", "track.share_prompt": "উদ্ধাৰকাৰীসকলৰ সৈতে লাইভ স্থান শ্বেয়াৰ কৰক:", "track.copy_link": "লিংক কপি কৰক", - "track.copied": "কপি কৰা হৈছে!", - "track.creating": "লাইভ লিংক তৈয়াৰ কৰি আছে...", + "track.copied": "কপি হ'ল!", + "track.creating": "লাইভ লিংক তৈয়াৰ কৰা হৈছে...", "track.failed": "অফলাইনত লাইভ লিংক উপলব্ধ নহয়", - "actions.set_location": "অৱস্থান হস্তচালিতভাৱে নিৰ্ধাৰণ কৰক", - "status.manual": "হাতপুথি", - "manual_location.title": "অৱস্থান নিৰ্ধাৰণ কৰক", - "manual_location.choose_method": "আপুনি আপোনাৰ স্থান কেনেকৈ নিৰ্ধাৰণ কৰিব বিচাৰে?", + "actions.set_location": "অৱস্থান মেনুৱেলভাৱে ছেট কৰক", + "status.manual": "মেনুৱেল", + "manual_location.title": "অৱস্থান ছেট কৰক", + "manual_location.choose_method": "আপুনি আপোনাৰ স্থান কেনেকৈ ছেট কৰিব বিচাৰে?", "manual_location.tap_map": "মেপত টেপ কৰক", - "manual_location.search_address": "ঠিকনা সন্ধান কৰক", + "manual_location.search_address": "ঠিকনা বিচাৰক", "manual_location.search_placeholder": "চহৰ, ঠিকনা, বা স্থানাংক", - "manual_location.searching": "বিচাৰি আছে...", + "manual_location.searching": "বিচৰা হৈছে...", "manual_location.no_results": "কোনো ফলাফল পোৱা নগ’ল", "manual_location.tap_hint": "আপোনাৰ অৱস্থান ছেট কৰিবলৈ মেপৰ যিকোনো ঠাইত টেপ কৰক", "actions.change_language": "ভাষা সলনি কৰক", "medical_id.badge": "মেডিকেল আইডি", - "medical_id.welcome_title": "আপোনাৰ ছেট আপ কৰক", - "medical_id.welcome_subtitle": "আপুনি অচেতন হ’লে পেৰামেডিকেলৰ লোকে ইয়াত প্ৰৱেশ কৰিব পাৰে", + "medical_id.welcome_title": "আপোনাৰ আইডি ছেট আপ কৰক", + "medical_id.welcome_subtitle": "আপুনি অচেতন হ’লে পেৰামেডিকেল কৰ্মীয়ে এইটো চাব পাৰিব", "medical_id.subtitle": "প্ৰায় ৩০ ছেকেণ্ড সময় লাগে · কেৱল এই ডিভাইচত সংৰক্ষণ কৰা হয়", - "medical_id.privacy_title": "আপোনাৰ ডাটা কেতিয়াও এই ডিভাইচ এৰি নাযায়", - "medical_id.privacy_text": "কেৱল স্থানীয়ভাৱে সংৰক্ষণ কৰা হয়। কেতিয়াও কোনো চাৰ্ভাৰত আপলোড কৰা হোৱা নাই। কেৱল জৰুৰীকালীন সেৱাসমূহৰ সৈতে শ্বেয়াৰ কৰা হয় যেতিয়া SOS সক্ৰিয় কৰা হয়।", + "medical_id.privacy_title": "আপোনাৰ ডাটা এই ডিভাইচৰ বাহিৰলৈ কেতিয়াও নাযায়", + "medical_id.privacy_text": "কেৱল স্থানীয়ভাৱে সংৰক্ষণ কৰা হয়। কেতিয়াও কোনো চাৰ্ভাৰত আপলোড কৰা নহয়। কেৱল SOS সক্ৰিয় কৰিলেহে জৰুৰীকালীন সেৱাসমূহৰ সৈতে শ্বেয়াৰ কৰা হয়।", "medical_id.profile_completion": "প্ৰফাইল সম্পূৰ্ণ কৰা", "medical_id.personal": "ব্যক্তিগত", "medical_id.name_placeholder": "যেনে- অৰ্জুন শৰ্মা", "medical_id.age": "বয়স (বছৰ)", "medical_id.months": "মাহ", - "medical_id.months_hint": "(যদি <১ বছৰ)", - "medical_id.months_note": "মাহৰ ক্ষেত্ৰ — ১ বছৰৰ তলৰ শিশুৰ বাবে প্ৰয়োজনীয়", + "medical_id.months_hint": "(বয়স ১ বছৰতকৈ কম হ'লে)", + "medical_id.months_note": "মাহৰ ঘৰ — ১ বছৰৰ তলৰ শিশুৰ বাবে প্ৰয়োজনীয়", "medical_id.medical_details": "চিকিৎসাৰ বিৱৰণ", - "medical_id.select_blood_type": "তেজৰ প্ৰকাৰ নিৰ্বাচন কৰক", + "medical_id.select_blood_type": "তেজৰ গ্ৰুপ বাছনি কৰক", "medical_id.allergies_placeholder": "যেনে- পেনিচিলিন, বাদাম, লেটেক্স", "medical_id.conditions_placeholder": "যেনে- হাঁপানী, ডায়েবেটিছ টাইপ ২", "medical_id.medications_placeholder": "যেনে- মেটফৰ্মিন, ছালবুটামল", "medical_id.contacts_label": "জৰুৰীকালীন যোগাযোগ", - "medical_id.contacts_hint": "সকলো যোগাযোগলৈ একেলগে SOS বাৰ্তা প্ৰেৰণ কৰা হ’ব।", - "medical_id.contact1_label": "যোগাযোগ 1", + "medical_id.contacts_hint": "সকলো যোগাযোগলৈ একেসময়তে SOS বাৰ্তা প্ৰেৰণ কৰা হ’ব।", + "medical_id.contact1_label": "যোগাযোগ ১", "medical_id.contact2_label": "যোগাযোগ ২", - "medical_id.contact3_label": "যোগাযোগ 3", + "medical_id.contact3_label": "যোগাযোগ ৩", "medical_id.name_label": "নাম", "medical_id.example_mum": "যেনে- মা, দেউতা, ৰাহুল", - "medical_id.leave_blank": "এৰিবলৈ খালী ৰাখক", + "medical_id.leave_blank": "স্কিপ কৰিবলৈ খালী ৰাখক", "medical_id.phone_label": "ফোন নম্বৰ", "medical_id.phone_placeholder": "যেনে- ৯১৯৮৭৬৫৪৩২", "medical_id.organ_donor_section": "অংগ দান", "medical_id.organ_donor": "মই এজন অংগ দাতা", - "medical_id.organ_donor_sub": "জৰুৰীকালীন সঁহাৰিদাতাসকলৰ বাবে দৃশ্যমান", + "medical_id.organ_donor_sub": "জৰুৰীকালীন সঁহাৰিদাতাসকলে দেখিব পাব", "medical_id.saved": "মেডিকেল আইডি সংৰক্ষিত", - "medical_id.close": "বন্ধ", + "medical_id.close": "বন্ধ কৰক", "medical_id.skip": "এতিয়াৰ বাবে এৰি দিয়ক — পিছত ছেট আপ কৰক", - "plan_trip.placeholder": "চহৰ, চহৰ বা ল্যাণ্ডমাৰ্ক", - "plan_trip.error_not_found": "সেই ঠাইখন বিচাৰি নাপালে।", + "plan_trip.placeholder": "নগৰ, চহৰ বা ল্যাণ্ডমাৰ্ক", + "plan_trip.error_not_found": "সেই ঠাইখন বিচাৰি পোৱা নগ'ল।", "plan_trip.use_current": "বৰ্তমানৰ অৱস্থান ব্যৱহাৰ কৰক", "plan_trip.offline_mode": "অফলাইন মোড", "plan_trip.title": "অফলাইন ভ্ৰমণৰ পৰিকল্পনা কৰক", - "plan_trip.subtitle": "অনলাইনত থকাৰ সময়ত আপোনাৰ পথত চিকিৎসালয় আৰু আৰক্ষী কেচ কৰক — চেলুলাৰ ডেড জ'নত কাম কৰে।", + "plan_trip.subtitle": "অনলাইন থাকোঁতে আপোনাৰ পথৰ চিকিৎসালয় আৰু আৰক্ষী থানা সংৰক্ষণ কৰক — নেটৱৰ্ক নথকা ঠাইতো কাম কৰিব।", "plan_trip.from": "পৰা", "plan_trip.to": "লৈ", "plan_trip.quick_fill": "দ্ৰুত গন্তব্যস্থান", "plan_trip.info_idle": "এই পথৰ কাষৰ চিকিৎসালয়, আৰক্ষী থানা আৰু মেৰামতি সেৱাসমূহ অফলাইন ব্যৱহাৰৰ বাবে সংৰক্ষণ কৰা হ’ব।", - "plan_trip.info_done": "ৰুট কেচ কৰা হৈছে। ইণ্টাৰনেট অবিহনে এতিয়া জৰুৰীকালীন যোগাযোগৰ ব্যৱস্থা।", - "plan_trip.info_error": "কোনো ৱেপইণ্ট কেশ্ব কৰিব পৰা নগ'ল। সংযোগ পৰীক্ষা কৰক আৰু পুনৰ চেষ্টা কৰক।", - "plan_trip.caching": "কেচ কৰি আছে...", - "plan_trip.cached": "ৰুট কেচ কৰা হৈছে", + "plan_trip.info_done": "পথটো সংৰক্ষণ কৰা হৈছে। জৰুৰীকালীন যোগাযোগ এতিয়া ইণ্টাৰনেট অবিহনে উপলব্ধ।", + "plan_trip.info_error": "কোনো স্থান সংৰক্ষণ কৰিব পৰা নগ'ল। সংযোগ পৰীক্ষা কৰি পুনৰ চেষ্টা কৰক।", + "plan_trip.caching": "সংৰক্ষণ কৰা হৈছে...", + "plan_trip.cached": "সংৰক্ষিত পথ", "plan_trip.plan_offline": "অফলাইন ভ্ৰমণৰ পৰিকল্পনা কৰক", "plan_trip.cancel": "বাতিল কৰক — উভতি যাওক", "city.chennai": "চেন্নাই", @@ -147,32 +147,32 @@ "city.kolkata": "কলকাতা", "city.pune": "পুনে", "triage.injured_q": "কোনোবা আহত হৈছে নেকি?", - "triage.yes_injured": "হয়, আঘাতপ্ৰাপ্ত", + "triage.yes_injured": "হয়, আহত হৈছে", "triage.no_injured": "কোনো আঘাত পোৱা নাই", "triage.blocking_q": "বাহনখনে পথ অৱৰোধ কৰিছে নেকি?", - "triage.yes_blocking": "হয়, ব্লক কৰা", + "triage.yes_blocking": "হয়, পথ অৱৰোধ কৰিছে", "triage.no_blocking": "ৰাস্তা পৰিষ্কাৰ", "triage.summary_idle": "অগ্ৰাধিকাৰ পৰামৰ্শ পাবলৈ দুয়োটা প্ৰশ্নৰ উত্তৰ দিয়ক।", "triage.summary_injured": "আঘাতৰ খবৰ — প্ৰথমে এম্বুলেন্স (১০৮)ক অগ্ৰাধিকাৰ দিয়া হ’ব।", - "triage.summary_blocked": "পথ অৱৰোধ — আৰক্ষী (১০০) আৰু ট’ইঙে পৰামৰ্শ দিলে।", - "triage.summary_clear": "কোনো আঘাত নাই, পথ পৰিষ্কাৰ — মেৰামতি বা টানি সেৱাৰ পৰামৰ্শ দিয়া হৈছে।", - "triage.label": "দ্ৰুত ট্ৰাইজেজ", - "triage.title": "কি হ’ল?", + "triage.summary_blocked": "পথ অৱৰোধ — আৰক্ষী (১০০) আৰু ট'য়িং সেৱাৰ পৰামৰ্শ দিয়া হৈছে।", + "triage.summary_clear": "কোনো আঘাত নাই, পথ পৰিষ্কাৰ — মেৰামতি বা ট'য়িং সেৱাৰ পৰামৰ্শ দিয়া হৈছে।", + "triage.label": "দ্ৰুত ট্ৰায়েজ", + "triage.title": "কি হৈছে?", "triage.subtitle": "দুটা প্ৰশ্ন — আমি আপোনাৰ পৰিস্থিতিৰ বাবে সঠিক সহায়ক অগ্ৰাধিকাৰ দিম।", "triage.sos_btn": "SOS", - "triage.prioritising": "⏳ অগ্ৰাধিকাৰ দিয়া...", - "triage.get_help": "অগ্ৰাধিকাৰপ্ৰাপ্ত সহায় লাভ কৰক", + "triage.prioritising": "⏳ অগ্ৰাধিকাৰ দিয়া হৈছে...", + "triage.get_help": "প্ৰয়োজনীয় সহায় লাভ কৰক", "triage.answer_both": "দুয়োটা প্ৰশ্নৰ উত্তৰ দিয়ক", - "triage.skip": "এৰি দিয়ক — সকলো পৰিচয় দেখুৱাওক", + "triage.skip": "এৰি দিয়ক — সকলো যোগাযোগ দেখুৱাওক", "medical_id.medications": "বৰ্তমানৰ ঔষধ", "medical_id.optional": "বৈকল্পিক", "medical_id.conditions_short": "অৱস্থা", "medical_id.organ_donor_label": "অংগ দাতা", "medical_id.yes": "হয়", - "medical_id.edit": "সম্পাদনা", - "medical_id.empty_hint": "এতিয়ালৈকে মেডিকেল আইডি ছেট কৰা নাই। সম্পাদনা টেপ কৰক।", - "medical_id.clear_all": "সকলো পৰিষ্কাৰ", - "medical_id.confirm_clear": "সকলো মেডিকেল আইডি ডেটা পৰিষ্কাৰ কৰিব?", + "medical_id.edit": "সম্পাদনা কৰক", + "medical_id.empty_hint": "এতিয়ালৈকে মেডিকেল আইডি ছেট কৰা নাই। পেৰামেডিকেল কৰ্মীসকলক প্ৰয়োজনীয় তথ্য (তেজৰ গ্ৰুপ, এলাৰ্জী, জৰুৰীকালীন যোগাযোগ আদি) যোগ কৰিবলৈ 'সম্পাদনা কৰক'ত টেপ কৰক।", + "medical_id.clear_all": "সকলো মচি পেলাওক", + "medical_id.confirm_clear": "সকলো মেডিকেল আইডি ডেটা মচি পেলাব বিচাৰে নেকি?", "medical_id.contact_n": "জৰুৰীকালীন যোগাযোগ {{n}}", "medical_id.contact1_name": "যোগাযোগ ১ ৰ নাম", "medical_id.contact1_phone": "যোগাযোগ ১ ৰ ফোন", @@ -180,17 +180,17 @@ "medical_id.contact2_phone": "যোগাযোগ ২ ৰ ফোন", "medical_id.contact3_name": "যোগাযোগ ৩ ৰ নাম", "medical_id.contact3_phone": "যোগাযোগ ৩ ৰ ফোন", - "plan_trip.cache_route": "অফলাইন ব্যৱহাৰৰ বাবে ৰূট কেচ", - "plan_trip.close": "বন্ধ", + "plan_trip.cache_route": "অফলাইন ব্যৱহাৰৰ বাবে পথ সংৰক্ষণ কৰক", + "plan_trip.close": "বন্ধ কৰক", "plan_trip.done": "সম্পন্ন", - "actions.refresh_location": "অৱস্থান ৰিফ্ৰেছ", - "tooltip.test_crash": "দুৰ্ঘটনা সতৰ্কবাৰ্তা পৰীক্ষা কৰক", - "tooltip.manual_location": "হাতেৰে ছেট কৰা অৱস্থান ব্যৱহাৰ কৰি আছে", - "tooltip.backend_warming": "বেকএণ্ড জাগাই আছে — নিষ্ক্ৰিয়ৰ পিছত প্ৰথম অনুৰোধত ৩০–৫৫ ছেকেণ্ড লাগিব পাৰে", - "tooltip.backend_fallback": "বেকএণ্ডে লাইভ ডেটা ঘূৰাই দিয়া নাই — পুনৰ চেষ্টা কৰাৰ সময়ত পূৰ্ব-লোড কৰা ডিৰেক্টৰি দেখুৱাইছে", + "actions.refresh_location": "অৱস্থান ৰিফ্ৰেছ কৰক", + "tooltip.test_crash": "দুৰ্ঘটনা সতৰ্কবাৰ্তা পৰীক্ষা", + "tooltip.manual_location": "মেনুৱেলভাৱে ছেট কৰা অৱস্থান ব্যৱহাৰ কৰা হৈছে", + "tooltip.backend_warming": "চাৰ্ভাৰ সক্ৰিয় কৰা হৈছে — কিছু সময় নিষ্ক্ৰিয় থকাৰ পিছত প্ৰথম অনুৰোধত ৩০-৫৫ ছেকেণ্ড লাগিব পাৰে", + "tooltip.backend_fallback": "চাৰ্ভাৰৰ পৰা লাইভ ডেটা পোৱা নগ'ল — পুনৰ চেষ্টা কৰাৰ সময়ত পূৰ্ব-লোড কৰা ডিৰেক্টৰি দেখুওৱা হৈছে", "tooltip.copy_gps": "GPS কপি কৰক", - "tooltip.send_immediate_sos": "তৎকালে SOS পঠিয়াওক", - "common.close": "বন্ধ", + "tooltip.send_immediate_sos": "ততাতৈয়াকৈ SOS পঠিয়াওক", + "common.close": "বন্ধ কৰক", "common.back": "উভতি যাওক", "sos.sms_emergency": "🚨 জৰুৰীকালীন — মোক সহায়ৰ প্ৰয়োজন।", "sos.sms_name": "নাম", @@ -202,76 +202,76 @@ "sos.sms_coords": "স্থানাংক", "sos.sms_footer": "RoadSOS ৰ দ্বাৰা স্বয়ংক্ৰিয়ভাৱে পঠোৱা হৈছে।", "dispatch.accident": "{{place}} ত পথ দুৰ্ঘটনা।", - "dispatch.injured_blocking": "ঘটনাস্থলত আহত ব্যক্তি আছে। বাহনখনে যান-বাহন বাধা দিছে।", - "dispatch.injured_clear": "ঘটনাস্থলত আহত ব্যক্তি আছে। বাহনখনে যান-বাহন বাধা দিয়া নাই।", - "dispatch.no_injury_blocking": "কোনো আঘাত নাই। বাহনখনে যান-বাহন বাধা দিছে।", - "dispatch.minor": "সৰু ঘটনা। কোনো আঘাত নাই।", + "dispatch.injured_blocking": "ঘটনাস্থলত আহত ব্যক্তি আছে। বাহনখনে যান-বাহনত বাধা দিছে।", + "dispatch.injured_clear": "ঘটনাস্থলত আহত ব্যক্তি আছে। বাহনখনে যান-বাহনত বাধা দিয়া নাই।", + "dispatch.no_injury_blocking": "কোনো আঘাতৰ খবৰ নাই। বাহনখনে যান-বাহনত বাধা দিছে।", + "dispatch.minor": "সাধাৰণ ঘটনা। কোনো আঘাতৰ খবৰ নাই।", "dispatch.send_services": "অনুগ্ৰহ কৰি তৎকালে জৰুৰীকালীন সেৱা পঠিয়াওক।", "dispatch.plus_code": "স্থানৰ প্লাছ ক'ড", "dispatch.gps_coords": "GPS স্থানাংক", "dispatch.status_dispatched": "SOS প্ৰেৰণ কৰা হৈছে", "dispatch.status_shared": "স্থান শ্বেয়াৰ কৰা হৈছে", - "dispatch.help_on_way": "সহায় বাটত আছে।", - "dispatch.circle_notified": "আপোনাৰ চক্ৰটোক অৱগত কৰা হৈছে।", - "dispatch.eta_kicker": "AMBULANCE ETA", - "dispatch.eta_unit": "min", + "dispatch.help_on_way": "সহায় আহি আছে।", + "dispatch.circle_notified": "আপোনাৰ চাৰ্কলক অৱগত কৰা হৈছে।", + "dispatch.eta_kicker": "এম্বুলেন্সৰ ETA", + "dispatch.eta_unit": "মিনিট", "dispatch.what_we_sent": "আমি যি পঠালোঁ", - "dispatch.live_updating": "LIVE · আপডেট কৰা হৈছে", + "dispatch.live_updating": "লাইভ · আপডেট হৈ আছে", "dispatch.location": "অৱস্থান", - "dispatch.speed": "SPEED AT IMPACT", - "dispatch.triage": "TRIAGE", + "dispatch.speed": "খুন্দা মৰাৰ সময়ত গতি", + "dispatch.triage": "ট্ৰায়েজ", "dispatch.battery": "বেটাৰি", - "dispatch.captured": "CAPTURED কৰা হৈছে", - "dispatch.who_alerted": "কোনক সতৰ্ক কৰা হৈছে", - "dispatch.your_circle": "তোমাৰ বৃত্ত", + "dispatch.captured": "কেপচাৰ কৰা হৈছে", + "dispatch.who_alerted": "কাক সতৰ্ক কৰা হৈছে", + "dispatch.your_circle": "আপোনাৰ চাৰ্কল", "dispatch.role_emergency": "জৰুৰীকালীন", - "dispatch.role_hospital": "চিকিত্‍সালয়", + "dispatch.role_hospital": "চিকিত্সালয়", "dispatch.status_received": "প্ৰাপ্ত কৰা হৈছে", - "dispatch.status_alerted": "ALERTED কৰা হৈছে", - "dispatch.time_instant": "ক্ষণ", - "dispatch.time_just_now": "মাত্ৰ এতিয়াই", - "dispatch.close": "বন্ধ", + "dispatch.status_alerted": "সতৰ্ক কৰা হৈছে", + "dispatch.time_instant": "তৎক্ষণাৎ", + "dispatch.time_just_now": "এইমাত্ৰ", + "dispatch.close": "বন্ধ কৰক", "scene.photo_label": "দুৰ্ঘটনাস্থলৰ ফটো", - "scene.photo_hint": "SOS ৰ সময়ত স্বয়ংক্ৰিয়ভাৱে ধৰা হৈছে", - "scene.capturing": "দৃশ্য ধৰি আছে…", + "scene.photo_hint": "SOS ৰ সময়ত স্বয়ংক্ৰিয়ভাৱে কেপচাৰ কৰা হৈছে", + "scene.capturing": "দৃশ্য কেপচাৰ কৰা হৈছে…", "scene.no_camera": "দৃশ্যৰ ফটো উপলব্ধ নহয়", - "tutorial.skip": "এৰি দিয়ক", + "tutorial.skip": "স্কিপ কৰক", "tutorial.next": "পৰৱৰ্তী", "tutorial.yes": "হয়", - "tutorial.no": "নহয়", - "tutorial.step1": "আপুনি এপটোৰ এটা টিউটৰিয়েল চাব বিচাৰে নে?", - "tutorial.step2": "এইটো হৈছে শীৰ্ষ বাৰ যিয়ে সকলো কাৰ্যক্ষম বুটামৰ সৈতে আহে", + "tutorial.no": "নালাগে", + "tutorial.step1": "আপুনি এপটোৰ এটা টিউটৰিয়েল চাব বিচাৰে নেকি?", + "tutorial.step2": "এইটো ওপৰৰ বাৰ য'ত সকলো কাৰ্যকৰী বুটাম আছে", "tutorial.step3": "ইয়াত আপুনি ইণ্টাৰনেট সংযোগৰ অৱস্থা পৰীক্ষা কৰিব পাৰে — অনলাইন, অফলাইন বা সংযোগ হৈ আছে", - "tutorial.step4": "এইটো হৈছে ছাইড মেনু য'ত বৈশিষ্ট্যৰ নাম, তথ্য আৰু আমাৰ পৰীক্ষা দুৰ্ঘটনাৰ ডেম' আছে", + "tutorial.step4": "এইটো ছাইড মেনু য'ত বৈশিষ্ট্যৰ নাম, তথ্য আৰু আমাৰ দুৰ্ঘটনা পৰীক্ষাৰ ডেম' আছে", "tutorial.step5": "ইয়াত আমাৰ এপৰ সকলো উপলব্ধ বৈশিষ্ট্য আৰু ছুইচৰ তথ্য আছে", - "tutorial.step6": "আপুনি এটা ভিডিঅ'ৰ সহায়ত ডেম' ক্ৰেচ টেষ্ট কেনেকৈ কাম কৰে চাব বিচাৰে নে?", + "tutorial.step6": "আপুনি এটা ভিডিঅ'ৰ সহায়ত ডেম' ক্ৰেচ টেষ্ট কেনেকৈ কাম কৰে চাব বিচাৰে নেকি?", "sidebar.menu": "মেনু", "sidebar.medical_card": "আপোনাৰ মেডিকেল কাৰ্ড", "sidebar.language": "ভাষা", "sidebar.plan_trip": "অফলাইন ভ্ৰমণৰ পৰিকল্পনা কৰক", "sidebar.manual_location": "মেনুৱেল অৱস্থান", "sidebar.toggle_theme": "ডাৰ্ক / লাইট মোড", - "sidebar.recenter": "মোৰ অৱস্থান শেহতীয়াকৈ কেন্দ্ৰ কৰক", - "sidebar.tutorial": "টিউটোৰিয়েল", - "sidebar.shortcut_info": "এই বুটামসমূহৰ চৰ্টকাট ইয়াত দিয়া ধৰণে সংশ্লিষ্ট চিহ্নসমূহৰ সৈতে মূল পৰ্দাত দিয়া হৈছে — বৈশিষ্ট্যসমূহ 1 ৰ পৰা 5 লৈ ওপৰৰ বাৰত আৰু 6 আপোনাৰ পৰ্দাৰ সোঁফালে আছে।", + "sidebar.recenter": "মোৰ অৱস্থান পুনৰ কেন্দ্ৰীভূত কৰক", + "sidebar.tutorial": "টিউটৰিয়েল", + "sidebar.shortcut_info": "এই বুটামসমূহৰ চৰ্টকাট মূল পৰ্দাত সংশ্লিষ্ট চিহ্নৰ সৈতে দিয়া হৈছে — ১ ৰ পৰা ৫ লৈ বৈশিষ্ট্যসমূহ ওপৰৰ বাৰত আৰু ৬ আপোনাৰ পৰ্দাৰ সোঁফালে আছে।", "sidebar.crash_test_info": "আমাৰ ক্ৰেচ টেষ্ট ডেমো পৰীক্ষা কৰিবলৈ আপুনি এই লিংকটোৰ জৰিয়তে যাব পাৰে:", "sidebar.open_crash_test": "ক্ৰেচ টেষ্ট ডেমো মুকলি কৰক", - "dispatcher.call_dispatcher": "এজন ডিচপেচাৰক ফোন কৰক", - "dispatcher.in_control": "আপুনি নিয়ন্ত্ৰণত আছে", + "dispatcher.call_dispatcher": "ডিচপেচাৰক কল কৰক", + "dispatcher.in_control": "নিয়ন্ত্ৰণ আপোনাৰ হাতত", "dispatcher.explain_location": "পৰিস্থিতিৰ বিষয়ে বুজাই দিয়ক আৰু আপোনাৰ স্থান শ্বেয়াৰ কৰক।", "dispatcher.loc_approx": "স্থান আনুমানিক", - "dispatcher.acquiring_gps": "GPS অর্জন...", - "dispatcher.select_service": "এটা সেৱা নিৰ্ব্বাচন কৰক", + "dispatcher.acquiring_gps": "GPS সংগ্ৰহ কৰা হৈছে...", + "dispatcher.select_service": "এটা সেৱা নিৰ্বাচন কৰক", "dispatcher.ambulance": "এম্বুলেন্স", "dispatcher.police": "আৰক্ষী", "dispatcher.general": "সাধাৰণ", "dispatcher.plus_code": "প্লাছ ক'ড", "dispatcher.close_go_back": "বন্ধ কৰক — যোগাযোগসমূহলৈ উভতি যাওক", - "crash_alert.call_dispatcher": "ডিচপেচাৰক ফোন কৰক", - "crash_alert.you_re_in_control": "আপুনি নিয়ন্ত্ৰণত আছে", + "crash_alert.call_dispatcher": "ডিচপেচাৰক কল কৰক", + "crash_alert.you_re_in_control": "নিয়ন্ত্ৰণ আপোনাৰ হাতত", "crash_alert.explain_situation": "পৰিস্থিতিৰ বিষয়ে বুজাই দিয়ক আৰু আপোনাৰ স্থান শ্বেয়াৰ কৰক।", "crash_alert.location_approximate": "অৱস্থান আনুমানিক", - "crash_alert.acquiring_gps": "GPS অধিগ্ৰহণ কৰি আছে...", + "crash_alert.acquiring_gps": "GPS সংগ্ৰহ কৰা হৈছে...", "crash_alert.select_service": "এটা সেৱা নিৰ্বাচন কৰক", "crash_alert.ambulance": "এম্বুলেন্স", "crash_alert.police": "আৰক্ষী", @@ -279,14 +279,14 @@ "crash_alert.plus_code_label": "প্লাছ ক'ড", "crash_choosing.crash_detected": "দুৰ্ঘটনা চিনাক্ত হৈছে", "crash_choosing.do_not_panic": "আতংকিত নহ'ব", - "crash_choosing.seconds_until": "ছেকেণ্ডত স্বয়ংক্ৰিয় SOS", + "crash_choosing.seconds_until": "স্বয়ংক্ৰিয় SOS লৈ ছেকেণ্ড বাকী", "crash_choosing.deceleration": "{{speed}} কিমি/ঘণ্টাত হঠাৎ গতি হ্ৰাস।", "crash_choosing.emergency_contacts": "জৰুৰীকালীন যোগাযোগ", "crash_choosing.no_contacts": "কোনো যোগাযোগ ছেট কৰা নাই", "crash_choosing.will_be_alerted": "সতৰ্ক কৰা হ'ব।", "crash_choosing.automatic": "স্বয়ংক্ৰিয়", - "crash_choosing.auto_desc": "কল কৰে + যোগাযোগক জনায়", - "crash_choosing.manual": "হাতেৰে", + "crash_choosing.auto_desc": "কল কৰিব + যোগাযোগক জনাব", + "crash_choosing.manual": "মেনুৱেল", "crash_choosing.manual_desc": "মই কল কৰিম — যোগাযোগক জনোৱা হ'ব", "crash_choosing.im_ok_cancel": "মই ঠিক আছো — বাতিল কৰক", "crash_choosing.false_alarm": "ভুল অলাৰ্ম? নিৰৱ কৰিবলৈ PIN দিয়ক:", diff --git a/frontend/src/i18n/bn.json b/frontend/src/i18n/bn.json index f507f64..a91413f 100644 --- a/frontend/src/i18n/bn.json +++ b/frontend/src/i18n/bn.json @@ -1,202 +1,202 @@ { - "app.brand": "রোডএসওএস", + "app.brand": "RoadSOS", "lang.title": "আপনার ভাষা বেছে নিন", "lang.subtitle": "আপনি যে ভাষাটি সবচেয়ে ভালো বোঝেন সেটি বেছে নিন। পরে পরিবর্তন করতে পারবেন।", - "lang.continue": "চালিয়ে যান", - "location.finding": "অবস্থান খুঁজছে...", + "lang.continue": "এগিয়ে যান", + "location.finding": "অবস্থান খোঁজা হচ্ছে...", "location.waiting": "সিগন্যালের অপেক্ষায়...", "location.cached": "সংরক্ষিত", "status.online": "অনলাইন", "status.offline": "অফলাইন", - "status.connecting": "সংযোগ করা হচ্ছে…", + "status.connecting": "সার্ভার সচল করা হচ্ছে…", "sos.send": "SOS — অবস্থান পাঠান", - "sos.waiting": "SOS — GPS-এর অপেক্ষা", + "sos.waiting": "SOS — GPS-এর অপেক্ষায়", "sos.sent": "অবস্থান পাঠানো হয়েছে", - "sos.no_contact_warning": "জরুরি যোগাযোগ নেই — সরাসরি SOS-এর জন্য Medical ID-তে যোগ করুন", + "sos.no_contact_warning": "জরুরি পরিচিতি নেই — সরাসরি SOS-এর জন্য মেডিকেল আইডিতে যোগ করুন", "sos.copy_coords": "GPS স্থানাঙ্ক কপি করুন", "sos.copied": "কপি হয়েছে", "sos.to_contacts": "SOS → {{name}}", "emergency.ambulance": "অ্যাম্বুলেন্স", "emergency.police": "পুলিশ", - "emergency.fire": "ফায়ার", - "emergency.disaster": "দুর্যোগ", - "actions.plan_trip": "ভ্রমণ পরিকল্পনা", + "emergency.fire": "দমকল", + "emergency.disaster": "বিপর্যয়", + "actions.plan_trip": "ভ্রমণের পরিকল্পনা", "actions.medical_id": "মেডিকেল আইডি", - "actions.medical_id_unset": "Medical ID সেট করুন — সরাসরি SOS-এর জন্য আবশ্যক", - "actions.test_crash": "টেস্ট ক্র্যাশ", + "actions.medical_id_unset": "মেডিকেল আইডি সেট আপ করুন — সরাসরি SOS-এর জন্য প্রয়োজন", + "actions.test_crash": "ক্র্যাশ পরীক্ষা", "dock.nearest": "নিকটতম {{count}} · কল করতে ট্যাপ করুন", "dock.see_all": "সব দেখুন", "category.hospital": "হাসপাতাল", "category.police": "পুলিশ", "category.ambulance": "অ্যাম্বুলেন্স", - "category.fire": "ফায়ার", + "category.fire": "দমকল", "category.towing": "টোয়িং", "category.repair": "মেরামত", "category.puncture": "পাংচার", "category.showroom": "শোরুম", - "crash.detected": "দুর্ঘটনা সনাক্ত", + "crash.detected": "দুর্ঘটনা শনাক্ত হয়েছে", "crash.choose_mode": "SOS কীভাবে পাঠাবেন?", - "crash.auto": "অটো-পাঠান", + "crash.auto": "স্বয়ংক্রিয়ভাবে পাঠান", "crash.manual": "ম্যানুয়াল", - "crash.cancel": "বাতিল — ভুল অ্যালার্ম", + "crash.cancel": "বাতিল করুন — ভুল অ্যালার্ম", "crash.pin_prompt": "বাতিল করতে PIN দিন", - "crash.countdown": "{{n}} সেকেন্ডে পাঠাচ্ছে", + "crash.countdown": "{{n}} সেকেন্ডের মধ্যে পাঠানো হবে", "medical_id.title": "মেডিকেল আইডি", "medical_id.name": "পুরো নাম", "medical_id.blood_type": "রক্তের গ্রুপ", "medical_id.allergies": "অ্যালার্জি", - "medical_id.conditions": "চিকিৎসা শর্ত", - "medical_id.contacts": "জরুরি যোগাযোগ", - "medical_id.save": "সংরক্ষণ", - "medical_id.cancel": "বাতিল", - "header.emergency_numbers": "জরুরী নম্বর", + "medical_id.conditions": "চিকিৎসাগত অবস্থা", + "medical_id.contacts": "জরুরি পরিচিতি", + "medical_id.save": "সংরক্ষণ করুন", + "medical_id.cancel": "বাতিল করুন", + "header.emergency_numbers": "জরুরি নম্বরসমূহ", "header.always_offline": "সর্বদা অফলাইন", - "header.nearby_services": "কাছাকাছি পরিষেবা", - "header.searching": "অনুসন্ধান করা হচ্ছে...", - "header.found": "{{n}} পাওয়া গেছে", - "header.prioritised": "অগ্রাধিকার দেওয়া হয়েছে", + "header.nearby_services": "আশেপাশের পরিষেবা", + "header.searching": "খোঁজা হচ্ছে...", + "header.found": "{{n}}টি পাওয়া গেছে", + "header.prioritised": "অগ্রাধিকারপ্রাপ্ত", "header.ai": "এআই", - "actions.prioritise": "আমার অবস্থার জন্য অগ্রাধিকার দিন", + "actions.prioritise": "আমার পরিস্থিতির ভিত্তিতে অগ্রাধিকার দিন", "actions.re_prioritise": "পুনরায় অগ্রাধিকার দিন", "actions.directions": "দিকনির্দেশ", "actions.no_phone": "ফোন নেই", "filters.all": "সব", "filters.puncture": "পাংচার", - "loading.finding": "কাছাকাছি সাহায্য খুঁজছি...", - "loading.subtitle": "হাসপাতাল, পুলিশ ইত্যাদি অনুসন্ধান করা হচ্ছে", - "loading.error": "যোগাযোগ লোড করা যায়নি", - "list.empty_all": "কোনো পরিষেবা পাওয়া যায়নি। উপরের জাতীয় জরুরী নম্বরে কল করুন।", + "loading.finding": "আশেপাশে সাহায্য খোঁজা হচ্ছে...", + "loading.subtitle": "হাসপাতাল, পুলিশ ইত্যাদি খোঁজা হচ্ছে", + "loading.error": "পরিচিতি লোড করা যায়নি", + "list.empty_all": "কোনো পরিষেবা পাওয়া যায়নি। উপরের জাতীয় জরুরি নম্বরে কল করুন।", "list.empty_category": "এই বিভাগে কোনো পরিষেবা পাওয়া যায়নি", - "list.cached_results": "{{date}} এর সংরক্ষিত ফলাফল দেখাচ্ছে", + "list.cached_results": "{{date}} থেকে সংরক্ষিত ফলাফল দেখানো হচ্ছে", "card.open": "খোলা", "card.closed": "বন্ধ", - "card.unknown_status": "অবস্থা অজানা", - "footer.offline_fallback": "সার্ভারে পৌঁছানো যায়নি — ডেমো ডেটা দেখানো হচ্ছে। জরুরী নম্বর সর্বদা অফলাইনে কাজ করে।", + "card.unknown_status": "বর্তমান অবস্থা অজানা", + "footer.offline_fallback": "সার্ভারের সাথে সংযোগ করা যায়নি — ডেমো ডেটা দেখানো হচ্ছে। জরুরি নম্বরগুলো সবসময় অফলাইনে কাজ করে।", "track.share_prompt": "উদ্ধারকারীদের সাথে লাইভ লোকেশন শেয়ার করুন:", "track.copy_link": "লিঙ্ক কপি করুন", "track.copied": "কপি হয়েছে!", "track.creating": "লাইভ লিঙ্ক তৈরি হচ্ছে...", - "track.failed": "অফলাইনে লাইভ লিঙ্ক পাওয়া যাচ্ছে না", + "track.failed": "অফলাইনে লাইভ লিঙ্ক অনুপলব্ধ", "actions.set_location": "ম্যানুয়ালি অবস্থান সেট করুন", "status.manual": "ম্যানুয়াল", "manual_location.title": "অবস্থান সেট করুন", - "manual_location.choose_method": "আপনি কিভাবে আপনার অবস্থান সেট করতে চান?", - "manual_location.tap_map": "মানচিত্রে আলতো চাপুন", - "manual_location.search_address": "ঠিকানা অনুসন্ধান করুন", + "manual_location.choose_method": "আপনি কীভাবে আপনার অবস্থান নির্ধারণ করতে চান?", + "manual_location.tap_map": "মানচিত্রে ট্যাপ করুন", + "manual_location.search_address": "ঠিকানা খুঁজুন", "manual_location.search_placeholder": "শহর, ঠিকানা, বা স্থানাঙ্ক", - "manual_location.searching": "অনুসন্ধান করা হচ্ছে...", - "manual_location.no_results": "কোন ফলাফল পাওয়া যায়নি", - "manual_location.tap_hint": "আপনার অবস্থান সেট করতে মানচিত্রের যেকোনো জায়গায় আলতো চাপুন", + "manual_location.searching": "খোঁজা হচ্ছে...", + "manual_location.no_results": "কোনো ফলাফল পাওয়া যায়নি", + "manual_location.tap_hint": "আপনার অবস্থান সেট করতে মানচিত্রের যেকোনো জায়গায় ট্যাপ করুন", "actions.change_language": "ভাষা পরিবর্তন করুন", "medical_id.badge": "মেডিকেল আইডি", - "medical_id.welcome_title": "সেট আপ আপনার", - "medical_id.welcome_subtitle": "আপনি অচেতন হলে প্যারামেডিকরা এটি অ্যাক্সেস করতে পারেন", - "medical_id.subtitle": "প্রায় 30 সেকেন্ড সময় লাগে · শুধুমাত্র এই ডিভাইসে সংরক্ষণ করা হয়", - "medical_id.privacy_title": "আপনার ডেটা কখনই এই ডিভাইসটি ছেড়ে যায় না", - "medical_id.privacy_text": "শুধুমাত্র স্থানীয়ভাবে সংরক্ষণ করা হয়। কোন সার্ভারে আপলোড করা হয়নি. SOS সক্রিয় করা হলে শুধুমাত্র জরুরি পরিষেবার সাথে শেয়ার করা হয়।", - "medical_id.profile_completion": "প্রোফাইল সমাপ্তি", + "medical_id.welcome_title": "আপনার আইডি সেট আপ করুন", + "medical_id.welcome_subtitle": "আপনি অচেতন থাকলে প্যারামেডিকরা এটি দেখতে পারবেন", + "medical_id.subtitle": "প্রায় ৩০ সেকেন্ড সময় লাগে · শুধুমাত্র এই ডিভাইসেই সংরক্ষিত থাকে", + "medical_id.privacy_title": "আপনার ডেটা কখনোই এই ডিভাইসের বাইরে যায় না", + "medical_id.privacy_text": "শুধুমাত্র ফোনেই সংরক্ষিত থাকে। কোনো সার্ভারে আপলোড করা হয় না। শুধুমাত্র SOS চালু করলেই জরুরি পরিষেবার সাথে শেয়ার করা হয়।", + "medical_id.profile_completion": "প্রোফাইল সম্পূর্ণতা", "medical_id.personal": "ব্যক্তিগত", - "medical_id.name_placeholder": "যেমন অর্জুন শর্মা", + "medical_id.name_placeholder": "যেমন: অর্জুন শর্মা", "medical_id.age": "বয়স (বছর)", "medical_id.months": "মাস", - "medical_id.months_hint": "(যদি <1 বছর)", - "medical_id.months_note": "মাস ক্ষেত্র - 1 বছরের কম বয়সী শিশুদের জন্য প্রয়োজনীয়", - "medical_id.medical_details": "মেডিকেল বিশদ", - "medical_id.select_blood_type": "রক্তের ধরন নির্বাচন করুন", - "medical_id.allergies_placeholder": "যেমন পেনিসিলিন, চিনাবাদাম, ক্ষীর", - "medical_id.conditions_placeholder": "যেমন হাঁপানি, ডায়াবেটিস টাইপ 2", - "medical_id.medications_placeholder": "যেমন মেটফর্মিন, সালবুটামল", - "medical_id.contacts_label": "জরুরী যোগাযোগ", - "medical_id.contacts_hint": "এসওএস বার্তা একযোগে সমস্ত পরিচিতিতে পাঠানো হবে।", - "medical_id.contact1_label": "যোগাযোগ 1", - "medical_id.contact2_label": "যোগাযোগ 2", - "medical_id.contact3_label": "যোগাযোগ 3", + "medical_id.months_hint": "(বয়স ১ বছরের কম হলে)", + "medical_id.months_note": "মাসের ঘর — ১ বছরের কম বয়সী শিশুদের জন্য প্রয়োজনীয়", + "medical_id.medical_details": "চিকিৎসা সংক্রান্ত তথ্য", + "medical_id.select_blood_type": "রক্তের গ্রুপ নির্বাচন করুন", + "medical_id.allergies_placeholder": "যেমন: পেনিসিলিন, পিনাট, ল্যাটেক্স", + "medical_id.conditions_placeholder": "যেমন: হাঁপানি, ডায়াবেটিস টাইপ ২", + "medical_id.medications_placeholder": "যেমন: মেটফর্মিন, সালবুটামল", + "medical_id.contacts_label": "জরুরি পরিচিতি", + "medical_id.contacts_hint": "সব পরিচিতিকে একসাথে SOS বার্তা পাঠানো হবে।", + "medical_id.contact1_label": "পরিচিতি ১", + "medical_id.contact2_label": "পরিচিতি ২", + "medical_id.contact3_label": "পরিচিতি ৩", "medical_id.name_label": "নাম", - "medical_id.example_mum": "যেমন মা, বাবা, রাহুল", - "medical_id.leave_blank": "এড়িয়ে যাওয়ার জন্য ফাঁকা রাখুন", + "medical_id.example_mum": "যেমন: মা, বাবা, রাহুল", + "medical_id.leave_blank": "এড়িয়ে যেতে ফাঁকা রাখুন", "medical_id.phone_label": "ফোন নম্বর", - "medical_id.phone_placeholder": "যেমন 9198765432", - "medical_id.organ_donor_section": "অঙ্গ দান", - "medical_id.organ_donor": "আমি একজন অঙ্গ দাতা", - "medical_id.organ_donor_sub": "জরুরী প্রতিক্রিয়াকারীদের কাছে দৃশ্যমান", - "medical_id.saved": "মেডিকেল আইডি সংরক্ষিত", - "medical_id.close": "বন্ধ", + "medical_id.phone_placeholder": "যেমন: ৯১৯৮৭৬৫৪৩২", + "medical_id.organ_donor_section": "অঙ্গদান", + "medical_id.organ_donor": "আমি একজন অঙ্গদাতা", + "medical_id.organ_donor_sub": "জরুরি উদ্ধারকর্মীদের কাছে দৃশ্যমান", + "medical_id.saved": "মেডিকেল আইডি সেভ হয়েছে", + "medical_id.close": "বন্ধ করুন", "medical_id.skip": "আপাতত এড়িয়ে যান — পরে সেট আপ করুন", - "plan_trip.placeholder": "শহর, শহর বা ল্যান্ডমার্ক", - "plan_trip.error_not_found": "সেই জায়গাটা খুঁজে পাইনি।", + "plan_trip.placeholder": "শহর, গ্রাম বা ল্যান্ডমার্ক", + "plan_trip.error_not_found": "জায়গাটি খুঁজে পাওয়া যায়নি।", "plan_trip.use_current": "বর্তমান অবস্থান ব্যবহার করুন", "plan_trip.offline_mode": "অফলাইন মোড", - "plan_trip.title": "একটি অফলাইন ট্রিপ পরিকল্পনা করুন", - "plan_trip.subtitle": "অনলাইনে থাকাকালীন আপনার রুটে হাসপাতাল এবং পুলিশ ক্যাশে করুন — সেলুলার ডেড জোনে কাজ করে।", - "plan_trip.from": "থেকে", - "plan_trip.to": "প্রতি", + "plan_trip.title": "অফলাইন ট্রিপের পরিকল্পনা করুন", + "plan_trip.subtitle": "অনলাইনে থাকার সময় আপনার রুটের হাসপাতাল ও পুলিশ ক্যাশ করুন — সিগন্যাল না থাকলেও কাজ করবে।", + "plan_trip.from": "শুরু", + "plan_trip.to": "গন্তব্য", "plan_trip.quick_fill": "দ্রুত গন্তব্য", "plan_trip.info_idle": "এই রুটের হাসপাতাল, থানা এবং মেরামত পরিষেবাগুলি অফলাইন ব্যবহারের জন্য সংরক্ষণ করা হবে।", - "plan_trip.info_done": "রুট ক্যাশে জরুরী যোগাযোগ এখন ইন্টারনেট ছাড়াই উপলব্ধ।", - "plan_trip.info_error": "কোনো ওয়েপয়েন্ট ক্যাশে করা যায়নি। সংযোগ পরীক্ষা করুন এবং আবার চেষ্টা করুন.", - "plan_trip.caching": "ক্যাশে করা হচ্ছে...", - "plan_trip.cached": "রুট ক্যাশে", + "plan_trip.info_done": "রুট ক্যাশ করা হয়েছে। ইন্টারনেট ছাড়াই এখন জরুরি পরিচিতিদের পাওয়া যাবে।", + "plan_trip.info_error": "কোনো ওয়েপয়েন্ট ক্যাশ করা যায়নি। সংযোগ পরীক্ষা করে আবার চেষ্টা করুন।", + "plan_trip.caching": "ক্যাশ করা হচ্ছে...", + "plan_trip.cached": "রুট ক্যাশ করা হয়েছে", "plan_trip.plan_offline": "অফলাইন ট্রিপের পরিকল্পনা করুন", - "plan_trip.cancel": "বাতিল করুন - ফিরে যান", + "plan_trip.cancel": "বাতিল করুন — ফিরে যান", "city.chennai": "চেন্নাই", "city.bengaluru": "বেঙ্গালুরু", "city.coimbatore": "কোয়েম্বাটুর", "city.mumbai": "মুম্বাই", - "city.delhi": "দিল্লী", + "city.delhi": "দিল্লি", "city.hyderabad": "হায়দ্রাবাদ", "city.kolkata": "কলকাতা", "city.pune": "পুনে", - "triage.injured_q": "কেউ কি আহত?", + "triage.injured_q": "কেউ কি আহত হয়েছেন?", "triage.yes_injured": "হ্যাঁ, আহত", - "triage.no_injured": "কোন আঘাত নেই", - "triage.blocking_q": "যানবাহন কি রাস্তা অবরোধ করছে?", - "triage.yes_blocking": "হ্যাঁ, ব্লক করা হচ্ছে", + "triage.no_injured": "কেউ আহত হয়নি", + "triage.blocking_q": "গাড়িটি কি রাস্তা আটকে আছে?", + "triage.yes_blocking": "হ্যাঁ, রাস্তা আটকে আছে", "triage.no_blocking": "রাস্তা পরিষ্কার", - "triage.summary_idle": "একটি অগ্রাধিকার সুপারিশ পেতে উভয় প্রশ্নের উত্তর দিন।", - "triage.summary_injured": "আঘাতের রিপোর্ট — অ্যাম্বুলেন্স (108) প্রথমে অগ্রাধিকার দেওয়া হবে।", - "triage.summary_blocked": "রাস্তা অবরুদ্ধ — পুলিশ (100) এবং টোয়িং সুপারিশ করা হয়েছে।", - "triage.summary_clear": "কোনও আঘাত নেই, রাস্তা পরিষ্কার — মেরামত বা টোয়িং পরিষেবাগুলি প্রস্তাবিত৷", - "triage.label": "দ্রুত Triage", - "triage.title": "কি হয়েছে?", + "triage.summary_idle": "সঠিক পরামর্শ পেতে দুটি প্রশ্নেরই উত্তর দিন।", + "triage.summary_injured": "আহত হওয়ার রিপোর্ট — প্রথমে অ্যাম্বুলেন্সকে (১০৮) অগ্রাধিকার দেওয়া হবে।", + "triage.summary_blocked": "রাস্তা বন্ধ — পুলিশ (১০০) এবং টোয়িং করার পরামর্শ দেওয়া হচ্ছে।", + "triage.summary_clear": "কেউ আহত হয়নি, রাস্তা পরিষ্কার — মেরামত বা টোয়িং পরিষেবার পরামর্শ দেওয়া হচ্ছে।", + "triage.label": "দ্রুত ট্রায়েজ", + "triage.title": "কী হয়েছে?", "triage.subtitle": "দুটি প্রশ্ন — আমরা আপনার পরিস্থিতির জন্য সঠিক সাহায্যকে অগ্রাধিকার দেব।", - "triage.sos_btn": "এসওএস", + "triage.sos_btn": "SOS", "triage.prioritising": "⏳ অগ্রাধিকার দেওয়া হচ্ছে...", - "triage.get_help": "অগ্রাধিকারমূলক সাহায্য পান", - "triage.answer_both": "উভয় প্রশ্নের উত্তর দাও", - "triage.skip": "এড়িয়ে যান — সমস্ত পরিচিতি দেখান", + "triage.get_help": "অগ্রাধিকারপ্রাপ্ত সাহায্য পান", + "triage.answer_both": "দুটি প্রশ্নেরই উত্তর দিন", + "triage.skip": "এড়িয়ে যান — সব পরিচিতি দেখুন", "medical_id.medications": "বর্তমান ওষুধ", "medical_id.optional": "ঐচ্ছিক", - "medical_id.conditions_short": "অবস্থা", + "medical_id.conditions_short": "স্বাস্থ্য সমস্যা", "medical_id.organ_donor_label": "অঙ্গদাতা", "medical_id.yes": "হ্যাঁ", - "medical_id.edit": "সম্পাদনা", - "medical_id.empty_hint": "এখনও কোনো মেডিকেল আইডি সেট করা হয়নি। প্যারামেডিকদের প্রয়োজনীয় তথ্য (রক্তের গ্রুপ, অ্যালার্জি, ইত্যাদি) যোগ করতে সম্পাদনায় ট্যাপ করুন।", + "medical_id.edit": "এডিট করুন", + "medical_id.empty_hint": "এখনও কোনো মেডিকেল আইডি সেট করা হয়নি। প্যারামেডিকদের প্রয়োজনীয় তথ্য (রক্তের গ্রুপ, অ্যালার্জি, জরুরি পরিচিতি, ইত্যাদি) যোগ করতে 'এডিট করুন' এ ট্যাপ করুন।", "medical_id.clear_all": "সব মুছুন", - "medical_id.confirm_clear": "সব মেডিকেল আইডি ডেটা সাফ করবেন?", - "medical_id.contact_n": "জরুরি যোগাযোগ {{n}}", - "medical_id.contact1_name": "Contact 1 name", - "medical_id.contact1_phone": "Contact 1 phone", - "medical_id.contact2_name": "Contact 2 name", - "medical_id.contact2_phone": "Contact 2 phone", - "medical_id.contact3_name": "Contact 3 name", - "medical_id.contact3_phone": "Contact 3 phone", + "medical_id.confirm_clear": "সব মেডিকেল আইডি ডেটা মুছে ফেলবেন?", + "medical_id.contact_n": "জরুরি পরিচিতি {{n}}", + "medical_id.contact1_name": "পরিচিতি ১ এর নাম", + "medical_id.contact1_phone": "পরিচিতি ১ এর ফোন", + "medical_id.contact2_name": "পরিচিতি ২ এর নাম", + "medical_id.contact2_phone": "পরিচিতি ২ এর ফোন", + "medical_id.contact3_name": "পরিচিতি ৩ এর নাম", + "medical_id.contact3_phone": "পরিচিতি ৩ এর ফোন", "plan_trip.cache_route": "অফলাইন ব্যবহারের জন্য রুট সংরক্ষণ করুন", - "plan_trip.close": "বন্ধ", + "plan_trip.close": "বন্ধ করুন", "plan_trip.done": "সম্পন্ন", - "actions.refresh_location": "অবস্থান রিফ্রেশ", - "tooltip.test_crash": "পরীক্ষা ক্র্যাশ সতর্কতা", + "actions.refresh_location": "অবস্থান রিফ্রেশ করুন", + "tooltip.test_crash": "দুর্ঘটনা অ্যালার্ম পরীক্ষা", "tooltip.manual_location": "ম্যানুয়ালি সেট করা অবস্থান ব্যবহৃত হচ্ছে", - "tooltip.backend_warming": "সার্ভার জাগছে — নিষ্ক্রিয়তার পরে প্রথম অনুরোধে ৩০–৫৫ সেকেন্ড লাগতে পারে", - "tooltip.backend_fallback": "সার্ভার লাইভ ডেটা ফেরত দেয়নি — পুনঃচেষ্টা করার সময় সংরক্ষিত ডিরেক্টরি দেখাচ্ছি", + "tooltip.backend_warming": "সার্ভার চালু হচ্ছে — নিষ্ক্রিয়তার পরে প্রথম অনুরোধে ৩০–৫৫ সেকেন্ড লাগতে পারে", + "tooltip.backend_fallback": "সার্ভার লাইভ ডেটা ফেরত দেয়নি — পুনরায় চেষ্টা করার সময় আগে থেকে লোড করা তালিকা দেখানো হচ্ছে", "tooltip.copy_gps": "GPS কপি করুন", - "tooltip.send_immediate_sos": "এখনই SOS পাঠান", - "common.close": "বন্ধ", + "tooltip.send_immediate_sos": "জরুরি SOS পাঠান", + "common.close": "বন্ধ করুন", "common.back": "ফিরে যান", "sos.sms_emergency": "🚨 জরুরি অবস্থা — আমার সাহায্য দরকার।", "sos.sms_name": "নাম", - "sos.sms_blood": "রক্তের ধরন", + "sos.sms_blood": "রক্তের গ্রুপ", "sos.sms_allergies": "অ্যালার্জি", - "sos.sms_conditions": "চিকিৎসা অবস্থা", + "sos.sms_conditions": "স্বাস্থ্য সমস্যা", "sos.sms_plus_code": "প্লাস কোড", "sos.sms_near": "কাছাকাছি", "sos.sms_coords": "স্থানাঙ্ক", @@ -204,93 +204,93 @@ "dispatch.accident": "{{place}}-এ সড়ক দুর্ঘটনা।", "dispatch.injured_blocking": "ঘটনাস্থলে আহত ব্যক্তি আছেন। গাড়িটি ট্র্যাফিক আটকে দিচ্ছে।", "dispatch.injured_clear": "ঘটনাস্থলে আহত ব্যক্তি আছেন। গাড়িটি ট্র্যাফিক আটকাচ্ছে না।", - "dispatch.no_injury_blocking": "কোনো আঘাত নেই। গাড়িটি ট্র্যাফিক আটকে দিচ্ছে।", - "dispatch.minor": "ছোটখাটো ঘটনা। কোনো আঘাত নেই।", - "dispatch.send_services": "অনুগ্রহ করে অবিলম্বে জরুরি সেবা পাঠান।", + "dispatch.no_injury_blocking": "আহত হওয়ার খবর নেই। গাড়িটি ট্র্যাফিক আটকে দিচ্ছে।", + "dispatch.minor": "ছোটখাটো ঘটনা। আহত হওয়ার খবর নেই।", + "dispatch.send_services": "দয়া করে দ্রুত জরুরি পরিষেবা পাঠান।", "dispatch.plus_code": "অবস্থানের প্লাস কোড", "dispatch.gps_coords": "জিপিএস স্থানাঙ্ক", - "dispatch.status_dispatched": "এসওএস পাঠানো হয়েছে", - "dispatch.status_shared": "অবস্থান ভাগ করা হয়েছে৷", - "dispatch.help_on_way": "সাহায্যের পথে।", - "dispatch.circle_notified": "আপনার চেনাশোনা বিজ্ঞপ্তি দেওয়া হয়েছে.", - "dispatch.eta_kicker": "অ্যাম্বুলেন্স ইটিএ", + "dispatch.status_dispatched": "SOS পাঠানো হয়েছে", + "dispatch.status_shared": "অবস্থান শেয়ার করা হয়েছে", + "dispatch.help_on_way": "সাহায্য আসছে।", + "dispatch.circle_notified": "আপনার সার্কেলকে জানানো হয়েছে।", + "dispatch.eta_kicker": "অ্যাম্বুলেন্সের পৌঁছানোর সময়", "dispatch.eta_unit": "মিনিট", "dispatch.what_we_sent": "আমরা যা পাঠিয়েছি", "dispatch.live_updating": "লাইভ · আপডেট করা হচ্ছে", - "dispatch.location": "LOCATION", - "dispatch.speed": "প্রভাবে গতি", - "dispatch.triage": "TRIAGE", + "dispatch.location": "অবস্থান", + "dispatch.speed": "ধাক্কা লাগার সময় গতি", + "dispatch.triage": "ট্রায়েজ", "dispatch.battery": "ব্যাটারি", "dispatch.captured": "ক্যাপচার করা হয়েছে", - "dispatch.who_alerted": "কে সতর্ক করা হয়েছে", - "dispatch.your_circle": "আপনার চেনাশোনা", - "dispatch.role_emergency": "জরুরী অবস্থা", + "dispatch.who_alerted": "যাদের সতর্ক করা হয়েছে", + "dispatch.your_circle": "আপনার সার্কেল", + "dispatch.role_emergency": "জরুরি", "dispatch.role_hospital": "হাসপাতাল", - "dispatch.status_received": "প্রাপ্ত", + "dispatch.status_received": "গৃহীত", "dispatch.status_alerted": "সতর্ক করা হয়েছে", "dispatch.time_instant": "তাত্ক্ষণিক", "dispatch.time_just_now": "এইমাত্র", - "dispatch.close": "বন্ধ", - "scene.photo_label": "Accident scene photo", - "scene.photo_hint": "Captured automatically at time of SOS", - "scene.capturing": "Capturing scene…", - "scene.no_camera": "Scene photo unavailable", - "tutorial.skip": "Skip", - "tutorial.next": "Next", - "tutorial.yes": "YES", - "tutorial.no": "NO", - "tutorial.step1": "Do you want a tutorial of the app", - "tutorial.step2": "This is the top bar it consist of all functional buttons", - "tutorial.step3": "Here you can check for the status of internet connection whether it is online, offline or connecting", - "tutorial.step4": "This is the side menu which contains features name, information and demo to our test crash", - "tutorial.step5": "This contains information on all available features and switches of our app", - "tutorial.step6": "Would you like to see how the demo crash test works with the help of a video", + "dispatch.close": "বন্ধ করুন", + "scene.photo_label": "দুর্ঘটনাস্থলের ছবি", + "scene.photo_hint": "SOS পাঠানোর সময় স্বয়ংক্রিয়ভাবে তোলা হয়েছে", + "scene.capturing": "ছবি তোলা হচ্ছে…", + "scene.no_camera": "ঘটনাস্থলের ছবি পাওয়া যাচ্ছে না", + "tutorial.skip": "এড়িয়ে যান", + "tutorial.next": "পরবর্তী", + "tutorial.yes": "হ্যাঁ", + "tutorial.no": "না", + "tutorial.step1": "অ্যাপটির টিউটোরিয়াল দেখতে চান?", + "tutorial.step2": "এটি উপরের বার, এতে সব প্রয়োজনীয় বোতাম রয়েছে।", + "tutorial.step3": "এখানে আপনি ইন্টারনেট সংযোগের অবস্থা দেখতে পারবেন — অনলাইন, অফলাইন নাকি সংযোগ হচ্ছে।", + "tutorial.step4": "এটি সাইড মেনু, যেখানে ফিচারের নাম, তথ্য এবং টেস্ট ক্র্যাশের ডেমো আছে।", + "tutorial.step5": "এতে আমাদের অ্যাপের সব ফিচার ও সুইচের তথ্য রয়েছে।", + "tutorial.step6": "ভিডিওর মাধ্যমে ডেমো ক্র্যাশ টেস্ট কীভাবে কাজ করে দেখতে চান?", "sidebar.menu": "মেনু", "sidebar.medical_card": "আপনার মেডিকেল কার্ড", "sidebar.language": "ভাষা", "sidebar.plan_trip": "অফলাইন ট্রিপের পরিকল্পনা করুন", "sidebar.manual_location": "ম্যানুয়াল অবস্থান", - "sidebar.toggle_theme": "গাঢ়/হালকা মোড", - "sidebar.recenter": "আমার অবস্থান পুনরায় কেন্দ্রীভূত করুন৷", + "sidebar.toggle_theme": "ডার্ক / লাইট মোড", + "sidebar.recenter": "আমার অবস্থান কেন্দ্রে আনুন", "sidebar.tutorial": "টিউটোরিয়াল", - "sidebar.shortcut_info": "এই বোতামগুলির শর্টকাট প্রধান স্ক্রিনে অনুরূপ চিহ্ন সহ এখানে দেওয়া হয়েছে — বৈশিষ্ট্য 1 থেকে 5টি উপরের বারে এবং 6টি আপনার স্ক্রিনের ডানদিকে রয়েছে।", + "sidebar.shortcut_info": "এই বোতামগুলোর শর্টকাট প্রধান স্ক্রিনে অনুরূপ চিহ্নসহ এখানে দেওয়া হয়েছে — বৈশিষ্ট্য ১ থেকে ৫ উপরের বারে এবং ৬ স্ক্রিনের ডানদিকে রয়েছে।", "sidebar.crash_test_info": "আমাদের ক্র্যাশ টেস্ট ডেমো চেক করতে আপনি এই লিঙ্কের মাধ্যমে যেতে পারেন:", "sidebar.open_crash_test": "ক্র্যাশ টেস্ট ডেমো খুলুন", - "dispatcher.call_dispatcher": "একজন প্রেরককে কল করুন", - "dispatcher.in_control": "আপনি নিয়ন্ত্রণে আছেন", - "dispatcher.explain_location": "পরিস্থিতি ব্যাখ্যা করুন এবং আপনার অবস্থান ভাগ করুন.", - "dispatcher.loc_approx": "অবস্থান আনুমানিক", - "dispatcher.acquiring_gps": "GPS অর্জন করা হচ্ছে...", - "dispatcher.select_service": "একটি পরিষেবা নির্বাচন করুন", + "dispatcher.call_dispatcher": "ডিসপ্যাচারকে কল করুন", + "dispatcher.in_control": "নিয়ন্ত্রণ আপনার হাতে", + "dispatcher.explain_location": "পরিস্থিতি বুঝিয়ে বলুন এবং আপনার অবস্থান শেয়ার করুন।", + "dispatcher.loc_approx": "আনুমানিক অবস্থান", + "dispatcher.acquiring_gps": "GPS সিগন্যাল নেওয়া হচ্ছে...", + "dispatcher.select_service": "পরিষেবা বেছে নিন", "dispatcher.ambulance": "অ্যাম্বুলেন্স", "dispatcher.police": "পুলিশ", "dispatcher.general": "সাধারণ", "dispatcher.plus_code": "প্লাস কোড", - "dispatcher.close_go_back": "বন্ধ করুন - পরিচিতিতে ফিরে যান", - "crash_alert.call_dispatcher": "Call a Dispatcher", - "crash_alert.you_re_in_control": "You're in Control", - "crash_alert.explain_situation": "Explain the situation and share your location.", - "crash_alert.location_approximate": "Location approximate", - "crash_alert.acquiring_gps": "Acquiring GPS...", - "crash_alert.select_service": "Select a service", - "crash_alert.ambulance": "Ambulance", - "crash_alert.police": "Police", - "crash_alert.general": "General", - "crash_alert.plus_code_label": "Plus Code", - "crash_choosing.crash_detected": "CRASH DETECTED", - "crash_choosing.do_not_panic": "DO NOT PANIC", - "crash_choosing.seconds_until": "seconds until auto-SOS", - "crash_choosing.deceleration": "Sudden deceleration at {{speed}} km/h.", - "crash_choosing.emergency_contacts": "emergency contacts", - "crash_choosing.no_contacts": "no contacts set", - "crash_choosing.will_be_alerted": "will be alerted.", - "crash_choosing.automatic": "Automatic", - "crash_choosing.auto_desc": "Calls + notifies contacts", - "crash_choosing.manual": "Manual", - "crash_choosing.manual_desc": "I'll call — contacts notified", - "crash_choosing.im_ok_cancel": "I'M OK — CANCEL", - "crash_choosing.false_alarm": "False alarm? Enter PIN to silence:", - "crash_choosing.stop_alarm": "Stop alarm", - "crash_choosing.incorrect_pin": "Incorrect PIN", - "crash_choosing.send_sos_now": "Send SOS now" + "dispatcher.close_go_back": "বন্ধ করুন — পরিচিতিতে ফিরে যান", + "crash_alert.call_dispatcher": "ডিসপ্যাচারকে কল করুন", + "crash_alert.you_re_in_control": "নিয়ন্ত্রণ আপনার হাতে", + "crash_alert.explain_situation": "পরিস্থিতি বুঝিয়ে বলুন এবং আপনার অবস্থান শেয়ার করুন।", + "crash_alert.location_approximate": "আনুমানিক অবস্থান", + "crash_alert.acquiring_gps": "GPS সিগন্যাল নেওয়া হচ্ছে...", + "crash_alert.select_service": "পরিষেবা বেছে নিন", + "crash_alert.ambulance": "অ্যাম্বুলেন্স", + "crash_alert.police": "পুলিশ", + "crash_alert.general": "সাধারণ", + "crash_alert.plus_code_label": "প্লাস কোড", + "crash_choosing.crash_detected": "দুর্ঘটনা শনাক্ত হয়েছে", + "crash_choosing.do_not_panic": "আতঙ্কিত হবেন না", + "crash_choosing.seconds_until": "অটো-SOS পাঠাতে বাকি", + "crash_choosing.deceleration": "হঠাৎ গতি কমে {{speed}} কিমি/ঘণ্টা হয়েছে।", + "crash_choosing.emergency_contacts": "জরুরি পরিচিতি", + "crash_choosing.no_contacts": "কোনো পরিচিতি যোগ করা হয়নি", + "crash_choosing.will_be_alerted": "সতর্ক করা হবে।", + "crash_choosing.automatic": "স্বয়ংক্রিয়", + "crash_choosing.auto_desc": "কল + পরিচিতদের নোটিফাই করে", + "crash_choosing.manual": "ম্যানুয়াল", + "crash_choosing.manual_desc": "আমি কল করব — পরিচিতদের জানানো হবে", + "crash_choosing.im_ok_cancel": "আমি ঠিক আছি — বাতিল করুন", + "crash_choosing.false_alarm": "ভুল অ্যালার্ম? বন্ধ করতে PIN দিন:", + "crash_choosing.stop_alarm": "অ্যালার্ম বন্ধ করুন", + "crash_choosing.incorrect_pin": "ভুল PIN", + "crash_choosing.send_sos_now": "এখনই SOS পাঠান" } \ No newline at end of file diff --git a/frontend/src/i18n/brx.json b/frontend/src/i18n/brx.json index 6ecfefb..b7e1d31 100644 --- a/frontend/src/i18n/brx.json +++ b/frontend/src/i18n/brx.json @@ -1,296 +1,296 @@ { "app.brand": "RoadSOS", "lang.title": "नोंथांनि राव सायख", - "lang.subtitle": "नोंथांहा गिबि बुजिनो हागौ राव सायख। उनाव सोलायनो हानानै।", - "lang.continue": "गिदिङाव थाङ", + "lang.subtitle": "नोंथांहा मोजाङै बुजिनो हानाय रावखौ सायख। उनाव बेखौ सोलायनो हागोन।", + "lang.continue": "आवगाय", "location.finding": "जायगा नागिरगासिनो...", - "location.waiting": "सिग्नालखौ नेवसिगासिनो...", - "location.cached": "थांखिगासिनो", + "location.waiting": "सिग्नेल नेगासिनो...", + "location.cached": "दोनथुमनाय", "status.online": "अनलाइन", "status.offline": "अफलाइन", - "status.connecting": "जोरो हाजासिनो दं…", + "status.connecting": "सार्भारखौ जागायगासिनो दं…", "sos.send": "SOS — जायगा दैथाय", - "sos.waiting": "SOS — GPS नेवसिगासिनो", + "sos.waiting": "SOS — GPS नेगासिनो", "sos.sent": "जायगा दैथायबाय", - "sos.no_contact_warning": "खामानि सोरनै गैया — सुजुगै SOS नि थाखाय Medical ID आव सुजुनाय", - "sos.copy_coords": "GPS निर्देशांक कापि खालाम", - "sos.copied": "कापि जादों", + "sos.no_contact_warning": "जरुरी जोगायजोल गैया — सिधा SOS नि थाखाय Medical ID आव दाजाब", + "sos.copy_coords": "GPS कोर्डिनेट्स कापि खालाम", + "sos.copied": "कापि जाबाय", "sos.to_contacts": "SOS → {{name}}", - "emergency.ambulance": "एम्बुलेंस", - "emergency.police": "पुलिस", - "emergency.fire": "थैमालि", - "emergency.disaster": "आफोद", - "actions.plan_trip": "लामायारि थांखि", + "emergency.ambulance": "एम्बुलेन्स", + "emergency.police": "फुलिस", + "emergency.fire": "अर खोमोरग्रा", + "emergency.disaster": "खैफोद", + "actions.plan_trip": "दावबायनायनि बिथांखि", "actions.medical_id": "Medical ID", - "actions.medical_id_unset": "Medical ID थानाय", + "actions.medical_id_unset": "Medical ID सेट खालाम — सिधा SOS नि थाखाय गोनां", "actions.test_crash": "टेस्ट क्र्याश", - "dock.nearest": "खाथिनि {{count}} · कोल खालामनो ट्याप", - "dock.see_all": "गासै नायबाय", - "category.hospital": "होस्पिटाल", - "category.police": "पुलिस", - "category.ambulance": "एम्बुलेंस", - "category.fire": "थैमालि", + "dock.nearest": "खाथिसिन {{count}} · कल खालामनो थु", + "dock.see_all": "गासैखौबो नाय", + "category.hospital": "देहाफाहामसालि", + "category.police": "फुलिस", + "category.ambulance": "एम्बुलेन्स", + "category.fire": "अर खोमोरग्रा", "category.towing": "टोइङ", - "category.repair": "जुनाय", + "category.repair": "फाहामनाय", "category.puncture": "पंकचार", "category.showroom": "शोरूम", - "crash.detected": "दुर्घटना मोनबाय", + "crash.detected": "जाब्रबथाइ हमदांबाय", "crash.choose_mode": "SOS माबोरै दैथायगोन?", "crash.auto": "अटो-दैथाय", - "crash.manual": "म्यानुयाल", - "crash.cancel": "बातिल", - "crash.pin_prompt": "बातिलनि थाखाय PIN", + "crash.manual": "म्यानुयेल", + "crash.cancel": "बातिल खालाम — भुल एलार्म", + "crash.pin_prompt": "बातिलनि थाखाय PIN हो", "crash.countdown": "{{n}} सेकेन्डाव दैथायगासिनो", "medical_id.title": "Medical ID", - "medical_id.name": "थोखो मुं", - "medical_id.blood_type": "थैनि गोरै", + "medical_id.name": "आबुं मुं", + "medical_id.blood_type": "थैनि रोखोम", "medical_id.allergies": "एलार्जि", - "medical_id.conditions": "रोगारि थंखि", - "medical_id.contacts": "खामानि सोरनै", - "medical_id.save": "थांखि", + "medical_id.conditions": "रोगारि थासारि", + "medical_id.contacts": "जरुरी जोगायजोलफोर", + "medical_id.save": "दोनथुम", "medical_id.cancel": "बातिल", - "header.emergency_numbers": "खथमाफा नम्बार", - "header.always_offline": "सानै अफलाइन", - "header.nearby_services": "समायना सेवायाव", - "header.searching": "नायगिरगासिनो दं...", + "header.emergency_numbers": "जरुरी नम्बरफोर", + "header.always_offline": "अरायबो अफलाइन", + "header.nearby_services": "खाथिनि सिबिथाइ", + "header.searching": "नागिरगासिनो दं...", "header.found": "{{n}} मोनबाय", - "header.prioritised": "गाहाय हो होनाय जाबाय", + "header.prioritised": "गुरुत्व होनाय जाबाय", "header.ai": "AI", - "actions.prioritise": "आंनि फिथायाव गाहाय हो हो", - "actions.re_prioritise": "फिन गाहाय हो हो", - "actions.directions": "फारसे", + "actions.prioritise": "आंनि थासारिनि थाखाय गुरुत्व हो", + "actions.re_prioritise": "फिन गुरुत्व हो", + "actions.directions": "लामा दिन्थिनाय", "actions.no_phone": "फन गैया", "filters.all": "गासै", - "filters.puncture": "पंक्चर", - "loading.finding": "समायना हेफाजाब नायगिरगासिनो...", - "loading.subtitle": "हस्पिटल, फुलिस आरो जौगाव", - "loading.error": "सम्पर्क लड लानाय जायाखै", - "list.empty_all": "जेबो सेवा मोनाखै। सिजौ राष्ट्रीय नम्बारआव कल खालाम।", - "list.empty_category": "बे श्रेणीयाव सेवा गैया", - "list.cached_results": "{{date}} नि दोनथिनाय फिथाय", - "card.open": "खुलिखो", + "filters.puncture": "पंकचार", + "loading.finding": "खाथिनि हेफाजाब नागिरगासिनो...", + "loading.subtitle": "देहाफाहामसालि, फुलिस आरो गुबुनखौ नागिरगासिनो", + "loading.error": "जोगायजोलफोरखौ लड खालामनो हायाखै", + "list.empty_all": "जेबो सिबिथाइ मोनाखै। गोजौआव थानाय हादरारि जरुरी नम्बरआव कल खालाम।", + "list.empty_category": "बे थाखोआव जेबो सिबिथाइ गैया", + "list.cached_results": "{{date}} नि दोनथुमनाय फिथाय दिन्थिगासिनो", + "card.open": "खुलिनाय", "card.closed": "बन्द", - "card.unknown_status": "फिथाय मोनाखै", - "footer.offline_fallback": "सार्वार सम सोनाय जायाखै — डेमो डाटा दिन्थिगासिनो। खथमाफा नम्बार सानै अफलाइन फायदा होयो।", - "track.share_prompt": "Share live location with rescuers:", - "track.copy_link": "Copy link", - "track.copied": "Copied!", - "track.creating": "Creating live link...", - "track.failed": "Live link unavailable offline", - "actions.set_location": "Set location manually", - "status.manual": "MANUAL", - "manual_location.title": "Set Location", - "manual_location.choose_method": "How would you like to set your location?", - "manual_location.tap_map": "Tap on map", - "manual_location.search_address": "Search address", - "manual_location.search_placeholder": "City, address, or coordinates", - "manual_location.searching": "Searching…", - "manual_location.no_results": "No results found", - "manual_location.tap_hint": "Tap anywhere on the map to set your location", - "actions.change_language": "Change Language", + "card.unknown_status": "थासारि मिथिनाय जायाखै", + "footer.offline_fallback": "सार्भारजों जरायथिनो हायाखै — डेमो डाटा दिन्थिगासिनो। जरुरी नम्बरफोरा जेब्लाबो अफलाइनआव हाबा मावो।", + "track.share_prompt": "उद्धार खालामग्राफोरजों लाइभ जायगाखौ शेयार खालाम:", + "track.copy_link": "लिंक कापि खालाम", + "track.copied": "कापि जाबाय!", + "track.creating": "लाइभ लिंक दागासिनो...", + "track.failed": "अफलाइनआव लाइभ लिंक मोननो हाथाव नङा", + "actions.set_location": "जायगाखौ म्यानुयेलि सेट खालाम", + "status.manual": "म्यानुयेल", + "manual_location.title": "जायगा सेट खालाम", + "manual_location.choose_method": "नोंथांनि जायगाखौ माबोरै सेट खालामनो लुबैयो?", + "manual_location.tap_map": "मेपआव थु", + "manual_location.search_address": "थिकना नागिर", + "manual_location.search_placeholder": "सहर, थिकना, एबा कोर्डिनेट्स", + "manual_location.searching": "नागिरगासिनो…", + "manual_location.no_results": "जेबो फिथाय मोनाखै", + "manual_location.tap_hint": "नोंथांनि जायगा सेट खालामनो मेपनि जायखिजाया जायगायाव थु", + "actions.change_language": "राव सोलाय", "medical_id.badge": "Medical ID", - "medical_id.welcome_title": "Set Up Your", - "medical_id.welcome_subtitle": "Paramedics can access this if you are unconscious", - "medical_id.subtitle": "Takes about 30 seconds · Stored only on this device", - "medical_id.privacy_title": "Your data never leaves this device", - "medical_id.privacy_text": "Stored locally only. Never uploaded to any server. Only shared with emergency services when SOS is activated.", - "medical_id.profile_completion": "Profile completion", - "medical_id.personal": "Personal", - "medical_id.name_placeholder": "e.g. Arjun Sharma", - "medical_id.age": "Age (years)", - "medical_id.months": "Months", - "medical_id.months_hint": "(if <1 yr)", - "medical_id.months_note": "Months field — necessary for children less than 1 year", - "medical_id.medical_details": "Medical Details", - "medical_id.select_blood_type": "Select blood type", - "medical_id.allergies_placeholder": "e.g. penicillin, peanuts, latex", - "medical_id.conditions_placeholder": "e.g. asthma, diabetes type 2", - "medical_id.medications_placeholder": "e.g. metformin, salbutamol", - "medical_id.contacts_label": "Emergency Contacts", - "medical_id.contacts_hint": "SOS messages will be sent to all contacts simultaneously.", - "medical_id.contact1_label": "Contact 1", - "medical_id.contact2_label": "Contact 2", - "medical_id.contact3_label": "Contact 3", - "medical_id.name_label": "Name", - "medical_id.example_mum": "e.g. Mum, Dad, Rahul", - "medical_id.leave_blank": "Leave blank to skip", - "medical_id.phone_label": "Phone number", - "medical_id.phone_placeholder": "e.g. 9198765432", - "medical_id.organ_donor_section": "Organ Donation", - "medical_id.organ_donor": "I am an organ donor", - "medical_id.organ_donor_sub": "Visible to emergency responders", - "medical_id.saved": "Medical ID Saved", - "medical_id.close": "Close", - "medical_id.skip": "Skip for now — set up later", - "plan_trip.placeholder": "City, town or landmark", - "plan_trip.error_not_found": "Couldn't find that place.", - "plan_trip.use_current": "Use current location", - "plan_trip.offline_mode": "Offline Mode", - "plan_trip.title": "Plan an Offline Trip", - "plan_trip.subtitle": "Cache hospitals and police along your route while online — works in cellular dead zones.", - "plan_trip.from": "From", - "plan_trip.to": "To", - "plan_trip.quick_fill": "Quick destinations", - "plan_trip.info_idle": "Hospitals, police stations and repair services along this route will be saved for offline use.", - "plan_trip.info_done": "Route cached. Emergency contacts are now available without internet.", - "plan_trip.info_error": "Could not cache any waypoints. Check connection and try again.", - "plan_trip.caching": "Caching...", - "plan_trip.cached": "Route Cached", - "plan_trip.plan_offline": "Plan Offline Trip", - "plan_trip.cancel": "Cancel — go back", - "city.chennai": "Chennai", - "city.bengaluru": "Bengaluru", - "city.coimbatore": "Coimbatore", - "city.mumbai": "Mumbai", - "city.delhi": "Delhi", - "city.hyderabad": "Hyderabad", - "city.kolkata": "Kolkata", - "city.pune": "Pune", - "triage.injured_q": "Is anyone injured?", - "triage.yes_injured": "Yes, injured", - "triage.no_injured": "No injuries", - "triage.blocking_q": "Is the vehicle blocking the road?", - "triage.yes_blocking": "Yes, blocking", - "triage.no_blocking": "Road is clear", - "triage.summary_idle": "Answer both questions to get a priority recommendation.", - "triage.summary_injured": "Injury reported — Ambulance (108) will be prioritised first.", - "triage.summary_blocked": "Road blocked — Police (100) and Towing recommended.", - "triage.summary_clear": "No injury, road clear — Repair or Towing services suggested.", - "triage.label": "Quick Triage", - "triage.title": "What happened?", - "triage.subtitle": "Two questions — we will prioritise the right help for your situation.", + "medical_id.welcome_title": "नोंथांनिखौ सेट-आप खालाम", + "medical_id.welcome_subtitle": "नोंथाङा गोसो गोमायोब्ला पेरामेडिक्सफोरा बेखौ नायनो हागोन", + "medical_id.subtitle": "प्राय ३० सेकेन्ड लायो · बे डिभाइसआवल' दोनथुमनाय जायो", + "medical_id.privacy_title": "नोंथांनि डाटाया बे डिभाइसनिफ्राय माब्लाबाबो बाहेराव थाङा", + "medical_id.privacy_text": "लकेलि दोनथुमनाय जायो। माब्लाबाबो सार्भारआव आपलोड खालामा। SOS एक्टिभ जाब्लाल' जरुरी सिबिथाइफोरजों शेयार खालामो।", + "medical_id.profile_completion": "प्रफाइल आबुं", + "medical_id.personal": "ब्यक्तिगत", + "medical_id.name_placeholder": "बिदिन्थि: अर्जुन शर्मा", + "medical_id.age": "बैसो (बोसोर)", + "medical_id.months": "दान", + "medical_id.months_hint": "(बैसो १ बोसोरनि खमब्ला)", + "medical_id.months_note": "दान बाहागो — १ बोसोरनिख्रुइ खम बैसोनि गथ'फोरनि थाखाय गोनां", + "medical_id.medical_details": "देहायारि गुवारै", + "medical_id.select_blood_type": "थैनि रोखोम सायख", + "medical_id.allergies_placeholder": "बिदिन्थि: पेनिसिलिन, पिनाट, लेटेक्स", + "medical_id.conditions_placeholder": "बिदिन्थि: एजमा, डायबेटीस टाइप २", + "medical_id.medications_placeholder": "बिदिन्थि: मेटफरमिन, सालबुटामल", + "medical_id.contacts_label": "जरुरी जोगायजोलफोर", + "medical_id.contacts_hint": "SOS मेसेजखौ गासै जोगायजोलफोरनो एखे समावनो दैथायहरगोन।", + "medical_id.contact1_label": "जोगायजोल १", + "medical_id.contact2_label": "जोगायजोल २", + "medical_id.contact3_label": "जोगायजोल ३", + "medical_id.name_label": "मुं", + "medical_id.example_mum": "बिदिन्थि: आइ, आफा, राहुल", + "medical_id.leave_blank": "गारनो थाखाय लांदां दोन", + "medical_id.phone_label": "फन नम्बर", + "medical_id.phone_placeholder": "बिदिन्थि: ९१९८७६५४३२", + "medical_id.organ_donor_section": "अंग दान", + "medical_id.organ_donor": "आं सासे अंग दान होगिरि", + "medical_id.organ_donor_sub": "जरुरी हेफाजाबगिरिफोरा नुनो मोनगोन", + "medical_id.saved": "Medical ID दोनथुमबाय", + "medical_id.close": "बन्द खालाम", + "medical_id.skip": "दानि थाखाय गार — उनाव सेट-आप खालाम", + "plan_trip.placeholder": "सहर, नोगोर एबा जायगा", + "plan_trip.error_not_found": "बै जायगाखौ मोननो हायाखै।", + "plan_trip.use_current": "दानि जायगाखौ बाहाय", + "plan_trip.offline_mode": "अफलाइन मड", + "plan_trip.title": "अफलाइन दावबायनाय बिथांखि", + "plan_trip.subtitle": "अनलाइन थानाय समाव लामायाव देहाफाहामसालि आरो फुलिसखौ दोनथुम — नेटवार्क गैजाय जायगायाव हाबा मावो।", + "plan_trip.from": "निफ्राय", + "plan_trip.to": "सिम", + "plan_trip.quick_fill": "गोख्रै थांखि", + "plan_trip.info_idle": "बे लामाजों देहाफाहामसालि, फुलिस स्टेसन आरो फाहामनाय सिबिथाइफोरखौ अफलाइन बाहायनो दोनथुमगोन।", + "plan_trip.info_done": "लामा दोनथुमबाय। जरुरी जोगायजोलफोरा दा इन्टरनेट गैयाबाल'बो हाबा मावगोन।", + "plan_trip.info_error": "जेबो जायगा दोनथुमनो हायाखै। कनेकसन नाय आरो फिन नाजा।", + "plan_trip.caching": "दोनथुमगासिनो...", + "plan_trip.cached": "लामा दोनथुमबाय", + "plan_trip.plan_offline": "अफलाइन दावबायनाय बिथांखि", + "plan_trip.cancel": "बातिल — उनथिं गिदिं", + "city.chennai": "चेन्नई", + "city.bengaluru": "बेंगालुरु", + "city.coimbatore": "कोयम्बटूर", + "city.mumbai": "मुम्बई", + "city.delhi": "दिल्ली", + "city.hyderabad": "हाइदराबाद", + "city.kolkata": "कलकाता", + "city.pune": "पुणे", + "triage.injured_q": "सोरबा जखम जादों नामा?", + "triage.yes_injured": "औ, जखम जादों", + "triage.no_injured": "रावबो जखम जायाखै", + "triage.blocking_q": "गारिया लामाखौ होबथादों नामा?", + "triage.yes_blocking": "औ, होबथादों", + "triage.no_blocking": "लामा उदां", + "triage.summary_idle": "गुरुत्व गोनां बाथ्रा मोननो मोननैबो सोंथिनि फिननाय हो।", + "triage.summary_injured": "जखम जादों — एम्बुलेन्स (१०८) खौ गिबियाव गुरुत्व होगोन।", + "triage.summary_blocked": "लामा होबथाजादों — फुलिस (१००) आरो टोइङखौ रेकमेन्ड खालामनाय जाबाय।", + "triage.summary_clear": "जखम गैया, लामा उदां — फाहामनाय एबा टोइङ सिबिथाइखौ रेकमेन्ड खालामनाय जाबाय।", + "triage.label": "गोख्रै ट्रायेज", + "triage.title": "मा जादों?", + "triage.subtitle": "मोननै सोंथि — जों नोंथांनि थासारिनि थाखाय थार हेफाजाबखौ गुरुत्व होगोन।", "triage.sos_btn": "SOS", - "triage.prioritising": "⏳ Prioritising...", - "triage.get_help": "Get Prioritised Help", - "triage.answer_both": "Answer both questions", - "triage.skip": "Skip — show all contacts", - "medical_id.medications": "दानै दबाइयाव", - "medical_id.optional": "विकल्पीय", - "medical_id.conditions_short": "थांखि", - "medical_id.organ_donor_label": "अंगदाता", - "medical_id.yes": "हँ", - "medical_id.edit": "सोदना", - "medical_id.empty_hint": "मेडिकल ID अजेरा सेट नैनं।", - "medical_id.clear_all": "गासै हाजाव", - "medical_id.confirm_clear": "गासै मेडिकल ID डाटा हाजावनो?", - "medical_id.contact_n": "आबाद् रादाय {{n}}", - "medical_id.contact1_name": "Contact 1 name", - "medical_id.contact1_phone": "Contact 1 phone", - "medical_id.contact2_name": "Contact 2 name", - "medical_id.contact2_phone": "Contact 2 phone", - "medical_id.contact3_name": "Contact 3 name", - "medical_id.contact3_phone": "Contact 3 phone", - "plan_trip.cache_route": "अफलायन गोनां फिथाइ केच", - "plan_trip.close": "बन्द", - "plan_trip.done": "थोदोब", - "actions.refresh_location": "जायगा रिफ्रेश", - "tooltip.test_crash": "Test crash alert", - "tooltip.manual_location": "Using manually set location", - "tooltip.backend_warming": "Waking the backend up — first request after idle can take 30–55s", - "tooltip.backend_fallback": "Backend did not return live data — showing pre-loaded directory while we retry", - "tooltip.copy_gps": "Copy GPS", - "tooltip.send_immediate_sos": "Send immediate SOS", - "common.close": "Close", - "common.back": "Back", - "sos.sms_emergency": "🚨आपातकाल - मुझे मदद की ज़रूरत है।", - "sos.sms_name": "नाम", - "sos.sms_blood": "खून", - "sos.sms_allergies": "एलर्जी", - "sos.sms_conditions": "स्थितियाँ", - "sos.sms_plus_code": "प्लस कोड", - "sos.sms_near": "पास में", + "triage.prioritising": "⏳ गुरुत्व होगासिनो...", + "triage.get_help": "गुरुत्व गोनां हेफाजाब मोन", + "triage.answer_both": "मोननैबो सोंथिनि फिननाय हो", + "triage.skip": "गार — गासै जोगायजोलखौ दिन्थि", + "medical_id.medications": "दानि मुलि", + "medical_id.optional": "गोसोआरि", + "medical_id.conditions_short": "थासारि", + "medical_id.organ_donor_label": "अंग दान होगिरि", + "medical_id.yes": "औ", + "medical_id.edit": "सुजु", + "medical_id.empty_hint": "जेबो Medical ID सेट खालामाखै। पेरामेडिक्सनो गोनां जानाय गुवारै (थैनि रोखोम, एलार्जि, जरुरी जोगायजोल बायदि) दाजाबनो 'सुजु'आव थु।", + "medical_id.clear_all": "गासैखौबो हुखुमोर", + "medical_id.confirm_clear": "गासै Medical ID डाटाखौ हुखुमोरनो सानदों?", + "medical_id.contact_n": "जरुरी जोगायजोल {{n}}", + "medical_id.contact1_name": "जोगायजोल १ मुं", + "medical_id.contact1_phone": "जोगायजोल १ फन", + "medical_id.contact2_name": "जोगायजोल २ मुं", + "medical_id.contact2_phone": "जोगायजोल २ फन", + "medical_id.contact3_name": "जोगायजोल ३ मुं", + "medical_id.contact3_phone": "जोगायजोल ३ फन", + "plan_trip.cache_route": "अफलाइन बाहायनो लामा दोनथुम", + "plan_trip.close": "बन्द खालाम", + "plan_trip.done": "जाबाय", + "actions.refresh_location": "जायगा रिफ्रेस खालाम", + "tooltip.test_crash": "क्र्याश एलार्ट टेस्ट", + "tooltip.manual_location": "म्यानुयेलि सेट खालामनाय जायगा बाहायगासिनो", + "tooltip.backend_warming": "सार्भारखौ जागायगासिनो दं — उदां जानायनि उनाव गिबि रिकुएस्टआ ३०–५५ सेकेन्ड लानो हागौ", + "tooltip.backend_fallback": "सार्भारआ लाइभ डाटा होनहायाखै — नाजाफिनसिम सिगां-लड जानाय डाइरेक्टरी दिन्थिगासिनो", + "tooltip.copy_gps": "GPS कापि खालाम", + "tooltip.send_immediate_sos": "संगे संगे SOS दैथाय", + "common.close": "बन्द खालाम", + "common.back": "उनथिं गिदिं", + "sos.sms_emergency": "🚨 खैफोद/जरुरी — आंखौ हेफाजाब नांगौ।", + "sos.sms_name": "मुं", + "sos.sms_blood": "थै", + "sos.sms_allergies": "एलार्जि", + "sos.sms_conditions": "थासारि", + "sos.sms_plus_code": "प्लस क'ड", + "sos.sms_near": "खाथियाव", "sos.sms_coords": "कोर्ड्स", - "sos.sms_footer": "रोडएसओएस द्वारा स्वचालित रूप से भेजा गया।", - "dispatch.accident": "Road accident at {{place}}.", - "dispatch.injured_blocking": "Injured persons on scene. Vehicle is blocking traffic.", - "dispatch.injured_clear": "Injured persons on scene. Vehicle is not blocking traffic.", - "dispatch.no_injury_blocking": "No injuries reported. Vehicle is blocking traffic.", - "dispatch.minor": "Minor incident. No injuries reported.", - "dispatch.send_services": "Please send emergency services immediately.", - "dispatch.plus_code": "Location plus code", - "dispatch.gps_coords": "GPS coordinates", - "dispatch.status_dispatched": "SOS DISPATCHED", - "dispatch.status_shared": "LOCATION SHARED", - "dispatch.help_on_way": "Help is on the way.", - "dispatch.circle_notified": "Your circle has been notified.", - "dispatch.eta_kicker": "AMBULANCE ETA", - "dispatch.eta_unit": "min", - "dispatch.what_we_sent": "What we sent", - "dispatch.live_updating": "LIVE · UPDATING", - "dispatch.location": "LOCATION", - "dispatch.speed": "SPEED AT IMPACT", - "dispatch.triage": "TRIAGE", - "dispatch.battery": "BATTERY", - "dispatch.captured": "CAPTURED", - "dispatch.who_alerted": "WHO HAS BEEN ALERTED", - "dispatch.your_circle": "Your circle", - "dispatch.role_emergency": "Emergency", - "dispatch.role_hospital": "Hospital", - "dispatch.status_received": "RECEIVED", - "dispatch.status_alerted": "ALERTED", - "dispatch.time_instant": "instant", - "dispatch.time_just_now": "just now", - "dispatch.close": "Close", - "scene.photo_label": "Accident scene photo", - "scene.photo_hint": "Captured automatically at time of SOS", - "scene.capturing": "Capturing scene…", - "scene.no_camera": "Scene photo unavailable", - "tutorial.skip": "Skip", - "tutorial.next": "Next", - "tutorial.yes": "YES", - "tutorial.no": "NO", - "tutorial.step1": "Do you want a tutorial of the app", - "tutorial.step2": "This is the top bar it consist of all functional buttons", - "tutorial.step3": "Here you can check for the status of internet connection whether it is online, offline or connecting", - "tutorial.step4": "This is the side menu which contains features name, information and demo to our test crash", - "tutorial.step5": "This contains information on all available features and switches of our app", - "tutorial.step6": "Would you like to see how the demo crash test works with the help of a video", - "sidebar.menu": "Menu", - "sidebar.medical_card": "Your Medical Card", - "sidebar.language": "Language", - "sidebar.plan_trip": "Plan Offline Trip", - "sidebar.manual_location": "Manual Location", - "sidebar.toggle_theme": "Dark / Light Mode", - "sidebar.recenter": "Recenter My Location", - "sidebar.tutorial": "Tutorial", - "sidebar.shortcut_info": "The shortcut to these buttons are given on the main screen with corresponding symbols as given here — features 1 to 5 exist on top bar and 6 on right side of your screen.", - "sidebar.crash_test_info": "To check our crash test demo you can go through this link:", - "sidebar.open_crash_test": "Open Crash Test Demo", - "dispatcher.call_dispatcher": "Call a Dispatcher", - "dispatcher.in_control": "You're in Control", - "dispatcher.explain_location": "Explain the situation and share your location.", - "dispatcher.loc_approx": "Location approximate", - "dispatcher.acquiring_gps": "Acquiring GPS...", - "dispatcher.select_service": "Select a service", - "dispatcher.ambulance": "Ambulance", - "dispatcher.police": "Police", - "dispatcher.general": "General", - "dispatcher.plus_code": "Plus Code", - "dispatcher.close_go_back": "Close — go back to contacts", - "crash_alert.call_dispatcher": "Call a Dispatcher", - "crash_alert.you_re_in_control": "You're in Control", - "crash_alert.explain_situation": "Explain the situation and share your location.", - "crash_alert.location_approximate": "Location approximate", - "crash_alert.acquiring_gps": "Acquiring GPS...", - "crash_alert.select_service": "Select a service", - "crash_alert.ambulance": "Ambulance", - "crash_alert.police": "Police", - "crash_alert.general": "General", - "crash_alert.plus_code_label": "Plus Code", - "crash_choosing.crash_detected": "CRASH DETECTED", - "crash_choosing.do_not_panic": "DO NOT PANIC", - "crash_choosing.seconds_until": "seconds until auto-SOS", - "crash_choosing.deceleration": "Sudden deceleration at {{speed}} km/h.", - "crash_choosing.emergency_contacts": "emergency contacts", - "crash_choosing.no_contacts": "no contacts set", - "crash_choosing.will_be_alerted": "will be alerted.", - "crash_choosing.automatic": "Automatic", - "crash_choosing.auto_desc": "Calls + notifies contacts", - "crash_choosing.manual": "Manual", - "crash_choosing.manual_desc": "I'll call — contacts notified", - "crash_choosing.im_ok_cancel": "I'M OK — CANCEL", - "crash_choosing.false_alarm": "False alarm? Enter PIN to silence:", - "crash_choosing.stop_alarm": "Stop alarm", - "crash_choosing.incorrect_pin": "Incorrect PIN", - "crash_choosing.send_sos_now": "Send SOS now" + "sos.sms_footer": "RoadSOS निफ्राय गावनोगाव दैथायबाय।", + "dispatch.accident": "{{place}} आव लामा दुर्घटना।", + "dispatch.injured_blocking": "जाथाइयाव जखम जानाय सुबुंफोर दं। गारिया ट्राफिक होबथादों।", + "dispatch.injured_clear": "जाथाइयाव जखम जानाय सुबुंफोर दं। गारिया ट्राफिक होबथायाखै।", + "dispatch.no_injury_blocking": "रावबो जखम जायाखै। गारिया ट्राफिक होबथादों।", + "dispatch.minor": "फिसा जाथाइ। जेबो जखम गैया।", + "dispatch.send_services": "अननानै जरुरी सिबिथाइफोरखौ संगे संगे दैथाय।", + "dispatch.plus_code": "जायगानि प्लस क'ड", + "dispatch.gps_coords": "GPS कोर्ड्स", + "dispatch.status_dispatched": "SOS दैथायबाय", + "dispatch.status_shared": "जायगा शेयार खालामबाय", + "dispatch.help_on_way": "हेफाजाब फैगासिनो दं।", + "dispatch.circle_notified": "नोंथांनि हानजाखौ फोरमायबाय।", + "dispatch.eta_kicker": "एम्बुलेन्स सफैनाय सम", + "dispatch.eta_unit": "मिनिट", + "dispatch.what_we_sent": "जों मा दैथायहरबाय", + "dispatch.live_updating": "लाइभ · अपडेट जागासिनो", + "dispatch.location": "जायगा", + "dispatch.speed": "सौग्रावनायनि गोख्रैथि", + "dispatch.triage": "ट्रायेज", + "dispatch.battery": "ब्याटेरी", + "dispatch.captured": "केपचार खालामबाय", + "dispatch.who_alerted": "सोरखौ सांग्रां खालामदों", + "dispatch.your_circle": "नोंथांनि हानजा", + "dispatch.role_emergency": "जरुरी", + "dispatch.role_hospital": "देहाफाहामसालि", + "dispatch.status_received": "मोनबाय", + "dispatch.status_alerted": "सांग्रां खालामबाय", + "dispatch.time_instant": "संगे संगे", + "dispatch.time_just_now": "दासान्दि", + "dispatch.close": "बन्द खालाम", + "scene.photo_label": "दुर्घटना जायगानि सावगारि", + "scene.photo_hint": "SOS समाव गावनोगाव लाजानाय", + "scene.capturing": "सावगारि लागासिनो…", + "scene.no_camera": "जायगानि सावगारि गैया", + "tutorial.skip": "गार", + "tutorial.next": "उननि", + "tutorial.yes": "औ", + "tutorial.no": "नङा", + "tutorial.step1": "नोंथाङा एपनि ट्युटोरियेल नायनो लुबैयो नामा?", + "tutorial.step2": "बेयो गोजौनि बार, बेयाव गासैबो हाबायारि बुथामफोर दं", + "tutorial.step3": "इन्टरनेट कनेकसननि थासारि - अनलाइन, अफलाइन एबा जरायगासिनो दं - बेखौ नोंथाङा बेयाव नायनो हागोन", + "tutorial.step4": "बेयो साइड मेनु, बेयाव फिचारनि मुं, गुवारै आरो जोंनि टेस्ट क्र্যাश डेमो दं", + "tutorial.step5": "बेयाव जोंनि एपनि गासैबो फिचार आरो सुइचफोरनि गुवारै दं", + "tutorial.step6": "नोंथाङा भिडिअनि हेफाजाबाव डेमो क्र्याश टेस्टआ माबोरै हाबा मावो बेखौ नायनो लुबैयो नामा?", + "sidebar.menu": "मेनु", + "sidebar.medical_card": "नोंथांनि मेडिकल कार्ड", + "sidebar.language": "राव", + "sidebar.plan_trip": "अफलाइन दावबायनाय बिथांखि", + "sidebar.manual_location": "म्यानुयेल जायगा", + "sidebar.toggle_theme": "गोसोम / गोरा मड", + "sidebar.recenter": "आंनि जायगाखौ गेजेराव लाबोफिन", + "sidebar.tutorial": "ट्युटोरियेल", + "sidebar.shortcut_info": "बे बुथामफोरनि सर्टकाटखौ मेन स्क्रिनाव समान सिम्बोलजों होनाय जादों — फिचार १ निफ्राय ५ सिम गोजौ बारआव आरो ६ स्क्रिननि आगदा फारसे दं।", + "sidebar.crash_test_info": "जोंनि क्र्याश टेस्ट डेमोखौ नायनो नोंथाङा बे लिंकआव थांनो हागोन:", + "sidebar.open_crash_test": "क्र्याश टेस्ट डेमो खुलि", + "dispatcher.call_dispatcher": "डिस्प्याचारखौ कल खालाम", + "dispatcher.in_control": "कन्ट्रोलआ नोंथांनि आखायाव दं", + "dispatcher.explain_location": "थासारिखौ फोरमाय आरो नोंथांनि जायगाखौ शेयार खालाम।", + "dispatcher.loc_approx": "जायगा अनुमानिक", + "dispatcher.acquiring_gps": "GPS नागिरगासिनो...", + "dispatcher.select_service": "सिबिथाइ सायख", + "dispatcher.ambulance": "एम्बुलेन्स", + "dispatcher.police": "फुलिस", + "dispatcher.general": "सरासनस्रा", + "dispatcher.plus_code": "प्लस क'ड", + "dispatcher.close_go_back": "बन्द खालाम — जोगायजोलफोरआव उनथिं गिदिं", + "crash_alert.call_dispatcher": "डिस्प्याचारखौ कल खालाम", + "crash_alert.you_re_in_control": "कन्ट्रोलआ नोंथांनि आखायाव दं", + "crash_alert.explain_situation": "थासारिखौ फोरमाय आरो नोंथांनि जायगाखौ शेयार खालाम।", + "crash_alert.location_approximate": "जायगा अनुमानिक", + "crash_alert.acquiring_gps": "GPS नागिरगासिनो...", + "crash_alert.select_service": "सिबिथाइ सायख", + "crash_alert.ambulance": "एम्बुलेन्स", + "crash_alert.police": "फुलिस", + "crash_alert.general": "सरासनस्रा", + "crash_alert.plus_code_label": "प्लस क'ड", + "crash_choosing.crash_detected": "जाब्रबथाइ हमदांबाय", + "crash_choosing.do_not_panic": "दा गि", + "crash_choosing.seconds_until": "अटो-SOS दैथायहरनो थाखाय सेकेन्ड", + "crash_choosing.deceleration": "{{speed}} किमि/घन्टायाव गोख्रैथि खमायदों।", + "crash_choosing.emergency_contacts": "जरुरी जोगायजोलफोर", + "crash_choosing.no_contacts": "जेबो जोगायजोल सेट खालामाखै", + "crash_choosing.will_be_alerted": "सांग्रां खालामगोन।", + "crash_choosing.automatic": "गावनोगाव", + "crash_choosing.auto_desc": "कल खालामो + जोगायजोलखौ फोरमायो", + "crash_choosing.manual": "म्यानुयेल", + "crash_choosing.manual_desc": "आं कल खालामगोन — जोगायजोलफोरखौ सांग्रां खालामगोन", + "crash_choosing.im_ok_cancel": "आं मोजां दं — बातिल खालाम", + "crash_choosing.false_alarm": "भुल एलार्म? बन्द खालामनो PIN हो:", + "crash_choosing.stop_alarm": "एलार्म बन्द खालाम", + "crash_choosing.incorrect_pin": "भुल PIN", + "crash_choosing.send_sos_now": "दानो SOS दैथाय" } diff --git a/frontend/src/i18n/de.json b/frontend/src/i18n/de.json index ad1e2be..aa174b0 100644 --- a/frontend/src/i18n/de.json +++ b/frontend/src/i18n/de.json @@ -4,15 +4,15 @@ "lang.subtitle": "Wählen Sie die Sprache, die Sie am besten verstehen. Sie können sie später ändern.", "lang.continue": "Weiter", "location.finding": "Standort wird gesucht...", - "location.waiting": "Warte auf Signal...", - "location.cached": "zwischengespeichert", + "location.waiting": "Warten auf Signal...", + "location.cached": "Zwischengespeichert", "status.online": "ONLINE", "status.offline": "OFFLINE", - "status.connecting": "Verbindung…", + "status.connecting": "Server wird aufgeweckt…", "sos.send": "SOS — Standort senden", - "sos.waiting": "SOS — Warte auf GPS", + "sos.waiting": "SOS — Warten auf GPS", "sos.sent": "Standort gesendet", - "sos.no_contact_warning": "Kein Notfallkontakt — bitte in Medical ID hinzufügen für direkten SOS", + "sos.no_contact_warning": "Kein Notfallkontakt — für direktes SOS zum Medizinischen Ausweis hinzufügen", "sos.copy_coords": "GPS-Koordinaten kopieren", "sos.copied": "Kopiert", "sos.to_contacts": "SOS → {{name}}", @@ -20,11 +20,11 @@ "emergency.police": "Polizei", "emergency.fire": "Feuerwehr", "emergency.disaster": "Katastrophe", - "actions.plan_trip": "Reise planen", + "actions.plan_trip": "Route planen", "actions.medical_id": "Medizinischer Ausweis", - "actions.medical_id_unset": "Medical ID einrichten — erforderlich für direkten SOS", - "actions.test_crash": "Crash-Test", - "dock.nearest": "Nächste {{count}} · Tippen zum Anrufen", + "actions.medical_id_unset": "Medizinischen Ausweis einrichten — erforderlich für direktes SOS", + "actions.test_crash": "Crashtest", + "dock.nearest": "Nächste {{count}} · Zum Anrufen tippen", "dock.see_all": "Alle anzeigen", "category.hospital": "Krankenhaus", "category.police": "Polizei", @@ -36,11 +36,11 @@ "category.showroom": "Autohaus", "crash.detected": "Unfall erkannt", "crash.choose_mode": "Wie SOS senden?", - "crash.auto": "Auto-Senden", + "crash.auto": "Automatisch senden", "crash.manual": "Manuell", "crash.cancel": "Abbrechen — Fehlalarm", "crash.pin_prompt": "PIN zum Abbrechen eingeben", - "crash.countdown": "Senden in {{n}}s", + "crash.countdown": "Senden in {{n}} s", "medical_id.title": "Medizinischer Ausweis", "medical_id.name": "Vollständiger Name", "medical_id.blood_type": "Blutgruppe", @@ -63,25 +63,25 @@ "filters.all": "Alle", "filters.puncture": "Reifenpanne", "loading.finding": "Suche nach Hilfe in der Nähe...", - "loading.subtitle": "Suche Krankenhäuser, Polizei, etc.", + "loading.subtitle": "Suche nach Krankenhäusern, Polizei etc.", "loading.error": "Kontakte konnten nicht geladen werden", - "list.empty_all": "Keine Dienste gefunden. Wählen Sie die nationale Notrufnummer oben.", + "list.empty_all": "Keine Dienste gefunden. Rufen Sie die nationale Notrufnummer oben an.", "list.empty_category": "Keine Dienste in dieser Kategorie", "list.cached_results": "Zeige gespeicherte Ergebnisse von {{date}}", - "card.open": "Offen", + "card.open": "Geöffnet", "card.closed": "Geschlossen", "card.unknown_status": "Status unbekannt", "footer.offline_fallback": "Server nicht erreichbar — Demodaten werden angezeigt. Notrufnummern funktionieren immer offline.", - "track.share_prompt": "Echtzeit-Standort mit Rettern teilen:", + "track.share_prompt": "Live-Standort mit Rettern teilen:", "track.copy_link": "Link kopieren", "track.copied": "Kopiert!", "track.creating": "Live-Link wird erstellt...", "track.failed": "Live-Link offline nicht verfügbar", - "actions.set_location": "Legen Sie den Standort manuell fest", - "status.manual": "HANDBUCH", + "actions.set_location": "Standort manuell festlegen", + "status.manual": "MANUELL", "manual_location.title": "Standort festlegen", "manual_location.choose_method": "Wie möchten Sie Ihren Standort festlegen?", - "manual_location.tap_map": "Tippen Sie auf die Karte", + "manual_location.tap_map": "Auf Karte tippen", "manual_location.search_address": "Adresse suchen", "manual_location.search_placeholder": "Stadt, Adresse oder Koordinaten", "manual_location.searching": "Suche…", @@ -89,55 +89,55 @@ "manual_location.tap_hint": "Tippen Sie auf eine beliebige Stelle auf der Karte, um Ihren Standort festzulegen", "actions.change_language": "Sprache ändern", "medical_id.badge": "Medizinischer Ausweis", - "medical_id.welcome_title": "Richten Sie Ihr ein", - "medical_id.welcome_subtitle": "Hierauf können Sanitäter zugreifen, wenn Sie bewusstlos sind", + "medical_id.welcome_title": "Jetzt einrichten", + "medical_id.welcome_subtitle": "Sanitäter können hierauf zugreifen, wenn Sie bewusstlos sind", "medical_id.subtitle": "Dauert etwa 30 Sekunden · Wird nur auf diesem Gerät gespeichert", - "medical_id.privacy_title": "Ihre Daten verlassen niemals dieses Gerät", - "medical_id.privacy_text": "Nur lokal gespeichert. Nie auf einen Server hochgeladen. Wird nur an Rettungsdienste weitergegeben, wenn SOS aktiviert ist.", - "medical_id.profile_completion": "Profilvervollständigung", + "medical_id.privacy_title": "Ihre Daten verlassen dieses Gerät nie", + "medical_id.privacy_text": "Nur lokal gespeichert. Wird niemals auf einen Server hochgeladen. Wird nur an Rettungsdienste weitergegeben, wenn das SOS aktiviert ist.", + "medical_id.profile_completion": "Profil vervollständigen", "medical_id.personal": "Persönlich", - "medical_id.name_placeholder": "z.B. Arjun Sharma", + "medical_id.name_placeholder": "z. B. Arjun Sharma", "medical_id.age": "Alter (Jahre)", "medical_id.months": "Monate", - "medical_id.months_hint": "(wenn <1 Jahr)", - "medical_id.months_note": "Feld „Monate“ – erforderlich für Kinder unter 1 Jahr", + "medical_id.months_hint": "(unter 1 Jahr)", + "medical_id.months_note": "Feld „Monate“ — erforderlich für Kinder unter 1 Jahr", "medical_id.medical_details": "Medizinische Details", "medical_id.select_blood_type": "Blutgruppe auswählen", - "medical_id.allergies_placeholder": "z.B. Penicillin, Erdnüsse, Latex", - "medical_id.conditions_placeholder": "z.B. Asthma, Diabetes Typ 2", - "medical_id.medications_placeholder": "z.B. Metformin, Salbutamol", + "medical_id.allergies_placeholder": "z. B. Penicillin, Erdnüsse, Latex", + "medical_id.conditions_placeholder": "z. B. Asthma, Diabetes Typ 2", + "medical_id.medications_placeholder": "z. B. Metformin, Salbutamol", "medical_id.contacts_label": "Notfallkontakte", "medical_id.contacts_hint": "SOS-Nachrichten werden gleichzeitig an alle Kontakte gesendet.", "medical_id.contact1_label": "Kontakt 1", "medical_id.contact2_label": "Kontakt 2", "medical_id.contact3_label": "Kontakt 3", "medical_id.name_label": "Name", - "medical_id.example_mum": "z.B. Mama, Papa, Rahul", + "medical_id.example_mum": "z. B. Mama, Papa, Rahul", "medical_id.leave_blank": "Zum Überspringen leer lassen", "medical_id.phone_label": "Telefonnummer", - "medical_id.phone_placeholder": "z.B. 9198765432", + "medical_id.phone_placeholder": "z. B. 9198765432", "medical_id.organ_donor_section": "Organspende", "medical_id.organ_donor": "Ich bin Organspender", "medical_id.organ_donor_sub": "Für Einsatzkräfte sichtbar", "medical_id.saved": "Medizinischer Ausweis gespeichert", "medical_id.close": "Schließen", - "medical_id.skip": "Vorerst überspringen – später einrichten", - "plan_trip.placeholder": "Stadt, Ortschaft oder Wahrzeichen", - "plan_trip.error_not_found": "Konnte diesen Ort nicht finden.", + "medical_id.skip": "Vorerst überspringen — später einrichten", + "plan_trip.placeholder": "Stadt, Ort oder Wahrzeichen", + "plan_trip.error_not_found": "Dieser Ort konnte nicht gefunden werden.", "plan_trip.use_current": "Aktuellen Standort verwenden", "plan_trip.offline_mode": "Offline-Modus", - "plan_trip.title": "Planen Sie eine Offline-Reise", - "plan_trip.subtitle": "Speichern Sie Krankenhäuser und Polizei auf Ihrer Route, während Sie online sind – funktioniert in Mobilfunk-Totzonen.", - "plan_trip.from": "Aus", - "plan_trip.to": "Zu", + "plan_trip.title": "Offline-Route planen", + "plan_trip.subtitle": "Speichern Sie Krankenhäuser und Polizei auf Ihrer Route, während Sie online sind — funktioniert auch ohne Netz.", + "plan_trip.from": "Von", + "plan_trip.to": "Nach", "plan_trip.quick_fill": "Schnelle Ziele", - "plan_trip.info_idle": "Krankenhäuser, Polizeistationen und Reparaturdienste entlang dieser Route werden für die Offline-Nutzung gespeichert.", - "plan_trip.info_done": "Route zwischengespeichert. Notfallkontakte sind jetzt auch ohne Internet verfügbar.", - "plan_trip.info_error": "Es konnten keine Wegpunkte zwischengespeichert werden. Überprüfen Sie die Verbindung und versuchen Sie es erneut.", - "plan_trip.caching": "Caching...", - "plan_trip.cached": "Route zwischengespeichert", - "plan_trip.plan_offline": "Planen Sie eine Offline-Reise", - "plan_trip.cancel": "Abbrechen – zurückgehen", + "plan_trip.info_idle": "Krankenhäuser, Polizeistationen und Werkstätten entlang dieser Route werden für die Offline-Nutzung gespeichert.", + "plan_trip.info_done": "Route gespeichert. Notfallkontakte sind jetzt auch ohne Internet verfügbar.", + "plan_trip.info_error": "Es konnten keine Wegpunkte gespeichert werden. Überprüfen Sie die Verbindung und versuchen Sie es erneut.", + "plan_trip.caching": "Speichern...", + "plan_trip.cached": "Route gespeichert", + "plan_trip.plan_offline": "Offline-Route planen", + "plan_trip.cancel": "Abbrechen — zurück", "city.chennai": "Chennai", "city.bengaluru": "Bengaluru", "city.coimbatore": "Coimbatore", @@ -150,80 +150,80 @@ "triage.yes_injured": "Ja, verletzt", "triage.no_injured": "Keine Verletzungen", "triage.blocking_q": "Blockiert das Fahrzeug die Straße?", - "triage.yes_blocking": "Ja, Blockierung", - "triage.no_blocking": "Die Straße ist frei", + "triage.yes_blocking": "Ja, blockiert", + "triage.no_blocking": "Straße ist frei", "triage.summary_idle": "Beantworten Sie beide Fragen, um eine vorrangige Empfehlung zu erhalten.", - "triage.summary_injured": "Verletzung gemeldet – Krankenwagen (108) wird zuerst priorisiert.", - "triage.summary_blocked": "Straße gesperrt – Polizei (100) und Abschleppdienst empfohlen.", - "triage.summary_clear": "Keine Verletzung, Straße frei – Reparatur- oder Abschleppdienst empfohlen.", + "triage.summary_injured": "Verletzung gemeldet — Krankenwagen (108) wird zuerst priorisiert.", + "triage.summary_blocked": "Straße blockiert — Polizei (100) und Abschleppdienst empfohlen.", + "triage.summary_clear": "Keine Verletzungen, Straße frei — Reparatur- oder Abschleppdienst empfohlen.", "triage.label": "Schnelle Triage", "triage.title": "Was ist passiert?", - "triage.subtitle": "Zwei Fragen: Wir priorisieren die richtige Hilfe für Ihre Situation.", + "triage.subtitle": "Zwei Fragen — wir priorisieren die richtige Hilfe für Ihre Situation.", "triage.sos_btn": "SOS", - "triage.prioritising": "⏳ Priorisierung...", - "triage.get_help": "Erhalten Sie priorisierte Hilfe", + "triage.prioritising": "⏳ Priorisieren...", + "triage.get_help": "Priorisierte Hilfe anfordern", "triage.answer_both": "Beantworten Sie beide Fragen", - "triage.skip": "Überspringen – Alle Kontakte anzeigen", + "triage.skip": "Überspringen — alle Kontakte anzeigen", "medical_id.medications": "Aktuelle Medikamente", "medical_id.optional": "Optional", - "medical_id.conditions_short": "Krankheiten", + "medical_id.conditions_short": "Erkrankungen", "medical_id.organ_donor_label": "Organspender", "medical_id.yes": "Ja", "medical_id.edit": "Bearbeiten", - "medical_id.empty_hint": "Keine medizinische ID festgelegt. Tippen Sie auf Bearbeiten.", + "medical_id.empty_hint": "Noch kein Medizinischer Ausweis eingerichtet. Tippen Sie auf Bearbeiten, um Infos für Sanitäter (Blutgruppe, Allergien, Notfallkontakte etc.) hinzuzufügen.", "medical_id.clear_all": "Alles löschen", - "medical_id.confirm_clear": "Alle medizinischen ID-Daten löschen?", + "medical_id.confirm_clear": "Alle Daten im Medizinischen Ausweis löschen?", "medical_id.contact_n": "Notfallkontakt {{n}}", - "medical_id.contact1_name": "Contact 1 name", - "medical_id.contact1_phone": "Contact 1 phone", - "medical_id.contact2_name": "Contact 2 name", - "medical_id.contact2_phone": "Contact 2 phone", - "medical_id.contact3_name": "Contact 3 name", - "medical_id.contact3_phone": "Contact 3 phone", + "medical_id.contact1_name": "Name von Kontakt 1", + "medical_id.contact1_phone": "Telefon von Kontakt 1", + "medical_id.contact2_name": "Name von Kontakt 2", + "medical_id.contact2_phone": "Telefon von Kontakt 2", + "medical_id.contact3_name": "Name von Kontakt 3", + "medical_id.contact3_phone": "Telefon von Kontakt 3", "plan_trip.cache_route": "Route für Offline-Nutzung speichern", "plan_trip.close": "Schließen", "plan_trip.done": "Fertig", "actions.refresh_location": "Standort aktualisieren", - "tooltip.test_crash": "Test-Crash-Warnung", - "tooltip.manual_location": "Manuell festgelegter Standort in Verwendung", - "tooltip.backend_warming": "Server startet — erste Anfrage nach Leerlauf kann 30–55 s dauern", - "tooltip.backend_fallback": "Server lieferte keine Live-Daten — Anzeige des gespeicherten Verzeichnisses während Wiederholung", + "tooltip.test_crash": "Crashtest-Warnung", + "tooltip.manual_location": "Verwendet manuell festgelegten Standort", + "tooltip.backend_warming": "Server wird aufgeweckt — erste Anfrage nach Inaktivität kann 30–55 s dauern", + "tooltip.backend_fallback": "Server lieferte keine Live-Daten — zeige vorinstalliertes Verzeichnis, während wir es erneut versuchen", "tooltip.copy_gps": "GPS kopieren", "tooltip.send_immediate_sos": "Sofortiges SOS senden", "common.close": "Schließen", "common.back": "Zurück", "sos.sms_emergency": "🚨 NOTFALL — Ich brauche Hilfe.", "sos.sms_name": "Name", - "sos.sms_blood": "Blut", + "sos.sms_blood": "Blutgruppe", "sos.sms_allergies": "Allergien", "sos.sms_conditions": "Erkrankungen", "sos.sms_plus_code": "Plus-Code", "sos.sms_near": "In der Nähe von", "sos.sms_coords": "Koordinaten", - "sos.sms_footer": "Automatisch von RoadSOS gesendet.", - "dispatch.accident": "Road accident at {{place}}.", - "dispatch.injured_blocking": "Injured persons on scene. Vehicle is blocking traffic.", - "dispatch.injured_clear": "Injured persons on scene. Vehicle is not blocking traffic.", - "dispatch.no_injury_blocking": "No injuries reported. Vehicle is blocking traffic.", - "dispatch.minor": "Minor incident. No injuries reported.", - "dispatch.send_services": "Please send emergency services immediately.", - "dispatch.plus_code": "Location plus code", - "dispatch.gps_coords": "GPS coordinates", + "sos.sms_footer": "Automatisch gesendet von RoadSOS.", + "dispatch.accident": "Verkehrsunfall in {{place}}.", + "dispatch.injured_blocking": "Verletzte am Unfallort. Fahrzeug blockiert den Verkehr.", + "dispatch.injured_clear": "Verletzte am Unfallort. Fahrzeug blockiert den Verkehr nicht.", + "dispatch.no_injury_blocking": "Keine Verletzten gemeldet. Fahrzeug blockiert den Verkehr.", + "dispatch.minor": "Kleinerer Zwischenfall. Keine Verletzten gemeldet.", + "dispatch.send_services": "Bitte sofort Rettungsdienste entsenden.", + "dispatch.plus_code": "Plus-Code des Standorts", + "dispatch.gps_coords": "GPS-Koordinaten", "dispatch.status_dispatched": "SOS VERSENDET", "dispatch.status_shared": "STANDORT GETEILT", "dispatch.help_on_way": "Hilfe ist unterwegs.", "dispatch.circle_notified": "Ihr Kreis wurde benachrichtigt.", - "dispatch.eta_kicker": "voraussichtliche Ankunftszeit im Krankenwagen", + "dispatch.eta_kicker": "RETTUNGSWAGEN ETA", "dispatch.eta_unit": "min", "dispatch.what_we_sent": "Was wir gesendet haben", - "dispatch.live_updating": "LIVE · AKTUALISIERUNG", + "dispatch.live_updating": "LIVE · WIRD AKTUALISIERT", "dispatch.location": "STANDORT", - "dispatch.speed": "GESCHWINDIGKEIT BEIM AUFSCHLAG", + "dispatch.speed": "AUFPRALLGESCHWINDIGKEIT", "dispatch.triage": "TRIAGE", - "dispatch.battery": "BATTERIE", - "dispatch.captured": "ERFASST", - "dispatch.who_alerted": "WER WURDE ALARMIERT", - "dispatch.your_circle": "Dein Kreis", + "dispatch.battery": "AKKU", + "dispatch.captured": "AUFGENOMMEN", + "dispatch.who_alerted": "WER ALARMIERT WURDE", + "dispatch.your_circle": "Ihr Kreis", "dispatch.role_emergency": "Notfall", "dispatch.role_hospital": "Krankenhaus", "dispatch.status_received": "ERHALTEN", @@ -231,66 +231,66 @@ "dispatch.time_instant": "sofort", "dispatch.time_just_now": "soeben", "dispatch.close": "Schließen", - "scene.photo_label": "Accident scene photo", - "scene.photo_hint": "Captured automatically at time of SOS", - "scene.capturing": "Capturing scene…", - "scene.no_camera": "Scene photo unavailable", - "tutorial.skip": "Skip", - "tutorial.next": "Next", - "tutorial.yes": "YES", - "tutorial.no": "NO", - "tutorial.step1": "Do you want a tutorial of the app", - "tutorial.step2": "This is the top bar it consist of all functional buttons", - "tutorial.step3": "Here you can check for the status of internet connection whether it is online, offline or connecting", - "tutorial.step4": "This is the side menu which contains features name, information and demo to our test crash", - "tutorial.step5": "This contains information on all available features and switches of our app", - "tutorial.step6": "Would you like to see how the demo crash test works with the help of a video", + "scene.photo_label": "Foto der Unfallstelle", + "scene.photo_hint": "Wurde bei SOS-Auslösung automatisch aufgenommen", + "scene.capturing": "Foto wird aufgenommen…", + "scene.no_camera": "Foto der Unfallstelle nicht verfügbar", + "tutorial.skip": "Überspringen", + "tutorial.next": "Weiter", + "tutorial.yes": "JA", + "tutorial.no": "NEIN", + "tutorial.step1": "Möchten Sie eine Einführung in die App?", + "tutorial.step2": "Dies ist die obere Leiste mit allen Funktionsschaltflächen.", + "tutorial.step3": "Hier können Sie den Status der Internetverbindung prüfen: online, offline oder Verbindungsaufbau.", + "tutorial.step4": "Dies ist das Seitenmenü mit Funktionen, Informationen und unserer Crashtest-Demo.", + "tutorial.step5": "Hier finden Sie Informationen zu allen Funktionen und Einstellungen der App.", + "tutorial.step6": "Möchten Sie in einem Video sehen, wie die Crashtest-Demo funktioniert?", "sidebar.menu": "Menü", - "sidebar.medical_card": "Ihre Gesundheitskarte", + "sidebar.medical_card": "Ihr Medizinischer Ausweis", "sidebar.language": "Sprache", - "sidebar.plan_trip": "Planen Sie eine Offline-Reise", + "sidebar.plan_trip": "Offline-Route planen", "sidebar.manual_location": "Manueller Standort", "sidebar.toggle_theme": "Dunkel-/Hellmodus", - "sidebar.recenter": "Zentrieren Sie meinen Standort neu", + "sidebar.recenter": "Meinen Standort zentrieren", "sidebar.tutorial": "Anleitung", - "sidebar.shortcut_info": "Die Verknüpfung zu diesen Schaltflächen wird auf dem Hauptbildschirm mit den entsprechenden Symbolen wie hier angegeben angezeigt – die Funktionen 1 bis 5 befinden sich in der oberen Leiste und 6 auf der rechten Seite Ihres Bildschirms.", - "sidebar.crash_test_info": "Um unsere Crashtest-Demo zu testen, klicken Sie auf diesen Link:", - "sidebar.open_crash_test": "Öffnen Sie die Crashtest-Demo", - "dispatcher.call_dispatcher": "Rufen Sie einen Disponenten an", + "sidebar.shortcut_info": "Verknüpfungen für diese Tasten finden Sie mit den passenden Symbolen auf dem Hauptbildschirm: Die Funktionen 1 bis 5 sind in der oberen Leiste, Funktion 6 auf der rechten Seite.", + "sidebar.crash_test_info": "Um unsere Crashtest-Demo zu sehen, klicken Sie auf diesen Link:", + "sidebar.open_crash_test": "Crashtest-Demo öffnen", + "dispatcher.call_dispatcher": "Leitstelle anrufen", "dispatcher.in_control": "Sie haben die Kontrolle", "dispatcher.explain_location": "Erklären Sie die Situation und teilen Sie Ihren Standort mit.", "dispatcher.loc_approx": "Ungefährer Standort", - "dispatcher.acquiring_gps": "GPS wird erfasst...", - "dispatcher.select_service": "Wählen Sie einen Dienst aus", + "dispatcher.acquiring_gps": "GPS wird abgerufen...", + "dispatcher.select_service": "Dienst auswählen", "dispatcher.ambulance": "Krankenwagen", "dispatcher.police": "Polizei", "dispatcher.general": "Allgemein", "dispatcher.plus_code": "Plus-Code", - "dispatcher.close_go_back": "Schließen – zurück zu den Kontakten", - "crash_alert.call_dispatcher": "Call a Dispatcher", - "crash_alert.you_re_in_control": "You're in Control", - "crash_alert.explain_situation": "Explain the situation and share your location.", - "crash_alert.location_approximate": "Location approximate", - "crash_alert.acquiring_gps": "Acquiring GPS...", - "crash_alert.select_service": "Select a service", - "crash_alert.ambulance": "Ambulance", - "crash_alert.police": "Police", - "crash_alert.general": "General", - "crash_alert.plus_code_label": "Plus Code", - "crash_choosing.crash_detected": "CRASH DETECTED", - "crash_choosing.do_not_panic": "DO NOT PANIC", - "crash_choosing.seconds_until": "seconds until auto-SOS", - "crash_choosing.deceleration": "Sudden deceleration at {{speed}} km/h.", - "crash_choosing.emergency_contacts": "emergency contacts", - "crash_choosing.no_contacts": "no contacts set", - "crash_choosing.will_be_alerted": "will be alerted.", - "crash_choosing.automatic": "Automatic", - "crash_choosing.auto_desc": "Calls + notifies contacts", - "crash_choosing.manual": "Manual", - "crash_choosing.manual_desc": "I'll call — contacts notified", - "crash_choosing.im_ok_cancel": "I'M OK — CANCEL", - "crash_choosing.false_alarm": "False alarm? Enter PIN to silence:", - "crash_choosing.stop_alarm": "Stop alarm", - "crash_choosing.incorrect_pin": "Incorrect PIN", - "crash_choosing.send_sos_now": "Send SOS now" + "dispatcher.close_go_back": "Schließen — zurück zu den Kontakten", + "crash_alert.call_dispatcher": "Leitstelle anrufen", + "crash_alert.you_re_in_control": "Sie haben die Kontrolle", + "crash_alert.explain_situation": "Erklären Sie die Situation und teilen Sie Ihren Standort mit.", + "crash_alert.location_approximate": "Ungefährer Standort", + "crash_alert.acquiring_gps": "GPS wird abgerufen...", + "crash_alert.select_service": "Dienst auswählen", + "crash_alert.ambulance": "Krankenwagen", + "crash_alert.police": "Polizei", + "crash_alert.general": "Allgemein", + "crash_alert.plus_code_label": "Plus-Code", + "crash_choosing.crash_detected": "UNFALL ERKANNT", + "crash_choosing.do_not_panic": "RUHE BEWAHREN", + "crash_choosing.seconds_until": "Sekunden bis Auto-SOS", + "crash_choosing.deceleration": "Plötzliches Abbremsen bei {{speed}} km/h.", + "crash_choosing.emergency_contacts": "Notfallkontakte", + "crash_choosing.no_contacts": "Keine Kontakte festgelegt", + "crash_choosing.will_be_alerted": "werden alarmiert.", + "crash_choosing.automatic": "Automatisch", + "crash_choosing.auto_desc": "Ruft an & benachrichtigt Kontakte", + "crash_choosing.manual": "Manuell", + "crash_choosing.manual_desc": "Ich rufe an — Kontakte werden benachrichtigt", + "crash_choosing.im_ok_cancel": "MIR GEHT ES GUT — ABBRECHEN", + "crash_choosing.false_alarm": "Fehlalarm? PIN zum Abbrechen eingeben:", + "crash_choosing.stop_alarm": "Alarm stoppen", + "crash_choosing.incorrect_pin": "Falsche PIN", + "crash_choosing.send_sos_now": "SOS jetzt senden" } diff --git a/frontend/src/i18n/doi.json b/frontend/src/i18n/doi.json index 3604b61..7410c8d 100644 --- a/frontend/src/i18n/doi.json +++ b/frontend/src/i18n/doi.json @@ -1,142 +1,142 @@ { - "app.brand": "रोडएसओएस", - "lang.title": "अपनी भाशा चुनो", - "lang.subtitle": "ओह् भाशा चुनो जेह्ड़ी तुस सबने थमां बेहतर समझदे ओ। मगरूं बदली सकदे ओ।", - "lang.continue": "अगै बधो", - "location.finding": "स्थान ढूंढै दा ऐ...", - "location.waiting": "सिग्नल दी उडीक...", - "location.cached": "संभाली रक्खी ऐ", + "app.brand": "RoadSOS", + "lang.title": "अपनी भाषा चुनो", + "lang.subtitle": "ओह् भाषा चुनो जेह्ड़ी तुस सबने थमां बेहतर समझदे ओ। तुस बाद च इसगी बदली सकदे ओ।", + "lang.continue": "अग्गें बधो", + "location.finding": "लोकेशन लब्भदा पआ...", + "location.waiting": "सिग्नलै दी उडीक...", + "location.cached": "कैश कीता गेआ", "status.online": "ऑनलाइन", "status.offline": "ऑफलाइन", - "status.connecting": "जुड़ी रहियै…", - "sos.send": "SOS — स्थान भेजो", + "status.connecting": "सर्वर जगांदा पआ…", + "sos.send": "SOS — लोकेशन भेजो", "sos.waiting": "SOS — GPS दी उडीक", - "sos.sent": "स्थान भेजी दित्ता", - "sos.no_contact_warning": "कोई इमरजेंसी कांटैक्ट नेईं — सीधे SOS आस्तै Medical ID च जोड़ो", - "sos.copy_coords": "GPS निर्देशांक कापी करो", - "sos.copied": "कापी होई गेआ", - "sos.to_contacts": "एसओएस → {{नाम}} ऐ।", + "sos.sent": "लोकेशन भेजी दित्ती", + "sos.no_contact_warning": "कोई इमरजेंसी कांटैक्ट नेईं — सीधे SOS लेई Medical ID च जोड़ो", + "sos.copy_coords": "GPS निर्देशांक कॉपी करो", + "sos.copied": "कॉपी होई गेआ", + "sos.to_contacts": "SOS → {{name}}", "emergency.ambulance": "एम्बुलेंस", "emergency.police": "पुलिस", - "emergency.fire": "अग्निशमन", + "emergency.fire": "फायर", "emergency.disaster": "आपदा", - "actions.plan_trip": "यात्रा योजना", - "actions.medical_id": "मेडिकल आईडी", - "actions.medical_id_unset": "Medical ID सैट करो — सीधे SOS आस्तै लोड़चा", + "actions.plan_trip": "सफरै दी योजना", + "actions.medical_id": "मेडिकल ID", + "actions.medical_id_unset": "Medical ID सेट करो — सीधे SOS लेई जरूरी ऐ", "actions.test_crash": "टेस्ट क्रैश", - "dock.nearest": "नेड़े दे {{count}} · कॉल आस्तै टैप करो", + "dock.nearest": "नेड़े दे {{count}} · कॉल करने लेई टैप करो", "dock.see_all": "सारे दिक्खो", "category.hospital": "हस्पताल", "category.police": "पुलिस", "category.ambulance": "एम्बुलेंस", - "category.fire": "अग्निशमन", + "category.fire": "फायर", "category.towing": "टोइंग", "category.repair": "मरम्मत", "category.puncture": "पंक्चर", "category.showroom": "शोरूम", - "crash.detected": "हादसा पता लगा", - "crash.choose_mode": "SOS किआं भेजेआ जा?", + "crash.detected": "हादसा पता लग्गा", + "crash.choose_mode": "SOS कियां भेजेआ जा?", "crash.auto": "अपने आप भेजो", - "crash.manual": "मैन्युअल", - "crash.cancel": "रद्द — गलत अलार्म", - "crash.pin_prompt": "रद्द करने आस्तै PIN दर्ज करो", - "crash.countdown": "{{n}} सकिंट च भेजेआ जा करदा ऐ", - "medical_id.title": "मेडिकल आईडी", - "medical_id.name": "पूरा नांऽ", - "medical_id.blood_type": "रक्त समूह", + "crash.manual": "मैनुअल", + "crash.cancel": "रद्द करो — गलत अलार्म", + "crash.pin_prompt": "रद्द करने लेई PIN दर्ज करो", + "crash.countdown": "{{n}} सेकंडें च भेजदा पआ", + "medical_id.title": "मेडिकल ID", + "medical_id.name": "पूरा नां", + "medical_id.blood_type": "ब्लड ग्रुप", "medical_id.allergies": "एलर्जी", - "medical_id.conditions": "चिकित्सीय स्थिति", + "medical_id.conditions": "मेडिकल स्थिति", "medical_id.contacts": "इमरजेंसी कांटैक्ट", - "medical_id.save": "संभालो", - "medical_id.cancel": "रद्द", - "header.emergency_numbers": "आपात नम्बर", - "header.always_offline": "सदा ऑफलाइन", + "medical_id.save": "सेव करो", + "medical_id.cancel": "रद्द करो", + "header.emergency_numbers": "इमरजेंसी नंबर", + "header.always_offline": "हमेशा ऑफलाइन", "header.nearby_services": "नेड़े दीआं सेवाएं", - "header.searching": "ढूंढदा पेआ...", - "header.found": "{{n}} मिले", - "header.prioritised": "प्राथमिकता दित्ती", - "header.ai": "ऐ", - "actions.prioritise": "मेरी हालत आस्तै प्राथमिकता देओ", + "header.searching": "तुप्पदा पआ...", + "header.found": "{{n}} लब्भे", + "header.prioritised": "प्राथमिकता दित्ती दी", + "header.ai": "AI", + "actions.prioritise": "मेरी स्थिति लेई प्राथमिकता देओ", "actions.re_prioritise": "फिरी प्राथमिकता देओ", - "actions.directions": "दिशा", + "actions.directions": "रस्ता", "actions.no_phone": "फोन नेईं", - "filters.all": "सब", + "filters.all": "सारे", "filters.puncture": "पंक्चर", - "loading.finding": "नेड़े दी मदद ढूंढदा पेआ...", - "loading.subtitle": "अस्पताल, पुलिस आदि", - "loading.error": "सम्पर्क लोड नेईं होए", - "list.empty_all": "कोई सेवा नेईं लब्भी। उप्पर दे राष्ट्रीय नम्बर पर कॉल करो।", + "loading.finding": "नेड़े दी मदद लब्भदा पआ...", + "loading.subtitle": "हस्पताल, पुलिस ते होर लब्भदा पआ", + "loading.error": "कांटैक्ट लोड नेईं होई सके", + "list.empty_all": "कोई सेवा नेईं लब्भी। उप्पर दे राष्ट्रीय इमरजेंसी नंबर पर कॉल करो।", "list.empty_category": "इस श्रेणी च कोई सेवा नेईं", - "list.cached_results": "{{date}} दे सम्भालिये नतीजे", + "list.cached_results": "{{date}} दे सेव कीते दे नतीजे", "card.open": "खुल्ला", "card.closed": "बंद", - "card.unknown_status": "हालत पता नेईं", - "footer.offline_fallback": "सर्वर तगर नेईं पुज सके — डेमो डाटा दस्सेआ जाह्आ। आपात नम्बर हमेशा ऑफलाइन कम्म करदे न।", - "track.share_prompt": "बचावकर्ताएं कन्नै लाइव लोकेशन साझा करो:", + "card.unknown_status": "स्थिति पता नेईं", + "footer.offline_fallback": "सर्वर कन्नै नेईं जुड़ी सकेआ — डेमो डेटा दस्सदा पआ ऐ। इमरजेंसी नंबर हमेशा ऑफलाइन कम्म करदे न।", + "track.share_prompt": "बचाव करने आह्लें कन्नै लाइव लोकेशन शेयर करो:", "track.copy_link": "लिंक कॉपी करो", - "track.copied": "नकल कीती !", - "track.creating": "Creating live link...", - "track.failed": "लाइव लिंक ऑफलाइन अनुपलब्ध ऐ", - "actions.set_location": "मैन्युअल रूप कन्नै लोकेशन सेट करो", - "status.manual": "हत्थी", + "track.copied": "कॉपी होई गेआ!", + "track.creating": "लाइव लिंक बनांदा पआ...", + "track.failed": "लाइव लिंक ऑफलाइन उपलब्ध नेईं", + "actions.set_location": "लोकेशन मैनुअल रूप कन्नै सेट करो", + "status.manual": "मैनुअल", "manual_location.title": "लोकेशन सेट करो", - "manual_location.choose_method": "तुस अपनी लोकेशन किस चाल्ली सेट करना चांह् दे ओ?", + "manual_location.choose_method": "तुस अपनी लोकेशन कियां सेट करना चांह्दे ओ?", "manual_location.tap_map": "नक्शे पर टैप करो", - "manual_location.search_address": "पता खोजें", - "manual_location.search_placeholder": "शहर, पता, या निर्देशांक", - "manual_location.searching": "खोज करदे होई...", - "manual_location.no_results": "कोई नतीजा नहीं मिले", - "manual_location.tap_hint": "अपना स्थान सेट करने लेई नक्शे पर कुतै बी टैप करो", + "manual_location.search_address": "पता लब्भो", + "manual_location.search_placeholder": "शहर, पता, जां निर्देशांक", + "manual_location.searching": "लब्भदा पआ...", + "manual_location.no_results": "कोई नतीजा नेईं लब्भा", + "manual_location.tap_hint": "अपनी लोकेशन सेट करने लेई नक्शे पर कुतै बी टैप करो", "actions.change_language": "भाषा बदलो", - "medical_id.badge": "मेडिकल आईडी", + "medical_id.badge": "मेडिकल ID", "medical_id.welcome_title": "अपना सेटअप करो", - "medical_id.welcome_subtitle": "जेकर तुस बेहोश ओ तां पैरामेडिक्स इसगी एक्सेस करी सकदे न", - "medical_id.subtitle": "लगभग 30 सेकंड लगदा ऐ · सिर्फ इस डिवाइस पर गै संग्रहीत कीता जंदा ऐ", - "medical_id.privacy_title": "तुंदा डाटा इस डिवाइस थमां कदें बी नेईं निकलदा", - "medical_id.privacy_text": "सिर्फ लोकल रूप च संग्रहीत कीता जंदा ऐ। कदें बी कुसै सर्वर पर अपलोड नेईं कीता गेआ। एसओएस सक्रिय होने पर गै आपातकालीन सेवाएं कन्नै सांझा कीता जंदा ऐ।", + "medical_id.welcome_subtitle": "जेकर तुस बेहोश ओ तां पैरामेडिक्स इसगी दिक्खी सकदे न", + "medical_id.subtitle": "लगभग ३० सेकंड लगदे न · सिर्फ इसी डिवाइस पर सेव होंदा ऐ", + "medical_id.privacy_title": "तुंदा डेटा कदें बी इस डिवाइस थमां बार नेईं जंदा", + "medical_id.privacy_text": "सिर्फ लोकल सेव होंदा ऐ। कुसै सर्वर पर अपलोड नेईं कीता जंदा। SOS एक्टिव होने पर गै इमरजेंसी सेवाएं कन्नै शेयर कीता जंदा ऐ।", "medical_id.profile_completion": "प्रोफाइल पूरा करना", "medical_id.personal": "निजी", - "medical_id.name_placeholder": "उदा. अर्जुन शर्मा जी", - "medical_id.age": "उम्र (साल) ऐ।", + "medical_id.name_placeholder": "उदा. अर्जुन शर्मा", + "medical_id.age": "उम्र (साल)", "medical_id.months": "महीने", - "medical_id.months_hint": "(अगर <1 साल) ऐ।", - "medical_id.months_note": "महीने दा मैदान — 1 साल थमां घट्ट उम्र दे बच्चें लेई जरूरी ऐ", - "medical_id.medical_details": "मेडिकल डिटेल", - "medical_id.select_blood_type": "खून दा प्रकार चुनो", + "medical_id.months_hint": "(जेकर उम्र १ साल थमां घट्ट ऐ)", + "medical_id.months_note": "महीने दा फील्ड — १ साल थमां घट्ट उम्र दे बच्चें लेई जरूरी ऐ", + "medical_id.medical_details": "मेडिकल जानकारी", + "medical_id.select_blood_type": "ब्लड ग्रुप चुनो", "medical_id.allergies_placeholder": "उदा. पेनिसिलिन, मूंगफली, लेटेक्स", - "medical_id.conditions_placeholder": "उदा. दमा, मधुमेह टाइप 2 ऐ", + "medical_id.conditions_placeholder": "उदा. दमा, शुगर टाइप २", "medical_id.medications_placeholder": "उदा. मेटफार्मिन, सालबुटामोल", - "medical_id.contacts_label": "आपातकालीन संपर्क", - "medical_id.contacts_hint": "एसओएस संदेश सब्भै संपर्कें गी इक गै समें च भेजे जाङन।", - "medical_id.contact1_label": "संपर्क करो 1", - "medical_id.contact2_label": "संपर्क करो 2", - "medical_id.contact3_label": "संपर्क करो 3", + "medical_id.contacts_label": "इमरजेंसी कांटैक्ट", + "medical_id.contacts_hint": "SOS संदेश सारे कांटैक्टें गी इकठ्ठे भेजे जांगन।", + "medical_id.contact1_label": "कांटैक्ट १", + "medical_id.contact2_label": "कांटैक्ट २", + "medical_id.contact3_label": "कांटैक्ट ३", "medical_id.name_label": "नां", "medical_id.example_mum": "उदा. मम्मी, पापा, राहुल", - "medical_id.leave_blank": "छोड़ने के लरए खाली छोड़ दें", + "medical_id.leave_blank": "छड्डने लेई खाली रौह्ने देओ", "medical_id.phone_label": "फोन नंबर", - "medical_id.phone_placeholder": "उदा. ९१९८७६५४३२ ऐ", - "medical_id.organ_donor_section": "अंगदान करना", - "medical_id.organ_donor": "मैं इक अंग दाता हां", - "medical_id.organ_donor_sub": "आपातकालीन प्रतिक्रिया देने आह्लें गी दिक्खने गी मिलदा ऐ", - "medical_id.saved": "मेडिकल आईडी सेव कीती गेई", - "medical_id.close": "बंद", - "medical_id.skip": "फिलहाल छोड़ो — बाद च सेट करो", - "plan_trip.placeholder": "शहर, कस्बा या मील दा पत्थर", - "plan_trip.error_not_found": "उव जगह को नशीॊ ऩामा।", - "plan_trip.use_current": "वर्तमान स्थान दा इस्तेमाल करो", + "medical_id.phone_placeholder": "उदा. ९१९८७६५४३२", + "medical_id.organ_donor_section": "अंगदान", + "medical_id.organ_donor": "मैं अंग दाता हां", + "medical_id.organ_donor_sub": "इमरजेंसी मदद करने आह्लें गी दिक्खग", + "medical_id.saved": "मेडिकल ID सेव होई गेई", + "medical_id.close": "बंद करो", + "medical_id.skip": "फिलहाल छड्डो — बाद च सेट करो", + "plan_trip.placeholder": "शहर, कस्बा जां लैंडमार्क", + "plan_trip.error_not_found": "ओह जगह नेईं लब्भी।", + "plan_trip.use_current": "मौजूदा लोकेशन इस्तेमाल करो", "plan_trip.offline_mode": "ऑफलाइन मोड", - "plan_trip.title": "ऑफलाइन यात्रा दी योजना बनाओ", - "plan_trip.subtitle": "ऑनलाइन होने दे दौरान अपने रस्ते च अस्पताल ते पुलिस गी कैश करो — सेलुलर डेड जोन च कम्म करदा ऐ।", + "plan_trip.title": "ऑफलाइन सफरै दी योजना बनाओ", + "plan_trip.subtitle": "ऑनलाइन रौह्ंदे होई अपने रस्ते दे हस्पताल ते पुलिस गी कैश करो — नेटवर्क ना होने पर बी कम्म करदा ऐ।", "plan_trip.from": "थमां", - "plan_trip.to": "गी", - "plan_trip.quick_fill": "त्वरित मंजिलें", - "plan_trip.info_idle": "इस रस्ते दे कन्नै-कन्नै अस्पतालें, थाने ते मरम्मत सेवाएं गी आफलाइन इस्तेमाल लेई बचाई लैता जाग।", - "plan_trip.info_done": "रूट कैश कीता गेदा। आपातकालीन संपर्क हून इंटरनेट दे बगैर उपलब्ध ऐ।", - "plan_trip.info_error": "कोई बी वेपॉइंट कैश नेईं करी सकेआ। कनेक्शन चेक करो ते दुबारा कोशश करो।", - "plan_trip.caching": "कैशिंग करदे होई...", - "plan_trip.cached": "रूट कैश कीता गेदा", - "plan_trip.plan_offline": "ऑफलाइन यात्रा दी योजना बनाओ", + "plan_trip.to": "तक", + "plan_trip.quick_fill": "जल्दी दीआं मंजिलां", + "plan_trip.info_idle": "इस रस्ते दे कन्नै-कन्नै हस्पताल, पुलिस स्टेशन ते मरम्मत सेवाएं गी आफलाइन इस्तेमाल लेई सेव कीता जाग।", + "plan_trip.info_done": "रूट कैश कीता गेआ। इमरजेंसी कांटैक्ट हून इंटरनेट दे बगैर उपलब्ध न।", + "plan_trip.info_error": "कोई बी वेपॉइंट कैश नेईं होई सकेआ। कनेक्शन चेक करो ते दुबारा कोशश करो।", + "plan_trip.caching": "कैश करदा पआ...", + "plan_trip.cached": "रूट कैश कीता गेआ", + "plan_trip.plan_offline": "ऑफलाइन सफरै दी योजना बनाओ", "plan_trip.cancel": "रद्द करो — वापस जाओ", "city.chennai": "चेन्नई", "city.bengaluru": "बेंगलुरु", @@ -146,151 +146,151 @@ "city.hyderabad": "हैदराबाद", "city.kolkata": "कोलकाता", "city.pune": "पुणे", - "triage.injured_q": "कोई घायल हो गया है?", - "triage.yes_injured": "हां, घायल हो गए", - "triage.no_injured": "कोई चोट नहीं", - "triage.blocking_q": "क्या गाड़ी सड़क बंद कर रही है?", - "triage.yes_blocking": "हां, ब्लॉक करना", - "triage.no_blocking": "सड़क साफ ऐ", - "triage.summary_idle": "प्राथमिकता दी सिफारिश हासल करने लेई दौनें सवालें दे जवाब देओ।", - "triage.summary_injured": "चोट दी सूचना — एम्बुलेंस (108) गी पैह्ले प्राथमिकता दित्ती जाग।", - "triage.summary_blocked": "सड़क बंद — पुलिस (100) ते टॉविंग ने सिफारिश कीती।", - "triage.summary_clear": "कोई चोट नेईं, सड़क साफ — मरम्मत जां टोइंग सेवाएं दा सुझाऽ दित्ता गेआ।", - "triage.label": "जल्दी ट्रायज करना", + "triage.injured_q": "के कोई घायल ऐ?", + "triage.yes_injured": "हां, घायल न", + "triage.no_injured": "कोई चोट नेईं", + "triage.blocking_q": "के गड्डी रस्ता रोकी दी ऐ?", + "triage.yes_blocking": "हां, रस्ता रोके दा ऐ", + "triage.no_blocking": "रस्ता साफ ऐ", + "triage.summary_idle": "प्राथमिकता दी सिफारिश लेई दोनें सवालें दे जवाब देओ।", + "triage.summary_injured": "चोट दी सूचना — एम्बुलेंस (१०८) गी पैह्ले प्राथमिकता दित्ती जाग।", + "triage.summary_blocked": "सड़क बंद — पुलिस (१००) ते टोइंग दी सिफारिश कीती ऐ।", + "triage.summary_clear": "कोई चोट नेईं, सड़क साफ — मरम्मत जां टोइंग सेवाएं दी सिफारिश कीती ऐ।", + "triage.label": "जल्दी ट्राइएज", "triage.title": "केह् होआ?", - "triage.subtitle": "दो सवाल — अस तुंदी स्थिति आस्तै सच्ची मदद गी प्राथमिकता देगे।", - "triage.sos_btn": "एस ओ एस", - "triage.prioritising": "⏳ प्राथमिकता देना...", - "triage.get_help": "प्राथमिकता दी मदद पाओ", - "triage.answer_both": "दोनों सवालों के जवाब दे", - "triage.skip": "छोड़ो — सारे संपर्क दस्सो", + "triage.subtitle": "दो सवाल — अस तुंदी स्थिति लेई सही मदद गी प्राथमिकता देगे।", + "triage.sos_btn": "SOS", + "triage.prioritising": "⏳ प्राथमिकता देंदा पआ...", + "triage.get_help": "प्राथमिकता आह्ली मदद हासल करो", + "triage.answer_both": "दोनें सवालें दे जवाब देओ", + "triage.skip": "छड्डो — सारे कांटैक्ट दस्सो", "medical_id.medications": "मौजूदा दवाइयां", "medical_id.optional": "वैकल्पिक", - "medical_id.conditions_short": "स्थिति", + "medical_id.conditions_short": "बीमारियां", "medical_id.organ_donor_label": "अंगदाता", "medical_id.yes": "हां", - "medical_id.edit": "संपादन", - "medical_id.empty_hint": "मेडिकल ID अजे सेट नहीं।", + "medical_id.edit": "एडिट करो", + "medical_id.empty_hint": "अजे कोई मेडिकल ID सेट नेईं ऐ। पैरामेडिक्स गी लोड़िंदी जानकारी (ब्लड ग्रुप, एलर्जी, इमरजेंसी कांटैक्ट आदि) जोड़ने लेई एडिट पर टैप करो।", "medical_id.clear_all": "सारा हटाओ", - "medical_id.confirm_clear": "सब मेडिकल ID डेटा हटा देवो?", - "medical_id.contact_n": "आपातकालीन संपर्क {{n}}", - "medical_id.contact1_name": "Contact 1 name", - "medical_id.contact1_phone": "Contact 1 phone", - "medical_id.contact2_name": "Contact 2 name", - "medical_id.contact2_phone": "Contact 2 phone", - "medical_id.contact3_name": "Contact 3 name", - "medical_id.contact3_phone": "Contact 3 phone", - "plan_trip.cache_route": "ऑफलाइन लेई मार्ग कैश", - "plan_trip.close": "बंद", - "plan_trip.done": "पूरा", - "actions.refresh_location": "टिकाणा ताज़ा", - "tooltip.test_crash": "Test crash alert", - "tooltip.manual_location": "Using manually set location", - "tooltip.backend_warming": "Waking the backend up — first request after idle can take 30–55s", - "tooltip.backend_fallback": "Backend did not return live data — showing pre-loaded directory while we retry", - "tooltip.copy_gps": "Copy GPS", - "tooltip.send_immediate_sos": "Send immediate SOS", - "common.close": "Close", - "common.back": "Back", - "sos.sms_emergency": "🚨 आपातकालीन — मिगी मदद दी लोड़ ऐ।", + "medical_id.confirm_clear": "के सारा मेडिकल ID डेटा हटाना ऐ?", + "medical_id.contact_n": "इमरजेंसी कांटैक्ट {{n}}", + "medical_id.contact1_name": "कांटैक्ट १ दा नां", + "medical_id.contact1_phone": "कांटैक्ट १ दा फोन", + "medical_id.contact2_name": "कांटैक्ट २ दा नां", + "medical_id.contact2_phone": "कांटैक्ट २ दा फोन", + "medical_id.contact3_name": "कांटैक्ट ३ दा नां", + "medical_id.contact3_phone": "कांटैक्ट ३ दा फोन", + "plan_trip.cache_route": "ऑफलाइन लेई रूट कैश करो", + "plan_trip.close": "बंद करो", + "plan_trip.done": "पूरा होआ", + "actions.refresh_location": "लोकेशन ताज़ा करो", + "tooltip.test_crash": "टेस्ट क्रैश अलर्ट", + "tooltip.manual_location": "मैनुअल रूप कन्नै सेट लोकेशन दा इस्तेमाल करदा पआ", + "tooltip.backend_warming": "सर्वर जगांदा पआ — खाली रौह्ने दे बाद पैह्ली रिक्वेस्ट च ३०–५५ सेकंड लग्गी सकदे न", + "tooltip.backend_fallback": "सर्वर ने लाइव डेटा नेईं दित्ता — जदु तगर अस फिरी कोशश करदे आं, प्री-लोड कीती दी डायरेक्टरी दस्सदा पआ ऐ", + "tooltip.copy_gps": "GPS कॉपी करो", + "tooltip.send_immediate_sos": "तुरंत SOS भेजो", + "common.close": "बंद करो", + "common.back": "पिच्छें", + "sos.sms_emergency": "🚨 इमरजेंसी — मिगी मदद दी लोड़ ऐ।", "sos.sms_name": "नां", - "sos.sms_blood": "लहू", - "sos.sms_allergies": "एलर्जी होंदी ऐ", - "sos.sms_conditions": "हालात", + "sos.sms_blood": "ब्लड ग्रुप", + "sos.sms_allergies": "एलर्जी", + "sos.sms_conditions": "बीमारियां", "sos.sms_plus_code": "प्लस कोड", "sos.sms_near": "नेड़ै", - "sos.sms_coords": "कोर्ड्स ने दी", - "sos.sms_footer": "रोडएसओएस द्वारा स्वचालित रूप कन्नै भेजेआ गेआ।", - "dispatch.accident": "Road accident at {{place}}.", - "dispatch.injured_blocking": "Injured persons on scene. Vehicle is blocking traffic.", - "dispatch.injured_clear": "Injured persons on scene. Vehicle is not blocking traffic.", - "dispatch.no_injury_blocking": "No injuries reported. Vehicle is blocking traffic.", - "dispatch.minor": "Minor incident. No injuries reported.", - "dispatch.send_services": "Please send emergency services immediately.", - "dispatch.plus_code": "Location plus code", - "dispatch.gps_coords": "GPS coordinates", - "dispatch.status_dispatched": "एसओएस डिस्पैच कीता", - "dispatch.status_shared": "स्थान साझा कीता गेदा ऐ", - "dispatch.help_on_way": "मदद रास्ते च ऐ।", - "dispatch.circle_notified": "तुहाडे सर्कल गी सूचित कीता गेदा ऐ।", - "dispatch.eta_kicker": "एम्बुलेंस एटा", + "sos.sms_coords": "कोऑर्डिनेट्स", + "sos.sms_footer": "RoadSOS द्वारा अपने आप भेजेआ गेआ।", + "dispatch.accident": "{{place}} च सड़क हादसा।", + "dispatch.injured_blocking": "मौके पर घायल लोक न। गड्डी ने ट्रैफिक रोकी दा ऐ।", + "dispatch.injured_clear": "मौके पर घायल लोक न। गड्डी ने ट्रैफिक नेईं रोकी दा ऐ।", + "dispatch.no_injury_blocking": "कोई घायल नेईं ऐ। गड्डी ने ट्रैफिक रोकी दा ऐ।", + "dispatch.minor": "छोटा हादसा ऐ। कोई घायल नेईं ऐ।", + "dispatch.send_services": "तुरंत इमरजेंसी सेवाएं गी भेजो।", + "dispatch.plus_code": "लोकेशन दा प्लस कोड", + "dispatch.gps_coords": "GPS कोऑर्डिनेट्स", + "dispatch.status_dispatched": "SOS भेज दित्ता", + "dispatch.status_shared": "लोकेशन शेयर कीती गेई", + "dispatch.help_on_way": "मदद रस्ते च ऐ।", + "dispatch.circle_notified": "तुंदे सर्कल गी सूचित करी दित्ता ऐ।", + "dispatch.eta_kicker": "एम्बुलेंस पुज्जने दा समां", "dispatch.eta_unit": "मिंट", - "dispatch.what_we_sent": "जो असी भेजेया", - "dispatch.live_updating": "LIVE · अपडेट करना", - "dispatch.location": "थाहर", - "dispatch.speed": "SPEED AT IMPACT दा", - "dispatch.triage": "TRIAGE दा", + "dispatch.what_we_sent": "अस केह् भेजेआ", + "dispatch.live_updating": "लाइव · अपडेट करदा पआ", + "dispatch.location": "लोकेशन", + "dispatch.speed": "टक्कर दे समें गति", + "dispatch.triage": "ट्राइएज", "dispatch.battery": "बैटरी", - "dispatch.captured": "कैप्चर हो गया", - "dispatch.who_alerted": "किस गी अलर्ट कीता गेदा ऐ", - "dispatch.your_circle": "तेरा चक्कर", - "dispatch.role_emergency": "अमरजैंसी", - "dispatch.role_hospital": "अस्पताल", - "dispatch.status_received": "हासल", + "dispatch.captured": "कैप्चर कीता गेआ", + "dispatch.who_alerted": "कुसगी अलर्ट कीता गेआ", + "dispatch.your_circle": "तुंदा सर्कल", + "dispatch.role_emergency": "इमरजेंसी", + "dispatch.role_hospital": "हस्पताल", + "dispatch.status_received": "हासल होआ", "dispatch.status_alerted": "अलर्ट कीता गेआ", - "dispatch.time_instant": "फौरी", - "dispatch.time_just_now": "अभी-अभी", - "dispatch.close": "बंद", - "scene.photo_label": "Accident scene photo", - "scene.photo_hint": "Captured automatically at time of SOS", - "scene.capturing": "Capturing scene…", - "scene.no_camera": "Scene photo unavailable", - "tutorial.skip": "Skip", - "tutorial.next": "Next", - "tutorial.yes": "YES", - "tutorial.no": "NO", - "tutorial.step1": "Do you want a tutorial of the app", - "tutorial.step2": "This is the top bar it consist of all functional buttons", - "tutorial.step3": "Here you can check for the status of internet connection whether it is online, offline or connecting", - "tutorial.step4": "This is the side menu which contains features name, information and demo to our test crash", - "tutorial.step5": "This contains information on all available features and switches of our app", - "tutorial.step6": "Would you like to see how the demo crash test works with the help of a video", + "dispatch.time_instant": "तुरंत", + "dispatch.time_just_now": "हुनै", + "dispatch.close": "बंद करो", + "scene.photo_label": "हादसे दी जगह दी फोटो", + "scene.photo_hint": "SOS दे समें अपने आप कैप्चर कीती गेई", + "scene.capturing": "जगह कैप्चर करदा पआ...", + "scene.no_camera": "जगह दी फोटो उपलब्ध नेईं", + "tutorial.skip": "छड्डो", + "tutorial.next": "अगला", + "tutorial.yes": "हां", + "tutorial.no": "नेईं", + "tutorial.step1": "के तुस एप दा ट्यूटोरियल चांह्दे ओ?", + "tutorial.step2": "एह् उप्परली बार ऐ, इस च सारे कम्म आह्ले बटन न", + "tutorial.step3": "इत्थै तुस इंटरनेट कनेक्शन दी स्थिति चेक करी सकदे ओ जे एह् ऑनलाइन ऐ, ऑफलाइन ऐ जां कनेक्ट करदा पआ ऐ", + "tutorial.step4": "एह् साइड मेनू ऐ जिस च फीचर दा ناं, जानकारी ते साढ़ै टेस्ट क्रैश दा डेमो ऐ", + "tutorial.step5": "इस च साढ़ी एप दे सारे उपलब्ध फीचरें ते स्विचें दी जानकारी ऐ", + "tutorial.step6": "के तुस वीडियो दी मदद कन्नै दिक्खना चांह्दे ओ जे डेमो क्रैश टेस्ट कियां कम्म करदा ऐ?", "sidebar.menu": "मेनू", "sidebar.medical_card": "तुंदा मेडिकल कार्ड", - "sidebar.language": "भाशा", - "sidebar.plan_trip": "ऑफलाइन यात्रा दी योजना बनाओ", + "sidebar.language": "भाषा", + "sidebar.plan_trip": "ऑफलाइन सफरै दी योजना बनाओ", "sidebar.manual_location": "मैनुअल लोकेशन", "sidebar.toggle_theme": "डार्क / लाइट मोड", - "sidebar.recenter": "हाल ही में मेरा लोकेशन", + "sidebar.recenter": "मेरी लोकेशन सेंटर च लाओ", "sidebar.tutorial": "ट्यूटोरियल", - "sidebar.shortcut_info": "इनें बटनें दा शॉर्टकट मुक्ख स्क्रीन पर इसदे अनुरूप चिह् नें कन्नै दित्ता गेदा ऐ जिऱयां इत्थै दित्ते गेदे न — फीचर 1 थमां 5 उप्परली बार पर ते 6 तुंदी स्क्रीन दे सज्जे पास्से मौजूद न।", - "sidebar.crash_test_info": "साढ़े क्रैश टेस्ट डेमो गी चेक करने लेई तुस इस लिंक दे राहें जाई सकदे ओ:", - "sidebar.open_crash_test": "ओपन क्रैश टेस्ट डेमो", - "dispatcher.call_dispatcher": "इक डिस्पैचर गी फोन करो", - "dispatcher.in_control": "तुसीं कंट्रोल च हो", + "sidebar.shortcut_info": "इनें बटनें दा शॉर्टकट मुक्ख स्क्रीन पर इसदे अनुरूप चिह् नें कन्नै दित्ता गेदा ऐ — फीचर १ थमां ५ उप्परली बार पर ते ६ तुंदी स्क्रीन दे सज्जे पास्से न।", + "sidebar.crash_test_info": "साढ़े क्रैश टेस्ट डेमो गी चेक करने लेई तुस इस लिंक पर जाई सकदे ओ:", + "sidebar.open_crash_test": "क्रैश टेस्ट डेमो खोलो", + "dispatcher.call_dispatcher": "डिस्पैचर गी कॉल करो", + "dispatcher.in_control": "कंट्रोल तुंदे हत्थ च ऐ", "dispatcher.explain_location": "स्थिति दस्सो ते अपनी लोकेशन शेयर करो।", - "dispatcher.loc_approx": "स्थान अनुमानित ऐ", - "dispatcher.acquiring_gps": "जीपीएस हासिल करदे होई...", - "dispatcher.select_service": "कोई सेवा चुनें", + "dispatcher.loc_approx": "लोकेशन अनुमानित ऐ", + "dispatcher.acquiring_gps": "GPS हासिल करदा पआ...", + "dispatcher.select_service": "कोई सेवा चुनो", "dispatcher.ambulance": "एम्बुलेंस", "dispatcher.police": "पुलिस", - "dispatcher.general": "जनरल ने दी", + "dispatcher.general": "सामान्य", "dispatcher.plus_code": "प्लस कोड", - "dispatcher.close_go_back": "बंद करो — संपर्कें पर वापस जाओ", - "crash_alert.call_dispatcher": "Call a Dispatcher", - "crash_alert.you_re_in_control": "You're in Control", - "crash_alert.explain_situation": "Explain the situation and share your location.", - "crash_alert.location_approximate": "Location approximate", - "crash_alert.acquiring_gps": "Acquiring GPS...", - "crash_alert.select_service": "Select a service", - "crash_alert.ambulance": "Ambulance", - "crash_alert.police": "Police", - "crash_alert.general": "General", - "crash_alert.plus_code_label": "Plus Code", - "crash_choosing.crash_detected": "CRASH DETECTED", - "crash_choosing.do_not_panic": "DO NOT PANIC", - "crash_choosing.seconds_until": "seconds until auto-SOS", - "crash_choosing.deceleration": "Sudden deceleration at {{speed}} km/h.", - "crash_choosing.emergency_contacts": "emergency contacts", - "crash_choosing.no_contacts": "no contacts set", - "crash_choosing.will_be_alerted": "will be alerted.", - "crash_choosing.automatic": "Automatic", - "crash_choosing.auto_desc": "Calls + notifies contacts", - "crash_choosing.manual": "Manual", - "crash_choosing.manual_desc": "I'll call — contacts notified", - "crash_choosing.im_ok_cancel": "I'M OK — CANCEL", - "crash_choosing.false_alarm": "False alarm? Enter PIN to silence:", - "crash_choosing.stop_alarm": "Stop alarm", - "crash_choosing.incorrect_pin": "Incorrect PIN", - "crash_choosing.send_sos_now": "Send SOS now" + "dispatcher.close_go_back": "बंद करो — कांटैक्ट पर वापस जाओ", + "crash_alert.call_dispatcher": "डिस्पैचर गी कॉल करो", + "crash_alert.you_re_in_control": "कंट्रोल तुंदे हत्थ च ऐ", + "crash_alert.explain_situation": "स्थिति दस्सो ते अपनी लोकेशन शेयर करो।", + "crash_alert.location_approximate": "लोकेशन अनुमानित ऐ", + "crash_alert.acquiring_gps": "GPS हासिल करदा पआ...", + "crash_alert.select_service": "कोई सेवा चुनो", + "crash_alert.ambulance": "एम्बुलेंस", + "crash_alert.police": "पुलिस", + "crash_alert.general": "सामान्य", + "crash_alert.plus_code_label": "प्लस कोड", + "crash_choosing.crash_detected": "हादसा पता लग्गा", + "crash_choosing.do_not_panic": "घबराओ नेईं", + "crash_choosing.seconds_until": "ऑटो-SOS च बाकी सेकंड", + "crash_choosing.deceleration": "{{speed}} किमी/घंटा दी रफ्तार कन्नै अचानक गड्डी रुकी।", + "crash_choosing.emergency_contacts": "इमरजेंसी कांटैक्ट", + "crash_choosing.no_contacts": "कोई कांटैक्ट सेट नेईं ऐ", + "crash_choosing.will_be_alerted": "अलर्ट कीते जांगन।", + "crash_choosing.automatic": "ऑटोमैटिक", + "crash_choosing.auto_desc": "कॉल करदा ऐ + कांटैक्ट गी दस्सदा ऐ", + "crash_choosing.manual": "मैनुअल", + "crash_choosing.manual_desc": "मैं कॉल करग — कांटैक्ट गी दस्सेआ जाग", + "crash_choosing.im_ok_cancel": "मैं ठीक हां — रद्द करो", + "crash_choosing.false_alarm": "गलत अलार्म? बंद करने लेई PIN दर्ज करो:", + "crash_choosing.stop_alarm": "अलार्म रोको", + "crash_choosing.incorrect_pin": "गलत PIN", + "crash_choosing.send_sos_now": "हुनै SOS भेजो" } diff --git a/frontend/src/i18n/el.json b/frontend/src/i18n/el.json index f9e3f82..486dcaf 100644 --- a/frontend/src/i18n/el.json +++ b/frontend/src/i18n/el.json @@ -1,48 +1,48 @@ { "app.brand": "RoadSOS", - "lang.title": "Επιλέξτε γλώσσα", + "lang.title": "Επιλέξτε τη γλώσσα σας", "lang.subtitle": "Επιλέξτε τη γλώσσα που καταλαβαίνετε καλύτερα. Μπορείτε να την αλλάξετε αργότερα.", "lang.continue": "Συνέχεια", "location.finding": "Εύρεση τοποθεσίας...", "location.waiting": "Αναμονή σήματος...", - "location.cached": "αποθηκευμένο", - "status.online": "ΣΥΝΔΕΔΕΜΕΝΟΣ", + "location.cached": "Αποθηκευμένη", + "status.online": "ΣΕ ΣΥΝΔΕΣΗ", "status.offline": "ΕΚΤΟΣ ΣΥΝΔΕΣΗΣ", - "status.connecting": "Σύνδεση…", + "status.connecting": "Ενεργοποίηση διακομιστή…", "sos.send": "SOS — Αποστολή τοποθεσίας", "sos.waiting": "SOS — Αναμονή GPS", "sos.sent": "Η τοποθεσία στάλθηκε", - "sos.no_contact_warning": "Δεν υπάρχει επαφή έκτακτης ανάγκης — προσθέστε στο Medical ID", + "sos.no_contact_warning": "Καμία επαφή έκτακτης ανάγκης — προσθέστε μία στην Ιατρική ταυτότητα για άμεσο SOS", "sos.copy_coords": "Αντιγραφή συντεταγμένων GPS", "sos.copied": "Αντιγράφηκε", "sos.to_contacts": "SOS → {{name}}", "emergency.ambulance": "Ασθενοφόρο", "emergency.police": "Αστυνομία", "emergency.fire": "Πυροσβεστική", - "emergency.disaster": "Καταστροφή", - "actions.plan_trip": "Σχεδιασμός ταξιδιού", + "emergency.disaster": "Καταστροφές", + "actions.plan_trip": "Σχεδιασμός διαδρομής", "actions.medical_id": "Ιατρική ταυτότητα", - "actions.medical_id_unset": "Ρυθμίστε το Medical ID — απαιτείται για άμεσο SOS", - "actions.test_crash": "Δοκιμή ατυχήματος", - "dock.nearest": "Πλησιέστερα {{count}} · Πατήστε για κλήση", + "actions.medical_id_unset": "Ρύθμιση Ιατρικής ταυτότητας — απαιτείται για άμεσο SOS", + "actions.test_crash": "Δοκιμή σύγκρουσης", + "dock.nearest": "Τα {{count}} πλησιέστερα · Πατήστε για κλήση", "dock.see_all": "Προβολή όλων", "category.hospital": "Νοσοκομείο", "category.police": "Αστυνομία", "category.ambulance": "Ασθενοφόρο", "category.fire": "Πυροσβεστική", - "category.towing": "Ρυμούλκηση", + "category.towing": "Οδική βοήθεια", "category.repair": "Συνεργείο", - "category.puncture": "Επισκευή ελαστικών", - "category.showroom": "Έκθεση", - "crash.detected": "Εντοπίστηκε ατύχημα", - "crash.choose_mode": "Πώς να στείλω SOS;", + "category.puncture": "Βουλκανιζατέρ", + "category.showroom": "Αντιπροσωπεία", + "crash.detected": "Εντοπίστηκε σύγκρουση", + "crash.choose_mode": "Πώς να σταλεί το SOS;", "crash.auto": "Αυτόματη αποστολή", "crash.manual": "Χειροκίνητα", - "crash.cancel": "Ακύρωση — ψευδής συναγερμός", - "crash.pin_prompt": "Εισάγετε PIN για ακύρωση", - "crash.countdown": "Αποστολή σε {{n}}δ", + "crash.cancel": "Ακύρωση — λάθος συναγερμός", + "crash.pin_prompt": "Εισαγάγετε PIN για ακύρωση", + "crash.countdown": "Αποστολή σε {{n}} δευτ.", "medical_id.title": "Ιατρική ταυτότητα", - "medical_id.name": "Πλήρες όνομα", + "medical_id.name": "Ονοματεπώνυμο", "medical_id.blood_type": "Ομάδα αίματος", "medical_id.allergies": "Αλλεργίες", "medical_id.conditions": "Ιατρικές παθήσεις", @@ -53,90 +53,90 @@ "header.always_offline": "Πάντα εκτός σύνδεσης", "header.nearby_services": "Κοντινές υπηρεσίες", "header.searching": "Αναζήτηση...", - "header.found": "{{n}} βρέθηκαν", - "header.prioritised": "Προτεραιοποιήθηκε", - "header.ai": "Όλα συμπεριλαμβάνονται", - "actions.prioritise": "Προτεραιοποίηση για την κατάστασή μου", - "actions.re_prioritise": "Επανα-προτεραιοποίηση", - "actions.directions": "Οδηγίες", + "header.found": "Βρέθηκαν {{n}}", + "header.prioritised": "Με προτεραιότητα", + "header.ai": "AI", + "actions.prioritise": "Ορισμός προτεραιότητας για την κατάστασή μου", + "actions.re_prioritise": "Επαναπροσδιορισμός προτεραιότητας", + "actions.directions": "Οδηγίες διαδρομής", "actions.no_phone": "Χωρίς τηλέφωνο", "filters.all": "Όλα", - "filters.puncture": "Σκάσιμο", - "loading.finding": "Αναζήτηση βοήθειας...", - "loading.subtitle": "Νοσοκομεία, αστυνομία κ.ά.", + "filters.puncture": "Βουλκανιζατέρ", + "loading.finding": "Αναζήτηση κοντινής βοήθειας...", + "loading.subtitle": "Αναζήτηση για νοσοκομεία, αστυνομία κ.ά.", "loading.error": "Δεν ήταν δυνατή η φόρτωση των επαφών", "list.empty_all": "Δεν βρέθηκαν υπηρεσίες. Καλέστε τον εθνικό αριθμό έκτακτης ανάγκης παραπάνω.", - "list.empty_category": "Καμία υπηρεσία σε αυτή την κατηγορία", - "list.cached_results": "Αποθηκευμένα αποτελέσματα από {{date}}", - "card.open": "Ανοικτό", + "list.empty_category": "Δεν υπάρχουν υπηρεσίες σε αυτήν την κατηγορία", + "list.cached_results": "Εμφάνιση αποθηκευμένων αποτελεσμάτων από {{date}}", + "card.open": "Ανοιχτό", "card.closed": "Κλειστό", "card.unknown_status": "Άγνωστη κατάσταση", - "footer.offline_fallback": "Ο διακομιστής δεν είναι προσβάσιμος — δεδομένα επίδειξης. Οι αριθμοί έκτακτης ανάγκης λειτουργούν πάντα εκτός σύνδεσης.", - "track.share_prompt": "Κοινή χρήση ζωντανής τοποθεσίας με σωστικές ομάδες:", + "footer.offline_fallback": "Δεν ήταν δυνατή η σύνδεση στον διακομιστή — εμφάνιση δεδομένων επίδειξης. Οι αριθμοί έκτακτης ανάγκης λειτουργούν πάντα εκτός σύνδεσης.", + "track.share_prompt": "Μοιραστείτε τη ζωντανή τοποθεσία με τους διασώστες:", "track.copy_link": "Αντιγραφή συνδέσμου", "track.copied": "Αντιγράφηκε!", "track.creating": "Δημιουργία ζωντανού συνδέσμου...", "track.failed": "Ο ζωντανός σύνδεσμος δεν είναι διαθέσιμος εκτός σύνδεσης", - "actions.set_location": "Ρύθμιση τοποθεσίας με μη αυτόματο τρόπο", - "status.manual": "ΕΓΧΕΙΡΙΔΙΟ", + "actions.set_location": "Ορισμός τοποθεσίας χειροκίνητα", + "status.manual": "ΧΕΙΡΟΚΙΝΗΤΑ", "manual_location.title": "Ορισμός τοποθεσίας", "manual_location.choose_method": "Πώς θα θέλατε να ορίσετε την τοποθεσία σας;", - "manual_location.tap_map": "Πατήστε στο χάρτη", + "manual_location.tap_map": "Πατήστε στον χάρτη", "manual_location.search_address": "Αναζήτηση διεύθυνσης", "manual_location.search_placeholder": "Πόλη, διεύθυνση ή συντεταγμένες", - "manual_location.searching": "Ερευνητικός…", + "manual_location.searching": "Αναζήτηση…", "manual_location.no_results": "Δεν βρέθηκαν αποτελέσματα", "manual_location.tap_hint": "Πατήστε οπουδήποτε στον χάρτη για να ορίσετε την τοποθεσία σας", "actions.change_language": "Αλλαγή γλώσσας", "medical_id.badge": "Ιατρική ταυτότητα", - "medical_id.welcome_title": "Ρύθμιση σας", - "medical_id.welcome_subtitle": "Οι παραϊατρικοί μπορούν να έχουν πρόσβαση σε αυτό εάν δεν έχετε τις αισθήσεις σας", + "medical_id.welcome_title": "Ρυθμίστε τη δική σας", + "medical_id.welcome_subtitle": "Οι διασώστες μπορούν να έχουν πρόσβαση εάν χάσετε τις αισθήσεις σας", "medical_id.subtitle": "Διαρκεί περίπου 30 δευτερόλεπτα · Αποθηκεύεται μόνο σε αυτήν τη συσκευή", "medical_id.privacy_title": "Τα δεδομένα σας δεν φεύγουν ποτέ από αυτήν τη συσκευή", - "medical_id.privacy_text": "Αποθηκεύεται μόνο τοπικά. Δεν ανέβηκε ποτέ σε κανένα διακομιστή. Κοινή χρήση με υπηρεσίες έκτακτης ανάγκης μόνο όταν είναι ενεργοποιημένο το SOS.", + "medical_id.privacy_text": "Αποθηκεύονται μόνο τοπικά. Δεν μεταφορτώνονται ποτέ σε διακομιστή. Κοινοποιούνται στις υπηρεσίες έκτακτης ανάγκης μόνο όταν ενεργοποιηθεί το SOS.", "medical_id.profile_completion": "Συμπλήρωση προφίλ", - "medical_id.personal": "Προσωπικός", - "medical_id.name_placeholder": "π.χ. Άρτζουν Σάρμα", + "medical_id.personal": "Προσωπικά", + "medical_id.name_placeholder": "π.χ. Γιώργος Παππάς", "medical_id.age": "Ηλικία (έτη)", "medical_id.months": "Μήνες", - "medical_id.months_hint": "(αν <1 έτος)", + "medical_id.months_hint": "(αν κάτω του 1 έτους)", "medical_id.months_note": "Πεδίο μηνών — απαραίτητο για παιδιά κάτω του 1 έτους", - "medical_id.medical_details": "Ιατρικά Στοιχεία", + "medical_id.medical_details": "Ιατρικές λεπτομέρειες", "medical_id.select_blood_type": "Επιλέξτε ομάδα αίματος", "medical_id.allergies_placeholder": "π.χ. πενικιλίνη, φιστίκια, λατέξ", "medical_id.conditions_placeholder": "π.χ. άσθμα, διαβήτης τύπου 2", "medical_id.medications_placeholder": "π.χ. μετφορμίνη, σαλβουταμόλη", "medical_id.contacts_label": "Επαφές έκτακτης ανάγκης", - "medical_id.contacts_hint": "Τα μηνύματα SOS θα αποστέλλονται σε όλες τις επαφές ταυτόχρονα.", - "medical_id.contact1_label": "Επικοινωνία 1", - "medical_id.contact2_label": "Επικοινωνία 2", - "medical_id.contact3_label": "Επικοινωνία 3", - "medical_id.name_label": "Ονομα", - "medical_id.example_mum": "π.χ. Μαμά, Μπαμπάς, Ραχούλ", + "medical_id.contacts_hint": "Τα μηνύματα SOS θα σταλούν σε όλες τις επαφές ταυτόχρονα.", + "medical_id.contact1_label": "Επαφή 1", + "medical_id.contact2_label": "Επαφή 2", + "medical_id.contact3_label": "Επαφή 3", + "medical_id.name_label": "Όνομα", + "medical_id.example_mum": "π.χ. Μαμά, Μπαμπάς, Γιάννης", "medical_id.leave_blank": "Αφήστε κενό για παράλειψη", "medical_id.phone_label": "Αριθμός τηλεφώνου", - "medical_id.phone_placeholder": "π.χ. 9198765432", - "medical_id.organ_donor_section": "Δωρεά Οργάνων", + "medical_id.phone_placeholder": "π.χ. 6912345678", + "medical_id.organ_donor_section": "Δωρεά οργάνων", "medical_id.organ_donor": "Είμαι δωρητής οργάνων", - "medical_id.organ_donor_sub": "Ορατό στους ανταποκριτές έκτακτης ανάγκης", - "medical_id.saved": "Η ιατρική ταυτότητα αποθηκεύτηκε", - "medical_id.close": "Κοντά", - "medical_id.skip": "Παράβλεψη προς το παρόν — ρυθμίστε αργότερα", - "plan_trip.placeholder": "Πόλη, πόλη ή ορόσημο", - "plan_trip.error_not_found": "Δεν μπορούσα να βρω αυτό το μέρος.", - "plan_trip.use_current": "Χρησιμοποιήστε την τρέχουσα τοποθεσία", + "medical_id.organ_donor_sub": "Ορατό στους διασώστες", + "medical_id.saved": "Η Ιατρική ταυτότητα αποθηκεύτηκε", + "medical_id.close": "Κλείσιμο", + "medical_id.skip": "Παράλειψη προς το παρόν — ρύθμιση αργότερα", + "plan_trip.placeholder": "Πόλη, κωμόπολη ή τοποθεσία", + "plan_trip.error_not_found": "Δεν μπορέσαμε να βρούμε αυτήν την τοποθεσία.", + "plan_trip.use_current": "Χρήση τρέχουσας τοποθεσίας", "plan_trip.offline_mode": "Λειτουργία εκτός σύνδεσης", - "plan_trip.title": "Προγραμματίστε ένα ταξίδι εκτός σύνδεσης", - "plan_trip.subtitle": "Αποθηκεύστε προσωρινά νοσοκομεία και αστυνομία κατά μήκος της διαδρομής σας ενώ είστε συνδεδεμένοι — λειτουργεί σε νεκρές ζώνες κινητής τηλεφωνίας.", + "plan_trip.title": "Σχεδιασμός ταξιδιού εκτός σύνδεσης", + "plan_trip.subtitle": "Αποθηκεύστε νοσοκομεία και αστυνομία στη διαδρομή σας όσο είστε online — λειτουργεί σε περιοχές χωρίς σήμα.", "plan_trip.from": "Από", - "plan_trip.to": "Να", + "plan_trip.to": "Προς", "plan_trip.quick_fill": "Γρήγοροι προορισμοί", "plan_trip.info_idle": "Τα νοσοκομεία, τα αστυνομικά τμήματα και οι υπηρεσίες επισκευής κατά μήκος αυτής της διαδρομής θα αποθηκευτούν για χρήση εκτός σύνδεσης.", - "plan_trip.info_done": "Η διαδρομή αποθηκεύτηκε στην κρυφή μνήμη. Οι επαφές έκτακτης ανάγκης είναι πλέον διαθέσιμες χωρίς internet.", - "plan_trip.info_error": "Δεν ήταν δυνατή η προσωρινή αποθήκευση σημείων. Ελέγξτε τη σύνδεση και δοκιμάστε ξανά.", - "plan_trip.caching": "Προσωρινή αποθήκευση...", - "plan_trip.cached": "Διαδρομή αποθηκευμένη στην κρυφή μνήμη", - "plan_trip.plan_offline": "Σχεδιάστε ταξίδι εκτός σύνδεσης", + "plan_trip.info_done": "Η διαδρομή αποθηκεύτηκε. Οι επαφές έκτακτης ανάγκης είναι διαθέσιμες χωρίς internet.", + "plan_trip.info_error": "Δεν ήταν δυνατή η αποθήκευση των σημείων διαδρομής. Ελέγξτε τη σύνδεση και δοκιμάστε ξανά.", + "plan_trip.caching": "Αποθήκευση...", + "plan_trip.cached": "Η διαδρομή αποθηκεύτηκε", + "plan_trip.plan_offline": "Σχεδιασμός ταξιδιού εκτός σύνδεσης", "plan_trip.cancel": "Ακύρωση — επιστροφή", "city.chennai": "Τσενάι", "city.bengaluru": "Μπενγκαλούρου", @@ -146,21 +146,21 @@ "city.hyderabad": "Χαϊντεραμπάντ", "city.kolkata": "Καλκούτα", "city.pune": "Πούνε", - "triage.injured_q": "Υπάρχει κάποιος τραυματίας;", - "triage.yes_injured": "Ναι, τραυματίας", + "triage.injured_q": "Είναι κάποιος τραυματισμένος;", + "triage.yes_injured": "Ναι, υπάρχει τραυματισμός", "triage.no_injured": "Κανένας τραυματισμός", - "triage.blocking_q": "Το όχημα εμποδίζει το δρόμο;", - "triage.yes_blocking": "Ναι, μπλοκάρισμα", - "triage.no_blocking": "Ο δρόμος είναι καθαρός", + "triage.blocking_q": "Το όχημα κλείνει τον δρόμο;", + "triage.yes_blocking": "Ναι, κλείνει τον δρόμο", + "triage.no_blocking": "Ο δρόμος είναι ανοιχτός", "triage.summary_idle": "Απαντήστε και στις δύο ερωτήσεις για να λάβετε μια σύσταση προτεραιότητας.", - "triage.summary_injured": "Αναφέρθηκε τραυματισμός — Πρώτα θα δοθεί προτεραιότητα στο ασθενοφόρο (108).", - "triage.summary_blocked": "Αποκλεισμένος δρόμος — Συνιστάται η αστυνομία (100) και η ρυμούλκηση.", - "triage.summary_clear": "Κανένας τραυματισμός, ελεύθερος δρόμος — Προτείνονται υπηρεσίες επισκευής ή ρυμούλκησης.", + "triage.summary_injured": "Αναφορά τραυματισμού — Δίνεται προτεραιότητα σε ασθενοφόρο (108).", + "triage.summary_blocked": "Ο δρόμος εμποδίζεται — Συνιστάται Αστυνομία (100) και Οδική βοήθεια.", + "triage.summary_clear": "Κανένας τραυματισμός, ελεύθερος δρόμος — Προτείνονται υπηρεσίες επισκευής ή οδικής βοήθειας.", "triage.label": "Γρήγορη διαλογή", "triage.title": "Τι συνέβη;", "triage.subtitle": "Δύο ερωτήσεις — θα δώσουμε προτεραιότητα στη σωστή βοήθεια για την περίπτωσή σας.", - "triage.sos_btn": "σύνθημα κινδύνου", - "triage.prioritising": "⏳ Δίνοντας προτεραιότητα...", + "triage.sos_btn": "SOS", + "triage.prioritising": "⏳ Ορισμός προτεραιότητας...", "triage.get_help": "Λάβετε βοήθεια με προτεραιότητα", "triage.answer_both": "Απαντήστε και στις δύο ερωτήσεις", "triage.skip": "Παράλειψη — εμφάνιση όλων των επαφών", @@ -170,7 +170,7 @@ "medical_id.organ_donor_label": "Δωρητής οργάνων", "medical_id.yes": "Ναι", "medical_id.edit": "Επεξεργασία", - "medical_id.empty_hint": "Δεν έχει οριστεί Ιατρική ταυτότητα. Πατήστε Επεξεργασία.", + "medical_id.empty_hint": "Δεν έχει οριστεί Ιατρική Ταυτότητα. Πατήστε 'Επεξεργασία' για να προσθέσετε τις πληροφορίες που χρειάζονται οι διασώστες (ομάδα αίματος, αλλεργίες, επαφές έκτακτης ανάγκης, κ.λπ.).", "medical_id.clear_all": "Διαγραφή όλων", "medical_id.confirm_clear": "Διαγραφή όλων των δεδομένων Ιατρικής ταυτότητας;", "medical_id.contact_n": "Επαφή έκτακτης ανάγκης {{n}}", @@ -180,13 +180,13 @@ "medical_id.contact2_phone": "Τηλέφωνο επαφής 2", "medical_id.contact3_name": "Όνομα επαφής 3", "medical_id.contact3_phone": "Τηλέφωνο επαφής 3", - "plan_trip.cache_route": "Αποθήκευση διαδρομής offline", + "plan_trip.cache_route": "Αποθήκευση διαδρομής για χρήση εκτός σύνδεσης", "plan_trip.close": "Κλείσιμο", "plan_trip.done": "Έγινε", "actions.refresh_location": "Ανανέωση τοποθεσίας", - "tooltip.test_crash": "Δοκιμή ειδοποίησης ατυχήματος", + "tooltip.test_crash": "Ειδοποίηση δοκιμής σύγκρουσης", "tooltip.manual_location": "Χρήση χειροκίνητα ορισμένης τοποθεσίας", - "tooltip.backend_warming": "Αφύπνιση διακομιστή — το πρώτο αίτημα μετά από αδράνεια μπορεί να διαρκέσει 30–55 δευτ.", + "tooltip.backend_warming": "Ενεργοποίηση διακομιστή — το πρώτο αίτημα μετά από αδράνεια μπορεί να πάρει 30–55 δευτ.", "tooltip.backend_fallback": "Ο διακομιστής δεν επέστρεψε ζωντανά δεδομένα — εμφάνιση προφορτωμένου καταλόγου κατά την επανάληψη", "tooltip.copy_gps": "Αντιγραφή GPS", "tooltip.send_immediate_sos": "Αποστολή άμεσου SOS", @@ -197,7 +197,7 @@ "sos.sms_blood": "Αίμα", "sos.sms_allergies": "Αλλεργίες", "sos.sms_conditions": "Παθήσεις", - "sos.sms_plus_code": "Κωδικός Plus", + "sos.sms_plus_code": "Plus Code", "sos.sms_near": "Κοντά", "sos.sms_coords": "Συντεταγμένες", "sos.sms_footer": "Εστάλη αυτόματα από το RoadSOS.", @@ -206,90 +206,90 @@ "dispatch.injured_clear": "Τραυματίες στο σημείο. Το όχημα δεν εμποδίζει την κυκλοφορία.", "dispatch.no_injury_blocking": "Δεν αναφέρθηκαν τραυματισμοί. Το όχημα εμποδίζει την κυκλοφορία.", "dispatch.minor": "Μικρό περιστατικό. Δεν αναφέρθηκαν τραυματισμοί.", - "dispatch.send_services": "Παρακαλώ στείλτε υπηρεσίες έκτακτης ανάγκης αμέσως.", + "dispatch.send_services": "Παρακαλώ στείλτε άμεσα υπηρεσίες έκτακτης ανάγκης.", "dispatch.plus_code": "Plus code τοποθεσίας", "dispatch.gps_coords": "Συντεταγμένες GPS", - "dispatch.status_dispatched": "SOS ΑΠΟΣΤΟΛΗ", - "dispatch.status_shared": "ΚΟΙΝΟΧΡΗΣΗ ΤΟΠΟΘΕΣΙΑΣ", + "dispatch.status_dispatched": "ΤΟ SOS ΕΣΤΑΛΗ", + "dispatch.status_shared": "Η ΤΟΠΟΘΕΣΙΑ ΚΟΙΝΟΠΟΙΗΘΗΚΕ", "dispatch.help_on_way": "Η βοήθεια είναι καθ' οδόν.", "dispatch.circle_notified": "Ο κύκλος σας έχει ειδοποιηθεί.", - "dispatch.eta_kicker": "Ασθενοφόρο ΕΤΑ", - "dispatch.eta_unit": "ελάχ", - "dispatch.what_we_sent": "Αυτό που στείλαμε", - "dispatch.live_updating": "LIVE · ΕΝΗΜΕΡΩΣΗ", + "dispatch.eta_kicker": "ΕΚΤΙΜΩΜΕΝΟΣ ΧΡΟΝΟΣ ΑΦΙΞΗΣ ΑΣΘΕΝΟΦΟΡΟΥ", + "dispatch.eta_unit": "λεπ.", + "dispatch.what_we_sent": "Τι στείλαμε", + "dispatch.live_updating": "ΖΩΝΤΑΝΑ · ΕΝΗΜΕΡΩΝΕΤΑΙ", "dispatch.location": "ΤΟΠΟΘΕΣΙΑ", - "dispatch.speed": "ΤΑΧΥΤΗΤΑ ΣΤΗΝ ΚΡΟΥΣΗ", - "dispatch.triage": "TRIAGE", + "dispatch.speed": "ΤΑΧΥΤΗΤΑ ΚΑΤΑ ΤΗ ΣΥΓΚΡΟΥΣΗ", + "dispatch.triage": "ΔΙΑΛΟΓΗ", "dispatch.battery": "ΜΠΑΤΑΡΙΑ", - "dispatch.captured": "ΣΥΛΛΗΦΘΗΚΕ", - "dispatch.who_alerted": "ΠΟΙΟΣ ΕΧΕΙ ΕΙΔΟΠΟΙΗΘΕΙ", + "dispatch.captured": "ΚΑΤΑΓΡΑΦΗΚΕ", + "dispatch.who_alerted": "ΠΟΙΟΙ ΕΙΔΟΠΟΙΗΘΗΚΑΝ", "dispatch.your_circle": "Ο κύκλος σας", - "dispatch.role_emergency": "Επείγον", + "dispatch.role_emergency": "Έκτακτη ανάγκη", "dispatch.role_hospital": "Νοσοκομείο", - "dispatch.status_received": "ΛΗΨΗ", - "dispatch.status_alerted": "ΕΙΔΟΠΟΙΗΣΗ", - "dispatch.time_instant": "στιγμή", + "dispatch.status_received": "ΕΛΗΦΘΗ", + "dispatch.status_alerted": "ΕΙΔΟΠΟΙΗΘΗΚΕ", + "dispatch.time_instant": "άμεσα", "dispatch.time_just_now": "μόλις τώρα", - "dispatch.close": "Κοντά", + "dispatch.close": "Κλείσιμο", "scene.photo_label": "Φωτογραφία σημείου ατυχήματος", "scene.photo_hint": "Λήφθηκε αυτόματα κατά τη στιγμή του SOS", - "scene.capturing": "Λήψη σκηνής…", - "scene.no_camera": "Η φωτογραφία σκηνής δεν είναι διαθέσιμη", + "scene.capturing": "Λήψη σκηνής...", + "scene.no_camera": "Η φωτογραφία της σκηνής δεν είναι διαθέσιμη", "tutorial.skip": "Παράλειψη", "tutorial.next": "Επόμενο", "tutorial.yes": "ΝΑΙ", "tutorial.no": "ΟΧΙ", - "tutorial.step1": "Θέλετε ένα σεμινάριο χρήσης της εφαρμογής;", - "tutorial.step2": "Αυτή είναι η επάνω γραμμή που περιέχει όλα τα λειτουργικά κουμπιά", - "tutorial.step3": "Εδώ μπορείτε να ελέγξετε την κατάσταση σύνδεσης στο διαδίκτυο — συνδεδεμένος, εκτός σύνδεσης ή σε σύνδεση", - "tutorial.step4": "Αυτό είναι το πλευρικό μενού που περιέχει ονόματα λειτουργιών, πληροφορίες και επίδειξη δοκιμής σύγκρουσης", - "tutorial.step5": "Αυτό περιέχει πληροφορίες για όλες τις διαθέσιμες λειτουργίες και διακόπτες της εφαρμογής μας", - "tutorial.step6": "Θα θέλατε να δείτε πώς λειτουργεί η επίδειξη δοκιμής σύγκρουσης με τη βοήθεια βίντεο;", + "tutorial.step1": "Θέλετε μια παρουσίαση της εφαρμογής;", + "tutorial.step2": "Αυτή είναι η επάνω μπάρα, η οποία αποτελείται από όλα τα λειτουργικά κουμπιά.", + "tutorial.step3": "Εδώ μπορείτε να ελέγξετε την κατάσταση της σύνδεσης στο διαδίκτυο, εάν είναι online, offline ή αν γίνεται σύνδεση.", + "tutorial.step4": "Αυτό είναι το πλευρικό μενού που περιέχει ονόματα λειτουργιών, πληροφορίες και μια επίδειξη της δοκιμής σύγκρουσης.", + "tutorial.step5": "Αυτό περιέχει πληροφορίες για όλες τις διαθέσιμες λειτουργίες και τους διακόπτες της εφαρμογής μας.", + "tutorial.step6": "Θα θέλατε να δείτε πώς λειτουργεί η επίδειξη δοκιμής σύγκρουσης με τη βοήθεια ενός βίντεο;", "sidebar.menu": "Μενού", "sidebar.medical_card": "Η ιατρική σας κάρτα", "sidebar.language": "Γλώσσα", - "sidebar.plan_trip": "Σχεδιάστε ταξίδι εκτός σύνδεσης", - "sidebar.manual_location": "Εγχειρίδιο Τοποθεσία", - "sidebar.toggle_theme": "Λειτουργία Dark / Light", - "sidebar.recenter": "Προσθήκη στο κέντρο της τοποθεσίας μου", - "sidebar.tutorial": "Φροντιστήριο", - "sidebar.shortcut_info": "Η συντόμευση σε αυτά τα κουμπιά δίνεται στην κύρια οθόνη με τα αντίστοιχα σύμβολα όπως δίνονται εδώ — οι λειτουργίες 1 έως 5 υπάρχουν στην επάνω γραμμή και 6 στη δεξιά πλευρά της οθόνης σας.", - "sidebar.crash_test_info": "Για να ελέγξετε την επίδειξη της δοκιμής σύγκρουσης, μπορείτε να μεταβείτε από αυτόν τον σύνδεσμο:", - "sidebar.open_crash_test": "Ανοίξτε το Crash Test Demo", - "dispatcher.call_dispatcher": "Καλέστε έναν αποστολέα", - "dispatcher.in_control": "Είσαι στον έλεγχο", + "sidebar.plan_trip": "Σχεδιασμός ταξιδιού εκτός σύνδεσης", + "sidebar.manual_location": "Χειροκίνητη τοποθεσία", + "sidebar.toggle_theme": "Σκοτεινή / Φωτεινή λειτουργία", + "sidebar.recenter": "Επανακεντράρισμα της τοποθεσίας μου", + "sidebar.tutorial": "Οδηγός χρήσης", + "sidebar.shortcut_info": "Η συντόμευση για αυτά τα κουμπιά δίνεται στην κύρια οθόνη με τα αντίστοιχα σύμβολα όπως δίνονται εδώ — οι λειτουργίες 1 έως 5 υπάρχουν στην επάνω μπάρα και η 6 στη δεξιά πλευρά της οθόνης σας.", + "sidebar.crash_test_info": "Για να δείτε την επίδειξη δοκιμής σύγκρουσης μπορείτε να μεταβείτε σε αυτόν τον σύνδεσμο:", + "sidebar.open_crash_test": "Άνοιγμα επίδειξης δοκιμής σύγκρουσης", + "dispatcher.call_dispatcher": "Κλήση σε Χειριστή", + "dispatcher.in_control": "Έχετε τον έλεγχο", "dispatcher.explain_location": "Εξηγήστε την κατάσταση και μοιραστείτε την τοποθεσία σας.", "dispatcher.loc_approx": "Τοποθεσία κατά προσέγγιση", - "dispatcher.acquiring_gps": "Απόκτηση GPS...", - "dispatcher.select_service": "Επιλέξτε μια υπηρεσία", + "dispatcher.acquiring_gps": "Λήψη GPS...", + "dispatcher.select_service": "Επιλέξτε υπηρεσία", "dispatcher.ambulance": "Ασθενοφόρο", "dispatcher.police": "Αστυνομία", - "dispatcher.general": "Στρατηγός", - "dispatcher.plus_code": "Κωδικός Plus", + "dispatcher.general": "Γενικό", + "dispatcher.plus_code": "Plus Code", "dispatcher.close_go_back": "Κλείσιμο — επιστροφή στις επαφές", - "crash_alert.call_dispatcher": "Κλήση κέντρου αποστολής", - "crash_alert.you_re_in_control": "Εσείς ελέγχετε", + "crash_alert.call_dispatcher": "Κλήση σε Χειριστή", + "crash_alert.you_re_in_control": "Έχετε τον έλεγχο", "crash_alert.explain_situation": "Εξηγήστε την κατάσταση και μοιραστείτε την τοποθεσία σας.", - "crash_alert.location_approximate": "Κατά προσέγγιση τοποθεσία", + "crash_alert.location_approximate": "Τοποθεσία κατά προσέγγιση", "crash_alert.acquiring_gps": "Λήψη GPS...", "crash_alert.select_service": "Επιλέξτε υπηρεσία", "crash_alert.ambulance": "Ασθενοφόρο", "crash_alert.police": "Αστυνομία", "crash_alert.general": "Γενικό", "crash_alert.plus_code_label": "Plus Code", - "crash_choosing.crash_detected": "ΑΤΥΧΗΜΑ ΕΝΤΟΠΙΣΤΗΚΕ", - "crash_choosing.do_not_panic": "ΜΗΝ ΠΑΝΙΚΟΒΑΛΛΕΣΤΕ", - "crash_choosing.seconds_until": "δευτερόλεπτα μέχρι αυτόματο SOS", + "crash_choosing.crash_detected": "ΕΝΤΟΠΙΣΤΗΚΕ ΣΥΓΚΡΟΥΣΗ", + "crash_choosing.do_not_panic": "ΨΥΧΡΑΙΜΙΑ", + "crash_choosing.seconds_until": "δευτερόλεπτα μέχρι το αυτόματο SOS", "crash_choosing.deceleration": "Απότομη επιβράδυνση στα {{speed}} χλμ/ώρα.", "crash_choosing.emergency_contacts": "επαφές έκτακτης ανάγκης", "crash_choosing.no_contacts": "δεν έχουν οριστεί επαφές", "crash_choosing.will_be_alerted": "θα ειδοποιηθούν.", - "crash_choosing.automatic": "Αυτόματο", + "crash_choosing.automatic": "Αυτόματα", "crash_choosing.auto_desc": "Καλεί + ειδοποιεί τις επαφές", - "crash_choosing.manual": "Χειροκίνητο", - "crash_choosing.manual_desc": "Θα καλέσω εγώ — οι επαφές ειδοποιούνται", + "crash_choosing.manual": "Χειροκίνητα", + "crash_choosing.manual_desc": "Θα καλέσω εγώ — οι επαφές ειδοποιήθηκαν", "crash_choosing.im_ok_cancel": "ΕΙΜΑΙ ΚΑΛΑ — ΑΚΥΡΩΣΗ", - "crash_choosing.false_alarm": "Ψευδής συναγερμός; Εισάγετε PIN για σίγαση:", + "crash_choosing.false_alarm": "Λάθος συναγερμός; Εισαγάγετε PIN για σίγαση:", "crash_choosing.stop_alarm": "Διακοπή συναγερμού", "crash_choosing.incorrect_pin": "Λανθασμένο PIN", "crash_choosing.send_sos_now": "Αποστολή SOS τώρα" From 5389d42cc35d02696bca68f143b65f3c366b0686 Mon Sep 17 00:00:00 2001 From: Arthrevs Date: Fri, 29 May 2026 15:25:58 +0530 Subject: [PATCH 3/4] UI enhancements for Triage, Dispatcher and Contacts --- frontend/src/App.jsx | 2 + frontend/src/components/ContactList.jsx | 48 ++- frontend/src/components/CountryEmergency.jsx | 59 ---- frontend/src/components/DispatchScreen.jsx | 8 +- frontend/src/components/MapHero.jsx | 55 +++- frontend/src/components/RealMap.jsx | 22 +- frontend/src/components/TriageModal.jsx | 246 +++++++------- frontend/src/final-design.css | 18 ++ frontend/src/triage-modal.css | 319 +++++++++++++++++++ frontend/src/utils/medicalId.js | 14 + 10 files changed, 586 insertions(+), 205 deletions(-) create mode 100644 frontend/src/triage-modal.css diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 3eac497..4142015 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -515,6 +515,7 @@ export default function App() { onSubmit={handleTriage} onSkip={() => setTriageOpen(false)} location={activeLocation} + countryCode={countryCode} landmark={searchData?.landmark} topContact={topContact} /> @@ -551,6 +552,7 @@ export default function App() { open={dispatchOpen} onClose={() => { setDispatchOpen(false); setScenePhoto(null); }} location={activeLocation} + countryCode={countryCode} landmark={searchData?.landmark} contacts={searchData?.contacts || []} topContact={topContact} diff --git a/frontend/src/components/ContactList.jsx b/frontend/src/components/ContactList.jsx index 44d705c..dd300e2 100644 --- a/frontend/src/components/ContactList.jsx +++ b/frontend/src/components/ContactList.jsx @@ -1,6 +1,7 @@ -import React, { useMemo } from 'react'; +import React, { useMemo, useState, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import ContactCard from './ContactCard'; +import { ChevronUp } from 'lucide-react'; import { CATS } from '../constants'; // Map filter chip keys to i18n keys. "All" + "Puncture" are filter-only; @@ -30,6 +31,34 @@ export default function ContactList({ contacts, loading, error, cachedAt, cat, s }); }, [contacts, cat]); + const [showTakeUp, setShowTakeUp] = useState(false); + + useEffect(() => { + if (filtered.length <= 15) { + setShowTakeUp(false); + return; + } + + // 25% threshold, e.g., 19 * 0.25 = 4.75 -> 5th card -> index 4 + const thresholdIndex = Math.ceil(filtered.length * 0.25) - 1; + + const handleScroll = () => { + // Find the card element at the threshold index + const cardEl = document.querySelector(`.svc-list > *:nth-child(${thresholdIndex + 1})`); + if (cardEl) { + const rect = cardEl.getBoundingClientRect(); + // Visible if the top of the card has come above the bottom of the viewport + setShowTakeUp(rect.top < window.innerHeight); + } + }; + + window.addEventListener('scroll', handleScroll, { passive: true }); + // Check initially + handleScroll(); + + return () => window.removeEventListener('scroll', handleScroll); + }, [filtered.length]); + // ── Loading state ───────────────────────────────────────────────────────── if (loading) { return ( @@ -96,6 +125,23 @@ export default function ContactList({ contacts, loading, error, cachedAt, cat, s )) )}
+ + {/* Floating Take Up Button */} + {showTakeUp && ( +
{ + const firstCard = document.querySelector('.svc-list > *:first-child'); + if (firstCard) { + firstCard.scrollIntoView({ behavior: 'smooth', block: 'center' }); + } else { + window.scrollTo({ top: 0, behavior: 'smooth' }); + } + }}> +
+ + Take up +
+
+ )} ); } diff --git a/frontend/src/components/CountryEmergency.jsx b/frontend/src/components/CountryEmergency.jsx index 7cab71a..c5dab8f 100644 --- a/frontend/src/components/CountryEmergency.jsx +++ b/frontend/src/components/CountryEmergency.jsx @@ -10,27 +10,7 @@ const EMERGENCY_CONFIG = [ { key: 'general', i18nKey: 'emergency.disaster', short: 'DIS', Icon: Phone, color: '#22C55E' }, ]; -// Rulebook lists six mandatory service categories. The four cards above -// cover police, ambulance and the disaster/general line. These four close -// the gap (hospital, towing, tyre, showroom) by surfacing the nearest -// contact's phone as a one-tap dial when /search returned one. If no -// contact in the category has a phone, the card is skipped (no fake dials). -const NEARBY_CONFIG = [ - { key: 'hospital', i18nKey: 'category.hospital', short: 'HOSP', Icon: Hospital, color: '#DC2626', match: ['hospital'] }, - { key: 'towing', i18nKey: 'category.towing', short: 'TOW', Icon: Truck, color: '#7C3AED', match: ['towing'] }, - { key: 'tyre', i18nKey: 'category.puncture', short: 'TYRE', Icon: Disc, color: '#0284C7', match: ['tyre', 'puncture'] }, - { key: 'showroom', i18nKey: 'category.showroom', short: 'SHOW', Icon: Car, color: '#0F766E', match: ['showroom'] }, -]; -function pickPhoneForCategory(contacts, match) { - if (!Array.isArray(contacts)) return null; - for (const c of contacts) { - if (!c?.phone) continue; - const cat = (c.category || '').toLowerCase(); - if (match.includes(cat)) return c; - } - return null; -} export default function CountryEmergency({ numbers, contacts }) { const { t } = useTranslation(); @@ -39,10 +19,6 @@ export default function CountryEmergency({ numbers, contacts }) { const { police, ambulance, fire, general } = numbers; const vals = { police, ambulance, fire, general }; - const nearbyCards = NEARBY_CONFIG - .map((cfg) => ({ cfg, contact: pickPhoneForCategory(contacts, cfg.match) })) - .filter((row) => row.contact); - return ( <>
@@ -72,41 +48,6 @@ export default function CountryEmergency({ numbers, contacts }) { ); })}
- - {nearbyCards.length > 0 && ( -
- {nearbyCards.map(({ cfg, contact }) => { - const { key, i18nKey, short, Icon, color } = cfg; - const label = t(i18nKey); - const phone = contact.phone; - return ( - guardedTelDial(e, phone, label)} - > -
- -
-
-
{label}
-
- {phone} -
-
-
- ); - })} -
- )} ); } diff --git a/frontend/src/components/DispatchScreen.jsx b/frontend/src/components/DispatchScreen.jsx index 5d08f2b..99c6daa 100644 --- a/frontend/src/components/DispatchScreen.jsx +++ b/frontend/src/components/DispatchScreen.jsx @@ -2,18 +2,22 @@ import React, { useEffect, useState } from 'react'; import { Check, Ambulance, Navigation2 } from 'lucide-react'; import { useTranslation } from 'react-i18next'; import { DEMO_MODE } from '../utils/demoMode'; +import { getEmergencyNumbers } from '../utils/emergencyNumbers'; /** * DispatchScreen — full-screen "Help is on the way" overlay. * Shown after SOS dispatched. Mirrors the FinalDispatch (Glass) design. */ -export default function DispatchScreen({ open, onClose, location, landmark, contacts = [], topContact, dispatchedAt, isCrash = false, triageReason = null, scenePhoto = null }) { +export default function DispatchScreen({ open, onClose, location, landmark, contacts = [], topContact, dispatchedAt, isCrash = false, triageReason = null, scenePhoto = null, countryCode }) { const { t, i18n } = useTranslation(); const isEnglish = i18n.language.startsWith('en'); const [elapsed, setElapsed] = useState(0); const [batteryPct, setBatteryPct] = useState(null); const [batteryCharging, setBatteryCharging] = useState(false); + const numbers = getEmergencyNumbers(countryCode || location?.country_code || 'IN') || { general: '112' }; + const emergencyNum = numbers.general || numbers.police || '112'; + useEffect(() => { if (!open) return; const start = Date.now(); @@ -264,7 +268,7 @@ export default function DispatchScreen({ open, onClose, location, landmark, cont
-
112 Unified
+
{emergencyNum} Unified
{t('dispatch.role_emergency', 'Emergency')}
diff --git a/frontend/src/components/MapHero.jsx b/frontend/src/components/MapHero.jsx index 6d2b966..da14b2c 100644 --- a/frontend/src/components/MapHero.jsx +++ b/frontend/src/components/MapHero.jsx @@ -6,6 +6,7 @@ import SOSButton from './SOSButton'; import ManualLocationModal from './ManualLocationModal'; import { subscribeBackendStatus } from '../utils/backendWarmup'; import { setManualLocation, refreshGpsLocation } from '../hooks/useLocation'; +import { getIsMedicalIdComplete } from '../utils/medicalId'; const CAT_ICONS = { hospital: Hospital, @@ -115,9 +116,55 @@ export default function MapHero({ onTutorialStart, }) { const { t } = useTranslation(); - // Pick up to 6 nearest contacts for markers on real map - const markerContacts = (contacts || []).slice(0, 6); - const dockContacts = (contacts || []).slice(0, 3); + + const dockMatches = [ + ['hospital'], + ['towing'], + ['tyre', 'puncture'], + ['showroom'] + ]; + + const dockContacts = []; + if (contacts && Array.isArray(contacts)) { + for (const match of dockMatches) { + for (const c of contacts) { + if (!c?.phone) continue; + const cat = (c.category || '').toLowerCase(); + if (match.includes(cat)) { + if (!dockContacts.some(existing => existing.id === c.id)) { + dockContacts.push(c); + } + break; + } + } + } + } + + // Map markers: prioritize the 4 specific categories (even if they lack a phone number), + // then fill the remaining spots up to 6 with nearest random contacts + const markerContacts = []; + const addedContacts = new Set(); + + if (contacts && Array.isArray(contacts)) { + for (const match of dockMatches) { + for (const c of contacts) { + const cat = (c.category || '').toLowerCase(); + if (match.includes(cat) && !addedContacts.has(c)) { + markerContacts.push(c); + addedContacts.add(c); + break; + } + } + } + + for (const c of contacts) { + if (markerContacts.length >= 6) break; + if (!addedContacts.has(c)) { + markerContacts.push(c); + addedContacts.add(c); + } + } + } // Backend readiness — drives the warming-up state of the status pill. // 'warming' / 'cold' downgrade the green online indicator to amber so @@ -295,7 +342,7 @@ export default function MapHero({
{onMedicalId && (() => { - const isMedicalIdComplete = medicalIdCompletion >= 63; + const isMedicalIdComplete = getIsMedicalIdComplete(); const hasMedicalId = medicalIdCompletion > 0; return ( +
- - {/* Questions */} -
- {QUESTIONS.map(({ id, textKey, defaultText, Icon, iconColor, yesKey, defaultYes, noKey, defaultNo }) => ( -
-
-
- -
- {t(textKey, defaultText)} + +
+ +
+
+
+
+
-
- - + {t("triage.injured_q", "Is anyone injured?")} +
+
+ + +
+
+ +
+
+
+
+ {t("triage.blocking_q", "Is the vehicle blocking the road?")}
- ))} -
- - {/* Summary bar */} -
-
- {type === "urgent" && } - {type === "clear" && } - {msg} -
- - {/* Actions */} -
- - +
+ + +
+
+ + {result ? ( +
+ + {result.txt} +
+ ) : ( +
+ + {t("triage.summary_idle", "Answer both questions to get a priority recommendation.")} +
+ )} + + +
); diff --git a/frontend/src/final-design.css b/frontend/src/final-design.css index db2b0c5..160d42a 100644 --- a/frontend/src/final-design.css +++ b/frontend/src/final-design.css @@ -5701,6 +5701,24 @@ z-index: 20; } +/* Scroll up arrow */ +.scroll-up-arrow { + position: fixed; + bottom: 24px; + left: 0; + width: 100%; + display: flex; + justify-content: center; + align-items: center; + pointer-events: none; + cursor: pointer; + z-index: 50; + animation: fadeUp 0.3s ease-out forwards; +} +.scroll-up-arrow .scroll-arrow-pill { + pointer-events: auto; +} + .scroll-arrow-pill { height: 32px; padding: 0 16px; diff --git a/frontend/src/triage-modal.css b/frontend/src/triage-modal.css new file mode 100644 index 0000000..1d695f7 --- /dev/null +++ b/frontend/src/triage-modal.css @@ -0,0 +1,319 @@ +/* triage-modal.css */ + +.triage-sheet { + width: 312px; + border-radius: 26px; + overflow: hidden; + display: flex; + flex-direction: column; + margin: 0 auto; +} + +/* Theme overrides */ +.app.theme-dark .triage-sheet { + background: #0c0e16; + border: 1px solid rgba(255, 255, 255, .08); + box-shadow: 0 20px 56px rgba(0, 0, 0, .6); +} + +.app.theme-light .triage-sheet { + background: #ffffff; + border: 1px solid rgba(0, 0, 0, .08); + box-shadow: 0 20px 56px rgba(0, 0, 0, .1); +} + +.triage-handle { + display: flex; + justify-content: center; + padding: 11px 0 0; +} + +.triage-handle-bar { + width: 32px; + height: 4px; + border-radius: 2px; +} + +.app.theme-dark .triage-handle-bar { background: rgba(255, 255, 255, .1); } +.app.theme-light .triage-handle-bar { background: rgba(0, 0, 0, .1); } + +/* HEADER */ +.triage-hd { + display: flex; + align-items: flex-start; + justify-content: space-between; + padding: 16px 20px 16px; +} + +.triage-hd-l { + display: flex; + flex-direction: column; + gap: 3px; +} + +.triage-hd-tag { + display: flex; + align-items: center; + gap: 5px; + font-size: 9.5px; + font-weight: 700; + letter-spacing: .14em; + text-transform: uppercase; + margin-bottom: 2px; +} + +.app.theme-dark .triage-hd-tag { color: rgba(255, 255, 255, .28); } +.app.theme-dark .triage-hd-tag svg { stroke: rgba(255, 255, 255, .28); } +.app.theme-light .triage-hd-tag { color: rgba(0, 0, 0, .3); } +.app.theme-light .triage-hd-tag svg { stroke: rgba(0, 0, 0, .3); } + +.triage-hd-title { + font-size: 22px; + font-weight: 800; + letter-spacing: -.02em; + line-height: 1.1; +} + +.app.theme-dark .triage-hd-title { color: #eef0f8; } +.app.theme-light .triage-hd-title { color: #0d0f16; } + +.triage-hd-sub { + font-size: 12px; + font-weight: 400; + line-height: 1.5; + max-width: 190px; + margin-top: 3px; +} + +.app.theme-dark .triage-hd-sub { color: rgba(255, 255, 255, .35); } +.app.theme-light .triage-hd-sub { color: rgba(0, 0, 0, .42); } + +.triage-sos { + height: 34px; + padding: 0 14px; + border-radius: 9px; + border: none; + font-family: inherit; + font-size: 14px; + font-weight: 800; + color: #ef4444; + cursor: pointer; + outline: none; + letter-spacing: .05em; + flex-shrink: 0; + align-self: flex-start; + margin-top: 2px; + transition: background .1s; +} + +.app.theme-dark .triage-sos { background: rgba(239, 68, 68, .1); border: 1px solid rgba(239, 68, 68, .22); } +.app.theme-light .triage-sos { background: rgba(220, 38, 38, .07); border: 1px solid rgba(220, 38, 38, .2); color: #dc2626; } + +.triage-rule { height: 1px; } +.app.theme-dark .triage-rule { background: rgba(255, 255, 255, .06); } +.app.theme-light .triage-rule { background: rgba(0, 0, 0, .06); } + +/* QUESTIONS */ +.triage-qs { + padding: 14px 20px; + display: flex; + flex-direction: column; + gap: 14px; +} + +.triage-qb { + display: flex; + flex-direction: column; + gap: 8px; +} + +.triage-qrow { + display: flex; + align-items: center; + gap: 8px; +} + +.triage-qico { + width: 28px; + height: 28px; + border-radius: 8px; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; +} + +.app.theme-dark .triage-qico { background: rgba(255, 255, 255, .06); } +.app.theme-light .triage-qico { background: rgba(0, 0, 0, .05); } +.app.theme-dark .triage-qico svg { stroke: rgba(255, 255, 255, .5); } +.app.theme-light .triage-qico svg { stroke: rgba(0, 0, 0, .45); } + +.triage-qtxt { + font-size: 13px; + font-weight: 700; + letter-spacing: -.01em; +} + +.app.theme-dark .triage-qtxt { color: rgba(255, 255, 255, .85); } +.app.theme-light .triage-qtxt { color: #111; } + +/* OPTION BUTTONS */ +.triage-pair { + display: flex; + gap: 7px; +} + +.triage-opt { + flex: 1; + height: 46px; + border-radius: 12px; + border: none; + display: flex; + align-items: center; + padding: 0 12px; + gap: 9px; + font-family: inherit; + font-size: 12.5px; + font-weight: 600; + cursor: pointer; + outline: none; + -webkit-tap-highlight-color: transparent; + transition: all .13s ease; + text-align: left; + letter-spacing: -.005em; +} + +.triage-opt:active { transform: scale(.97); } + +/* radio circle */ +.triage-rc { + width: 16px; + height: 16px; + border-radius: 50%; + flex-shrink: 0; + display: flex; + align-items: center; + justify-content: center; + transition: all .13s; +} + +.triage-rc-inner { + width: 7px; + height: 13px; + border-bottom: 3px solid transparent; + border-right: 3px solid transparent; + transform: translate(2px, -3px) rotate(45deg); + transition: all .13s; +} + +/* IDLE */ +.app.theme-dark .triage-opt { background: rgba(255, 255, 255, .055); border: 1.5px solid rgba(255, 255, 255, .09); color: rgba(255, 255, 255, .4); } +.app.theme-dark .triage-opt .triage-rc { border: 1.5px solid rgba(255, 255, 255, .2); } +.app.theme-dark .triage-opt .triage-rc-inner { opacity: 0; } +.app.theme-light .triage-opt { background: rgba(0, 0, 0, .04); border: 1.5px solid rgba(0, 0, 0, .08); color: rgba(0, 0, 0, .4); } +.app.theme-light .triage-opt .triage-rc { border: 1.5px solid rgba(0, 0, 0, .2); } +.app.theme-light .triage-opt .triage-rc-inner { opacity: 0; } + +/* SELECTED YES = red */ +.triage-opt.py { border-color: rgba(220, 38, 38, .55); } +.app.theme-dark .triage-opt.py { background: rgba(239, 68, 68, .11); color: #fca5a5; } +.app.theme-light .triage-opt.py { background: rgba(220, 38, 38, .07); color: #dc2626; } +.triage-opt.py .triage-rc { border-color: #ef4444; background: transparent; } +.app.theme-light .triage-opt.py .triage-rc { border-color: #dc2626; } +.app.theme-dark .triage-opt.py .triage-rc-inner { opacity: 1; border-color: #ef4444; background: transparent !important; } +.app.theme-light .triage-opt.py .triage-rc-inner { opacity: 1; border-color: #dc2626; background: transparent !important; } + +/* SELECTED NO = green */ +.triage-opt.pn { border-color: rgba(34, 197, 94, .45); } +.app.theme-dark .triage-opt.pn { background: rgba(34, 197, 94, .1); color: #86efac; } +.app.theme-light .triage-opt.pn { background: rgba(22, 163, 74, .07); color: #16a34a; } +.triage-opt.pn .triage-rc { border-color: #22c55e; background: transparent; } +.app.theme-light .triage-opt.pn .triage-rc { border-color: #16a34a; } +.app.theme-dark .triage-opt.pn .triage-rc-inner { opacity: 1; border-color: #22c55e; background: transparent !important; } +.app.theme-light .triage-opt.pn .triage-rc-inner { opacity: 1; border-color: #16a34a; background: transparent !important; } + +/* RESULT BOX */ +.triage-res { + margin: 0 20px; + border-radius: 13px; + padding: 13px 14px; + display: flex; + align-items: flex-start; + gap: 10px; + font-size: 12.5px; + font-weight: 600; + line-height: 1.55; + transition: all .18s ease; +} + +.triage-res svg { flex-shrink: 0; margin-top: 1px; } +.triage-res span { flex: 1; } + +/* wait */ +.app.theme-dark .triage-res.w { background: rgba(255, 255, 255, .04); border: 1px solid rgba(255, 255, 255, .07); color: rgba(255, 255, 255, .3); } +.app.theme-dark .triage-res.w svg { stroke: rgba(255, 255, 255, .25); } +.app.theme-light .triage-res.w { background: rgba(0, 0, 0, .03); border: 1px solid rgba(0, 0, 0, .07); color: rgba(0, 0, 0, .38); } +.app.theme-light .triage-res.w svg { stroke: rgba(0, 0, 0, .25); } + +/* ambulance = red */ +.app.theme-dark .triage-res.ra { background: rgba(239, 68, 68, .12); border: 1px solid rgba(239, 68, 68, .32); color: #fca5a5; } +.app.theme-dark .triage-res.ra svg { stroke: #fca5a5; } +.app.theme-light .triage-res.ra { background: rgba(220, 38, 38, .07); border: 1px solid rgba(220, 38, 38, .28); color: #b91c1c; } +.app.theme-light .triage-res.ra svg { stroke: #b91c1c; } + +/* police = blue */ +.app.theme-dark .triage-res.rb { background: rgba(59, 130, 246, .12); border: 1px solid rgba(59, 130, 246, .32); color: #93c5fd; } +.app.theme-dark .triage-res.rb svg { stroke: #93c5fd; } +.app.theme-light .triage-res.rb { background: rgba(37, 99, 235, .07); border: 1px solid rgba(37, 99, 235, .28); color: #1d4ed8; } +.app.theme-light .triage-res.rb svg { stroke: #1d4ed8; } + +/* clear = green */ +.app.theme-dark .triage-res.rc2 { background: rgba(34, 197, 94, .11); border: 1px solid rgba(34, 197, 94, .3); color: #86efac; } +.app.theme-dark .triage-res.rc2 svg { stroke: #86efac; } +.app.theme-light .triage-res.rc2 { background: rgba(22, 163, 74, .07); border: 1px solid rgba(22, 163, 74, .28); color: #15803d; } +.app.theme-light .triage-res.rc2 svg { stroke: #15803d; } + +/* FOOTER */ +.triage-fbtn { + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + margin: 12px 20px 8px; /* Reduced bottom margin to accommodate skip button */ + height: 50px; + border-radius: 14px; + border: none; + font-family: inherit; + font-size: 14px; + font-weight: 700; + cursor: pointer; + outline: none; + -webkit-tap-highlight-color: transparent; + letter-spacing: .01em; + transition: all .16s ease; +} + +.triage-fbtn:active { transform: scale(.98); } + +.app.theme-dark .triage-fbtn.off { background: rgba(255, 255, 255, .05); color: rgba(255, 255, 255, .2); border: 1px solid rgba(255, 255, 255, .06); cursor: default; } +.app.theme-light .triage-fbtn.off { background: rgba(0, 0, 0, .04); color: rgba(0, 0, 0, .22); border: 1px solid rgba(0, 0, 0, .06); cursor: default; } + +.app.theme-dark .triage-fbtn.on { background: #fff; color: #0c0e16; } +.app.theme-light .triage-fbtn.on { background: #111; color: #fff; } + +.triage-skip-btn { + background: transparent; + border: none; + font-size: 13px; + font-weight: 500; + margin-bottom: 20px; + cursor: pointer; + font-family: inherit; + transition: opacity 0.2s; +} + +.app.theme-dark .triage-skip-btn { color: rgba(255, 255, 255, 0.5); } +.app.theme-light .triage-skip-btn { color: rgba(0, 0, 0, 0.5); } + +.app.theme-dark .triage-skip-btn:hover { color: rgba(255, 255, 255, 0.8); } +.app.theme-light .triage-skip-btn:hover { color: rgba(0, 0, 0, 0.8); } diff --git a/frontend/src/utils/medicalId.js b/frontend/src/utils/medicalId.js index aeb8b98..f927c9f 100644 --- a/frontend/src/utils/medicalId.js +++ b/frontend/src/utils/medicalId.js @@ -92,6 +92,20 @@ export function getMedicalIdCompletion(data = null) { return Math.round((count / keys.length) * 100); } +export function getIsMedicalIdComplete(data = null) { + const m = data || getMedicalId(); + const hasName = Boolean((m.name || "").toString().trim()); + const hasAge = Boolean((m.age || "").toString().trim()); + const hasBlood = Boolean((m.bloodType || "").toString().trim()); + const hasPhone = Boolean( + (m.primaryContactPhone || "").toString().trim() || + (m.secondaryContactPhone || "").toString().trim() || + (m.tertiaryContactPhone || "").toString().trim() + ); + + return hasName && hasAge && hasBlood && hasPhone && getMedicalIdCompletion(m) >= 63; +} + /** * Compose an SMS body for SOS-by-SMS, using the Medical ID + coordinates. * From 5b8689bbb2d22cf3f5a2ca94c7fbd2f6333bacae Mon Sep 17 00:00:00 2001 From: Arthrevs Date: Sat, 30 May 2026 01:47:34 +0530 Subject: [PATCH 4/4] Update tutorial overlay, disable demo mode by default, and update map center logic --- frontend/src/App.jsx | 16 +- frontend/src/components/ContactList.jsx | 7 +- frontend/src/components/MapHero.jsx | 80 +-- frontend/src/components/RealMap.jsx | 128 +++- frontend/src/components/TutorialOverlay.jsx | 680 +++++++++++++------- frontend/src/final-design.css | 15 +- frontend/src/i18n/en.json | 36 +- frontend/src/utils/demoMode.js | 7 +- 8 files changed, 658 insertions(+), 311 deletions(-) diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 5ba11ad..a3dc84c 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -156,8 +156,6 @@ export default function App() { // Tutorial state const [tutorialStep, setTutorialStep] = useState(0); - const [tutorialForceSidebar, setTutorialForceSidebar] = useState(false); - const [tutorialForceInfo, setTutorialForceInfo] = useState(false); const { location: gpsLocation, @@ -372,19 +370,8 @@ export default function App() { {tutorialStep > 0 && ( { setTutorialStep(0); - setTutorialForceSidebar(false); - setTutorialForceInfo(false); - if (isFirstLaunch()) setMedicalOpen(true); - }} - onSkip={() => { - setTutorialStep(0); - setTutorialForceSidebar(false); - setTutorialForceInfo(false); if (isFirstLaunch()) setMedicalOpen(true); }} /> @@ -396,6 +383,7 @@ export default function App() { landmark={searchData?.landmark} countryCode={countryCode} contacts={searchData?.contacts || []} + cat={cat} topContact={topContact} isOnline={isOnline} gpsLost={gpsLost} @@ -410,8 +398,6 @@ export default function App() { usingFallbackData={!!searchData && !searchHasRealData} mapTheme={mapTheme} onToggleTheme={() => setMapTheme(prev => prev === 'dark' ? 'light' : 'dark')} - forceSidebarOpen={tutorialForceSidebar} - forceInfoOpen={tutorialForceInfo} onTutorialStart={() => setTutorialStep(1)} /> diff --git a/frontend/src/components/ContactList.jsx b/frontend/src/components/ContactList.jsx index dd300e2..bf6b8d2 100644 --- a/frontend/src/components/ContactList.jsx +++ b/frontend/src/components/ContactList.jsx @@ -40,7 +40,12 @@ export default function ContactList({ contacts, loading, error, cachedAt, cat, s } // 25% threshold, e.g., 19 * 0.25 = 4.75 -> 5th card -> index 4 - const thresholdIndex = Math.ceil(filtered.length * 0.25) - 1; + let thresholdIndex = Math.ceil(filtered.length * 0.25) - 1; + + // Cap at the 30th card for large lists (> 120 cards) + if (filtered.length > 120) { + thresholdIndex = 29; + } const handleScroll = () => { // Find the card element at the threshold index diff --git a/frontend/src/components/MapHero.jsx b/frontend/src/components/MapHero.jsx index da14b2c..6173f01 100644 --- a/frontend/src/components/MapHero.jsx +++ b/frontend/src/components/MapHero.jsx @@ -38,6 +38,7 @@ const CAT_BG = { function MiniContact({ contact, last }) { const { t } = useTranslation(); + const [copied, setCopied] = useState(false); const cat = (contact.category || 'repair').toLowerCase(); // Backend's "tyre" category maps to the user-facing "puncture" label key // (CAT_ICONS/TONES still keyed by raw category name) @@ -68,7 +69,20 @@ function MiniContact({ contact, last }) {
{typeLabel}
- {contact.phone || t('actions.no_phone')} + { + e.stopPropagation(); + if (contact.phone) { + navigator.clipboard.writeText(contact.phone); + setCopied(true); + setTimeout(() => setCopied(false), 2000); + } + }} + style={{ cursor: contact.phone ? 'pointer' : 'default' }} + > + {copied ? t('actions.copied', 'Copied!') : (contact.phone || t('actions.no_phone'))} +
diff --git a/frontend/src/components/RealMap.jsx b/frontend/src/components/RealMap.jsx index 8535d95..5fa8e51 100644 --- a/frontend/src/components/RealMap.jsx +++ b/frontend/src/components/RealMap.jsx @@ -50,6 +50,84 @@ const CAT_EMOJI = { tyre: '🛞', }; +const CAT_SVG = { + towing: ` + + + + + + + + + + + + + + +`, + police: ` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +POLICE DEPT + + + + + + + + + + + + +` +}; + /** Custom user-location divIcon — pulsing green dot with halo. */ function buildUserIcon(gpsLost) { const color = gpsLost ? '#94A3B8' : '#22C55E'; @@ -70,10 +148,16 @@ function buildServiceIcon(contact) { const cat = (contact.category || 'repair').toLowerCase(); const tone = CAT_TONES[cat] || 'teal'; const color = TONES[tone]; - const emoji = CAT_EMOJI[cat] || '📍'; const shortName = (contact.name || '').split(/[,·\-]/)[0].trim().substring(0, 16); const km = typeof contact.distance === 'number' ? contact.distance.toFixed(1) : '?'; + const svgContent = CAT_SVG[cat]; + const emoji = CAT_EMOJI[cat] || '📍'; + + const innerHtml = svgContent + ? `
${svgContent}
` + : `${emoji}`; + return L.divIcon({ className: 'rs-service-marker', html: ` @@ -82,7 +166,7 @@ function buildServiceIcon(contact) { ${km}km
- ${emoji} + ${innerHtml}
`, @@ -94,15 +178,42 @@ function buildServiceIcon(contact) { function MapRecenter({ lat, lon, zoom, markers = [] }) { const map = useMap(); + const lastLocation = useRef({ lat: null, lon: null }); + const lastMarkersSignature = useRef(""); + useEffect(() => { - if (lat != null && lon != null) { + if (lat == null || lon == null) return; + + const distLat = Math.abs(lat - (lastLocation.current.lat || 0)); + const distLon = Math.abs(lon - (lastLocation.current.lon || 0)); + const isBigJump = lastLocation.current.lat === null || (distLat > 0.005 || distLon > 0.005); + + const markersSig = markers.map(m => m.id || `${m.lat},${m.lon}`).join(','); + const markersChanged = markersSig !== lastMarkersSignature.current; + + if (isBigJump || markersChanged) { + lastLocation.current = { lat, lon }; + lastMarkersSignature.current = markersSig; + if (markers.length > 0) { - const bounds = L.latLngBounds([[lat, lon]]); - markers.forEach(m => bounds.extend([m.lat, m.lon])); - // Add asymmetric padding to account for the top toolbar and the large bottom dock + let maxDeltaLat = 0; + let maxDeltaLon = 0; + markers.forEach(m => { + maxDeltaLat = Math.max(maxDeltaLat, Math.abs(m.lat - lat)); + maxDeltaLon = Math.max(maxDeltaLon, Math.abs(m.lon - lon)); + }); + + // Ensure some minimum delta so it doesn't zoom infinitely if a marker is exactly at user location + maxDeltaLat = Math.max(maxDeltaLat, 0.002); + maxDeltaLon = Math.max(maxDeltaLon, 0.002); + + const bounds = L.latLngBounds( + [lat - maxDeltaLat, lon - maxDeltaLon], + [lat + maxDeltaLat, lon + maxDeltaLon] + ); + map.fitBounds(bounds, { - paddingTopLeft: [40, 120], - paddingBottomRight: [40, 350], + padding: [50, 50], maxZoom: zoom, animate: true, duration: 0.6 @@ -112,6 +223,7 @@ function MapRecenter({ lat, lon, zoom, markers = [] }) { } } }, [lat, lon, zoom, markers, map]); + return null; } diff --git a/frontend/src/components/TutorialOverlay.jsx b/frontend/src/components/TutorialOverlay.jsx index a50a528..04acfc5 100644 --- a/frontend/src/components/TutorialOverlay.jsx +++ b/frontend/src/components/TutorialOverlay.jsx @@ -1,250 +1,464 @@ -import React, { useState, useEffect } from 'react'; +import React, { useState } from 'react'; import { useTranslation } from 'react-i18next'; +import { RotateCw, Sun, Globe, MapPin, AlertTriangle } from 'lucide-react'; -export default function TutorialOverlay({ - onComplete, - theme = 'dark', - triggerSidebar, - triggerInfo, - onStepChange -}) { +/* ── Inline icon helper — renders a lucide icon inline with text ── */ +function I({ children, label }) { + return ( + + {children} + {label} + + ); +} + +/* ── Step data ── */ +const QUICK_STEPS = [ + { + emoji: '🔘', + titleFallback: 'These Buttons Help You', + bodyType: 'buttons-list', + }, + { + emoji: '🆘', + titleFallback: 'Need Help? Do This', + bodyType: 'steps-list', + items: [ + { num: '1', text: 'Tap the big blue SOS button' }, + { num: '2', text: 'Your location is sent to your emergency contact' }, + { num: '3', text: 'Tap Call on the nearest hospital below' }, + ], + footer: "That's it. Help is on the way.", + }, + { + emoji: '🛡️', + titleFallback: 'It Works Even If You Can\'t', + bodyType: 'steps-list', + items: [ + { num: '⏱️', text: 'A 30-second countdown starts' }, + { num: '📤', text: 'Your location is sent automatically' }, + { num: '📱', text: 'Your emergency contact gets a message' }, + ], + intro: "If your phone detects a crash and you can't respond:", + footer: "You don't need to do anything. The app handles it.", + }, +]; + +const FULL_STEPS = [ + { + emoji: '👀', + titleFallback: 'What You See On Screen', + bodyType: 'buttons-list', + footer: "The dot on the right shows if you're online. Even with zero signal, you'll always see emergency numbers like 108, 100, 101, 112.", + }, + { + emoji: '📋', + titleFallback: 'Set This Up Once', + bodyType: 'two-sections', + sections: [ + { + heading: '① Tap the ID button', + lines: [ + 'Fill in: blood type, allergies, emergency contact', + "Paramedics can read this if you're unconscious", + 'It stays on your phone only — never uploaded', + ], + }, + { + heading: '② Tap Plan Offline Trip', + lines: [ + "If you're driving somewhere with bad signal", + 'It saves hospitals and police along your route', + 'So the data is ready before you lose signal', + ], + }, + ], + }, + { + emoji: '⚡', + titleFallback: 'When Something Happens', + bodyType: 'steps-list', + intro: "Here's exactly what to do:", + items: [ + { num: '1', text: 'App finds your location automatically' }, + { num: '2', text: 'Answer 2 quick questions (what happened?)' }, + { num: '3', text: 'The app puts the best help at the top' }, + { num: '4', text: 'Tap Call on the first result' }, + { num: '5', text: 'Tap SOS to send your location' }, + ], + footer: '⏱️ Total time: under 10 seconds', + }, + { + emoji: '🛡️', + titleFallback: "If You Can't Respond", + bodyType: 'steps-list', + intro: 'Your phone watches for sudden stops. If it detects a crash:', + items: [ + { num: '⏱️', text: 'A 30-second countdown starts' }, + { num: '📤', text: 'If you don\'t cancel, it auto-sends your location, road name, and crash alert' }, + { num: '📱', text: 'Sent via SMS and WhatsApp to your emergency contact' }, + ], + footer: "You don't need to touch anything.", + }, + { + emoji: '📡', + titleFallback: 'No Internet? Still Works', + bodyType: 'steps-list', + intro: 'The app has 4 backup layers:', + items: [ + { num: '1', text: 'Live search (when online)' }, + { num: '2', text: 'Saved results from last time' }, + { num: '3', text: 'Your offline trip data' }, + { num: '4', text: 'Emergency numbers built into the app' }, + ], + footer: 'Even with zero internet, you\'ll always see: 📞 108 · 100 · 101 · 112. These work offline. Always.', + }, + { + emoji: '🎬', + titleFallback: 'Want To See a Demo?', + bodyType: 'simple', + text: 'We have a short video that shows how crash detection works in real life.\n\nWant to watch it?', + }, +]; + +export default function TutorialOverlay({ onComplete, theme = 'dark' }) { const { t } = useTranslation(); - const [step, setStep] = useState(1); - - useEffect(() => { - if (onStepChange) onStepChange(step); - }, [step, onStepChange]); - - // We use a slight animation for the cursor - const cursorStyle = { - position: 'absolute', - zIndex: 10001, - transition: 'all 0.5s ease', - filter: 'drop-shadow(0 2px 4px rgba(0,0,0,0.5))', - animation: 'bounce 1s infinite alternate' - }; + const [mode, setMode] = useState(null); + const [stepIdx, setStepIdx] = useState(0); - const getStepContent = () => { - switch (step) { - case 1: - return { - title: t('tutorial.title', 'Want a quick tour?'), - text: t('tutorial.step1', 'Do you want a tutorial of the app'), - buttons: ( - <> - - - - ), - boxStyle: { top: '50%', left: '50%', transform: 'translate(-50%, -50%)', width: '232px' } - }; - case 2: - return { - text: t('tutorial.step2', 'This is the top bar it consist of all functional buttons'), - buttons: , - boxStyle: { top: '70px', left: '50%', transform: 'translateX(-50%)', width: '90%', maxWidth: '232px' } - }; - case 3: - return { - text: t('tutorial.step3', 'Here you can check for the status of internet connection whether it is online, offline or connecting'), - buttons: , - boxStyle: { top: '70px', right: '16px', width: '90%', maxWidth: '232px' } - }; - case 4: - return { - text: t('tutorial.step4', 'This is the side menu which contains features name, information and demo to our test crash'), - buttons: , - boxStyle: { top: '50%', left: '50%', transform: 'translate(-50%, -50%)', width: '90%', maxWidth: '232px' }, - onEnter: () => triggerSidebar(true), - onLeave: () => {} - }; - case 5: - return { - text: t('tutorial.step5', 'This contains information on all available features and switches of our app'), - buttons: , - boxStyle: { top: '50%', left: '50%', transform: 'translate(-50%, -50%)', width: '90%', maxWidth: '232px' }, - onEnter: () => triggerInfo(true), - onLeave: () => { triggerInfo(false); triggerSidebar(false); } - }; - case 6: - return { - text: t('tutorial.step6', 'Would you like to see how the demo crash test works with the help of a video'), - buttons: ( - <> - - - - ), - boxStyle: { top: '50%', left: '50%', transform: 'translate(-50%, -50%)', width: '232px' } - }; - default: - return {}; + const steps = mode === 'quick' ? QUICK_STEPS : mode === 'full' ? FULL_STEPS : []; + const totalSteps = steps.length; + const currentStep = steps[stepIdx]; + const isLastStep = stepIdx === totalSteps - 1; + const progressPct = totalSteps > 0 ? ((stepIdx + 1) / totalSteps) * 100 : 0; + + const isDark = theme === 'dark'; + const iconSize = 14; + const iconStroke = 2; + + /* ── The buttons list body (used in quick step 1 and full step 1) ── */ + const renderButtonsList = (footer) => ( +
+

See the buttons at the top of your screen?

+
+ + + + + + + ID + +
+

{footer || "The little dot on the right tells you if you're connected to the internet."}

+
+ ); + + /* ── Steps list body ── */ + const renderStepsList = (step) => ( +
+ {step.intro &&

{step.intro}

} +
+ {step.items.map((item, i) => ( +
+ {item.num} + {item.text} +
+ ))} +
+ {step.footer &&

{step.footer}

} +
+ ); + + /* ── Two-section body ── */ + const renderTwoSections = (step) => ( +
+ {step.sections.map((sec, i) => ( +
+
{sec.heading}
+ {sec.lines.map((line, j) => ( +
{line}
+ ))} +
+ ))} +
+ ); + + /* ── Simple text body ── */ + const renderSimple = (step) => ( +

{step.text}

+ ); + + /* ── Body renderer ── */ + const renderBody = (step) => { + switch (step.bodyType) { + case 'buttons-list': return renderButtonsList(step.footer); + case 'steps-list': return renderStepsList(step); + case 'two-sections': return renderTwoSections(step); + case 'simple': return renderSimple(step); + default: return null; } }; - const content = getStepContent(); + // ── Welcome screen ── + const renderWelcome = () => ( +
+
👋
+

+ {t('tutorial.welcome_title', 'Want a quick tour?')} +

+

+ {t('tutorial.welcome_body', 'This app can save your life in a road emergency. Let us show you how it works — takes less than a minute.')} +

+
+ + + +
+
+ ); - useEffect(() => { - if (content.onEnter) content.onEnter(); - return () => { - if (content.onLeave) content.onLeave(); - } - }, [step]); + // ── Step dialog ── + const renderStepDialog = () => { + const isFullDemoStep = mode === 'full' && isLastStep; + + return ( +
+ {/* Progress bar */} +
+
+
+
+ {stepIdx + 1} / {totalSteps} +
+ + {/* Emoji + Title */} +
{currentStep.emoji}
+

{currentStep.titleFallback}

+ + {/* Body */} + {renderBody(currentStep)} + + {/* Actions */} +
+ {isFullDemoStep ? ( + <> + + + + ) : isLastStep ? ( + + ) : ( + + )} + + {stepIdx > 0 && ( + + )} +
+
+ ); + }; return ( -
+
- {/* Skip button */} - - - {/* Tutorial Box */} -
-
- {content.title &&

{content.title}

} -

{content.text}

-
- {content.buttons} -
-
+ {mode !== null && ( + + )} - {/* Cursors removed in favor of CSS glowing highlights */} + {mode === null ? renderWelcome() : renderStepDialog()}
); } diff --git a/frontend/src/final-design.css b/frontend/src/final-design.css index 160d42a..31333a6 100644 --- a/frontend/src/final-design.css +++ b/frontend/src/final-design.css @@ -1486,14 +1486,14 @@ } .mh-dist-pill { - font-size: 10px; + font-size: 12px; /* made inside content larger */ font-weight: 700; letter-spacing: 0.03em; color: #22c55e; background: rgba(34,197,94,0.1); border: 1px solid rgba(34,197,94,0.2); - padding: 2px 7px; - border-radius: 20px; + padding: 4px 14px; /* vertically 50% more than original 2px, keeping horizontal wide */ + border-radius: 20px; /* keeps edges fully rounded like a pill */ white-space: nowrap; flex-shrink: 0; margin-top: 1px; @@ -1527,13 +1527,14 @@ .mh-call-chip { display: flex; align-items: center; + justify-content: center; gap: 5px; - height: 28px; - padding: 0 10px; - border-radius: 8px; + height: 35px; /* vertically 25% larger than original 28px */ + padding: 0 25px; /* horizontally even wider */ + border-radius: 30px; /* fully rounded pill edges */ border: none; font-family: 'Outfit', sans-serif; - font-size: 11px; + font-size: 13px; /* slight bump for the larger button */ font-weight: 600; cursor: pointer; outline: none; diff --git a/frontend/src/i18n/en.json b/frontend/src/i18n/en.json index 759ef20..9215461 100644 --- a/frontend/src/i18n/en.json +++ b/frontend/src/i18n/en.json @@ -235,16 +235,38 @@ "scene.photo_hint": "Captured automatically at time of SOS", "scene.capturing": "Capturing scene...", "scene.no_camera": "Scene photo unavailable", - "tutorial.skip": "Skip", + "tutorial.skip": "Skip — I'll figure it out", "tutorial.next": "Next", + "tutorial.back": "Back", "tutorial.yes": "YES", "tutorial.no": "NO", - "tutorial.step1": "Do you want a tutorial of the app", - "tutorial.step2": "This is the top bar it consist of all functional buttons", - "tutorial.step3": "Here you can check for the status of internet connection whether it is online, offline or connecting", - "tutorial.step4": "This is the side menu which contains features name, information and demo to our test crash", - "tutorial.step5": "This contains information on all available features and switches of our app", - "tutorial.step6": "Would you like to see how the demo crash test works with the help of a video", + "tutorial.welcome_title": "Want a quick tour?", + "tutorial.welcome_body": "This app can save your life in a road emergency. Let us show you how it works — takes less than a minute.", + "tutorial.quick_tour": "⚡ Quick Tour — 1 minute", + "tutorial.full_tour": "📖 Full Tour — 5 minutes", + "tutorial.done": "Done", + "tutorial.got_it": "Got it — Done!", + "tutorial.watch_demo": "Watch Demo Video", + "tutorial.im_good": "I'm good — Done!", + "tutorial.step_of": "{{current}} of {{total}}", + "tutorial.quick1_title": "These Buttons Help You", + "tutorial.quick1_body": "See the buttons at the top of your screen?\n\n🔄 Refresh — gets new nearby help\n🌙 Dark / Light mode\n🌐 Language — pick yours\n📍 Set location — if GPS doesn't work\n💥 Crash alert — test it\n🆔 Medical ID — your health info\n\nThe little dot on the right tells you if you're connected to the internet.", + "tutorial.quick2_title": "Need Help? Do This", + "tutorial.quick2_body": "The app already knows where you are.\n\n1️⃣ Tap the big blue SOS button\n2️⃣ Your location is sent to your emergency contact\n3️⃣ Tap Call on the nearest hospital below\n\nThat's it. Help is on the way.", + "tutorial.quick3_title": "It Works Even If You Can't", + "tutorial.quick3_body": "If your phone detects a crash and you can't respond:\n\n⏱️ A 30-second countdown starts\n📤 Your location is sent automatically\n📱 Your emergency contact gets a message\n\nYou don't need to do anything. The app handles it.", + "tutorial.full1_title": "What You See On Screen", + "tutorial.full1_body": "The top bar has 6 buttons:\n\n🔄 Refresh — gets fresh nearby places\n🌙 Dark / Light mode\n🌐 Language — choose from 43 languages\n📍 Manual location — use if GPS fails\n💥 Crash alert — test the crash system\n🆔 Medical ID — your health info for paramedics\n\nThe dot on the right shows if you're online. Even with zero signal, you'll always see emergency numbers like 108, 100, 101, 112.", + "tutorial.full2_title": "Set This Up Once", + "tutorial.full2_body": "1️⃣ Tap the ID button\n Fill in: blood type, allergies, emergency contact\n Paramedics can read this if you're unconscious\n It stays on your phone only — never uploaded\n\n2️⃣ Tap Plan Offline Trip\n If you're driving somewhere with bad signal\n It saves hospitals and police along your route\n So the data is ready before you lose signal", + "tutorial.full3_title": "When Something Happens", + "tutorial.full3_body": "Here's exactly what to do:\n\n1️⃣ App finds your location automatically\n2️⃣ Answer 2 quick questions (what happened?)\n3️⃣ The app puts the best help at the top\n4️⃣ Tap Call on the first result\n5️⃣ Tap SOS to send your location\n\n⏱️ Total time: under 10 seconds", + "tutorial.full4_title": "If You Can't Respond", + "tutorial.full4_body": "Your phone watches for sudden stops.\n\nIf it detects a crash:\n⏱️ A 30-second countdown starts\n📤 If you don't cancel, it auto-sends:\n • Your location\n • Road name\n • Crash alert\n\n📱 Sent via SMS and WhatsApp\n to your emergency contact.\n\nYou don't need to touch anything.", + "tutorial.full5_title": "No Internet? Still Works", + "tutorial.full5_body": "The app has 4 backup layers:\n\n1️⃣ Live search (when online)\n2️⃣ Saved results from last time\n3️⃣ Your offline trip data\n4️⃣ Emergency numbers built into the app\n\nEven with absolutely zero internet, you'll always see:\n📞 108 · 100 · 101 · 112\n\nThese work offline. Always.", + "tutorial.full6_title": "Want To See a Demo?", + "tutorial.full6_body": "We have a video that shows how crash detection works in real life.\n\nWant to watch it?", "sidebar.menu": "Menu", "sidebar.medical_card": "Your Medical Card", "sidebar.language": "Language", diff --git a/frontend/src/utils/demoMode.js b/frontend/src/utils/demoMode.js index df2d43c..6f6aabd 100644 --- a/frontend/src/utils/demoMode.js +++ b/frontend/src/utils/demoMode.js @@ -30,10 +30,9 @@ function readDemoMode() { const path = window.location.pathname; if (path === '/demo' || path.startsWith('/demo/')) return true; - // Default: demo ON. A judge opening the deployed URL must not be able to - // place a real 108/911 call with one accidental tap. Real dials are an - // explicit opt-in via ?live=1 (or ?demo=0). - return true; + // Default: demo OFF. Real dials are placed unless the user is on + // the /demo path or specifies ?demo=1. + return false; } export const DEMO_MODE = readDemoMode();