Tours: provenance contract, source check, one assignment path and the map overview

- P2C-02: tours record their origin (planned, GPX with file name, wanderer)
  instead of reading it off their shape; the detail answers a provenance
  contract and a trip copy keeps a tour's import record
- MF-03: a wanderer snapshot's source can be checked on purpose, read only,
  with a confirmed reimport as a new snapshot
- PR1-18: every way of putting a tour on a day shares one set of rules
- PR1-07/08: each person can hide tours from the trip map; the list shows
  each tour's line colour and the picked tour stands out on both maps
This commit is contained in:
Maurice
2026-10-15 21:51:22 +02:00
parent 018d2d1425
commit 3d9095ccde
77 changed files with 2845 additions and 118 deletions
+37
View File
@@ -232,5 +232,42 @@ const tours: TranslationStrings = {
'tours.ferrata.crossingInfo': 'يمر المسار {length} عبر «{name}». يتطلب ذلك معدات الطريق الحديدي وخبرة.',
'tours.ferrata.crossingShort': 'يمر المسار عبر طريق حديدي',
'tours.ferrata.waypointAtEnd': 'بداية أو نهاية «{name}»',
'tours.provenance.label': 'المصدر الأصلي',
'tours.provenance.source': 'المصدر',
'tours.provenance.importedAt': 'تم الاستيراد',
'tours.provenance.createdAt': 'تم الإنشاء',
'tours.provenance.externalUpdated': 'تغيّر في wanderer',
'tours.provenance.externalUpdatedHint':
'تاريخ التغيير الذي ذكره wanderer عند الاستيراد. مجرد إشارة وليس دليلًا على نسخة.',
'tours.provenance.localState': 'هنا',
'tours.provenance.plannedOver': 'أعيد تخطيطه مع الاحتفاظ بالمسار المسجّل',
'tours.provenance.editedLocally': 'عُدّل في TREK',
'tours.provenance.asImported': 'كما تم استيراده',
'tours.provenance.openSource': 'فتح في wanderer',
'tours.provenance.check': 'تحقّق من المصدر',
'tours.provenance.checkHint': 'يسأل wanderer هل تغيّر هذا المسار منذ الاستيراد. لا يتغيّر شيء في الرحلة.',
'tours.provenance.state.unchanged': 'لم يتغيّر منذ الاستيراد',
'tours.provenance.state.changed': 'تغيّر في wanderer',
'tours.provenance.state.unavailable': 'لم يعد متاحًا',
'tours.provenance.state.not_connected': 'لا يوجد اتصال بـ wanderer',
'tours.provenance.state.other_instance': 'هناك wanderer آخر متصل',
'tours.provenance.state.unknown': 'تتعذّر المقارنة',
'tours.provenance.body.unavailable': 'المسار حُذف أو لم يعد اتصالك يستطيع قراءته. تبقى هذه الجولة كما استُوردت.',
'tours.provenance.body.not_connected': 'اربط wanderer الخاص بك من الإعدادات، التكاملات للتحقق من المصدر.',
'tours.provenance.body.other_instance': 'اتصالك يشير إلى نسخة غير التي جاءت منها هذه الجولة.',
'tours.provenance.body.unknown':
'لا يحتوي هذا الاستيراد على ما يمكن المقارنة به. ومع ذلك يمكنك جلب المسار الحالي كلقطة جديدة.',
'tours.provenance.change.name': 'الاسم',
'tours.provenance.change.description': 'الوصف',
'tours.provenance.change.route': 'خط السير',
'tours.provenance.nowUpdated': 'يذكر wanderer أن آخر تغيير كان في {date}',
'tours.provenance.reimport': 'استيراد كلقطة جديدة',
'tours.provenance.reimportTitle': 'استيراد المسار المعدّل؟',
'tours.provenance.reimportBody': 'يأتي كجولة جديدة بجانب هذه الجولة. تبقى هذه الجولة وأيامها وملاحظاتها كما هي.',
'tours.provenance.reimported': 'تم استيراد لقطة جديدة',
'tours.visibility.hidden': 'مخفية على الخريطة',
'tours.visibility.showAll': 'إظهار الكل',
'tours.visibility.show': 'إظهار على الخريطة',
'tours.visibility.hide': 'إخفاء على الخريطة',
};
export default tours;
+40
View File
@@ -218,5 +218,45 @@ const tours: TranslationStrings = {
'Marşrut {length} boyunca “{name}” üzərindən keçir. Bunun üçün via ferrata ləvazimatı və təcrübə lazımdır.',
'tours.ferrata.crossingShort': 'Marşrut via ferrata üzərindən keçir',
'tours.ferrata.waypointAtEnd': '“{name}” başlanğıcı və ya sonu',
'tours.provenance.label': 'Mənşə',
'tours.provenance.source': 'Mənbə',
'tours.provenance.importedAt': 'İdxal edilib',
'tours.provenance.createdAt': 'Yaradılıb',
'tours.provenance.externalUpdated': 'wanderer-də dəyişib',
'tours.provenance.externalUpdatedHint':
'wanderer-in idxal zamanı verdiyi dəyişiklik tarixi. İpucudur, versiya sübutu deyil.',
'tours.provenance.localState': 'Burada',
'tours.provenance.plannedOver': 'Yenidən planlaşdırılıb, yazılmış iz saxlanılıb',
'tours.provenance.editedLocally': 'TREK-də redaktə edilib',
'tours.provenance.asImported': 'İdxal edildiyi kimi',
'tours.provenance.openSource': 'wanderer-də aç',
'tours.provenance.check': 'Mənbəni yoxla',
'tours.provenance.checkHint':
'wanderer-dən bu marşrutun idxaldan sonra dəyişib-dəyişmədiyini soruşur. Səyahətdə heç nə dəyişmir.',
'tours.provenance.state.unchanged': 'İdxaldan sonra dəyişməyib',
'tours.provenance.state.changed': 'wanderer-də dəyişib',
'tours.provenance.state.unavailable': 'Artıq mövcud deyil',
'tours.provenance.state.not_connected': 'wanderer bağlantısı yoxdur',
'tours.provenance.state.other_instance': 'Başqa wanderer qoşulub',
'tours.provenance.state.unknown': 'Müqayisə etmək olmur',
'tours.provenance.body.unavailable':
'Marşrut silinib və ya bağlantınla artıq oxunmur. Bu tur idxal edildiyi kimi qalır.',
'tours.provenance.body.not_connected': 'Mənbəni yoxlamaq üçün wanderer-ini Ayarlar, İnteqrasiyalar bölməsində qoş.',
'tours.provenance.body.other_instance': 'Bağlantın bu turun gəldiyi nüsxədən fərqli bir nüsxəyə yönəlib.',
'tours.provenance.body.unknown':
'Bu idxalda müqayisə üçün heç nə yoxdur. Cari marşrutu yenə də yeni bir snapşot kimi gətirə bilərsən.',
'tours.provenance.change.name': 'Ad',
'tours.provenance.change.description': 'Təsvir',
'tours.provenance.change.route': 'Marşrut',
'tours.provenance.nowUpdated': 'wanderer son dəyişiklik kimi {date} tarixini göstərir',
'tours.provenance.reimport': 'Yeni snapşot kimi idxal et',
'tours.provenance.reimportTitle': 'Dəyişmiş marşrut idxal edilsin?',
'tours.provenance.reimportBody':
'O, bu turun yanında yeni tur kimi gəlir. Bu tur, onun günləri və qeydləri olduğu kimi qalır.',
'tours.provenance.reimported': 'Yeni snapşot idxal edildi',
'tours.visibility.hidden': 'Xəritədə gizlidir',
'tours.visibility.showAll': 'Hamısını göstər',
'tours.visibility.show': 'Xəritədə göstər',
'tours.visibility.hide': 'Xəritədə gizlət',
};
export default tours;
+40
View File
@@ -223,5 +223,45 @@ const tours: TranslationStrings = {
'A rota passa {length} pela “{name}”. Isso exige equipamento de via ferrata e experiência.',
'tours.ferrata.crossingShort': 'A rota passa por uma via ferrata',
'tours.ferrata.waypointAtEnd': 'Início ou fim de “{name}”',
'tours.provenance.label': 'Origem',
'tours.provenance.source': 'Fonte',
'tours.provenance.importedAt': 'Importado',
'tours.provenance.createdAt': 'Criado',
'tours.provenance.externalUpdated': 'Alterado no wanderer',
'tours.provenance.externalUpdatedHint':
'A data de alteração que o wanderer informou na importação. Uma pista, não prova de versão.',
'tours.provenance.localState': 'Aqui',
'tours.provenance.plannedOver': 'Replanejado, trilha gravada mantida',
'tours.provenance.editedLocally': 'Editado no TREK',
'tours.provenance.asImported': 'Como importado',
'tours.provenance.openSource': 'Abrir no wanderer',
'tours.provenance.check': 'Verificar fonte',
'tours.provenance.checkHint': 'Pergunta ao wanderer se esta trilha mudou desde a importação. Nada muda na viagem.',
'tours.provenance.state.unchanged': 'Sem alterações desde a importação',
'tours.provenance.state.changed': 'Alterado no wanderer',
'tours.provenance.state.unavailable': 'Não está mais disponível',
'tours.provenance.state.not_connected': 'Sem conexão com o wanderer',
'tours.provenance.state.other_instance': 'Outro wanderer está conectado',
'tours.provenance.state.unknown': 'Não é possível comparar',
'tours.provenance.body.unavailable':
'A trilha sumiu ou não pode mais ser lida com a sua conexão. Este passeio fica como foi importado.',
'tours.provenance.body.not_connected': 'Conecte seu wanderer em Configurações, Integrações para verificar a fonte.',
'tours.provenance.body.other_instance':
'Sua conexão aponta para uma instância diferente daquela de onde veio este passeio.',
'tours.provenance.body.unknown':
'Esta importação não tem nada para comparar. Mesmo assim você pode trazer a trilha atual como um novo instantâneo.',
'tours.provenance.change.name': 'Nome',
'tours.provenance.change.description': 'Descrição',
'tours.provenance.change.route': 'Percurso',
'tours.provenance.nowUpdated': 'o wanderer informa {date} como última alteração',
'tours.provenance.reimport': 'Importar como novo instantâneo',
'tours.provenance.reimportTitle': 'Importar a trilha alterada?',
'tours.provenance.reimportBody':
'Ela entra como um novo passeio ao lado deste. Este passeio, seus dias e notas ficam como estão.',
'tours.provenance.reimported': 'Novo instantâneo importado',
'tours.visibility.hidden': 'Oculto no mapa',
'tours.visibility.showAll': 'Mostrar todos',
'tours.visibility.show': 'Mostrar no mapa',
'tours.visibility.hide': 'Ocultar no mapa',
};
export default tours;
+41
View File
@@ -223,5 +223,46 @@ const tours: TranslationStrings = {
'tours.ferrata.crossingInfo': 'La ruta fa {length} per «{name}». Cal material de via ferrada i experiència.',
'tours.ferrata.crossingShort': 'La ruta passa per una via ferrada',
'tours.ferrata.waypointAtEnd': 'Inici o final de «{name}»',
'tours.provenance.label': 'Origen',
'tours.provenance.source': 'Font',
'tours.provenance.importedAt': 'Importat',
'tours.provenance.createdAt': 'Creat',
'tours.provenance.externalUpdated': 'Modificat a wanderer',
'tours.provenance.externalUpdatedHint':
'La data de canvi que wanderer va indicar en importar. Una pista, no una prova de versió.',
'tours.provenance.localState': 'Aquí',
'tours.provenance.plannedOver': 'Replanificat, traça enregistrada conservada',
'tours.provenance.editedLocally': 'Editat a TREK',
'tours.provenance.asImported': 'Tal com es va importar',
'tours.provenance.openSource': 'Obre a wanderer',
'tours.provenance.check': 'Comprova la font',
'tours.provenance.checkHint':
'Pregunta a wanderer si aquesta ruta ha canviat des de la importació. No canvia res al viatge.',
'tours.provenance.state.unchanged': 'Sense canvis des de la importació',
'tours.provenance.state.changed': 'Modificat a wanderer',
'tours.provenance.state.unavailable': 'Ja no està disponible',
'tours.provenance.state.not_connected': 'Sense connexió amb wanderer',
'tours.provenance.state.other_instance': 'Hi ha un altre wanderer connectat',
'tours.provenance.state.unknown': 'No es pot comparar',
'tours.provenance.body.unavailable':
'La ruta ja no existeix o no es pot llegir amb la teva connexió. Aquesta excursió es queda tal com es va importar.',
'tours.provenance.body.not_connected': 'Connecta el teu wanderer a Configuració, Integracions per comprovar la font.',
'tours.provenance.body.other_instance':
'La teva connexió apunta a una instància diferent de la que va venir aquesta excursió.',
'tours.provenance.body.unknown':
'Aquesta importació no té res per comparar. Igualment pots portar la ruta actual com a nova instantània.',
'tours.provenance.change.name': 'Nom',
'tours.provenance.change.description': 'Descripció',
'tours.provenance.change.route': 'Recorregut',
'tours.provenance.nowUpdated': 'wanderer indica {date} com a darrer canvi',
'tours.provenance.reimport': 'Importa com a nova instantània',
'tours.provenance.reimportTitle': 'Vols importar la ruta modificada?',
'tours.provenance.reimportBody':
'Arriba com una excursió nova al costat d’aquesta. Aquesta excursió, els seus dies i notes es queden com estan.',
'tours.provenance.reimported': 'Nova instantània importada',
'tours.visibility.hidden': 'Amagada al mapa',
'tours.visibility.showAll': 'Mostra-les totes',
'tours.visibility.show': 'Mostra al mapa',
'tours.visibility.hide': 'Amaga al mapa',
};
export default tours;
+38
View File
@@ -220,5 +220,43 @@ const tours: TranslationStrings = {
'tours.ferrata.crossingInfo': 'Trasa vede {length} po „{name}“. Potřebujete feratové vybavení a zkušenosti.',
'tours.ferrata.crossingShort': 'Trasa vede po feratě',
'tours.ferrata.waypointAtEnd': 'Začátek nebo konec „{name}“',
'tours.provenance.label': 'Původ',
'tours.provenance.source': 'Zdroj',
'tours.provenance.importedAt': 'Importováno',
'tours.provenance.createdAt': 'Vytvořeno',
'tours.provenance.externalUpdated': 'Změněno ve wanderer',
'tours.provenance.externalUpdatedHint': 'Datum změny, které wanderer uvedl při importu. Vodítko, ne důkaz verze.',
'tours.provenance.localState': 'Zde',
'tours.provenance.plannedOver': 'Přeplánováno, zaznamenaná stopa zachována',
'tours.provenance.editedLocally': 'Upraveno v TREK',
'tours.provenance.asImported': 'Jak bylo importováno',
'tours.provenance.openSource': 'Otevřít ve wanderer',
'tours.provenance.check': 'Zkontrolovat zdroj',
'tours.provenance.checkHint': 'Zeptá se wanderer, zda se tato trasa od importu změnila. V cestě se nic nezmění.',
'tours.provenance.state.unchanged': 'Beze změny od importu',
'tours.provenance.state.changed': 'Změněno ve wanderer',
'tours.provenance.state.unavailable': 'Už není k dispozici',
'tours.provenance.state.not_connected': 'Žádné připojení k wanderer',
'tours.provenance.state.other_instance': 'Je připojen jiný wanderer',
'tours.provenance.state.unknown': 'Nelze porovnat',
'tours.provenance.body.unavailable':
'Trasa zmizela nebo ji vaše připojení už nepřečte. Tato túra zůstane tak, jak byla importována.',
'tours.provenance.body.not_connected': 'Připojte svůj wanderer v Nastavení, Integrace a zkontrolujte zdroj.',
'tours.provenance.body.other_instance': 'Vaše připojení míří na jinou instanci než tu, ze které tato túra pochází.',
'tours.provenance.body.unknown':
'Tento import nemá s čím porovnat. Aktuální trasu přesto můžete převzít jako nový snímek.',
'tours.provenance.change.name': 'Název',
'tours.provenance.change.description': 'Popis',
'tours.provenance.change.route': 'Průběh trasy',
'tours.provenance.nowUpdated': 'wanderer uvádí {date} jako poslední změnu',
'tours.provenance.reimport': 'Importovat jako nový snímek',
'tours.provenance.reimportTitle': 'Importovat změněnou trasu?',
'tours.provenance.reimportBody':
'Přibude jako nová túra vedle této. Tato túra, její dny a poznámky zůstanou, jak jsou.',
'tours.provenance.reimported': 'Nový snímek importován',
'tours.visibility.hidden': 'Skryto na mapě',
'tours.visibility.showAll': 'Zobrazit vše',
'tours.visibility.show': 'Zobrazit na mapě',
'tours.visibility.hide': 'Skrýt na mapě',
};
export default tours;
+42
View File
@@ -223,6 +223,48 @@ const tours: TranslationStrings = {
'Die Route führt {length} über „{name}“. Dafür brauchst du Klettersteigausrüstung und Erfahrung.',
'tours.ferrata.crossingShort': 'Die Route führt über einen Klettersteig',
'tours.ferrata.waypointAtEnd': 'Anfang oder Ende von „{name}“',
'tours.provenance.label': 'Herkunft',
'tours.provenance.source': 'Quelle',
'tours.provenance.importedAt': 'Importiert',
'tours.provenance.createdAt': 'Angelegt',
'tours.provenance.externalUpdated': 'Geändert bei wanderer',
'tours.provenance.externalUpdatedHint':
'Das Änderungsdatum, das wanderer beim Import genannt hat. Ein Hinweis, kein Versionsnachweis.',
'tours.provenance.localState': 'Hier',
'tours.provenance.plannedOver': 'Überplant, Originalspur gesichert',
'tours.provenance.editedLocally': 'In TREK bearbeitet',
'tours.provenance.asImported': 'Wie importiert',
'tours.provenance.openSource': 'In wanderer öffnen',
'tours.provenance.check': 'Quelle prüfen',
'tours.provenance.checkHint':
'Fragt wanderer, ob sich dieser Trail seit dem Import geändert hat. Im Trip ändert sich dabei nichts.',
'tours.provenance.state.unchanged': 'Unverändert seit dem Import',
'tours.provenance.state.changed': 'Bei wanderer geändert',
'tours.provenance.state.unavailable': 'Nicht mehr verfügbar',
'tours.provenance.state.not_connected': 'Keine wanderer-Verbindung',
'tours.provenance.state.other_instance': 'Anderes wanderer verbunden',
'tours.provenance.state.unknown': 'Kein Vergleich möglich',
'tours.provenance.body.unavailable':
'Der Trail ist weg oder mit deiner Verbindung nicht mehr lesbar. Diese Tour bleibt so, wie sie importiert wurde.',
'tours.provenance.body.not_connected':
'Verbinde dein wanderer unter Einstellungen, Integrationen, um die Quelle zu prüfen.',
'tours.provenance.body.other_instance':
'Deine Verbindung zeigt auf eine andere Instanz als die, aus der diese Tour stammt.',
'tours.provenance.body.unknown':
'Dieser Import enthält nichts zum Vergleichen. Den aktuellen Trail kannst du trotzdem als neuen Snapshot übernehmen.',
'tours.provenance.change.name': 'Name', // same-as-en
'tours.provenance.change.description': 'Beschreibung',
'tours.provenance.change.route': 'Strecke',
'tours.provenance.nowUpdated': 'wanderer nennt {date} als letzte Änderung',
'tours.provenance.reimport': 'Als neuen Snapshot importieren',
'tours.provenance.reimportTitle': 'Geänderten Trail importieren?',
'tours.provenance.reimportBody':
'Er kommt als neue Tour neben diese. Diese Tour, ihre Tage und Notizen bleiben, wie sie sind.',
'tours.provenance.reimported': 'Neuer Snapshot importiert',
'tours.visibility.hidden': 'Auf der Karte ausgeblendet',
'tours.visibility.showAll': 'Alle einblenden',
'tours.visibility.show': 'Auf der Karte einblenden',
'tours.visibility.hide': 'Auf der Karte ausblenden',
};
export default tours;
+41
View File
@@ -216,5 +216,46 @@ const tours: TranslationStrings = {
'tours.ferrata.crossingInfo': 'The route climbs {length} of “{name}”. That takes via ferrata gear and experience.',
'tours.ferrata.crossingShort': 'The route climbs a via ferrata',
'tours.ferrata.waypointAtEnd': 'Start or end of “{name}”',
'tours.provenance.label': 'Origin',
'tours.provenance.source': 'Source',
'tours.provenance.importedAt': 'Imported',
'tours.provenance.createdAt': 'Created',
'tours.provenance.externalUpdated': 'Changed on wanderer',
'tours.provenance.externalUpdatedHint':
'The change date wanderer gave at the import. A hint, not proof of a version.',
'tours.provenance.localState': 'Here',
'tours.provenance.plannedOver': 'Planned over, recorded track kept',
'tours.provenance.editedLocally': 'Edited in TREK',
'tours.provenance.asImported': 'As imported',
'tours.provenance.openSource': 'Open in wanderer',
'tours.provenance.check': 'Check source',
'tours.provenance.checkHint':
'Asks wanderer whether this trail changed since the import. Nothing in the trip changes.',
'tours.provenance.state.unchanged': 'Unchanged since the import',
'tours.provenance.state.changed': 'Changed on wanderer',
'tours.provenance.state.unavailable': 'No longer available',
'tours.provenance.state.not_connected': 'No wanderer connection',
'tours.provenance.state.other_instance': 'Another wanderer is connected',
'tours.provenance.state.unknown': 'Cannot compare',
'tours.provenance.body.unavailable':
'The trail is gone or can no longer be read with your connection. This tour stays as it was imported.',
'tours.provenance.body.not_connected': 'Connect your wanderer under Settings, Integrations to check the source.',
'tours.provenance.body.other_instance':
'Your connection points to a different instance than the one this tour came from.',
'tours.provenance.body.unknown':
'This import carries nothing to compare against. You can still bring in the current trail as a new snapshot.',
'tours.provenance.change.name': 'Name',
'tours.provenance.change.description': 'Description',
'tours.provenance.change.route': 'Route',
'tours.provenance.nowUpdated': 'wanderer gives {date} as the last change',
'tours.provenance.reimport': 'Import as new snapshot',
'tours.provenance.reimportTitle': 'Import the changed trail?',
'tours.provenance.reimportBody':
'It comes in as a new tour beside this one. This tour, its days and notes stay as they are.',
'tours.provenance.reimported': 'New snapshot imported',
'tours.visibility.hidden': 'Hidden on the map',
'tours.visibility.showAll': 'Show all',
'tours.visibility.show': 'Show on the map',
'tours.visibility.hide': 'Hide on the map',
};
export default tours;
+40
View File
@@ -222,5 +222,45 @@ const tours: TranslationStrings = {
'tours.ferrata.crossingInfo': 'La ruta recorre {length} de «{name}». Necesitas equipo de vía ferrata y experiencia.',
'tours.ferrata.crossingShort': 'La ruta pasa por una vía ferrata',
'tours.ferrata.waypointAtEnd': 'Inicio o final de «{name}»',
'tours.provenance.label': 'Origen',
'tours.provenance.source': 'Fuente',
'tours.provenance.importedAt': 'Importado',
'tours.provenance.createdAt': 'Creado',
'tours.provenance.externalUpdated': 'Modificado en wanderer',
'tours.provenance.externalUpdatedHint':
'La fecha de cambio que wanderer indicó al importar. Una pista, no una prueba de versión.',
'tours.provenance.localState': 'Aquí',
'tours.provenance.plannedOver': 'Replanificado, traza grabada conservada',
'tours.provenance.editedLocally': 'Editado en TREK',
'tours.provenance.asImported': 'Tal como se importó',
'tours.provenance.openSource': 'Abrir en wanderer',
'tours.provenance.check': 'Comprobar fuente',
'tours.provenance.checkHint':
'Pregunta a wanderer si esta ruta cambió desde la importación. No cambia nada en el viaje.',
'tours.provenance.state.unchanged': 'Sin cambios desde la importación',
'tours.provenance.state.changed': 'Modificado en wanderer',
'tours.provenance.state.unavailable': 'Ya no disponible',
'tours.provenance.state.not_connected': 'Sin conexión con wanderer',
'tours.provenance.state.other_instance': 'Hay otro wanderer conectado',
'tours.provenance.state.unknown': 'No se puede comparar',
'tours.provenance.body.unavailable':
'La ruta ya no existe o no se puede leer con tu conexión. Esta excursión queda tal como se importó.',
'tours.provenance.body.not_connected': 'Conecta tu wanderer en Ajustes, Integraciones para comprobar la fuente.',
'tours.provenance.body.other_instance': 'Tu conexión apunta a otra instancia distinta de la que vino esta excursión.',
'tours.provenance.body.unknown':
'Esta importación no tiene nada con qué comparar. Aun así puedes traer la ruta actual como nueva instantánea.',
'tours.provenance.change.name': 'Nombre',
'tours.provenance.change.description': 'Descripción',
'tours.provenance.change.route': 'Recorrido',
'tours.provenance.nowUpdated': 'wanderer indica {date} como último cambio',
'tours.provenance.reimport': 'Importar como nueva instantánea',
'tours.provenance.reimportTitle': '¿Importar la ruta modificada?',
'tours.provenance.reimportBody':
'Llega como una excursión nueva junto a esta. Esta excursión, sus días y notas quedan como están.',
'tours.provenance.reimported': 'Nueva instantánea importada',
'tours.visibility.hidden': 'Oculta en el mapa',
'tours.visibility.showAll': 'Mostrar todas',
'tours.visibility.show': 'Mostrar en el mapa',
'tours.visibility.hide': 'Ocultar en el mapa',
};
export default tours;
+40
View File
@@ -220,5 +220,45 @@ const tours: TranslationStrings = {
'Marsruut läbib {length} rajal „{name}“. Selleks on vaja via ferrata varustust ja kogemust.',
'tours.ferrata.crossingShort': 'Marsruut läbib via ferrata raja',
'tours.ferrata.waypointAtEnd': '„{name}“ algus või lõpp',
'tours.provenance.label': 'Päritolu',
'tours.provenance.source': 'Allikas',
'tours.provenance.importedAt': 'Imporditud',
'tours.provenance.createdAt': 'Loodud',
'tours.provenance.externalUpdated': 'Muudetud wandereris',
'tours.provenance.externalUpdatedHint':
'Muutmise kuupäev, mille wanderer impordil andis. Vihje, mitte versiooni tõend.',
'tours.provenance.localState': 'Siin',
'tours.provenance.plannedOver': 'Ümber planeeritud, salvestatud rada alles',
'tours.provenance.editedLocally': 'Muudetud TREKis',
'tours.provenance.asImported': 'Nagu imporditud',
'tours.provenance.openSource': 'Ava wandereris',
'tours.provenance.check': 'Kontrolli allikat',
'tours.provenance.checkHint': 'Küsib wandererilt, kas see rada on pärast importi muutunud. Reisis ei muutu midagi.',
'tours.provenance.state.unchanged': 'Pärast importi muutmata',
'tours.provenance.state.changed': 'Muudetud wandereris',
'tours.provenance.state.unavailable': 'Pole enam saadaval',
'tours.provenance.state.not_connected': 'wandereri ühendus puudub',
'tours.provenance.state.other_instance': 'Ühendatud on teine wanderer',
'tours.provenance.state.unknown': 'Võrrelda ei saa',
'tours.provenance.body.unavailable':
'Rada on kadunud või sinu ühendusega enam loetamatu. See matk jääb selliseks, nagu see imporditi.',
'tours.provenance.body.not_connected':
'Ühenda oma wanderer jaotises Seaded, Integratsioonid, et allikat kontrollida.',
'tours.provenance.body.other_instance': 'Sinu ühendus osutab teisele eksemplarile kui see, kust see matk pärit on.',
'tours.provenance.body.unknown':
'Selles impordis pole millegagi võrrelda. Praeguse raja saad siiski tuua uue hetktõmmisena.',
'tours.provenance.change.name': 'Nimi',
'tours.provenance.change.description': 'Kirjeldus',
'tours.provenance.change.route': 'Marsruut',
'tours.provenance.nowUpdated': 'wanderer nimetab viimaseks muudatuseks {date}',
'tours.provenance.reimport': 'Impordi uue hetktõmmisena',
'tours.provenance.reimportTitle': 'Kas importida muudetud rada?',
'tours.provenance.reimportBody':
'See lisandub uue matkana selle kõrvale. See matk, selle päevad ja märkmed jäävad samaks.',
'tours.provenance.reimported': 'Uus hetktõmmis imporditud',
'tours.visibility.hidden': 'Kaardil peidetud',
'tours.visibility.showAll': 'Näita kõiki',
'tours.visibility.show': 'Näita kaardil',
'tours.visibility.hide': 'Peida kaardil',
};
export default tours;
+42
View File
@@ -225,5 +225,47 @@ const tours: TranslationStrings = {
'L’itinéraire passe {length} sur « {name} ». Il faut l’équipement de via ferrata et de l’expérience.',
'tours.ferrata.crossingShort': 'L’itinéraire passe par une via ferrata',
'tours.ferrata.waypointAtEnd': 'Début ou fin de « {name} »',
'tours.provenance.label': 'Origine',
'tours.provenance.source': 'Source', // same-as-en
'tours.provenance.importedAt': 'Importé',
'tours.provenance.createdAt': 'Créé',
'tours.provenance.externalUpdated': 'Modifié sur wanderer',
'tours.provenance.externalUpdatedHint':
'La date de modification indiquée par wanderer lors de l’import. Un indice, pas la preuve d’une version.',
'tours.provenance.localState': 'Ici',
'tours.provenance.plannedOver': 'Replanifié, tracé enregistré conservé',
'tours.provenance.editedLocally': 'Modifié dans TREK',
'tours.provenance.asImported': 'Tel qu’importé',
'tours.provenance.openSource': 'Ouvrir dans wanderer',
'tours.provenance.check': 'Vérifier la source',
'tours.provenance.checkHint':
'Demande à wanderer si ce sentier a changé depuis l’import. Rien ne change dans le voyage.',
'tours.provenance.state.unchanged': 'Inchangé depuis l’import',
'tours.provenance.state.changed': 'Modifié sur wanderer',
'tours.provenance.state.unavailable': 'Plus disponible',
'tours.provenance.state.not_connected': 'Aucune connexion wanderer',
'tours.provenance.state.other_instance': 'Un autre wanderer est connecté',
'tours.provenance.state.unknown': 'Comparaison impossible',
'tours.provenance.body.unavailable':
'Le sentier a disparu ou n’est plus lisible avec votre connexion. Cette sortie reste telle qu’elle a été importée.',
'tours.provenance.body.not_connected':
'Connectez votre wanderer dans Paramètres, Intégrations pour vérifier la source.',
'tours.provenance.body.other_instance':
'Votre connexion pointe vers une autre instance que celle d’où vient cette sortie.',
'tours.provenance.body.unknown':
'Cet import ne contient rien à comparer. Vous pouvez quand même importer le sentier actuel comme nouvel instantané.',
'tours.provenance.change.name': 'Nom',
'tours.provenance.change.description': 'Description', // same-as-en
'tours.provenance.change.route': 'Itinéraire',
'tours.provenance.nowUpdated': 'wanderer indique {date} comme dernière modification',
'tours.provenance.reimport': 'Importer comme nouvel instantané',
'tours.provenance.reimportTitle': 'Importer le sentier modifié ?',
'tours.provenance.reimportBody':
'Il arrive comme nouvelle sortie à côté de celle-ci. Cette sortie, ses jours et ses notes restent inchangés.',
'tours.provenance.reimported': 'Nouvel instantané importé',
'tours.visibility.hidden': 'Masqué sur la carte',
'tours.visibility.showAll': 'Tout afficher',
'tours.visibility.show': 'Afficher sur la carte',
'tours.visibility.hide': 'Masquer sur la carte',
};
export default tours;
+42
View File
@@ -227,5 +227,47 @@ const tours: TranslationStrings = {
'Η διαδρομή περνά {length} από το «{name}». Χρειάζεσαι εξοπλισμό via ferrata και εμπειρία.',
'tours.ferrata.crossingShort': 'Η διαδρομή περνά από via ferrata',
'tours.ferrata.waypointAtEnd': 'Αρχή ή τέλος του «{name}»',
'tours.provenance.label': 'Προέλευση',
'tours.provenance.source': 'Πηγή',
'tours.provenance.importedAt': 'Εισήχθη',
'tours.provenance.createdAt': 'Δημιουργήθηκε',
'tours.provenance.externalUpdated': 'Άλλαξε στο wanderer',
'tours.provenance.externalUpdatedHint':
'Η ημερομηνία αλλαγής που έδωσε το wanderer κατά την εισαγωγή. Ένδειξη, όχι απόδειξη έκδοσης.',
'tours.provenance.localState': 'Εδώ',
'tours.provenance.plannedOver': 'Ξανασχεδιάστηκε, η καταγεγραμμένη διαδρομή κρατήθηκε',
'tours.provenance.editedLocally': 'Επεξεργάστηκε στο TREK',
'tours.provenance.asImported': 'Όπως εισήχθη',
'tours.provenance.openSource': 'Άνοιγμα στο wanderer',
'tours.provenance.check': 'Έλεγχος πηγής',
'tours.provenance.checkHint':
'Ρωτά το wanderer αν αυτό το μονοπάτι άλλαξε από την εισαγωγή. Τίποτα δεν αλλάζει στο ταξίδι.',
'tours.provenance.state.unchanged': 'Αμετάβλητο από την εισαγωγή',
'tours.provenance.state.changed': 'Άλλαξε στο wanderer',
'tours.provenance.state.unavailable': 'Δεν είναι πλέον διαθέσιμο',
'tours.provenance.state.not_connected': 'Χωρίς σύνδεση wanderer',
'tours.provenance.state.other_instance': 'Είναι συνδεδεμένο άλλο wanderer',
'tours.provenance.state.unknown': 'Δεν γίνεται σύγκριση',
'tours.provenance.body.unavailable':
'Το μονοπάτι χάθηκε ή δεν διαβάζεται πια με τη σύνδεσή σου. Αυτή η εκδρομή μένει όπως εισήχθη.',
'tours.provenance.body.not_connected':
'Σύνδεσε το wanderer σου στις Ρυθμίσεις, Ενσωματώσεις για να ελέγξεις την πηγή.',
'tours.provenance.body.other_instance':
'Η σύνδεσή σου δείχνει σε άλλη εγκατάσταση από αυτή από την οποία ήρθε η εκδρομή.',
'tours.provenance.body.unknown':
'Αυτή η εισαγωγή δεν έχει τίποτα για σύγκριση. Μπορείς όμως να φέρεις το τρέχον μονοπάτι ως νέο στιγμιότυπο.',
'tours.provenance.change.name': 'Όνομα',
'tours.provenance.change.description': 'Περιγραφή',
'tours.provenance.change.route': 'Διαδρομή',
'tours.provenance.nowUpdated': 'Το wanderer δίνει τελευταία αλλαγή στις {date}',
'tours.provenance.reimport': 'Εισαγωγή ως νέο στιγμιότυπο',
'tours.provenance.reimportTitle': 'Εισαγωγή του αλλαγμένου μονοπατιού;',
'tours.provenance.reimportBody':
'Έρχεται ως νέα εκδρομή δίπλα σε αυτήν. Αυτή η εκδρομή, οι μέρες και οι σημειώσεις της μένουν ως έχουν.',
'tours.provenance.reimported': 'Εισήχθη νέο στιγμιότυπο',
'tours.visibility.hidden': 'Κρυμμένο στον χάρτη',
'tours.visibility.showAll': 'Εμφάνιση όλων',
'tours.visibility.show': 'Εμφάνιση στον χάρτη',
'tours.visibility.hide': 'Απόκρυψη στον χάρτη',
};
export default tours;
+41
View File
@@ -223,5 +223,46 @@ const tours: TranslationStrings = {
'Az útvonal {length} hosszan a(z) „{name}” vasalt úton halad. Ehhez via ferrata felszerelés és gyakorlat kell.',
'tours.ferrata.crossingShort': 'Az útvonal vasalt úton halad',
'tours.ferrata.waypointAtEnd': '„{name}” eleje vagy vége',
'tours.provenance.label': 'Eredet',
'tours.provenance.source': 'Forrás',
'tours.provenance.importedAt': 'Importálva',
'tours.provenance.createdAt': 'Létrehozva',
'tours.provenance.externalUpdated': 'Módosítva a wandereren',
'tours.provenance.externalUpdatedHint':
'A wanderer által az importáláskor megadott módosítási dátum. Támpont, nem a verzió bizonyítéka.',
'tours.provenance.localState': 'Itt',
'tours.provenance.plannedOver': 'Újratervezve, a rögzített nyomvonal megőrizve',
'tours.provenance.editedLocally': 'Szerkesztve a TREK-ben',
'tours.provenance.asImported': 'Ahogy importálva',
'tours.provenance.openSource': 'Megnyitás a wandereren',
'tours.provenance.check': 'Forrás ellenőrzése',
'tours.provenance.checkHint':
'Megkérdezi a wanderert, változott-e ez az útvonal az importálás óta. Az utazásban semmi sem változik.',
'tours.provenance.state.unchanged': 'Változatlan az importálás óta',
'tours.provenance.state.changed': 'Módosítva a wandereren',
'tours.provenance.state.unavailable': 'Már nem érhető el',
'tours.provenance.state.not_connected': 'Nincs wanderer-kapcsolat',
'tours.provenance.state.other_instance': 'Másik wanderer van csatlakoztatva',
'tours.provenance.state.unknown': 'Nem összehasonlítható',
'tours.provenance.body.unavailable':
'Az útvonal megszűnt, vagy a kapcsolatoddal már nem olvasható. Ez a túra úgy marad, ahogy importálták.',
'tours.provenance.body.not_connected':
'Csatlakoztasd a wanderered a Beállítások, Integrációk alatt a forrás ellenőrzéséhez.',
'tours.provenance.body.other_instance': 'A kapcsolatod egy másik példányra mutat, mint ahonnan ez a túra származik.',
'tours.provenance.body.unknown':
'Ebben az importban nincs mihez hasonlítani. Az aktuális útvonalat így is behozhatod új pillanatképként.',
'tours.provenance.change.name': 'Név',
'tours.provenance.change.description': 'Leírás',
'tours.provenance.change.route': 'Nyomvonal',
'tours.provenance.nowUpdated': 'a wanderer szerint az utolsó módosítás: {date}',
'tours.provenance.reimport': 'Importálás új pillanatképként',
'tours.provenance.reimportTitle': 'Importálod a módosított útvonalat?',
'tours.provenance.reimportBody':
'Új túraként érkezik e mellé. Ez a túra, a napjai és jegyzetei változatlanok maradnak.',
'tours.provenance.reimported': 'Új pillanatkép importálva',
'tours.visibility.hidden': 'Elrejtve a térképen',
'tours.visibility.showAll': 'Összes megjelenítése',
'tours.visibility.show': 'Megjelenítés a térképen',
'tours.visibility.hide': 'Elrejtés a térképen',
};
export default tours;
+40
View File
@@ -217,5 +217,45 @@ const tours: TranslationStrings = {
'Rute melewati {length} di “{name}”. Ini butuh perlengkapan via ferrata dan pengalaman.',
'tours.ferrata.crossingShort': 'Rute melewati via ferrata',
'tours.ferrata.waypointAtEnd': 'Awal atau akhir “{name}”',
'tours.provenance.label': 'Asal',
'tours.provenance.source': 'Sumber',
'tours.provenance.importedAt': 'Diimpor',
'tours.provenance.createdAt': 'Dibuat',
'tours.provenance.externalUpdated': 'Diubah di wanderer',
'tours.provenance.externalUpdatedHint':
'Tanggal perubahan yang diberikan wanderer saat impor. Sebuah petunjuk, bukan bukti versi.',
'tours.provenance.localState': 'Di sini',
'tours.provenance.plannedOver': 'Direncanakan ulang, jejak rekaman disimpan',
'tours.provenance.editedLocally': 'Diedit di TREK',
'tours.provenance.asImported': 'Seperti saat diimpor',
'tours.provenance.openSource': 'Buka di wanderer',
'tours.provenance.check': 'Periksa sumber',
'tours.provenance.checkHint':
'Menanyakan ke wanderer apakah jalur ini berubah sejak diimpor. Tidak ada yang berubah di perjalanan.',
'tours.provenance.state.unchanged': 'Tidak berubah sejak impor',
'tours.provenance.state.changed': 'Diubah di wanderer',
'tours.provenance.state.unavailable': 'Tidak tersedia lagi',
'tours.provenance.state.not_connected': 'Tidak ada koneksi wanderer',
'tours.provenance.state.other_instance': 'wanderer lain yang tersambung',
'tours.provenance.state.unknown': 'Tidak bisa dibandingkan',
'tours.provenance.body.unavailable':
'Jalur sudah hilang atau tidak bisa dibaca lagi dengan koneksimu. Tur ini tetap seperti saat diimpor.',
'tours.provenance.body.not_connected': 'Sambungkan wanderer-mu di Pengaturan, Integrasi untuk memeriksa sumber.',
'tours.provenance.body.other_instance': 'Koneksimu mengarah ke instans yang berbeda dari asal tur ini.',
'tours.provenance.body.unknown':
'Impor ini tidak memuat apa pun untuk dibandingkan. Kamu tetap bisa mengambil jalur saat ini sebagai snapshot baru.',
'tours.provenance.change.name': 'Nama',
'tours.provenance.change.description': 'Deskripsi',
'tours.provenance.change.route': 'Rute',
'tours.provenance.nowUpdated': 'wanderer menyebut {date} sebagai perubahan terakhir',
'tours.provenance.reimport': 'Impor sebagai snapshot baru',
'tours.provenance.reimportTitle': 'Impor jalur yang berubah?',
'tours.provenance.reimportBody':
'Jalur ini masuk sebagai tur baru di samping tur ini. Tur ini, hari dan catatannya tetap seperti semula.',
'tours.provenance.reimported': 'Snapshot baru diimpor',
'tours.visibility.hidden': 'Disembunyikan di peta',
'tours.visibility.showAll': 'Tampilkan semua',
'tours.visibility.show': 'Tampilkan di peta',
'tours.visibility.hide': 'Sembunyikan di peta',
};
export default tours;
+42
View File
@@ -222,5 +222,47 @@ const tours: TranslationStrings = {
'Il percorso sale per {length} sulla «{name}». Servono attrezzatura da ferrata ed esperienza.',
'tours.ferrata.crossingShort': 'Il percorso passa per una via ferrata',
'tours.ferrata.waypointAtEnd': 'Inizio o fine di «{name}»',
'tours.provenance.label': 'Origine',
'tours.provenance.source': 'Fonte',
'tours.provenance.importedAt': 'Importato',
'tours.provenance.createdAt': 'Creato',
'tours.provenance.externalUpdated': 'Modificato su wanderer',
'tours.provenance.externalUpdatedHint':
'La data di modifica indicata da wanderer al momento dell’importazione. Un indizio, non la prova di una versione.',
'tours.provenance.localState': 'Qui',
'tours.provenance.plannedOver': 'Ripianificato, traccia registrata conservata',
'tours.provenance.editedLocally': 'Modificato in TREK',
'tours.provenance.asImported': 'Come importato',
'tours.provenance.openSource': 'Apri in wanderer',
'tours.provenance.check': 'Controlla la fonte',
'tours.provenance.checkHint':
'Chiede a wanderer se questo sentiero è cambiato dall’importazione. Nel viaggio non cambia nulla.',
'tours.provenance.state.unchanged': 'Invariato dall’importazione',
'tours.provenance.state.changed': 'Modificato su wanderer',
'tours.provenance.state.unavailable': 'Non più disponibile',
'tours.provenance.state.not_connected': 'Nessuna connessione wanderer',
'tours.provenance.state.other_instance': 'È collegato un altro wanderer',
'tours.provenance.state.unknown': 'Confronto impossibile',
'tours.provenance.body.unavailable':
'Il sentiero non c’è più o non è più leggibile con la tua connessione. Questo tour resta com’era all’importazione.',
'tours.provenance.body.not_connected':
'Collega il tuo wanderer in Impostazioni, Integrazioni per controllare la fonte.',
'tours.provenance.body.other_instance':
'La tua connessione punta a un’istanza diversa da quella da cui proviene questo tour.',
'tours.provenance.body.unknown':
'Questa importazione non contiene nulla da confrontare. Puoi comunque importare il sentiero attuale come nuova istantanea.',
'tours.provenance.change.name': 'Nome',
'tours.provenance.change.description': 'Descrizione',
'tours.provenance.change.route': 'Percorso',
'tours.provenance.nowUpdated': 'wanderer indica {date} come ultima modifica',
'tours.provenance.reimport': 'Importa come nuova istantanea',
'tours.provenance.reimportTitle': 'Importare il sentiero modificato?',
'tours.provenance.reimportBody':
'Arriva come nuovo tour accanto a questo. Questo tour, i suoi giorni e le note restano come sono.',
'tours.provenance.reimported': 'Nuova istantanea importata',
'tours.visibility.hidden': 'Nascosto sulla mappa',
'tours.visibility.showAll': 'Mostra tutti',
'tours.visibility.show': 'Mostra sulla mappa',
'tours.visibility.hide': 'Nascondi sulla mappa',
};
export default tours;
+40
View File
@@ -211,5 +211,45 @@ const tours: TranslationStrings = {
'tours.ferrata.crossingInfo': 'ルートは「{name}」を {length} 通ります。ヴィア・フェラータ用の装備と経験が必要です。',
'tours.ferrata.crossingShort': 'ルートがヴィア・フェラータを通ります',
'tours.ferrata.waypointAtEnd': '「{name}」の始点または終点',
'tours.provenance.label': '出どころ',
'tours.provenance.source': 'ソース',
'tours.provenance.importedAt': 'インポート日',
'tours.provenance.createdAt': '作成日',
'tours.provenance.externalUpdated': 'wanderer での変更',
'tours.provenance.externalUpdatedHint':
'インポート時に wanderer が示した変更日です。手がかりであり、版の証明ではありません。',
'tours.provenance.localState': 'ここ',
'tours.provenance.plannedOver': '計画し直し済み、記録トラックは保持',
'tours.provenance.editedLocally': 'TREK で編集済み',
'tours.provenance.asImported': 'インポート時のまま',
'tours.provenance.openSource': 'wanderer で開く',
'tours.provenance.check': 'ソースを確認',
'tours.provenance.checkHint':
'インポート後にこのトレイルが変わったかを wanderer に問い合わせます。旅行の内容は変わりません。',
'tours.provenance.state.unchanged': 'インポート後の変更なし',
'tours.provenance.state.changed': 'wanderer で変更あり',
'tours.provenance.state.unavailable': '利用できなくなりました',
'tours.provenance.state.not_connected': 'wanderer 未接続',
'tours.provenance.state.other_instance': '別の wanderer に接続中',
'tours.provenance.state.unknown': '比較できません',
'tours.provenance.body.unavailable':
'トレイルが削除されたか、あなたの接続では読めなくなりました。このツアーはインポート時のまま残ります。',
'tours.provenance.body.not_connected': 'ソースを確認するには、設定の連携で wanderer を接続してください。',
'tours.provenance.body.other_instance': 'あなたの接続は、このツアーの取得元とは別のインスタンスを指しています。',
'tours.provenance.body.unknown':
'このインポートには比較できる情報がありません。それでも現在のトレイルを新しいスナップショットとして取り込めます。',
'tours.provenance.change.name': '名前',
'tours.provenance.change.description': '説明',
'tours.provenance.change.route': 'ルート',
'tours.provenance.nowUpdated': 'wanderer によると最終変更は {date}',
'tours.provenance.reimport': '新しいスナップショットとしてインポート',
'tours.provenance.reimportTitle': '変更されたトレイルをインポートしますか?',
'tours.provenance.reimportBody':
'このツアーの隣に新しいツアーとして追加されます。このツアーとその日程やメモはそのままです。',
'tours.provenance.reimported': '新しいスナップショットをインポートしました',
'tours.visibility.hidden': '地図で非表示',
'tours.visibility.showAll': 'すべて表示',
'tours.visibility.show': '地図に表示',
'tours.visibility.hide': '地図で非表示にする',
};
export default tours;
+39
View File
@@ -210,5 +210,44 @@ const tours: TranslationStrings = {
'tours.ferrata.crossingInfo': '경로가 “{name}”을(를) {length} 지납니다. 비아 페라타 장비와 경험이 필요합니다.',
'tours.ferrata.crossingShort': '경로가 비아 페라타를 지납니다',
'tours.ferrata.waypointAtEnd': '“{name}”의 시작 또는 끝',
'tours.provenance.label': '출처',
'tours.provenance.source': '소스',
'tours.provenance.importedAt': '가져온 날짜',
'tours.provenance.createdAt': '만든 날짜',
'tours.provenance.externalUpdated': 'wanderer에서 변경됨',
'tours.provenance.externalUpdatedHint':
'가져올 때 wanderer가 알려 준 변경 날짜입니다. 참고일 뿐 버전의 증거는 아닙니다.',
'tours.provenance.localState': '여기',
'tours.provenance.plannedOver': '다시 계획함, 기록된 트랙 보관',
'tours.provenance.editedLocally': 'TREK에서 편집함',
'tours.provenance.asImported': '가져온 그대로',
'tours.provenance.openSource': 'wanderer에서 열기',
'tours.provenance.check': '소스 확인',
'tours.provenance.checkHint':
'가져온 뒤 이 트레일이 바뀌었는지 wanderer에 묻습니다. 여행에는 아무것도 바뀌지 않습니다.',
'tours.provenance.state.unchanged': '가져온 뒤 변경 없음',
'tours.provenance.state.changed': 'wanderer에서 변경됨',
'tours.provenance.state.unavailable': '더 이상 사용할 수 없음',
'tours.provenance.state.not_connected': 'wanderer 연결 없음',
'tours.provenance.state.other_instance': '다른 wanderer가 연결됨',
'tours.provenance.state.unknown': '비교할 수 없음',
'tours.provenance.body.unavailable':
'트레일이 없어졌거나 내 연결로 더 이상 읽을 수 없습니다. 이 투어는 가져온 그대로 남습니다.',
'tours.provenance.body.not_connected': '소스를 확인하려면 설정, 통합에서 wanderer를 연결하세요.',
'tours.provenance.body.other_instance': '내 연결이 이 투어를 가져온 곳과 다른 인스턴스를 가리킵니다.',
'tours.provenance.body.unknown':
'이 가져오기에는 비교할 정보가 없습니다. 그래도 현재 트레일을 새 스냅샷으로 가져올 수 있습니다.',
'tours.provenance.change.name': '이름',
'tours.provenance.change.description': '설명',
'tours.provenance.change.route': '경로',
'tours.provenance.nowUpdated': 'wanderer가 알려 준 마지막 변경: {date}',
'tours.provenance.reimport': '새 스냅샷으로 가져오기',
'tours.provenance.reimportTitle': '변경된 트레일을 가져올까요?',
'tours.provenance.reimportBody': '이 투어 옆에 새 투어로 추가됩니다. 이 투어와 날짜, 메모는 그대로입니다.',
'tours.provenance.reimported': '새 스냅샷을 가져왔습니다',
'tours.visibility.hidden': '지도에서 숨김',
'tours.visibility.showAll': '모두 표시',
'tours.visibility.show': '지도에 표시',
'tours.visibility.hide': '지도에서 숨기기',
};
export default tours;
+42
View File
@@ -221,5 +221,47 @@ const tours: TranslationStrings = {
'De route loopt {length} over „{name}”. Daarvoor heb je via-ferratamateriaal en ervaring nodig.',
'tours.ferrata.crossingShort': 'De route loopt over een via ferrata',
'tours.ferrata.waypointAtEnd': 'Begin of einde van „{name}”',
'tours.provenance.label': 'Herkomst',
'tours.provenance.source': 'Bron',
'tours.provenance.importedAt': 'Geïmporteerd',
'tours.provenance.createdAt': 'Aangemaakt',
'tours.provenance.externalUpdated': 'Gewijzigd op wanderer',
'tours.provenance.externalUpdatedHint':
'De wijzigingsdatum die wanderer bij de import gaf. Een aanwijzing, geen bewijs van een versie.',
'tours.provenance.localState': 'Hier',
'tours.provenance.plannedOver': 'Opnieuw gepland, opgenomen spoor bewaard',
'tours.provenance.editedLocally': 'Bewerkt in TREK',
'tours.provenance.asImported': 'Zoals geïmporteerd',
'tours.provenance.openSource': 'Openen in wanderer',
'tours.provenance.check': 'Bron controleren',
'tours.provenance.checkHint':
'Vraagt wanderer of deze route sinds de import is gewijzigd. In de reis verandert niets.',
'tours.provenance.state.unchanged': 'Ongewijzigd sinds de import',
'tours.provenance.state.changed': 'Gewijzigd op wanderer',
'tours.provenance.state.unavailable': 'Niet meer beschikbaar',
'tours.provenance.state.not_connected': 'Geen wanderer-verbinding',
'tours.provenance.state.other_instance': 'Er is een andere wanderer verbonden',
'tours.provenance.state.unknown': 'Vergelijken niet mogelijk',
'tours.provenance.body.unavailable':
'De route is weg of niet meer leesbaar met je verbinding. Deze tocht blijft zoals hij is geïmporteerd.',
'tours.provenance.body.not_connected':
'Verbind je wanderer onder Instellingen, Integraties om de bron te controleren.',
'tours.provenance.body.other_instance':
'Je verbinding wijst naar een andere instantie dan die waar deze tocht vandaan komt.',
'tours.provenance.body.unknown':
'Deze import bevat niets om mee te vergelijken. Je kunt de huidige route toch als nieuwe momentopname binnenhalen.',
'tours.provenance.change.name': 'Naam',
'tours.provenance.change.description': 'Beschrijving',
'tours.provenance.change.route': 'Traject',
'tours.provenance.nowUpdated': 'wanderer noemt {date} als laatste wijziging',
'tours.provenance.reimport': 'Importeren als nieuwe momentopname',
'tours.provenance.reimportTitle': 'Gewijzigde route importeren?',
'tours.provenance.reimportBody':
'Hij komt als nieuwe tocht naast deze. Deze tocht, zijn dagen en notities blijven zoals ze zijn.',
'tours.provenance.reimported': 'Nieuwe momentopname geïmporteerd',
'tours.visibility.hidden': 'Verborgen op de kaart',
'tours.visibility.showAll': 'Alles tonen',
'tours.visibility.show': 'Tonen op de kaart',
'tours.visibility.hide': 'Verbergen op de kaart',
};
export default tours;
+40
View File
@@ -231,5 +231,45 @@ const tours: TranslationStrings = {
'Trasa prowadzi {length} przez „{name}”. Potrzebny jest sprzęt do via ferraty i doświadczenie.',
'tours.ferrata.crossingShort': 'Trasa prowadzi przez via ferratę',
'tours.ferrata.waypointAtEnd': 'Początek lub koniec „{name}”',
'tours.provenance.label': 'Pochodzenie',
'tours.provenance.source': 'Źródło',
'tours.provenance.importedAt': 'Zaimportowano',
'tours.provenance.createdAt': 'Utworzono',
'tours.provenance.externalUpdated': 'Zmieniono w wanderer',
'tours.provenance.externalUpdatedHint':
'Data zmiany podana przez wanderer przy imporcie. Wskazówka, nie dowód wersji.',
'tours.provenance.localState': 'Tutaj',
'tours.provenance.plannedOver': 'Przeplanowano, nagrany ślad zachowany',
'tours.provenance.editedLocally': 'Edytowano w TREK',
'tours.provenance.asImported': 'Jak zaimportowano',
'tours.provenance.openSource': 'Otwórz w wanderer',
'tours.provenance.check': 'Sprawdź źródło',
'tours.provenance.checkHint': 'Pyta wanderer, czy ten szlak zmienił się od importu. W podróży nic się nie zmienia.',
'tours.provenance.state.unchanged': 'Bez zmian od importu',
'tours.provenance.state.changed': 'Zmieniono w wanderer',
'tours.provenance.state.unavailable': 'Już niedostępne',
'tours.provenance.state.not_connected': 'Brak połączenia z wanderer',
'tours.provenance.state.other_instance': 'Połączono inny wanderer',
'tours.provenance.state.unknown': 'Nie można porównać',
'tours.provenance.body.unavailable':
'Szlak zniknął lub nie da się go już odczytać przez twoje połączenie. Ta trasa zostaje taka, jak ją zaimportowano.',
'tours.provenance.body.not_connected': 'Połącz swój wanderer w Ustawieniach, Integracjach, aby sprawdzić źródło.',
'tours.provenance.body.other_instance':
'Twoje połączenie wskazuje na inną instancję niż ta, z której pochodzi ta trasa.',
'tours.provenance.body.unknown':
'Ten import nie zawiera niczego do porównania. Nadal możesz pobrać bieżący szlak jako nową migawkę.',
'tours.provenance.change.name': 'Nazwa',
'tours.provenance.change.description': 'Opis',
'tours.provenance.change.route': 'Przebieg',
'tours.provenance.nowUpdated': 'wanderer podaje {date} jako ostatnią zmianę',
'tours.provenance.reimport': 'Importuj jako nową migawkę',
'tours.provenance.reimportTitle': 'Zaimportować zmieniony szlak?',
'tours.provenance.reimportBody':
'Pojawi się jako nowa trasa obok tej. Ta trasa, jej dni i notatki zostają bez zmian.',
'tours.provenance.reimported': 'Zaimportowano nową migawkę',
'tours.visibility.hidden': 'Ukryte na mapie',
'tours.visibility.showAll': 'Pokaż wszystkie',
'tours.visibility.show': 'Pokaż na mapie',
'tours.visibility.hide': 'Ukryj na mapie',
};
export default tours;
+42
View File
@@ -232,5 +232,47 @@ const tours: TranslationStrings = {
'Маршрут проходит {length} по «{name}». Для этого нужны снаряжение для виа ферраты и опыт.',
'tours.ferrata.crossingShort': 'Маршрут проходит по виа феррате',
'tours.ferrata.waypointAtEnd': 'Начало или конец «{name}»',
'tours.provenance.label': 'Происхождение',
'tours.provenance.source': 'Источник',
'tours.provenance.importedAt': 'Импортировано',
'tours.provenance.createdAt': 'Создано',
'tours.provenance.externalUpdated': 'Изменено в wanderer',
'tours.provenance.externalUpdatedHint':
'Дата изменения, которую wanderer указал при импорте. Подсказка, а не доказательство версии.',
'tours.provenance.localState': 'Здесь',
'tours.provenance.plannedOver': 'Перепланировано, записанный трек сохранён',
'tours.provenance.editedLocally': 'Изменено в TREK',
'tours.provenance.asImported': 'Как импортировано',
'tours.provenance.openSource': 'Открыть в wanderer',
'tours.provenance.check': 'Проверить источник',
'tours.provenance.checkHint':
'Спрашивает wanderer, изменился ли этот маршрут после импорта. В поездке ничего не меняется.',
'tours.provenance.state.unchanged': 'Без изменений после импорта',
'tours.provenance.state.changed': 'Изменено в wanderer',
'tours.provenance.state.unavailable': 'Больше недоступно',
'tours.provenance.state.not_connected': 'Нет подключения к wanderer',
'tours.provenance.state.other_instance': 'Подключён другой wanderer',
'tours.provenance.state.unknown': 'Сравнить нельзя',
'tours.provenance.body.unavailable':
'Маршрут удалён или больше не читается через ваше подключение. Этот поход остаётся таким, каким был импортирован.',
'tours.provenance.body.not_connected':
'Подключите свой wanderer в разделе Настройки, Интеграции, чтобы проверить источник.',
'tours.provenance.body.other_instance':
'Ваше подключение указывает на другой экземпляр, не тот, откуда пришёл этот поход.',
'tours.provenance.body.unknown':
'В этом импорте не с чем сравнивать. Текущий маршрут всё равно можно забрать как новый снимок.',
'tours.provenance.change.name': 'Название',
'tours.provenance.change.description': 'Описание',
'tours.provenance.change.route': 'Маршрут',
'tours.provenance.nowUpdated': 'wanderer указывает {date} как последнее изменение',
'tours.provenance.reimport': 'Импортировать как новый снимок',
'tours.provenance.reimportTitle': 'Импортировать изменённый маршрут?',
'tours.provenance.reimportBody':
'Он появится как новый поход рядом с этим. Этот поход, его дни и заметки останутся как есть.',
'tours.provenance.reimported': 'Новый снимок импортирован',
'tours.visibility.hidden': 'Скрыто на карте',
'tours.visibility.showAll': 'Показать все',
'tours.visibility.show': 'Показать на карте',
'tours.visibility.hide': 'Скрыть на карте',
};
export default tours;
+38
View File
@@ -221,5 +221,43 @@ const tours: TranslationStrings = {
'tours.ferrata.crossingInfo': 'Trasa vedie {length} po „{name}“. Potrebujete feratovú výstroj a skúsenosti.',
'tours.ferrata.crossingShort': 'Trasa vedie po ferate',
'tours.ferrata.waypointAtEnd': 'Začiatok alebo koniec „{name}“',
'tours.provenance.label': 'Pôvod',
'tours.provenance.source': 'Zdroj',
'tours.provenance.importedAt': 'Importované',
'tours.provenance.createdAt': 'Vytvorené',
'tours.provenance.externalUpdated': 'Zmenené vo wanderer',
'tours.provenance.externalUpdatedHint': 'Dátum zmeny, ktorý wanderer uviedol pri importe. Náznak, nie dôkaz verzie.',
'tours.provenance.localState': 'Tu',
'tours.provenance.plannedOver': 'Preplánované, zaznamenaná stopa zachovaná',
'tours.provenance.editedLocally': 'Upravené v TREK',
'tours.provenance.asImported': 'Ako bolo importované',
'tours.provenance.openSource': 'Otvoriť vo wanderer',
'tours.provenance.check': 'Skontrolovať zdroj',
'tours.provenance.checkHint': 'Opýta sa wanderer, či sa táto trasa od importu zmenila. V ceste sa nič nezmení.',
'tours.provenance.state.unchanged': 'Bez zmeny od importu',
'tours.provenance.state.changed': 'Zmenené vo wanderer',
'tours.provenance.state.unavailable': 'Už nie je dostupné',
'tours.provenance.state.not_connected': 'Žiadne pripojenie k wanderer',
'tours.provenance.state.other_instance': 'Je pripojený iný wanderer',
'tours.provenance.state.unknown': 'Nedá sa porovnať',
'tours.provenance.body.unavailable':
'Trasa zmizla alebo ju vaše pripojenie už neprečíta. Táto túra zostane tak, ako bola importovaná.',
'tours.provenance.body.not_connected': 'Pripojte svoj wanderer v Nastaveniach, Integráciách a skontrolujte zdroj.',
'tours.provenance.body.other_instance':
'Vaše pripojenie smeruje na inú inštanciu než tú, z ktorej táto túra pochádza.',
'tours.provenance.body.unknown':
'Tento import nemá s čím porovnať. Aktuálnu trasu aj tak môžete prevziať ako novú snímku.',
'tours.provenance.change.name': 'Názov',
'tours.provenance.change.description': 'Popis',
'tours.provenance.change.route': 'Priebeh trasy',
'tours.provenance.nowUpdated': 'wanderer uvádza {date} ako poslednú zmenu',
'tours.provenance.reimport': 'Importovať ako novú snímku',
'tours.provenance.reimportTitle': 'Importovať zmenenú trasu?',
'tours.provenance.reimportBody': 'Pribudne ako nová túra vedľa tejto. Táto túra, jej dni a poznámky zostanú, ako sú.',
'tours.provenance.reimported': 'Nová snímka importovaná',
'tours.visibility.hidden': 'Skryté na mape',
'tours.visibility.showAll': 'Zobraziť všetky',
'tours.visibility.show': 'Zobraziť na mape',
'tours.visibility.hide': 'Skryť na mape',
};
export default tours;
+40
View File
@@ -216,5 +216,45 @@ const tours: TranslationStrings = {
'tours.ferrata.crossingInfo': 'Rutten går {length} längs ”{name}”. Det kräver via ferrata-utrustning och erfarenhet.',
'tours.ferrata.crossingShort': 'Rutten går längs en via ferrata',
'tours.ferrata.waypointAtEnd': 'Början eller slutet av ”{name}”',
'tours.provenance.label': 'Ursprung',
'tours.provenance.source': 'Källa',
'tours.provenance.importedAt': 'Importerad',
'tours.provenance.createdAt': 'Skapad',
'tours.provenance.externalUpdated': 'Ändrad i wanderer',
'tours.provenance.externalUpdatedHint':
'Ändringsdatumet som wanderer angav vid importen. En ledtråd, inte ett bevis på en version.',
'tours.provenance.localState': 'Här',
'tours.provenance.plannedOver': 'Omplanerad, inspelat spår sparat',
'tours.provenance.editedLocally': 'Redigerad i TREK',
'tours.provenance.asImported': 'Som importerad',
'tours.provenance.openSource': 'Öppna i wanderer',
'tours.provenance.check': 'Kontrollera källan',
'tours.provenance.checkHint': 'Frågar wanderer om leden har ändrats sedan importen. Inget i resan ändras.',
'tours.provenance.state.unchanged': 'Oförändrad sedan importen',
'tours.provenance.state.changed': 'Ändrad i wanderer',
'tours.provenance.state.unavailable': 'Inte längre tillgänglig',
'tours.provenance.state.not_connected': 'Ingen wanderer-anslutning',
'tours.provenance.state.other_instance': 'En annan wanderer är ansluten',
'tours.provenance.state.unknown': 'Kan inte jämföra',
'tours.provenance.body.unavailable':
'Leden finns inte längre eller kan inte läsas med din anslutning. Turen förblir som den importerades.',
'tours.provenance.body.not_connected':
'Anslut din wanderer under Inställningar, Integrationer för att kontrollera källan.',
'tours.provenance.body.other_instance': 'Din anslutning pekar på en annan instans än den som turen kom från.',
'tours.provenance.body.unknown':
'Den här importen har inget att jämföra med. Du kan ändå hämta in den aktuella leden som en ny ögonblicksbild.',
'tours.provenance.change.name': 'Namn',
'tours.provenance.change.description': 'Beskrivning',
'tours.provenance.change.route': 'Sträckning',
'tours.provenance.nowUpdated': 'wanderer anger {date} som senaste ändring',
'tours.provenance.reimport': 'Importera som ny ögonblicksbild',
'tours.provenance.reimportTitle': 'Importera den ändrade leden?',
'tours.provenance.reimportBody':
'Den kommer in som en ny tur bredvid den här. Den här turen, dess dagar och anteckningar förblir som de är.',
'tours.provenance.reimported': 'Ny ögonblicksbild importerad',
'tours.visibility.hidden': 'Dold på kartan',
'tours.visibility.showAll': 'Visa alla',
'tours.visibility.show': 'Visa på kartan',
'tours.visibility.hide': 'Dölj på kartan',
};
export default tours;
+38
View File
@@ -207,5 +207,43 @@ const tours: TranslationStrings = {
'tours.ferrata.crossingInfo': 'เส้นทางผ่าน “{name}” เป็นระยะ {length} ต้องใช้อุปกรณ์เวียเฟอร์ราตาและประสบการณ์',
'tours.ferrata.crossingShort': 'เส้นทางผ่านเวียเฟอร์ราตา',
'tours.ferrata.waypointAtEnd': 'จุดเริ่มหรือจุดสิ้นสุดของ “{name}”',
'tours.provenance.label': 'ที่มา',
'tours.provenance.source': 'แหล่งข้อมูล',
'tours.provenance.importedAt': 'นำเข้าเมื่อ',
'tours.provenance.createdAt': 'สร้างเมื่อ',
'tours.provenance.externalUpdated': 'มีการเปลี่ยนใน wanderer',
'tours.provenance.externalUpdatedHint':
'วันที่เปลี่ยนแปลงที่ wanderer แจ้งตอนนำเข้า เป็นเพียงข้อบ่งชี้ ไม่ใช่หลักฐานของเวอร์ชัน',
'tours.provenance.localState': 'ที่นี่',
'tours.provenance.plannedOver': 'วางแผนใหม่แล้ว เก็บเส้นทางที่บันทึกไว้',
'tours.provenance.editedLocally': 'แก้ไขใน TREK แล้ว',
'tours.provenance.asImported': 'เหมือนตอนนำเข้า',
'tours.provenance.openSource': 'เปิดใน wanderer',
'tours.provenance.check': 'ตรวจสอบแหล่งข้อมูล',
'tours.provenance.checkHint': 'ถาม wanderer ว่าเส้นทางนี้เปลี่ยนไปหรือไม่ตั้งแต่นำเข้า ไม่มีอะไรในทริปเปลี่ยนแปลง',
'tours.provenance.state.unchanged': 'ไม่เปลี่ยนตั้งแต่นำเข้า',
'tours.provenance.state.changed': 'มีการเปลี่ยนใน wanderer',
'tours.provenance.state.unavailable': 'ไม่มีให้ใช้แล้ว',
'tours.provenance.state.not_connected': 'ยังไม่ได้เชื่อมต่อ wanderer',
'tours.provenance.state.other_instance': 'เชื่อมต่อ wanderer อื่นอยู่',
'tours.provenance.state.unknown': 'เปรียบเทียบไม่ได้',
'tours.provenance.body.unavailable':
'เส้นทางถูกลบหรือการเชื่อมต่อของคุณอ่านไม่ได้แล้ว ทัวร์นี้จะคงอยู่ตามที่นำเข้ามา',
'tours.provenance.body.not_connected': 'เชื่อมต่อ wanderer ของคุณที่การตั้งค่า การผสานรวม เพื่อตรวจสอบแหล่งข้อมูล',
'tours.provenance.body.other_instance': 'การเชื่อมต่อของคุณชี้ไปยังอินสแตนซ์อื่นที่ไม่ใช่ที่มาของทัวร์นี้',
'tours.provenance.body.unknown':
'การนำเข้านี้ไม่มีข้อมูลให้เปรียบเทียบ แต่คุณยังนำเส้นทางปัจจุบันเข้ามาเป็นสแนปช็อตใหม่ได้',
'tours.provenance.change.name': 'ชื่อ',
'tours.provenance.change.description': 'คำอธิบาย',
'tours.provenance.change.route': 'แนวเส้นทาง',
'tours.provenance.nowUpdated': 'wanderer ระบุว่าเปลี่ยนล่าสุดเมื่อ {date}',
'tours.provenance.reimport': 'นำเข้าเป็นสแนปช็อตใหม่',
'tours.provenance.reimportTitle': 'นำเข้าเส้นทางที่เปลี่ยนแล้วหรือไม่',
'tours.provenance.reimportBody': 'จะเพิ่มเป็นทัวร์ใหม่ข้างทัวร์นี้ ทัวร์นี้ วัน และบันทึกของมันจะคงเดิม',
'tours.provenance.reimported': 'นำเข้าสแนปช็อตใหม่แล้ว',
'tours.visibility.hidden': 'ซ่อนบนแผนที่',
'tours.visibility.showAll': 'แสดงทั้งหมด',
'tours.visibility.show': 'แสดงบนแผนที่',
'tours.visibility.hide': 'ซ่อนบนแผนที่',
};
export default tours;
+2 -2
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 = 196;
const GENERAL_KEY_COUNT = 231;
function literalKeys(source: string): string[] {
const tree = ts.createSourceFile('locale.ts', source, ts.ScriptTarget.Latest, true);
@@ -34,7 +34,7 @@ function literalKeys(source: string): string[] {
}
describe('Tours locale contracts', () => {
it('covers all 27 supported locales with 196 general source keys', () => {
it('covers all 27 supported locales with 231 general source keys', () => {
expect(Object.keys(domains)).toHaveLength(27);
expect(Object.keys(domains).sort()).toEqual(SUPPORTED_LANGUAGE_CODES.map((code) => `./${code}/tours.ts`).sort());
expect(generalKeys(Object.keys(english))).toHaveLength(GENERAL_KEY_COUNT);
+40
View File
@@ -218,5 +218,45 @@ const tours: TranslationStrings = {
'Rota {length} boyunca “{name}” üzerinden geçiyor. Bunun için via ferrata ekipmanı ve deneyim gerekir.',
'tours.ferrata.crossingShort': 'Rota bir via ferrata üzerinden geçiyor',
'tours.ferrata.waypointAtEnd': '“{name}” başlangıcı veya sonu',
'tours.provenance.label': 'Köken',
'tours.provenance.source': 'Kaynak',
'tours.provenance.importedAt': 'İçe aktarıldı',
'tours.provenance.createdAt': 'Oluşturuldu',
'tours.provenance.externalUpdated': 'wanderer üzerinde değişti',
'tours.provenance.externalUpdatedHint':
'wanderer’ın içe aktarma sırasında verdiği değişiklik tarihi. Bir ipucu, sürüm kanıtı değil.',
'tours.provenance.localState': 'Burada',
'tours.provenance.plannedOver': 'Yeniden planlandı, kayıtlı iz korundu',
'tours.provenance.editedLocally': 'TREK’te düzenlendi',
'tours.provenance.asImported': 'İçe aktarıldığı gibi',
'tours.provenance.openSource': 'wanderer’da aç',
'tours.provenance.check': 'Kaynağı denetle',
'tours.provenance.checkHint':
'wanderer’a bu parkurun içe aktarmadan beri değişip değişmediğini sorar. Seyahatte hiçbir şey değişmez.',
'tours.provenance.state.unchanged': 'İçe aktarmadan beri değişmedi',
'tours.provenance.state.changed': 'wanderer üzerinde değişti',
'tours.provenance.state.unavailable': 'Artık mevcut değil',
'tours.provenance.state.not_connected': 'wanderer bağlantısı yok',
'tours.provenance.state.other_instance': 'Başka bir wanderer bağlı',
'tours.provenance.state.unknown': 'Karşılaştırılamıyor',
'tours.provenance.body.unavailable':
'Parkur kaldırılmış ya da bağlantınla artık okunamıyor. Bu tur içe aktarıldığı gibi kalır.',
'tours.provenance.body.not_connected': 'Kaynağı denetlemek için wanderer’ını Ayarlar, Entegrasyonlar altında bağla.',
'tours.provenance.body.other_instance': 'Bağlantın, bu turun geldiğinden farklı bir sunucuyu gösteriyor.',
'tours.provenance.body.unknown':
'Bu içe aktarmada karşılaştırılacak bir şey yok. Güncel parkuru yine de yeni bir anlık görüntü olarak alabilirsin.',
'tours.provenance.change.name': 'Ad',
'tours.provenance.change.description': 'Açıklama',
'tours.provenance.change.route': 'Güzergâh',
'tours.provenance.nowUpdated': 'wanderer son değişiklik olarak {date} tarihini veriyor',
'tours.provenance.reimport': 'Yeni anlık görüntü olarak içe aktar',
'tours.provenance.reimportTitle': 'Değişen parkur içe aktarılsın mı?',
'tours.provenance.reimportBody':
'Bunun yanına yeni bir tur olarak gelir. Bu tur, günleri ve notları olduğu gibi kalır.',
'tours.provenance.reimported': 'Yeni anlık görüntü içe aktarıldı',
'tours.visibility.hidden': 'Haritada gizli',
'tours.visibility.showAll': 'Tümünü göster',
'tours.visibility.show': 'Haritada göster',
'tours.visibility.hide': 'Haritada gizle',
};
export default tours;
+42
View File
@@ -229,5 +229,47 @@ const tours: TranslationStrings = {
'Маршрут проходить {length} по «{name}». Для цього потрібні спорядження для віа ферати й досвід.',
'tours.ferrata.crossingShort': 'Маршрут проходить по віа фераті',
'tours.ferrata.waypointAtEnd': 'Початок або кінець «{name}»',
'tours.provenance.label': 'Походження',
'tours.provenance.source': 'Джерело',
'tours.provenance.importedAt': 'Імпортовано',
'tours.provenance.createdAt': 'Створено',
'tours.provenance.externalUpdated': 'Змінено у wanderer',
'tours.provenance.externalUpdatedHint':
'Дата зміни, яку wanderer вказав під час імпорту. Підказка, а не доказ версії.',
'tours.provenance.localState': 'Тут',
'tours.provenance.plannedOver': 'Перепланковано, записаний трек збережено',
'tours.provenance.editedLocally': 'Змінено в TREK',
'tours.provenance.asImported': 'Як імпортовано',
'tours.provenance.openSource': 'Відкрити у wanderer',
'tours.provenance.check': 'Перевірити джерело',
'tours.provenance.checkHint':
'Питає wanderer, чи змінився цей маршрут після імпорту. У подорожі нічого не змінюється.',
'tours.provenance.state.unchanged': 'Без змін після імпорту',
'tours.provenance.state.changed': 'Змінено у wanderer',
'tours.provenance.state.unavailable': 'Більше недоступно',
'tours.provenance.state.not_connected': 'Немає підключення до wanderer',
'tours.provenance.state.other_instance': 'Підключено інший wanderer',
'tours.provenance.state.unknown': 'Порівняти неможливо',
'tours.provenance.body.unavailable':
'Маршрут зник або більше не читається через ваше підключення. Цей похід лишається таким, яким його імпортовано.',
'tours.provenance.body.not_connected':
'Підключіть свій wanderer у розділі Налаштування, Інтеграції, щоб перевірити джерело.',
'tours.provenance.body.other_instance':
'Ваше підключення вказує на інший екземпляр, не той, звідки прийшов цей похід.',
'tours.provenance.body.unknown':
'У цьому імпорті немає з чим порівнювати. Поточний маршрут однаково можна забрати як новий знімок.',
'tours.provenance.change.name': 'Назва',
'tours.provenance.change.description': 'Опис',
'tours.provenance.change.route': 'Траса',
'tours.provenance.nowUpdated': 'wanderer вказує {date} як останню зміну',
'tours.provenance.reimport': 'Імпортувати як новий знімок',
'tours.provenance.reimportTitle': 'Імпортувати змінений маршрут?',
'tours.provenance.reimportBody':
'Він з’явиться як новий похід поруч із цим. Цей похід, його дні та нотатки лишаються як є.',
'tours.provenance.reimported': 'Новий знімок імпортовано',
'tours.visibility.hidden': 'Приховано на мапі',
'tours.visibility.showAll': 'Показати всі',
'tours.visibility.show': 'Показати на мапі',
'tours.visibility.hide': 'Приховати на мапі',
};
export default tours;
+41
View File
@@ -216,5 +216,46 @@ const tours: TranslationStrings = {
'tours.ferrata.crossingInfo': 'Tuyến đi qua “{name}” dài {length}. Cần trang bị via ferrata và kinh nghiệm.',
'tours.ferrata.crossingShort': 'Tuyến đi qua một via ferrata',
'tours.ferrata.waypointAtEnd': 'Điểm đầu hoặc cuối của “{name}”',
'tours.provenance.label': 'Nguồn gốc',
'tours.provenance.source': 'Nguồn',
'tours.provenance.importedAt': 'Đã nhập',
'tours.provenance.createdAt': 'Đã tạo',
'tours.provenance.externalUpdated': 'Đã đổi trên wanderer',
'tours.provenance.externalUpdatedHint':
'Ngày thay đổi mà wanderer cho biết khi nhập. Chỉ là gợi ý, không phải bằng chứng phiên bản.',
'tours.provenance.localState': 'Tại đây',
'tours.provenance.plannedOver': 'Đã lên kế hoạch lại, giữ vết đã ghi',
'tours.provenance.editedLocally': 'Đã sửa trong TREK',
'tours.provenance.asImported': 'Như khi nhập',
'tours.provenance.openSource': 'Mở trong wanderer',
'tours.provenance.check': 'Kiểm tra nguồn',
'tours.provenance.checkHint':
'Hỏi wanderer xem tuyến này có thay đổi từ khi nhập không. Không có gì trong chuyến đi thay đổi.',
'tours.provenance.state.unchanged': 'Không đổi từ khi nhập',
'tours.provenance.state.changed': 'Đã đổi trên wanderer',
'tours.provenance.state.unavailable': 'Không còn khả dụng',
'tours.provenance.state.not_connected': 'Chưa kết nối wanderer',
'tours.provenance.state.other_instance': 'Đang kết nối một wanderer khác',
'tours.provenance.state.unknown': 'Không thể so sánh',
'tours.provenance.body.unavailable':
'Tuyến đã bị xóa hoặc kết nối của bạn không còn đọc được. Chuyến đi bộ này giữ nguyên như khi nhập.',
'tours.provenance.body.not_connected': 'Hãy kết nối wanderer của bạn trong Cài đặt, Tích hợp để kiểm tra nguồn.',
'tours.provenance.body.other_instance':
'Kết nối của bạn trỏ tới một máy chủ khác với nơi chuyến đi bộ này xuất phát.',
'tours.provenance.body.unknown':
'Lần nhập này không có gì để so sánh. Bạn vẫn có thể lấy tuyến hiện tại thành một bản chụp mới.',
'tours.provenance.change.name': 'Tên',
'tours.provenance.change.description': 'Mô tả',
'tours.provenance.change.route': 'Lộ trình',
'tours.provenance.nowUpdated': 'wanderer cho biết lần đổi cuối là {date}',
'tours.provenance.reimport': 'Nhập thành bản chụp mới',
'tours.provenance.reimportTitle': 'Nhập tuyến đã thay đổi?',
'tours.provenance.reimportBody':
'Tuyến sẽ thành một chuyến đi bộ mới bên cạnh chuyến này. Chuyến này, các ngày và ghi chú của nó giữ nguyên.',
'tours.provenance.reimported': 'Đã nhập bản chụp mới',
'tours.visibility.hidden': 'Đã ẩn trên bản đồ',
'tours.visibility.showAll': 'Hiện tất cả',
'tours.visibility.show': 'Hiện trên bản đồ',
'tours.visibility.hide': 'Ẩn trên bản đồ',
};
export default tours;
+35
View File
@@ -201,5 +201,40 @@ const tours: TranslationStrings = {
'tours.ferrata.crossingInfo': '路線經過「{name}」{length}。需要岩釘路線裝備與經驗。',
'tours.ferrata.crossingShort': '路線經過岩釘路線',
'tours.ferrata.waypointAtEnd': '「{name}」的起點或終點',
'tours.provenance.label': '來源',
'tours.provenance.source': '出處',
'tours.provenance.importedAt': '匯入時間',
'tours.provenance.createdAt': '建立時間',
'tours.provenance.externalUpdated': '在 wanderer 上已變更',
'tours.provenance.externalUpdatedHint': 'wanderer 在匯入時提供的變更日期。只是提示,不能證明版本。',
'tours.provenance.localState': '這裡',
'tours.provenance.plannedOver': '已重新規劃,記錄的軌跡已保留',
'tours.provenance.editedLocally': '已在 TREK 中編輯',
'tours.provenance.asImported': '與匯入時相同',
'tours.provenance.openSource': '在 wanderer 中開啟',
'tours.provenance.check': '檢查出處',
'tours.provenance.checkHint': '詢問 wanderer 自匯入以來這條路線是否有變化。旅程中不會有任何改變。',
'tours.provenance.state.unchanged': '匯入後未變更',
'tours.provenance.state.changed': '在 wanderer 上已變更',
'tours.provenance.state.unavailable': '已無法使用',
'tours.provenance.state.not_connected': '未連線 wanderer',
'tours.provenance.state.other_instance': '已連線另一個 wanderer',
'tours.provenance.state.unknown': '無法比較',
'tours.provenance.body.unavailable': '這條路線已刪除,或你的連線已無法讀取。此遊程維持匯入時的樣子。',
'tours.provenance.body.not_connected': '請在設定的整合中連線你的 wanderer 以檢查出處。',
'tours.provenance.body.other_instance': '你的連線指向的執行個體與此遊程的出處不同。',
'tours.provenance.body.unknown': '這次匯入沒有可比較的內容。你仍可將目前路線作為新快照匯入。',
'tours.provenance.change.name': '名稱',
'tours.provenance.change.description': '說明',
'tours.provenance.change.route': '路線走向',
'tours.provenance.nowUpdated': 'wanderer 顯示最後變更於 {date}',
'tours.provenance.reimport': '作為新快照匯入',
'tours.provenance.reimportTitle': '要匯入已變更的路線嗎?',
'tours.provenance.reimportBody': '它會作為新遊程出現在此遊程旁邊。此遊程及其日程與筆記保持不變。',
'tours.provenance.reimported': '已匯入新快照',
'tours.visibility.hidden': '已在地圖上隱藏',
'tours.visibility.showAll': '全部顯示',
'tours.visibility.show': '在地圖上顯示',
'tours.visibility.hide': '在地圖上隱藏',
};
export default tours;
+35
View File
@@ -202,5 +202,40 @@ const tours: TranslationStrings = {
'tours.ferrata.crossingInfo': '路线经过“{name}”{length}。需要飞拉达装备和经验。',
'tours.ferrata.crossingShort': '路线经过飞拉达',
'tours.ferrata.waypointAtEnd': '“{name}”的起点或终点',
'tours.provenance.label': '来源',
'tours.provenance.source': '源',
'tours.provenance.importedAt': '导入时间',
'tours.provenance.createdAt': '创建时间',
'tours.provenance.externalUpdated': '在 wanderer 上已更改',
'tours.provenance.externalUpdatedHint': 'wanderer 在导入时给出的更改日期。只是提示,不能证明版本。',
'tours.provenance.localState': '此处',
'tours.provenance.plannedOver': '已重新规划,记录的轨迹已保留',
'tours.provenance.editedLocally': '已在 TREK 中编辑',
'tours.provenance.asImported': '与导入时相同',
'tours.provenance.openSource': '在 wanderer 中打开',
'tours.provenance.check': '检查来源',
'tours.provenance.checkHint': '询问 wanderer 自导入以来这条路线是否有变化。行程中不会有任何改变。',
'tours.provenance.state.unchanged': '导入后未更改',
'tours.provenance.state.changed': '在 wanderer 上已更改',
'tours.provenance.state.unavailable': '已不可用',
'tours.provenance.state.not_connected': '未连接 wanderer',
'tours.provenance.state.other_instance': '已连接另一个 wanderer',
'tours.provenance.state.unknown': '无法比较',
'tours.provenance.body.unavailable': '该路线已删除,或你的连接已无法读取。此路线保持导入时的样子。',
'tours.provenance.body.not_connected': '请在设置的集成中连接你的 wanderer 以检查来源。',
'tours.provenance.body.other_instance': '你的连接指向的实例与此路线的来源不同。',
'tours.provenance.body.unknown': '此次导入没有可比较的内容。你仍然可以将当前路线作为新快照导入。',
'tours.provenance.change.name': '名称',
'tours.provenance.change.description': '描述',
'tours.provenance.change.route': '路线走向',
'tours.provenance.nowUpdated': 'wanderer 显示最后更改于 {date}',
'tours.provenance.reimport': '作为新快照导入',
'tours.provenance.reimportTitle': '导入已更改的路线?',
'tours.provenance.reimportBody': '它会作为新路线出现在此路线旁边。此路线及其日程和备注保持不变。',
'tours.provenance.reimported': '已导入新快照',
'tours.visibility.hidden': '已在地图上隐藏',
'tours.visibility.showAll': '全部显示',
'tours.visibility.show': '在地图上显示',
'tours.visibility.hide': '在地图上隐藏',
};
export default tours;
+1
View File
@@ -49,6 +49,7 @@ export * from './place/place-website';
export * from './roadtrip/roadtrip.schema';
export * from './place/track-colors';
export * from './tours/tours.schema';
export * from './tours/tour-provenance.schema';
export * from './tours/tours.metrics';
export * from './wanderer/wanderer.schema';
export * from './geo/haversine';
@@ -0,0 +1,111 @@
import {
tourOriginSchema,
tourProvenanceSchema,
tourSourceCheckResponseSchema,
type TourProvenance,
} from './tour-provenance.schema';
import { tourCreateResponseSchema, tourListItemSchema } from './tours.schema';
import { describe, expect, it } from 'vitest';
const planned: TourProvenance = {
origin: 'trek',
createdAt: '2026-10-15 10:00:00',
source: { kind: 'trek' },
derivedFrom: null,
plannedOver: false,
editedLocally: null,
};
describe('tour provenance contract (P2C-02)', () => {
it('knows the three ways a tour comes in, and nothing else', () => {
expect(tourOriginSchema.options).toEqual(['trek', 'gpx', 'wanderer']);
expect(tourOriginSchema.safeParse('komoot').success).toBe(false);
});
it('holds a planned tour without inventing a source for it', () => {
expect(tourProvenanceSchema.parse(planned)).toEqual(planned);
expect(
tourProvenanceSchema.safeParse({ ...planned, source: { kind: 'trek', fileName: 'x.gpx' } }).data?.source,
).toEqual({
kind: 'trek',
});
});
it('keeps what each source carries apart: a GPX file name, a wanderer identity', () => {
const gpx = { ...planned, origin: 'gpx', source: { kind: 'gpx', fileName: null }, plannedOver: true };
expect(tourProvenanceSchema.parse(gpx).source).toEqual({ kind: 'gpx', fileName: null });
const wanderer = {
...planned,
origin: 'wanderer',
source: {
kind: 'wanderer',
instance: 'https://trails.example',
externalId: 'abc123',
externalUrl: null,
externalUpdated: '2026-10-01 08:00:00Z',
importedAt: null,
},
editedLocally: true,
};
expect(tourProvenanceSchema.parse(wanderer).source).toMatchObject({ kind: 'wanderer', externalId: 'abc123' });
// A wanderer source without its identity is no wanderer source.
expect(tourProvenanceSchema.safeParse({ ...wanderer, source: { kind: 'wanderer' } }).success).toBe(false);
});
it('names the import a tour was planned from by id and name', () => {
const derived = { ...planned, derivedFrom: { placeId: 7, name: 'Ridge (GPX)' } };
expect(tourProvenanceSchema.parse(derived).derivedFrom).toEqual({ placeId: 7, name: 'Ridge (GPX)' });
expect(tourProvenanceSchema.safeParse({ ...planned, derivedFrom: { placeId: 0, name: 'x' } }).success).toBe(false);
});
it('is optional on the list and the detail, so a cache from before it still reads', () => {
const item = {
place_id: 1,
tour_type: 'hike',
distance: null,
elevation_gain: null,
elevation_loss: null,
duration: null,
difficulty: null,
wanderer_ref: null,
match_confidence: null,
max_hiking_difficulty: null,
name: 'Ridge',
planned: false,
caution: false,
};
expect(tourListItemSchema.parse(item).origin).toBeUndefined();
expect(tourListItemSchema.parse({ ...item, origin: 'gpx' }).origin).toBe('gpx');
expect(tourCreateResponseSchema.parse({ tour: item, waypoints: [] }).provenance).toBeUndefined();
expect(tourCreateResponseSchema.parse({ tour: item, waypoints: [], provenance: planned }).provenance).toEqual(
planned,
);
});
});
describe('source check answer (MF-03)', () => {
it('says what changed and carries what a confirmed reimport sends', () => {
const answer = {
state: 'changed',
changes: ['name', 'route'],
externalUpdated: '2026-10-14 12:00:00Z',
importedUpdated: '2026-10-01 08:00:00Z',
editedLocally: false,
reimport: { trailId: 'abc123', contentHash: 'h.h.h' },
};
expect(tourSourceCheckResponseSchema.parse(answer)).toEqual(answer);
});
it('refuses a state or a change it does not know', () => {
const base = { changes: [], externalUpdated: null, importedUpdated: null, editedLocally: null, reimport: null };
for (const state of ['unchanged', 'unavailable', 'not_connected', 'other_instance', 'unknown']) {
expect(tourSourceCheckResponseSchema.safeParse({ ...base, state }).success).toBe(true);
}
expect(tourSourceCheckResponseSchema.safeParse({ ...base, state: 'synced' }).success).toBe(false);
expect(tourSourceCheckResponseSchema.safeParse({ ...base, state: 'changed', changes: ['author'] }).success).toBe(
false,
);
});
});
+104
View File
@@ -0,0 +1,104 @@
import { z } from 'zod';
/**
* Which way a tour came into TREK. Recorded when it is created, never read off
* its shape: an import planned over in place keeps its origin.
*/
export const tourOriginSchema = z.enum(['trek', 'gpx', 'wanderer']);
export type TourOrigin = z.infer<typeof tourOriginSchema>;
/** What the import itself carried, one shape per kind of source. */
export const tourProvenanceSourceSchema = z.discriminatedUnion('kind', [
/** Planned in TREK: no outside source to name. */
z.object({ kind: z.literal('trek') }),
z.object({
kind: z.literal('gpx'),
/** The file the track was read from; null for an import from before TREK kept it. */
fileName: z.string().nullable(),
}),
z.object({
kind: z.literal('wanderer'),
/** The instance's origin, `https://host`. */
instance: z.string(),
/** The trail's id there. */
externalId: z.string(),
/** The trail's page there; null when the import's record is missing. */
externalUrl: z.string().nullable(),
/** wanderer's own change time of the trail at the import, as it said it; not a version. */
externalUpdated: z.string().nullable(),
/** When this snapshot came in; null when the import's record is missing. */
importedAt: z.string().nullable(),
}),
]);
export type TourProvenanceSource = z.infer<typeof tourProvenanceSourceSchema>;
/**
* Where a tour came from, kept apart from what was done to it since. The
* general part holds for every tour; `source` holds what only its kind of
* source carries. The tour's `website` is a link its people keep, not part of
* this.
*/
export const tourProvenanceSchema = z.object({
origin: tourOriginSchema,
/** When the tour was first saved in this trip: the import, or the first save of a planned tour. */
createdAt: z.string().nullable(),
source: tourProvenanceSourceSchema,
/** The import this tour was planned from, while that import is still in the trip. */
derivedFrom: z
.object({
placeId: z.number().int().positive(),
name: z.string(),
})
.nullable(),
/** The import was planned over in place and still keeps the track it was recorded with. */
plannedOver: z.boolean(),
/**
* Whether the tour's name or line differs from how the import saved it.
* Null where TREK has nothing to compare against: a planned tour, a GPX
* import, a snapshot whose import record is missing.
*/
editedLocally: z.boolean().nullable(),
});
export type TourProvenance = z.infer<typeof tourProvenanceSchema>;
/**
* What asking a wanderer snapshot's source for changes found. The check reads
* only, it changes nothing in the trip.
*
* - `unchanged` / `changed`: the trail was read and compared with this snapshot.
* - `unavailable`: the trail is gone or not readable with the user's connection
* any more; the snapshot stays as it is.
* - `not_connected`: the user has no wanderer connection to ask with.
* - `other_instance`: the user's connection points at another instance than
* the one the snapshot came from.
* - `unknown`: the snapshot carries nothing to compare against.
*/
export const tourSourceCheckStateSchema = z.enum([
'unchanged',
'changed',
'unavailable',
'not_connected',
'other_instance',
'unknown',
]);
export type TourSourceCheckState = z.infer<typeof tourSourceCheckStateSchema>;
export const tourSourceCheckResponseSchema = z.object({
state: tourSourceCheckStateSchema,
/** What differs between the trail now and this snapshot. */
changes: z.array(z.enum(['name', 'description', 'route'])),
/** wanderer's change time of the trail now, as it says it; only a hint, never the proof. */
externalUpdated: z.string().nullable(),
/** The change time it said at the import. */
importedUpdated: z.string().nullable(),
/** The tour was changed in TREK since the import; null when there is nothing to compare. */
editedLocally: z.boolean().nullable(),
/** What a confirmed reimport sends to the import route; null unless the trail was read. */
reimport: z
.object({
trailId: z.string(),
contentHash: z.string(),
})
.nullable(),
});
export type TourSourceCheckResponse = z.infer<typeof tourSourceCheckResponseSchema>;
+5
View File
@@ -1,4 +1,5 @@
import { z } from 'zod';
import { tourOriginSchema, tourProvenanceSchema } from './tour-provenance.schema';
/**
* Tours contracts — the generalisation of "hike" into a domain of self-contained,
@@ -106,6 +107,8 @@ export const tourListItemSchema = tourSchema.extend({
has_waypoints: z.boolean().optional(),
/** An import planned over in place still keeps the track it was recorded with, and can go back to it. */
has_recorded_track: z.boolean().optional(),
/** Which way the tour came in; absent only in a list cached before TREK recorded it. */
origin: tourOriginSchema.optional(),
});
export type TourListItem = z.infer<typeof tourListItemSchema>;
@@ -236,6 +239,8 @@ export type TourCreateRequest = z.infer<typeof tourCreateRequestSchema>;
export const tourCreateResponseSchema = z.object({
tour: tourListItemSchema,
waypoints: z.array(tourWaypointSchema),
/** Where the tour came from (P2C-02); absent only in a detail cached before TREK sent it. */
provenance: tourProvenanceSchema.optional(),
});
export type TourCreateResponse = z.infer<typeof tourCreateResponseSchema>;