mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-10-18 21:16:47 +00:00
fix(roadtrip): search along the roads driven, not the lines between stops
The corridor was built from the day's stops, so it followed straight lines across country the car never drives. Between two cities that line runs through open fields while the motorway swings wide of it, which is why every hit came back sitting on a stop rather than on the way. The days now carry the routed geometry, and the corridor is cut from that. Same trip, same search: 192 hits spread over the whole 482 km — first fifty, middle, and the last stretch — where before all of them reported kilometre zero. Following real roads takes more boxes to cover the same drive, so they go out three at a time instead of strictly one after another, and the budget rises from ten to sixteen. The panel head loses the sentence explaining what the sections below already say, and the day's distance and driving time, which the day list has been showing all along.
This commit is contained in:
@@ -7,7 +7,6 @@ import { useTranslation } from '../../i18n/TranslationContext'
|
||||
import { useSettingsStore } from '../../store/settingsStore'
|
||||
import { formatDistance } from '../../utils/units'
|
||||
import CustomSelect from '../shared/CustomSelect'
|
||||
import { formatDurationShort } from './roadtripModel'
|
||||
import { CORRIDOR_CATEGORY_KEYS, CORRIDOR_WIDTHS_KM, type RoadtripCorridor } from './useRoadtripCorridor'
|
||||
import type { CorridorPoi } from './useCorridorPois'
|
||||
import type { RoadtripRoutes } from './useRoadtripRoutes'
|
||||
@@ -119,18 +118,8 @@ export default function RoadtripCorridorPanel({ corridor, routes, onAddPoi }: Ro
|
||||
return (
|
||||
<div className="flex h-full min-h-0 flex-col">
|
||||
{/* Header — the rhythm of the places sidebar this replaces. */}
|
||||
<div className="flex-shrink-0 border-b border-edge-faint px-4 pb-3 pt-3.5">
|
||||
<div className="flex-shrink-0 border-b border-edge-faint px-4 pb-2.5 pt-3.5">
|
||||
<h2 className="text-subtitle font-semibold text-content">{t('roadtrip.poi.title')}</h2>
|
||||
<p className="mt-0.5 text-caption text-content-muted">{t('roadtrip.poi.hint')}</p>
|
||||
{corridor.day ? (
|
||||
// Under the title rather than beside it: the rail is narrow enough that a
|
||||
// second element on the heading line pushes the heading into two.
|
||||
<p className="mt-1.5 text-caption text-content-faint tabular-nums">
|
||||
{formatDistance(corridor.day.distance / 1000, distanceUnit)}
|
||||
<span className="mx-1">·</span>
|
||||
{formatDurationShort(corridor.day.duration)}
|
||||
</p>
|
||||
) : null}
|
||||
</div>
|
||||
|
||||
{/* Search controls */}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { useCallback, useEffect, useRef, useState } from 'react'
|
||||
import { mapsApi } from '../../api/client'
|
||||
import { useTranslation } from '../../i18n'
|
||||
import { corridorTiles, projectOntoRoute, simplifyLine, type LatLng } from './corridor'
|
||||
import { corridorTiles, projectOntoRoute, simplifyLine, type Bbox, type LatLng } from './corridor'
|
||||
import type { Poi } from '../Map/poiCategories'
|
||||
|
||||
/** A POI that is actually on the way, with the two numbers that make it one. */
|
||||
@@ -27,9 +27,11 @@ export interface CorridorSearch {
|
||||
* would otherwise be dozens of requests against a shared public mirror; past this the
|
||||
* search stops and says so rather than quietly covering half the route.
|
||||
*/
|
||||
const MAX_TILES = 10
|
||||
/** Gap between Overpass requests — the public mirrors are a shared resource. */
|
||||
const REQUEST_SPACING_MS = 700
|
||||
const MAX_TILES = 16
|
||||
/** Gap after a request before the same worker starts the next — the mirrors are shared. */
|
||||
const REQUEST_SPACING_MS = 400
|
||||
/** How many boxes are in flight at once. */
|
||||
const CONCURRENT_REQUESTS = 3
|
||||
|
||||
const sleep = (ms: number, signal: AbortSignal): Promise<void> =>
|
||||
new Promise(resolve => {
|
||||
@@ -93,13 +95,23 @@ export function useCorridorPois(line: LatLng[], categories: string[], widthKm: n
|
||||
setLoading(true)
|
||||
setProgress({ done: 0, total: tiles.length * categories.length })
|
||||
|
||||
const jobs: { tile: Bbox; category: string }[] = []
|
||||
for (const tile of tiles) for (const category of categories) jobs.push({ tile, category })
|
||||
|
||||
void (async () => {
|
||||
const seen = new Map<string, CorridorPoi>()
|
||||
let failures = 0
|
||||
let done = 0
|
||||
for (const tile of tiles) {
|
||||
for (const category of categories) {
|
||||
let next = 0
|
||||
|
||||
// A few at a time, staggered. Following the real road rather than the line between
|
||||
// stops means more boxes to cover the same drive, and asking for them strictly one
|
||||
// after another turned a search into half a minute of waiting. The server races
|
||||
// several Overpass mirrors and caches what comes back, so a small pool is fair use.
|
||||
const worker = async (): Promise<void> => {
|
||||
while (next < jobs.length) {
|
||||
if (controller.signal.aborted || runId !== runIdRef.current) return
|
||||
const { tile, category } = jobs[next++]
|
||||
try {
|
||||
const data = await mapsApi.pois(category, tile, locale, controller.signal)
|
||||
for (const poi of data.pois) {
|
||||
@@ -109,19 +121,21 @@ export function useCorridorPois(line: LatLng[], categories: string[], widthKm: n
|
||||
seen.set(poi.osm_id, { ...poi, offRouteKm: hit.offRouteKm, alongKm: hit.alongKm })
|
||||
}
|
||||
} catch {
|
||||
// One dead mirror or one clamped box must not empty the whole search; the
|
||||
// run is only called a failure if every request failed.
|
||||
// One dead mirror or one clamped box must not empty the whole search; the run
|
||||
// is only called a failure if every request failed.
|
||||
failures++
|
||||
}
|
||||
done++
|
||||
if (controller.signal.aborted || runId !== runIdRef.current) return
|
||||
setProgress({ done, total: tiles.length * categories.length })
|
||||
setProgress({ done, total: jobs.length })
|
||||
setResults([...seen.values()].sort((a, b) => a.alongKm - b.alongKm))
|
||||
await sleep(REQUEST_SPACING_MS, controller.signal)
|
||||
}
|
||||
}
|
||||
|
||||
await Promise.all(Array.from({ length: Math.min(CONCURRENT_REQUESTS, jobs.length) }, worker))
|
||||
if (controller.signal.aborted || runId !== runIdRef.current) return
|
||||
setError(failures === tiles.length * categories.length && failures > 0)
|
||||
setError(failures === jobs.length && failures > 0)
|
||||
setLoading(false)
|
||||
})()
|
||||
}, [line, categories, widthKm, locale])
|
||||
|
||||
@@ -37,12 +37,15 @@ export function useRoadtripCorridor(routes: RoadtripRoutes): RoadtripCorridor {
|
||||
// has picked anything — and follows along when that day disappears.
|
||||
const day = routes.days.find(d => String(d.dayId) === dayId) ?? routes.days[0]
|
||||
|
||||
const line = useMemo<LatLng[]>(
|
||||
// The stops are spine enough: the corridor is kilometres wide, and the routed
|
||||
// geometry per leg is not kept once its numbers have been read.
|
||||
() => (day ? day.stops.map(s => ({ lat: s.lat, lng: s.lng })) : []),
|
||||
[day],
|
||||
)
|
||||
const line = useMemo<LatLng[]>(() => {
|
||||
if (!day) return []
|
||||
// The roads driven, not the straight lines between stops. A corridor built from the
|
||||
// stops searches beside a line the car never takes — between two cities that is open
|
||||
// country, which is why everything it found sat at the stops themselves.
|
||||
if (day.geometry.length > 1) return day.geometry.map(([lat, lng]) => ({ lat, lng }))
|
||||
// Until the day has routed there is nothing else to go on.
|
||||
return day.stops.map(s => ({ lat: s.lat, lng: s.lng }))
|
||||
}, [day])
|
||||
|
||||
const search = useCorridorPois(line, categories, widthKm)
|
||||
|
||||
|
||||
@@ -31,6 +31,13 @@ export interface RoadtripDay {
|
||||
legs: (RouteSegment | undefined)[]
|
||||
/** Arrival and departure per stop, walked forward from the day's first pinned time. */
|
||||
schedule: Schedule
|
||||
/**
|
||||
* The roads actually driven that day, as [lat, lng] — not the straight lines between
|
||||
* stops. Anything asking "what is along this day" has to use this: between Hamburg and
|
||||
* Berlin the straight line runs across open country while the motorway swings north of
|
||||
* it, so a corridor built from the stops finds the wrong side of the map.
|
||||
*/
|
||||
geometry: [number, number][]
|
||||
distance: number
|
||||
duration: number
|
||||
}
|
||||
@@ -136,6 +143,7 @@ export function useRoadtripRoutes(
|
||||
stops,
|
||||
legs: [],
|
||||
schedule: { entries: [], warnings: [] },
|
||||
geometry: [],
|
||||
distance: 0,
|
||||
duration: 0,
|
||||
}
|
||||
@@ -244,6 +252,9 @@ export function useRoadtripRoutes(
|
||||
if (leg.line.length > 1) lines.push(leg.line)
|
||||
segments.push(leg.seg)
|
||||
}
|
||||
// The run polylines end to end: leg 0 of a run carries its whole geometry, the
|
||||
// rest carry none, so concatenating what is there gives the day as driven.
|
||||
const geometry = routed.flatMap(l => l?.line ?? [])
|
||||
const legs = routed.map(l => l?.seg)
|
||||
const distance = legs.reduce((sum, l) => sum + (l?.distance ?? 0), 0)
|
||||
const duration = legs.reduce((sum, l) => sum + (l?.duration ?? 0), 0)
|
||||
@@ -251,7 +262,7 @@ export function useRoadtripRoutes(
|
||||
day.stops.map(s => ({ anchor: s.time, dwellMinutes: s.dwellMinutes })),
|
||||
legs.map(l => l?.duration),
|
||||
)
|
||||
return { ...day, legs, schedule, distance, duration }
|
||||
return { ...day, legs, schedule, geometry, distance, duration }
|
||||
})
|
||||
return {
|
||||
days: out,
|
||||
|
||||
@@ -11,7 +11,6 @@ const roadtrip: TranslationStrings = {
|
||||
'roadtrip.stops.label': 'محطات على الطريق',
|
||||
'roadtrip.stops.remove': 'إزالة المحطة',
|
||||
'roadtrip.poi.title': 'على طول المسار',
|
||||
'roadtrip.poi.hint': 'ابحث على طول مسار اليوم عمّا تحتاجه في الطريق.',
|
||||
'roadtrip.poi.scope': 'اليوم',
|
||||
'roadtrip.poi.looking': 'المطلوب',
|
||||
'roadtrip.poi.searchingHint': 'جارٍ البحث على طول المسار…',
|
||||
|
||||
@@ -11,7 +11,6 @@ const roadtrip: TranslationStrings = {
|
||||
'roadtrip.stops.label': 'Paradas pelo caminho',
|
||||
'roadtrip.stops.remove': 'Remover parada',
|
||||
'roadtrip.poi.title': 'Ao longo da rota',
|
||||
'roadtrip.poi.hint': 'Pesquise ao longo do trajeto de um dia o que precisa no caminho.',
|
||||
'roadtrip.poi.scope': 'Dia',
|
||||
'roadtrip.poi.looking': 'Procurando por',
|
||||
'roadtrip.poi.searchingHint': 'Pesquisando a rota…',
|
||||
|
||||
@@ -11,7 +11,6 @@ const roadtrip: TranslationStrings = {
|
||||
'roadtrip.stops.label': 'Parades pel camí',
|
||||
'roadtrip.stops.remove': 'Elimina la parada',
|
||||
'roadtrip.poi.title': 'Al llarg de la ruta',
|
||||
'roadtrip.poi.hint': 'Cerca al llarg del trajecte d’un dia el que necessitis.',
|
||||
'roadtrip.poi.scope': 'Dia',
|
||||
'roadtrip.poi.looking': 'Es busca',
|
||||
'roadtrip.poi.searchingHint': 'S’està cercant la ruta…',
|
||||
|
||||
@@ -11,7 +11,6 @@ const roadtrip: TranslationStrings = {
|
||||
'roadtrip.stops.label': 'Zastávky po cestě',
|
||||
'roadtrip.stops.remove': 'Odebrat zastávku',
|
||||
'roadtrip.poi.title': 'Podél trasy',
|
||||
'roadtrip.poi.hint': 'Prohledejte denní jízdu podle toho, co po cestě potřebujete.',
|
||||
'roadtrip.poi.scope': 'Den',
|
||||
'roadtrip.poi.looking': 'Hledá se',
|
||||
'roadtrip.poi.searchingHint': 'Prohledávám trasu…',
|
||||
|
||||
@@ -11,7 +11,6 @@ const roadtrip: TranslationStrings = {
|
||||
'roadtrip.stops.label': 'Stopps unterwegs',
|
||||
'roadtrip.stops.remove': 'Stopp entfernen',
|
||||
'roadtrip.poi.title': 'Entlang der Route',
|
||||
'roadtrip.poi.hint': 'Durchsuche die Fahrt eines Tages nach dem, was du unterwegs brauchst.',
|
||||
'roadtrip.poi.scope': 'Tag',
|
||||
'roadtrip.poi.looking': 'Gesucht wird',
|
||||
'roadtrip.poi.searchingHint': 'Die Route wird durchsucht…',
|
||||
|
||||
@@ -11,7 +11,6 @@ const roadtrip: TranslationStrings = {
|
||||
'roadtrip.stops.label': 'Stops along the way',
|
||||
'roadtrip.stops.remove': 'Remove stop',
|
||||
'roadtrip.poi.title': 'Along the route',
|
||||
'roadtrip.poi.hint': 'Search a day’s drive for what you need along it.',
|
||||
'roadtrip.poi.scope': 'Day',
|
||||
'roadtrip.poi.looking': 'Looking for',
|
||||
'roadtrip.poi.searchingHint': 'Searching the route…',
|
||||
|
||||
@@ -11,7 +11,6 @@ const roadtrip: TranslationStrings = {
|
||||
'roadtrip.stops.label': 'Paradas por el camino',
|
||||
'roadtrip.stops.remove': 'Eliminar parada',
|
||||
'roadtrip.poi.title': 'A lo largo de la ruta',
|
||||
'roadtrip.poi.hint': 'Busca a lo largo del trayecto de un día lo que necesites.',
|
||||
'roadtrip.poi.scope': 'Día',
|
||||
'roadtrip.poi.looking': 'Se busca',
|
||||
'roadtrip.poi.searchingHint': 'Buscando por la ruta…',
|
||||
|
||||
@@ -11,7 +11,6 @@ const roadtrip: TranslationStrings = {
|
||||
'roadtrip.stops.label': 'Étapes en chemin',
|
||||
'roadtrip.stops.remove': 'Supprimer l’étape',
|
||||
'roadtrip.poi.title': 'Le long de l’itinéraire',
|
||||
'roadtrip.poi.hint': 'Cherchez le long du trajet d’une journée ce dont vous avez besoin.',
|
||||
'roadtrip.poi.scope': 'Jour',
|
||||
'roadtrip.poi.looking': 'Recherche de',
|
||||
'roadtrip.poi.searchingHint': 'Recherche le long de l’itinéraire…',
|
||||
|
||||
@@ -11,7 +11,6 @@ const roadtrip: TranslationStrings = {
|
||||
'roadtrip.stops.label': 'Στάσεις στη διαδρομή',
|
||||
'roadtrip.stops.remove': 'Αφαίρεση στάσης',
|
||||
'roadtrip.poi.title': 'Κατά μήκος της διαδρομής',
|
||||
'roadtrip.poi.hint': 'Αναζητήστε κατά μήκος της διαδρομής μιας ημέρας ό,τι χρειάζεστε.',
|
||||
'roadtrip.poi.scope': 'Ημέρα',
|
||||
'roadtrip.poi.looking': 'Αναζητείται',
|
||||
'roadtrip.poi.searchingHint': 'Αναζήτηση κατά μήκος της διαδρομής…',
|
||||
|
||||
@@ -11,7 +11,6 @@ const roadtrip: TranslationStrings = {
|
||||
'roadtrip.stops.label': 'Megállók útközben',
|
||||
'roadtrip.stops.remove': 'Megálló eltávolítása',
|
||||
'roadtrip.poi.title': 'Az útvonal mentén',
|
||||
'roadtrip.poi.hint': 'Keresd meg egy nap útvonalán, amire útközben szükséged van.',
|
||||
'roadtrip.poi.scope': 'Nap',
|
||||
'roadtrip.poi.looking': 'Amit keresel',
|
||||
'roadtrip.poi.searchingHint': 'Az útvonal keresése…',
|
||||
|
||||
@@ -11,7 +11,6 @@ const roadtrip: TranslationStrings = {
|
||||
'roadtrip.stops.label': 'Perhentian di sepanjang jalan',
|
||||
'roadtrip.stops.remove': 'Hapus perhentian',
|
||||
'roadtrip.poi.title': 'Sepanjang rute',
|
||||
'roadtrip.poi.hint': 'Cari di sepanjang perjalanan satu hari apa yang Anda butuhkan.',
|
||||
'roadtrip.poi.scope': 'Hari',
|
||||
'roadtrip.poi.looking': 'Mencari',
|
||||
'roadtrip.poi.searchingHint': 'Mencari di sepanjang rute…',
|
||||
|
||||
@@ -11,7 +11,6 @@ const roadtrip: TranslationStrings = {
|
||||
'roadtrip.stops.label': 'Soste lungo il tragitto',
|
||||
'roadtrip.stops.remove': 'Rimuovi sosta',
|
||||
'roadtrip.poi.title': 'Lungo il percorso',
|
||||
'roadtrip.poi.hint': 'Cerca lungo il tragitto di una giornata ciò che ti serve.',
|
||||
'roadtrip.poi.scope': 'Giorno',
|
||||
'roadtrip.poi.looking': 'Sto cercando',
|
||||
'roadtrip.poi.searchingHint': 'Ricerca lungo il percorso…',
|
||||
|
||||
@@ -11,7 +11,6 @@ const roadtrip: TranslationStrings = {
|
||||
'roadtrip.stops.label': '途中の立ち寄り先',
|
||||
'roadtrip.stops.remove': '立ち寄り先を削除',
|
||||
'roadtrip.poi.title': 'ルート沿い',
|
||||
'roadtrip.poi.hint': 'その日のドライブ沿いに必要なものを探します。',
|
||||
'roadtrip.poi.scope': '日',
|
||||
'roadtrip.poi.looking': '探すもの',
|
||||
'roadtrip.poi.searchingHint': 'ルートを検索しています…',
|
||||
|
||||
@@ -11,7 +11,6 @@ const roadtrip: TranslationStrings = {
|
||||
'roadtrip.stops.label': '가는 길의 경유지',
|
||||
'roadtrip.stops.remove': '경유지 삭제',
|
||||
'roadtrip.poi.title': '경로 주변',
|
||||
'roadtrip.poi.hint': '하루 주행 경로를 따라 필요한 것을 찾습니다.',
|
||||
'roadtrip.poi.scope': '날짜',
|
||||
'roadtrip.poi.looking': '찾는 항목',
|
||||
'roadtrip.poi.searchingHint': '경로를 검색하는 중…',
|
||||
|
||||
@@ -11,7 +11,6 @@ const roadtrip: TranslationStrings = {
|
||||
'roadtrip.stops.label': 'Stops onderweg',
|
||||
'roadtrip.stops.remove': 'Stop verwijderen',
|
||||
'roadtrip.poi.title': 'Langs de route',
|
||||
'roadtrip.poi.hint': 'Doorzoek de rit van een dag op wat je onderweg nodig hebt.',
|
||||
'roadtrip.poi.scope': 'Dag',
|
||||
'roadtrip.poi.looking': 'Gezocht wordt',
|
||||
'roadtrip.poi.searchingHint': 'De route wordt doorzocht…',
|
||||
|
||||
@@ -11,7 +11,6 @@ const roadtrip: TranslationStrings = {
|
||||
'roadtrip.stops.label': 'Przystanki po drodze',
|
||||
'roadtrip.stops.remove': 'Usuń przystanek',
|
||||
'roadtrip.poi.title': 'Wzdłuż trasy',
|
||||
'roadtrip.poi.hint': 'Przeszukaj przejazd danego dnia pod kątem tego, czego potrzebujesz.',
|
||||
'roadtrip.poi.scope': 'Dzień',
|
||||
'roadtrip.poi.looking': 'Szukam',
|
||||
'roadtrip.poi.searchingHint': 'Przeszukiwanie trasy…',
|
||||
|
||||
@@ -11,7 +11,6 @@ const roadtrip: TranslationStrings = {
|
||||
'roadtrip.stops.label': 'Остановки в пути',
|
||||
'roadtrip.stops.remove': 'Удалить остановку',
|
||||
'roadtrip.poi.title': 'Вдоль маршрута',
|
||||
'roadtrip.poi.hint': 'Ищите вдоль дневного перегона то, что нужно в пути.',
|
||||
'roadtrip.poi.scope': 'День',
|
||||
'roadtrip.poi.looking': 'Ищем',
|
||||
'roadtrip.poi.searchingHint': 'Идёт поиск вдоль маршрута…',
|
||||
|
||||
@@ -11,7 +11,6 @@ const roadtrip: TranslationStrings = {
|
||||
'roadtrip.stops.label': 'Stopp längs vägen',
|
||||
'roadtrip.stops.remove': 'Ta bort stopp',
|
||||
'roadtrip.poi.title': 'Längs rutten',
|
||||
'roadtrip.poi.hint': 'Sök längs en dags körning efter det du behöver på vägen.',
|
||||
'roadtrip.poi.scope': 'Dag',
|
||||
'roadtrip.poi.looking': 'Söker efter',
|
||||
'roadtrip.poi.searchingHint': 'Söker längs rutten…',
|
||||
|
||||
@@ -11,7 +11,6 @@ const roadtrip: TranslationStrings = {
|
||||
'roadtrip.stops.label': 'Yol üzerindeki duraklar',
|
||||
'roadtrip.stops.remove': 'Durağı kaldır',
|
||||
'roadtrip.poi.title': 'Rota boyunca',
|
||||
'roadtrip.poi.hint': 'Bir günün sürüşü boyunca yolda ihtiyacın olanı ara.',
|
||||
'roadtrip.poi.scope': 'Gün',
|
||||
'roadtrip.poi.looking': 'Aranan',
|
||||
'roadtrip.poi.searchingHint': 'Rota aranıyor…',
|
||||
|
||||
@@ -11,7 +11,6 @@ const roadtrip: TranslationStrings = {
|
||||
'roadtrip.stops.label': 'Зупинки в дорозі',
|
||||
'roadtrip.stops.remove': 'Видалити зупинку',
|
||||
'roadtrip.poi.title': 'Уздовж маршруту',
|
||||
'roadtrip.poi.hint': 'Шукайте вздовж денного перегону те, що потрібно в дорозі.',
|
||||
'roadtrip.poi.scope': 'День',
|
||||
'roadtrip.poi.looking': 'Шукаємо',
|
||||
'roadtrip.poi.searchingHint': 'Триває пошук уздовж маршруту…',
|
||||
|
||||
@@ -11,7 +11,6 @@ const roadtrip: TranslationStrings = {
|
||||
'roadtrip.stops.label': 'Điểm dừng dọc đường',
|
||||
'roadtrip.stops.remove': 'Xóa điểm dừng',
|
||||
'roadtrip.poi.title': 'Dọc theo lộ trình',
|
||||
'roadtrip.poi.hint': 'Tìm dọc chặng đường trong ngày những thứ bạn cần.',
|
||||
'roadtrip.poi.scope': 'Ngày',
|
||||
'roadtrip.poi.looking': 'Đang tìm',
|
||||
'roadtrip.poi.searchingHint': 'Đang tìm dọc lộ trình…',
|
||||
|
||||
@@ -11,7 +11,6 @@ const roadtrip: TranslationStrings = {
|
||||
'roadtrip.stops.label': '沿途停靠點',
|
||||
'roadtrip.stops.remove': '移除停靠點',
|
||||
'roadtrip.poi.title': '沿線',
|
||||
'roadtrip.poi.hint': '沿某一天的行程搜尋路上需要的東西。',
|
||||
'roadtrip.poi.scope': '日期',
|
||||
'roadtrip.poi.looking': '尋找',
|
||||
'roadtrip.poi.searchingHint': '正在沿路線搜尋…',
|
||||
|
||||
@@ -11,7 +11,6 @@ const roadtrip: TranslationStrings = {
|
||||
'roadtrip.stops.label': '沿途停靠点',
|
||||
'roadtrip.stops.remove': '移除停靠点',
|
||||
'roadtrip.poi.title': '沿线',
|
||||
'roadtrip.poi.hint': '沿某一天的行程搜索路上需要的东西。',
|
||||
'roadtrip.poi.scope': '日期',
|
||||
'roadtrip.poi.looking': '查找',
|
||||
'roadtrip.poi.searchingHint': '正在沿路线搜索…',
|
||||
|
||||
Reference in New Issue
Block a user