'profile.intro':'Wybierz, kim podróżujesz. Zapytamy tylko o preferencje dotyczące barier — nie o stan zdrowia. Zapisujemy je wyłącznie na tym urządzeniu.',
'profile.kind':'Podróżuję',
'profile.wheelchair':'Na wózku inwalidzkim',
'profile.wheelchair.hint':'Wózek ręczny lub elektryczny',
'profile.stroller':'Z wózkiem dziecięcym',
'profile.stroller.hint':'Rodzic lub opiekun z wózkiem',
'profile.limits':'Granice, których nie chcesz przekraczać',
'profile.kerb':'Najwyższy krawężnik',
'profile.width':'Najwęższe przejście',
'profile.incline':'Największe nachylenie',
'profile.prefs':'Na co zwracać uwagę',
'profile.cobbles':'Unikaj kostki brukowej i nierównej nawierzchni',
'profile.toilet':'Potrzebuję dostępnej toalety w pobliżu',
'profile.rest':'Potrzebuję miejsc do odpoczynku (ławki)',
'profile.changing':'Potrzebuję przewijaka',
'profile.save':'Zapisz i szukaj',
'profile.saved':'Profil zapisany na tym urządzeniu.',
'profile.privacy':'Bez konta, bez analityki. Profil nigdy nie opuszcza Twojego urządzenia.',
'unit.cm':'cm',
'unit.pct':'%',
'places.title':'Szukaj miejsca',
'places.search':'Nazwa lub adres',
'places.category':'Rodzaj miejsca',
'places.onlyFit':'Pokaż tylko pasujące lub częściowo pasujące',
'f.surface.fair':'Nawierzchnia: {surface} — raczej równa.',
'f.surface.rough':'Nawierzchnia: {surface} — nierówna, wolniejszy i bardziej męczący przejazd.',
'f.surface.unknown':'Brak danych o nawierzchni przed wejściem.',
'f.toilet.own.yes':'Toaleta w obiekcie oznaczona jako dostępna dla wózka.',
'f.toilet.own.no':'Toaleta w obiekcie oznaczona jako niedostępna dla wózka.',
'f.toilet.near':'Dostępna toaleta publiczna ok. {d} m stąd.',
'f.toilet.fee':'Toaleta jest płatna.',
'f.toilet.nearUnknown':'Toaleta publiczna ok. {d} m stąd, ale nie wiadomo, czy jest dostępna dla wózka.',
'f.toilet.none':'Brak danych o dostępnej toalecie.',
'f.rest.ok':'Zmapowane ławki w pobliżu: {n}, najbliższa ok. {d} m.',
'f.rest.none':'Brak zmapowanych ławek w promieniu 150 m.',
'f.rest.noneHint':'Mogą istnieć niezmapowane.',
'f.changing.yes':'Przewijak oznaczony w obiekcie.',
'f.changing.no':'Brak przewijaka (oznaczone w OSM).',
'f.changing.near':'Przewijak w toalecie publicznej ok. {d} m stąd.',
'f.changing.none':'Brak danych o przewijaku.',
'raw':'{text}',
'surface.sett':'kostka brukowa',
'surface.cobblestone':'bruk',
'surface.unhewn_cobblestone':'nieociosany bruk',
'surface.paving_stones':'płyty chodnikowe',
'surface.asphalt':'asfalt',
'surface.concrete':'beton',
'surface.paved':'utwardzona',
'surface.concrete:plates':'płyty betonowe',
'surface.concrete:lanes':'pasy betonowe',
'surface.compacted':'ubita',
'surface.fine_gravel':'drobny żwir',
'surface.gravel':'żwir',
'surface.wood':'drewno',
'surface.dirt':'ziemia',
'surface.ground':'grunt',
'surface.grass':'trawa',
'surface.unpaved':'nieutwardzona',
'surface.stone':'kamień',
'surface.rock':'skała',
'surface.metal':'metal',
'surface.metal_grid':'kratka metalowa',
'surface.tiles':'płytki',
'surface.sand':'piasek',
'surface.pebblestone':'kamyki',
'detail.back':'Wróć do listy',
'detail.routeTo':'Trasa do tego miejsca',
'detail.openOsm':'Zobacz w OpenStreetMap',
'detail.refresh':'Odśwież dane z OSM',
'detail.refreshing':'Pobieranie…',
'detail.refreshed':'Odświeżono z OpenStreetMap: {time}.',
'detail.refreshFail':'Nie udało się połączyć z OpenStreetMap. Widzisz zapis z {date}. To, że nie udało się odświeżyć, nie oznacza, że dane są aktualne.',
'detail.refreshDemo':'To miejsce jest przykładowe — nie ma go w OpenStreetMap.',
'detail.demo':'DEMO',
'detail.demoNote':'Fikcyjne miejsce pokazujące stan danych: „{state}”.',
'detail.facts':'Szczegóły dostępności',
'detail.reports':'Zgłoszenia użytkowników',
'detail.reports.none':'Brak zgłoszeń.',
'detail.reports.note':'Zgłoszenia są niezweryfikowane i oddzielone od danych OSM. W tym prototypie zapisują się tylko na tym urządzeniu.',
'detail.reports.demo':'przykładowe',
'detail.reports.remove':'Usuń zgłoszenie',
'rep.title':'Zgłoś poprawkę lub uzupełnienie',
'rep.attr':'Czego dotyczy zgłoszenie',
'rep.attr.entrance':'Dostępność wejścia',
'rep.attr.steps':'Schody przy wejściu',
'rep.attr.width':'Szerokość wejścia',
'rep.attr.toilet':'Toaleta dostępna dla wózka',
'rep.attr.ramp':'Podjazd lub winda',
'rep.value':'Co zastałeś(-aś) na miejscu',
'rep.yes':'Tak',
'rep.limited':'Częściowo',
'rep.no':'Nie',
'rep.widthLabel':'Szerokość w centymetrach',
'rep.note':'Notatka (opcjonalnie)',
'rep.submit':'Zapisz zgłoszenie',
'rep.cancel':'Anuluj',
'rep.thanks':'Zgłoszenie zapisane. Jest oznaczone jako niezweryfikowane.',
'rep.widthInvalid':'Podaj szerokość od 30 do 300 cm.',
'rep.disclaimer':'Nie zbieramy danych osobowych. Zgłoszenie zawiera tylko to, co wpiszesz.',
'route.title':'Zaplanuj trasę',
'route.intro':'Trasa omija schody, wysokie krawężniki i strome odcinki według Twojego profilu. Brak danych o odcinku nie jest traktowany jako potwierdzenie dostępności.',
'route.from':'Skąd',
'route.to':'Dokąd',
'route.placeholder':'Zacznij pisać nazwę miejsca',
'route.swap':'Zamień miejscami',
'route.go':'Wyznacz trasę',
'route.myLocation':'Użyj mojej lokalizacji',
'route.locating':'Ustalanie lokalizacji…',
'route.locOut':'Jesteś poza obszarem demonstracyjnym (Stare Miasto, Kazimierz, Wawel).',
'route.locFail':'Nie udało się ustalić lokalizacji. Wpisz punkt startu.',
'route.presets':'Przykładowe trasy',
'route.unknownPlace':'Nie znaleziono miejsca „{text}”. Wybierz pozycję z podpowiedzi.',
'route.blocked':'Nie znaleziono trasy bez barier',
'route.blocked.long':'W zmapowanych danych każda droga prowadzi przez barierę niezgodną z Twoimi granicami. Pokazujemy najlepszą próbę z zaznaczonymi barierami — nie traktuj jej jako dostępnej.',
'route.none':'Brak trasy w dostępnych danych',
'route.none.no-start':'Punkt startu jest zbyt daleko od zmapowanych chodników.',
'route.none.no-end':'Cel jest zbyt daleko od zmapowanych chodników.',
'route.none.disconnected':'Nie ma połączenia między tymi punktami w zmapowanych danych.',
'route.summary':'Długość {km} km · ok. {min} min (szacunek)',
'route.quality':'Nawierzchnia znana na {pct}% trasy.',
'route.unknownKerbs':'Skrzyżowania z nieznaną wysokością krawężnika: {n}.',
'route.barriers':'Bariery i uwagi na trasie',
'route.barriers.none':'Brak zmapowanych barier — ale dane mają luki.',
'map.offline':'Brak połączenia — kafelki mapy mogą się nie wczytać, dane miejsc działają offline.',
'about.title':'O danych i projekcie',
'about.intro':'Narzędzie pokazuje szczegóły dostępności z otwartych źródeł, a nie ogólne „dostępne / niedostępne”. Każda informacja ma źródło, datę i poziom wiarygodności.',
'about.data':'Źródła danych i ich wiarygodność',
'about.data.body1':'Mapa, miejsca, schody, krawężniki, nawierzchnie, ławki i toalety pochodzą z OpenStreetMap (licencja ODbL, wymagane oznaczenie źródła). Pobieramy je przez publiczne API Overpass dla obszaru demonstracyjnego i zapisujemy jako migawkę z datą w aplikacji.',
'about.data.body2':'Data przy informacji to data ostatniej edycji obiektu w OSM, o ile nie ma daty kontroli (check_date, survey:date). Edycja nie zawsze dotyczyła danych o dostępności — dlatego bez daty kontroli nigdy nie nazywamy danych „potwierdzonymi”.',
'about.data.body3':'Dane miejskie: przystanki pochodzą z oficjalnego strumienia GTFS ZTP Kraków (pole wheelchair_boarding). Ma ono dziś wartość „brak informacji” dla każdego przystanku w obszarze — pokazujemy to wprost i uzupełniamy opisem społeczności z OSM. Kolejne zbiory (Otwarte Dane Krakowa, MSIP) to kolejne adaptery; licencję każdego trzeba sprawdzić przed użyciem.',
'about.missing':'Co widzisz, gdy danych brakuje lub są sprzeczne',
'about.missing.body':'Brak informacji pokazujemy jako „Brak danych” z szarą ikoną znaku zapytania — nigdy jako dostępność. Gdy zgłoszenie użytkownika przeczy OSM, miejsce dostaje status „Sprzeczne dane” i oba stanowiska są widoczne. Gdy nie da się odświeżyć źródła, widzisz datę ostatniego zapisu i ostrzeżenie.',
'about.arch':'Architektura i dodawanie miast',
'about.arch.body':'Trzy warstwy: (1) adaptery źródeł (OSM, zgłoszenia, w przyszłości dane miejskie), (2) normalizacja do jednego modelu faktu {wartość, źródło, data, wiarygodność}, (3) prezentacja zależna od profilu. Nowe miasto to konfiguracja: obszar geograficzny i lista adapterów — bez zmian w interfejsie. Nowe kategorie miejsc dodaje się w jednej tabeli.',
'about.refresh':'Aktualizacja i poprawianie danych',
'about.refresh.body':'Migawkę odbudowuje skrypt (npm: data:build), a pojedyncze miejsce można odświeżyć na żywo z Overpass. Błędne dane poprawia się w OSM, a w aplikacji — zgłoszeniem, które jest wyraźnie oznaczone jako niezweryfikowane. W wersji produkcyjnej zgłoszenia trafiają do kolejki moderacji, a po potwierdzeniu przez dwie niezależne osoby — do OSM.',
'about.privacy':'Prywatność i bezpieczeństwo',
'about.privacy.body':'Nie pytamy o niepełnosprawność — tylko o preferencje dotyczące barier. Profil i zgłoszenia są przechowywane lokalnie na urządzeniu. Brak kont i analityki. Lokalizacja (opcjonalna) jest używana tylko w przeglądarce. Połączenia z mapą i API są szyfrowane (HTTPS).',
'about.a11y':'Dostępność samej aplikacji',
'about.a11y.body':'Cel: WCAG 2.2 AA. Zrobione: pełna obsługa klawiaturą, widoczny fokus, kontrast z systemu USWDS, informacje nie tylko kolorem (ikona + tekst), lista i opis trasy tekstem jako odpowiednik mapy, markery barier jako przyciski. Do dopracowania: wybór miejsca bezpośrednio z mapy nie jest dostępny z klawiatury (użyj listy), brak testów z czytnikami na wszystkich platformach, brak trybu wysokiego kontrastu poza ustawieniami systemu.',
'about.biz':'Model biznesowy i skalowanie',
'about.biz.body':'Bezpłatna aplikacja dla mieszkańców i turystów. Przychód z usług B2B: (1) widżet i raport „dostępność obiektu” dla hoteli, organizatorów wydarzeń i zarządców nieruchomości, (2) API dostępności dla systemów rezerwacyjnych i aplikacji turystycznych, (3) pakiet wdrożeniowy dla miast. Koszty to hosting statyczny, okresowe pobieranie z Overpass i moderacja zgłoszeń. Za produkt odpowiada podmiot prowadzący usługę, nie UMK.',
'about.limits.body':'Obszar: Stare Miasto, Kazimierz, Wawel. Logowanie i zgłoszenia są demonstracyjne i lokalne (bez serwera). Dane miejskie obejmują na razie tylko przystanki. Wysokość krawężników znana tylko dla części przejść. Szerokość wejść prawie nigdy nie jest zmapowana. Czasy przejścia to szacunki. Kafelki mapy z serwera OSM nadają się do demonstracji — produkcja wymaga własnego dostawcy kafelków.',
'src.city-gtfs':'Dane miejskie: ZTP Kraków (GTFS)',
'src.city-review':'Zweryfikowane przez urząd (demo)',
'f.entrance.cityNone':'Przewoźnik nie podaje informacji o dostępności tego przystanku.',
'f.entrance.cityNoneHint':'W oficjalnych danych ZTP pole „wheelchair_boarding” ma wartość „brak informacji”. Nie oznacza to, że przystanek jest niedostępny ani że jest dostępny.',
'auth.intro':'To logowanie demonstracyjne. Nie ma haseł ani serwera — wybierz konto pokazowe. Ustawienia i profil zapisują się tylko w tej przeglądarce, osobno dla każdego konta.',
'auth.demoBadge':'KONTO DEMO',
'auth.guest':'Kontynuuj bez konta',
'auth.guest.hint':'Ustawienia też będą zapamiętane na tym urządzeniu.',
'auth.signIn':'Zaloguj jako {name}',
'auth.signOut':'Wyloguj',
'auth.signedInAs':'Zalogowano: {name}',
'auth.role.user':'Mieszkaniec',
'auth.role.official':'Pracownik urzędu',
'auth.role.guest':'Gość',
'auth.anna':'Anna Kowalska',
'auth.anna.desc':'Mieszkanka, porusza się na wózku ręcznym.',
'auth.piotr':'Piotr Nowak',
'auth.piotr.desc':'Rodzic, spaceruje z dzieckiem w wózku.',
'auth.maria':'Maria Wiśniewska',
'auth.maria.desc':'Urząd miasta (rola demonstracyjna): panel jakości danych, kolejka zgłoszeń, eksport.',
'auth.official.note':'Rola urzędnika odblokowuje „Panel urzędu”. W wersji produkcyjnej logowanie przez konto służbowe (SSO).',
'set.title':'Ustawienia',
'set.saved':'Zapisano automatycznie na tym urządzeniu.',
'set.display':'Wygląd i czytelność',
'set.textSize':'Rozmiar tekstu',
'set.textSize.100':'Standardowy',
'set.textSize.125':'Większy',
'set.textSize.150':'Największy',
'set.contrast':'Wysoki kontrast',
'set.contrast.help':'Mocniejsze obramowania i ciemniejszy tekst.',
'set.motion':'Ogranicz animacje mapy',
'set.language':'Język',
'set.demoPlaces':'Pokaż fikcyjne miejsca DEMO',
'set.demoPlaces.help':'Pokazują stany danych (potwierdzone, sprzeczne, nieaktualne, brak). Wyłącz, by widzieć tylko prawdziwe miejsca.',
'set.account':'Konto',
'set.data':'Twoje dane',
'set.export':'Pobierz ustawienia (JSON)',
'set.import':'Wczytaj ustawienia z pliku',
'set.import.bad':'Plik nie wygląda na ustawienia z tej aplikacji.',
'set.import.ok':'Ustawienia wczytane.',
'set.favorites':'Zapisane miejsca: {n}',
'profile.step1':'Jak się poruszasz?',
'profile.step2':'Jaki masz sprzęt?',
'profile.step3':'Twoje granice',
'profile.step3.help':'Ruszaj suwakami. Trasy i oceny miejsc przeliczają się od razu.',
'profile.step4':'Co jeszcze jest ważne?',
'profile.preset.manual':'Wózek ręczny',
'profile.preset.manual.d':'Standardowa szerokość, radzi sobie z niskim krawężnikiem.',
'profile.preset.power':'Wózek elektryczny',
'profile.preset.power.d':'Cięższy i szerszy — ważne wąskie przejścia i nachylenia.',
'profile.preset.large':'Skuter lub duży wózek',
'profile.preset.large.d':'Potrzebuje szerokich wejść i płaskiego terenu.',
'profile.preset.single':'Wózek standardowy',
'profile.preset.single.d':'Typowy wózek spacerowy lub gondola.',
'profile.preset.twin':'Bliźniaczy lub szeroki',
'profile.preset.twin.d':'Szerszy — kłopot z wąskimi drzwiami i przejściami.',
'profile.preset.light':'Lekka spacerówka',
'profile.preset.light.d':'Łatwo wnieść po 1–2 stopniach, ale nie z ciężkim dzieckiem.',
'profile.preset.custom':'Własne ustawienia',
'profile.preset.apply':'Wybierz: {name}',
'profile.summary':'Co to oznacza',
'profile.summary.text':'Omijam schody i krawężniki wyższe niż {kerb} cm. Potrzebuję przejść szerszych niż {width} cm i unikam podejść stromszych niż {incline}%.',
'profile.summary.cobbles':' Staram się unikać kostki brukowej.',
'profile.summary.toilet':' Szukam dostępnej toalety w pobliżu.',
'profile.summary.rest':' Chcę mieć miejsca do odpoczynku.',
'profile.preview':'Podgląd wyników w obszarze demonstracyjnym',
'profile.preview.n':'{n} {label}',
'profile.autosave':'Zmiany zapisują się od razu.',
'profile.done':'Gotowe — szukaj miejsc',
'profile.welcome':'Zacznijmy od Ciebie',
'tip.label':'Wyjaśnienie: {topic}',
'tip.kerb':'Krawężnik to pionowy uskok między chodnikiem a jezdnią. Obniżony krawężnik ma ok. 3 cm, „równo z jezdnią” to 0 cm, zwykły ok. 8–15 cm.',
'tip.width':'Najmniejsza szerokość drzwi lub przejścia, przez którą się mieścisz. Standardowe drzwi wejściowe mają ok. 90 cm, wewnętrzne 80 cm.',
'tip.incline':'Nachylenie w procentach: 8% to 8 cm w górę na każdy metr. Norma dla podjazdów to najwyżej 6–8%.',
'tip.cobbles':'Kostka brukowa jest nierówna: spowalnia, trzęsie i męczy. Trasa wybierze dłuższą drogę po gładkiej nawierzchni, jeśli taka jest w danych.',
'tip.toilet':'Pokażemy toalety oznaczone w OSM jako dostępne dla wózka — w obiekcie lub publiczne w promieniu 400 m.',
'tip.rest':'Ławki zmapowane w OSM w promieniu 150 m od miejsca.',
'tip.changing':'Przewijak w obiekcie lub w pobliskiej toalecie publicznej, jeśli jest zmapowany.',
'tip.preset':'Presety ustawiają typowe granice. Zawsze możesz je zmienić suwakami.',
'hint.kerb.0':'Tylko przejścia równo z jezdnią.',
'hint.kerb.3':'Obniżony krawężnik (ok. 3 cm).',
'hint.kerb.6':'Niski krawężnik; zwykły (8 cm i więcej) zostanie ominięty.',
'hint.kerb.10':'Prawie każdy krawężnik jest w porządku.',
'hint.width.65':'Bardzo wąskie przejścia są w porządku.',
'hint.width.80':'Mieścisz się w typowych drzwiach wewnętrznych (80 cm).',
'hint.width.90':'Potrzebujesz co najmniej standardowych drzwi wejściowych (90 cm).',
'hint.width.100':'Potrzebujesz szerokich drzwi i przejść.',
'hint.incline.5':'Tylko łagodne pochylenia (do 1:20).',
'hint.incline.8':'Typowy podjazd (do 1:12, czyli 8%).',
'hint.incline.12':'Dajesz radę na stromych podjazdach.',
'card.generated':'Wygenerowano {date} z danych OpenStreetMap i ZTP Kraków. To informacja pomocnicza, nie gwarancja.',
'card.print':'Drukuj lub zapisz jako PDF',
'card.close':'Zamknij kartę',
'card.legend':'Wiarygodność: potwierdzone = ma datę kontroli; zmapowane = wpis w OSM; mogło się zmienić = starszy niż 24 mies.; wywnioskowane = z obiektów w pobliżu.',
'reach.title':'Zasięg bez barier',
'reach.intro':'Dokąd dojdziesz stąd bez schodów i barier, według Twojego profilu — w czasie:',
'reach.minutes':'{n} min',
'reach.result':'W {min} min dojdziesz do {n} miejsc, z czego {fit} pasuje lub częściowo pasuje do Twojego profilu.',
'reach.result.zero':'W tym czasie nie dojdziesz stąd do żadnego zmapowanego miejsca bez bariery.',
'reach.stuck':'To miejsce jest odcięte od zmapowanej sieci chodników — zasięgu nie da się wyliczyć.',
'reach.show':'Zasięg jest zaznaczony na mapie.',
'reach.clear':'Ukryj zasięg',
'reach.caveat':'Liczone po zmapowanych chodnikach. Niezmapowane przejścia mogą skrócić lub wydłużyć realny zasięg.',
'dash.title':'Panel urzędu',
'dash.intro':'Jakość i kompletność danych o dostępności — wyliczona na żywo z otwartych źródeł. Bez ręcznego utrzymywania bazy przez miasto.',
'dash.role':'Dostępne tylko dla roli „Pracownik urzędu”. Zaloguj się kontem demo, aby zobaczyć panel.',
'dash.kpi.places':'Miejsc w obszarze',
'dash.kpi.entrance':'Z opisanym wejściem',
'dash.kpi.fresh':'Z danymi nie starszymi niż 24 mies.',
'dash.kpi.verified':'Potwierdzone datą kontroli',
'dash.kpi.stops':'Przystanki z danymi przewoźnika o dostępności',
'dash.kpi.stopsOsm':'Przystanki opisane przez społeczność (OSM)',
'dash.kpi.pending':'Zgłoszenia czekające na decyzję',
'dash.insight':'Wniosek: oficjalny strumień GTFS ZTP nie zawiera informacji o dostępności żadnego przystanku w tym obszarze ({n} z {total}), a społeczność OSM opisała {osm}. Najtańsza poprawa to uzupełnienie pola wheelchair_boarding w danych przewoźnika.',
'dash.gaps':'Luki w danych według rodzaju miejsca',
'dash.gaps.cat':'Rodzaj',
'dash.gaps.total':'Miejsca',
'dash.gaps.known':'Opisane',
'dash.gaps.stale':'Nieaktualne',
'dash.gaps.unknown':'Brak danych',
'dash.gaps.caption':'Udział miejsc w kategorii według stanu wiedzy o wejściu.',
'dash.hot':'Co naprawić najpierw: przejścia dla pieszych',
'dash.hot.intro':'Przejścia z wysokim krawężnikiem albo nieznaną jego wysokością, uszeregowane według liczby miejsc i przystanków w promieniu 120 m. Dane pochodzą z OSM.',
'dash.hot.rank':'Miejsce w rankingu',
'dash.hot.kerbRaised':'Wysoki krawężnik',
'dash.hot.kerbUnknown':'Wysokość nieznana',
'dash.hot.near':'Miejsc i przystanków w pobliżu: {n}',
'dash.hot.show':'Pokaż na mapie',
'dash.hot.none':'Brak danych do rankingu.',
'dash.queue':'Kolejka zgłoszeń od użytkowników',
'dash.queue.intro':'Zgłoszenia są niezweryfikowane. Po zaakceptowaniu uzyskują poziom „potwierdzone” i źródło „urząd”. Odrzucone znikają z ocen.',
'dash.queue.empty':'Brak zgłoszeń do rozpatrzenia.',
'dash.queue.accept':'Zatwierdź',
'dash.queue.reject':'Odrzuć',
'dash.queue.decided':'Rozpatrzone: {n}',
'dash.queue.place':'Miejsce',
'dash.queue.status.accepted':'zatwierdzone',
'dash.queue.status.rejected':'odrzucone',
'dash.demand':'Gdzie brakuje danych, a ludzie szukają',
'dash.demand.intro':'Miejsca często otwierane przez użytkowników, dla których ocena jest „za mało danych”. Licznik jest anonimowy i lokalny (bez identyfikatorów). W produkcji agregowany po stronie serwera z progiem minimalnej liczby osób.',
'dash.demand.none':'Na razie brak sygnałów. Otwórz kilka miejsc na liście, a pojawią się tutaj.',
'dash.demand.views':'otwarć: {n}',
'dash.export':'Eksport otwartych danych',
'dash.export.intro':'Dane wyliczone z OSM i ZTP, gotowe do publikacji lub wczytania w innych systemach (licencja ODbL — zachowaj oznaczenie źródła).',
'dash.export.csv':'Pobierz CSV',
'dash.export.geojson':'Pobierz GeoJSON',
'dash.export.done':'Plik przygotowany: {name}',
'route.presets.note':'Prawdziwe miejsca z danych OSM — przy zmianie profilu wynik się zmienia.',
'dash.hot.mapBanner':'Na mapie: priorytetowe przejścia z rankingu urzędu ({n}).',
'dash.hot.clear':'Ukryj ranking na mapie',
'verdict.missing':'Brakuje danych o: {list}.',
'dash.hot.more':'jeszcze {n} podobnych na tej ulicy',
'route.alt.alt2':'Inna droga (blisko najkrótszej)',
'route.alt.recommended':'Zalecana',
'route.alt.base':'punkt odniesienia',
'route.alt.overhead':'+{m} m, +{min} min względem najkrótszej',
'route.alt.clean':'Bez zmapowanych trudności',
'route.alt.hard':'Bariery: {n}',
'route.alt.caution':'Uwagi: {n}',
'route.alt.unknown':'Nieznane punkty: {n}',
'route.alt.warn':'Wybrany wariant ma bariery nie do pokonania w Twoim profilu ({n}).',
'route.alt.showRec':'Pokaż zalecaną',
'rep.evidence':'Dowody (opcjonalnie)',
'rep.evidence.help':'Zdjęcie i pomiar pomagają urzędowi szybciej zweryfikować zgłoszenie.',
'rep.photo.take':'Zrób zdjęcie',
'rep.photo.choose':'Wybierz z galerii',
'rep.photo.remove':'Usuń',
'rep.photo.error':'Nie udało się wczytać zdjęcia.',
'rep.photo.alt':'Podgląd dodanego zdjęcia',
'rep.photo.processed':'Zdjęcie zmniejszone, bez danych o lokalizacji (EXIF usunięty).',
'rep.photo.privacy':'Nie fotografuj twarzy ani tablic rejestracyjnych. Zdjęcie zostaje na tym urządzeniu w prototypie.',
'rep.measure.kerb':'Wysokość stopnia lub krawężnika',
'rep.measure.incline':'Nachylenie podjazdu',
'rep.measure.kerb.tool':'Zmierz na zdjęciu',
'rep.measure.incline.tool':'Zmierz telefonem',
'rep.measure.manual':'Wpisz zmierzoną wartość',
'rep.measure.manual.cm':'np. 12 (cm)',
'rep.measure.manual.pct':'np. 9 (%)',
'rep.measure.manual.use':'Użyj wartości',
'rep.measure.lidar':'Pomiar LiDAR iPhone’a wymaga aplikacji natywnej — przeglądarka nie ma do niego dostępu. Model danych jest na to przygotowany.',
'rep.ai.note':'Po wysłaniu zgłoszenie dostaje wstępną ocenę automatyczną, a decyzję zawsze podejmuje pracownik urzędu.',
'measure.use':'Użyj tej wartości',
'measure.incline.title':'Nachylenie telefonem',
'measure.incline.s1':'Połóż telefon ekranem do góry na podjeździe, wzdłuż kierunku spadku.',
'measure.incline.s2':'Dla dokładności najpierw wyzeruj telefon na równym podłożu.',
'measure.incline.s3':'Poczekaj, aż wartość się ustabilizuje, i użyj jej.',
'measure.incline.start':'Włącz czujniki',
'measure.incline.zero':'Wyzeruj tutaj (poziom)',
'measure.incline.denied':'Brak zgody na czujniki ruchu. Zezwól w ustawieniach przeglądarki albo wpisz wartość ręcznie.',
'measure.incline.none':'Przeglądarka nie dostarcza danych z czujników ruchu (np. komputer, albo czujniki są wyłączone). Na iPhonie sprawdź Ustawienia → Safari → Ruch i orientacja. Możesz też wpisać wartość ręcznie.',
'measure.kerb.title':'Pomiar wysokości na zdjęciu',
'measure.kerb.intro':'Połóż obok krawężnika przedmiot o znanym wymiarze (np. kartę płatniczą) i zrób zdjęcie z boku, na wprost. Dotknij dwóch końców przedmiotu, potem dolnej i górnej krawędzi stopnia.',
'measure.kerb.tapRef':'Krok 1: dotknij dwóch końców przedmiotu odniesienia (niebieska linia).',
'measure.kerb.tapKerb':'Krok 2: dotknij dolnej i górnej krawędzi stopnia (żółta linia).',
'measure.kerb.done':'Gotowe. Sprawdź wynik albo zacznij od nowa.',
'measure.kerb.reset':'Zacznij od nowa',
'measure.kerb.canvas':'Zdjęcie do pomiaru: dotykaj punktów, aby je zaznaczyć',
'measure.kerb.caveat':'Dokładność ok. ±1–2 cm, o ile zdjęcie jest zrobione na wprost i przedmiot leży w tej samej płaszczyźnie co stopień. Wpisz wartość ręcznie, jeśli masz miarkę.',
'measure.kerb.needPhoto':'Najpierw dodaj zdjęcie, potem zmierz na nim wysokość.',
'vet.measure.kerb':'Wysokość',
'vet.measure.incline':'Nachylenie',
'vet.method.photo-ref':'ze zdjęcia',
'vet.method.inclinometer':'telefonem',
'vet.method.manual':'ręcznie',
'vet.method.lidar':'LiDAR',
'vet.label.steps':'schody',
'vet.label.raisedKerb':'wysoki krawężnik',
'vet.label.loweredKerb':'obniżony krawężnik',
'vet.label.ramp':'podjazd',
'vet.label.flat':'wejście na równo',
'vet.label.narrowDoor':'wąskie drzwi',
'vet.label.cobbles':'kostka brukowa',
'vet.label.lift':'winda',
'vet.label.face':'twarz',
'vet.label.text':'tekst / zrzut ekranu',
'vet.label.unrelated':'coś niezwiązanego',
'vet.r.top':'Na zdjęciu: {label} ({pct}%).',
'vet.r.noPhoto':'Brak zdjęcia — ocena tylko z deklaracji i pomiaru.',
'vet.r.blurry':'Zdjęcie jest nieostre.',
'vet.r.face':'Na zdjęciu może być twarz — wymaga ochrony danych osobowych.',
'vet.r.text':'Zdjęcie wygląda na zrzut ekranu lub dokument.',
'vet.r.unrelated':'Zdjęcie wygląda na niezwiązane z dostępnością.',
'vet.skipped':'Ocena automatyczna pominięta (połączenie mobilne). Zgłoszenie trafi do urzędu bez wstępnej oceny.',
'vet.metered':'Ocena zdjęcia pobiera model AI (ok. 90 MB). Masz połączenie mobilne lub tryb oszczędzania danych. Pobrać teraz? Anuluj = wyślij zgłoszenie bez oceny.',
'guide.start.help':'Nawigacja na żywo po GPS: wskazówki skrętów i ostrzeżenia o barierach na górze ekranu.',
'guide.gmaps':'Otwórz w Google Maps',
'guide.apple':'Apple Maps',
'guide.mapsNote':'Aplikacje map nie znają Twoich limitów i mogą zmienić trasę. Punkty pośrednie trzymają ją blisko naszej, ale sprawdzaj bariery na ekranie.',
'guide.active':'Nawigacja na żywo',
'guide.stop':'Zakończ',
'guide.voice':'Głos',
'guide.demo':'Symulacja GPS',
'guide.simOn':'Tryb demo: pozycja jest symulowana wzdłuż trasy.',
'guide.waiting':'Czekam na sygnał GPS…',
'guide.noGps':'Ta przeglądarka nie udostępnia GPS. Włącz symulację GPS.',
'guide.denied':'Brak zgody na lokalizację. Zezwól w ustawieniach przeglądarki albo użyj symulacji.',
'guide.next':'Za {d} m: {action}{name}',
'guide.straight':'Idź prosto jeszcze {d} m',
'guide.arrived':'Jesteś u celu',
'guide.off':'Zboczyłeś z trasy',
'guide.reroute':'Wyznacz od nowa stąd',
'guide.barrier':'Uwaga za {d} m: {what}',
'guide.remaining':'Zostało {km} km · ok. {min} min',
'guide.you':'Twoja pozycja',
'map.layer':'Warstwa mapy',
'map.layer.map':'Mapa',
'map.layer.sat':'Satelita',
'guide.voice.off':'Głos: wyłączony',
'guide.voice.all':'Głos: skręty i ostrzeżenia',
'guide.voice.warn':'Głos: tylko ostrzeżenia',
'voice.turn':'Za {d} metrów {turn}',
'voice.barrier':'Uwaga, {what}, za {d} metrów',
'voice.off':'Zboczyłeś z trasy',
'voice.arrived':'Jesteś u celu',
'voice.onAll':'Głos włączony: skręty i ostrzeżenia',
'voice.onWarn':'Głos włączony: tylko ostrzeżenia',
'measure.incline.insecure':'Czujniki ruchu działają w przeglądarce tylko przez bezpieczne połączenie (HTTPS). Otwórz aplikację pod adresem https://… (nie http:// ani adres IP w sieci lokalnej) albo wpisz wartość ręcznie.',
'f.surface.rough':'Surface: {surface} — rough; slower and more tiring to travel on.',
'f.surface.unknown':'No data about the surface outside.',
'f.toilet.own.yes':'Toilet in the venue is tagged as wheelchair accessible.',
'f.toilet.own.no':'Toilet in the venue is tagged as not wheelchair accessible.',
'f.toilet.near':'Accessible public toilet about {d} m away.',
'f.toilet.fee':'The toilet is paid.',
'f.toilet.nearUnknown':'Public toilet about {d} m away, but its wheelchair access is unknown.',
'f.toilet.none':'No data about an accessible toilet.',
'f.rest.ok':'Mapped benches nearby: {n}, nearest about {d} m.',
'f.rest.none':'No benches mapped within 150 m.',
'f.rest.noneHint':'Unmapped ones may exist.',
'f.changing.yes':'Baby-changing table tagged in the venue.',
'f.changing.no':'No baby-changing table (tagged in OSM).',
'f.changing.near':'Baby-changing table in a public toilet about {d} m away.',
'f.changing.none':'No data about a baby-changing table.',
'raw':'{text}',
'surface.sett':'setts (cobbles)',
'surface.cobblestone':'cobblestone',
'surface.unhewn_cobblestone':'rough cobblestone',
'surface.paving_stones':'paving slabs',
'surface.asphalt':'asphalt',
'surface.concrete':'concrete',
'surface.paved':'paved',
'surface.concrete:plates':'concrete plates',
'surface.concrete:lanes':'concrete lanes',
'surface.compacted':'compacted',
'surface.fine_gravel':'fine gravel',
'surface.gravel':'gravel',
'surface.wood':'wood',
'surface.dirt':'dirt',
'surface.ground':'ground',
'surface.grass':'grass',
'surface.unpaved':'unpaved',
'surface.stone':'stone',
'surface.rock':'rock',
'surface.metal':'metal',
'surface.metal_grid':'metal grating',
'surface.tiles':'tiles',
'surface.sand':'sand',
'surface.pebblestone':'pebbles',
'detail.back':'Back to the list',
'detail.routeTo':'Route to this place',
'detail.openOsm':'View on OpenStreetMap',
'detail.refresh':'Refresh from OSM',
'detail.refreshing':'Fetching…',
'detail.refreshed':'Refreshed from OpenStreetMap: {time}.',
'detail.refreshFail':'Could not reach OpenStreetMap. You are seeing the snapshot from {date}. A failed refresh does not mean the data is current.',
'detail.refreshDemo':'This place is a sample — it does not exist in OpenStreetMap.',
'detail.demo':'DEMO',
'detail.demoNote':'Fictional place showing the data state: “{state}”.',
'detail.facts':'Accessibility details',
'detail.reports':'User reports',
'detail.reports.none':'No reports.',
'detail.reports.note':'Reports are unverified and kept apart from OSM data. In this prototype they are stored on this device only.',
'detail.reports.demo':'sample',
'detail.reports.remove':'Remove report',
'rep.title':'Report a correction or addition',
'rep.attr':'What the report is about',
'rep.attr.entrance':'Entrance accessibility',
'rep.attr.steps':'Steps at the entrance',
'rep.attr.width':'Entrance width',
'rep.attr.toilet':'Wheelchair-accessible toilet',
'rep.attr.ramp':'Ramp or lift',
'rep.value':'What you found on site',
'rep.yes':'Yes',
'rep.limited':'Partly',
'rep.no':'No',
'rep.widthLabel':'Width in centimetres',
'rep.note':'Note (optional)',
'rep.submit':'Save report',
'rep.cancel':'Cancel',
'rep.thanks':'Report saved. It is marked as unverified.',
'rep.widthInvalid':'Enter a width between 30 and 300 cm.',
'rep.disclaimer':'We collect no personal data. A report contains only what you type.',
'route.title':'Plan a route',
'route.intro':'The route avoids steps, high kerbs and steep sections for your profile. Missing data about a section is not treated as confirmation that it is accessible.',
'route.from':'From',
'route.to':'To',
'route.placeholder':'Start typing a place name',
'route.swap':'Swap start and destination',
'route.go':'Find route',
'route.myLocation':'Use my location',
'route.locating':'Finding your location…',
'route.locOut':'You are outside the demo area (Old Town, Kazimierz, Wawel).',
'route.locFail':'Could not get your location. Type a starting point.',
'route.presets':'Example routes',
'route.unknownPlace':'No place found for “{text}”. Pick one of the suggestions.',
'route.same':'Start and destination are the same.',
'route.blocked.long':'In the mapped data every way goes through a barrier beyond your limits. We show the best attempt with the barriers marked — do not treat it as accessible.',
'route.none':'No route in the available data',
'route.none.no-start':'The start is too far from mapped footpaths.',
'route.none.no-end':'The destination is too far from mapped footpaths.',
'route.none.disconnected':'The mapped data has no connection between these points.',
'route.summary':'{km} km · about {min} min (estimate)',
'route.quality':'Surface known for {pct}% of the route.',
'route.unknownKerbs':'Crossings with unknown kerb height: {n}.',
'route.barriers':'Barriers and notes on the route',
'route.barriers.none':'No mapped barriers — but the data has gaps.',
'route.steps':'Route as text',
'route.focus':'Show on map',
'route.legend':'Solid line — no barriers, dashed — caution, dotted — barrier.',
'route.start':'Start',
'route.end':'Destination',
'route.estimate':'Time is an estimate at a relaxed pace; it ignores traffic lights and crowds.',
'map.offline':'You are offline — map tiles may not load; place data works offline.',
'about.title':'About the data and the project',
'about.intro':'The tool shows accessibility details from open sources, not a blanket “accessible / not accessible”. Every piece of information has a source, a date and a reliability level.',
'about.data':'Data sources and their reliability',
'about.data.body1':'The map, places, steps, kerbs, surfaces, benches and toilets come from OpenStreetMap (ODbL licence, attribution required). We fetch them through the public Overpass API for the demo area and keep a dated snapshot in the app.',
'about.data.body2':'The date next to a fact is the last edit of the object in OSM unless there is a survey date (check_date, survey:date). An edit may not have touched the accessibility tags — so without a survey date we never call data “confirmed”.',
'about.data.body3':'City data: stops come from the official ZTP Kraków GTFS feed (the wheelchair_boarding field). It currently says “no information” for every stop in the area — we show that plainly and fill in with the OSM community’s description. More datasets (Kraków Open Data, MSIP) are more adapters; each licence must be checked before use.',
'about.missing':'What you see when data is missing or conflicting',
'about.missing.body':'Missing information is shown as “No data” with a grey question-mark icon — never as accessibility. When a user report contradicts OSM, the place gets “Conflicting data” and both positions are visible. When the source cannot be refreshed you see the date of the last snapshot and a warning.',
'about.arch':'Architecture and adding cities',
'about.arch.body':'Three layers: (1) source adapters (OSM, user reports, later city data), (2) normalisation into one fact model {value, source, date, reliability}, (3) profile-aware presentation. A new city is configuration: a geographic area and a list of adapters — no interface changes. New place categories go in a single table.',
'about.refresh':'Updating and correcting data',
'about.refresh.body':'A script rebuilds the snapshot (npm: data:build), and a single place can be refreshed live from Overpass. Wrong data is fixed in OSM, and in the app by a report that is clearly marked unverified. In production reports go to a moderation queue and, once two independent people confirm, to OSM.',
'about.privacy':'Privacy and security',
'about.privacy.body':'We do not ask about disability — only barrier preferences. Profile and reports are stored locally on the device. No accounts, no analytics. Location (optional) is used only in the browser. Connections to the map and APIs are encrypted (HTTPS).',
'about.a11y':'Accessibility of the app itself',
'about.a11y.body':'Target: WCAG 2.2 AA. Done: full keyboard operation, visible focus, contrast from the USWDS system, information never by colour alone (icon + text), list and text route as equivalent of the map, barrier markers as buttons. To improve: picking a place directly on the map is not keyboard accessible (use the list), not tested with screen readers on every platform, no dedicated high-contrast mode beyond system settings.',
'about.biz':'Business model and scaling',
'about.biz.body':'Free app for residents and tourists. Revenue from B2B: (1) an “venue accessibility” widget and report for hotels, event organisers and property managers, (2) an accessibility API for booking systems and travel apps, (3) a roll-out package for cities. Costs are static hosting, periodic Overpass pulls and report moderation. The operating entity owns the product, not the city office.',
'about.limits.body':'Area: Old Town, Kazimierz, Wawel. Sign-in and reports are demo-only and local (no server). City data covers stops only for now. Kerb height is known for only some crossings. Entrance width is almost never mapped. Walking times are estimates. OSM tile servers are fine for a demo — production needs its own tile provider.',
'src.city-review':'Verified by the city office (demo)',
'f.entrance.cityNone':'The operator gives no information about this stop’s accessibility.',
'f.entrance.cityNoneHint':'In the official ZTP data the “wheelchair_boarding” field says “no information”. That does not mean the stop is inaccessible, nor that it is accessible.',
'auth.intro':'This is a demo sign-in. There are no passwords and no server — pick a demo account. Profile and settings are saved only in this browser, separately for each account.',
'auth.demoBadge':'DEMO ACCOUNT',
'auth.guest':'Continue without an account',
'auth.guest.hint':'Settings are still remembered on this device.',
'auth.signIn':'Sign in as {name}',
'auth.signOut':'Sign out',
'auth.signedInAs':'Signed in: {name}',
'auth.role.user':'Resident',
'auth.role.official':'City official',
'auth.role.guest':'Guest',
'auth.anna':'Anna Kowalska',
'auth.anna.desc':'Resident who uses a manual wheelchair.',
'auth.piotr':'Piotr Nowak',
'auth.piotr.desc':'Parent walking with a child in a stroller.',
'auth.official.note':'The official role unlocks the “City panel”. In production: sign-in through the office account (SSO).',
'set.title':'Settings',
'set.saved':'Saved automatically on this device.',
'set.display':'Appearance and readability',
'set.textSize':'Text size',
'set.textSize.100':'Standard',
'set.textSize.125':'Larger',
'set.textSize.150':'Largest',
'set.contrast':'High contrast',
'set.contrast.help':'Stronger borders and darker text.',
'set.motion':'Reduce map animation',
'set.language':'Language',
'set.demoPlaces':'Show fictional DEMO places',
'set.demoPlaces.help':'They show data states (confirmed, conflicting, outdated, missing). Turn off to see real places only.',
'set.account':'Account',
'set.data':'Your data',
'set.export':'Download settings (JSON)',
'set.import':'Load settings from a file',
'set.import.bad':'The file does not look like settings from this app.',
'set.import.ok':'Settings loaded.',
'set.favorites':'Saved places: {n}',
'profile.step1':'How do you get around?',
'profile.step2':'What equipment do you have?',
'profile.step3':'Your limits',
'profile.step3.help':'Move the sliders. Routes and place ratings recalculate straight away.',
'profile.step4':'What else matters?',
'profile.preset.manual':'Manual wheelchair',
'profile.preset.manual.d':'Standard width, copes with a low kerb.',
'profile.preset.power':'Powered wheelchair',
'profile.preset.power.d':'Heavier and wider — narrow passages and slopes matter.',
'profile.preset.large':'Scooter or large chair',
'profile.preset.large.d':'Needs wide entrances and level ground.',
'profile.preset.single':'Standard stroller',
'profile.preset.single.d':'A typical pushchair or carrycot.',
'profile.preset.twin':'Twin or wide',
'profile.preset.twin.d':'Wider — trouble with narrow doors and passages.',
'profile.preset.light':'Lightweight stroller',
'profile.preset.light.d':'Easy to lift over 1–2 steps, but not with a heavy child.',
'profile.preset.custom':'Custom settings',
'profile.preset.apply':'Choose: {name}',
'profile.summary':'What this means',
'profile.summary.text':'I avoid steps and kerbs higher than {kerb} cm. I need passages wider than {width} cm and avoid slopes steeper than {incline}%.',
'profile.summary.cobbles':' I try to avoid cobblestones.',
'profile.summary.toilet':' I look for an accessible toilet nearby.',
'profile.summary.rest':' I want places to rest.',
'profile.summary.changing':' I need a baby-changing table.',
'profile.preview':'Preview of results in the demo area',
'profile.preview.n':'{n} {label}',
'profile.autosave':'Changes are saved straight away.',
'profile.done':'Done — find places',
'profile.welcome':'Let’s start with you',
'tip.label':'Explanation: {topic}',
'tip.kerb':'A kerb is the vertical step between pavement and road. A lowered kerb is about 3 cm, “flush” is 0 cm, a normal one about 8–15 cm.',
'tip.width':'The narrowest door or passage you fit through. Standard entrance doors are about 90 cm, interior doors 80 cm.',
'tip.incline':'Slope in percent: 8% is 8 cm up for every metre. Ramp guidelines say 6–8% at most.',
'tip.cobbles':'Cobblestones are bumpy: slow, jarring and tiring. The route picks a longer way on smooth surface when the data has one.',
'tip.toilet':'We show toilets tagged in OSM as wheelchair accessible — in the venue or public within 400 m.',
'tip.rest':'Benches mapped in OSM within 150 m of the place.',
'tip.changing':'A changing table in the venue or in a nearby public toilet, if mapped.',
'tip.preset':'Presets set typical limits. You can always change them with the sliders.',
'hint.kerb.0':'Only crossings flush with the road.',
'hint.kerb.3':'Lowered kerb (about 3 cm).',
'hint.kerb.6':'Low kerb; a normal one (8 cm and up) is avoided.',
'hint.kerb.10':'Almost any kerb is fine.',
'hint.width.65':'Very narrow passages are fine.',
'hint.width.80':'You fit typical interior doors (80 cm).',
'hint.width.90':'You need at least a standard entrance door (90 cm).',
'hint.width.100':'You need wide doors and passages.',
'hint.incline.5':'Gentle slopes only (up to 1:20).',
'hint.incline.8':'A typical ramp (up to 1:12, i.e. 8%).',
'detail.reach':'What is within barrier-free reach?',
'cat.transit.long':'Stops',
'card.title':'Access card',
'card.for':'Rating for profile: {profile}',
'card.generated':'Generated {date} from OpenStreetMap and ZTP Kraków data. Guidance only, not a guarantee.',
'card.print':'Print or save as PDF',
'card.close':'Close card',
'card.legend':'Reliability: confirmed = has a survey date; mapped = OSM entry; may have changed = older than 24 months; inferred = from nearby objects.',
'reach.title':'Barrier-free reach',
'reach.intro':'Where you can get from here without steps or barriers, for your profile — within:',
'reach.minutes':'{n} min',
'reach.result':'In {min} min you can reach {n} places, {fit} of which fit or partly fit your profile.',
'reach.result.zero':'In that time you cannot reach any mapped place from here without a barrier.',
'reach.stuck':'This place is cut off from the mapped footpath network — reach cannot be computed.',
'reach.show':'Reach is drawn on the map.',
'reach.clear':'Hide reach',
'reach.caveat':'Computed over mapped footpaths. Unmapped crossings may shorten or extend the real reach.',
'dash.title':'City panel',
'dash.intro':'Quality and completeness of accessibility data — computed live from open sources. No manual database upkeep by the city.',
'dash.role':'Available only to the “City official” role. Sign in with the demo account to see the panel.',
'dash.kpi.places':'Places in the area',
'dash.kpi.entrance':'With a described entrance',
'dash.kpi.fresh':'With data no older than 24 months',
'dash.kpi.verified':'Confirmed by a survey date',
'dash.kpi.stops':'Stops with operator accessibility data',
'dash.kpi.stopsOsm':'Stops described by the community (OSM)',
'dash.kpi.pending':'Reports awaiting a decision',
'dash.insight':'Finding: the official ZTP GTFS feed has no accessibility information for any stop in this area ({n} of {total}), while the OSM community described {osm}. The cheapest improvement is to fill the wheelchair_boarding field in the operator’s data.',
'dash.gaps':'Data gaps by type of place',
'dash.gaps.cat':'Type',
'dash.gaps.total':'Places',
'dash.gaps.known':'Described',
'dash.gaps.stale':'Outdated',
'dash.gaps.unknown':'No data',
'dash.gaps.caption':'Share of places in each category by what is known about the entrance.',
'dash.hot':'Fix first: pedestrian crossings',
'dash.hot.intro':'Crossings with a high kerb or an unknown kerb height, ranked by the number of places and stops within 120 m. Data comes from OSM.',
'dash.hot.rank':'Rank',
'dash.hot.kerbRaised':'High kerb',
'dash.hot.kerbUnknown':'Height unknown',
'dash.hot.near':'Places and stops nearby: {n}',
'dash.hot.show':'Show on map',
'dash.hot.none':'No data to rank.',
'dash.queue':'Queue of user reports',
'dash.queue.intro':'Reports are unverified. Once approved they become “confirmed” with the source “city office”. Rejected ones drop out of ratings.',
'dash.queue.empty':'No reports to review.',
'dash.queue.accept':'Approve',
'dash.queue.reject':'Reject',
'dash.queue.decided':'Reviewed: {n}',
'dash.queue.place':'Place',
'dash.queue.status.accepted':'approved',
'dash.queue.status.rejected':'rejected',
'dash.demand':'Where data is missing and people look',
'dash.demand.intro':'Places users open often whose rating is “not enough data”. The counter is anonymous and local (no identifiers). In production it is aggregated server-side with a minimum-people threshold.',
'dash.demand.none':'No signals yet. Open a few places from the list and they will appear here.',
'dash.demand.views':'opens: {n}',
'dash.export':'Open data export',
'dash.export.intro':'Data computed from OSM and ZTP, ready to publish or load into other systems (ODbL licence — keep the source attribution).',
'dash.export.csv':'Download CSV',
'dash.export.geojson':'Download GeoJSON',
'dash.export.done':'File prepared: {name}',
'route.presets.note':'Real places from OSM data — the result changes with your profile.',
'dash.hot.mapBanner':'On the map: priority crossings from the city ranking ({n}).',
'dash.hot.clear':'Hide ranking on map',
'verdict.missing':'Missing data about: {list}.',
'dash.hot.more':'{n} more like it on this street',
'route.alt.title':'Route options',
'route.alt.pick':'Choose a route option',
'route.alt.shortest':'Shortest',
'route.alt.balanced':'Balanced (for your profile)',
'route.alt.strict':'Fewest difficulties',
'route.alt.alt':'Different way',
'route.alt.alt2':'Different way (near-shortest)',
'route.alt.recommended':'Recommended',
'route.alt.base':'baseline',
'route.alt.overhead':'+{m} m, +{min} min vs shortest',
'route.alt.clean':'No mapped difficulties',
'route.alt.hard':'Barriers: {n}',
'route.alt.caution':'Cautions: {n}',
'route.alt.unknown':'Unknown points: {n}',
'route.alt.warn':'The selected option has barriers you cannot pass with your profile ({n}).',
'route.alt.showRec':'Show the recommended one',
'rep.evidence':'Evidence (optional)',
'rep.evidence.help':'A photo and a measurement help the city office verify the report faster.',
'rep.photo.take':'Take a photo',
'rep.photo.choose':'Choose from gallery',
'rep.photo.remove':'Remove',
'rep.photo.error':'Could not read the photo.',
'rep.photo.alt':'Preview of the attached photo',
'rep.photo.processed':'Photo downscaled, location data (EXIF) removed.',
'rep.photo.privacy':'Do not photograph faces or number plates. In the prototype the photo stays on this device.',
'rep.measure.kerb':'Height of the step or kerb',
'rep.measure.incline':'Ramp slope',
'rep.measure.kerb.tool':'Measure on the photo',
'rep.measure.incline.tool':'Measure with the phone',
'rep.measure.manual':'Enter a measured value',
'rep.measure.manual.cm':'e.g. 12 (cm)',
'rep.measure.manual.pct':'e.g. 9 (%)',
'rep.measure.manual.use':'Use value',
'rep.measure.lidar':'iPhone LiDAR measuring needs a native app — browsers cannot access it. The data model is ready for it.',
'rep.ai.note':'After sending, the report gets an automatic first assessment; a city official always makes the decision.',
'measure.use':'Use this value',
'measure.incline.title':'Slope with the phone',
'measure.incline.s1':'Lay the phone screen-up on the ramp, along the direction of the slope.',
'measure.incline.s2':'For accuracy, first zero the phone on level ground.',
'measure.incline.s3':'Wait for the value to settle, then use it.',
'measure.incline.start':'Enable sensors',
'measure.incline.zero':'Zero here (level)',
'measure.incline.denied':'Motion sensor permission was denied. Allow it in browser settings or enter the value by hand.',
'measure.incline.none':'The browser delivers no motion-sensor data (e.g. a computer, or sensors are turned off). On iPhone check Settings → Safari → Motion & Orientation Access. You can also enter the value by hand.',
'measure.kerb.title':'Height from a photo',
'measure.kerb.intro':'Lay an object of known size (e.g. a bank card) next to the kerb and photograph it side-on. Tap the two ends of the object, then the bottom and top edge of the step.',
'measure.kerb.ref':'Reference object',
'measure.kerb.refCm':'Length in cm',
'measure.ref.card':'Bank card (long side)',
'measure.ref.a4short':'A4 sheet (short side)',
'measure.ref.a4long':'A4 sheet (long side)',
'measure.ref.ruler':'Ruler',
'measure.ref.custom':'Other length',
'measure.kerb.tapRef':'Step 1: tap the two ends of the reference object (blue line).',
'measure.kerb.tapKerb':'Step 2: tap the bottom and top edge of the step (yellow line).',
'measure.kerb.done':'Done. Check the result or start over.',
'measure.kerb.reset':'Start over',
'measure.kerb.canvas':'Photo to measure on: tap points to mark them',
'measure.kerb.caveat':'Accuracy about ±1–2 cm if the photo is taken square-on and the object lies in the same plane as the step. Enter the value by hand if you have a tape measure.',
'measure.kerb.needPhoto':'Add a photo first, then measure the height on it.',
'vet.measure.kerb':'Height',
'vet.measure.incline':'Slope',
'vet.method.photo-ref':'from photo',
'vet.method.inclinometer':'phone sensor',
'vet.method.manual':'by hand',
'vet.method.lidar':'LiDAR',
'vet.label.steps':'steps',
'vet.label.raisedKerb':'high kerb',
'vet.label.loweredKerb':'lowered kerb',
'vet.label.ramp':'ramp',
'vet.label.flat':'level entrance',
'vet.label.narrowDoor':'narrow door',
'vet.label.cobbles':'cobblestones',
'vet.label.lift':'lift',
'vet.label.face':'face',
'vet.label.text':'text / screenshot',
'vet.label.unrelated':'something unrelated',
'vet.r.top':'In the photo: {label} ({pct}%).',
'vet.r.noPhoto':'No photo — assessed from the claim and measurement only.',
'vet.r.blurry':'The photo is blurry.',
'vet.r.face':'The photo may show a face — personal data needs protecting.',
'vet.r.text':'The photo looks like a screenshot or a document.',
'vet.r.unrelated':'The photo looks unrelated to accessibility.',
'vet.r.supports':'The photo supports the reporter’s claim.',
'vet.r.contradicts':'The photo contradicts the reporter’s claim.',
'vet.skipped':'Automatic assessment skipped (mobile connection). The report goes to the city office without a first look.',
'vet.metered':'Assessing the photo downloads an AI model (about 90 MB). You are on a mobile connection or data saver. Download now? Cancel = submit the report without the assessment.',
'guide.start.help':'Live GPS navigation: turn prompts and barrier warnings at the top of the screen.',
'guide.gmaps':'Open in Google Maps',
'guide.apple':'Apple Maps',
'guide.mapsNote':'Map apps do not know your limits and may change the route. Waypoints keep it close to ours, but watch for barriers on screen.',
'guide.active':'Live navigation',
'guide.stop':'End',
'guide.voice':'Voice',
'guide.demo':'Simulate GPS',
'guide.simOn':'Demo mode: position is simulated along the route.',
'guide.waiting':'Waiting for a GPS fix…',
'guide.noGps':'This browser exposes no GPS. Turn on GPS simulation.',
'guide.denied':'Location permission was denied. Allow it in browser settings or use the simulation.',
'guide.next':'In {d} m: {action}{name}',
'guide.straight':'Continue straight for {d} m',
'guide.arrived':'You have arrived',
'guide.off':'You are off the route',
'guide.reroute':'Re-route from here',
'guide.barrier':'Caution in {d} m: {what}',
'guide.remaining':'{km} km left · about {min} min',
'guide.you':'Your position',
'map.layer':'Map layer',
'map.layer.map':'Map',
'map.layer.sat':'Satellite',
'guide.voice.off':'Voice: off',
'guide.voice.all':'Voice: turns and warnings',
'guide.voice.warn':'Voice: warnings only',
'voice.turn':'In {d} metres, {turn}',
'voice.barrier':'Caution, {what}, in {d} metres',
'voice.off':'You are off the route',
'voice.arrived':'You have arrived',
'voice.onAll':'Voice on: turns and warnings',
'voice.onWarn':'Voice on: warnings only',
'measure.incline.insecure':'Motion sensors work in the browser only over a secure connection (HTTPS). Open the app at an https://… address (not http:// or a local-network IP) or enter the value by hand.',