mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-10-22 06:56:35 +00:00
fix(tours): read e-bike chargers as mapped, keep unnamed ones on the map search
This commit is contained in:
@@ -28,11 +28,12 @@ const HOUSEHOLD_SOCKETS: ReadonlySet<string> = new Set([
|
||||
|
||||
type Translate = ReturnType<typeof useTranslation>['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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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 (
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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<string, string>): 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,
|
||||
|
||||
@@ -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)])
|
||||
|
||||
@@ -265,6 +265,13 @@ const KEPT_UNNAMED_ALONG: ReadonlySet<string> = 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<string> = 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);
|
||||
|
||||
@@ -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)', () => {
|
||||
|
||||
@@ -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) ───────────────────────────────────────
|
||||
|
||||
@@ -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 نوع المقبس، لذا لا يُعرف إن كان شاحنك مناسبًا.',
|
||||
|
||||
@@ -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.',
|
||||
|
||||
@@ -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.',
|
||||
|
||||
@@ -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.',
|
||||
|
||||
@@ -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.',
|
||||
|
||||
@@ -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.',
|
||||
|
||||
@@ -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.',
|
||||
|
||||
@@ -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.',
|
||||
|
||||
@@ -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.',
|
||||
|
||||
@@ -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.',
|
||||
|
||||
@@ -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 δεν λέει ποια πρίζα έχει, οπότε δεν είναι γνωστό αν ταιριάζει ο φορτιστής σου.',
|
||||
|
||||
@@ -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.',
|
||||
|
||||
@@ -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.',
|
||||
|
||||
@@ -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.',
|
||||
|
||||
@@ -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にコンセントの種類が記載されていないため、お手持ちの充電器が使えるかは分かりません。',
|
||||
|
||||
@@ -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에 콘센트 종류가 나와 있지 않아 내 충전기가 맞는지 알 수 없습니다.',
|
||||
|
||||
@@ -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.',
|
||||
|
||||
@@ -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.',
|
||||
|
||||
@@ -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 не указывает разъём, поэтому неизвестно, подойдёт ли ваше зарядное устройство.',
|
||||
|
||||
@@ -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.',
|
||||
|
||||
@@ -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.',
|
||||
|
||||
@@ -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 ไม่ได้ระบุว่ามีหัวปลั๊กแบบใด จึงไม่ทราบว่าที่ชาร์จของคุณใช้ได้หรือไม่',
|
||||
|
||||
@@ -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,
|
||||
},
|
||||
{
|
||||
|
||||
@@ -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.',
|
||||
|
||||
@@ -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 не вказує роз’єм, тож невідомо, чи підійде ваш зарядний пристрій.',
|
||||
|
||||
@@ -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.',
|
||||
|
||||
@@ -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 沒有註明插座類型,因此不確定你的充電器是否適用。',
|
||||
|
||||
@@ -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 没有注明插座类型,因此不确定你的充电器是否适用。',
|
||||
|
||||
Reference in New Issue
Block a user