diff --git a/client/src/components/Tours/poi/TourPoiChargingFacts.tsx b/client/src/components/Tours/poi/TourPoiChargingFacts.tsx index b2300941b..b0aa3bab0 100644 --- a/client/src/components/Tours/poi/TourPoiChargingFacts.tsx +++ b/client/src/components/Tours/poi/TourPoiChargingFacts.tsx @@ -28,11 +28,12 @@ const HOUSEHOLD_SOCKETS: ReadonlySet = new Set([ type Translate = ReturnType['t']; -/** OpenStreetMap's access values, read as one of three answers; any other is left unsaid. */ +/** OpenStreetMap's access values, read as one of four answers; any other is left unsaid. */ function accessLabel(access: string | null, t: Translate) { if (access === 'yes' || access === 'permissive' || access === 'public') return t('tours.poi.charging.access.public'); if (access === 'customers') return t('tours.poi.charging.access.customers'); - if (access === 'private' || access === 'no') return t('tours.poi.charging.access.private'); + if (access === 'private') return t('tours.poi.charging.access.private'); + if (access === 'no') return t('tours.poi.charging.access.none'); return null; } diff --git a/client/src/components/Tours/poi/TourPoiSearchNotices.tsx b/client/src/components/Tours/poi/TourPoiSearchNotices.tsx index f85362921..b97a5f59b 100644 --- a/client/src/components/Tours/poi/TourPoiSearchNotices.tsx +++ b/client/src/components/Tours/poi/TourPoiSearchNotices.tsx @@ -109,8 +109,11 @@ export function SearchNotices({ search, unit }: { search: TourPoiSearch; unit: U const searchedAll = answer.unavailable.length === 0 && !answer.partial && !search.outdated; const empty = answer.pois.length === 0 && searchedAll; // BIK-07: few chargers are tagged for bikes, so none found is said, not left to look like a fault. + // A cut answer may have lost them to the cut, which its own note already says. const noChargers = searchedAll && + !answer.truncated && + !answer.capped && search.categories.includes('ebike_charging') && !answer.pois.some((poi) => poi.category === 'ebike_charging'); return ( diff --git a/client/src/components/Tours/poi/tourPoiSearch.test.tsx b/client/src/components/Tours/poi/tourPoiSearch.test.tsx index 08dedb4ed..5037ba03d 100644 --- a/client/src/components/Tours/poi/tourPoiSearch.test.tsx +++ b/client/src/components/Tours/poi/tourPoiSearch.test.tsx @@ -768,5 +768,11 @@ describe('e-bike charging along a bike tour (BIK-07)', () => { fireEvent.click(screen.getByTestId('tour-poi-widen')); expect(await screen.findByText(/Could not be searched right now: E-bike charging/)).toBeInTheDocument(); expect(screen.queryByTestId('tour-poi-charging-few')).not.toBeInTheDocument(); + + // A cut answer may have lost the chargers to the cut: its own note says so, not few mapped. + search.mockResolvedValue({ ...ANSWER, truncated: true }); + fireEvent.click(screen.getByTestId('tour-poi-retry')); + expect(await screen.findByText(/There are more places than shown/)).toBeInTheDocument(); + expect(screen.queryByTestId('tour-poi-charging-few')).not.toBeInTheDocument(); }); }); diff --git a/server/src/nest/maps/maps.helpers.ts b/server/src/nest/maps/maps.helpers.ts index 3a70aad68..6afcaf1d1 100644 --- a/server/src/nest/maps/maps.helpers.ts +++ b/server/src/nest/maps/maps.helpers.ts @@ -364,16 +364,23 @@ interface BikeChargingInfo extends ChargingInfo { */ const BIKE_SOCKET_FAMILIES = ['schuko', 'typee', 'bs1363', 'sev1011_t13', 'sev1011_t23', 'cee_blue', 'type2'] as const; +function statesNone(raw: string | undefined): boolean { + return raw?.trim() === 'no' || Number.parseInt(raw ?? '', 10) === 0; +} + /** * What an e-bike charging point states, or null when it is not tagged for bicycles: * the search asks for `bicycle=yes|designated`, and a point read here without either - * is never passed off as one. Sockets, capacity and fee are read as on a car charger. + * is never passed off as one. Sockets, capacity and fee are read as on a car charger, + * except that a plug mapped as `no` or `0` is left out: a bike charger shows its plugs + * as compatibility, and an explicit "none" must not read as one. */ export function readBikeChargingInfo(tags: Record): BikeChargingInfo | null { const bicycle = tags.bicycle; if (bicycle !== 'yes' && bicycle !== 'designated') return null; + const families = BIKE_SOCKET_FAMILIES.filter((family) => !statesNone(tags[`socket:${family}`])); return { - sockets: readSockets(tags, BIKE_SOCKET_FAMILIES), + sockets: readSockets(tags, families), capacity: readCapacity(tags), fee: readFee(tags), bicycle, diff --git a/server/src/nest/maps/maps.mcp.ts b/server/src/nest/maps/maps.mcp.ts index 771c8fa30..034678c2c 100644 --- a/server/src/nest/maps/maps.mcp.ts +++ b/server/src/nest/maps/maps.mcp.ts @@ -130,7 +130,7 @@ export class MapsMcp { @Tool({ name: 'search_pois', description: - 'List points of interest of one category inside a map rectangle, with address, opening hours, website, phone and cuisine wherever the source carries them. Answers from the TREK place index where it can and from OpenStreetMap otherwise; each result names which one it came from in its `source` field. A charging station also reports its sockets: which plug families it has, how many of each and at what power, plus how many vehicles fit and whether it charges a fee. OSM states a socket type on roughly a third of them and a power on fewer, so treat a missing figure as unknown rather than as absent. ebike_charging finds only charging points tagged for bicycles, and reports beside the sockets whether they are made for bikes or let them charge (bicycle) and who may use them (access). This is the discovery tool: use it to answer "what is around here" for a neighbourhood or a whole city district. Prefer search_place when the user already named the place they mean. Never calls Google, so it costs nothing and works on an instance with no Places key.', + 'List points of interest of one category inside a map rectangle, with address, opening hours, website, phone and cuisine wherever the source carries them. Answers from the TREK place index where it can and from OpenStreetMap otherwise; each result names which one it came from in its `source` field. A charging station also reports its sockets: which plug families it has, how many of each and at what power, plus how many vehicles fit and whether it charges a fee. OSM states a socket type on roughly a third of them and a power on fewer, so treat a missing figure as unknown rather than as absent. ebike_charging finds only charging points tagged for bicycles, many of them unnamed (an empty name), and reports beside the sockets whether they are made for bikes or let them charge (bicycle) and who may use them (access). This is the discovery tool: use it to answer "what is around here" for a neighbourhood or a whole city district. Prefer search_place when the user already named the place they mean. Never calls Google, so it costs nothing and works on an instance with no Places key.', inputSchema: { category: z .union([z.enum(POI_CATEGORY_KEYS), z.array(z.enum(POI_CATEGORY_KEYS)).min(1).max(MAX_POI_CATEGORIES)]) diff --git a/server/src/nest/maps/providers/osm.client.ts b/server/src/nest/maps/providers/osm.client.ts index f18f21ada..6c773422f 100644 --- a/server/src/nest/maps/providers/osm.client.ts +++ b/server/src/nest/maps/providers/osm.client.ts @@ -265,6 +265,13 @@ const KEPT_UNNAMED_ALONG: ReadonlySet = new Set([ 'ebike_charging', ]); +/** + * The kinds the map search keeps unnamed. It wants names everywhere else, but most + * e-bike charging points carry neither a name nor an operator, and dropping them + * would answer `search_pois` with a fraction of what the tour search finds. + */ +const KEPT_UNNAMED_EXPLORE: ReadonlySet = new Set(['ebike_charging']); + /** * What a charging station states, read only where it means something. Every POI * carries `capacity` and `fee` for its own reasons (a restaurant's capacity is @@ -779,7 +786,7 @@ export class OsmClient { // the result count in one round-trip. const query = `[out:json][timeout:${OVERPASS_QUERY_TIMEOUT_S}];\n(\n${selectors}\n);\nout center tags ${cap + 25};`; - const pois = readPois(await overpassFetch(query), match, osmLang, new Set()); + const pois = readPois(await overpassFetch(query), match, osmLang, KEPT_UNNAMED_EXPLORE); const truncated = pois.length > cap; const value: PoiSearchResult = { pois: pois.slice(0, cap), source: 'openstreetmap', truncated, clamped }; cachePoiAnswer(cacheKey, value); diff --git a/server/tests/unit/nest/maps.helpers.test.ts b/server/tests/unit/nest/maps.helpers.test.ts index 01e71c4f8..a1326e8b9 100644 --- a/server/tests/unit/nest/maps.helpers.test.ts +++ b/server/tests/unit/nest/maps.helpers.test.ts @@ -105,6 +105,13 @@ describe('readBikeChargingInfo (BIK-07)', () => { expect(readBikeChargingInfo({ amenity: 'charging_station', bicycle: 'no' })).toBeNull(); expect(readBikeChargingInfo({ bicycle: 'yes', 'socket:ccs': '2', 'socket:chademo': '1' })?.sockets).toEqual([]); }); + + it('MAPS-CHARGE-012: a plug mapped as none is left out, so the point reads as plug not stated', () => { + expect(readBikeChargingInfo({ bicycle: 'yes', 'socket:schuko': 'no' })?.sockets).toEqual([]); + expect(readBikeChargingInfo({ bicycle: 'yes', 'socket:type2': '0', 'socket:typee': '1' })?.sockets).toEqual([ + { type: 'typee', count: 1, kw: null }, + ]); + }); }); describe('OSM selectors (BIK-07)', () => { diff --git a/server/tests/unit/nest/maps.service.test.ts b/server/tests/unit/nest/maps.service.test.ts index 15056b44a..cc9f473f3 100644 --- a/server/tests/unit/nest/maps.service.test.ts +++ b/server/tests/unit/nest/maps.service.test.ts @@ -1074,6 +1074,18 @@ describe('searchOverpassPois localized names (#1655)', () => { const { pois } = await osm.searchOverpassPois('sights', bbox(4), 'fr-FR'); expect(pois[0].name).toBe('Obelisco della Minerva'); }); + + it('keeps an unnamed e-bike charging point, as the search along a tour does (BIK-07)', async () => { + stubOverpass({ amenity: 'charging_station', bicycle: 'yes', 'socket:schuko': '2' }); + const { pois } = await osm.searchOverpassPois('ebike_charging', bbox(6), 'en-US'); + expect(pois.map((p: any) => [p.name, p.category])).toEqual([['', 'ebike_charging']]); + }); + + it('still drops an unnamed place of any other kind', async () => { + stubOverpass({ tourism: 'attraction' }); + const { pois } = await osm.searchOverpassPois('sights', bbox(7), 'en-US'); + expect(pois).toEqual([]); + }); }); // ── fetchWikimediaPhoto (fetch stubbed) ─────────────────────────────────────── diff --git a/shared/src/i18n/ar/tours.ts b/shared/src/i18n/ar/tours.ts index 91f548e10..dd9c23d8e 100644 --- a/shared/src/i18n/ar/tours.ts +++ b/shared/src/i18n/ar/tours.ts @@ -821,6 +821,7 @@ const tours: TranslationStrings = { 'tours.poi.charging.access.public': 'مفتوح للجميع', 'tours.poi.charging.access.customers': 'للزبائن فقط', 'tours.poi.charging.access.private': 'خاص', + 'tours.poi.charging.access.none': 'لا وصول عام', 'tours.poi.charging.capacity': 'أماكن الشحن', 'tours.poi.charging.socketsUnknown': 'المقبس غير مذكور', 'tours.poi.charging.socketsUnknownHint': 'لا يذكر OpenStreetMap نوع المقبس، لذا لا يُعرف إن كان شاحنك مناسبًا.', diff --git a/shared/src/i18n/az/tours.ts b/shared/src/i18n/az/tours.ts index 16ff4e6fa..d3716065e 100644 --- a/shared/src/i18n/az/tours.ts +++ b/shared/src/i18n/az/tours.ts @@ -826,6 +826,7 @@ const tours: TranslationStrings = { 'tours.poi.charging.access.public': 'Hamı üçün açıq', 'tours.poi.charging.access.customers': 'Yalnız müştərilər', 'tours.poi.charging.access.private': 'Şəxsi', + 'tours.poi.charging.access.none': 'İctimai giriş yoxdur', 'tours.poi.charging.capacity': 'Şarj yerləri', 'tours.poi.charging.socketsUnknown': 'Rozetka göstərilməyib', 'tours.poi.charging.socketsUnknownHint': 'OpenStreetMap hansı rozetka olduğunu demir, ona görə şarj cihazının uyğun gəlib-gəlmədiyi bilinmir.', diff --git a/shared/src/i18n/br/tours.ts b/shared/src/i18n/br/tours.ts index 0da46383b..1f08eda27 100644 --- a/shared/src/i18n/br/tours.ts +++ b/shared/src/i18n/br/tours.ts @@ -833,6 +833,7 @@ const tours: TranslationStrings = { 'tours.poi.charging.access.public': 'Aberto a todos', 'tours.poi.charging.access.customers': 'Só clientes', 'tours.poi.charging.access.private': 'Privado', + 'tours.poi.charging.access.none': 'Sem acesso público', 'tours.poi.charging.capacity': 'Vagas de recarga', 'tours.poi.charging.socketsUnknown': 'Tomada não informada', 'tours.poi.charging.socketsUnknownHint': 'O OpenStreetMap não diz qual tomada tem, então não se sabe se o seu carregador serve.', diff --git a/shared/src/i18n/ca/tours.ts b/shared/src/i18n/ca/tours.ts index 64a1eb711..14a5dc87a 100644 --- a/shared/src/i18n/ca/tours.ts +++ b/shared/src/i18n/ca/tours.ts @@ -837,6 +837,7 @@ const tours: TranslationStrings = { 'tours.poi.charging.access.public': 'Obert a tothom', 'tours.poi.charging.access.customers': 'Només clients', 'tours.poi.charging.access.private': 'Privat', + 'tours.poi.charging.access.none': 'Sense accés públic', 'tours.poi.charging.capacity': 'Places de càrrega', 'tours.poi.charging.socketsUnknown': 'Endoll no indicat', 'tours.poi.charging.socketsUnknownHint': 'OpenStreetMap no diu quin endoll té, així que no se sap si el teu carregador hi encaixa.', diff --git a/shared/src/i18n/cs/tours.ts b/shared/src/i18n/cs/tours.ts index 0764d7528..5abd292b7 100644 --- a/shared/src/i18n/cs/tours.ts +++ b/shared/src/i18n/cs/tours.ts @@ -818,6 +818,7 @@ const tours: TranslationStrings = { 'tours.poi.charging.access.public': 'Otevřeno všem', 'tours.poi.charging.access.customers': 'Jen pro zákazníky', 'tours.poi.charging.access.private': 'Soukromé', + 'tours.poi.charging.access.none': 'Bez veřejného přístupu', 'tours.poi.charging.capacity': 'Nabíjecí místa', 'tours.poi.charging.socketsUnknown': 'Zásuvka neuvedena', 'tours.poi.charging.socketsUnknownHint': 'OpenStreetMap neuvádí, jakou má zásuvku, takže není jisté, zda se hodí tvoje nabíječka.', diff --git a/shared/src/i18n/de/tours.ts b/shared/src/i18n/de/tours.ts index 7330dd8ea..f54140c97 100644 --- a/shared/src/i18n/de/tours.ts +++ b/shared/src/i18n/de/tours.ts @@ -841,6 +841,7 @@ const tours: TranslationStrings = { 'tours.poi.charging.access.public': 'Für alle offen', 'tours.poi.charging.access.customers': 'Nur für Kunden', 'tours.poi.charging.access.private': 'Privat', + 'tours.poi.charging.access.none': 'Kein öffentlicher Zugang', 'tours.poi.charging.capacity': 'Ladeplätze', 'tours.poi.charging.socketsUnknown': 'Stecker nicht angegeben', 'tours.poi.charging.socketsUnknownHint': 'OpenStreetMap nennt keinen Stecker, ob dein Ladegerät passt, ist also offen.', diff --git a/shared/src/i18n/en/tours.ts b/shared/src/i18n/en/tours.ts index 5addcd2dd..b7cda5b8a 100644 --- a/shared/src/i18n/en/tours.ts +++ b/shared/src/i18n/en/tours.ts @@ -817,6 +817,7 @@ const tours: TranslationStrings = { 'tours.poi.charging.access.public': 'Open to all', 'tours.poi.charging.access.customers': 'Customers only', 'tours.poi.charging.access.private': 'Private', + 'tours.poi.charging.access.none': 'No public access', 'tours.poi.charging.capacity': 'Charging spots', 'tours.poi.charging.socketsUnknown': 'Plug not stated', 'tours.poi.charging.socketsUnknownHint': 'OpenStreetMap does not say which plug it has, so whether your charger fits is not known.', diff --git a/shared/src/i18n/es/tours.ts b/shared/src/i18n/es/tours.ts index 1aaf19759..71a1b1d2f 100644 --- a/shared/src/i18n/es/tours.ts +++ b/shared/src/i18n/es/tours.ts @@ -835,6 +835,7 @@ const tours: TranslationStrings = { 'tours.poi.charging.access.public': 'Abierto a todos', 'tours.poi.charging.access.customers': 'Solo clientes', 'tours.poi.charging.access.private': 'Privado', + 'tours.poi.charging.access.none': 'Sin acceso público', 'tours.poi.charging.capacity': 'Plazas de carga', 'tours.poi.charging.socketsUnknown': 'Enchufe no indicado', 'tours.poi.charging.socketsUnknownHint': 'OpenStreetMap no dice qué enchufe tiene, así que no se sabe si tu cargador sirve.', diff --git a/shared/src/i18n/et/tours.ts b/shared/src/i18n/et/tours.ts index f2dfda49a..0dd7cd41e 100644 --- a/shared/src/i18n/et/tours.ts +++ b/shared/src/i18n/et/tours.ts @@ -821,6 +821,7 @@ const tours: TranslationStrings = { 'tours.poi.charging.access.public': 'Avatud kõigile', 'tours.poi.charging.access.customers': 'Ainult klientidele', 'tours.poi.charging.access.private': 'Privaatne', + 'tours.poi.charging.access.none': 'Avalik juurdepääs puudub', 'tours.poi.charging.capacity': 'Laadimiskohad', 'tours.poi.charging.socketsUnknown': 'Pistik märkimata', 'tours.poi.charging.socketsUnknownHint': 'OpenStreetMap ei ütle, mis pistik seal on, seega pole teada, kas sinu laadija sobib.', diff --git a/shared/src/i18n/fr/tours.ts b/shared/src/i18n/fr/tours.ts index 4c1e2aecf..a83a7731d 100644 --- a/shared/src/i18n/fr/tours.ts +++ b/shared/src/i18n/fr/tours.ts @@ -847,6 +847,7 @@ const tours: TranslationStrings = { 'tours.poi.charging.access.public': 'Ouvert à tous', 'tours.poi.charging.access.customers': 'Réservé aux clients', 'tours.poi.charging.access.private': 'Privé', + 'tours.poi.charging.access.none': 'Pas d’accès public', 'tours.poi.charging.capacity': 'Places de recharge', 'tours.poi.charging.socketsUnknown': 'Prise non indiquée', 'tours.poi.charging.socketsUnknownHint': 'OpenStreetMap n’indique pas la prise, on ne sait donc pas si ton chargeur convient.', diff --git a/shared/src/i18n/gr/tours.ts b/shared/src/i18n/gr/tours.ts index 8b7f58392..275fd9155 100644 --- a/shared/src/i18n/gr/tours.ts +++ b/shared/src/i18n/gr/tours.ts @@ -852,6 +852,7 @@ const tours: TranslationStrings = { 'tours.poi.charging.access.public': 'Ανοιχτό σε όλους', 'tours.poi.charging.access.customers': 'Μόνο για πελάτες', 'tours.poi.charging.access.private': 'Ιδιωτικό', + 'tours.poi.charging.access.none': 'Χωρίς δημόσια πρόσβαση', 'tours.poi.charging.capacity': 'Θέσεις φόρτισης', 'tours.poi.charging.socketsUnknown': 'Δεν αναφέρεται πρίζα', 'tours.poi.charging.socketsUnknownHint': 'Το OpenStreetMap δεν λέει ποια πρίζα έχει, οπότε δεν είναι γνωστό αν ταιριάζει ο φορτιστής σου.', diff --git a/shared/src/i18n/hu/tours.ts b/shared/src/i18n/hu/tours.ts index 78c1c7147..08a05daba 100644 --- a/shared/src/i18n/hu/tours.ts +++ b/shared/src/i18n/hu/tours.ts @@ -835,6 +835,7 @@ const tours: TranslationStrings = { 'tours.poi.charging.access.public': 'Mindenkinek nyitva', 'tours.poi.charging.access.customers': 'Csak vendégeknek', 'tours.poi.charging.access.private': 'Magán', + 'tours.poi.charging.access.none': 'Nem nyilvános', 'tours.poi.charging.capacity': 'Töltőhelyek', 'tours.poi.charging.socketsUnknown': 'Csatlakozó nincs megadva', 'tours.poi.charging.socketsUnknownHint': 'Az OpenStreetMap nem írja, milyen csatlakozója van, így nem tudni, jó-e a töltőd.', diff --git a/shared/src/i18n/id/tours.ts b/shared/src/i18n/id/tours.ts index cf178653a..ffdf7cbb9 100644 --- a/shared/src/i18n/id/tours.ts +++ b/shared/src/i18n/id/tours.ts @@ -830,6 +830,7 @@ const tours: TranslationStrings = { 'tours.poi.charging.access.public': 'Terbuka untuk umum', 'tours.poi.charging.access.customers': 'Hanya pelanggan', 'tours.poi.charging.access.private': 'Pribadi', + 'tours.poi.charging.access.none': 'Tanpa akses umum', 'tours.poi.charging.capacity': 'Tempat pengisian', 'tours.poi.charging.socketsUnknown': 'Colokan tidak disebutkan', 'tours.poi.charging.socketsUnknownHint': 'OpenStreetMap tidak menyebutkan colokannya, jadi belum diketahui apakah charger kamu cocok.', diff --git a/shared/src/i18n/it/tours.ts b/shared/src/i18n/it/tours.ts index 6cd268ec1..a6fc67ca7 100644 --- a/shared/src/i18n/it/tours.ts +++ b/shared/src/i18n/it/tours.ts @@ -839,6 +839,7 @@ const tours: TranslationStrings = { 'tours.poi.charging.access.public': 'Aperto a tutti', 'tours.poi.charging.access.customers': 'Solo clienti', 'tours.poi.charging.access.private': 'Privato', + 'tours.poi.charging.access.none': 'Nessun accesso pubblico', 'tours.poi.charging.capacity': 'Posti di ricarica', 'tours.poi.charging.socketsUnknown': 'Presa non indicata', 'tours.poi.charging.socketsUnknownHint': 'OpenStreetMap non dice quale presa ha, quindi non si sa se il tuo caricatore va bene.', diff --git a/shared/src/i18n/ja/tours.ts b/shared/src/i18n/ja/tours.ts index 13d70e3a7..f0e45981e 100644 --- a/shared/src/i18n/ja/tours.ts +++ b/shared/src/i18n/ja/tours.ts @@ -809,6 +809,7 @@ const tours: TranslationStrings = { 'tours.poi.charging.access.public': '誰でも利用可', 'tours.poi.charging.access.customers': '利用客のみ', 'tours.poi.charging.access.private': '私設', + 'tours.poi.charging.access.none': '一般利用不可', 'tours.poi.charging.capacity': '充電台数', 'tours.poi.charging.socketsUnknown': 'コンセント不明', 'tours.poi.charging.socketsUnknownHint': 'OpenStreetMapにコンセントの種類が記載されていないため、お手持ちの充電器が使えるかは分かりません。', diff --git a/shared/src/i18n/ko/tours.ts b/shared/src/i18n/ko/tours.ts index 7d6a993e2..824f3d7c3 100644 --- a/shared/src/i18n/ko/tours.ts +++ b/shared/src/i18n/ko/tours.ts @@ -804,6 +804,7 @@ const tours: TranslationStrings = { 'tours.poi.charging.access.public': '누구나 이용 가능', 'tours.poi.charging.access.customers': '고객 전용', 'tours.poi.charging.access.private': '사설', + 'tours.poi.charging.access.none': '일반 이용 불가', 'tours.poi.charging.capacity': '충전 자리', 'tours.poi.charging.socketsUnknown': '콘센트 정보 없음', 'tours.poi.charging.socketsUnknownHint': 'OpenStreetMap에 콘센트 종류가 나와 있지 않아 내 충전기가 맞는지 알 수 없습니다.', diff --git a/shared/src/i18n/nl/tours.ts b/shared/src/i18n/nl/tours.ts index a51c783e8..ba1f58eb0 100644 --- a/shared/src/i18n/nl/tours.ts +++ b/shared/src/i18n/nl/tours.ts @@ -836,6 +836,7 @@ const tours: TranslationStrings = { 'tours.poi.charging.access.public': 'Open voor iedereen', 'tours.poi.charging.access.customers': 'Alleen klanten', 'tours.poi.charging.access.private': 'Privé', + 'tours.poi.charging.access.none': 'Niet openbaar toegankelijk', 'tours.poi.charging.capacity': 'Laadplekken', 'tours.poi.charging.socketsUnknown': 'Stekker niet vermeld', 'tours.poi.charging.socketsUnknownHint': 'OpenStreetMap zegt niet welke stekker er is, dus of je lader past is onbekend.', diff --git a/shared/src/i18n/pl/tours.ts b/shared/src/i18n/pl/tours.ts index cd44c5a28..4d3e89699 100644 --- a/shared/src/i18n/pl/tours.ts +++ b/shared/src/i18n/pl/tours.ts @@ -842,6 +842,7 @@ const tours: TranslationStrings = { 'tours.poi.charging.access.public': 'Otwarte dla wszystkich', 'tours.poi.charging.access.customers': 'Tylko dla klientów', 'tours.poi.charging.access.private': 'Prywatne', + 'tours.poi.charging.access.none': 'Brak dostępu publicznego', 'tours.poi.charging.capacity': 'Miejsca ładowania', 'tours.poi.charging.socketsUnknown': 'Gniazdo nie podane', 'tours.poi.charging.socketsUnknownHint': 'OpenStreetMap nie podaje, jakie ma gniazdo, więc nie wiadomo, czy pasuje twoja ładowarka.', diff --git a/shared/src/i18n/ru/tours.ts b/shared/src/i18n/ru/tours.ts index 113aa50d3..74f72fa4a 100644 --- a/shared/src/i18n/ru/tours.ts +++ b/shared/src/i18n/ru/tours.ts @@ -845,6 +845,7 @@ const tours: TranslationStrings = { 'tours.poi.charging.access.public': 'Открыто для всех', 'tours.poi.charging.access.customers': 'Только для клиентов', 'tours.poi.charging.access.private': 'Частное', + 'tours.poi.charging.access.none': 'Нет общего доступа', 'tours.poi.charging.capacity': 'Места для зарядки', 'tours.poi.charging.socketsUnknown': 'Разъём не указан', 'tours.poi.charging.socketsUnknownHint': 'OpenStreetMap не указывает разъём, поэтому неизвестно, подойдёт ли ваше зарядное устройство.', diff --git a/shared/src/i18n/sk/tours.ts b/shared/src/i18n/sk/tours.ts index 35189ec86..10f462397 100644 --- a/shared/src/i18n/sk/tours.ts +++ b/shared/src/i18n/sk/tours.ts @@ -820,6 +820,7 @@ const tours: TranslationStrings = { 'tours.poi.charging.access.public': 'Otvorené pre všetkých', 'tours.poi.charging.access.customers': 'Len pre zákazníkov', 'tours.poi.charging.access.private': 'Súkromné', + 'tours.poi.charging.access.none': 'Bez verejného prístupu', 'tours.poi.charging.capacity': 'Nabíjacie miesta', 'tours.poi.charging.socketsUnknown': 'Zásuvka neuvedená', 'tours.poi.charging.socketsUnknownHint': 'OpenStreetMap neuvádza, akú má zásuvku, takže nie je isté, či sa hodí tvoja nabíjačka.', diff --git a/shared/src/i18n/sv/tours.ts b/shared/src/i18n/sv/tours.ts index 05981df59..cb9c4f83d 100644 --- a/shared/src/i18n/sv/tours.ts +++ b/shared/src/i18n/sv/tours.ts @@ -817,6 +817,7 @@ const tours: TranslationStrings = { 'tours.poi.charging.access.public': 'Öppen för alla', 'tours.poi.charging.access.customers': 'Endast kunder', 'tours.poi.charging.access.private': 'Privat', + 'tours.poi.charging.access.none': 'Ingen allmän åtkomst', 'tours.poi.charging.capacity': 'Laddplatser', 'tours.poi.charging.socketsUnknown': 'Kontakt inte angiven', 'tours.poi.charging.socketsUnknownHint': 'OpenStreetMap säger inte vilken kontakt den har, så om din laddare passar är okänt.', diff --git a/shared/src/i18n/th/tours.ts b/shared/src/i18n/th/tours.ts index e5089f243..c8ae30386 100644 --- a/shared/src/i18n/th/tours.ts +++ b/shared/src/i18n/th/tours.ts @@ -789,6 +789,7 @@ const tours: TranslationStrings = { 'tours.poi.charging.access.public': 'เปิดให้ทุกคน', 'tours.poi.charging.access.customers': 'เฉพาะลูกค้า', 'tours.poi.charging.access.private': 'ส่วนตัว', + 'tours.poi.charging.access.none': 'ไม่เปิดให้สาธารณะใช้', 'tours.poi.charging.capacity': 'ช่องชาร์จ', 'tours.poi.charging.socketsUnknown': 'ไม่ระบุหัวปลั๊ก', 'tours.poi.charging.socketsUnknownHint': 'OpenStreetMap ไม่ได้ระบุว่ามีหัวปลั๊กแบบใด จึงไม่ทราบว่าที่ชาร์จของคุณใช้ได้หรือไม่', diff --git a/shared/src/i18n/tours-locales.spec.ts b/shared/src/i18n/tours-locales.spec.ts index a89fc432f..395c45dad 100644 --- a/shared/src/i18n/tours-locales.spec.ts +++ b/shared/src/i18n/tours-locales.spec.ts @@ -20,7 +20,7 @@ const toursModules = import.meta.glob<{ default: TranslationStrings }>('./*/tour const TOUR_DOMAINS: { file: string; generalKeyCount: number; modules: DomainModules }[] = [ { file: 'tours', - generalKeyCount: 1302, + generalKeyCount: 1303, modules: toursModules, }, { diff --git a/shared/src/i18n/tr/tours.ts b/shared/src/i18n/tr/tours.ts index 6f72f117a..107cc57ca 100644 --- a/shared/src/i18n/tr/tours.ts +++ b/shared/src/i18n/tr/tours.ts @@ -825,6 +825,7 @@ const tours: TranslationStrings = { 'tours.poi.charging.access.public': 'Herkese açık', 'tours.poi.charging.access.customers': 'Yalnızca müşteriler', 'tours.poi.charging.access.private': 'Özel', + 'tours.poi.charging.access.none': 'Genel erişime kapalı', 'tours.poi.charging.capacity': 'Şarj yerleri', 'tours.poi.charging.socketsUnknown': 'Priz belirtilmemiş', 'tours.poi.charging.socketsUnknownHint': 'OpenStreetMap hangi prizi olduğunu söylemiyor, bu yüzden şarj cihazının uyup uymadığı bilinmiyor.', diff --git a/shared/src/i18n/uk/tours.ts b/shared/src/i18n/uk/tours.ts index ef65ac332..f36956a31 100644 --- a/shared/src/i18n/uk/tours.ts +++ b/shared/src/i18n/uk/tours.ts @@ -836,6 +836,7 @@ const tours: TranslationStrings = { 'tours.poi.charging.access.public': 'Відкрито для всіх', 'tours.poi.charging.access.customers': 'Лише для клієнтів', 'tours.poi.charging.access.private': 'Приватне', + 'tours.poi.charging.access.none': 'Немає загального доступу', 'tours.poi.charging.capacity': 'Місця для заряджання', 'tours.poi.charging.socketsUnknown': 'Роз’єм не вказано', 'tours.poi.charging.socketsUnknownHint': 'OpenStreetMap не вказує роз’єм, тож невідомо, чи підійде ваш зарядний пристрій.', diff --git a/shared/src/i18n/vi/tours.ts b/shared/src/i18n/vi/tours.ts index 575b1163d..dce9268a2 100644 --- a/shared/src/i18n/vi/tours.ts +++ b/shared/src/i18n/vi/tours.ts @@ -819,6 +819,7 @@ const tours: TranslationStrings = { 'tours.poi.charging.access.public': 'Mở cho mọi người', 'tours.poi.charging.access.customers': 'Chỉ dành cho khách hàng', 'tours.poi.charging.access.private': 'Riêng tư', + 'tours.poi.charging.access.none': 'Không cho công chúng sử dụng', 'tours.poi.charging.capacity': 'Chỗ sạc', 'tours.poi.charging.socketsUnknown': 'Không ghi loại ổ cắm', 'tours.poi.charging.socketsUnknownHint': 'OpenStreetMap không ghi loại ổ cắm, nên chưa biết bộ sạc của bạn có vừa không.', diff --git a/shared/src/i18n/zh-TW/tours.ts b/shared/src/i18n/zh-TW/tours.ts index 56b76b559..0b86bda38 100644 --- a/shared/src/i18n/zh-TW/tours.ts +++ b/shared/src/i18n/zh-TW/tours.ts @@ -765,6 +765,7 @@ const tours: TranslationStrings = { 'tours.poi.charging.access.public': '對所有人開放', 'tours.poi.charging.access.customers': '僅限顧客', 'tours.poi.charging.access.private': '私人', + 'tours.poi.charging.access.none': '不開放公眾使用', 'tours.poi.charging.capacity': '充電位', 'tours.poi.charging.socketsUnknown': '未註明插座', 'tours.poi.charging.socketsUnknownHint': 'OpenStreetMap 沒有註明插座類型,因此不確定你的充電器是否適用。', diff --git a/shared/src/i18n/zh/tours.ts b/shared/src/i18n/zh/tours.ts index d50129b0e..d3124fe90 100644 --- a/shared/src/i18n/zh/tours.ts +++ b/shared/src/i18n/zh/tours.ts @@ -766,6 +766,7 @@ const tours: TranslationStrings = { 'tours.poi.charging.access.public': '对所有人开放', 'tours.poi.charging.access.customers': '仅限顾客', 'tours.poi.charging.access.private': '私人', + 'tours.poi.charging.access.none': '不对公众开放', 'tours.poi.charging.capacity': '充电位', 'tours.poi.charging.socketsUnknown': '未注明插座', 'tours.poi.charging.socketsUnknownHint': 'OpenStreetMap 没有注明插座类型,因此不确定你的充电器是否适用。',