feat(tours): a city walk from a Google Maps walking route, its short link followed only to Google Maps (CW-06, CW-07)

"Add tour" in the planner now offers "Import walk from Google Maps". The
dialog takes the link of a route shared in Google Maps, either a
maps.app.goo.gl short link or the long google.com/maps/dir link, or the
share text of the Google Maps app with the one link in it. It shows the
stops in their order with their names, marks a stop the link gives no
position as such, says that the route comes from Google Maps with a link to
open it there, and that TREK plans the way between the stops itself and
does not take the line drawn in Google Maps over. Nothing is written until
"Load as walk": that opens a new, unsaved city walk in the planner with the
positioned stops and their names, routed on foot by TREK, and warns first
when it replaces unsaved work. A stop without a position is left out and
never looked up or guessed; with fewer than two positions nothing can be
loaded. While the walk is not saved, a calm notice in the planner says
where it came from, also after a reload of the draft. Cancelling or a
failure leaves every tour as it was.

Only a route the link marks unambiguously as on foot is read. A car, bike
or transit route, a link that does not say, or one that says two things is
refused with a reason the dialog gives in the reader's language. Each stop
takes its position from its own block of the link's data, so a line
dragged through extra points or a stop given as coordinates no longer
leaves the stops without positions or shifts them. The road trip and
places imports read links as before.

