feat(roadtrip): shape the drive — vias, alternatives and stops along the way

The road-trip addon's second half: the parts that let a planned drive be
argued with rather than only read.

Reshaping. A via records which stop it follows by position, and that position
is resolved fresh every time the day is routed — so inserting, reordering or
removing a stop moved the ground under every via after it, and the drive
silently snapped back to the road it had been steered away from while the
handle still sat on the map where it was left. The correction is computed
against the day as it stands and written with the same change, in one
transaction: a half-applied re-anchoring mixes two numbering schemes in one
day. The one judgement that needs geometry — which half of a split leg a via
belongs to when a stop lands in the middle of it — is measured on the road
actually driven, so a fuel stop added to a bent leg keeps the bend on the side
it belongs to.

Alternatives. OSRM answers most long legs with exactly one route, which read as
"there is no other way" when a perfectly good slower road existed. When it
offers nothing, the same drive is asked for again without the motorway, and
failing that without the tolls — one question at a time, stopping as soon as
one lands. The offer says what it is rather than how much slower.

Stops along the way. Everything the corridor search can find is a pause, not a
destination: fuel, charging, rest areas, campsites, food and sights all sit
inside the leg they were found on, carry their own colour and icon, and are
left out of every stop count. That colour is defined once and read by the rail,
the corridor list, the map pin and the picker — and it replaced the chains'
logos, which turned a corridor full of petrol stations into a row of
advertisements and left the brands with no logo on file looking like something
else entirely.

How long a stop takes was readable in the rail and writable nowhere; new places
were given an invented hour that nobody had entered. It is now set from the
rail, cleared as a zero because the update statement folds a null into "leave
it alone", and new places start with nothing.

Both columns are rebuilt on one type scale, anchored to the day plan's own
sizes so switching tabs does not change the size of the text beside it. The
rail reads as trip totals, day cards and a chain of stops with the drives
between them; the corridor column as what to look for, how the search is
getting on, and what it found. Six category pills over three lines became one
dropdown, which is the space the results wanted.

