diff --git a/client/src/components/Map/poiCategories.ts b/client/src/components/Map/poiCategories.ts
index 3dfdd35d7..fa388c9d4 100644
--- a/client/src/components/Map/poiCategories.ts
+++ b/client/src/components/Map/poiCategories.ts
@@ -1,4 +1,4 @@
-import { Utensils, Coffee, Wine, BedDouble, Camera, Landmark, Trees, Ticket, type LucideIcon } from 'lucide-react'
+import { Utensils, Coffee, Wine, BedDouble, Camera, Landmark, Trees, Ticket, Fuel, Zap, ParkingSquare, Tent, type LucideIcon } from 'lucide-react'
// The POI categories shown in the map "explore" pill. The `key` is the contract
// with the server (CATEGORY_OSM_FILTERS in mapsService.ts) — the OSM tag mapping
@@ -22,8 +22,21 @@ export const POI_CATEGORIES: PoiCategory[] = [
{ key: 'activity', labelKey: 'poi.cat.activities', Icon: Ticket, color: '#F59E0B' },
]
+/**
+ * What a drive needs. Kept out of POI_CATEGORIES on purpose: these are not offered by
+ * the explore pill, they are what the road trip corridor searches for. They are in the
+ * lookup below all the same, so a hit drawn on the map gets its own icon and colour
+ * instead of the nameless grey dot an unknown category falls back to.
+ */
+export const ROADTRIP_POI_CATEGORIES: PoiCategory[] = [
+ { key: 'fuel', labelKey: 'roadtrip.poi.fuel', Icon: Fuel, color: '#0EA5E9' },
+ { key: 'charging', labelKey: 'roadtrip.poi.charging', Icon: Zap, color: '#10B981' },
+ { key: 'rest_area', labelKey: 'roadtrip.poi.rest', Icon: ParkingSquare, color: '#64748B' },
+ { key: 'campsite', labelKey: 'roadtrip.poi.campsite', Icon: Tent, color: '#65A30D' },
+]
+
export const POI_CATEGORY_BY_KEY: Record = Object.fromEntries(
- POI_CATEGORIES.map(c => [c.key, c]),
+ [...POI_CATEGORIES, ...ROADTRIP_POI_CATEGORIES].map(c => [c.key, c]),
)
// One POI result from /api/maps/pois (mirror of the server's OverpassPoi).
diff --git a/client/src/components/Roadtrip/RoadtripCorridorPanel.tsx b/client/src/components/Roadtrip/RoadtripCorridorPanel.tsx
index 255cc7c9c..d22f5cf8d 100644
--- a/client/src/components/Roadtrip/RoadtripCorridorPanel.tsx
+++ b/client/src/components/Roadtrip/RoadtripCorridorPanel.tsx
@@ -214,6 +214,13 @@ export default function RoadtripCorridorPanel({ corridor, routes, onAddPoi }: Ro
{t('roadtrip.poi.failed')}
+ ) : search.failedAreas > 0 ? (
+ // Some boxes answered and some did not. Saying so is the difference between
+ // "there is no fuel on this stretch" and "nobody looked at this stretch".
+
+
+ {t('roadtrip.poi.partial', { count: search.failedAreas })}
+
) : null}
diff --git a/client/src/components/Roadtrip/useCorridorPois.ts b/client/src/components/Roadtrip/useCorridorPois.ts
index 51e96ed4f..b7d5134f3 100644
--- a/client/src/components/Roadtrip/useCorridorPois.ts
+++ b/client/src/components/Roadtrip/useCorridorPois.ts
@@ -17,6 +17,8 @@ export interface CorridorSearch {
loading: boolean
/** True when the route was longer than the request budget and the tail was left out. */
capped: boolean
+ /** Boxes the place search could not answer — a partial result is still shown. */
+ failedAreas: number
error: boolean
search: () => void
clear: () => void
@@ -58,6 +60,7 @@ export function useCorridorPois(line: LatLng[], categories: string[], widthKm: n
const [progress, setProgress] = useState({ done: 0, total: 0 })
const [loading, setLoading] = useState(false)
const [capped, setCapped] = useState(false)
+ const [failedAreas, setFailedAreas] = useState(0)
const [error, setError] = useState(false)
const abortRef = useRef(null)
const runIdRef = useRef(0)
@@ -68,6 +71,7 @@ export function useCorridorPois(line: LatLng[], categories: string[], widthKm: n
setProgress({ done: 0, total: 0 })
setLoading(false)
setCapped(false)
+ setFailedAreas(0)
setError(false)
}, [])
@@ -90,6 +94,7 @@ export function useCorridorPois(line: LatLng[], categories: string[], widthKm: n
const tiles = allTiles.slice(0, MAX_TILES)
setCapped(allTiles.length > tiles.length)
+ setFailedAreas(0)
setError(false)
setResults([])
setLoading(true)
@@ -124,6 +129,7 @@ export function useCorridorPois(line: LatLng[], categories: string[], widthKm: n
// 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++
+ setFailedAreas(failures)
}
done++
if (controller.signal.aborted || runId !== runIdRef.current) return
@@ -142,5 +148,5 @@ export function useCorridorPois(line: LatLng[], categories: string[], widthKm: n
useEffect(() => () => abortRef.current?.abort(), [])
- return { results, progress, loading, capped, error, search, clear }
+ return { results, progress, loading, capped, failedAreas, error, search, clear }
}
diff --git a/shared/src/i18n/ar/roadtrip.ts b/shared/src/i18n/ar/roadtrip.ts
index 0727553f1..f0c1dd76e 100644
--- a/shared/src/i18n/ar/roadtrip.ts
+++ b/shared/src/i18n/ar/roadtrip.ts
@@ -25,6 +25,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.search': 'ابحث على طول المسار',
'roadtrip.poi.searching': 'جارٍ البحث {done} من {total}',
'roadtrip.poi.capped': 'المسار طويل — تم البحث في الجزء الأول فقط.',
+ 'roadtrip.poi.partial': 'تعذّر البحث في {count} من المقاطع — لم يستجب البحث عن الأماكن.',
'roadtrip.poi.failed': 'البحث عن الأماكن لا يستجيب حاليًا.',
'roadtrip.poi.empty': 'اختر ما تحتاجه ثم ابحث.',
'roadtrip.poi.add': 'إضافة',
diff --git a/shared/src/i18n/br/roadtrip.ts b/shared/src/i18n/br/roadtrip.ts
index 0eed8f675..09d158b28 100644
--- a/shared/src/i18n/br/roadtrip.ts
+++ b/shared/src/i18n/br/roadtrip.ts
@@ -25,6 +25,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.search': 'Buscar ao longo da rota',
'roadtrip.poi.searching': 'Buscando {done} de {total}',
'roadtrip.poi.capped': 'A rota é longa — apenas o primeiro trecho foi pesquisado.',
+ 'roadtrip.poi.partial': 'Não foi possível pesquisar {count} trechos — a busca de locais não respondeu.',
'roadtrip.poi.failed': 'A busca de locais não está respondendo agora.',
'roadtrip.poi.empty': 'Escolha o que precisa e pesquise.',
'roadtrip.poi.add': 'Adicionar',
diff --git a/shared/src/i18n/ca/roadtrip.ts b/shared/src/i18n/ca/roadtrip.ts
index ee2f12015..7000d2dbc 100644
--- a/shared/src/i18n/ca/roadtrip.ts
+++ b/shared/src/i18n/ca/roadtrip.ts
@@ -25,6 +25,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.search': 'Cerca al llarg de la ruta',
'roadtrip.poi.searching': 'Cercant {done} de {total}',
'roadtrip.poi.capped': 'La ruta és llarga: només s’ha cercat el primer tram.',
+ 'roadtrip.poi.partial': 'No s’han pogut cercar {count} trams: la cerca de llocs no ha respost.',
'roadtrip.poi.failed': 'La cerca de llocs no respon ara mateix.',
'roadtrip.poi.empty': 'Tria què necessites i cerca.',
'roadtrip.poi.add': 'Afegeix',
diff --git a/shared/src/i18n/cs/roadtrip.ts b/shared/src/i18n/cs/roadtrip.ts
index 0bef1442c..0986ca622 100644
--- a/shared/src/i18n/cs/roadtrip.ts
+++ b/shared/src/i18n/cs/roadtrip.ts
@@ -25,6 +25,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.search': 'Hledat podél trasy',
'roadtrip.poi.searching': 'Hledání {done} z {total}',
'roadtrip.poi.capped': 'Trasa je dlouhá — prohledán byl jen první úsek.',
+ 'roadtrip.poi.partial': '{count} úseků se nepodařilo prohledat — vyhledávání míst neodpovědělo.',
'roadtrip.poi.failed': 'Vyhledávání míst právě neodpovídá.',
'roadtrip.poi.empty': 'Vyberte, co potřebujete, a hledejte.',
'roadtrip.poi.add': 'Přidat',
diff --git a/shared/src/i18n/de/roadtrip.ts b/shared/src/i18n/de/roadtrip.ts
index 0cfdf5c38..bd2575d3e 100644
--- a/shared/src/i18n/de/roadtrip.ts
+++ b/shared/src/i18n/de/roadtrip.ts
@@ -25,6 +25,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.search': 'Entlang der Route suchen',
'roadtrip.poi.searching': 'Suche {done} von {total}',
'roadtrip.poi.capped': 'Die Route ist lang — nur der erste Abschnitt wurde durchsucht.',
+ 'roadtrip.poi.partial': '{count} Abschnitte konnten nicht durchsucht werden — die Ortssuche hat nicht geantwortet.',
'roadtrip.poi.failed': 'Die Ortssuche antwortet gerade nicht.',
'roadtrip.poi.empty': 'Wähle aus, was du brauchst, und suche.',
'roadtrip.poi.add': 'Übernehmen',
diff --git a/shared/src/i18n/en/roadtrip.ts b/shared/src/i18n/en/roadtrip.ts
index 78ed29112..646015e19 100644
--- a/shared/src/i18n/en/roadtrip.ts
+++ b/shared/src/i18n/en/roadtrip.ts
@@ -25,6 +25,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.search': 'Search along the route',
'roadtrip.poi.searching': 'Searching {done} of {total}',
'roadtrip.poi.capped': 'The route is long — only the first stretch was searched.',
+ 'roadtrip.poi.partial': '{count} stretches could not be searched — the place search did not answer.',
'roadtrip.poi.failed': 'The place search is not answering right now.',
'roadtrip.poi.empty': 'Pick what you need and search.',
'roadtrip.poi.add': 'Add',
diff --git a/shared/src/i18n/es/roadtrip.ts b/shared/src/i18n/es/roadtrip.ts
index 201971ec5..cd90bd78d 100644
--- a/shared/src/i18n/es/roadtrip.ts
+++ b/shared/src/i18n/es/roadtrip.ts
@@ -25,6 +25,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.search': 'Buscar a lo largo de la ruta',
'roadtrip.poi.searching': 'Buscando {done} de {total}',
'roadtrip.poi.capped': 'La ruta es larga: solo se buscó en el primer tramo.',
+ 'roadtrip.poi.partial': 'No se pudieron buscar {count} tramos: la búsqueda de lugares no respondió.',
'roadtrip.poi.failed': 'La búsqueda de lugares no responde ahora mismo.',
'roadtrip.poi.empty': 'Elige lo que necesitas y busca.',
'roadtrip.poi.add': 'Añadir',
diff --git a/shared/src/i18n/fr/roadtrip.ts b/shared/src/i18n/fr/roadtrip.ts
index 8f1f80f2d..3dd521181 100644
--- a/shared/src/i18n/fr/roadtrip.ts
+++ b/shared/src/i18n/fr/roadtrip.ts
@@ -25,6 +25,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.search': 'Chercher le long du trajet',
'roadtrip.poi.searching': 'Recherche {done} sur {total}',
'roadtrip.poi.capped': 'L’itinéraire est long : seule la première portion a été parcourue.',
+ 'roadtrip.poi.partial': '{count} tronçons n’ont pas pu être parcourus : la recherche de lieux n’a pas répondu.',
'roadtrip.poi.failed': 'La recherche de lieux ne répond pas pour le moment.',
'roadtrip.poi.empty': 'Choisissez ce qu’il vous faut, puis lancez la recherche.',
'roadtrip.poi.add': 'Ajouter',
diff --git a/shared/src/i18n/gr/roadtrip.ts b/shared/src/i18n/gr/roadtrip.ts
index 5151dfedb..52209313d 100644
--- a/shared/src/i18n/gr/roadtrip.ts
+++ b/shared/src/i18n/gr/roadtrip.ts
@@ -25,6 +25,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.search': 'Αναζήτηση κατά μήκος της διαδρομής',
'roadtrip.poi.searching': 'Αναζήτηση {done} από {total}',
'roadtrip.poi.capped': 'Η διαδρομή είναι μεγάλη — αναζητήθηκε μόνο το πρώτο τμήμα.',
+ 'roadtrip.poi.partial': 'Δεν ήταν δυνατή η αναζήτηση σε {count} τμήματα — η αναζήτηση τοποθεσιών δεν απάντησε.',
'roadtrip.poi.failed': 'Η αναζήτηση τοποθεσιών δεν απαντά αυτή τη στιγμή.',
'roadtrip.poi.empty': 'Διαλέξτε τι χρειάζεστε και αναζητήστε.',
'roadtrip.poi.add': 'Προσθήκη',
diff --git a/shared/src/i18n/hu/roadtrip.ts b/shared/src/i18n/hu/roadtrip.ts
index ce636f310..34c476daf 100644
--- a/shared/src/i18n/hu/roadtrip.ts
+++ b/shared/src/i18n/hu/roadtrip.ts
@@ -25,6 +25,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.search': 'Keresés az útvonal mentén',
'roadtrip.poi.searching': 'Keresés {done}/{total}',
'roadtrip.poi.capped': 'Az útvonal hosszú – csak az első szakaszon kerestünk.',
+ 'roadtrip.poi.partial': '{count} szakaszon nem sikerült keresni – a helykeresés nem válaszolt.',
'roadtrip.poi.failed': 'A helykeresés most nem válaszol.',
'roadtrip.poi.empty': 'Válaszd ki, mire van szükséged, és keress.',
'roadtrip.poi.add': 'Hozzáadás',
diff --git a/shared/src/i18n/id/roadtrip.ts b/shared/src/i18n/id/roadtrip.ts
index 4c38c9271..f45fdd5f6 100644
--- a/shared/src/i18n/id/roadtrip.ts
+++ b/shared/src/i18n/id/roadtrip.ts
@@ -25,6 +25,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.search': 'Cari di sepanjang rute',
'roadtrip.poi.searching': 'Mencari {done} dari {total}',
'roadtrip.poi.capped': 'Rute panjang — hanya bagian pertama yang dicari.',
+ 'roadtrip.poi.partial': '{count} ruas tidak dapat dicari — pencarian tempat tidak merespons.',
'roadtrip.poi.failed': 'Pencarian tempat sedang tidak merespons.',
'roadtrip.poi.empty': 'Pilih yang Anda butuhkan lalu cari.',
'roadtrip.poi.add': 'Tambah',
diff --git a/shared/src/i18n/it/roadtrip.ts b/shared/src/i18n/it/roadtrip.ts
index 90c6fe88b..3f7c9973d 100644
--- a/shared/src/i18n/it/roadtrip.ts
+++ b/shared/src/i18n/it/roadtrip.ts
@@ -25,6 +25,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.search': 'Cerca lungo il percorso',
'roadtrip.poi.searching': 'Ricerca {done} di {total}',
'roadtrip.poi.capped': 'Il percorso è lungo: è stato cercato solo il primo tratto.',
+ 'roadtrip.poi.partial': 'Non è stato possibile cercare in {count} tratti: la ricerca dei luoghi non ha risposto.',
'roadtrip.poi.failed': 'La ricerca dei luoghi non risponde al momento.',
'roadtrip.poi.empty': 'Scegli cosa ti serve e cerca.',
'roadtrip.poi.add': 'Aggiungi',
diff --git a/shared/src/i18n/ja/roadtrip.ts b/shared/src/i18n/ja/roadtrip.ts
index 024e4bf74..fb706644d 100644
--- a/shared/src/i18n/ja/roadtrip.ts
+++ b/shared/src/i18n/ja/roadtrip.ts
@@ -25,6 +25,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.search': 'ルート沿いを検索',
'roadtrip.poi.searching': '検索中 {done}/{total}',
'roadtrip.poi.capped': 'ルートが長いため、最初の区間のみ検索しました。',
+ 'roadtrip.poi.partial': '{count} 区間を検索できませんでした。場所の検索が応答しませんでした。',
'roadtrip.poi.failed': '場所の検索が現在応答していません。',
'roadtrip.poi.empty': '必要なものを選んで検索してください。',
'roadtrip.poi.add': '追加',
diff --git a/shared/src/i18n/ko/roadtrip.ts b/shared/src/i18n/ko/roadtrip.ts
index a204992b3..371742bd5 100644
--- a/shared/src/i18n/ko/roadtrip.ts
+++ b/shared/src/i18n/ko/roadtrip.ts
@@ -25,6 +25,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.search': '경로 주변 검색',
'roadtrip.poi.searching': '검색 중 {done}/{total}',
'roadtrip.poi.capped': '경로가 길어 앞부분만 검색했습니다.',
+ 'roadtrip.poi.partial': '{count}개 구간을 검색하지 못했습니다. 장소 검색이 응답하지 않았습니다.',
'roadtrip.poi.failed': '장소 검색이 지금 응답하지 않습니다.',
'roadtrip.poi.empty': '필요한 항목을 고르고 검색하세요.',
'roadtrip.poi.add': '추가',
diff --git a/shared/src/i18n/nl/roadtrip.ts b/shared/src/i18n/nl/roadtrip.ts
index abdf4adfb..25d47a5bf 100644
--- a/shared/src/i18n/nl/roadtrip.ts
+++ b/shared/src/i18n/nl/roadtrip.ts
@@ -25,6 +25,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.search': 'Langs de route zoeken',
'roadtrip.poi.searching': 'Zoeken {done} van {total}',
'roadtrip.poi.capped': 'De route is lang — alleen het eerste deel is doorzocht.',
+ 'roadtrip.poi.partial': '{count} stukken konden niet worden doorzocht — de plaatszoekfunctie antwoordde niet.',
'roadtrip.poi.failed': 'De plaatszoekfunctie reageert nu niet.',
'roadtrip.poi.empty': 'Kies wat je nodig hebt en zoek.',
'roadtrip.poi.add': 'Toevoegen',
diff --git a/shared/src/i18n/pl/roadtrip.ts b/shared/src/i18n/pl/roadtrip.ts
index 8496ef677..44de0a0c4 100644
--- a/shared/src/i18n/pl/roadtrip.ts
+++ b/shared/src/i18n/pl/roadtrip.ts
@@ -25,6 +25,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.search': 'Szukaj wzdłuż trasy',
'roadtrip.poi.searching': 'Szukanie {done} z {total}',
'roadtrip.poi.capped': 'Trasa jest długa — przeszukano tylko pierwszy odcinek.',
+ 'roadtrip.poi.partial': 'Nie udało się przeszukać {count} odcinków — wyszukiwanie miejsc nie odpowiedziało.',
'roadtrip.poi.failed': 'Wyszukiwanie miejsc chwilowo nie odpowiada.',
'roadtrip.poi.empty': 'Wybierz, czego potrzebujesz, i szukaj.',
'roadtrip.poi.add': 'Dodaj',
diff --git a/shared/src/i18n/ru/roadtrip.ts b/shared/src/i18n/ru/roadtrip.ts
index 7d008c70d..4ec78dbdb 100644
--- a/shared/src/i18n/ru/roadtrip.ts
+++ b/shared/src/i18n/ru/roadtrip.ts
@@ -25,6 +25,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.search': 'Искать вдоль маршрута',
'roadtrip.poi.searching': 'Поиск {done} из {total}',
'roadtrip.poi.capped': 'Маршрут длинный — просмотрен только первый участок.',
+ 'roadtrip.poi.partial': 'Не удалось просмотреть участков: {count} — поиск мест не ответил.',
'roadtrip.poi.failed': 'Поиск мест сейчас не отвечает.',
'roadtrip.poi.empty': 'Выберите нужное и запустите поиск.',
'roadtrip.poi.add': 'Добавить',
diff --git a/shared/src/i18n/sv/roadtrip.ts b/shared/src/i18n/sv/roadtrip.ts
index f3d2f75ee..a17020134 100644
--- a/shared/src/i18n/sv/roadtrip.ts
+++ b/shared/src/i18n/sv/roadtrip.ts
@@ -25,6 +25,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.search': 'Sök längs rutten',
'roadtrip.poi.searching': 'Söker {done} av {total}',
'roadtrip.poi.capped': 'Rutten är lång – bara första sträckan genomsöktes.',
+ 'roadtrip.poi.partial': '{count} sträckor kunde inte genomsökas – platssökningen svarade inte.',
'roadtrip.poi.failed': 'Platssökningen svarar inte just nu.',
'roadtrip.poi.empty': 'Välj vad du behöver och sök.',
'roadtrip.poi.add': 'Lägg till',
diff --git a/shared/src/i18n/tr/roadtrip.ts b/shared/src/i18n/tr/roadtrip.ts
index 8dc6e363b..aed933968 100644
--- a/shared/src/i18n/tr/roadtrip.ts
+++ b/shared/src/i18n/tr/roadtrip.ts
@@ -25,6 +25,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.search': 'Rota boyunca ara',
'roadtrip.poi.searching': 'Aranıyor {done}/{total}',
'roadtrip.poi.capped': 'Rota uzun — yalnızca ilk bölüm arandı.',
+ 'roadtrip.poi.partial': '{count} bölüm aranamadı — yer araması yanıt vermedi.',
'roadtrip.poi.failed': 'Yer araması şu anda yanıt vermiyor.',
'roadtrip.poi.empty': 'Neye ihtiyacın olduğunu seç ve ara.',
'roadtrip.poi.add': 'Ekle',
diff --git a/shared/src/i18n/uk/roadtrip.ts b/shared/src/i18n/uk/roadtrip.ts
index 15da7e361..55f37fb24 100644
--- a/shared/src/i18n/uk/roadtrip.ts
+++ b/shared/src/i18n/uk/roadtrip.ts
@@ -25,6 +25,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.search': 'Шукати вздовж маршруту',
'roadtrip.poi.searching': 'Пошук {done} з {total}',
'roadtrip.poi.capped': 'Маршрут довгий — переглянуто лише перший відрізок.',
+ 'roadtrip.poi.partial': 'Не вдалося переглянути відрізків: {count} — пошук місць не відповів.',
'roadtrip.poi.failed': 'Пошук місць зараз не відповідає.',
'roadtrip.poi.empty': 'Оберіть потрібне й почніть пошук.',
'roadtrip.poi.add': 'Додати',
diff --git a/shared/src/i18n/vi/roadtrip.ts b/shared/src/i18n/vi/roadtrip.ts
index ec69d5397..b72dd3217 100644
--- a/shared/src/i18n/vi/roadtrip.ts
+++ b/shared/src/i18n/vi/roadtrip.ts
@@ -25,6 +25,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.search': 'Tìm dọc lộ trình',
'roadtrip.poi.searching': 'Đang tìm {done}/{total}',
'roadtrip.poi.capped': 'Lộ trình dài — chỉ đoạn đầu được tìm kiếm.',
+ 'roadtrip.poi.partial': 'Không tìm được {count} đoạn — tìm kiếm địa điểm không phản hồi.',
'roadtrip.poi.failed': 'Tìm kiếm địa điểm hiện không phản hồi.',
'roadtrip.poi.empty': 'Chọn thứ bạn cần rồi tìm.',
'roadtrip.poi.add': 'Thêm',
diff --git a/shared/src/i18n/zh-TW/roadtrip.ts b/shared/src/i18n/zh-TW/roadtrip.ts
index 5d98b1626..efba5d689 100644
--- a/shared/src/i18n/zh-TW/roadtrip.ts
+++ b/shared/src/i18n/zh-TW/roadtrip.ts
@@ -25,6 +25,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.search': '沿路線搜尋',
'roadtrip.poi.searching': '搜尋中 {done}/{total}',
'roadtrip.poi.capped': '路線較長,僅搜尋了前段。',
+ 'roadtrip.poi.partial': '有 {count} 段無法搜尋 — 地點搜尋沒有回應。',
'roadtrip.poi.failed': '地點搜尋暫時沒有回應。',
'roadtrip.poi.empty': '選擇你需要的,然後搜尋。',
'roadtrip.poi.add': '新增',
diff --git a/shared/src/i18n/zh/roadtrip.ts b/shared/src/i18n/zh/roadtrip.ts
index 0d1ef0afd..f0e988b5b 100644
--- a/shared/src/i18n/zh/roadtrip.ts
+++ b/shared/src/i18n/zh/roadtrip.ts
@@ -25,6 +25,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.search': '沿路线搜索',
'roadtrip.poi.searching': '搜索中 {done}/{total}',
'roadtrip.poi.capped': '路线较长,仅搜索了前段。',
+ 'roadtrip.poi.partial': '有 {count} 段无法搜索 — 地点搜索没有响应。',
'roadtrip.poi.failed': '地点搜索暂时没有响应。',
'roadtrip.poi.empty': '选择你需要的,然后搜索。',
'roadtrip.poi.add': '添加',