A short link is followed by a resolver of its own: every hop is checked
against the Google Maps short link shapes and the strict SSRF guard before
it is looked up or asked, so ALLOW_INTERNAL_NETWORK and
ALLOW_LINK_LOCAL_IPS do not open it. Each request goes to the vetted
addresses only, follows nothing by itself, reads no body and carries no
credentials; the chain has one deadline including name lookups, at most
three hops and a cap on the Location header, and the long link it ends on
must be Google Maps and is never fetched. The preview is POST
/api/trips/:tripId/tours/import/google-maps/preview for members who may
edit places, with a 502 when Google could not be reached, and the MCP tool
preview_google_maps_walk reads the same.
This commit is contained in:
Maurice
2026-10-20 04:21:14 +00:00
parent 2203ff3a2e
commit 4ca5728072
67 changed files with 3770 additions and 68 deletions
+41 -1
View File
@@ -108,7 +108,8 @@ const tours: TranslationStrings = {
'tours.planner.title': 'تخطيط جولة',
'tours.planner.newTour': 'تخطيط جولة جديدة',
'tours.planner.addTour': 'إضافة جولة',
'tours.planner.addTourHint': 'خطط لجولة جديدة أو استورد ملفات GPX أو انقل جولة من رحلة أخرى',
'tours.planner.addTourHint':
'خطط لجولة جديدة أو استورد ملفات GPX أو جولة مشي من Google Maps أو انقل جولة من رحلة أخرى',
'tours.planner.neutralTitle': 'تخطيط جولة',
'tours.planner.neutralBody': 'ابدأ جولة جديدة وانقر على الخريطة لتحديد نقاط المسار.',
'tours.planner.newTitle': 'جولة جديدة',
@@ -319,6 +320,45 @@ const tours: TranslationStrings = {
'tours.library.confirm': 'نقل',
'tours.library.taken': 'تم نقل «{name}» إلى هذه الرحلة.',
'tours.library.failed': 'تعذّر نقل الجولة.',
'tours.walkImport.menu': 'استيراد جولة مشي من Google Maps',
'tours.walkImport.title': 'جولة مشي من رابط Google Maps',
'tours.walkImport.intro':
'شارك مسار مشي في Google Maps والصق رابطه هنا. يقرأ TREK المحطات ويخطط بنفسه طريق المشي بينها.',
'tours.walkImport.urlLabel': 'رابط مسار المشي',
'tours.walkImport.urlHint': 'رابط مختصر من maps.app.goo.gl أو عنوان المسار على google.com/maps.',
'tours.walkImport.read': 'قراءة الرابط',
'tours.walkImport.back': 'استخدام رابط آخر',
'tours.walkImport.load': 'تحميل كجولة مشي',
'tours.walkImport.stops': 'المحطات في الرابط',
'tours.walkImport.source': 'من Google Maps',
'tours.walkImport.openSource': 'فتح في Google Maps',
'tours.walkImport.recalculated': 'يخطط TREK الطريق بين المحطات من جديد، ولا يأخذ الخط المرسوم في Google Maps.',
'tours.walkImport.noPosition': 'لا موقع في الرابط',
'tours.walkImport.unresolved': '{count} محطة بلا موقع في الرابط ولذلك تُترك.',
'tours.walkImport.unresolved.zero': 'لا توجد محطة بلا موقع في الرابط.',
'tours.walkImport.unresolved.one': 'محطة واحدة بلا موقع في الرابط ولذلك تُترك.',
'tours.walkImport.unresolved.two': 'محطتان بلا موقع في الرابط ولذلك تُتركان.',
'tours.walkImport.unresolved.few': '{count} محطات بلا موقع في الرابط ولذلك تُترك.',
'tours.walkImport.unresolved.many': '{count} محطة بلا موقع في الرابط ولذلك تُترك.',
'tours.walkImport.tooFewPositions': 'تحتاج جولة المشي إلى محطتين على الأقل لهما موقع.',
'tours.walkImport.replacesDraft': 'تحميل الجولة يستبدل التغييرات غير المحفوظة في المخطِّط.',
'tours.walkImport.defaultName': 'جولة مشي من Google Maps',
'tours.walkImport.draftNotice': 'من مسار مشي في Google Maps. خطط TREK بنفسه الطريق بين المحطات.',
'tours.walkImport.offline': 'تتطلب قراءة الرابط اتصالًا بالإنترنت.',
'tours.walkImport.failed': 'تعذرت قراءة الرابط الآن. حاول مرة أخرى بعد قليل.',
'tours.walkImport.refusal.not_google_maps':
'استخدم رابط مسار من Google Maps: رابطًا مختصرًا من maps.app.goo.gl أو رابطًا على google.com/maps/dir.',
'tours.walkImport.refusal.not_a_route':
'رابط Google Maps هذا ليس مسارًا. خطط جولة المشي في Google Maps وشارك المسار.',
'tours.walkImport.refusal.not_walking':
'هذا المسار غير مخطط سيرًا على الأقدام. اختر وضع المشي في Google Maps وشارك المسار من جديد.',
'tours.walkImport.refusal.mode_unknown':
'لا يذكر الرابط بوضوح أن المسار سيرًا على الأقدام. اختر المشي في Google Maps وشاركه من جديد.',
'tours.walkImport.refusal.short_link_refused': 'يقود الرابط المختصر إلى مكان غير Google Maps، لذلك لم يُتابَع.',
'tours.walkImport.refusal.short_link_failed':
'تعذرت متابعة الرابط المختصر الآن. حاول مرة أخرى أو الصق الرابط الطويل.',
'tours.walkImport.refusal.too_few_stops': 'أمكن قراءة أقل من محطتين من هذا الرابط.',
'tours.walkImport.refusal.too_many_stops': 'في هذا المسار محطات أكثر مما تتسع له جولة المشي.',
'tours.provenance.takenOverFrom': 'منقولة من',
'tours.poi.title': 'على طول الجولة',
'tours.poi.intro': 'أماكن للتوقف قريبة من المسار. لا يتغير شيء حتى تضيف واحدًا.',
+39 -1
View File
@@ -94,7 +94,8 @@ const tours: TranslationStrings = {
'tours.planner.title': 'Tur planlaşdır',
'tours.planner.newTour': 'Yeni tur planlaşdır',
'tours.planner.addTour': 'Tur əlavə et',
'tours.planner.addTourHint': 'Yeni tur planla, GPX fayllarını idxal et və ya başqa səfərdən tur götür',
'tours.planner.addTourHint':
'Yeni tur planla, GPX fayllarını və ya Google Maps-dən gəzinti idxal et, ya da başqa səfərdən tur götür',
'tours.planner.neutralTitle': 'Tur planlaşdır',
'tours.planner.neutralBody': 'Yeni tur başladın və marşrut nöqtələrini qoymaq üçün xəritəyə klikləyin.',
'tours.planner.newTitle': 'Yeni tur',
@@ -308,6 +309,43 @@ const tours: TranslationStrings = {
'tours.library.confirm': 'Götür',
'tours.library.taken': '“{name}” bu səfərə götürüldü.',
'tours.library.failed': 'Tur götürülə bilmədi.',
'tours.walkImport.menu': 'Google Maps-dən gəzinti idxal et',
'tours.walkImport.title': 'Google Maps keçidindən gəzinti',
'tours.walkImport.intro':
'Google Maps-də piyada marşrutu paylaş və keçidini bura yapışdır. TREK dayanacaqları oxuyur və onların arasındakı piyada yolu özü planlaşdırır.',
'tours.walkImport.urlLabel': 'Piyada marşrutunun keçidi',
'tours.walkImport.urlHint': 'maps.app.goo.gl qısa keçidi və ya marşrutun google.com/maps ünvanı.',
'tours.walkImport.read': 'Keçidi oxu',
'tours.walkImport.back': 'Başqa keçid götür',
'tours.walkImport.load': 'Gəzinti kimi yüklə',
'tours.walkImport.stops': 'Keçiddəki dayanacaqlar',
'tours.walkImport.source': 'Google Maps-dən',
'tours.walkImport.openSource': 'Google Maps-də aç',
'tours.walkImport.recalculated':
'TREK dayanacaqlar arasındakı yolu yenidən planlaşdırır; Google Maps-də çəkilmiş xətt götürülmür.',
'tours.walkImport.noPosition': 'Keçiddə mövqe yoxdur',
'tours.walkImport.unresolved': '{count} dayanacağın keçiddə mövqeyi yoxdur və kənarda qalır.',
'tours.walkImport.unresolved.one': '{count} dayanacağın keçiddə mövqeyi yoxdur və kənarda qalır.',
'tours.walkImport.tooFewPositions': 'Gəzinti üçün mövqeyi olan ən azı iki dayanacaq lazımdır.',
'tours.walkImport.replacesDraft': 'Gəzintini yükləmək planlayıcıdakı yadda saxlanmamış dəyişikliklərin yerini tutur.',
'tours.walkImport.defaultName': 'Google Maps-dən gəzinti',
'tours.walkImport.draftNotice':
'Google Maps piyada marşrutundan. Dayanacaqlar arasındakı yolu TREK özü planlaşdırdı.',
'tours.walkImport.offline': 'Keçidi oxumaq üçün bağlantı lazımdır.',
'tours.walkImport.failed': 'Keçidi indi oxumaq mümkün olmadı. Bir azdan yenidən cəhd et.',
'tours.walkImport.refusal.not_google_maps':
'Google Maps marşrut keçidindən istifadə et: maps.app.goo.gl qısa keçidi və ya google.com/maps/dir keçidi.',
'tours.walkImport.refusal.not_a_route':
'Bu Google Maps keçidi marşrut deyil. Gəzintini Google Maps-də planlaşdır və marşrutu paylaş.',
'tours.walkImport.refusal.not_walking':
'Bu marşrut piyada planlaşdırılmayıb. Google Maps-i piyada rejiminə keçir və marşrutu yenidən paylaş.',
'tours.walkImport.refusal.mode_unknown':
'Keçid marşrutun piyada olduğunu aydın demir. Google Maps-də piyada seç və onu yenidən paylaş.',
'tours.walkImport.refusal.short_link_refused': 'Qısa keçid Google Maps-dən başqa yerə aparır, ona görə də izlənmədi.',
'tours.walkImport.refusal.short_link_failed':
'Qısa keçidi indi izləmək mümkün olmadı. Yenidən cəhd et və ya uzun keçidi yapışdır.',
'tours.walkImport.refusal.too_few_stops': 'Bu keçiddən ikidən az dayanacaq oxuna bildi.',
'tours.walkImport.refusal.too_many_stops': 'Bu marşrutda bir gəzintinin götürə biləcəyindən çox dayanacaq var.',
'tours.provenance.takenOverFrom': 'Götürüldüyü yer',
'tours.poi.title': 'Tur boyunca',
'tours.poi.intro': 'Marşruta yaxın dayanacaq yerləri. Birini əlavə edənə qədər heç nə dəyişmir.',
+40 -1
View File
@@ -98,7 +98,8 @@ const tours: TranslationStrings = {
'tours.planner.title': 'Planejar um passeio',
'tours.planner.newTour': 'Planejar novo passeio',
'tours.planner.addTour': 'Adicionar passeio',
'tours.planner.addTourHint': 'Planeje um novo passeio, importe arquivos GPX ou traga um passeio de outra viagem',
'tours.planner.addTourHint':
'Planeje um novo passeio, importe arquivos GPX ou um passeio do Google Maps, ou traga um passeio de outra viagem',
'tours.planner.neutralTitle': 'Planejar um passeio',
'tours.planner.neutralBody': 'Comece um novo passeio e clique no mapa para marcar os pontos do percurso.',
'tours.planner.newTitle': 'Novo passeio',
@@ -313,6 +314,44 @@ const tours: TranslationStrings = {
'tours.library.confirm': 'Trazer',
'tours.library.taken': '“{name}” foi trazido para esta viagem.',
'tours.library.failed': 'Não foi possível trazer o passeio.',
'tours.walkImport.menu': 'Importar passeio do Google Maps',
'tours.walkImport.title': 'Passeio a partir de um link do Google Maps',
'tours.walkImport.intro':
'Compartilhe uma rota a pé no Google Maps e cole o link aqui. O TREK lê as paradas e traça por conta própria o caminho a pé entre elas.',
'tours.walkImport.urlLabel': 'Link da rota a pé',
'tours.walkImport.urlHint': 'Um link curto do maps.app.goo.gl ou o endereço da rota em google.com/maps.',
'tours.walkImport.read': 'Ler o link',
'tours.walkImport.back': 'Usar outro link',
'tours.walkImport.load': 'Carregar como passeio',
'tours.walkImport.stops': 'Paradas do link',
'tours.walkImport.source': 'Do Google Maps',
'tours.walkImport.openSource': 'Abrir no Google Maps',
'tours.walkImport.recalculated':
'O TREK traça de novo o caminho entre as paradas; a linha desenhada no Google Maps não é aproveitada.',
'tours.walkImport.noPosition': 'Sem posição no link',
'tours.walkImport.unresolved': '{count} paradas não têm posição no link e ficam de fora.',
'tours.walkImport.unresolved.one': '{count} parada não tem posição no link e fica de fora.',
'tours.walkImport.tooFewPositions': 'Um passeio precisa de pelo menos duas paradas com posição.',
'tours.walkImport.replacesDraft': 'Carregar o passeio substitui as alterações não salvas do planejador.',
'tours.walkImport.defaultName': 'Passeio do Google Maps',
'tours.walkImport.draftNotice':
'De uma rota a pé do Google Maps. O TREK traçou por conta própria o caminho entre as paradas.',
'tours.walkImport.offline': 'Ler um link precisa de conexão.',
'tours.walkImport.failed': 'Não foi possível ler o link agora. Tente de novo daqui a pouco.',
'tours.walkImport.refusal.not_google_maps':
'Use um link de rota do Google Maps: um link curto do maps.app.goo.gl ou um link do google.com/maps/dir.',
'tours.walkImport.refusal.not_a_route':
'Esse link do Google Maps não é uma rota. Planeje o passeio no Google Maps e compartilhe a rota.',
'tours.walkImport.refusal.not_walking':
'Essa rota não foi planejada a pé. Mude o Google Maps para a pé e compartilhe a rota de novo.',
'tours.walkImport.refusal.mode_unknown':
'O link não diz com clareza que a rota é a pé. Escolha a pé no Google Maps e compartilhe de novo.',
'tours.walkImport.refusal.short_link_refused':
'O link curto leva a outro lugar que não o Google Maps, então não foi seguido.',
'tours.walkImport.refusal.short_link_failed':
'Não foi possível seguir o link curto agora. Tente de novo ou cole o link longo.',
'tours.walkImport.refusal.too_few_stops': 'Menos de duas paradas puderam ser lidas desse link.',
'tours.walkImport.refusal.too_many_stops': 'Essa rota tem mais paradas do que um passeio comporta.',
'tours.provenance.takenOverFrom': 'Trazido de',
'tours.poi.title': 'Ao longo do passeio',
'tours.poi.intro': 'Lugares para uma parada, perto da rota. Nada muda até você adicionar um.',
+40 -1
View File
@@ -98,7 +98,8 @@ const tours: TranslationStrings = {
'tours.planner.title': 'Planifica una excursió',
'tours.planner.newTour': 'Planifica una nova excursió',
'tours.planner.addTour': 'Afegeix una ruta',
'tours.planner.addTourHint': "Planifica una ruta nova, importa fitxers GPX o porta una ruta d'un altre viatge",
'tours.planner.addTourHint':
"Planifica una ruta nova, importa fitxers GPX o un passeig de Google Maps, o porta una ruta d'un altre viatge",
'tours.planner.neutralTitle': 'Planifica una excursió',
'tours.planner.neutralBody': 'Comença una ruta nova i fes clic al mapa per marcar-ne els punts.',
'tours.planner.newTitle': 'Nova excursió',
@@ -314,6 +315,44 @@ const tours: TranslationStrings = {
'tours.library.confirm': 'Agafar',
'tours.library.taken': "S'ha agafat «{name}» en aquest viatge.",
'tours.library.failed': "No s'ha pogut agafar la ruta.",
'tours.walkImport.menu': 'Importa un passeig de Google Maps',
'tours.walkImport.title': "Passeig des d'un enllaç de Google Maps",
'tours.walkImport.intro':
"Comparteix una ruta a peu a Google Maps i enganxa'n l'enllaç aquí. TREK llegeix les parades i traça pel seu compte el camí a peu entre elles.",
'tours.walkImport.urlLabel': 'Enllaç a la ruta a peu',
'tours.walkImport.urlHint': "Un enllaç curt de maps.app.goo.gl o l'adreça de la ruta a google.com/maps.",
'tours.walkImport.read': "Llegeix l'enllaç",
'tours.walkImport.back': 'Fes servir un altre enllaç',
'tours.walkImport.load': 'Carrega com a passeig',
'tours.walkImport.stops': "Parades de l'enllaç",
'tours.walkImport.source': 'De Google Maps',
'tours.walkImport.openSource': 'Obre a Google Maps',
'tours.walkImport.recalculated':
"TREK torna a traçar el camí entre les parades; la línia dibuixada a Google Maps no s'aprofita.",
'tours.walkImport.noPosition': "Sense posició a l'enllaç",
'tours.walkImport.unresolved': "{count} parades no tenen posició a l'enllaç i es deixen fora.",
'tours.walkImport.unresolved.one': "{count} parada no té posició a l'enllaç i es deixa fora.",
'tours.walkImport.tooFewPositions': 'Un passeig necessita com a mínim dues parades amb posició.',
'tours.walkImport.replacesDraft': 'Carregar el passeig substitueix els canvis no desats del planificador.',
'tours.walkImport.defaultName': 'Passeig de Google Maps',
'tours.walkImport.draftNotice':
"D'una ruta a peu de Google Maps. TREK ha traçat pel seu compte el camí entre les parades.",
'tours.walkImport.offline': 'Per llegir un enllaç cal connexió.',
'tours.walkImport.failed': "Ara no s'ha pogut llegir l'enllaç. Torna-ho a provar d'aquí a una estona.",
'tours.walkImport.refusal.not_google_maps':
'Fes servir un enllaç de ruta de Google Maps: un enllaç curt de maps.app.goo.gl o un enllaç de google.com/maps/dir.',
'tours.walkImport.refusal.not_a_route':
'Aquest enllaç de Google Maps no és una ruta. Planifica el passeig a Google Maps i comparteix la ruta.',
'tours.walkImport.refusal.not_walking':
'Aquesta ruta no està planificada a peu. Canvia Google Maps a peu i torna a compartir la ruta.',
'tours.walkImport.refusal.mode_unknown':
"L'enllaç no diu clarament que la ruta sigui a peu. Tria a peu a Google Maps i torna-la a compartir.",
'tours.walkImport.refusal.short_link_refused':
"L'enllaç curt porta a un lloc que no és Google Maps, així que no s'ha seguit.",
'tours.walkImport.refusal.short_link_failed':
"Ara no s'ha pogut seguir l'enllaç curt. Torna-ho a provar o enganxa l'enllaç llarg.",
'tours.walkImport.refusal.too_few_stops': "D'aquest enllaç s'han pogut llegir menys de dues parades.",
'tours.walkImport.refusal.too_many_stops': 'Aquesta ruta té més parades de les que admet un passeig.',
'tours.provenance.takenOverFrom': 'Agafada de',
'tours.poi.title': 'Al llarg de la ruta',
'tours.poi.intro': "Llocs per fer una parada, a prop de la ruta. No canvia res fins que n'afegeixis un.",
+39 -1
View File
@@ -98,7 +98,8 @@ const tours: TranslationStrings = {
'tours.planner.title': 'Naplánovat výlet',
'tours.planner.newTour': 'Naplánovat nový výlet',
'tours.planner.addTour': 'Přidat túru',
'tours.planner.addTourHint': 'Naplánuj novou túru, importuj soubory GPX nebo převezmi túru z jiné cesty',
'tours.planner.addTourHint':
'Naplánuj novou túru, importuj soubory GPX nebo procházku z Google Maps, nebo převezmi túru z jiné cesty',
'tours.planner.neutralTitle': 'Naplánovat výlet',
'tours.planner.neutralBody': 'Začněte novou túru a kliknutím do mapy umístěte její body.',
'tours.planner.newTitle': 'Nový výlet',
@@ -308,6 +309,43 @@ const tours: TranslationStrings = {
'tours.library.confirm': 'Převzít',
'tours.library.taken': '„{name}“ byla převzata do této cesty.',
'tours.library.failed': 'Túru se nepodařilo převzít.',
'tours.walkImport.menu': 'Importovat procházku z Google Maps',
'tours.walkImport.title': 'Procházka z odkazu Google Maps',
'tours.walkImport.intro':
'Sdílej pěší trasu v Google Maps a vlož sem její odkaz. TREK přečte zastávky a pěší cestu mezi nimi naplánuje sám.',
'tours.walkImport.urlLabel': 'Odkaz na pěší trasu',
'tours.walkImport.urlHint': 'Krátký odkaz maps.app.goo.gl nebo adresa trasy na google.com/maps.',
'tours.walkImport.read': 'Přečíst odkaz',
'tours.walkImport.back': 'Použít jiný odkaz',
'tours.walkImport.load': 'Načíst jako procházku',
'tours.walkImport.stops': 'Zastávky v odkazu',
'tours.walkImport.source': 'Z Google Maps',
'tours.walkImport.openSource': 'Otevřít v Google Maps',
'tours.walkImport.recalculated':
'TREK naplánuje cestu mezi zastávkami znovu; čára nakreslená v Google Maps se nepřebírá.',
'tours.walkImport.noPosition': 'V odkazu chybí poloha',
'tours.walkImport.unresolved': '{count} zastávek nemá v odkazu polohu, proto je vynecháme.',
'tours.walkImport.unresolved.one': '{count} zastávka nemá v odkazu polohu a vynechává se.',
'tours.walkImport.unresolved.few': '{count} zastávky nemají v odkazu polohu a vynechávají se.',
'tours.walkImport.tooFewPositions': 'Procházka potřebuje aspoň dvě zastávky s polohou.',
'tours.walkImport.replacesDraft': 'Načtení procházky nahradí neuložené změny v plánovači.',
'tours.walkImport.defaultName': 'Procházka z Google Maps',
'tours.walkImport.draftNotice': 'Z pěší trasy v Google Maps. Cestu mezi zastávkami naplánoval TREK sám.',
'tours.walkImport.offline': 'Ke čtení odkazu je potřeba připojení.',
'tours.walkImport.failed': 'Odkaz se teď nepodařilo přečíst. Zkus to za chvíli znovu.',
'tours.walkImport.refusal.not_google_maps':
'Použij odkaz na trasu v Google Maps: krátký odkaz maps.app.goo.gl nebo odkaz google.com/maps/dir.',
'tours.walkImport.refusal.not_a_route':
'Tento odkaz Google Maps není trasa. Naplánuj procházku v Google Maps a sdílej trasu.',
'tours.walkImport.refusal.not_walking':
'Tato trasa není naplánovaná pěšky. Přepni Google Maps na chůzi a sdílej trasu znovu.',
'tours.walkImport.refusal.mode_unknown':
'Z odkazu není jasné, že je trasa pěší. Zvol v Google Maps chůzi a sdílej ji znovu.',
'tours.walkImport.refusal.short_link_refused': 'Krátký odkaz vede jinam než do Google Maps, proto se nesledoval.',
'tours.walkImport.refusal.short_link_failed':
'Krátký odkaz se teď nepodařilo sledovat. Zkus to znovu, nebo vlož dlouhý odkaz.',
'tours.walkImport.refusal.too_few_stops': 'Z tohoto odkazu se podařilo přečíst méně než dvě zastávky.',
'tours.walkImport.refusal.too_many_stops': 'Tato trasa má víc zastávek, než procházka pojme.',
'tours.provenance.takenOverFrom': 'Převzato z',
'tours.poi.title': 'Podél túry',
'tours.poi.intro': 'Místa na zastávku blízko trasy. Nic se nezmění, dokud nějaké nepřidáš.',
+39 -1
View File
@@ -99,7 +99,7 @@ const tours: TranslationStrings = {
'tours.planner.newTour': 'Neue Tour planen',
'tours.planner.addTour': 'Tour hinzufügen',
'tours.planner.addTourHint':
'Neue Tour planen, GPX-Dateien importieren oder eine Tour aus einer anderen Reise übernehmen',
'Neue Tour planen, GPX-Dateien oder einen Walk aus Google Maps importieren oder eine Tour aus einer anderen Reise übernehmen',
'tours.planner.neutralTitle': 'Tour planen',
'tours.planner.neutralBody': 'Starte eine neue Tour und klicke auf die Karte, um die Wegpunkte zu setzen.',
'tours.planner.newTitle': 'Neue Tour',
@@ -317,6 +317,44 @@ const tours: TranslationStrings = {
'tours.library.confirm': 'Übernehmen',
'tours.library.taken': '„{name}“ wurde in diese Reise übernommen.',
'tours.library.failed': 'Die Tour konnte nicht übernommen werden.',
'tours.walkImport.menu': 'Walk aus Google Maps importieren',
'tours.walkImport.title': 'Walk aus einem Google-Maps-Link',
'tours.walkImport.intro':
'Teile eine Fußroute in Google Maps und füge ihren Link hier ein. TREK liest die Stationen und plant den Fußweg zwischen ihnen selbst.',
'tours.walkImport.urlLabel': 'Link zur Fußroute',
'tours.walkImport.urlHint': 'Ein Kurzlink von maps.app.goo.gl oder die Adresse der Route auf google.com/maps.',
'tours.walkImport.read': 'Link lesen',
'tours.walkImport.back': 'Anderen Link nehmen',
'tours.walkImport.load': 'Als Walk laden',
'tours.walkImport.stops': 'Stationen im Link',
'tours.walkImport.source': 'Aus Google Maps',
'tours.walkImport.openSource': 'In Google Maps öffnen',
'tours.walkImport.recalculated':
'TREK plant den Weg zwischen den Stationen neu; die in Google Maps gezeichnete Linie wird nicht übernommen.',
'tours.walkImport.noPosition': 'Keine Position im Link',
'tours.walkImport.unresolved': '{count} Stationen haben im Link keine Position und werden weggelassen.',
'tours.walkImport.unresolved.one': '{count} Station hat im Link keine Position und wird weggelassen.',
'tours.walkImport.tooFewPositions': 'Ein Walk braucht mindestens zwei Stationen mit Position.',
'tours.walkImport.replacesDraft': 'Das Laden des Walks ersetzt die nicht gespeicherten Änderungen im Planer.',
'tours.walkImport.defaultName': 'Walk aus Google Maps',
'tours.walkImport.draftNotice':
'Aus einer Fußroute von Google Maps. Den Weg zwischen den Stationen hat TREK selbst geplant.',
'tours.walkImport.offline': 'Zum Lesen eines Links braucht es eine Verbindung.',
'tours.walkImport.failed': 'Der Link ließ sich gerade nicht lesen. Versuch es gleich noch einmal.',
'tours.walkImport.refusal.not_google_maps':
'Nimm einen Routenlink von Google Maps: einen Kurzlink von maps.app.goo.gl oder einen Link auf google.com/maps/dir.',
'tours.walkImport.refusal.not_a_route':
'Dieser Google-Maps-Link ist keine Route. Plane den Walk in Google Maps und teile die Route.',
'tours.walkImport.refusal.not_walking':
'Diese Route ist nicht zu Fuß geplant. Stell Google Maps auf zu Fuß um und teile die Route erneut.',
'tours.walkImport.refusal.mode_unknown':
'Der Link sagt nicht eindeutig, dass die Route zu Fuß ist. Wähle in Google Maps zu Fuß und teile sie erneut.',
'tours.walkImport.refusal.short_link_refused':
'Der Kurzlink führt nicht zu Google Maps und wurde deshalb nicht aufgerufen.',
'tours.walkImport.refusal.short_link_failed':
'Der Kurzlink ließ sich gerade nicht auflösen. Versuch es noch einmal oder füge den langen Link ein.',
'tours.walkImport.refusal.too_few_stops': 'Aus diesem Link ließen sich keine zwei Stationen lesen.',
'tours.walkImport.refusal.too_many_stops': 'Diese Route hat mehr Stationen, als ein Walk aufnehmen kann.',
'tours.provenance.takenOverFrom': 'Übernommen aus',
'tours.poi.title': 'Entlang der Tour',
'tours.poi.intro': 'Orte für einen Stopp, nah an der Route. Es ändert sich nichts, bis du einen hinzufügst.',
+39 -1
View File
@@ -94,7 +94,8 @@ const tours: TranslationStrings = {
'tours.planner.title': 'Plan a tour',
'tours.planner.newTour': 'Plan new tour',
'tours.planner.addTour': 'Add tour',
'tours.planner.addTourHint': 'Plan a new tour, import GPX files or take a tour over from another trip',
'tours.planner.addTourHint':
'Plan a new tour, import GPX files or a Google Maps walk, or take a tour over from another trip',
'tours.planner.neutralTitle': 'Plan a tour',
'tours.planner.neutralBody': 'Start a new tour and click the map to place its waypoints.',
'tours.planner.newTitle': 'New tour',
@@ -307,6 +308,43 @@ const tours: TranslationStrings = {
'tours.library.confirm': 'Take over',
'tours.library.taken': '“{name}” was taken over into this trip.',
'tours.library.failed': 'The tour could not be taken over.',
'tours.walkImport.menu': 'Import walk from Google Maps',
'tours.walkImport.title': 'Walk from a Google Maps link',
'tours.walkImport.intro':
'Share a walking route in Google Maps and paste its link here. TREK reads the stops and plans the way on foot between them itself.',
'tours.walkImport.urlLabel': 'Link to the walking route',
'tours.walkImport.urlHint': 'A maps.app.goo.gl short link, or the address of the route on google.com/maps.',
'tours.walkImport.read': 'Read the link',
'tours.walkImport.back': 'Use another link',
'tours.walkImport.load': 'Load as walk',
'tours.walkImport.stops': 'Stops in the link',
'tours.walkImport.source': 'From Google Maps',
'tours.walkImport.openSource': 'Open in Google Maps',
'tours.walkImport.recalculated':
'TREK plans the way between the stops again; the line drawn in Google Maps is not taken over.',
'tours.walkImport.noPosition': 'No position in the link',
'tours.walkImport.unresolved': '{count} stops have no position in the link and are left out.',
'tours.walkImport.unresolved.one': '{count} stop has no position in the link and is left out.',
'tours.walkImport.tooFewPositions': 'A walk needs at least two stops with a position.',
'tours.walkImport.replacesDraft': 'Loading the walk replaces the unsaved changes in the planner.',
'tours.walkImport.defaultName': 'Walk from Google Maps',
'tours.walkImport.draftNotice': 'From a Google Maps walking route. TREK planned the way between the stops itself.',
'tours.walkImport.offline': 'Reading a link needs a connection.',
'tours.walkImport.failed': 'The link could not be read just now. Try again in a moment.',
'tours.walkImport.refusal.not_google_maps':
'Use a Google Maps route link: a maps.app.goo.gl short link or a google.com/maps/dir link.',
'tours.walkImport.refusal.not_a_route':
'That Google Maps link is not a route. Plan the walk in Google Maps and share the route.',
'tours.walkImport.refusal.not_walking':
'That route is not planned on foot. Switch Google Maps to walking and share the route again.',
'tours.walkImport.refusal.mode_unknown':
'The link does not say clearly that the route is on foot. Choose walking in Google Maps and share it again.',
'tours.walkImport.refusal.short_link_refused':
'The short link leads somewhere other than Google Maps, so it was not followed.',
'tours.walkImport.refusal.short_link_failed':
'The short link could not be followed just now. Try again, or paste the long link.',
'tours.walkImport.refusal.too_few_stops': 'Fewer than two stops could be read from that link.',
'tours.walkImport.refusal.too_many_stops': 'That route has more stops than a walk can take.',
'tours.provenance.takenOverFrom': 'Taken over from',
'tours.poi.title': 'Along the tour',
'tours.poi.intro': 'Places for a stop, close to the route. Nothing changes until you add one.',
+40 -1
View File
@@ -99,7 +99,8 @@ const tours: TranslationStrings = {
'tours.planner.title': 'Planificar una excursión',
'tours.planner.newTour': 'Planificar nueva excursión',
'tours.planner.addTour': 'Añadir ruta',
'tours.planner.addTourHint': 'Planifica una ruta nueva, importa archivos GPX o trae una ruta de otro viaje',
'tours.planner.addTourHint':
'Planifica una ruta nueva, importa archivos GPX o un paseo de Google Maps, o trae una ruta de otro viaje',
'tours.planner.neutralTitle': 'Planificar una excursión',
'tours.planner.neutralBody': 'Empieza una ruta nueva y haz clic en el mapa para colocar sus puntos.',
'tours.planner.newTitle': 'Nueva excursión',
@@ -313,6 +314,44 @@ const tours: TranslationStrings = {
'tours.library.confirm': 'Traer',
'tours.library.taken': '«{name}» se trajo a este viaje.',
'tours.library.failed': 'No se pudo traer la ruta.',
'tours.walkImport.menu': 'Importar paseo de Google Maps',
'tours.walkImport.title': 'Paseo desde un enlace de Google Maps',
'tours.walkImport.intro':
'Comparte una ruta a pie en Google Maps y pega aquí su enlace. TREK lee las paradas y traza por su cuenta el camino a pie entre ellas.',
'tours.walkImport.urlLabel': 'Enlace a la ruta a pie',
'tours.walkImport.urlHint': 'Un enlace corto de maps.app.goo.gl o la dirección de la ruta en google.com/maps.',
'tours.walkImport.read': 'Leer el enlace',
'tours.walkImport.back': 'Usar otro enlace',
'tours.walkImport.load': 'Cargar como paseo',
'tours.walkImport.stops': 'Paradas del enlace',
'tours.walkImport.source': 'Desde Google Maps',
'tours.walkImport.openSource': 'Abrir en Google Maps',
'tours.walkImport.recalculated':
'TREK vuelve a trazar el camino entre las paradas; la línea dibujada en Google Maps no se toma.',
'tours.walkImport.noPosition': 'Sin posición en el enlace',
'tours.walkImport.unresolved': '{count} paradas no tienen posición en el enlace y se dejan fuera.',
'tours.walkImport.unresolved.one': '{count} parada no tiene posición en el enlace y se deja fuera.',
'tours.walkImport.tooFewPositions': 'Un paseo necesita al menos dos paradas con posición.',
'tours.walkImport.replacesDraft': 'Cargar el paseo sustituye los cambios sin guardar del planificador.',
'tours.walkImport.defaultName': 'Paseo de Google Maps',
'tours.walkImport.draftNotice':
'De una ruta a pie de Google Maps. TREK trazó por su cuenta el camino entre las paradas.',
'tours.walkImport.offline': 'Leer un enlace necesita conexión.',
'tours.walkImport.failed': 'No se pudo leer el enlace ahora. Vuelve a intentarlo en un momento.',
'tours.walkImport.refusal.not_google_maps':
'Usa un enlace de ruta de Google Maps: un enlace corto de maps.app.goo.gl o un enlace de google.com/maps/dir.',
'tours.walkImport.refusal.not_a_route':
'Ese enlace de Google Maps no es una ruta. Planifica el paseo en Google Maps y comparte la ruta.',
'tours.walkImport.refusal.not_walking':
'Esa ruta no está planificada a pie. Cambia Google Maps a pie y vuelve a compartir la ruta.',
'tours.walkImport.refusal.mode_unknown':
'El enlace no dice con claridad que la ruta sea a pie. Elige a pie en Google Maps y vuelve a compartirla.',
'tours.walkImport.refusal.short_link_refused':
'El enlace corto lleva a otro sitio que no es Google Maps, así que no se siguió.',
'tours.walkImport.refusal.short_link_failed':
'No se pudo seguir el enlace corto ahora. Vuelve a intentarlo o pega el enlace largo.',
'tours.walkImport.refusal.too_few_stops': 'De ese enlace se pudieron leer menos de dos paradas.',
'tours.walkImport.refusal.too_many_stops': 'Esa ruta tiene más paradas de las que admite un paseo.',
'tours.provenance.takenOverFrom': 'Traída de',
'tours.poi.title': 'A lo largo de la ruta',
'tours.poi.intro': 'Lugares para una parada, cerca de la ruta. Nada cambia hasta que añadas uno.',
+38 -1
View File
@@ -95,7 +95,8 @@ const tours: TranslationStrings = {
'tours.planner.title': 'Planeeri retk',
'tours.planner.newTour': 'Planeeri uus retk',
'tours.planner.addTour': 'Lisa matk',
'tours.planner.addTourHint': 'Planeeri uus matk, impordi GPX-faile või võta matk üle teiselt reisilt',
'tours.planner.addTourHint':
'Planeeri uus matk, impordi GPX-faile või Google Mapsi jalutuskäik või võta matk üle teiselt reisilt',
'tours.planner.neutralTitle': 'Planeeri retk',
'tours.planner.neutralBody': 'Alusta uut matka ja klõpsa kaardil, et selle punktid paigutada.',
'tours.planner.newTitle': 'Uus retk',
@@ -310,6 +311,42 @@ const tours: TranslationStrings = {
'tours.library.confirm': 'Võta üle',
'tours.library.taken': '„{name}“ võeti sellele reisile üle.',
'tours.library.failed': 'Matka ei õnnestunud üle võtta.',
'tours.walkImport.menu': 'Impordi jalutuskäik Google Mapsist',
'tours.walkImport.title': 'Jalutuskäik Google Mapsi lingist',
'tours.walkImport.intro':
'Jaga Google Mapsis jalgsimarsruuti ja kleebi selle link siia. TREK loeb peatused ja planeerib jalgsitee nende vahel ise.',
'tours.walkImport.urlLabel': 'Link jalgsimarsruudile',
'tours.walkImport.urlHint': 'Lühilink maps.app.goo.gl või marsruudi aadress lehel google.com/maps.',
'tours.walkImport.read': 'Loe linki',
'tours.walkImport.back': 'Kasuta teist linki',
'tours.walkImport.load': 'Laadi jalutuskäiguna',
'tours.walkImport.stops': 'Lingi peatused',
'tours.walkImport.source': 'Google Mapsist',
'tours.walkImport.openSource': 'Ava Google Mapsis',
'tours.walkImport.recalculated':
'TREK planeerib tee peatuste vahel uuesti; Google Mapsis joonistatud joont üle ei võeta.',
'tours.walkImport.noPosition': 'Lingis pole asukohta',
'tours.walkImport.unresolved': '{count} peatusel pole lingis asukohta ja need jäetakse välja.',
'tours.walkImport.unresolved.one': '{count} peatusel pole lingis asukohta ja see jäetakse välja.',
'tours.walkImport.tooFewPositions': 'Jalutuskäiguks on vaja vähemalt kahte asukohaga peatust.',
'tours.walkImport.replacesDraft': 'Jalutuskäigu laadimine asendab planeerija salvestamata muudatused.',
'tours.walkImport.defaultName': 'Jalutuskäik Google Mapsist',
'tours.walkImport.draftNotice': 'Google Mapsi jalgsimarsruudist. Tee peatuste vahel planeeris TREK ise.',
'tours.walkImport.offline': 'Lingi lugemiseks on vaja ühendust.',
'tours.walkImport.failed': 'Linki ei õnnestunud praegu lugeda. Proovi hetke pärast uuesti.',
'tours.walkImport.refusal.not_google_maps':
'Kasuta Google Mapsi marsruudi linki: lühilinki maps.app.goo.gl või linki google.com/maps/dir.',
'tours.walkImport.refusal.not_a_route':
'See Google Mapsi link pole marsruut. Planeeri jalutuskäik Google Mapsis ja jaga marsruuti.',
'tours.walkImport.refusal.not_walking':
'See marsruut pole planeeritud jalgsi. Lülita Google Maps jalgsi peale ja jaga marsruuti uuesti.',
'tours.walkImport.refusal.mode_unknown':
'Link ei ütle selgelt, et marsruut on jalgsi. Vali Google Mapsis jalgsi ja jaga seda uuesti.',
'tours.walkImport.refusal.short_link_refused': 'Lühilink viib mujale kui Google Mapsi, seepärast seda ei järgitud.',
'tours.walkImport.refusal.short_link_failed':
'Lühilinki ei õnnestunud praegu järgida. Proovi uuesti või kleebi pikk link.',
'tours.walkImport.refusal.too_few_stops': 'Sellest lingist õnnestus lugeda vähem kui kaks peatust.',
'tours.walkImport.refusal.too_many_stops': 'Sellel marsruudil on rohkem peatusi, kui jalutuskäiku mahub.',
'tours.provenance.takenOverFrom': 'Üle võetud',
'tours.poi.title': 'Matka ääres',
'tours.poi.intro': 'Peatuskohad marsruudi lähedal. Midagi ei muutu enne, kui mõne lisad.',
+39 -1
View File
@@ -101,7 +101,7 @@ const tours: TranslationStrings = {
'tours.planner.newTour': 'Planifier une nouvelle sortie',
'tours.planner.addTour': 'Ajouter une sortie',
'tours.planner.addTourHint':
"Planifier une nouvelle sortie, importer des fichiers GPX ou reprendre une sortie d'un autre voyage",
"Planifier une nouvelle sortie, importer des fichiers GPX ou une balade Google Maps, ou reprendre une sortie d'un autre voyage",
'tours.planner.neutralTitle': 'Planifier une sortie',
'tours.planner.neutralBody': 'Commencez une nouvelle randonnée et cliquez sur la carte pour placer ses points.',
'tours.planner.newTitle': 'Nouvelle sortie',
@@ -320,6 +320,44 @@ const tours: TranslationStrings = {
'tours.library.confirm': 'Reprendre',
'tours.library.taken': '« {name} » a été repris dans ce voyage.',
'tours.library.failed': "L'itinéraire n'a pas pu être repris.",
'tours.walkImport.menu': 'Importer une balade depuis Google Maps',
'tours.walkImport.title': 'Balade depuis un lien Google Maps',
'tours.walkImport.intro':
'Partage un itinéraire à pied dans Google Maps et colle son lien ici. TREK lit les étapes et trace lui-même le chemin à pied entre elles.',
'tours.walkImport.urlLabel': "Lien vers l'itinéraire à pied",
'tours.walkImport.urlHint': "Un lien court maps.app.goo.gl, ou l'adresse de l'itinéraire sur google.com/maps.",
'tours.walkImport.read': 'Lire le lien',
'tours.walkImport.back': 'Prendre un autre lien',
'tours.walkImport.load': 'Charger comme balade',
'tours.walkImport.stops': 'Étapes du lien',
'tours.walkImport.source': 'Depuis Google Maps',
'tours.walkImport.openSource': 'Ouvrir dans Google Maps',
'tours.walkImport.recalculated':
"TREK retrace le chemin entre les étapes ; la ligne dessinée dans Google Maps n'est pas reprise.",
'tours.walkImport.noPosition': 'Pas de position dans le lien',
'tours.walkImport.unresolved': "{count} étapes n'ont pas de position dans le lien et sont laissées de côté.",
'tours.walkImport.unresolved.one': "{count} étape n'a pas de position dans le lien et est laissée de côté.",
'tours.walkImport.tooFewPositions': 'Une balade demande au moins deux étapes avec une position.',
'tours.walkImport.replacesDraft': 'Charger la balade remplace les modifications non enregistrées du planificateur.',
'tours.walkImport.defaultName': 'Balade depuis Google Maps',
'tours.walkImport.draftNotice':
"Tirée d'un itinéraire à pied de Google Maps. TREK a tracé lui-même le chemin entre les étapes.",
'tours.walkImport.offline': 'Lire un lien nécessite une connexion.',
'tours.walkImport.failed': "Le lien n'a pas pu être lu pour l'instant. Réessaie dans un moment.",
'tours.walkImport.refusal.not_google_maps':
"Utilise un lien d'itinéraire Google Maps : un lien court maps.app.goo.gl ou un lien google.com/maps/dir.",
'tours.walkImport.refusal.not_a_route':
"Ce lien Google Maps n'est pas un itinéraire. Prépare la balade dans Google Maps et partage l'itinéraire.",
'tours.walkImport.refusal.not_walking':
"Cet itinéraire n'est pas prévu à pied. Passe Google Maps en mode à pied et partage de nouveau l'itinéraire.",
'tours.walkImport.refusal.mode_unknown':
"Le lien ne dit pas clairement que l'itinéraire se fait à pied. Choisis à pied dans Google Maps et partage-le de nouveau.",
'tours.walkImport.refusal.short_link_refused':
"Le lien court mène ailleurs que vers Google Maps, il n'a donc pas été suivi.",
'tours.walkImport.refusal.short_link_failed':
"Le lien court n'a pas pu être suivi pour l'instant. Réessaie, ou colle le lien long.",
'tours.walkImport.refusal.too_few_stops': 'Moins de deux étapes ont pu être lues dans ce lien.',
'tours.walkImport.refusal.too_many_stops': "Cet itinéraire compte plus d'étapes qu'une balade ne peut en prendre.",
'tours.provenance.takenOverFrom': 'Repris de',
'tours.poi.title': "Le long de l'itinéraire",
'tours.poi.intro': "Des lieux où s'arrêter, près de l'itinéraire. Rien ne change tant que tu n'en ajoutes pas un.",
+41 -1
View File
@@ -99,7 +99,8 @@ const tours: TranslationStrings = {
'tours.planner.title': 'Σχεδιασμός εκδρομής',
'tours.planner.newTour': 'Σχεδιασμός νέας εκδρομής',
'tours.planner.addTour': 'Προσθήκη διαδρομής',
'tours.planner.addTourHint': 'Σχεδίασε νέα διαδρομή, εισήγαγε αρχεία GPX ή πάρε μια διαδρομή από άλλο ταξίδι',
'tours.planner.addTourHint':
'Σχεδίασε νέα διαδρομή, εισήγαγε αρχεία GPX ή μια βόλτα από το Google Maps, ή πάρε μια διαδρομή από άλλο ταξίδι',
'tours.planner.neutralTitle': 'Σχεδιασμός εκδρομής',
'tours.planner.neutralBody': 'Ξεκινήστε μια νέα διαδρομή και κάντε κλικ στον χάρτη για να ορίσετε τα σημεία της.',
'tours.planner.newTitle': 'Νέα εκδρομή',
@@ -320,6 +321,45 @@ const tours: TranslationStrings = {
'tours.library.confirm': 'Μεταφορά',
'tours.library.taken': 'Το «{name}» μεταφέρθηκε σε αυτό το ταξίδι.',
'tours.library.failed': 'Δεν ήταν δυνατή η μεταφορά της διαδρομής.',
'tours.walkImport.menu': 'Εισαγωγή βόλτας από το Google Maps',
'tours.walkImport.title': 'Βόλτα από σύνδεσμο του Google Maps',
'tours.walkImport.intro':
'Μοιράσου μια διαδρομή με τα πόδια στο Google Maps και επικόλλησε εδώ τον σύνδεσμό της. Το TREK διαβάζει τις στάσεις και σχεδιάζει μόνο του τη διαδρομή με τα πόδια ανάμεσά τους.',
'tours.walkImport.urlLabel': 'Σύνδεσμος της διαδρομής με τα πόδια',
'tours.walkImport.urlHint':
'Ένας σύντομος σύνδεσμος maps.app.goo.gl ή η διεύθυνση της διαδρομής στο google.com/maps.',
'tours.walkImport.read': 'Ανάγνωση συνδέσμου',
'tours.walkImport.back': 'Άλλος σύνδεσμος',
'tours.walkImport.load': 'Φόρτωση ως βόλτα',
'tours.walkImport.stops': 'Στάσεις στον σύνδεσμο',
'tours.walkImport.source': 'Από το Google Maps',
'tours.walkImport.openSource': 'Άνοιγμα στο Google Maps',
'tours.walkImport.recalculated':
'Το TREK σχεδιάζει ξανά τη διαδρομή ανάμεσα στις στάσεις. Η γραμμή που σχεδιάστηκε στο Google Maps δεν μεταφέρεται.',
'tours.walkImport.noPosition': 'Χωρίς θέση στον σύνδεσμο',
'tours.walkImport.unresolved': '{count} στάσεις δεν έχουν θέση στον σύνδεσμο και παραλείπονται.',
'tours.walkImport.unresolved.one': '{count} στάση δεν έχει θέση στον σύνδεσμο και παραλείπεται.',
'tours.walkImport.tooFewPositions': 'Μια βόλτα χρειάζεται τουλάχιστον δύο στάσεις με θέση.',
'tours.walkImport.replacesDraft': 'Η φόρτωση της βόλτας αντικαθιστά τις μη αποθηκευμένες αλλαγές του σχεδιαστή.',
'tours.walkImport.defaultName': 'Βόλτα από το Google Maps',
'tours.walkImport.draftNotice':
'Από διαδρομή με τα πόδια του Google Maps. Το TREK σχεδίασε μόνο του τη διαδρομή ανάμεσα στις στάσεις.',
'tours.walkImport.offline': 'Η ανάγνωση συνδέσμου χρειάζεται σύνδεση.',
'tours.walkImport.failed': 'Ο σύνδεσμος δεν διαβάστηκε αυτή τη στιγμή. Δοκίμασε ξανά σε λίγο.',
'tours.walkImport.refusal.not_google_maps':
'Χρησιμοποίησε σύνδεσμο διαδρομής του Google Maps: έναν σύντομο σύνδεσμο maps.app.goo.gl ή έναν σύνδεσμο google.com/maps/dir.',
'tours.walkImport.refusal.not_a_route':
'Αυτός ο σύνδεσμος του Google Maps δεν είναι διαδρομή. Σχεδίασε τη βόλτα στο Google Maps και μοιράσου τη διαδρομή.',
'tours.walkImport.refusal.not_walking':
'Αυτή η διαδρομή δεν είναι σχεδιασμένη με τα πόδια. Γύρισε το Google Maps σε «Με τα πόδια» και μοιράσου ξανά τη διαδρομή.',
'tours.walkImport.refusal.mode_unknown':
'Ο σύνδεσμος δεν λέει καθαρά ότι η διαδρομή είναι με τα πόδια. Διάλεξε «Με τα πόδια» στο Google Maps και μοιράσου την ξανά.',
'tours.walkImport.refusal.short_link_refused':
'Ο σύντομος σύνδεσμος οδηγεί κάπου αλλού και όχι στο Google Maps, γι’ αυτό δεν ακολουθήθηκε.',
'tours.walkImport.refusal.short_link_failed':
'Ο σύντομος σύνδεσμος δεν ακολουθήθηκε αυτή τη στιγμή. Δοκίμασε ξανά ή επικόλλησε τον μεγάλο σύνδεσμο.',
'tours.walkImport.refusal.too_few_stops': 'Από αυτόν τον σύνδεσμο διαβάστηκαν λιγότερες από δύο στάσεις.',
'tours.walkImport.refusal.too_many_stops': 'Αυτή η διαδρομή έχει περισσότερες στάσεις απ’ όσες χωράει μια βόλτα.',
'tours.provenance.takenOverFrom': 'Μεταφέρθηκε από',
'tours.poi.title': 'Κατά μήκος της διαδρομής',
'tours.poi.intro': 'Μέρη για στάση κοντά στη διαδρομή. Τίποτα δεν αλλάζει μέχρι να προσθέσεις κάποιο.',
+39 -1
View File
@@ -96,7 +96,8 @@ const tours: TranslationStrings = {
'tours.planner.title': 'Túra tervezése',
'tours.planner.newTour': 'Új túra tervezése',
'tours.planner.addTour': 'Túra hozzáadása',
'tours.planner.addTourHint': 'Új túra tervezése, GPX-fájlok importálása vagy túra átvétele egy másik utazásból',
'tours.planner.addTourHint':
'Új túra tervezése, GPX-fájlok vagy egy Google Maps-séta importálása, vagy túra átvétele egy másik utazásból',
'tours.planner.neutralTitle': 'Túra tervezése',
'tours.planner.neutralBody': 'Indíts új túrát, és kattints a térképre a pontjai elhelyezéséhez.',
'tours.planner.newTitle': 'Új túra',
@@ -315,6 +316,43 @@ const tours: TranslationStrings = {
'tours.library.confirm': 'Átvétel',
'tours.library.taken': '„{name}” átkerült ebbe az útba.',
'tours.library.failed': 'A túrát nem sikerült átvenni.',
'tours.walkImport.menu': 'Séta importálása a Google Mapsből',
'tours.walkImport.title': 'Séta egy Google Maps-linkből',
'tours.walkImport.intro':
'Oszd meg a gyalogos útvonalat a Google Mapsben, és illeszd be ide a linkjét. A TREK beolvassa a megállókat, és maga tervezi meg köztük a gyalogutat.',
'tours.walkImport.urlLabel': 'Link a gyalogos útvonalhoz',
'tours.walkImport.urlHint': 'Egy maps.app.goo.gl rövid link vagy az útvonal címe a google.com/maps oldalon.',
'tours.walkImport.read': 'Link beolvasása',
'tours.walkImport.back': 'Másik link',
'tours.walkImport.load': 'Betöltés sétaként',
'tours.walkImport.stops': 'Megállók a linkben',
'tours.walkImport.source': 'A Google Mapsből',
'tours.walkImport.openSource': 'Megnyitás a Google Mapsben',
'tours.walkImport.recalculated':
'A TREK újratervezi a megállók közötti utat; a Google Mapsben rajzolt vonalat nem veszi át.',
'tours.walkImport.noPosition': 'Nincs hely a linkben',
'tours.walkImport.unresolved': '{count} megállónak nincs helye a linkben, ezért kimarad.',
'tours.walkImport.unresolved.one': '{count} megállónak nincs helye a linkben, ezért kimarad.',
'tours.walkImport.tooFewPositions': 'Egy sétához legalább két megálló kell, amelynek van helye.',
'tours.walkImport.replacesDraft': 'A séta betöltése felülírja a tervező mentetlen módosításait.',
'tours.walkImport.defaultName': 'Séta a Google Mapsből',
'tours.walkImport.draftNotice':
'Egy Google Maps gyalogos útvonalából. A megállók közötti utat a TREK maga tervezte meg.',
'tours.walkImport.offline': 'A link beolvasásához kapcsolat kell.',
'tours.walkImport.failed': 'A linket most nem sikerült beolvasni. Próbáld újra egy kicsit később.',
'tours.walkImport.refusal.not_google_maps':
'Google Maps-útvonallinket használj: egy maps.app.goo.gl rövid linket vagy egy google.com/maps/dir linket.',
'tours.walkImport.refusal.not_a_route':
'Ez a Google Maps-link nem útvonal. Tervezd meg a sétát a Google Mapsben, és oszd meg az útvonalat.',
'tours.walkImport.refusal.not_walking':
'Ez az útvonal nem gyalogosan van tervezve. Állítsd a Google Mapset gyaloglásra, és oszd meg újra az útvonalat.',
'tours.walkImport.refusal.mode_unknown':
'A linkből nem derül ki egyértelműen, hogy az útvonal gyalogos. Válaszd a gyaloglást a Google Mapsben, és oszd meg újra.',
'tours.walkImport.refusal.short_link_refused': 'A rövid link nem a Google Mapsre vezet, ezért nem követtük.',
'tours.walkImport.refusal.short_link_failed':
'A rövid linket most nem sikerült követni. Próbáld újra, vagy illeszd be a hosszú linket.',
'tours.walkImport.refusal.too_few_stops': 'Ebből a linkből kettőnél kevesebb megállót sikerült beolvasni.',
'tours.walkImport.refusal.too_many_stops': 'Ennek az útvonalnak több megállója van, mint amennyit egy séta elbír.',
'tours.provenance.takenOverFrom': 'Átvéve innen',
'tours.poi.title': 'A túra mentén',
'tours.poi.intro': 'Megállóhelyek az útvonal közelében. Semmi sem változik, amíg hozzá nem adsz egyet.',
+41 -1
View File
@@ -93,7 +93,8 @@ const tours: TranslationStrings = {
'tours.planner.title': 'Rencanakan tur',
'tours.planner.newTour': 'Rencanakan tur baru',
'tours.planner.addTour': 'Tambah tur',
'tours.planner.addTourHint': 'Rencanakan tur baru, impor file GPX, atau ambil tur dari perjalanan lain',
'tours.planner.addTourHint':
'Rencanakan tur baru, impor file GPX atau rute jalan kaki dari Google Maps, atau ambil tur dari perjalanan lain',
'tours.planner.neutralTitle': 'Rencanakan tur',
'tours.planner.neutralBody': 'Mulai tur baru dan klik peta untuk menempatkan titik-titiknya.',
'tours.planner.newTitle': 'Tur baru',
@@ -307,6 +308,45 @@ const tours: TranslationStrings = {
'tours.library.confirm': 'Ambil',
'tours.library.taken': '“{name}” diambil ke perjalanan ini.',
'tours.library.failed': 'Tur tidak dapat diambil.',
'tours.walkImport.menu': 'Impor rute jalan kaki dari Google Maps',
'tours.walkImport.title': 'Rute jalan kaki dari tautan Google Maps',
'tours.walkImport.intro':
'Bagikan rute jalan kaki di Google Maps lalu tempel tautannya di sini. TREK membaca titik singgahnya dan merencanakan sendiri jalan kaki di antaranya.',
'tours.walkImport.urlLabel': 'Tautan ke rute jalan kaki',
'tours.walkImport.urlHint': 'Tautan pendek maps.app.goo.gl, atau alamat rute di google.com/maps.',
'tours.walkImport.read': 'Baca tautan',
'tours.walkImport.back': 'Pakai tautan lain',
'tours.walkImport.load': 'Muat sebagai rute jalan kaki',
'tours.walkImport.stops': 'Titik singgah dalam tautan',
'tours.walkImport.source': 'Dari Google Maps',
'tours.walkImport.openSource': 'Buka di Google Maps',
'tours.walkImport.recalculated':
'TREK merencanakan ulang jalan di antara titik singgah; garis yang digambar di Google Maps tidak diambil.',
'tours.walkImport.noPosition': 'Tidak ada posisi dalam tautan',
'tours.walkImport.unresolved': '{count} titik singgah tidak punya posisi dalam tautan dan dilewati.',
'tours.walkImport.tooFewPositions': 'Rute jalan kaki memerlukan setidaknya dua titik singgah yang punya posisi.',
'tours.walkImport.replacesDraft':
'Memuat rute jalan kaki akan menggantikan perubahan yang belum disimpan di perencana.',
'tours.walkImport.defaultName': 'Rute jalan kaki dari Google Maps',
'tours.walkImport.draftNotice':
'Dari rute jalan kaki Google Maps. Jalan di antara titik singgah direncanakan sendiri oleh TREK.',
'tours.walkImport.offline': 'Membaca tautan memerlukan koneksi.',
'tours.walkImport.failed': 'Tautan belum bisa dibaca saat ini. Coba lagi sebentar lagi.',
'tours.walkImport.refusal.not_google_maps':
'Gunakan tautan rute Google Maps: tautan pendek maps.app.goo.gl atau tautan google.com/maps/dir.',
'tours.walkImport.refusal.not_a_route':
'Tautan Google Maps ini bukan rute. Rencanakan jalan kaki di Google Maps lalu bagikan rutenya.',
'tours.walkImport.refusal.not_walking':
'Rute ini tidak direncanakan untuk jalan kaki. Ganti Google Maps ke jalan kaki lalu bagikan rutenya lagi.',
'tours.walkImport.refusal.mode_unknown':
'Tautan tidak menyatakan dengan jelas bahwa rutenya jalan kaki. Pilih jalan kaki di Google Maps lalu bagikan lagi.',
'tours.walkImport.refusal.short_link_refused':
'Tautan pendek mengarah ke tempat selain Google Maps, jadi tidak diikuti.',
'tours.walkImport.refusal.short_link_failed':
'Tautan pendek belum bisa diikuti saat ini. Coba lagi, atau tempel tautan panjangnya.',
'tours.walkImport.refusal.too_few_stops': 'Kurang dari dua titik singgah yang bisa dibaca dari tautan itu.',
'tours.walkImport.refusal.too_many_stops':
'Rute ini punya lebih banyak titik singgah daripada yang muat dalam satu rute jalan kaki.',
'tours.provenance.takenOverFrom': 'Diambil dari',
'tours.poi.title': 'Di sepanjang tur',
'tours.poi.intro': 'Tempat untuk berhenti, dekat rute. Tidak ada yang berubah sampai kamu menambahkannya.',
+41 -1
View File
@@ -97,7 +97,8 @@ const tours: TranslationStrings = {
'tours.planner.title': "Pianifica un'escursione",
'tours.planner.newTour': 'Pianifica nuova escursione',
'tours.planner.addTour': 'Aggiungi giro',
'tours.planner.addTourHint': 'Pianifica un nuovo giro, importa file GPX o riprendi un giro da un altro viaggio',
'tours.planner.addTourHint':
'Pianifica un nuovo giro, importa file GPX o una passeggiata da Google Maps, o riprendi un giro da un altro viaggio',
'tours.planner.neutralTitle': "Pianifica un'escursione",
'tours.planner.neutralBody': 'Inizia un nuovo percorso e fai clic sulla mappa per posizionarne i punti.',
'tours.planner.newTitle': 'Nuova escursione',
@@ -315,6 +316,45 @@ const tours: TranslationStrings = {
'tours.library.confirm': 'Riprendi',
'tours.library.taken': '“{name}” è stato ripreso in questo viaggio.',
'tours.library.failed': 'Non è stato possibile riprendere il percorso.',
'tours.walkImport.menu': 'Importa passeggiata da Google Maps',
'tours.walkImport.title': 'Passeggiata da un link di Google Maps',
'tours.walkImport.intro':
'Condividi un percorso a piedi in Google Maps e incolla qui il suo link. TREK legge le tappe e traccia da sé il cammino a piedi tra di esse.',
'tours.walkImport.urlLabel': 'Link al percorso a piedi',
'tours.walkImport.urlHint': "Un link breve maps.app.goo.gl oppure l'indirizzo del percorso su google.com/maps.",
'tours.walkImport.read': 'Leggi il link',
'tours.walkImport.back': 'Usa un altro link',
'tours.walkImport.load': 'Carica come passeggiata',
'tours.walkImport.stops': 'Tappe nel link',
'tours.walkImport.source': 'Da Google Maps',
'tours.walkImport.openSource': 'Apri in Google Maps',
'tours.walkImport.recalculated':
'TREK traccia di nuovo il cammino tra le tappe; la linea disegnata in Google Maps non viene ripresa.',
'tours.walkImport.noPosition': 'Nessuna posizione nel link',
'tours.walkImport.unresolved': '{count} tappe non hanno una posizione nel link e vengono tralasciate.',
'tours.walkImport.unresolved.one': '{count} tappa non ha una posizione nel link e viene tralasciata.',
'tours.walkImport.tooFewPositions': 'Una passeggiata richiede almeno due tappe con una posizione.',
'tours.walkImport.replacesDraft': 'Caricare la passeggiata sostituisce le modifiche non salvate nel pianificatore.',
'tours.walkImport.defaultName': 'Passeggiata da Google Maps',
'tours.walkImport.draftNotice':
'Da un percorso a piedi di Google Maps. TREK ha tracciato da sé il cammino tra le tappe.',
'tours.walkImport.offline': 'Per leggere un link serve una connessione.',
'tours.walkImport.failed': 'Il link non si è potuto leggere adesso. Riprova tra poco.',
'tours.walkImport.refusal.not_google_maps':
'Usa un link di percorso di Google Maps: un link breve maps.app.goo.gl o un link google.com/maps/dir.',
'tours.walkImport.refusal.not_a_route':
'Questo link di Google Maps non è un percorso. Pianifica la passeggiata in Google Maps e condividi il percorso.',
'tours.walkImport.refusal.not_walking':
'Questo percorso non è pianificato a piedi. Passa Google Maps a piedi e condividi di nuovo il percorso.',
'tours.walkImport.refusal.mode_unknown':
'Il link non dice chiaramente che il percorso è a piedi. Scegli a piedi in Google Maps e condividilo di nuovo.',
'tours.walkImport.refusal.short_link_refused':
'Il link breve porta altrove rispetto a Google Maps, quindi non è stato seguito.',
'tours.walkImport.refusal.short_link_failed':
'Il link breve non si è potuto seguire adesso. Riprova oppure incolla il link lungo.',
'tours.walkImport.refusal.too_few_stops': 'Da questo link si sono potute leggere meno di due tappe.',
'tours.walkImport.refusal.too_many_stops':
'Questo percorso ha più tappe di quante una passeggiata ne possa contenere.',
'tours.provenance.takenOverFrom': 'Ripreso da',
'tours.poi.title': 'Lungo il percorso',
'tours.poi.intro': 'Luoghi per una sosta, vicino al percorso. Nulla cambia finché non ne aggiungi uno.',
+37 -1
View File
@@ -92,7 +92,8 @@ const tours: TranslationStrings = {
'tours.planner.title': 'ツアーを計画',
'tours.planner.newTour': '新しいツアーを計画',
'tours.planner.addTour': 'ツアーを追加',
'tours.planner.addTourHint': '新しいツアーを計画、GPX ファイルを読み込み、または別の旅行からツアーを引き継ぎます',
'tours.planner.addTourHint':
'新しいツアーを計画、GPX ファイルや Google Maps の街歩きを読み込み、または別の旅行からツアーを引き継ぎます',
'tours.planner.neutralTitle': 'ツアーを計画',
'tours.planner.neutralBody': '新しいツアーを始めて、地図をクリックして経由地点を置きます。',
'tours.planner.newTitle': '新しいツアー',
@@ -301,6 +302,41 @@ const tours: TranslationStrings = {
'tours.library.confirm': '取り込む',
'tours.library.taken': '「{name}」をこの旅に取り込みました。',
'tours.library.failed': 'ツアーを取り込めませんでした。',
'tours.walkImport.menu': 'Google Maps から街歩きを読み込む',
'tours.walkImport.title': 'Google Maps のリンクから街歩き',
'tours.walkImport.intro':
'Google Maps で徒歩ルートを共有し、そのリンクをここに貼り付けてください。TREK が立ち寄り先を読み取り、その間の徒歩の道を自分で計画します。',
'tours.walkImport.urlLabel': '徒歩ルートのリンク',
'tours.walkImport.urlHint': 'maps.app.goo.gl の短縮リンク、または google.com/maps 上のルートのアドレス。',
'tours.walkImport.read': 'リンクを読み取る',
'tours.walkImport.back': '別のリンクを使う',
'tours.walkImport.load': '街歩きとして読み込む',
'tours.walkImport.stops': 'リンク内の立ち寄り先',
'tours.walkImport.source': 'Google Maps から',
'tours.walkImport.openSource': 'Google Maps で開く',
'tours.walkImport.recalculated':
'立ち寄り先の間の道は TREK があらためて計画します。Google Maps で描かれた線は引き継ぎません。',
'tours.walkImport.noPosition': 'リンクに位置がありません',
'tours.walkImport.unresolved': '{count} 件の立ち寄り先はリンクに位置がないため、除外されます。',
'tours.walkImport.tooFewPositions': '街歩きには位置のある立ち寄り先が少なくとも 2 件必要です。',
'tours.walkImport.replacesDraft': '街歩きを読み込むと、プランナーの未保存の変更は置き換えられます。',
'tours.walkImport.defaultName': 'Google Maps からの街歩き',
'tours.walkImport.draftNotice': 'Google Maps の徒歩ルートから。立ち寄り先の間の道は TREK が自分で計画しました。',
'tours.walkImport.offline': 'リンクを読み取るには接続が必要です。',
'tours.walkImport.failed': 'いまはリンクを読み取れませんでした。少し待ってからもう一度お試しください。',
'tours.walkImport.refusal.not_google_maps':
'Google Maps のルートのリンクを使ってください。maps.app.goo.gl の短縮リンクか google.com/maps/dir のリンクです。',
'tours.walkImport.refusal.not_a_route':
'この Google Maps のリンクはルートではありません。Google Maps で街歩きを計画し、ルートを共有してください。',
'tours.walkImport.refusal.not_walking':
'このルートは徒歩で計画されていません。Google Maps を徒歩に切り替えて、ルートをもう一度共有してください。',
'tours.walkImport.refusal.mode_unknown':
'リンクからは徒歩のルートかどうかがはっきりしません。Google Maps で徒歩を選び、もう一度共有してください。',
'tours.walkImport.refusal.short_link_refused': '短縮リンクの行き先が Google Maps ではないため、たどりませんでした。',
'tours.walkImport.refusal.short_link_failed':
'いまは短縮リンクをたどれませんでした。もう一度試すか、長いリンクを貼り付けてください。',
'tours.walkImport.refusal.too_few_stops': 'このリンクから読み取れた立ち寄り先は 2 件未満でした。',
'tours.walkImport.refusal.too_many_stops': 'このルートの立ち寄り先は、街歩きに入る数を超えています。',
'tours.provenance.takenOverFrom': '取り込み元',
'tours.poi.title': 'ツアー沿い',
'tours.poi.intro': 'ルートの近くにある立ち寄り先です。追加するまで何も変わりません。',
+38 -1
View File
@@ -89,7 +89,8 @@ const tours: TranslationStrings = {
'tours.planner.title': '투어 계획',
'tours.planner.newTour': '새 투어 계획',
'tours.planner.addTour': '투어 추가',
'tours.planner.addTourHint': '새 투어를 계획하거나 GPX 파일을 가져오거나 다른 여행의 투어를 가져옵니다',
'tours.planner.addTourHint':
'새 투어를 계획하거나 GPX 파일이나 Google Maps 산책을 가져오거나 다른 여행의 투어를 가져옵니다',
'tours.planner.neutralTitle': '투어 계획',
'tours.planner.neutralBody': '새 투어를 시작하고 지도를 클릭해 경유 지점을 놓으세요.',
'tours.planner.newTitle': '새 투어',
@@ -299,6 +300,42 @@ const tours: TranslationStrings = {
'tours.library.confirm': '가져오기',
'tours.library.taken': '“{name}”을(를) 이 여행으로 가져왔습니다.',
'tours.library.failed': '투어를 가져오지 못했습니다.',
'tours.walkImport.menu': 'Google Maps에서 산책 가져오기',
'tours.walkImport.title': 'Google Maps 링크로 만드는 산책',
'tours.walkImport.intro':
'Google Maps에서 도보 경로를 공유하고 그 링크를 여기에 붙여 넣으세요. TREK이 정류지를 읽고 그 사이의 도보 길을 직접 계획합니다.',
'tours.walkImport.urlLabel': '도보 경로 링크',
'tours.walkImport.urlHint': 'maps.app.goo.gl 단축 링크 또는 google.com/maps의 경로 주소.',
'tours.walkImport.read': '링크 읽기',
'tours.walkImport.back': '다른 링크 사용',
'tours.walkImport.load': '산책으로 불러오기',
'tours.walkImport.stops': '링크 속 정류지',
'tours.walkImport.source': 'Google Maps에서',
'tours.walkImport.openSource': 'Google Maps에서 열기',
'tours.walkImport.recalculated':
'정류지 사이의 길은 TREK이 다시 계획합니다. Google Maps에 그려진 선은 가져오지 않습니다.',
'tours.walkImport.noPosition': '링크에 위치가 없음',
'tours.walkImport.unresolved': '정류지 {count}곳은 링크에 위치가 없어 제외됩니다.',
'tours.walkImport.tooFewPositions': '산책에는 위치가 있는 정류지가 두 곳 이상 필요합니다.',
'tours.walkImport.replacesDraft': '산책을 불러오면 플래너의 저장하지 않은 변경 사항이 바뀝니다.',
'tours.walkImport.defaultName': 'Google Maps에서 가져온 산책',
'tours.walkImport.draftNotice':
'Google Maps 도보 경로에서 가져왔습니다. 정류지 사이의 길은 TREK이 직접 계획했습니다.',
'tours.walkImport.offline': '링크를 읽으려면 연결이 필요합니다.',
'tours.walkImport.failed': '지금은 링크를 읽지 못했습니다. 잠시 후 다시 시도하세요.',
'tours.walkImport.refusal.not_google_maps':
'Google Maps 경로 링크를 사용하세요. maps.app.goo.gl 단축 링크나 google.com/maps/dir 링크입니다.',
'tours.walkImport.refusal.not_a_route':
'이 Google Maps 링크는 경로가 아닙니다. Google Maps에서 산책을 계획하고 경로를 공유하세요.',
'tours.walkImport.refusal.not_walking':
'이 경로는 도보로 계획되지 않았습니다. Google Maps를 도보로 바꾸고 경로를 다시 공유하세요.',
'tours.walkImport.refusal.mode_unknown':
'링크만으로는 도보 경로인지 분명하지 않습니다. Google Maps에서 도보를 고르고 다시 공유하세요.',
'tours.walkImport.refusal.short_link_refused': '단축 링크가 Google Maps가 아닌 곳으로 이어져서 따라가지 않았습니다.',
'tours.walkImport.refusal.short_link_failed':
'지금은 단축 링크를 따라가지 못했습니다. 다시 시도하거나 긴 링크를 붙여 넣으세요.',
'tours.walkImport.refusal.too_few_stops': '이 링크에서 읽은 정류지가 두 곳보다 적습니다.',
'tours.walkImport.refusal.too_many_stops': '이 경로에는 산책 하나에 담을 수 있는 것보다 많은 정류지가 있습니다.',
'tours.provenance.takenOverFrom': '가져온 곳',
'tours.poi.title': '투어 경로 주변',
'tours.poi.intro': '경로 근처에 머물 만한 곳입니다. 추가하기 전에는 아무것도 바뀌지 않습니다.',
+39 -1
View File
@@ -99,7 +99,7 @@ const tours: TranslationStrings = {
'tours.planner.newTour': 'Nieuwe tocht plannen',
'tours.planner.addTour': 'Tocht toevoegen',
'tours.planner.addTourHint':
'Een nieuwe tocht plannen, GPX-bestanden importeren of een tocht uit een andere reis overnemen',
'Een nieuwe tocht plannen, GPX-bestanden of een wandeling uit Google Maps importeren, of een tocht uit een andere reis overnemen',
'tours.planner.neutralTitle': 'Een tocht plannen',
'tours.planner.neutralBody': 'Begin een nieuwe tocht en klik op de kaart om de punten te plaatsen.',
'tours.planner.newTitle': 'Nieuwe tocht',
@@ -316,6 +316,44 @@ const tours: TranslationStrings = {
'tours.library.confirm': 'Overnemen',
'tours.library.taken': '‘{name}’ is overgenomen in deze reis.',
'tours.library.failed': 'De tocht kon niet worden overgenomen.',
'tours.walkImport.menu': 'Wandeling uit Google Maps importeren',
'tours.walkImport.title': 'Wandeling uit een Google Maps-link',
'tours.walkImport.intro':
'Deel een wandelroute in Google Maps en plak de link hier. TREK leest de haltes en plant zelf de weg te voet ertussen.',
'tours.walkImport.urlLabel': 'Link naar de wandelroute',
'tours.walkImport.urlHint': 'Een korte link van maps.app.goo.gl of het adres van de route op google.com/maps.',
'tours.walkImport.read': 'Link lezen',
'tours.walkImport.back': 'Andere link gebruiken',
'tours.walkImport.load': 'Laden als wandeling',
'tours.walkImport.stops': 'Haltes in de link',
'tours.walkImport.source': 'Uit Google Maps',
'tours.walkImport.openSource': 'Openen in Google Maps',
'tours.walkImport.recalculated':
'TREK plant de weg tussen de haltes opnieuw; de lijn die in Google Maps getekend is, wordt niet overgenomen.',
'tours.walkImport.noPosition': 'Geen positie in de link',
'tours.walkImport.unresolved': '{count} haltes hebben geen positie in de link en worden weggelaten.',
'tours.walkImport.unresolved.one': '{count} halte heeft geen positie in de link en wordt weggelaten.',
'tours.walkImport.tooFewPositions': 'Een wandeling heeft minstens twee haltes met een positie nodig.',
'tours.walkImport.replacesDraft': 'Het laden van de wandeling vervangt de niet-opgeslagen wijzigingen in de planner.',
'tours.walkImport.defaultName': 'Wandeling uit Google Maps',
'tours.walkImport.draftNotice':
'Uit een wandelroute van Google Maps. TREK heeft de weg tussen de haltes zelf gepland.',
'tours.walkImport.offline': 'Voor het lezen van een link is een verbinding nodig.',
'tours.walkImport.failed': 'De link kon nu niet worden gelezen. Probeer het zo dadelijk opnieuw.',
'tours.walkImport.refusal.not_google_maps':
'Gebruik een routelink van Google Maps: een korte link van maps.app.goo.gl of een link op google.com/maps/dir.',
'tours.walkImport.refusal.not_a_route':
'Deze Google Maps-link is geen route. Plan de wandeling in Google Maps en deel de route.',
'tours.walkImport.refusal.not_walking':
'Deze route is niet te voet gepland. Zet Google Maps op lopen en deel de route opnieuw.',
'tours.walkImport.refusal.mode_unknown':
'De link zegt niet duidelijk dat de route te voet is. Kies lopen in Google Maps en deel haar opnieuw.',
'tours.walkImport.refusal.short_link_refused':
'De korte link leidt ergens anders heen dan Google Maps en is daarom niet gevolgd.',
'tours.walkImport.refusal.short_link_failed':
'De korte link kon nu niet worden gevolgd. Probeer het opnieuw of plak de lange link.',
'tours.walkImport.refusal.too_few_stops': 'Uit deze link konden minder dan twee haltes worden gelezen.',
'tours.walkImport.refusal.too_many_stops': 'Deze route heeft meer haltes dan een wandeling kan bevatten.',
'tours.provenance.takenOverFrom': 'Overgenomen uit',
'tours.poi.title': 'Langs de tocht',
'tours.poi.intro': 'Plekken voor een stop, dicht bij de route. Er verandert niets tot je er een toevoegt.',
+41 -1
View File
@@ -105,7 +105,8 @@ const tours: TranslationStrings = {
'tours.planner.title': 'Zaplanuj wycieczkę',
'tours.planner.newTour': 'Zaplanuj nową wycieczkę',
'tours.planner.addTour': 'Dodaj trasę',
'tours.planner.addTourHint': 'Zaplanuj nową trasę, zaimportuj pliki GPX lub przejmij trasę z innej podróży',
'tours.planner.addTourHint':
'Zaplanuj nową trasę, zaimportuj pliki GPX lub spacer z Google Maps albo przejmij trasę z innej podróży',
'tours.planner.neutralTitle': 'Zaplanuj wycieczkę',
'tours.planner.neutralBody': 'Rozpocznij nową trasę i kliknij mapę, aby wyznaczyć jej punkty.',
'tours.planner.newTitle': 'Nowa wycieczka',
@@ -322,6 +323,45 @@ const tours: TranslationStrings = {
'tours.library.confirm': 'Przejmij',
'tours.library.taken': '„{name}” przejęto do tej podróży.',
'tours.library.failed': 'Nie udało się przejąć trasy.',
'tours.walkImport.menu': 'Importuj spacer z Google Maps',
'tours.walkImport.title': 'Spacer z linku Google Maps',
'tours.walkImport.intro':
'Udostępnij trasę pieszą w Google Maps i wklej tu jej link. TREK odczyta przystanki i sam wyznaczy drogę pieszą między nimi.',
'tours.walkImport.urlLabel': 'Link do trasy pieszej',
'tours.walkImport.urlHint': 'Krótki link maps.app.goo.gl albo adres trasy w google.com/maps.',
'tours.walkImport.read': 'Odczytaj link',
'tours.walkImport.back': 'Użyj innego linku',
'tours.walkImport.load': 'Wczytaj jako spacer',
'tours.walkImport.stops': 'Przystanki w linku',
'tours.walkImport.source': 'Z Google Maps',
'tours.walkImport.openSource': 'Otwórz w Google Maps',
'tours.walkImport.recalculated':
'TREK wyznacza drogę między przystankami od nowa; linia narysowana w Google Maps nie jest przejmowana.',
'tours.walkImport.noPosition': 'Brak położenia w linku',
'tours.walkImport.unresolved': '{count} przystanku nie ma położenia w linku i zostaje pominięte.',
'tours.walkImport.unresolved.one': '{count} przystanek nie ma położenia w linku i zostaje pominięty.',
'tours.walkImport.unresolved.few': '{count} przystanki nie mają położenia w linku i zostają pominięte.',
'tours.walkImport.unresolved.many': '{count} przystanków nie ma położenia w linku i zostaje pominiętych.',
'tours.walkImport.tooFewPositions': 'Spacer potrzebuje co najmniej dwóch przystanków z położeniem.',
'tours.walkImport.replacesDraft': 'Wczytanie spaceru zastąpi niezapisane zmiany w planerze.',
'tours.walkImport.defaultName': 'Spacer z Google Maps',
'tours.walkImport.draftNotice': 'Z trasy pieszej w Google Maps. Drogę między przystankami TREK wyznaczył sam.',
'tours.walkImport.offline': 'Odczytanie linku wymaga połączenia.',
'tours.walkImport.failed': 'Nie udało się teraz odczytać linku. Spróbuj ponownie za chwilę.',
'tours.walkImport.refusal.not_google_maps':
'Użyj linku do trasy w Google Maps: krótkiego linku maps.app.goo.gl albo linku google.com/maps/dir.',
'tours.walkImport.refusal.not_a_route':
'Ten link Google Maps nie jest trasą. Zaplanuj spacer w Google Maps i udostępnij trasę.',
'tours.walkImport.refusal.not_walking':
'Ta trasa nie jest zaplanowana pieszo. Przełącz Google Maps na pieszo i udostępnij trasę ponownie.',
'tours.walkImport.refusal.mode_unknown':
'Link nie mówi jasno, że trasa jest piesza. Wybierz pieszo w Google Maps i udostępnij ją ponownie.',
'tours.walkImport.refusal.short_link_refused':
'Krótki link prowadzi gdzie indziej niż do Google Maps, więc nie został otwarty.',
'tours.walkImport.refusal.short_link_failed':
'Nie udało się teraz otworzyć krótkiego linku. Spróbuj ponownie albo wklej długi link.',
'tours.walkImport.refusal.too_few_stops': 'Z tego linku udało się odczytać mniej niż dwa przystanki.',
'tours.walkImport.refusal.too_many_stops': 'Ta trasa ma więcej przystanków, niż zmieści spacer.',
'tours.provenance.takenOverFrom': 'Przejęto z',
'tours.poi.title': 'Wzdłuż trasy',
'tours.poi.intro': 'Miejsca na postój blisko trasy. Nic się nie zmienia, dopóki nie dodasz któregoś.',
+40 -1
View File
@@ -106,7 +106,7 @@ const tours: TranslationStrings = {
'tours.planner.newTour': 'Спланировать новый тур',
'tours.planner.addTour': 'Добавить маршрут',
'tours.planner.addTourHint':
'Спланировать новый маршрут, импортировать файлы GPX или перенести маршрут из другой поездки',
'Спланировать новый маршрут, импортировать файлы GPX или прогулку из Google Maps, или перенести маршрут из другой поездки',
'tours.planner.neutralTitle': 'Спланировать тур',
'tours.planner.neutralBody': 'Начните новый маршрут и нажимайте на карту, чтобы расставить точки.',
'tours.planner.newTitle': 'Новый тур',
@@ -326,6 +326,45 @@ const tours: TranslationStrings = {
'tours.library.confirm': 'Взять',
'tours.library.taken': '«{name}» добавлен в эту поездку.',
'tours.library.failed': 'Не удалось взять маршрут.',
'tours.walkImport.menu': 'Импортировать прогулку из Google Maps',
'tours.walkImport.title': 'Прогулка по ссылке Google Maps',
'tours.walkImport.intro':
'Поделись пешим маршрутом в Google Maps и вставь сюда его ссылку. TREK прочитает остановки и сам проложит пеший путь между ними.',
'tours.walkImport.urlLabel': 'Ссылка на пеший маршрут',
'tours.walkImport.urlHint': 'Короткая ссылка maps.app.goo.gl или адрес маршрута на google.com/maps.',
'tours.walkImport.read': 'Прочитать ссылку',
'tours.walkImport.back': 'Взять другую ссылку',
'tours.walkImport.load': 'Загрузить как прогулку',
'tours.walkImport.stops': 'Остановки в ссылке',
'tours.walkImport.source': 'Из Google Maps',
'tours.walkImport.openSource': 'Открыть в Google Maps',
'tours.walkImport.recalculated':
'TREK заново прокладывает путь между остановками; линия, нарисованная в Google Maps, не переносится.',
'tours.walkImport.noPosition': 'В ссылке нет координат',
'tours.walkImport.unresolved': 'У {count} остановки нет координат в ссылке, они не войдут в прогулку.',
'tours.walkImport.unresolved.one': 'У {count} остановки нет координат в ссылке, она не войдёт в прогулку.',
'tours.walkImport.unresolved.few': 'У {count} остановок нет координат в ссылке, они не войдут в прогулку.',
'tours.walkImport.unresolved.many': 'У {count} остановок нет координат в ссылке, они не войдут в прогулку.',
'tours.walkImport.tooFewPositions': 'Для прогулки нужны хотя бы две остановки с координатами.',
'tours.walkImport.replacesDraft': 'Загрузка прогулки заменит несохранённые изменения в планировщике.',
'tours.walkImport.defaultName': 'Прогулка из Google Maps',
'tours.walkImport.draftNotice': 'Из пешего маршрута Google Maps. Путь между остановками TREK проложил сам.',
'tours.walkImport.offline': 'Чтобы прочитать ссылку, нужно подключение.',
'tours.walkImport.failed': 'Не удалось прочитать ссылку сейчас. Попробуй ещё раз чуть позже.',
'tours.walkImport.refusal.not_google_maps':
'Используй ссылку на маршрут Google Maps: короткую ссылку maps.app.goo.gl или ссылку google.com/maps/dir.',
'tours.walkImport.refusal.not_a_route':
'Эта ссылка Google Maps не маршрут. Спланируй прогулку в Google Maps и поделись маршрутом.',
'tours.walkImport.refusal.not_walking':
'Этот маршрут проложен не пешком. Переключи Google Maps на пеший режим и поделись маршрутом снова.',
'tours.walkImport.refusal.mode_unknown':
'Из ссылки не ясно, что маршрут пеший. Выбери пеший режим в Google Maps и поделись им снова.',
'tours.walkImport.refusal.short_link_refused':
'Короткая ссылка ведёт не в Google Maps, поэтому по ней не переходили.',
'tours.walkImport.refusal.short_link_failed':
'Не удалось перейти по короткой ссылке сейчас. Попробуй ещё раз или вставь длинную ссылку.',
'tours.walkImport.refusal.too_few_stops': 'Из этой ссылки удалось прочитать меньше двух остановок.',
'tours.walkImport.refusal.too_many_stops': 'В этом маршруте больше остановок, чем вмещает прогулка.',
'tours.provenance.takenOverFrom': 'Взят из',
'tours.poi.title': 'Вдоль маршрута',
'tours.poi.intro': 'Места для остановки рядом с маршрутом. Ничего не меняется, пока вы не добавите одно из них.',
+39 -1
View File
@@ -99,7 +99,8 @@ const tours: TranslationStrings = {
'tours.planner.title': 'Naplánovať túru',
'tours.planner.newTour': 'Naplánovať novú túru',
'tours.planner.addTour': 'Pridať túru',
'tours.planner.addTourHint': 'Naplánuj novú túru, importuj súbory GPX alebo prevezmi túru z inej cesty',
'tours.planner.addTourHint':
'Naplánuj novú túru, importuj súbory GPX alebo prechádzku z Google Maps, alebo prevezmi túru z inej cesty',
'tours.planner.neutralTitle': 'Naplánovať túru',
'tours.planner.neutralBody': 'Začnite novú túru a kliknutím do mapy umiestnite jej body.',
'tours.planner.newTitle': 'Nová túra',
@@ -309,6 +310,43 @@ const tours: TranslationStrings = {
'tours.library.confirm': 'Prevziať',
'tours.library.taken': '„{name}“ bola prevzatá do tejto cesty.',
'tours.library.failed': 'Túru sa nepodarilo prevziať.',
'tours.walkImport.menu': 'Importovať prechádzku z Google Maps',
'tours.walkImport.title': 'Prechádzka z odkazu Google Maps',
'tours.walkImport.intro':
'Zdieľaj pešiu trasu v Google Maps a vlož sem jej odkaz. TREK prečíta zastávky a pešiu cestu medzi nimi naplánuje sám.',
'tours.walkImport.urlLabel': 'Odkaz na pešiu trasu',
'tours.walkImport.urlHint': 'Krátky odkaz maps.app.goo.gl alebo adresa trasy na google.com/maps.',
'tours.walkImport.read': 'Prečítať odkaz',
'tours.walkImport.back': 'Použiť iný odkaz',
'tours.walkImport.load': 'Načítať ako prechádzku',
'tours.walkImport.stops': 'Zastávky v odkaze',
'tours.walkImport.source': 'Z Google Maps',
'tours.walkImport.openSource': 'Otvoriť v Google Maps',
'tours.walkImport.recalculated':
'TREK naplánuje cestu medzi zastávkami nanovo; čiara nakreslená v Google Maps sa nepreberá.',
'tours.walkImport.noPosition': 'V odkaze chýba poloha',
'tours.walkImport.unresolved': '{count} zastávok nemá v odkaze polohu, preto ich vynecháme.',
'tours.walkImport.unresolved.one': '{count} zastávka nemá v odkaze polohu a vynecháva sa.',
'tours.walkImport.unresolved.few': '{count} zastávky nemajú v odkaze polohu a vynechávajú sa.',
'tours.walkImport.tooFewPositions': 'Prechádzka potrebuje aspoň dve zastávky s polohou.',
'tours.walkImport.replacesDraft': 'Načítanie prechádzky nahradí neuložené zmeny v plánovači.',
'tours.walkImport.defaultName': 'Prechádzka z Google Maps',
'tours.walkImport.draftNotice': 'Z pešej trasy v Google Maps. Cestu medzi zastávkami naplánoval TREK sám.',
'tours.walkImport.offline': 'Na čítanie odkazu treba pripojenie.',
'tours.walkImport.failed': 'Odkaz sa teraz nepodarilo prečítať. Skús to o chvíľu znova.',
'tours.walkImport.refusal.not_google_maps':
'Použi odkaz na trasu v Google Maps: krátky odkaz maps.app.goo.gl alebo odkaz google.com/maps/dir.',
'tours.walkImport.refusal.not_a_route':
'Tento odkaz Google Maps nie je trasa. Naplánuj prechádzku v Google Maps a zdieľaj trasu.',
'tours.walkImport.refusal.not_walking':
'Táto trasa nie je naplánovaná pešo. Prepni Google Maps na chôdzu a zdieľaj trasu znova.',
'tours.walkImport.refusal.mode_unknown':
'Z odkazu nie je jasné, že trasa je pešia. Zvoľ v Google Maps chôdzu a zdieľaj ju znova.',
'tours.walkImport.refusal.short_link_refused': 'Krátky odkaz vedie inam než do Google Maps, preto sa nesledoval.',
'tours.walkImport.refusal.short_link_failed':
'Krátky odkaz sa teraz nepodarilo sledovať. Skús to znova alebo vlož dlhý odkaz.',
'tours.walkImport.refusal.too_few_stops': 'Z tohto odkazu sa podarilo prečítať menej ako dve zastávky.',
'tours.walkImport.refusal.too_many_stops': 'Táto trasa má viac zastávok, než prechádzka unesie.',
'tours.provenance.takenOverFrom': 'Prevzaté z',
'tours.poi.title': 'Pozdĺž túry',
'tours.poi.intro': 'Miesta na zastávku blízko trasy. Nič sa nezmení, kým nejaké nepridáš.',
+39 -1
View File
@@ -95,7 +95,8 @@ const tours: TranslationStrings = {
'tours.planner.title': 'Planera en tur',
'tours.planner.newTour': 'Planera ny tur',
'tours.planner.addTour': 'Lägg till tur',
'tours.planner.addTourHint': 'Planera en ny tur, importera GPX-filer eller ta över en tur från en annan resa',
'tours.planner.addTourHint':
'Planera en ny tur, importera GPX-filer eller en promenad från Google Maps, eller ta över en tur från en annan resa',
'tours.planner.neutralTitle': 'Planera en tur',
'tours.planner.neutralBody': 'Starta en ny tur och klicka på kartan för att placera dess punkter.',
'tours.planner.newTitle': 'Ny tur',
@@ -306,6 +307,43 @@ const tours: TranslationStrings = {
'tours.library.confirm': 'Hämta',
'tours.library.taken': '”{name}” hämtades till den här resan.',
'tours.library.failed': 'Turen kunde inte hämtas.',
'tours.walkImport.menu': 'Importera promenad från Google Maps',
'tours.walkImport.title': 'Promenad från en Google Maps-länk',
'tours.walkImport.intro':
'Dela en gångrutt i Google Maps och klistra in länken här. TREK läser stoppen och planerar själv vägen till fots mellan dem.',
'tours.walkImport.urlLabel': 'Länk till gångrutten',
'tours.walkImport.urlHint': 'En kortlänk från maps.app.goo.gl eller ruttens adress på google.com/maps.',
'tours.walkImport.read': 'Läs länken',
'tours.walkImport.back': 'Använd en annan länk',
'tours.walkImport.load': 'Läs in som promenad',
'tours.walkImport.stops': 'Stopp i länken',
'tours.walkImport.source': 'Från Google Maps',
'tours.walkImport.openSource': 'Öppna i Google Maps',
'tours.walkImport.recalculated':
'TREK planerar vägen mellan stoppen på nytt; linjen som ritats i Google Maps tas inte över.',
'tours.walkImport.noPosition': 'Ingen position i länken',
'tours.walkImport.unresolved': '{count} stopp saknar position i länken och lämnas utanför.',
'tours.walkImport.unresolved.one': '{count} stopp saknar position i länken och lämnas utanför.',
'tours.walkImport.tooFewPositions': 'En promenad behöver minst två stopp med position.',
'tours.walkImport.replacesDraft': 'När promenaden läses in ersätts de osparade ändringarna i planeraren.',
'tours.walkImport.defaultName': 'Promenad från Google Maps',
'tours.walkImport.draftNotice': 'Från en gångrutt i Google Maps. TREK har själv planerat vägen mellan stoppen.',
'tours.walkImport.offline': 'Att läsa en länk kräver en anslutning.',
'tours.walkImport.failed': 'Länken kunde inte läsas just nu. Försök igen om en stund.',
'tours.walkImport.refusal.not_google_maps':
'Använd en ruttlänk från Google Maps: en kortlänk från maps.app.goo.gl eller en länk på google.com/maps/dir.',
'tours.walkImport.refusal.not_a_route':
'Den Google Maps-länken är ingen rutt. Planera promenaden i Google Maps och dela rutten.',
'tours.walkImport.refusal.not_walking':
'Den rutten är inte planerad till fots. Ställ om Google Maps till gång och dela rutten igen.',
'tours.walkImport.refusal.mode_unknown':
'Länken säger inte tydligt att rutten går till fots. Välj gång i Google Maps och dela den igen.',
'tours.walkImport.refusal.short_link_refused':
'Kortlänken leder någon annanstans än till Google Maps och följdes därför inte.',
'tours.walkImport.refusal.short_link_failed':
'Kortlänken kunde inte följas just nu. Försök igen eller klistra in den långa länken.',
'tours.walkImport.refusal.too_few_stops': 'Färre än två stopp kunde läsas från den länken.',
'tours.walkImport.refusal.too_many_stops': 'Den rutten har fler stopp än en promenad rymmer.',
'tours.provenance.takenOverFrom': 'Hämtad från',
'tours.poi.title': 'Längs turen',
'tours.poi.intro': 'Platser för ett stopp nära rutten. Inget ändras förrän du lägger till en.',
+35 -1
View File
@@ -88,7 +88,8 @@ const tours: TranslationStrings = {
'tours.planner.title': 'วางแผนทัวร์',
'tours.planner.newTour': 'วางแผนทัวร์ใหม่',
'tours.planner.addTour': 'เพิ่มทริป',
'tours.planner.addTourHint': 'วางแผนทริปใหม่ นำเข้าไฟล์ GPX หรือรับทริปมาจากการเดินทางอื่น',
'tours.planner.addTourHint':
'วางแผนทริปใหม่ นำเข้าไฟล์ GPX หรือทริปเดินเท้าจาก Google Maps หรือรับทริปมาจากการเดินทางอื่น',
'tours.planner.neutralTitle': 'วางแผนทัวร์',
'tours.planner.neutralBody': 'เริ่มทัวร์ใหม่ แล้วคลิกแผนที่เพื่อวางจุดของเส้นทาง',
'tours.planner.newTitle': 'ทัวร์ใหม่',
@@ -294,6 +295,39 @@ const tours: TranslationStrings = {
'tours.library.confirm': 'นำมาใช้',
'tours.library.taken': 'นำ “{name}” มาใช้ในทริปนี้แล้ว',
'tours.library.failed': 'นำทัวร์มาใช้ไม่ได้',
'tours.walkImport.menu': 'นำเข้าทริปเดินเท้าจาก Google Maps',
'tours.walkImport.title': 'ทริปเดินเท้าจากลิงก์ Google Maps',
'tours.walkImport.intro':
'แชร์เส้นทางเดินเท้าใน Google Maps แล้ววางลิงก์ไว้ที่นี่ TREK จะอ่านจุดแวะและวางแผนทางเดินระหว่างจุดเหล่านั้นเอง',
'tours.walkImport.urlLabel': 'ลิงก์ของเส้นทางเดินเท้า',
'tours.walkImport.urlHint': 'ลิงก์สั้นของ maps.app.goo.gl หรือที่อยู่ของเส้นทางบน google.com/maps',
'tours.walkImport.read': 'อ่านลิงก์',
'tours.walkImport.back': 'ใช้ลิงก์อื่น',
'tours.walkImport.load': 'โหลดเป็นทริปเดินเท้า',
'tours.walkImport.stops': 'จุดแวะในลิงก์',
'tours.walkImport.source': 'จาก Google Maps',
'tours.walkImport.openSource': 'เปิดใน Google Maps',
'tours.walkImport.recalculated': 'TREK วางแผนทางระหว่างจุดแวะใหม่ เส้นที่วาดไว้ใน Google Maps จะไม่ถูกนำมาใช้',
'tours.walkImport.noPosition': 'ไม่มีตำแหน่งในลิงก์',
'tours.walkImport.unresolved': 'จุดแวะ {count} จุดไม่มีตำแหน่งในลิงก์และจะถูกข้ามไป',
'tours.walkImport.tooFewPositions': 'ทริปเดินเท้าต้องมีจุดแวะที่มีตำแหน่งอย่างน้อยสองจุด',
'tours.walkImport.replacesDraft': 'การโหลดทริปเดินเท้าจะแทนที่การเปลี่ยนแปลงที่ยังไม่ได้บันทึกในตัววางแผน',
'tours.walkImport.defaultName': 'ทริปเดินเท้าจาก Google Maps',
'tours.walkImport.draftNotice': 'มาจากเส้นทางเดินเท้าของ Google Maps ทางระหว่างจุดแวะ TREK วางแผนเอง',
'tours.walkImport.offline': 'การอ่านลิงก์ต้องเชื่อมต่ออินเทอร์เน็ต',
'tours.walkImport.failed': 'ตอนนี้อ่านลิงก์ไม่ได้ ลองอีกครั้งในอีกสักครู่',
'tours.walkImport.refusal.not_google_maps':
'ใช้ลิงก์เส้นทางของ Google Maps คือลิงก์สั้นของ maps.app.goo.gl หรือลิงก์ google.com/maps/dir',
'tours.walkImport.refusal.not_a_route':
'ลิงก์ Google Maps นี้ไม่ใช่เส้นทาง วางแผนทริปเดินเท้าใน Google Maps แล้วแชร์เส้นทาง',
'tours.walkImport.refusal.not_walking':
'เส้นทางนี้ไม่ได้วางแผนเป็นการเดินเท้า เปลี่ยน Google Maps เป็นโหมดเดินแล้วแชร์เส้นทางอีกครั้ง',
'tours.walkImport.refusal.mode_unknown':
'ลิงก์ไม่ได้บอกชัดว่าเส้นทางนี้เป็นการเดินเท้า เลือกโหมดเดินใน Google Maps แล้วแชร์อีกครั้ง',
'tours.walkImport.refusal.short_link_refused': 'ลิงก์สั้นนี้พาไปที่อื่นที่ไม่ใช่ Google Maps จึงไม่ได้ตามไป',
'tours.walkImport.refusal.short_link_failed': 'ตอนนี้ตามลิงก์สั้นไม่ได้ ลองอีกครั้งหรือวางลิงก์แบบยาว',
'tours.walkImport.refusal.too_few_stops': 'อ่านจุดแวะจากลิงก์นี้ได้ไม่ถึงสองจุด',
'tours.walkImport.refusal.too_many_stops': 'เส้นทางนี้มีจุดแวะมากกว่าที่ทริปเดินเท้าหนึ่งทริปรับได้',
'tours.provenance.takenOverFrom': 'นำมาจาก',
'tours.poi.title': 'ตามเส้นทางทัวร์',
'tours.poi.intro': 'สถานที่แวะพักใกล้เส้นทาง จะไม่มีอะไรเปลี่ยนจนกว่าคุณจะเพิ่ม',
+1 -1
View File
@@ -20,7 +20,7 @@ const tokens = (value: string) => [...value.matchAll(/\{[^{}]+\}/g)].map((match)
// placeholder spec; here only the general keys are.
const groups = pluralGroups(Object.keys(english));
const generalKeys = (keys: string[]) => keys.filter((key) => !pluralFormOf(key, groups));
const GENERAL_KEY_COUNT = 788;
const GENERAL_KEY_COUNT = 816;
function literalKeys(source: string): string[] {
const tree = ts.createSourceFile('locale.ts', source, ts.ScriptTarget.Latest, true);
+39 -1
View File
@@ -94,7 +94,8 @@ const tours: TranslationStrings = {
'tours.planner.title': 'Tur planla',
'tours.planner.newTour': 'Yeni tur planla',
'tours.planner.addTour': 'Tur ekle',
'tours.planner.addTourHint': 'Yeni bir tur planla, GPX dosyaları içe aktar veya başka bir seyahatten tur al',
'tours.planner.addTourHint':
"Yeni bir tur planla, GPX dosyaları ya da Google Maps'ten bir yürüyüş içe aktar veya başka bir seyahatten tur al",
'tours.planner.neutralTitle': 'Tur planla',
'tours.planner.neutralBody': 'Yeni bir tur başlatın ve noktalarını yerleştirmek için haritaya tıklayın.',
'tours.planner.newTitle': 'Yeni tur',
@@ -308,6 +309,43 @@ const tours: TranslationStrings = {
'tours.library.confirm': 'Al',
'tours.library.taken': '“{name}” bu geziye alındı.',
'tours.library.failed': 'Tur alınamadı.',
'tours.walkImport.menu': "Google Maps'ten yürüyüş içe aktar",
'tours.walkImport.title': 'Google Maps bağlantısından yürüyüş',
'tours.walkImport.intro':
"Google Maps'te bir yürüyüş rotası paylaş ve bağlantısını buraya yapıştır. TREK durakları okur ve aralarındaki yürüme yolunu kendisi planlar.",
'tours.walkImport.urlLabel': 'Yürüyüş rotasının bağlantısı',
'tours.walkImport.urlHint': 'Bir maps.app.goo.gl kısa bağlantısı ya da rotanın google.com/maps adresi.',
'tours.walkImport.read': 'Bağlantıyı oku',
'tours.walkImport.back': 'Başka bağlantı kullan',
'tours.walkImport.load': 'Yürüyüş olarak yükle',
'tours.walkImport.stops': 'Bağlantıdaki duraklar',
'tours.walkImport.source': "Google Maps'ten",
'tours.walkImport.openSource': "Google Maps'te aç",
'tours.walkImport.recalculated':
"TREK duraklar arasındaki yolu yeniden planlar; Google Maps'te çizilen çizgi alınmaz.",
'tours.walkImport.noPosition': 'Bağlantıda konum yok',
'tours.walkImport.unresolved': '{count} durağın bağlantıda konumu yok ve dışarıda bırakılıyor.',
'tours.walkImport.unresolved.one': '{count} durağın bağlantıda konumu yok ve dışarıda bırakılıyor.',
'tours.walkImport.tooFewPositions': 'Bir yürüyüş için konumu olan en az iki durak gerekir.',
'tours.walkImport.replacesDraft': 'Yürüyüşü yüklemek planlayıcıdaki kaydedilmemiş değişikliklerin yerini alır.',
'tours.walkImport.defaultName': "Google Maps'ten yürüyüş",
'tours.walkImport.draftNotice': 'Bir Google Maps yürüyüş rotasından. Duraklar arasındaki yolu TREK kendisi planladı.',
'tours.walkImport.offline': 'Bir bağlantıyı okumak için bağlantı gerekir.',
'tours.walkImport.failed': 'Bağlantı şu anda okunamadı. Birazdan yeniden dene.',
'tours.walkImport.refusal.not_google_maps':
'Bir Google Maps rota bağlantısı kullan: bir maps.app.goo.gl kısa bağlantısı ya da bir google.com/maps/dir bağlantısı.',
'tours.walkImport.refusal.not_a_route':
"Bu Google Maps bağlantısı bir rota değil. Yürüyüşü Google Maps'te planla ve rotayı paylaş.",
'tours.walkImport.refusal.not_walking':
"Bu rota yürüyerek planlanmamış. Google Maps'i yürüme moduna al ve rotayı yeniden paylaş.",
'tours.walkImport.refusal.mode_unknown':
"Bağlantı, rotanın yürüyerek olduğunu açıkça söylemiyor. Google Maps'te yürümeyi seç ve yeniden paylaş.",
'tours.walkImport.refusal.short_link_refused':
'Kısa bağlantı Google Maps dışında bir yere gidiyor, bu yüzden takip edilmedi.',
'tours.walkImport.refusal.short_link_failed':
'Kısa bağlantı şu anda takip edilemedi. Yeniden dene ya da uzun bağlantıyı yapıştır.',
'tours.walkImport.refusal.too_few_stops': 'Bu bağlantıdan ikiden az durak okunabildi.',
'tours.walkImport.refusal.too_many_stops': 'Bu rotada bir yürüyüşün alabileceğinden fazla durak var.',
'tours.provenance.takenOverFrom': 'Alındığı yer',
'tours.poi.title': 'Tur boyunca',
'tours.poi.intro': 'Rotaya yakın mola yerleri. Birini ekleyene kadar hiçbir şey değişmez.',
+40 -1
View File
@@ -104,7 +104,8 @@ const tours: TranslationStrings = {
'tours.planner.title': 'Спланувати тур',
'tours.planner.newTour': 'Спланувати новий тур',
'tours.planner.addTour': 'Додати маршрут',
'tours.planner.addTourHint': 'Спланувати новий маршрут, імпортувати файли GPX або перенести маршрут з іншої подорожі',
'tours.planner.addTourHint':
'Спланувати новий маршрут, імпортувати файли GPX або прогулянку з Google Maps, або перенести маршрут з іншої подорожі',
'tours.planner.neutralTitle': 'Спланувати тур',
'tours.planner.neutralBody': 'Почніть новий маршрут і натискайте на карту, щоб розставити точки.',
'tours.planner.newTitle': 'Новий тур',
@@ -321,6 +322,44 @@ const tours: TranslationStrings = {
'tours.library.confirm': 'Взяти',
'tours.library.taken': '«{name}» додано в цю подорож.',
'tours.library.failed': 'Не вдалося взяти маршрут.',
'tours.walkImport.menu': 'Імпортувати прогулянку з Google Maps',
'tours.walkImport.title': 'Прогулянка за посиланням Google Maps',
'tours.walkImport.intro':
'Поділися пішим маршрутом у Google Maps і встав сюди його посилання. TREK прочитає зупинки й сам прокладе пішу дорогу між ними.',
'tours.walkImport.urlLabel': 'Посилання на піший маршрут',
'tours.walkImport.urlHint': 'Коротке посилання maps.app.goo.gl або адреса маршруту на google.com/maps.',
'tours.walkImport.read': 'Прочитати посилання',
'tours.walkImport.back': 'Узяти інше посилання',
'tours.walkImport.load': 'Завантажити як прогулянку',
'tours.walkImport.stops': 'Зупинки в посиланні',
'tours.walkImport.source': 'З Google Maps',
'tours.walkImport.openSource': 'Відкрити в Google Maps',
'tours.walkImport.recalculated':
'TREK заново прокладає дорогу між зупинками; лінія, намальована в Google Maps, не переноситься.',
'tours.walkImport.noPosition': 'У посиланні немає координат',
'tours.walkImport.unresolved': '{count} зупинки не мають координат у посиланні, тож їх пропущено.',
'tours.walkImport.unresolved.one': '{count} зупинка не має координат у посиланні, тож її пропущено.',
'tours.walkImport.unresolved.few': '{count} зупинки не мають координат у посиланні, тож їх пропущено.',
'tours.walkImport.unresolved.many': '{count} зупинок не мають координат у посиланні, тож їх пропущено.',
'tours.walkImport.tooFewPositions': 'Для прогулянки потрібні щонайменше дві зупинки з координатами.',
'tours.walkImport.replacesDraft': 'Завантаження прогулянки замінить незбережені зміни в планувальнику.',
'tours.walkImport.defaultName': 'Прогулянка з Google Maps',
'tours.walkImport.draftNotice': 'З пішого маршруту Google Maps. Дорогу між зупинками TREK проклав сам.',
'tours.walkImport.offline': "Щоб прочитати посилання, потрібне з'єднання.",
'tours.walkImport.failed': 'Не вдалося прочитати посилання зараз. Спробуй ще раз трохи згодом.',
'tours.walkImport.refusal.not_google_maps':
'Використай посилання на маршрут Google Maps: коротке посилання maps.app.goo.gl або посилання google.com/maps/dir.',
'tours.walkImport.refusal.not_a_route':
'Це посилання Google Maps не маршрут. Сплануй прогулянку в Google Maps і поділися маршрутом.',
'tours.walkImport.refusal.not_walking':
'Цей маршрут прокладено не пішки. Перемкни Google Maps на пішохідний режим і поділися маршрутом знову.',
'tours.walkImport.refusal.mode_unknown':
'З посилання не ясно, що маршрут піший. Вибери пішохідний режим у Google Maps і поділися ним знову.',
'tours.walkImport.refusal.short_link_refused': 'Коротке посилання веде не в Google Maps, тому за ним не переходили.',
'tours.walkImport.refusal.short_link_failed':
'Не вдалося перейти за коротким посиланням зараз. Спробуй ще раз або встав довге посилання.',
'tours.walkImport.refusal.too_few_stops': 'З цього посилання вдалося прочитати менше двох зупинок.',
'tours.walkImport.refusal.too_many_stops': 'У цьому маршруті більше зупинок, ніж уміщує прогулянка.',
'tours.provenance.takenOverFrom': 'Взято з',
'tours.poi.title': 'Уздовж маршруту',
'tours.poi.intro': 'Місця для зупинки поруч із маршрутом. Нічого не змінюється, доки ви не додасте одне з них.',
+38 -1
View File
@@ -95,7 +95,8 @@ const tours: TranslationStrings = {
'tours.planner.title': 'Lên kế hoạch tham quan',
'tours.planner.newTour': 'Lên kế hoạch tham quan mới',
'tours.planner.addTour': 'Thêm chuyến đi',
'tours.planner.addTourHint': 'Lên kế hoạch chuyến mới, nhập tệp GPX hoặc lấy một chuyến từ hành trình khác',
'tours.planner.addTourHint':
'Lên kế hoạch chuyến mới, nhập tệp GPX hoặc lộ trình đi bộ từ Google Maps, hoặc lấy một chuyến từ hành trình khác',
'tours.planner.neutralTitle': 'Lên kế hoạch tham quan',
'tours.planner.neutralBody': 'Bắt đầu chuyến đi mới và nhấp vào bản đồ để đặt các điểm.',
'tours.planner.newTitle': 'Chuyến tham quan mới',
@@ -308,6 +309,42 @@ const tours: TranslationStrings = {
'tours.library.confirm': 'Lấy',
'tours.library.taken': 'Đã lấy “{name}” vào chuyến đi này.',
'tours.library.failed': 'Không lấy được chuyến.',
'tours.walkImport.menu': 'Nhập lộ trình đi bộ từ Google Maps',
'tours.walkImport.title': 'Lộ trình đi bộ từ liên kết Google Maps',
'tours.walkImport.intro':
'Chia sẻ một tuyến đi bộ trong Google Maps rồi dán liên kết vào đây. TREK đọc các điểm dừng và tự lên lộ trình đi bộ giữa chúng.',
'tours.walkImport.urlLabel': 'Liên kết đến tuyến đi bộ',
'tours.walkImport.urlHint': 'Một liên kết rút gọn maps.app.goo.gl, hoặc địa chỉ của tuyến trên google.com/maps.',
'tours.walkImport.read': 'Đọc liên kết',
'tours.walkImport.back': 'Dùng liên kết khác',
'tours.walkImport.load': 'Tải thành lộ trình đi bộ',
'tours.walkImport.stops': 'Các điểm dừng trong liên kết',
'tours.walkImport.source': 'Từ Google Maps',
'tours.walkImport.openSource': 'Mở trong Google Maps',
'tours.walkImport.recalculated':
'TREK lên lại đường đi giữa các điểm dừng; đường đã vẽ trong Google Maps không được giữ lại.',
'tours.walkImport.noPosition': 'Không có vị trí trong liên kết',
'tours.walkImport.unresolved': '{count} điểm dừng không có vị trí trong liên kết nên bị bỏ qua.',
'tours.walkImport.tooFewPositions': 'Một lộ trình đi bộ cần ít nhất hai điểm dừng có vị trí.',
'tours.walkImport.replacesDraft': 'Tải lộ trình đi bộ sẽ thay thế các thay đổi chưa lưu trong trình lập kế hoạch.',
'tours.walkImport.defaultName': 'Lộ trình đi bộ từ Google Maps',
'tours.walkImport.draftNotice': 'Từ một tuyến đi bộ của Google Maps. Đường đi giữa các điểm dừng do TREK tự lên.',
'tours.walkImport.offline': 'Cần có kết nối mạng để đọc liên kết.',
'tours.walkImport.failed': 'Hiện chưa đọc được liên kết. Hãy thử lại sau ít phút.',
'tours.walkImport.refusal.not_google_maps':
'Hãy dùng liên kết tuyến đường của Google Maps: liên kết rút gọn maps.app.goo.gl hoặc liên kết google.com/maps/dir.',
'tours.walkImport.refusal.not_a_route':
'Liên kết Google Maps này không phải là một tuyến đường. Hãy lên lộ trình đi bộ trong Google Maps và chia sẻ tuyến đường.',
'tours.walkImport.refusal.not_walking':
'Tuyến này không được lên để đi bộ. Hãy chuyển Google Maps sang đi bộ và chia sẻ lại tuyến đường.',
'tours.walkImport.refusal.mode_unknown':
'Liên kết không nói rõ tuyến này là đi bộ. Hãy chọn đi bộ trong Google Maps và chia sẻ lại.',
'tours.walkImport.refusal.short_link_refused':
'Liên kết rút gọn dẫn đến nơi khác chứ không phải Google Maps, nên không được mở theo.',
'tours.walkImport.refusal.short_link_failed':
'Hiện chưa mở theo được liên kết rút gọn. Hãy thử lại hoặc dán liên kết đầy đủ.',
'tours.walkImport.refusal.too_few_stops': 'Chỉ đọc được ít hơn hai điểm dừng từ liên kết này.',
'tours.walkImport.refusal.too_many_stops': 'Tuyến này có nhiều điểm dừng hơn mức một lộ trình đi bộ chứa được.',
'tours.provenance.takenOverFrom': 'Lấy từ',
'tours.poi.title': 'Dọc chuyến đi',
'tours.poi.intro': 'Những nơi để dừng chân gần lộ trình. Không có gì thay đổi cho đến khi bạn thêm một nơi.',
+31 -1
View File
@@ -85,7 +85,7 @@ const tours: TranslationStrings = {
'tours.planner.title': '規劃遊程',
'tours.planner.newTour': '規劃新遊程',
'tours.planner.addTour': '新增行程',
'tours.planner.addTourHint': '規劃新行程、匯入 GPX 檔案,或從其他旅行中接管行程',
'tours.planner.addTourHint': '規劃新行程、匯入 GPX 檔案或 Google Maps 漫步,或從其他旅行中接管行程',
'tours.planner.neutralTitle': '規劃遊程',
'tours.planner.neutralBody': '開始新路線,點選地圖放置路線點。',
'tours.planner.newTitle': '新遊程',
@@ -284,6 +284,36 @@ const tours: TranslationStrings = {
'tours.library.confirm': '引入',
'tours.library.taken': '已將「{name}」引入本行程。',
'tours.library.failed': '無法引入路線。',
'tours.walkImport.menu': '從 Google Maps 匯入漫步',
'tours.walkImport.title': '用 Google Maps 連結建立漫步',
'tours.walkImport.intro':
'在 Google Maps 中分享一條步行路線,並把連結貼到這裡。TREK 會讀取站點,並自行規劃站點之間的步行道路。',
'tours.walkImport.urlLabel': '步行路線的連結',
'tours.walkImport.urlHint': 'maps.app.goo.gl 短網址,或 google.com/maps 上的路線網址。',
'tours.walkImport.read': '讀取連結',
'tours.walkImport.back': '換一個連結',
'tours.walkImport.load': '作為漫步載入',
'tours.walkImport.stops': '連結中的站點',
'tours.walkImport.source': '來自 Google Maps',
'tours.walkImport.openSource': '在 Google Maps 中開啟',
'tours.walkImport.recalculated': '站點之間的道路由 TREK 重新規劃;Google Maps 中畫出的線不會沿用。',
'tours.walkImport.noPosition': '連結中沒有位置',
'tours.walkImport.unresolved': '有 {count} 個站點在連結中沒有位置,將會略過。',
'tours.walkImport.tooFewPositions': '一次漫步至少需要兩個有位置的站點。',
'tours.walkImport.replacesDraft': '載入漫步會取代規劃器中尚未儲存的變更。',
'tours.walkImport.defaultName': '來自 Google Maps 的漫步',
'tours.walkImport.draftNotice': '來自 Google Maps 的步行路線。站點之間的道路由 TREK 自行規劃。',
'tours.walkImport.offline': '讀取連結需要網路連線。',
'tours.walkImport.failed': '暫時無法讀取這個連結。請稍後再試。',
'tours.walkImport.refusal.not_google_maps':
'請使用 Google Maps 路線連結:maps.app.goo.gl 短網址或 google.com/maps/dir 連結。',
'tours.walkImport.refusal.not_a_route': '這個 Google Maps 連結不是路線。請在 Google Maps 中規劃漫步並分享路線。',
'tours.walkImport.refusal.not_walking': '這條路線不是以步行規劃的。請把 Google Maps 切換為步行,再分享一次路線。',
'tours.walkImport.refusal.mode_unknown': '連結沒有明確表示這是步行路線。請在 Google Maps 中選擇步行,再分享一次。',
'tours.walkImport.refusal.short_link_refused': '這個短網址指向 Google Maps 以外的地方,因此沒有跟隨。',
'tours.walkImport.refusal.short_link_failed': '暫時無法跟隨這個短網址。請再試一次,或貼上完整的長連結。',
'tours.walkImport.refusal.too_few_stops': '從這個連結只讀取到不足兩個站點。',
'tours.walkImport.refusal.too_many_stops': '這條路線的站點比一次漫步能容納的更多。',
'tours.provenance.takenOverFrom': '引入自',
'tours.poi.title': '沿途',
'tours.poi.intro': '靠近路線的停留地點。在你新增之前,不會有任何變動。',
+31 -1
View File
@@ -86,7 +86,7 @@ const tours: TranslationStrings = {
'tours.planner.title': '规划游览路线',
'tours.planner.newTour': '规划新游览路线',
'tours.planner.addTour': '添加行程',
'tours.planner.addTourHint': '规划新行程、导入 GPX 文件,或从其他旅行中接管行程',
'tours.planner.addTourHint': '规划新行程、导入 GPX 文件或 Google Maps 漫步,或从其他旅行中接管行程',
'tours.planner.neutralTitle': '规划游览路线',
'tours.planner.neutralBody': '开始新路线,点击地图放置路线点。',
'tours.planner.newTitle': '新游览路线',
@@ -285,6 +285,36 @@ const tours: TranslationStrings = {
'tours.library.confirm': '引入',
'tours.library.taken': '已将“{name}”引入本行程。',
'tours.library.failed': '无法引入路线。',
'tours.walkImport.menu': '从 Google Maps 导入漫步',
'tours.walkImport.title': '用 Google Maps 链接创建漫步',
'tours.walkImport.intro':
'在 Google Maps 中分享一条步行路线,并把链接粘贴到这里。TREK 会读取站点,并自行规划站点之间的步行道路。',
'tours.walkImport.urlLabel': '步行路线的链接',
'tours.walkImport.urlHint': 'maps.app.goo.gl 短链接,或 google.com/maps 上的路线地址。',
'tours.walkImport.read': '读取链接',
'tours.walkImport.back': '换一个链接',
'tours.walkImport.load': '作为漫步载入',
'tours.walkImport.stops': '链接中的站点',
'tours.walkImport.source': '来自 Google Maps',
'tours.walkImport.openSource': '在 Google Maps 中打开',
'tours.walkImport.recalculated': '站点之间的道路由 TREK 重新规划;Google Maps 中画出的线不会被沿用。',
'tours.walkImport.noPosition': '链接中没有位置',
'tours.walkImport.unresolved': '有 {count} 个站点在链接中没有位置,将被略过。',
'tours.walkImport.tooFewPositions': '一次漫步至少需要两个有位置的站点。',
'tours.walkImport.replacesDraft': '载入漫步会替换规划器中尚未保存的更改。',
'tours.walkImport.defaultName': '来自 Google Maps 的漫步',
'tours.walkImport.draftNotice': '来自 Google Maps 的步行路线。站点之间的道路由 TREK 自行规划。',
'tours.walkImport.offline': '读取链接需要网络连接。',
'tours.walkImport.failed': '暂时无法读取该链接。请稍后再试。',
'tours.walkImport.refusal.not_google_maps':
'请使用 Google Maps 路线链接:maps.app.goo.gl 短链接或 google.com/maps/dir 链接。',
'tours.walkImport.refusal.not_a_route': '这个 Google Maps 链接不是路线。请在 Google Maps 中规划漫步并分享路线。',
'tours.walkImport.refusal.not_walking': '这条路线不是按步行规划的。请把 Google Maps 切换为步行,再分享一次路线。',
'tours.walkImport.refusal.mode_unknown': '链接没有明确表明这是步行路线。请在 Google Maps 中选择步行,再分享一次。',
'tours.walkImport.refusal.short_link_refused': '该短链接指向 Google Maps 以外的地方,因此没有跟随。',
'tours.walkImport.refusal.short_link_failed': '暂时无法跟随该短链接。请再试一次,或粘贴完整的长链接。',
'tours.walkImport.refusal.too_few_stops': '从该链接只读取到不足两个站点。',
'tours.walkImport.refusal.too_many_stops': '这条路线的站点比一次漫步能容纳的更多。',
'tours.provenance.takenOverFrom': '引入自',
'tours.poi.title': '沿途',
'tours.poi.intro': '靠近路线的停留地点。在你添加之前,不会有任何改动。',
+47
View File
@@ -3,10 +3,16 @@ import {
tourVisitListResponseSchema,
tourVisitSchema,
tourVisitUpdateRequestSchema,
WALK_IMPORT_REFUSALS,
WALK_IMPORT_STATIONS_MAX,
WALK_IMPORT_URL_MAX,
walkImportPreviewRequestSchema,
walkImportPreviewResponseSchema,
walkImportRefusalResponseSchema,
walkImportRefusalSchema,
walkImportStationSchema,
} from './tour-walk.schema';
import { TOUR_STATION_NAME_MAX } from './tours.schema';
import { describe, expect, it } from 'vitest';
@@ -64,4 +70,45 @@ describe('city walk import preview contract (CW-06, CW-07)', () => {
.success,
).toBe(false);
});
it('holds a stop name to what a station takes, and its position to the globe', () => {
expect(walkImportStationSchema.safeParse({ name: 'x'.repeat(TOUR_STATION_NAME_MAX), lat: 1, lng: 2 }).success).toBe(
true,
);
expect(
walkImportStationSchema.safeParse({ name: 'x'.repeat(TOUR_STATION_NAME_MAX + 1), lat: 1, lng: 2 }).success,
).toBe(false);
expect(walkImportStationSchema.safeParse({ name: 'X', lat: 0, lng: 181 }).success).toBe(false);
expect(walkImportStationSchema.safeParse({ name: 'X', lat: -91, lng: 0 }).success).toBe(false);
});
it('answers two stops at least, the most a link may bring at most, and the link it read', () => {
const stop = { name: 'Stop', lat: 41.14, lng: -8.61 };
const answer = (count: number, resolved_url = 'https://www.google.com/maps/dir/A/B') =>
walkImportPreviewResponseSchema.safeParse({ stations: Array.from({ length: count }, () => stop), resolved_url });
expect(answer(2).success).toBe(true);
expect(answer(WALK_IMPORT_STATIONS_MAX).success).toBe(true);
expect(answer(1).success).toBe(false);
expect(answer(WALK_IMPORT_STATIONS_MAX + 1).success).toBe(false);
expect(answer(2, 'not a link').success).toBe(false);
});
it('names every reason a link is refused for, and a refusal carries its text and its reason', () => {
expect(WALK_IMPORT_REFUSALS).toEqual([
'not_google_maps',
'not_a_route',
'not_walking',
'mode_unknown',
'short_link_refused',
'short_link_failed',
'too_few_stops',
'too_many_stops',
]);
expect(walkImportRefusalSchema.safeParse('driving').success).toBe(false);
expect(walkImportRefusalResponseSchema.parse({ error: 'Not on foot.', reason: 'not_walking' })).toEqual({
error: 'Not on foot.',
reason: 'not_walking',
});
expect(walkImportRefusalResponseSchema.safeParse({ error: 'Not on foot.' }).success).toBe(false);
});
});
+27 -5
View File
@@ -1,4 +1,4 @@
import { stationKeySchema } from './tours.schema';
import { stationKeySchema, TOUR_STATION_NAME_MAX } from './tours.schema';
import { z } from 'zod';
@@ -30,8 +30,13 @@ export type TourVisitUpdateRequest = z.infer<typeof tourVisitUpdateRequestSchema
* CW-06, CW-07: a Google Maps walking route shared as a link, read into the
* stations of a city walk. Only links Google marks as on foot are taken; the
* way between the stations is TREK's own, planned afresh.
*
* The link is long on purpose: a route of ten stops with their names and the
* data Google adds runs past two thousand characters.
*/
export const WALK_IMPORT_URL_MAX = 2048;
export const WALK_IMPORT_URL_MAX = 8192;
/** The most stops one link may bring; Google Maps itself takes ten. */
export const WALK_IMPORT_STATIONS_MAX = 30;
export const walkImportPreviewRequestSchema = z
.object({ url: z.string().trim().min(1).max(WALK_IMPORT_URL_MAX) })
.strict();
@@ -39,15 +44,32 @@ export type WalkImportPreviewRequest = z.infer<typeof walkImportPreviewRequestSc
/** A stop as the link names it; a stop without coordinates in the link is not guessed at. */
export const walkImportStationSchema = z.object({
name: z.string().nullable(),
name: z.string().max(TOUR_STATION_NAME_MAX).nullable(),
lat: z.number().min(-90).max(90).nullable(),
lng: z.number().min(-180).max(180).nullable(),
});
export type WalkImportStation = z.infer<typeof walkImportStationSchema>;
export const walkImportPreviewResponseSchema = z.object({
stations: z.array(walkImportStationSchema),
stations: z.array(walkImportStationSchema).min(2).max(WALK_IMPORT_STATIONS_MAX),
/** The link as it was read, after its short form was followed. */
resolved_url: z.string(),
resolved_url: z.string().url(),
});
export type WalkImportPreviewResponse = z.infer<typeof walkImportPreviewResponseSchema>;
/** Why a link was not read, for the dialog to say in the reader's language. */
export const WALK_IMPORT_REFUSALS = [
'not_google_maps',
'not_a_route',
'not_walking',
'mode_unknown',
'short_link_refused',
'short_link_failed',
'too_few_stops',
'too_many_stops',
] as const;
export const walkImportRefusalSchema = z.enum(WALK_IMPORT_REFUSALS);
export type WalkImportRefusal = z.infer<typeof walkImportRefusalSchema>;
/** The body of a refusal: the English text for API and MCP clients, and its reason. */
export const walkImportRefusalResponseSchema = z.object({ error: z.string(), reason: walkImportRefusalSchema });