Also: the offered routes are framed on the map when the picker opens (`fitKey`
carries no coordinates and each renderer reads it as "the selected day"), road
trip mode does not cluster at all so the whole drive stays readable zoomed out,
and the drive-time labels finally render in the app's own typeface instead of
Leaflet's Helvetica. All of it in both renderers.
This commit is contained in:
Maurice
2026-08-29 21:05:22 +02:00
committed by Maurice
parent 1db55f734c
commit e11ae6f056
110 changed files with 7375 additions and 569 deletions
+33
View File
@@ -22,6 +22,10 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.food': 'طعام',
'roadtrip.poi.sights': 'معالم',
'roadtrip.poi.within': 'ضمن',
'roadtrip.poi.filter': 'تصفية حسب الاسم',
'roadtrip.poi.noMatch': 'لا يوجد على الطريق ما يطابق «{name}».',
'roadtrip.poi.foundFiltered': '{count} من {total} على الطريق',
'roadtrip.poi.truncated': 'في {count} من المقاطع كان هناك أكثر مما تتسع له استجابة واحدة — قلّص الممر لرؤية البقية.',
'roadtrip.poi.search': 'ابحث على طول المسار',
'roadtrip.poi.searching': 'جارٍ البحث {done} من {total}',
'roadtrip.poi.capped': 'المسار طويل — تم البحث في الجزء الأول فقط.',
@@ -34,12 +38,41 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.alongRoute': 'بعد {distance}',
'roadtrip.summary.distance': 'المسافة',
'roadtrip.summary.driving': 'مدة القيادة',
'roadtrip.alt.ask': 'مسارات أخرى',
'roadtrip.alt.title': 'طرق قيادة هذه المرحلة',
'roadtrip.alt.loading': 'يجري سؤال خادم المسارات…',
'roadtrip.alt.onlyOne': 'لهذه المرحلة طريق معقول واحد فقط.',
'roadtrip.alt.failed': 'خادم المسارات لا يستجيب حاليًا.',
'roadtrip.alt.current': 'الحالي',
'roadtrip.alt.fastest': 'الأسرع',
'roadtrip.alt.slower': 'أبطأ بـ {time}',
'roadtrip.alt.quicker': 'أسرع بـ {time}',
'roadtrip.day': 'اليوم {number}',
'roadtrip.quietDay.empty': 'لا توجد محطات بعد — أفلِت واحدة هنا',
'roadtrip.quietDay.one': 'حتى الآن {name} فقط — أفلِت محطة هنا',
'roadtrip.leg.driveText': '{distance} خلال {time}',
'roadtrip.day.stopCount': '{count} محطات',
'roadtrip.stop.stayShort': 'مدة',
'roadtrip.leg.pending': 'لا يوجد مسار',
'roadtrip.stop.addTitle': 'إضافة كمحطة توقف',
'roadtrip.stop.kind': 'نوع المحطة',
'roadtrip.stop.landsOn': 'اليوم {day}، المحطة {position}',
'roadtrip.stop.duplicate': '«{name}» موجود بالفعل في هذه الرحلة.',
'roadtrip.stop.moreDetails': 'مزيد من التفاصيل',
'roadtrip.stop.stay': 'مدة التوقف هنا',
'roadtrip.stop.pinned': 'الوقت الذي حددته',
'roadtrip.stop.computed': 'محسوب من زمن القيادة',
'roadtrip.via.hint': 'اسحب لإعادة تشكيل المسار، وانقر بالزر الأيمن للإزالة',
'roadtrip.warn.late': 'الوصول بعد {minutes} دقيقة من الوقت المحدد',
'roadtrip.warn.overnight': 'اليوم التالي',
'roadtrip.summary.stops': 'محطات التوقف',
'roadtrip.stay.add': 'تحديد مدة التوقف',
'roadtrip.stay.none': 'بدون توقف',
'roadtrip.stay.custom': 'دقائق',
'roadtrip.stay.arrive': 'الوصول',
'roadtrip.stay.leave': 'المغادرة',
'roadtrip.alt.noMotorway': 'بدون طريق سريع',
'roadtrip.alt.noToll': 'بدون رسوم',
'roadtrip.summary.partial': 'لا يزال يجري حساب بقية الطريق',
};
export default roadtrip;
+2
View File
@@ -23,6 +23,8 @@ const settings: TranslationStrings = {
'settings.mapTemplate': 'قالب الخريطة',
'settings.mapTemplatePlaceholder.select': 'اختر قالبًا...',
'settings.mapDefaultHint': 'اتركه فارغًا لاستخدام OpenStreetMap افتراضيًا',
'settings.routingBase': 'محرك مسارات خاص',
'settings.routingBaseHint': 'خادم OSRM خاص بك. اتركه فارغًا لاستخدام الخوادم العامة التي تسمح بطلب واحد تقريبًا في الثانية — يكفي ليوم واحد، وضيّق لرحلة برية. يسري بعد إعادة تشغيل الخادم.',
'settings.mapHint': 'قالب URL لبلاطات الخريطة',
'settings.mapProvider': 'مزود الخريطة',
'settings.mapProviderHint': 'يؤثر على خرائط Trip Planner و Journey. يستخدم Atlas دائمًا Leaflet.',
+33
View File
@@ -22,6 +22,10 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.food': 'Comida',
'roadtrip.poi.sights': 'Pontos turísticos',
'roadtrip.poi.within': 'Num raio de',
'roadtrip.poi.filter': 'Filtrar por nome',
'roadtrip.poi.noMatch': 'Nada no trajeto corresponde a “{name}”.',
'roadtrip.poi.foundFiltered': '{count} de {total} no trajeto',
'roadtrip.poi.truncated': 'Em {count} trechos havia mais do que cabe em uma resposta — estreite o corredor para ver o restante.',
'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.',
@@ -34,12 +38,41 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.alongRoute': 'após {distance}',
'roadtrip.summary.distance': 'Distância',
'roadtrip.summary.driving': 'Tempo de direção',
'roadtrip.alt.ask': 'Outras rotas',
'roadtrip.alt.title': 'Rotas para este trecho',
'roadtrip.alt.loading': 'Consultando o roteador…',
'roadtrip.alt.onlyOne': 'Só há uma forma sensata de fazer este trecho.',
'roadtrip.alt.failed': 'O roteador não está respondendo agora.',
'roadtrip.alt.current': 'Atual',
'roadtrip.alt.fastest': 'Mais rápida',
'roadtrip.alt.slower': '{time} mais lenta',
'roadtrip.alt.quicker': '{time} mais rápida',
'roadtrip.day': 'Dia {number}',
'roadtrip.quietDay.empty': 'Ainda sem paradas — solte uma aqui',
'roadtrip.quietDay.one': 'Até agora só {name} — solte uma parada aqui',
'roadtrip.leg.driveText': '{distance} em {time}',
'roadtrip.day.stopCount': '{count} paradas',
'roadtrip.stop.stayShort': 'Parada',
'roadtrip.leg.pending': 'Sem rota',
'roadtrip.stop.addTitle': 'Adicionar como parada',
'roadtrip.stop.kind': 'Tipo de parada',
'roadtrip.stop.landsOn': 'Dia {day}, como parada {position}',
'roadtrip.stop.duplicate': '“{name}” já está nesta viagem.',
'roadtrip.stop.moreDetails': 'Mais detalhes',
'roadtrip.stop.stay': 'Tempo nesta parada',
'roadtrip.stop.pinned': 'Horário definido por você',
'roadtrip.stop.computed': 'Calculado a partir do trajeto',
'roadtrip.via.hint': 'Arraste para remodelar a rota, clique com o botão direito para remover',
'roadtrip.warn.late': 'Chega {minutes} min depois do horário definido',
'roadtrip.warn.overnight': 'Dia seguinte',
'roadtrip.summary.stops': 'Paradas',
'roadtrip.stay.add': 'Definir a permanencia',
'roadtrip.stay.none': 'Sem permanencia',
'roadtrip.stay.custom': 'Minutos',
'roadtrip.stay.arrive': 'Chegada',
'roadtrip.stay.leave': 'Partida',
'roadtrip.alt.noMotorway': 'Sem rodovia',
'roadtrip.alt.noToll': 'Sem pedagio',
'roadtrip.summary.partial': 'O restante do trajeto ainda está sendo calculado',
};
export default roadtrip;
+2
View File
@@ -25,6 +25,8 @@ const settings: TranslationStrings = {
'settings.mapTemplate': 'Modelo de mapa',
'settings.mapTemplatePlaceholder.select': 'Selecione o modelo...',
'settings.mapDefaultHint': 'Deixe vazio para OpenStreetMap (padrão)',
'settings.routingBase': 'Servidor de rotas próprio',
'settings.routingBaseHint': 'Uma instância própria do OSRM. Vazio usa os servidores públicos, que permitem cerca de uma requisição por segundo — suficiente para um dia, apertado para uma viagem de carro. Passa a valer após reiniciar o servidor.',
'settings.mapHint': 'URL do modelo de blocos do mapa',
'settings.mapProvider': 'Provedor de mapa',
'settings.mapProviderHint': 'Afeta os mapas do Planejador de Viagem e Diário. Atlas sempre usa Leaflet.',
+33
View File
@@ -22,6 +22,10 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.food': 'Menjar',
'roadtrip.poi.sights': 'Llocs d’interès',
'roadtrip.poi.within': 'En un radi de',
'roadtrip.poi.filter': 'Filtra per nom',
'roadtrip.poi.noMatch': 'Res del trajecte no coincideix amb «{name}».',
'roadtrip.poi.foundFiltered': '{count} de {total} al trajecte',
'roadtrip.poi.truncated': 'En {count} trams hi havia més del que cap en una resposta: estreny el corredor per veure la resta.',
'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.',
@@ -34,12 +38,41 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.alongRoute': 'després de {distance}',
'roadtrip.summary.distance': 'Distància',
'roadtrip.summary.driving': 'Temps de conducció',
'roadtrip.alt.ask': 'Altres rutes',
'roadtrip.alt.title': 'Rutes per a aquest tram',
'roadtrip.alt.loading': 'S’està consultant l’encaminador…',
'roadtrip.alt.onlyOne': 'Només hi ha una manera raonable de fer aquest tram.',
'roadtrip.alt.failed': 'L’encaminador no respon ara mateix.',
'roadtrip.alt.current': 'Actual',
'roadtrip.alt.fastest': 'La més ràpida',
'roadtrip.alt.slower': '{time} més lenta',
'roadtrip.alt.quicker': '{time} més ràpida',
'roadtrip.day': 'Dia {number}',
'roadtrip.quietDay.empty': 'Encara sense parades: deixa’n una aquí',
'roadtrip.quietDay.one': 'De moment només {name}: deixa una parada aquí',
'roadtrip.leg.driveText': '{distance} en {time}',
'roadtrip.day.stopCount': '{count} parades',
'roadtrip.stop.stayShort': 'Parada',
'roadtrip.leg.pending': 'Sense ruta',
'roadtrip.stop.addTitle': 'Afegeix com a parada',
'roadtrip.stop.kind': 'Tipus de parada',
'roadtrip.stop.landsOn': 'Dia {day}, com a parada {position}',
'roadtrip.stop.duplicate': '«{name}» ja és en aquest viatge.',
'roadtrip.stop.moreDetails': 'Més detalls',
'roadtrip.stop.stay': 'Temps en aquesta parada',
'roadtrip.stop.pinned': 'Hora que has fixat',
'roadtrip.stop.computed': 'Calculat a partir del trajecte',
'roadtrip.via.hint': 'Arrossega per remodelar la ruta, clic dret per eliminar',
'roadtrip.warn.late': 'Arriba {minutes} min després de l’hora fixada',
'roadtrip.warn.overnight': 'Dia següent',
'roadtrip.summary.stops': 'Parades',
'roadtrip.stay.add': 'Defineix una estada',
'roadtrip.stay.none': 'Sense estada',
'roadtrip.stay.custom': 'Minuts',
'roadtrip.stay.arrive': 'Arribada',
'roadtrip.stay.leave': 'Sortida',
'roadtrip.alt.noMotorway': 'Sense autopista',
'roadtrip.alt.noToll': 'Sense peatges',
'roadtrip.summary.partial': 'Encara s’està calculant la resta del trajecte',
};
export default roadtrip;
+2
View File
@@ -14,6 +14,8 @@ const settings: TranslationStrings = {
'settings.mapTemplate': 'Plantilla del mapa',
'settings.mapTemplatePlaceholder.select': 'Selecciona una plantilla...',
'settings.mapDefaultHint': 'Deixa-ho buit per a OpenStreetMap (per defecte)',
'settings.routingBase': 'Motor de rutes propi',
'settings.routingBaseHint': 'Una instància pròpia d’OSRM. Buit fa servir els servidors públics, que permeten aproximadament una petició per segon: prou per a un dia, just per a un viatge llarg. Té efecte després de reiniciar el servidor.',
'settings.mapHint': "Plantilla d'URL per als mosaics del mapa",
'settings.mapProvider': 'Proveïdor de mapa',
'settings.mapProviderHint': 'Afecta els mapes de Trip Planner i Journey. Atles sempre utilitza Leaflet.',
+33
View File
@@ -22,6 +22,10 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.food': 'Jídlo',
'roadtrip.poi.sights': 'Zajímavosti',
'roadtrip.poi.within': 'Do',
'roadtrip.poi.filter': 'Filtrovat podle názvu',
'roadtrip.poi.noMatch': 'Na trase nic neodpovídá „{name}“.',
'roadtrip.poi.foundFiltered': '{count} z {total} na trase',
'roadtrip.poi.truncated': 'Na {count} úsecích jich bylo více, než se vejde do jedné odpovědi — zužte koridor, abyste viděli zbytek.',
'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.',
@@ -34,12 +38,41 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.alongRoute': 'po {distance}',
'roadtrip.summary.distance': 'Vzdálenost',
'roadtrip.summary.driving': 'Doba jízdy',
'roadtrip.alt.ask': 'Jiné trasy',
'roadtrip.alt.title': 'Trasy tohoto úseku',
'roadtrip.alt.loading': 'Dotaz na směrovací server…',
'roadtrip.alt.onlyOne': 'Pro tento úsek existuje jen jedna rozumná trasa.',
'roadtrip.alt.failed': 'Směrovací server teď neodpovídá.',
'roadtrip.alt.current': 'Aktuální',
'roadtrip.alt.fastest': 'Nejrychlejší',
'roadtrip.alt.slower': 'o {time} déle',
'roadtrip.alt.quicker': 'o {time} rychleji',
'roadtrip.day': 'Den {number}',
'roadtrip.quietDay.empty': 'Zatím žádné zastávky — přetáhněte sem',
'roadtrip.quietDay.one': 'Zatím jen {name} — přetáhněte sem zastávku',
'roadtrip.leg.driveText': '{distance} za {time}',
'roadtrip.day.stopCount': 'zastávek: {count}',
'roadtrip.stop.stayShort': 'Pobyt',
'roadtrip.leg.pending': 'Bez trasy',
'roadtrip.stop.addTitle': 'Přidat jako zastávku',
'roadtrip.stop.kind': 'Druh zastávky',
'roadtrip.stop.landsOn': '{day}. den, jako {position}. zastávka',
'roadtrip.stop.duplicate': '„{name}“ už v této cestě je.',
'roadtrip.stop.moreDetails': 'Více podrobností',
'roadtrip.stop.stay': 'Čas na této zastávce',
'roadtrip.stop.pinned': 'Čas, který jste nastavili',
'roadtrip.stop.computed': 'Vypočteno z doby jízdy',
'roadtrip.via.hint': 'Tažením změníte trasu, pravým tlačítkem odeberete',
'roadtrip.warn.late': 'Příjezd {minutes} min po nastaveném čase',
'roadtrip.warn.overnight': 'Následující den',
'roadtrip.summary.stops': 'Zastávky',
'roadtrip.stay.add': 'Nastavit dobu zastavky',
'roadtrip.stay.none': 'Bez zastavky',
'roadtrip.stay.custom': 'Minuty',
'roadtrip.stay.arrive': 'Prijezd',
'roadtrip.stay.leave': 'Odjezd',
'roadtrip.alt.noMotorway': 'Bez dalnice',
'roadtrip.alt.noToll': 'Bez mytneho',
'roadtrip.summary.partial': 'Zbytek trasy se ještě počítá',
};
export default roadtrip;
+2
View File
@@ -24,6 +24,8 @@ const settings: TranslationStrings = {
'settings.mapTemplate': 'Šablona mapy',
'settings.mapTemplatePlaceholder.select': 'Vyberte šablonu...',
'settings.mapDefaultHint': 'Ponechte prázdné pro OpenStreetMap (výchozí)',
'settings.routingBase': 'Vlastní směrovací server',
'settings.routingBaseHint': 'Vlastní instance OSRM. Prázdné použije veřejné servery s limitem asi jednoho požadavku za sekundu — na den to stačí, na road trip je to málo. Projeví se po restartu serveru.',
'settings.mapHint': 'URL šablony pro mapové dlaždice',
'settings.mapProvider': 'Poskytovatel mapy',
'settings.mapProviderHint': 'Ovlivňuje mapy v Trip Planneru a Journey. Atlas vždy používá Leaflet.',
+33
View File
@@ -22,6 +22,10 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.food': 'Essen',
'roadtrip.poi.sights': 'Sehenswertes',
'roadtrip.poi.within': 'Im Umkreis',
'roadtrip.poi.filter': 'Nach Name filtern',
'roadtrip.poi.noMatch': 'Unterwegs passt nichts zu „{name}“.',
'roadtrip.poi.foundFiltered': '{count} von {total} unterwegs',
'roadtrip.poi.truncated': 'Auf {count} Abschnitten gab es mehr, als in eine Antwort passt — den Korridor schmaler machen, um den Rest zu sehen.',
'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.',
@@ -34,12 +38,41 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.alongRoute': 'nach {distance}',
'roadtrip.summary.distance': 'Strecke',
'roadtrip.summary.driving': 'Fahrzeit',
'roadtrip.alt.ask': 'Andere Wege',
'roadtrip.alt.title': 'Wege für diese Etappe',
'roadtrip.alt.loading': 'Der Router wird gefragt…',
'roadtrip.alt.onlyOne': 'Für diese Etappe gibt es nur einen sinnvollen Weg.',
'roadtrip.alt.failed': 'Der Router antwortet gerade nicht.',
'roadtrip.alt.current': 'Aktuell',
'roadtrip.alt.fastest': 'Schnellste',
'roadtrip.alt.slower': '{time} länger',
'roadtrip.alt.quicker': '{time} kürzer',
'roadtrip.day': 'Tag {number}',
'roadtrip.quietDay.empty': 'Noch keine Stopps — hier ablegen',
'roadtrip.quietDay.one': 'Bisher nur {name} — hier einen Stopp ablegen',
'roadtrip.leg.driveText': '{distance} in {time}',
'roadtrip.day.stopCount': '{count} Stopps',
'roadtrip.stop.stayShort': 'Dauer',
'roadtrip.leg.pending': 'Keine Route',
'roadtrip.stop.addTitle': 'Als Stopp hinzufügen',
'roadtrip.stop.kind': 'Art des Stopps',
'roadtrip.stop.landsOn': 'Tag {day}, als Stopp {position}',
'roadtrip.stop.duplicate': '„{name}“ ist auf dieser Reise schon vorhanden.',
'roadtrip.stop.moreDetails': 'Mehr Details',
'roadtrip.stop.stay': 'Aufenthalt an diesem Stopp',
'roadtrip.stop.pinned': 'Von dir gesetzte Zeit',
'roadtrip.stop.computed': 'Aus der Fahrzeit gerechnet',
'roadtrip.via.hint': 'Ziehen formt die Route um, Rechtsklick entfernt',
'roadtrip.warn.late': 'Ankunft {minutes} min nach der gesetzten Zeit',
'roadtrip.warn.overnight': 'Folgetag',
'roadtrip.summary.stops': 'Stopps',
'roadtrip.stay.add': 'Aufenthalt festlegen',
'roadtrip.stay.none': 'Kein Aufenthalt',
'roadtrip.stay.custom': 'Minuten',
'roadtrip.stay.arrive': 'Ankunft',
'roadtrip.stay.leave': 'Abfahrt',
'roadtrip.alt.noMotorway': 'Ohne Autobahn',
'roadtrip.alt.noToll': 'Ohne Maut',
'roadtrip.summary.partial': 'Der Rest der Strecke wird noch berechnet',
};
export default roadtrip;
+2
View File
@@ -25,6 +25,8 @@ const settings: TranslationStrings = {
'settings.mapTemplate': 'Karten-Vorlage',
'settings.mapTemplatePlaceholder.select': 'Vorlage auswählen...',
'settings.mapDefaultHint': 'Leer lassen für OpenStreetMap (Standard)',
'settings.routingBase': 'Eigene Routing-Instanz',
'settings.routingBaseHint': 'Eine eigene OSRM-Instanz. Leer nutzt die öffentlichen Server, die etwa eine Anfrage pro Sekunde erlauben — für einen Tag genug, für einen Roadtrip knapp. Wirkt erst nach einem Serverneustart.',
'settings.mapHint': 'URL-Template für die Kartenkacheln',
'settings.mapProvider': 'Kartenanbieter',
'settings.mapProviderHint': 'Gilt für Trip Planner und Journey. Atlas nutzt immer Leaflet.',
+33
View File
@@ -22,6 +22,10 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.food': 'Food',
'roadtrip.poi.sights': 'Sights',
'roadtrip.poi.within': 'Within',
'roadtrip.poi.filter': 'Filter by name',
'roadtrip.poi.noMatch': 'Nothing on the way matches “{name}”.',
'roadtrip.poi.foundFiltered': '{count} of {total} on the way',
'roadtrip.poi.truncated': '{count} stretches had more than fits in one answer — narrow the corridor to see the rest.',
'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.',
@@ -34,12 +38,41 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.alongRoute': 'after {distance}',
'roadtrip.summary.distance': 'Distance',
'roadtrip.summary.driving': 'Driving time',
'roadtrip.alt.ask': 'Other ways',
'roadtrip.alt.title': 'Ways to drive this leg',
'roadtrip.alt.loading': 'Asking the router…',
'roadtrip.alt.onlyOne': 'Only one sensible way to drive this one.',
'roadtrip.alt.failed': 'The router is not answering right now.',
'roadtrip.alt.current': 'Current',
'roadtrip.alt.fastest': 'Fastest',
'roadtrip.alt.slower': '{time} slower',
'roadtrip.alt.quicker': '{time} quicker',
'roadtrip.day': 'Day {number}',
'roadtrip.quietDay.empty': 'No stops yet — drop one here',
'roadtrip.quietDay.one': 'Only {name} so far — drop a stop here',
'roadtrip.leg.driveText': '{distance} in {time}',
'roadtrip.day.stopCount': '{count} stops',
'roadtrip.stop.stayShort': 'Stay',
'roadtrip.leg.pending': 'No route',
'roadtrip.stop.addTitle': 'Add as a stop',
'roadtrip.stop.kind': 'Kind of stop',
'roadtrip.stop.landsOn': 'Day {day}, as stop {position}',
'roadtrip.stop.duplicate': '“{name}” is already on this trip.',
'roadtrip.stop.moreDetails': 'More details',
'roadtrip.stop.stay': 'Time at this stop',
'roadtrip.stop.pinned': 'Time you set',
'roadtrip.stop.computed': 'Calculated from the drive',
'roadtrip.via.hint': 'Drag to reshape the route, right-click to remove',
'roadtrip.warn.late': 'Arrives {minutes} min after the time you set',
'roadtrip.warn.overnight': 'Next day',
'roadtrip.summary.stops': 'Stops',
'roadtrip.stay.add': 'Add a stay',
'roadtrip.stay.none': 'No stay',
'roadtrip.stay.custom': 'Minutes',
'roadtrip.stay.arrive': 'Arrive',
'roadtrip.stay.leave': 'Leave',
'roadtrip.alt.noMotorway': 'No motorway',
'roadtrip.alt.noToll': 'No tolls',
'roadtrip.summary.partial': 'Still working out the rest of the drive',
};
export default roadtrip;
+2
View File
@@ -33,6 +33,8 @@ const settings: TranslationStrings = {
'settings.mapTemplate': 'Map Template',
'settings.mapTemplatePlaceholder.select': 'Select template...',
'settings.mapDefaultHint': 'Leave empty for OpenStreetMap (default)',
'settings.routingBase': 'Own routing engine',
'settings.routingBaseHint': 'An OSRM instance of your own. Empty uses the public servers, which allow about one request a second — enough for a day, tight for a road trip. Takes effect after a server restart.',
'settings.mapHint': 'URL template for map tiles',
'settings.mapProvider': 'Map Provider',
'settings.mapProviderHint': 'Affects Trip Planner and Journey maps. Atlas always uses Leaflet.',
+33
View File
@@ -22,6 +22,10 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.food': 'Comida',
'roadtrip.poi.sights': 'Lugares de interés',
'roadtrip.poi.within': 'En un radio de',
'roadtrip.poi.filter': 'Filtrar por nombre',
'roadtrip.poi.noMatch': 'Nada en la ruta coincide con «{name}».',
'roadtrip.poi.foundFiltered': '{count} de {total} en la ruta',
'roadtrip.poi.truncated': 'En {count} tramos había más de lo que cabe en una respuesta: reduce el corredor para ver el resto.',
'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.',
@@ -34,12 +38,41 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.alongRoute': 'tras {distance}',
'roadtrip.summary.distance': 'Distancia',
'roadtrip.summary.driving': 'Tiempo de conducción',
'roadtrip.alt.ask': 'Otras rutas',
'roadtrip.alt.title': 'Rutas para este tramo',
'roadtrip.alt.loading': 'Consultando al enrutador…',
'roadtrip.alt.onlyOne': 'Solo hay una forma razonable de hacer este tramo.',
'roadtrip.alt.failed': 'El enrutador no responde ahora mismo.',
'roadtrip.alt.current': 'Actual',
'roadtrip.alt.fastest': 'La más rápida',
'roadtrip.alt.slower': '{time} más',
'roadtrip.alt.quicker': '{time} menos',
'roadtrip.day': 'Día {number}',
'roadtrip.quietDay.empty': 'Sin paradas todavía: suelta una aquí',
'roadtrip.quietDay.one': 'Por ahora solo {name}: suelta una parada aquí',
'roadtrip.leg.driveText': '{distance} en {time}',
'roadtrip.day.stopCount': '{count} paradas',
'roadtrip.stop.stayShort': 'Parada',
'roadtrip.leg.pending': 'Sin ruta',
'roadtrip.stop.addTitle': 'Añadir como parada',
'roadtrip.stop.kind': 'Tipo de parada',
'roadtrip.stop.landsOn': 'Día {day}, como parada {position}',
'roadtrip.stop.duplicate': '«{name}» ya está en este viaje.',
'roadtrip.stop.moreDetails': 'Más detalles',
'roadtrip.stop.stay': 'Tiempo en la parada',
'roadtrip.stop.pinned': 'Hora fijada por ti',
'roadtrip.stop.computed': 'Calculado a partir del trayecto',
'roadtrip.via.hint': 'Arrastra para remodelar la ruta, clic derecho para quitar',
'roadtrip.warn.late': 'Llega {minutes} min después de la hora fijada',
'roadtrip.warn.overnight': 'Día siguiente',
'roadtrip.summary.stops': 'Paradas',
'roadtrip.stay.add': 'Anadir una parada',
'roadtrip.stay.none': 'Sin parada',
'roadtrip.stay.custom': 'Minutos',
'roadtrip.stay.arrive': 'Llegada',
'roadtrip.stay.leave': 'Salida',
'roadtrip.alt.noMotorway': 'Sin autopista',
'roadtrip.alt.noToll': 'Sin peajes',
'roadtrip.summary.partial': 'Aún se está calculando el resto del trayecto',
};
export default roadtrip;
+2
View File
@@ -24,6 +24,8 @@ const settings: TranslationStrings = {
'settings.mapTemplate': 'Plantilla del mapa',
'settings.mapTemplatePlaceholder.select': 'Seleccionar plantilla...',
'settings.mapDefaultHint': 'Déjalo vacío para OpenStreetMap (por defecto)',
'settings.routingBase': 'Motor de rutas propio',
'settings.routingBaseHint': 'Una instancia propia de OSRM. Vacío usa los servidores públicos, que permiten cerca de una petición por segundo: suficiente para un día, justo para una ruta larga. Surte efecto tras reiniciar el servidor.',
'settings.mapHint': 'Plantilla de URL para los mosaicos del mapa',
'settings.mapProvider': 'Proveedor de mapa',
'settings.mapProviderHint': 'Afecta a los mapas de Trip Planner y Journey. Atlas siempre usa Leaflet.',
+33
View File
@@ -22,6 +22,10 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.food': 'Restauration',
'roadtrip.poi.sights': 'À voir',
'roadtrip.poi.within': 'Dans un rayon de',
'roadtrip.poi.filter': 'Filtrer par nom',
'roadtrip.poi.noMatch': 'Rien sur le trajet ne correspond à « {name} ».',
'roadtrip.poi.foundFiltered': '{count} sur {total} sur le trajet',
'roadtrip.poi.truncated': 'Sur {count} tronçons, il y en avait plus que ce qu’une réponse peut contenir : réduisez le corridor pour voir le reste.',
'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.',
@@ -34,12 +38,41 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.alongRoute': 'après {distance}',
'roadtrip.summary.distance': 'Distance',
'roadtrip.summary.driving': 'Temps de conduite',
'roadtrip.alt.ask': 'Autres itinéraires',
'roadtrip.alt.title': 'Itinéraires pour cette étape',
'roadtrip.alt.loading': 'Interrogation du routeur…',
'roadtrip.alt.onlyOne': 'Il n’y a qu’un itinéraire raisonnable pour cette étape.',
'roadtrip.alt.failed': 'Le routeur ne répond pas pour le moment.',
'roadtrip.alt.current': 'Actuel',
'roadtrip.alt.fastest': 'La plus rapide',
'roadtrip.alt.slower': '{time} de plus',
'roadtrip.alt.quicker': '{time} de moins',
'roadtrip.day': 'Jour {number}',
'roadtrip.quietDay.empty': 'Aucun arrêt — déposez-en un ici',
'roadtrip.quietDay.one': 'Seulement {name} pour l’instant — déposez un arrêt ici',
'roadtrip.leg.driveText': '{distance} en {time}',
'roadtrip.day.stopCount': '{count} arrêts',
'roadtrip.stop.stayShort': 'Durée',
'roadtrip.leg.pending': 'Pas d’itinéraire',
'roadtrip.stop.addTitle': 'Ajouter comme arrêt',
'roadtrip.stop.kind': 'Type d’arrêt',
'roadtrip.stop.landsOn': 'Jour {day}, en tant qu’arrêt {position}',
'roadtrip.stop.duplicate': '« {name} » figure déjà dans ce voyage.',
'roadtrip.stop.moreDetails': 'Plus de détails',
'roadtrip.stop.stay': 'Temps sur place',
'roadtrip.stop.pinned': 'Heure que vous avez fixée',
'roadtrip.stop.computed': 'Calculé d’après le trajet',
'roadtrip.via.hint': 'Faites glisser pour remodeler l’itinéraire, clic droit pour supprimer',
'roadtrip.warn.late': 'Arrivée {minutes} min après l’heure fixée',
'roadtrip.warn.overnight': 'Jour suivant',
'roadtrip.summary.stops': 'Étapes',
'roadtrip.stay.add': 'Definir une duree',
'roadtrip.stay.none': 'Aucune duree',
'roadtrip.stay.custom': 'Minutes',
'roadtrip.stay.arrive': 'Arrivee',
'roadtrip.stay.leave': 'Depart',
'roadtrip.alt.noMotorway': 'Sans autoroute',
'roadtrip.alt.noToll': 'Sans peage',
'roadtrip.summary.partial': 'Le reste du trajet est encore en cours de calcul',
};
export default roadtrip;
+2
View File
@@ -24,6 +24,8 @@ const settings: TranslationStrings = {
'settings.mapTemplate': 'Modèle de carte',
'settings.mapTemplatePlaceholder.select': 'Sélectionner un modèle…',
'settings.mapDefaultHint': 'Laissez vide pour OpenStreetMap (par défaut)',
'settings.routingBase': 'Moteur de calcul d’itinéraire propre',
'settings.routingBaseHint': 'Votre propre instance OSRM. Vide utilise les serveurs publics, limités à environ une requête par seconde : suffisant pour une journée, juste pour un road trip. Prend effet après un redémarrage du serveur.',
'settings.mapHint': "Modèle d'URL pour les tuiles de carte",
'settings.mapProvider': 'Fournisseur de carte',
'settings.mapProviderHint': 'Affecte les cartes Trip Planner et Journey. Atlas utilise toujours Leaflet.',
+33
View File
@@ -22,6 +22,10 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.food': 'Φαγητό',
'roadtrip.poi.sights': 'Αξιοθέατα',
'roadtrip.poi.within': 'Εντός',
'roadtrip.poi.filter': 'Φιλτράρισμα κατά όνομα',
'roadtrip.poi.noMatch': 'Τίποτα στη διαδρομή δεν ταιριάζει με «{name}».',
'roadtrip.poi.foundFiltered': '{count} από {total} στη διαδρομή',
'roadtrip.poi.truncated': 'Σε {count} τμήματα υπήρχαν περισσότερα από όσα χωρούν σε μία απάντηση — στενέψτε τον διάδρομο για να δείτε τα υπόλοιπα.',
'roadtrip.poi.search': 'Αναζήτηση κατά μήκος της διαδρομής',
'roadtrip.poi.searching': 'Αναζήτηση {done} από {total}',
'roadtrip.poi.capped': 'Η διαδρομή είναι μεγάλη — αναζητήθηκε μόνο το πρώτο τμήμα.',
@@ -34,12 +38,41 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.alongRoute': 'μετά από {distance}',
'roadtrip.summary.distance': 'Απόσταση',
'roadtrip.summary.driving': 'Χρόνος οδήγησης',
'roadtrip.alt.ask': 'Άλλες διαδρομές',
'roadtrip.alt.title': 'Διαδρομές για αυτό το σκέλος',
'roadtrip.alt.loading': 'Ερώτημα στον δρομολογητή…',
'roadtrip.alt.onlyOne': 'Υπάρχει μόνο μία λογική διαδρομή για αυτό το σκέλος.',
'roadtrip.alt.failed': 'Ο δρομολογητής δεν απαντά αυτή τη στιγμή.',
'roadtrip.alt.current': 'Τρέχουσα',
'roadtrip.alt.fastest': 'Η ταχύτερη',
'roadtrip.alt.slower': '{time} πιο αργή',
'roadtrip.alt.quicker': '{time} πιο γρήγορη',
'roadtrip.day': 'Ημέρα {number}',
'roadtrip.quietDay.empty': 'Καμία στάση ακόμη — αφήστε μία εδώ',
'roadtrip.quietDay.one': 'Μέχρι στιγμής μόνο {name} — αφήστε μια στάση εδώ',
'roadtrip.leg.driveText': '{distance} σε {time}',
'roadtrip.day.stopCount': '{count} στάσεις',
'roadtrip.stop.stayShort': 'Στάση',
'roadtrip.leg.pending': 'Χωρίς διαδρομή',
'roadtrip.stop.addTitle': 'Προσθήκη ως στάση',
'roadtrip.stop.kind': 'Είδος στάσης',
'roadtrip.stop.landsOn': 'Ημέρα {day}, ως στάση {position}',
'roadtrip.stop.duplicate': '«{name}» υπάρχει ήδη σε αυτό το ταξίδι.',
'roadtrip.stop.moreDetails': 'Περισσότερες λεπτομέρειες',
'roadtrip.stop.stay': 'Χρόνος σε αυτή τη στάση',
'roadtrip.stop.pinned': 'Ώρα που ορίσατε',
'roadtrip.stop.computed': 'Υπολογισμένη από τη διαδρομή',
'roadtrip.via.hint': 'Σύρετε για να αλλάξετε τη διαδρομή, δεξί κλικ για αφαίρεση',
'roadtrip.warn.late': 'Άφιξη {minutes} λεπτά μετά την ορισμένη ώρα',
'roadtrip.warn.overnight': 'Επόμενη μέρα',
'roadtrip.summary.stops': 'Στάσεις',
'roadtrip.stay.add': 'Ορισμος διαρκειας σταθμευσης',
'roadtrip.stay.none': 'Χωρις σταση',
'roadtrip.stay.custom': 'Λεπτα',
'roadtrip.stay.arrive': 'Αφιξη',
'roadtrip.stay.leave': 'Αναχωρηση',
'roadtrip.alt.noMotorway': 'Χωρις αυτοκινητοδρομο',
'roadtrip.alt.noToll': 'Χωρις διοδια',
'roadtrip.summary.partial': 'Υπολογίζεται ακόμη η υπόλοιπη διαδρομή',
};
export default roadtrip;
+2
View File
@@ -25,6 +25,8 @@ const settings: TranslationStrings = {
'settings.mapTemplate': 'Πρότυπο Χάρτη',
'settings.mapTemplatePlaceholder.select': 'Επιλέξτε πρότυπο...',
'settings.mapDefaultHint': 'Αφήστε κενό για OpenStreetMap (προεπιλογή)',
'settings.routingBase': 'Δική σας μηχανή δρομολόγησης',
'settings.routingBaseHint': 'Δική σας εγκατάσταση OSRM. Κενό σημαίνει τους δημόσιους διακομιστές, που επιτρέπουν περίπου ένα αίτημα ανά δευτερόλεπτο: αρκεί για μία ημέρα, λίγο για ένα οδικό ταξίδι. Ισχύει μετά από επανεκκίνηση του διακομιστή.',
'settings.mapHint': 'Πρότυπο URL για πλακίδια χάρτη',
'settings.mapProvider': 'Πάροχος Χάρτη',
'settings.mapProviderHint':
+33
View File
@@ -22,6 +22,10 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.food': 'Étkezés',
'roadtrip.poi.sights': 'Látnivalók',
'roadtrip.poi.within': 'Ezen belül',
'roadtrip.poi.filter': 'Szűrés név szerint',
'roadtrip.poi.noMatch': 'Az útvonalon semmi sem egyezik ezzel: „{name}”.',
'roadtrip.poi.foundFiltered': '{count} / {total} az útvonalon',
'roadtrip.poi.truncated': '{count} szakaszon több volt, mint amennyi egy válaszba fér — szűkítse a folyosót a többi megtekintéséhez.',
'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.',
@@ -34,12 +38,41 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.alongRoute': '{distance} után',
'roadtrip.summary.distance': 'Távolság',
'roadtrip.summary.driving': 'Vezetési idő',
'roadtrip.alt.ask': 'Más útvonalak',
'roadtrip.alt.title': 'Útvonalak ehhez a szakaszhoz',
'roadtrip.alt.loading': 'Az útvonaltervező lekérdezése…',
'roadtrip.alt.onlyOne': 'Ehhez a szakaszhoz csak egy értelmes útvonal van.',
'roadtrip.alt.failed': 'Az útvonaltervező most nem válaszol.',
'roadtrip.alt.current': 'Jelenlegi',
'roadtrip.alt.fastest': 'Leggyorsabb',
'roadtrip.alt.slower': '{time}-cel lassabb',
'roadtrip.alt.quicker': '{time}-cel gyorsabb',
'roadtrip.day': '{number}. nap',
'roadtrip.quietDay.empty': 'Még nincs megálló — húzzon ide egyet',
'roadtrip.quietDay.one': 'Egyelőre csak {name} — húzzon ide egy megállót',
'roadtrip.leg.driveText': '{distance} {time} alatt',
'roadtrip.day.stopCount': '{count} megálló',
'roadtrip.stop.stayShort': 'Idő',
'roadtrip.leg.pending': 'Nincs útvonal',
'roadtrip.stop.addTitle': 'Hozzáadás megállóként',
'roadtrip.stop.kind': 'Megálló típusa',
'roadtrip.stop.landsOn': '{day}. nap, {position}. megállóként',
'roadtrip.stop.duplicate': '„{name}” már szerepel ebben az utazásban.',
'roadtrip.stop.moreDetails': 'További részletek',
'roadtrip.stop.stay': 'Idő ezen a megállón',
'roadtrip.stop.pinned': 'Az általad megadott időpont',
'roadtrip.stop.computed': 'A menetidőből számolva',
'roadtrip.via.hint': 'Húzza az útvonal átalakításához, jobb gombbal eltávolítható',
'roadtrip.warn.late': 'Érkezés {minutes} perccel a megadott idő után',
'roadtrip.warn.overnight': 'Következő nap',
'roadtrip.summary.stops': 'Megállók',
'roadtrip.stay.add': 'Tartozkodas beallitasa',
'roadtrip.stay.none': 'Nincs tartozkodas',
'roadtrip.stay.custom': 'Perc',
'roadtrip.stay.arrive': 'Erkezes',
'roadtrip.stay.leave': 'Indulas',
'roadtrip.alt.noMotorway': 'Autopalya nelkul',
'roadtrip.alt.noToll': 'Dijmentes',
'roadtrip.summary.partial': 'A hátralévő útszakasz számítása még folyamatban',
};
export default roadtrip;
+2
View File
@@ -24,6 +24,8 @@ const settings: TranslationStrings = {
'settings.mapTemplate': 'Térkép sablon',
'settings.mapTemplatePlaceholder.select': 'Sablon kiválasztása...',
'settings.mapDefaultHint': 'Hagyd üresen az OpenStreetMap használatához (alapértelmezett)',
'settings.routingBase': 'Saját útvonaltervező',
'settings.routingBaseHint': 'Saját OSRM-példány. Üresen hagyva a nyilvános kiszolgálókat használja, amelyek másodpercenként körülbelül egy kérést engednek — egy napra elég, egy autós útra kevés. A kiszolgáló újraindítása után lép életbe.',
'settings.mapHint': 'URL sablon a térképcsempékhez',
'settings.mapProvider': 'Térkép szolgáltató',
'settings.mapProviderHint': 'A Trip Planner és Journey térképekre érvényes. Az Atlas mindig Leafletet használ.',
+33
View File
@@ -22,6 +22,10 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.food': 'Makanan',
'roadtrip.poi.sights': 'Objek wisata',
'roadtrip.poi.within': 'Dalam',
'roadtrip.poi.filter': 'Saring menurut nama',
'roadtrip.poi.noMatch': 'Tidak ada di rute yang cocok dengan “{name}”.',
'roadtrip.poi.foundFiltered': '{count} dari {total} di rute',
'roadtrip.poi.truncated': 'Di {count} ruas ada lebih banyak daripada yang muat dalam satu jawaban — persempit koridor untuk melihat sisanya.',
'roadtrip.poi.search': 'Cari di sepanjang rute',
'roadtrip.poi.searching': 'Mencari {done} dari {total}',
'roadtrip.poi.capped': 'Rute panjang — hanya bagian pertama yang dicari.',
@@ -34,12 +38,41 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.alongRoute': 'setelah {distance}',
'roadtrip.summary.distance': 'Jarak',
'roadtrip.summary.driving': 'Waktu berkendara',
'roadtrip.alt.ask': 'Rute lain',
'roadtrip.alt.title': 'Rute untuk ruas ini',
'roadtrip.alt.loading': 'Menanyakan server rute…',
'roadtrip.alt.onlyOne': 'Hanya ada satu rute yang masuk akal untuk ruas ini.',
'roadtrip.alt.failed': 'Server rute sedang tidak merespons.',
'roadtrip.alt.current': 'Saat ini',
'roadtrip.alt.fastest': 'Tercepat',
'roadtrip.alt.slower': '{time} lebih lama',
'roadtrip.alt.quicker': '{time} lebih cepat',
'roadtrip.day': 'Hari {number}',
'roadtrip.quietDay.empty': 'Belum ada perhentian — jatuhkan di sini',
'roadtrip.quietDay.one': 'Sejauh ini hanya {name} — jatuhkan perhentian di sini',
'roadtrip.leg.driveText': '{distance} dalam {time}',
'roadtrip.day.stopCount': '{count} perhentian',
'roadtrip.stop.stayShort': 'Singgah',
'roadtrip.leg.pending': 'Tidak ada rute',
'roadtrip.stop.addTitle': 'Tambahkan sebagai perhentian',
'roadtrip.stop.kind': 'Jenis perhentian',
'roadtrip.stop.landsOn': 'Hari {day}, sebagai perhentian {position}',
'roadtrip.stop.duplicate': '“{name}” sudah ada di perjalanan ini.',
'roadtrip.stop.moreDetails': 'Detail lainnya',
'roadtrip.stop.stay': 'Waktu di perhentian ini',
'roadtrip.stop.pinned': 'Waktu yang Anda tetapkan',
'roadtrip.stop.computed': 'Dihitung dari waktu berkendara',
'roadtrip.via.hint': 'Seret untuk mengubah rute, klik kanan untuk menghapus',
'roadtrip.warn.late': 'Tiba {minutes} menit setelah waktu yang ditetapkan',
'roadtrip.warn.overnight': 'Hari berikutnya',
'roadtrip.summary.stops': 'Perhentian',
'roadtrip.stay.add': 'Atur lama singgah',
'roadtrip.stay.none': 'Tanpa singgah',
'roadtrip.stay.custom': 'Menit',
'roadtrip.stay.arrive': 'Tiba',
'roadtrip.stay.leave': 'Berangkat',
'roadtrip.alt.noMotorway': 'Tanpa jalan tol cepat',
'roadtrip.alt.noToll': 'Tanpa tol',
'roadtrip.summary.partial': 'Sisa perjalanan masih dihitung',
};
export default roadtrip;
+2
View File
@@ -24,6 +24,8 @@ const settings: TranslationStrings = {
'settings.mapTemplate': 'Template Peta',
'settings.mapTemplatePlaceholder.select': 'Pilih template...',
'settings.mapDefaultHint': 'Kosongkan untuk OpenStreetMap (default)',
'settings.routingBase': 'Mesin rute sendiri',
'settings.routingBaseHint': 'Instans OSRM milik sendiri. Kosong berarti server publik, yang mengizinkan sekitar satu permintaan per detik — cukup untuk sehari, mepet untuk perjalanan darat. Berlaku setelah server dimulai ulang.',
'settings.mapHint': 'Template URL untuk tile peta',
'settings.mapProvider': 'Penyedia peta',
'settings.mapProviderHint': 'Berlaku untuk peta Trip Planner dan Journey. Atlas selalu menggunakan Leaflet.',
+33
View File
@@ -22,6 +22,10 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.food': 'Ristoro',
'roadtrip.poi.sights': 'Da vedere',
'roadtrip.poi.within': 'Entro',
'roadtrip.poi.filter': 'Filtra per nome',
'roadtrip.poi.noMatch': 'Lungo il percorso non c’è nulla che corrisponda a “{name}”.',
'roadtrip.poi.foundFiltered': '{count} di {total} lungo il percorso',
'roadtrip.poi.truncated': 'Su {count} tratti ce n’erano più di quanti ne stiano in una risposta: restringi il corridoio per vedere il resto.',
'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.',
@@ -34,12 +38,41 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.alongRoute': 'dopo {distance}',
'roadtrip.summary.distance': 'Distanza',
'roadtrip.summary.driving': 'Tempo di guida',
'roadtrip.alt.ask': 'Altri percorsi',
'roadtrip.alt.title': 'Percorsi per questa tratta',
'roadtrip.alt.loading': 'Interrogazione del router…',
'roadtrip.alt.onlyOne': 'Per questa tratta c’è un solo percorso sensato.',
'roadtrip.alt.failed': 'Il router non risponde al momento.',
'roadtrip.alt.current': 'Attuale',
'roadtrip.alt.fastest': 'La più veloce',
'roadtrip.alt.slower': '{time} in più',
'roadtrip.alt.quicker': '{time} in meno',
'roadtrip.day': 'Giorno {number}',
'roadtrip.quietDay.empty': 'Ancora nessuna sosta: trascinane una qui',
'roadtrip.quietDay.one': 'Finora solo {name}: trascina qui una sosta',
'roadtrip.leg.driveText': '{distance} in {time}',
'roadtrip.day.stopCount': '{count} soste',
'roadtrip.stop.stayShort': 'Sosta',
'roadtrip.leg.pending': 'Nessun percorso',
'roadtrip.stop.addTitle': 'Aggiungi come sosta',
'roadtrip.stop.kind': 'Tipo di sosta',
'roadtrip.stop.landsOn': 'Giorno {day}, come sosta {position}',
'roadtrip.stop.duplicate': '“{name}” è già presente in questo viaggio.',
'roadtrip.stop.moreDetails': 'Altri dettagli',
'roadtrip.stop.stay': 'Tempo alla sosta',
'roadtrip.stop.pinned': 'Orario impostato da te',
'roadtrip.stop.computed': 'Calcolato dal tragitto',
'roadtrip.via.hint': 'Trascina per rimodellare il percorso, clic destro per rimuovere',
'roadtrip.warn.late': 'Arrivo {minutes} min dopo l’orario impostato',
'roadtrip.warn.overnight': 'Giorno successivo',
'roadtrip.summary.stops': 'Soste',
'roadtrip.stay.add': 'Imposta una sosta',
'roadtrip.stay.none': 'Nessuna sosta',
'roadtrip.stay.custom': 'Minuti',
'roadtrip.stay.arrive': 'Arrivo',
'roadtrip.stay.leave': 'Partenza',
'roadtrip.alt.noMotorway': 'Senza autostrada',
'roadtrip.alt.noToll': 'Senza pedaggi',
'roadtrip.summary.partial': 'Il resto del percorso è ancora in calcolo',
};
export default roadtrip;
+2
View File
@@ -24,6 +24,8 @@ const settings: TranslationStrings = {
'settings.mapTemplate': 'Modello Mappa',
'settings.mapTemplatePlaceholder.select': 'Seleziona modello...',
'settings.mapDefaultHint': 'Lascia vuoto per OpenStreetMap (predefinito)',
'settings.routingBase': 'Motore di percorso proprio',
'settings.routingBaseHint': 'Una tua istanza OSRM. Vuoto usa i server pubblici, che consentono circa una richiesta al secondo: sufficiente per un giorno, poco per un viaggio in auto. Ha effetto dopo il riavvio del server.',
'settings.mapHint': 'Modello URL per i tile della mappa',
'settings.mapProvider': 'Provider mappa',
'settings.mapProviderHint': 'Influisce sulle mappe Trip Planner e Journey. Atlas usa sempre Leaflet.',
+33
View File
@@ -22,6 +22,10 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.food': '食事',
'roadtrip.poi.sights': '見どころ',
'roadtrip.poi.within': '範囲',
'roadtrip.poi.filter': '名前で絞り込む',
'roadtrip.poi.noMatch': 'ルート沿いに「{name}」に一致するものはありません。',
'roadtrip.poi.foundFiltered': 'ルート沿いの {total} 件中 {count} 件',
'roadtrip.poi.truncated': '{count} 区間で一度に返せる件数を超えました。回廊を狭めると残りを確認できます。',
'roadtrip.poi.search': 'ルート沿いを検索',
'roadtrip.poi.searching': '検索中 {done}/{total}',
'roadtrip.poi.capped': 'ルートが長いため、最初の区間のみ検索しました。',
@@ -34,12 +38,41 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.alongRoute': '{distance} 地点',
'roadtrip.summary.distance': '距離',
'roadtrip.summary.driving': '運転時間',
'roadtrip.alt.ask': '別のルート',
'roadtrip.alt.title': 'この区間の走り方',
'roadtrip.alt.loading': 'ルーティングサーバーに問い合わせています…',
'roadtrip.alt.onlyOne': 'この区間に妥当なルートは 1 つだけです。',
'roadtrip.alt.failed': 'ルーティングサーバーが応答していません。',
'roadtrip.alt.current': '現在',
'roadtrip.alt.fastest': '最速',
'roadtrip.alt.slower': '{time} 遅い',
'roadtrip.alt.quicker': '{time} 速い',
'roadtrip.day': '{number} 日目',
'roadtrip.quietDay.empty': 'まだ立ち寄り先がありません。ここにドロップ',
'roadtrip.quietDay.one': '今のところ {name} だけです。立ち寄り先をここにドロップ',
'roadtrip.leg.driveText': '{distance}/{time}',
'roadtrip.day.stopCount': '{count} 箇所',
'roadtrip.stop.stayShort': '滞在',
'roadtrip.leg.pending': 'ルートなし',
'roadtrip.stop.addTitle': '立ち寄り先として追加',
'roadtrip.stop.kind': '立ち寄りの種類',
'roadtrip.stop.landsOn': '{day} 日目、{position} 番目の立ち寄り先',
'roadtrip.stop.duplicate': '「{name}」はこの旅行にすでにあります。',
'roadtrip.stop.moreDetails': '詳細を追加',
'roadtrip.stop.stay': 'この立ち寄り先での滞在時間',
'roadtrip.stop.pinned': '設定した時刻',
'roadtrip.stop.computed': '運転時間からの計算値',
'roadtrip.via.hint': 'ドラッグでルートを変え、右クリックで削除',
'roadtrip.warn.late': '設定した時刻より {minutes} 分遅く到着します',
'roadtrip.warn.overnight': '翌日',
'roadtrip.summary.stops': '立ち寄り先',
'roadtrip.stay.add': '滞在時間を設定',
'roadtrip.stay.none': '滞在なし',
'roadtrip.stay.custom': '分',
'roadtrip.stay.arrive': '到着',
'roadtrip.stay.leave': '出発',
'roadtrip.alt.noMotorway': '高速道路なし',
'roadtrip.alt.noToll': '有料道路なし',
'roadtrip.summary.partial': '残りの行程を計算しています',
};
export default roadtrip;
+2
View File
@@ -24,6 +24,8 @@ const settings: TranslationStrings = {
'settings.mapTemplate': '地図テンプレート',
'settings.mapTemplatePlaceholder.select': 'テンプレートを選択…',
'settings.mapDefaultHint': '空欄の場合は OpenStreetMap(既定)を使用',
'settings.routingBase': '自前のルーティングサーバー',
'settings.routingBaseHint': '自前の OSRM インスタンス。空欄なら公開サーバーを使いますが、毎秒 1 リクエスト程度の制限があり、1 日分には足りてもロードトリップには足りません。サーバー再起動後に反映されます。',
'settings.mapHint': '地図タイルのURLテンプレート',
'settings.mapProvider': '地図プロバイダー',
'settings.mapProviderHint': '旅程プランナーと日記地図に影響します。Atlas は常に Leaflet を使用します。',
+33
View File
@@ -22,6 +22,10 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.food': '식사',
'roadtrip.poi.sights': '볼거리',
'roadtrip.poi.within': '반경',
'roadtrip.poi.filter': '이름으로 필터',
'roadtrip.poi.noMatch': '경로상에 “{name}”와(과) 일치하는 곳이 없습니다.',
'roadtrip.poi.foundFiltered': '경로상 {total}곳 중 {count}곳',
'roadtrip.poi.truncated': '{count}개 구간에서 한 번에 반환할 수 있는 수를 넘었습니다. 회랑을 좁히면 나머지를 볼 수 있습니다.',
'roadtrip.poi.search': '경로 주변 검색',
'roadtrip.poi.searching': '검색 중 {done}/{total}',
'roadtrip.poi.capped': '경로가 길어 앞부분만 검색했습니다.',
@@ -34,12 +38,41 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.alongRoute': '{distance} 지점',
'roadtrip.summary.distance': '거리',
'roadtrip.summary.driving': '운전 시간',
'roadtrip.alt.ask': '다른 경로',
'roadtrip.alt.title': '이 구간을 가는 방법',
'roadtrip.alt.loading': '경로 서버에 묻는 중…',
'roadtrip.alt.onlyOne': '이 구간에는 합리적인 경로가 하나뿐입니다.',
'roadtrip.alt.failed': '경로 서버가 응답하지 않습니다.',
'roadtrip.alt.current': '현재',
'roadtrip.alt.fastest': '가장 빠름',
'roadtrip.alt.slower': '{time} 더 걸림',
'roadtrip.alt.quicker': '{time} 더 빠름',
'roadtrip.day': '{number}일차',
'roadtrip.quietDay.empty': '아직 경유지가 없습니다. 여기에 놓으세요',
'roadtrip.quietDay.one': '지금은 {name}뿐입니다. 경유지를 여기에 놓으세요',
'roadtrip.leg.driveText': '{distance}, {time}',
'roadtrip.day.stopCount': '{count}곳',
'roadtrip.stop.stayShort': '체류',
'roadtrip.leg.pending': '경로 없음',
'roadtrip.stop.addTitle': '경유지로 추가',
'roadtrip.stop.kind': '경유지 종류',
'roadtrip.stop.landsOn': '{day}일차, {position}번째 경유지',
'roadtrip.stop.duplicate': '“{name}”은(는) 이미 이 여행에 있습니다.',
'roadtrip.stop.moreDetails': '자세히 입력',
'roadtrip.stop.stay': '이 경유지 체류 시간',
'roadtrip.stop.pinned': '직접 지정한 시간',
'roadtrip.stop.computed': '주행 시간으로 계산됨',
'roadtrip.via.hint': '끌어서 경로를 바꾸고, 오른쪽 클릭으로 삭제',
'roadtrip.warn.late': '지정한 시간보다 {minutes}분 늦게 도착',
'roadtrip.warn.overnight': '다음 날',
'roadtrip.summary.stops': '경유지',
'roadtrip.stay.add': '체류 시간 설정',
'roadtrip.stay.none': '체류 없음',
'roadtrip.stay.custom': '분',
'roadtrip.stay.arrive': '도착',
'roadtrip.stay.leave': '출발',
'roadtrip.alt.noMotorway': '고속도로 제외',
'roadtrip.alt.noToll': '통행료 없음',
'roadtrip.summary.partial': '남은 구간을 계산하고 있습니다',
};
export default roadtrip;
+2
View File
@@ -24,6 +24,8 @@ const settings: TranslationStrings = {
'settings.mapTemplate': '지도 템플릿',
'settings.mapTemplatePlaceholder.select': '템플릿 선택...',
'settings.mapDefaultHint': '비워두면 OpenStreetMap (기본값) 사용',
'settings.routingBase': '자체 경로 서버',
'settings.routingBaseHint': '자체 OSRM 인스턴스입니다. 비워 두면 초당 약 한 번의 요청만 허용하는 공개 서버를 사용합니다. 하루치는 충분하지만 로드트립에는 빠듯합니다. 서버를 다시 시작해야 적용됩니다.',
'settings.mapHint': '지도 타일 URL 템플릿',
'settings.mapProvider': '지도 공급자',
'settings.mapProviderHint': '여행 플래너 및 Journey 지도에 영향을 줍니다. Atlas는 항상 Leaflet을 사용합니다.',
+33
View File
@@ -22,6 +22,10 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.food': 'Eten',
'roadtrip.poi.sights': 'Bezienswaardig',
'roadtrip.poi.within': 'Binnen',
'roadtrip.poi.filter': 'Filteren op naam',
'roadtrip.poi.noMatch': 'Niets onderweg komt overeen met “{name}”.',
'roadtrip.poi.foundFiltered': '{count} van {total} onderweg',
'roadtrip.poi.truncated': 'Op {count} stukken waren er meer dan in één antwoord passen — maak de corridor smaller om de rest te zien.',
'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.',
@@ -34,12 +38,41 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.alongRoute': 'na {distance}',
'roadtrip.summary.distance': 'Afstand',
'roadtrip.summary.driving': 'Rijtijd',
'roadtrip.alt.ask': 'Andere routes',
'roadtrip.alt.title': 'Routes voor dit traject',
'roadtrip.alt.loading': 'Router wordt geraadpleegd…',
'roadtrip.alt.onlyOne': 'Er is maar één zinnige route voor dit traject.',
'roadtrip.alt.failed': 'De routeserver antwoordt op dit moment niet.',
'roadtrip.alt.current': 'Huidig',
'roadtrip.alt.fastest': 'Snelste',
'roadtrip.alt.slower': '{time} langzamer',
'roadtrip.alt.quicker': '{time} sneller',
'roadtrip.day': 'Dag {number}',
'roadtrip.quietDay.empty': 'Nog geen stops — laat er hier een vallen',
'roadtrip.quietDay.one': 'Voorlopig alleen {name} — laat hier een stop vallen',
'roadtrip.leg.driveText': '{distance} in {time}',
'roadtrip.day.stopCount': '{count} stops',
'roadtrip.stop.stayShort': 'Duur',
'roadtrip.leg.pending': 'Geen route',
'roadtrip.stop.addTitle': 'Als stop toevoegen',
'roadtrip.stop.kind': 'Soort stop',
'roadtrip.stop.landsOn': 'Dag {day}, als stop {position}',
'roadtrip.stop.duplicate': '“{name}” staat al in deze reis.',
'roadtrip.stop.moreDetails': 'Meer details',
'roadtrip.stop.stay': 'Tijd bij deze stop',
'roadtrip.stop.pinned': 'Door jou gezette tijd',
'roadtrip.stop.computed': 'Berekend uit de rit',
'roadtrip.via.hint': 'Sleep om de route te hervormen, rechtsklik om te verwijderen',
'roadtrip.warn.late': 'Aankomst {minutes} min na de gezette tijd',
'roadtrip.warn.overnight': 'Volgende dag',
'roadtrip.summary.stops': 'Stops',
'roadtrip.stay.add': 'Verblijf instellen',
'roadtrip.stay.none': 'Geen verblijf',
'roadtrip.stay.custom': 'Minuten',
'roadtrip.stay.arrive': 'Aankomst',
'roadtrip.stay.leave': 'Vertrek',
'roadtrip.alt.noMotorway': 'Zonder snelweg',
'roadtrip.alt.noToll': 'Zonder tol',
'roadtrip.summary.partial': 'De rest van de rit wordt nog berekend',
};
export default roadtrip;
+2
View File
@@ -25,6 +25,8 @@ const settings: TranslationStrings = {
'settings.mapTemplate': 'Kaartsjabloon',
'settings.mapTemplatePlaceholder.select': 'Selecteer sjabloon...',
'settings.mapDefaultHint': 'Laat leeg voor OpenStreetMap (standaard)',
'settings.routingBase': 'Eigen routeserver',
'settings.routingBaseHint': 'Een eigen OSRM-server. Leeg gebruikt de publieke servers, die ongeveer één verzoek per seconde toestaan — genoeg voor een dag, krap voor een roadtrip. Werkt na een herstart van de server.',
'settings.mapHint': 'URL-sjabloon voor kaarttegels',
'settings.mapProvider': 'Kaartprovider',
'settings.mapProviderHint': 'Geldt voor Trip Planner en Journey kaarten. Atlas gebruikt altijd Leaflet.',
+33
View File
@@ -22,6 +22,10 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.food': 'Jedzenie',
'roadtrip.poi.sights': 'Atrakcje',
'roadtrip.poi.within': 'W promieniu',
'roadtrip.poi.filter': 'Filtruj wedug nazwy',
'roadtrip.poi.noMatch': 'Nic po drodze nie pasuje do „{name}”.',
'roadtrip.poi.foundFiltered': '{count} z {total} po drodze',
'roadtrip.poi.truncated': 'Na {count} odcinkach było więcej, niż mieści się w jednej odpowiedzi — zawęź korytarz, aby zobaczyć resztę.',
'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.',
@@ -34,12 +38,41 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.alongRoute': 'po {distance}',
'roadtrip.summary.distance': 'Dystans',
'roadtrip.summary.driving': 'Czas jazdy',
'roadtrip.alt.ask': 'Inne trasy',
'roadtrip.alt.title': 'Trasy tego odcinka',
'roadtrip.alt.loading': 'Pytanie serwera tras…',
'roadtrip.alt.onlyOne': 'Ten odcinek ma tylko jedną sensowną trasę.',
'roadtrip.alt.failed': 'Serwer tras teraz nie odpowiada.',
'roadtrip.alt.current': 'Obecna',
'roadtrip.alt.fastest': 'Najszybsza',
'roadtrip.alt.slower': '{time} dłużej',
'roadtrip.alt.quicker': '{time} krócej',
'roadtrip.day': 'Dzień {number}',
'roadtrip.quietDay.empty': 'Brak przystanków — upuść tutaj',
'roadtrip.quietDay.one': 'Na razie tylko {name} — upuść tutaj przystanek',
'roadtrip.leg.driveText': '{distance} w {time}',
'roadtrip.day.stopCount': '{count} przystanków',
'roadtrip.stop.stayShort': 'Postój',
'roadtrip.leg.pending': 'Brak trasy',
'roadtrip.stop.addTitle': 'Dodaj jako przystanek',
'roadtrip.stop.kind': 'Rodzaj przystanku',
'roadtrip.stop.landsOn': 'Dzień {day}, jako przystanek {position}',
'roadtrip.stop.duplicate': '„{name}” już jest w tej podróży.',
'roadtrip.stop.moreDetails': 'Więcej szczegółów',
'roadtrip.stop.stay': 'Czas na tym przystanku',
'roadtrip.stop.pinned': 'Godzina ustawiona przez Ciebie',
'roadtrip.stop.computed': 'Obliczone na podstawie jazdy',
'roadtrip.via.hint': 'Przeciągnij, aby zmienić trasę, kliknij prawym, aby usunąć',
'roadtrip.warn.late': 'Przyjazd {minutes} min po ustawionej godzinie',
'roadtrip.warn.overnight': 'Następny dzień',
'roadtrip.summary.stops': 'Przystanki',
'roadtrip.stay.add': 'Ustaw czas postoju',
'roadtrip.stay.none': 'Bez postoju',
'roadtrip.stay.custom': 'Minuty',
'roadtrip.stay.arrive': 'Przyjazd',
'roadtrip.stay.leave': 'Odjazd',
'roadtrip.alt.noMotorway': 'Bez autostrady',
'roadtrip.alt.noToll': 'Bez oplat',
'roadtrip.summary.partial': 'Reszta trasy jest jeszcze obliczana',
};
export default roadtrip;
+2
View File
@@ -24,6 +24,8 @@ const settings: TranslationStrings = {
'settings.mapTemplate': 'Szablon mapy',
'settings.mapTemplatePlaceholder.select': 'Wybierz szablon...',
'settings.mapDefaultHint': 'Pozostaw puste dla OpenStreetMap (domyślnie)',
'settings.routingBase': 'Własny silnik tras',
'settings.routingBaseHint': 'Własna instancja OSRM. Puste używa serwerów publicznych, które pozwalają na około jedno zapytanie na sekundę — wystarczy na dzień, mało na road trip. Działa po restarcie serwera.',
'settings.mapHint': 'Szablon URL dla kafelków mapy',
'settings.mapProvider': 'Dostawca mapy',
'settings.mapProviderHint': 'Dotyczy map Trip Planner i Journey. Atlas zawsze używa Leaflet.',
+33
View File
@@ -22,6 +22,10 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.food': 'Еда',
'roadtrip.poi.sights': 'Достопримечательности',
'roadtrip.poi.within': 'В радиусе',
'roadtrip.poi.filter': 'Фильтр по названию',
'roadtrip.poi.noMatch': 'По пути ничего не соответствует «{name}».',
'roadtrip.poi.foundFiltered': '{count} из {total} по пути',
'roadtrip.poi.truncated': 'На {count} участках нашлось больше, чем помещается в один ответ — сузьте коридор, чтобы увидеть остальное.',
'roadtrip.poi.search': 'Искать вдоль маршрута',
'roadtrip.poi.searching': 'Поиск {done} из {total}',
'roadtrip.poi.capped': 'Маршрут длинный — просмотрен только первый участок.',
@@ -34,12 +38,41 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.alongRoute': 'через {distance}',
'roadtrip.summary.distance': 'Расстояние',
'roadtrip.summary.driving': 'Время в пути',
'roadtrip.alt.ask': 'Другие маршруты',
'roadtrip.alt.title': 'Маршруты этого участка',
'roadtrip.alt.loading': 'Запрос к маршрутизатору…',
'roadtrip.alt.onlyOne': 'У этого участка только один разумный маршрут.',
'roadtrip.alt.failed': 'Маршрутизатор сейчас не отвечает.',
'roadtrip.alt.current': 'Текущий',
'roadtrip.alt.fastest': 'Самый быстрый',
'roadtrip.alt.slower': 'на {time} дольше',
'roadtrip.alt.quicker': 'на {time} быстрее',
'roadtrip.day': 'День {number}',
'roadtrip.quietDay.empty': 'Остановок пока нет — перетащите сюда',
'roadtrip.quietDay.one': 'Пока только {name} — перетащите сюда остановку',
'roadtrip.leg.driveText': '{distance} за {time}',
'roadtrip.day.stopCount': 'остановок: {count}',
'roadtrip.stop.stayShort': 'Стоянка',
'roadtrip.leg.pending': 'Нет маршрута',
'roadtrip.stop.addTitle': 'Добавить как остановку',
'roadtrip.stop.kind': 'Тип остановки',
'roadtrip.stop.landsOn': 'День {day}, остановка {position}',
'roadtrip.stop.duplicate': '«{name}» уже есть в этой поездке.',
'roadtrip.stop.moreDetails': 'Подробнее',
'roadtrip.stop.stay': 'Время на остановке',
'roadtrip.stop.pinned': 'Заданное вами время',
'roadtrip.stop.computed': 'Рассчитано по времени в пути',
'roadtrip.via.hint': 'Перетащите, чтобы изменить маршрут, правый клик — удалить',
'roadtrip.warn.late': 'Прибытие на {minutes} мин позже заданного времени',
'roadtrip.warn.overnight': 'Следующий день',
'roadtrip.summary.stops': 'Остановки',
'roadtrip.stay.add': 'Задать время остановки',
'roadtrip.stay.none': 'Без остановки',
'roadtrip.stay.custom': 'Минуты',
'roadtrip.stay.arrive': 'Прибытие',
'roadtrip.stay.leave': 'Отправление',
'roadtrip.alt.noMotorway': 'Без автомагистрали',
'roadtrip.alt.noToll': 'Без платных дорог',
'roadtrip.summary.partial': 'Остальная часть маршрута ещё рассчитывается',
};
export default roadtrip;
+2
View File
@@ -24,6 +24,8 @@ const settings: TranslationStrings = {
'settings.mapTemplate': 'Шаблон карты',
'settings.mapTemplatePlaceholder.select': 'Выберите шаблон...',
'settings.mapDefaultHint': 'Оставьте пустым для OpenStreetMap (по умолчанию)',
'settings.routingBase': 'Собственный сервер маршрутов',
'settings.routingBaseHint': 'Собственный экземпляр OSRM. Пусто — используются публичные серверы с ограничением около одного запроса в секунду: на день хватает, для автопутешествия мало. Вступает в силу после перезапуска сервера.',
'settings.mapHint': 'URL-шаблон для тайлов карты',
'settings.mapProvider': 'Провайдер карты',
'settings.mapProviderHint': 'Применяется к Trip Planner и Journey. Atlas всегда использует Leaflet.',
+33
View File
@@ -22,6 +22,10 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.food': 'Mat',
'roadtrip.poi.sights': 'Sevärt',
'roadtrip.poi.within': 'Inom',
'roadtrip.poi.filter': 'Filtrera på namn',
'roadtrip.poi.noMatch': 'Inget längs vägen matchar ”{name}”.',
'roadtrip.poi.foundFiltered': '{count} av {total} längs vägen',
'roadtrip.poi.truncated': 'På {count} sträckor fanns fler än vad som får plats i ett svar – gör korridoren smalare för att se resten.',
'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.',
@@ -34,12 +38,41 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.alongRoute': 'efter {distance}',
'roadtrip.summary.distance': 'Sträcka',
'roadtrip.summary.driving': 'Körtid',
'roadtrip.alt.ask': 'Andra vägar',
'roadtrip.alt.title': 'Vägar för den här sträckan',
'roadtrip.alt.loading': 'Frågar ruttservern…',
'roadtrip.alt.onlyOne': 'Det finns bara en rimlig väg för den här sträckan.',
'roadtrip.alt.failed': 'Ruttservern svarar inte just nu.',
'roadtrip.alt.current': 'Nuvarande',
'roadtrip.alt.fastest': 'Snabbast',
'roadtrip.alt.slower': '{time} långsammare',
'roadtrip.alt.quicker': '{time} snabbare',
'roadtrip.day': 'Dag {number}',
'roadtrip.quietDay.empty': 'Inga stopp än – släpp ett här',
'roadtrip.quietDay.one': 'Hittills bara {name} – släpp ett stopp här',
'roadtrip.leg.driveText': '{distance} på {time}',
'roadtrip.day.stopCount': '{count} stopp',
'roadtrip.stop.stayShort': 'Stopp',
'roadtrip.leg.pending': 'Ingen rutt',
'roadtrip.stop.addTitle': 'Lägg till som stopp',
'roadtrip.stop.kind': 'Typ av stopp',
'roadtrip.stop.landsOn': 'Dag {day}, som stopp {position}',
'roadtrip.stop.duplicate': '”{name}” finns redan i den här resan.',
'roadtrip.stop.moreDetails': 'Fler detaljer',
'roadtrip.stop.stay': 'Tid på stoppet',
'roadtrip.stop.pinned': 'Tid du har satt',
'roadtrip.stop.computed': 'Beräknad utifrån körningen',
'roadtrip.via.hint': 'Dra för att forma om rutten, högerklicka för att ta bort',
'roadtrip.warn.late': 'Ankomst {minutes} min efter den satta tiden',
'roadtrip.warn.overnight': 'Nästa dag',
'roadtrip.summary.stops': 'Stopp',
'roadtrip.stay.add': 'Ange vistelse',
'roadtrip.stay.none': 'Ingen vistelse',
'roadtrip.stay.custom': 'Minuter',
'roadtrip.stay.arrive': 'Ankomst',
'roadtrip.stay.leave': 'Avfard',
'roadtrip.alt.noMotorway': 'Utan motorvag',
'roadtrip.alt.noToll': 'Utan vagavgifter',
'roadtrip.summary.partial': 'Resten av resan beräknas fortfarande',
};
export default roadtrip;
+2
View File
@@ -24,6 +24,8 @@ const settings: TranslationStrings = {
'settings.mapTemplate': 'Kartmall',
'settings.mapTemplatePlaceholder.select': 'Välj mall...',
'settings.mapDefaultHint': 'Lämna fältet tomt för OpenStreetMap (standard)',
'settings.routingBase': 'Egen ruttmotor',
'settings.routingBaseHint': 'En egen OSRM-instans. Tomt använder de publika servrarna, som tillåter ungefär en förfrågan per sekund – nog för en dag, knappt för en bilresa. Träder i kraft efter omstart av servern.',
'settings.mapHint': 'URL-mall för kartrutor',
'settings.mapProvider': 'Kartleverantör',
'settings.mapProviderHint': 'Påverkar resplaneraren och resedagbokens kartor. Atlas använder alltid Leaflet.',
+33
View File
@@ -22,6 +22,10 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.food': 'Yemek',
'roadtrip.poi.sights': 'Görülecek yerler',
'roadtrip.poi.within': 'Mesafe',
'roadtrip.poi.filter': 'Ada göre süz',
'roadtrip.poi.noMatch': 'Yol boyunca “{name}” ile eşleşen bir şey yok.',
'roadtrip.poi.foundFiltered': 'yol üzerinde {total} içinden {count}',
'roadtrip.poi.truncated': '{count} bölümde bir yanıta sığandan fazlası vardı — geri kalanı görmek için koridoru daraltın.',
'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ı.',
@@ -34,12 +38,41 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.alongRoute': '{distance} sonra',
'roadtrip.summary.distance': 'Mesafe',
'roadtrip.summary.driving': 'Sürüş süresi',
'roadtrip.alt.ask': 'Başka yollar',
'roadtrip.alt.title': 'Bu etap için yollar',
'roadtrip.alt.loading': 'Rota sunucusuna soruluyor…',
'roadtrip.alt.onlyOne': 'Bu etap için mantıklı tek bir yol var.',
'roadtrip.alt.failed': 'Rota sunucusu şu anda yanıt vermiyor.',
'roadtrip.alt.current': 'Mevcut',
'roadtrip.alt.fastest': 'En hızlı',
'roadtrip.alt.slower': '{time} daha uzun',
'roadtrip.alt.quicker': '{time} daha kısa',
'roadtrip.day': '{number}. gün',
'roadtrip.quietDay.empty': 'Henüz mola yok — buraya bırakın',
'roadtrip.quietDay.one': 'Şimdilik yalnızca {name} — buraya bir mola bırakın',
'roadtrip.leg.driveText': '{time} içinde {distance}',
'roadtrip.day.stopCount': '{count} mola',
'roadtrip.stop.stayShort': 'Süre',
'roadtrip.leg.pending': 'Rota yok',
'roadtrip.stop.addTitle': 'Mola olarak ekle',
'roadtrip.stop.kind': 'Mola türü',
'roadtrip.stop.landsOn': '{day}. gün, {position}. mola',
'roadtrip.stop.duplicate': '“{name}” bu seyahatte zaten var.',
'roadtrip.stop.moreDetails': 'Daha fazla ayrıntı',
'roadtrip.stop.stay': 'Bu duraktaki süre',
'roadtrip.stop.pinned': 'Belirlediğiniz saat',
'roadtrip.stop.computed': 'Sürüşe göre hesaplandı',
'roadtrip.via.hint': 'Rotayı yeniden şekillendirmek için sürükleyin, kaldırmak için sağ tıklayın',
'roadtrip.warn.late': 'Belirlenen saatten {minutes} dk sonra varış',
'roadtrip.warn.overnight': 'Ertesi gün',
'roadtrip.summary.stops': 'Duraklar',
'roadtrip.stay.add': 'Mola suresi ekle',
'roadtrip.stay.none': 'Mola yok',
'roadtrip.stay.custom': 'Dakika',
'roadtrip.stay.arrive': 'Varis',
'roadtrip.stay.leave': 'Kalkis',
'roadtrip.alt.noMotorway': 'Otoyolsuz',
'roadtrip.alt.noToll': 'Ucretsiz',
'roadtrip.summary.partial': 'Yolun geri kalanı hâlâ hesaplanıyor',
};
export default roadtrip;
+2
View File
@@ -24,6 +24,8 @@ const settings: TranslationStrings = {
'settings.mapTemplate': 'Harita Şablonu',
'settings.mapTemplatePlaceholder.select': 'Şablon seçin...',
'settings.mapDefaultHint': 'OpenStreetMap için boş bırakın (varsayılan)',
'settings.routingBase': 'Kendi rota motoru',
'settings.routingBaseHint': 'Kendi OSRM sunucunuz. Boş bırakılırsa saniyede yaklaşık bir istek veren genel sunucular kullanılır: bir gün için yeter, uzun yolculuk için az. Sunucu yeniden başlatıldığında etkin olur.',
'settings.mapHint': 'Harita kutucukları için URL şablonu',
'settings.mapProvider': 'Harita Sağlayıcısı',
'settings.mapProviderHint': 'Seyahat planlayıcı ve Journey haritalarını etkiler. Atlas her zaman Leaflet kullanır.',
+33
View File
@@ -22,6 +22,10 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.food': 'Їжа',
'roadtrip.poi.sights': 'Пам’ятки',
'roadtrip.poi.within': 'У радіусі',
'roadtrip.poi.filter': 'Фільтр за назвою',
'roadtrip.poi.noMatch': 'Дорогою ніщо не відповідає «{name}».',
'roadtrip.poi.foundFiltered': '{count} з {total} дорогою',
'roadtrip.poi.truncated': 'На {count} відрізках знайшлося більше, ніж уміщується в одну відповідь — звузьте коридор, щоб побачити решту.',
'roadtrip.poi.search': 'Шукати вздовж маршруту',
'roadtrip.poi.searching': 'Пошук {done} з {total}',
'roadtrip.poi.capped': 'Маршрут довгий — переглянуто лише перший відрізок.',
@@ -34,12 +38,41 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.alongRoute': 'через {distance}',
'roadtrip.summary.distance': 'Відстань',
'roadtrip.summary.driving': 'Час у дорозі',
'roadtrip.alt.ask': 'Інші маршрути',
'roadtrip.alt.title': 'Маршрути цього відрізка',
'roadtrip.alt.loading': 'Запит до маршрутизатора…',
'roadtrip.alt.onlyOne': 'Для цього відрізка є лише один розумний маршрут.',
'roadtrip.alt.failed': 'Маршрутизатор зараз не відповідає.',
'roadtrip.alt.current': 'Поточний',
'roadtrip.alt.fastest': 'Найшвидший',
'roadtrip.alt.slower': 'на {time} довше',
'roadtrip.alt.quicker': 'на {time} швидше',
'roadtrip.day': 'День {number}',
'roadtrip.quietDay.empty': 'Зупинок ще немає — перетягніть сюди',
'roadtrip.quietDay.one': 'Поки лише {name} — перетягніть сюди зупинку',
'roadtrip.leg.driveText': '{distance} за {time}',
'roadtrip.day.stopCount': 'зупинок: {count}',
'roadtrip.stop.stayShort': 'Стоянка',
'roadtrip.leg.pending': 'Немає маршруту',
'roadtrip.stop.addTitle': 'Додати як зупинку',
'roadtrip.stop.kind': 'Тип зупинки',
'roadtrip.stop.landsOn': 'День {day}, зупинка {position}',
'roadtrip.stop.duplicate': '«{name}» уже є в цій подорожі.',
'roadtrip.stop.moreDetails': 'Докладніше',
'roadtrip.stop.stay': 'Час на зупинці',
'roadtrip.stop.pinned': 'Час, який ви задали',
'roadtrip.stop.computed': 'Розраховано за часом у дорозі',
'roadtrip.via.hint': 'Перетягніть, щоб змінити маршрут, права кнопка — видалити',
'roadtrip.warn.late': 'Прибуття на {minutes} хв пізніше заданого часу',
'roadtrip.warn.overnight': 'Наступний день',
'roadtrip.summary.stops': 'Зупинки',
'roadtrip.stay.add': 'Задати час зупинки',
'roadtrip.stay.none': 'Без зупинки',
'roadtrip.stay.custom': 'Хвилини',
'roadtrip.stay.arrive': 'Прибуття',
'roadtrip.stay.leave': 'Відʼїзд',
'roadtrip.alt.noMotorway': 'Без автомагістралі',
'roadtrip.alt.noToll': 'Без платних доріг',
'roadtrip.summary.partial': 'Решта маршруту ще обчислюється',
};
export default roadtrip;
+2
View File
@@ -25,6 +25,8 @@ const settings: TranslationStrings = {
'settings.mapTemplate': 'Шаблон карти',
'settings.mapTemplatePlaceholder.select': 'Виберіть шаблон...',
'settings.mapDefaultHint': 'Залиште порожнім для OpenStreetMap (за замовчуванням)',
'settings.routingBase': 'Власний сервер маршрутів',
'settings.routingBaseHint': 'Власний примірник OSRM. Порожньо — використовуються публічні сервери з обмеженням близько одного запиту на секунду: на день вистачає, для автоподорожі мало. Діє після перезапуску сервера.',
'settings.mapHint': 'URL-шаблон для тайлів карти',
'settings.mapProvider': 'Провайдер карти',
'settings.mapProviderHint': 'Застосовується до Trip Planner та Journey. Atlas завжди використовує Leaflet.',
+33
View File
@@ -22,6 +22,10 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.food': 'Đồ ăn',
'roadtrip.poi.sights': 'Điểm tham quan',
'roadtrip.poi.within': 'Trong vòng',
'roadtrip.poi.filter': 'Lọc theo tên',
'roadtrip.poi.noMatch': 'Không có gì trên đường khớp với “{name}”.',
'roadtrip.poi.foundFiltered': '{count} trong {total} trên đường',
'roadtrip.poi.truncated': 'Có {count} đoạn nhiều hơn mức một phản hồi chứa được — thu hẹp hành lang để xem phần còn lại.',
'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.',
@@ -34,12 +38,41 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.alongRoute': 'sau {distance}',
'roadtrip.summary.distance': 'Quãng đường',
'roadtrip.summary.driving': 'Thời gian lái xe',
'roadtrip.alt.ask': 'Lộ trình khác',
'roadtrip.alt.title': 'Các lộ trình cho chặng này',
'roadtrip.alt.loading': 'Đang hỏi máy chủ định tuyến…',
'roadtrip.alt.onlyOne': 'Chặng này chỉ có một lộ trình hợp lý.',
'roadtrip.alt.failed': 'Máy chủ định tuyến hiện không phản hồi.',
'roadtrip.alt.current': 'Hiện tại',
'roadtrip.alt.fastest': 'Nhanh nhất',
'roadtrip.alt.slower': 'chậm hơn {time}',
'roadtrip.alt.quicker': 'nhanh hơn {time}',
'roadtrip.day': 'Ngày {number}',
'roadtrip.quietDay.empty': 'Chưa có điểm dừng — thả vào đây',
'roadtrip.quietDay.one': 'Hiện chỉ có {name} — thả một điểm dừng vào đây',
'roadtrip.leg.driveText': '{distance} trong {time}',
'roadtrip.day.stopCount': '{count} điểm dừng',
'roadtrip.stop.stayShort': 'Dừng',
'roadtrip.leg.pending': 'Không có lộ trình',
'roadtrip.stop.addTitle': 'Thêm làm điểm dừng',
'roadtrip.stop.kind': 'Loại điểm dừng',
'roadtrip.stop.landsOn': 'Ngày {day}, là điểm dừng {position}',
'roadtrip.stop.duplicate': '“{name}” đã có trong chuyến đi này.',
'roadtrip.stop.moreDetails': 'Thêm chi tiết',
'roadtrip.stop.stay': 'Thời gian tại điểm dừng',
'roadtrip.stop.pinned': 'Giờ bạn đặt',
'roadtrip.stop.computed': 'Tính từ thời gian lái xe',
'roadtrip.via.hint': 'Kéo để định hình lại lộ trình, chuột phải để xóa',
'roadtrip.warn.late': 'Đến muộn {minutes} phút so với giờ đã đặt',
'roadtrip.warn.overnight': 'Ngày hôm sau',
'roadtrip.summary.stops': 'Điểm dừng',
'roadtrip.stay.add': 'Dat thoi gian dung',
'roadtrip.stay.none': 'Khong dung lai',
'roadtrip.stay.custom': 'Phut',
'roadtrip.stay.arrive': 'Den noi',
'roadtrip.stay.leave': 'Roi di',
'roadtrip.alt.noMotorway': 'Khong di cao toc',
'roadtrip.alt.noToll': 'Khong thu phi',
'roadtrip.summary.partial': 'Vẫn đang tính phần còn lại của chặng đường',
};
export default roadtrip;
+2
View File
@@ -24,6 +24,8 @@ const settings: TranslationStrings = {
'settings.mapTemplate': 'Mẫu bản đồ',
'settings.mapTemplatePlaceholder.select': 'Chọn mẫu...',
'settings.mapDefaultHint': 'Để trống cho OpenStreetMap (mặc định)',
'settings.routingBase': 'Máy chủ định tuyến riêng',
'settings.routingBaseHint': 'Máy chủ OSRM của riêng bạn. Để trống sẽ dùng máy chủ công cộng, cho phép khoảng một yêu cầu mỗi giây — đủ cho một ngày, chật cho chuyến đi dài. Có hiệu lực sau khi khởi động lại máy chủ.',
'settings.mapHint': 'Mẫu URL cho ô bản đồ',
'settings.mapProvider': 'Nhà cung cấp bản đồ',
'settings.mapProviderHint':
+33
View File
@@ -22,6 +22,10 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.food': '餐飲',
'roadtrip.poi.sights': '景點',
'roadtrip.poi.within': '範圍內',
'roadtrip.poi.filter': '依名稱篩選',
'roadtrip.poi.noMatch': '沿途沒有與「{name}」相符的地點。',
'roadtrip.poi.foundFiltered': '沿途 {total} 個中的 {count} 個',
'roadtrip.poi.truncated': '有 {count} 段的結果超出單次回應上限,縮小走廊寬度可查看其餘部分。',
'roadtrip.poi.search': '沿路線搜尋',
'roadtrip.poi.searching': '搜尋中 {done}/{total}',
'roadtrip.poi.capped': '路線較長,僅搜尋了前段。',
@@ -34,12 +38,41 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.alongRoute': '{distance} 處',
'roadtrip.summary.distance': '距離',
'roadtrip.summary.driving': '駕駛時間',
'roadtrip.alt.ask': '其他路線',
'roadtrip.alt.title': '這一段的走法',
'roadtrip.alt.loading': '正在詢問路徑服務…',
'roadtrip.alt.onlyOne': '這一段只有一條合理的走法。',
'roadtrip.alt.failed': '路徑服務目前沒有回應。',
'roadtrip.alt.current': '目前',
'roadtrip.alt.fastest': '最快',
'roadtrip.alt.slower': '慢 {time}',
'roadtrip.alt.quicker': '快 {time}',
'roadtrip.day': '第 {number} 天',
'roadtrip.quietDay.empty': '尚無停靠點 — 拖到這裡',
'roadtrip.quietDay.one': '目前只有 {name} — 把停靠點拖到這裡',
'roadtrip.leg.driveText': '{distance},{time}',
'roadtrip.day.stopCount': '{count} 個停靠點',
'roadtrip.stop.stayShort': '停留',
'roadtrip.leg.pending': '無路線',
'roadtrip.stop.addTitle': '新增為停靠點',
'roadtrip.stop.kind': '停靠類型',
'roadtrip.stop.landsOn': '第 {day} 天,第 {position} 個停靠點',
'roadtrip.stop.duplicate': '「{name}」已在此行程中。',
'roadtrip.stop.moreDetails': '更多詳情',
'roadtrip.stop.stay': '在此停留時間',
'roadtrip.stop.pinned': '你設定的時間',
'roadtrip.stop.computed': '依行駛時間推算',
'roadtrip.via.hint': '拖曳可改變路線,右鍵刪除',
'roadtrip.warn.late': '比設定時間晚到 {minutes} 分鐘',
'roadtrip.warn.overnight': '次日',
'roadtrip.summary.stops': '停靠點',
'roadtrip.stay.add': '設定停留時間',
'roadtrip.stay.none': '不停留',
'roadtrip.stay.custom': '分鐘',
'roadtrip.stay.arrive': '抵達',
'roadtrip.stay.leave': '出發',
'roadtrip.alt.noMotorway': '不走高速',
'roadtrip.alt.noToll': '免收費',
'roadtrip.summary.partial': '正在計算剩餘路程',
};
export default roadtrip;
+2
View File
@@ -24,6 +24,8 @@ const settings: TranslationStrings = {
'settings.mapTemplate': '地圖模板',
'settings.mapTemplatePlaceholder.select': '選擇模板...',
'settings.mapDefaultHint': '留空則使用 OpenStreetMap(預設)',
'settings.routingBase': '自建路徑規劃服務',
'settings.routingBaseHint': '你自己的 OSRM 實例。留空則使用公共伺服器,約每秒一個請求 — 單日夠用,長途自駕則吃緊。需重新啟動伺服器後生效。',
'settings.mapHint': '地圖瓦片 URL 模板',
'settings.mapProvider': '地圖提供商',
'settings.mapProviderHint': '影響行程規劃和旅程地圖。Atlas 始終使用 Leaflet。',
+33
View File
@@ -22,6 +22,10 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.food': '餐饮',
'roadtrip.poi.sights': '景点',
'roadtrip.poi.within': '范围内',
'roadtrip.poi.filter': '按名称筛选',
'roadtrip.poi.noMatch': '沿途没有与“{name}”匹配的地点。',
'roadtrip.poi.foundFiltered': '沿途 {total} 个中的 {count} 个',
'roadtrip.poi.truncated': '有 {count} 段的结果超出单次响应上限,缩小走廊宽度可查看其余部分。',
'roadtrip.poi.search': '沿路线搜索',
'roadtrip.poi.searching': '搜索中 {done}/{total}',
'roadtrip.poi.capped': '路线较长,仅搜索了前段。',
@@ -34,12 +38,41 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.alongRoute': '{distance} 处',
'roadtrip.summary.distance': '距离',
'roadtrip.summary.driving': '驾驶时间',
'roadtrip.alt.ask': '其他路线',
'roadtrip.alt.title': '这一段的走法',
'roadtrip.alt.loading': '正在询问路径服务…',
'roadtrip.alt.onlyOne': '这一段只有一条合理的走法。',
'roadtrip.alt.failed': '路径服务当前没有响应。',
'roadtrip.alt.current': '当前',
'roadtrip.alt.fastest': '最快',
'roadtrip.alt.slower': '慢 {time}',
'roadtrip.alt.quicker': '快 {time}',
'roadtrip.day': '第 {number} 天',
'roadtrip.quietDay.empty': '暂无停靠点 — 拖到这里',
'roadtrip.quietDay.one': '目前只有 {name} — 把停靠点拖到这里',
'roadtrip.leg.driveText': '{distance},{time}',
'roadtrip.day.stopCount': '{count} 个停靠点',
'roadtrip.stop.stayShort': '停留',
'roadtrip.leg.pending': '无路线',
'roadtrip.stop.addTitle': '添加为停靠点',
'roadtrip.stop.kind': '停靠类型',
'roadtrip.stop.landsOn': '第 {day} 天,第 {position} 个停靠点',
'roadtrip.stop.duplicate': '“{name}”已在此行程中。',
'roadtrip.stop.moreDetails': '更多详情',
'roadtrip.stop.stay': '在此停留时间',
'roadtrip.stop.pinned': '你设定的时间',
'roadtrip.stop.computed': '根据行驶时间推算',
'roadtrip.via.hint': '拖动可改变路线,右键删除',
'roadtrip.warn.late': '比设定时间晚到 {minutes} 分钟',
'roadtrip.warn.overnight': '次日',
'roadtrip.summary.stops': '停靠点',
'roadtrip.stay.add': '设置停留时间',
'roadtrip.stay.none': '不停留',
'roadtrip.stay.custom': '分钟',
'roadtrip.stay.arrive': '到达',
'roadtrip.stay.leave': '出发',
'roadtrip.alt.noMotorway': '不走高速',
'roadtrip.alt.noToll': '免收费',
'roadtrip.summary.partial': '正在计算剩余路程',
};
export default roadtrip;
+2
View File
@@ -24,6 +24,8 @@ const settings: TranslationStrings = {
'settings.mapTemplate': '地图模板',
'settings.mapTemplatePlaceholder.select': '选择模板...',
'settings.mapDefaultHint': '留空则使用 OpenStreetMap(默认)',
'settings.routingBase': '自建路径规划服务',
'settings.routingBaseHint': '你自己的 OSRM 实例。留空则使用公共服务器,约每秒一个请求 — 单日够用,长途自驾则吃紧。需重启服务器后生效。',
'settings.mapHint': '地图瓦片 URL 模板',
'settings.mapProvider': '地图提供商',
'settings.mapProviderHint': '影响行程规划器和旅程地图。足迹始终使用 Leaflet。',
+1
View File
@@ -37,6 +37,7 @@ export * from './day/note-colors';
export * from './assignment/assignment.schema';
export * from './place/place.schema';
export * from './place/place-match';
export * from './roadtrip/roadtrip.schema';
export * from './place/track-colors';
export * from './collection/collection.schema';
export * from './trip/trip.schema';
+21
View File
@@ -78,6 +78,15 @@ export const placeRatingVoteSchema = z.object({
});
export type PlaceRatingVote = z.infer<typeof placeRatingVoteSchema>;
/**
* The kinds of stop a drive has, matching the categories the corridor search can look for
* (`client/src/components/Map/poiCategories.ts` and the OSM tag map in
* `server/src/nest/maps/maps.helpers.ts`). Kept as a closed list here so a typo cannot
* reach the column, and extended alongside those two when the search learns a new kind.
*/
export const roadtripStopTypeSchema = z.enum(['fuel', 'charging', 'rest_area', 'campsite', 'restaurant', 'sights']);
export type RoadtripStopType = z.infer<typeof roadtripStopTypeSchema>;
export const placeSchema = z.object({
id: z.number(),
trip_id: z.number(),
@@ -103,6 +112,15 @@ export const placeSchema = z.object({
route_geometry: z.string().nullable().optional(),
// Manual track colour (#776). null = inherit the category colour like before.
route_color: hexColorSchema.nullable().optional(),
/**
* What kind of stop this place is on a drive (#1797). null is an ordinary place, which
* is every place that predates the road trip addon.
*
* Separate from `category_id` on purpose: categories are the traveller's own editable,
* instance-wide list, while this is a fact about the place that the corridor search
* already knows and that owns its own icon and colour.
*/
stop_type: roadtripStopTypeSchema.nullable().optional(),
website: z.string().nullable().optional(),
phone: z.string().nullable().optional(),
transport_mode: z.string().nullable().optional(),
@@ -147,6 +165,9 @@ export const assignmentPlaceSchema = z.object({
osm_id: z.string().nullable().optional(),
website: z.string().nullable().optional(),
phone: z.string().nullable().optional(),
// Carried through so the road-trip rail can mark a fuel stop as one without a
// second request per stop.
stop_type: roadtripStopTypeSchema.nullable().optional(),
category: placeCategorySchema.optional(),
tags: z.array(tagSchema.partial()).optional(),
});
+78
View File
@@ -0,0 +1,78 @@
import { z } from 'zod';
/**
* Road trip contracts (#1797).
*
* A **via** is a point the day's drive is made to pass through without being a stop.
* The distinction is the whole feature: a stop is somewhere you go, and it earns a number
* in the chain, an arrival time and a line in the itinerary; a via only bends the route,
* which is what "take the coast road instead" means. Storing one as a place would put a
* numbered stop in the middle of the day for a spot nobody stops at.
*/
/** Latitude, in the range the routing engines accept. */
const latSchema = z.number().min(-90).max(90);
/** Longitude, same. */
const lngSchema = z.number().min(-180).max(180);
export const roadtripViaSchema = z.object({
id: z.number(),
day_id: z.number(),
/**
* Which stop this via follows, counted the way the routing request is built.
*
* Deliberately an index and not an assignment id: a stop added mid-day is written
* optimistically with a temporary negative id and swapped for the real one moments
* later, so a reference to it would dangle exactly when the user is dragging.
*/
after_order_index: z.number().int().min(0),
/** Order among the vias that follow the same stop. */
sequence: z.number().int().min(0),
lat: latSchema,
lng: lngSchema,
created_at: z.string().optional(),
});
export type RoadtripVia = z.infer<typeof roadtripViaSchema>;
export const roadtripViaCreateRequestSchema = z.object({
after_order_index: z.number().int().min(0),
lat: latSchema,
lng: lngSchema,
/** Where among the vias after that stop; appended when absent. */
sequence: z.number().int().min(0).optional(),
});
export type RoadtripViaCreateRequest = z.infer<typeof roadtripViaCreateRequestSchema>;
/** Moving a via is the whole edit — dragging it somewhere else on the map. */
export const roadtripViaUpdateRequestSchema = z.object({
lat: latSchema,
lng: lngSchema,
});
export type RoadtripViaUpdateRequest = z.infer<typeof roadtripViaUpdateRequestSchema>;
/**
* Re-pinning a day's vias after the shape of its stops changed.
*
* `after_order_index` is a position, so inserting, removing or reordering a stop moves
* the ground under every via that follows it: the anchors keep their old numbers and the
* route silently reverts to the road the user had steered it away from. Whoever changes
* the stops sends the corrected anchoring here, and it is applied in one transaction —
* a half-applied re-anchoring is worse than none, because it mixes two numbering schemes
* in the same day.
*
* `remove` carries the vias whose leg stopped existing at all: delete the last stop and
* the leg into it is gone, and a via pinned to it has nowhere left to sit.
*/
export const roadtripViaReanchorRequestSchema = z.object({
vias: z.array(z.object({
id: z.number().int().positive(),
after_order_index: z.number().int().min(0),
})).max(500),
remove: z.array(z.number().int().positive()).max(500).optional(),
});
export type RoadtripViaReanchorRequest = z.infer<typeof roadtripViaReanchorRequestSchema>;
export const roadtripViaListResponseSchema = z.object({
vias: z.array(roadtripViaSchema),
});
export type RoadtripViaListResponse = z.infer<typeof roadtripViaListResponseSchema>;