feat(tours): show a city walk's progress on the phone's day row, and check its stops off offline (CW-03)

The day row on the phone now shows how many stops of a city walk were
visited on that day, "2 of 5 visited", like the desktop row does. Both rows
read it from one place, and a tap on the phone names it in full without
opening the row.

A walk's stops can be checked off, skipped and taken back without a
connection. The mark shows at once, waits in the offline queue and goes out
when the connection is back, in the order the marks were made and behind any
older mark of the same day that still waits. The day plan, the walk's detail
and a reload read the visits kept on this device with the waiting marks on
top, so a mark made offline stays on screen until the server has it. A mark
the server answers with "not found", because the stop, the day or the walk
was removed meanwhile, counts as done and holds back no later mark of that
day. Any other refusal, the Tours addon turned off among them, keeps the mark
as a failed change to try again from the offline settings. The visits are
read again when the connection comes and goes, and once more after the
waiting marks went out, so a mark the server dropped or refused leaves the
day plan. A trip's visits that answer after another trip was opened no longer
show there.

The offline sync keeps each trip's walk visits and reads the stops of a walk
this device has never opened, so it can be checked off offline too. A walk
whose stops this device could not read lists no stand-in stops and no count,
and says to open it again while online. A walk put on a day while offline
says its stops can be checked off once it has synced, instead of offering
buttons that cannot work yet. A mark that fails says to open the walk again
and try once more, in every language.

Marks carry no version, so the last one to reach the server wins, as with
the other changes sent after being offline. The offline guide says so.
This commit is contained in:
Maurice
2026-10-20 02:14:12 +00:00
parent c836ee3988
commit 0b92dcc86b
56 changed files with 1884 additions and 122 deletions
+3 -1
View File
@@ -505,6 +505,7 @@ const tours: TranslationStrings = {
'tours.walk.totalComputed': 'محسوب',
'tours.walk.stations': 'محطات الجولة',
'tours.walk.stationNumbered': 'المحطة {number}',
'tours.walk.stationsUnread': 'تعذّر تحميل محطات هذه الجولة. افتحها مرة أخرى وأنت متصل بالإنترنت لعرضها وتأشيرها.',
'tours.walk.progress': 'تمت زيارة {visited} من {total}',
'tours.walk.visit.visited': 'تمت الزيارة',
'tours.walk.visit.skip': 'تخطي',
@@ -512,7 +513,8 @@ const tours: TranslationStrings = {
'tours.walk.visit.isVisited': 'تمت زيارتها في هذا اليوم',
'tours.walk.visit.isSkipped': 'تم تخطيها في هذا اليوم',
'tours.walk.visit.fromDay': 'افتح الجولة من يوم في الخطة لتأشير محطاتها لذلك اليوم.',
'tours.walk.visit.failed': 'تعذر تأشير المحطة. يتطلب ذلك اتصالًا؛ حاول مجددًا بعد قليل.',
'tours.walk.visit.failed': 'تعذر تأشير المحطة. افتح الجولة مرة أخرى وحاول من جديد.',
'tours.walk.visit.notSynced': 'أُضيفت هذه الجولة إلى اليوم دون اتصال. يمكن تأشير محطاتها بعد مزامنتها.',
'tours.walk.themes': 'موضوع الجولة',
'tours.walk.theme.culture': 'ثقافة وتاريخ',
'tours.walk.theme.parks': 'حدائق وإطلالات',
+5 -1
View File
@@ -500,6 +500,8 @@ const tours: TranslationStrings = {
'tours.walk.totalComputed': 'Hesablanmış',
'tours.walk.stations': 'Gəzintinin dayanacaqları',
'tours.walk.stationNumbered': 'Dayanacaq {number}',
'tours.walk.stationsUnread':
'Bu gəzintinin dayanacaqları yüklənə bilmədi. Onları görmək və qeyd etmək üçün gəzintini internet bağlantısı ilə yenidən aç.',
'tours.walk.progress': '{total} dayanacaqdan {visited} ziyarət edildi',
'tours.walk.visit.visited': 'Ziyarət edildi',
'tours.walk.visit.skip': 'Keç',
@@ -507,7 +509,9 @@ const tours: TranslationStrings = {
'tours.walk.visit.isVisited': 'Bu gün ziyarət edildi',
'tours.walk.visit.isSkipped': 'Bu gün keçildi',
'tours.walk.visit.fromDay': 'Dayanacaqları o gün üçün qeyd etmək üçün gəzintini plandakı bir gündən aç.',
'tours.walk.visit.failed': 'Dayanacaq qeyd edilə bilmədi. Bunun üçün bağlantı lazımdır; bir azdan yenidən cəhd et.',
'tours.walk.visit.failed': 'Dayanacaq qeyd edilə bilmədi. Gəzintini yenidən aç və bir daha cəhd et.',
'tours.walk.visit.notSynced':
'Bu gəzinti günə oflayn əlavə edilib. Sinxronlaşdıqdan sonra dayanacaqlarını qeyd etmək olar.',
'tours.walk.themes': 'Gəzinti mövzusu',
'tours.walk.theme.culture': 'Mədəniyyət və tarix',
'tours.walk.theme.parks': 'Parklar və mənzərələr',
+5 -1
View File
@@ -506,6 +506,8 @@ const tours: TranslationStrings = {
'tours.walk.totalComputed': 'Calculado',
'tours.walk.stations': 'Paradas do passeio',
'tours.walk.stationNumbered': 'Parada {number}',
'tours.walk.stationsUnread':
'Não foi possível carregar as paradas deste passeio. Abra-o de novo com conexão para vê-las e marcá-las.',
'tours.walk.progress': '{visited} de {total} visitadas',
'tours.walk.visit.visited': 'Visitada',
'tours.walk.visit.skip': 'Pular',
@@ -513,7 +515,9 @@ const tours: TranslationStrings = {
'tours.walk.visit.isVisited': 'Visitada neste dia',
'tours.walk.visit.isSkipped': 'Pulada neste dia',
'tours.walk.visit.fromDay': 'Abra o passeio a partir de um dia do plano para marcar as paradas daquele dia.',
'tours.walk.visit.failed': 'Não foi possível marcar a parada. É preciso conexão; tente de novo em instantes.',
'tours.walk.visit.failed': 'Não foi possível marcar a parada. Abra o passeio de novo e tente outra vez.',
'tours.walk.visit.notSynced':
'Este passeio foi colocado no dia sem conexão. As paradas poderão ser marcadas assim que ele for sincronizado.',
'tours.walk.themes': 'Tema do passeio',
'tours.walk.theme.culture': 'Cultura e história',
'tours.walk.theme.parks': 'Parques e vistas',
+5 -1
View File
@@ -507,6 +507,8 @@ const tours: TranslationStrings = {
'tours.walk.totalComputed': 'Calculat',
'tours.walk.stations': 'Parades de la ruta',
'tours.walk.stationNumbered': 'Parada {number}',
'tours.walk.stationsUnread':
"No s'han pogut carregar les parades d'aquesta ruta. Torna a obrir-la amb connexió per veure-les i marcar-les.",
'tours.walk.progress': '{visited} de {total} visitades',
'tours.walk.visit.visited': 'Visitada',
'tours.walk.visit.skip': 'Omet',
@@ -514,7 +516,9 @@ const tours: TranslationStrings = {
'tours.walk.visit.isVisited': 'Visitada aquest dia',
'tours.walk.visit.isSkipped': 'Omesa aquest dia',
'tours.walk.visit.fromDay': "Obre la ruta des d'un dia del pla per marcar-ne les parades d'aquell dia.",
'tours.walk.visit.failed': "No s'ha pogut marcar la parada. Cal connexió; torna-ho a provar d'aquí a una estona.",
'tours.walk.visit.failed': "No s'ha pogut marcar la parada. Torna a obrir la ruta i prova-ho un altre cop.",
'tours.walk.visit.notSynced':
"Aquesta ruta s'ha afegit al dia sense connexió. Podràs marcar-ne les parades quan s'hagi sincronitzat.",
'tours.walk.themes': 'Tema de la ruta',
'tours.walk.theme.culture': 'Cultura i història',
'tours.walk.theme.parks': 'Parcs i vistes',
+5 -1
View File
@@ -497,6 +497,8 @@ const tours: TranslationStrings = {
'tours.walk.totalComputed': 'Vypočteno',
'tours.walk.stations': 'Zastávky procházky',
'tours.walk.stationNumbered': 'Zastávka {number}',
'tours.walk.stationsUnread':
'Zastávky této procházky se nepodařilo načíst. Otevři ji znovu s připojením, pak je uvidíš a půjde je odškrtat.',
'tours.walk.progress': 'Navštíveno {visited} z {total}',
'tours.walk.visit.visited': 'Navštíveno',
'tours.walk.visit.skip': 'Přeskočit',
@@ -504,7 +506,9 @@ const tours: TranslationStrings = {
'tours.walk.visit.isVisited': 'Navštíveno v tento den',
'tours.walk.visit.isSkipped': 'Přeskočeno v tento den',
'tours.walk.visit.fromDay': 'Otevři procházku ze dne v plánu, abys mohl odškrtat zastávky pro ten den.',
'tours.walk.visit.failed': 'Zastávku se nepodařilo označit. Je potřeba připojení; zkus to za chvíli znovu.',
'tours.walk.visit.failed': 'Zastávku se nepodařilo označit. Otevři procházku znovu a zkus to ještě jednou.',
'tours.walk.visit.notSynced':
'Tato procházka byla přidána ke dni offline. Zastávky půjde odškrtat, jakmile se synchronizuje.',
'tours.walk.themes': 'Téma procházky',
'tours.walk.theme.culture': 'Kultura a historie',
'tours.walk.theme.parks': 'Parky a výhledy',
+5 -1
View File
@@ -511,6 +511,8 @@ const tours: TranslationStrings = {
'tours.walk.totalComputed': 'Berechnet',
'tours.walk.stations': 'Stationen',
'tours.walk.stationNumbered': 'Station {number}',
'tours.walk.stationsUnread':
'Die Stationen dieses Walks ließen sich nicht laden. Öffne ihn erneut mit Verbindung, um sie zu sehen und abzuhaken.',
'tours.walk.progress': '{visited} von {total} besucht',
'tours.walk.visit.visited': 'Besucht',
'tours.walk.visit.skip': 'Überspringen',
@@ -519,7 +521,9 @@ const tours: TranslationStrings = {
'tours.walk.visit.isSkipped': 'An diesem Tag übersprungen',
'tours.walk.visit.fromDay': 'Öffne den Walk über einen Tag im Plan, um seine Stationen für diesen Tag abzuhaken.',
'tours.walk.visit.failed':
'Die Station konnte nicht markiert werden. Dafür braucht es eine Verbindung; versuch es gleich noch einmal.',
'Die Station konnte nicht markiert werden. Öffne den Walk erneut und versuch es noch einmal.',
'tours.walk.visit.notSynced':
'Dieser Walk wurde offline auf den Tag gelegt. Seine Stationen lassen sich abhaken, sobald er synchronisiert ist.',
'tours.walk.themes': 'Thema des Walks',
'tours.walk.theme.culture': 'Kultur und Geschichte',
'tours.walk.theme.parks': 'Parks und Aussicht',
+5 -1
View File
@@ -498,6 +498,8 @@ const tours: TranslationStrings = {
'tours.walk.totalComputed': 'Computed',
'tours.walk.stations': 'Stops of the walk',
'tours.walk.stationNumbered': 'Stop {number}',
'tours.walk.stationsUnread':
'The stops of this walk could not be loaded. Open it again while online to see them and check them off.',
'tours.walk.progress': '{visited} of {total} visited',
'tours.walk.visit.visited': 'Mark visited',
'tours.walk.visit.skip': 'Skip',
@@ -505,7 +507,9 @@ const tours: TranslationStrings = {
'tours.walk.visit.isVisited': 'Visited on this day',
'tours.walk.visit.isSkipped': 'Skipped on this day',
'tours.walk.visit.fromDay': 'Open the walk from a day of the plan to check its stops off for that day.',
'tours.walk.visit.failed': 'The stop could not be marked. It needs a connection; try again in a moment.',
'tours.walk.visit.failed': 'The stop could not be marked. Open the walk again and try once more.',
'tours.walk.visit.notSynced':
'This walk was put on the day while offline. Its stops can be checked off once it has synced.',
'tours.walk.themes': 'Walk theme',
'tours.walk.theme.culture': 'Culture and history',
'tours.walk.theme.parks': 'Parks and views',
+5 -1
View File
@@ -505,6 +505,8 @@ const tours: TranslationStrings = {
'tours.walk.totalComputed': 'Calculado',
'tours.walk.stations': 'Paradas del paseo',
'tours.walk.stationNumbered': 'Parada {number}',
'tours.walk.stationsUnread':
'No se pudieron cargar las paradas de este paseo. Vuelve a abrirlo con conexión para verlas y marcarlas.',
'tours.walk.progress': '{visited} de {total} visitadas',
'tours.walk.visit.visited': 'Visitada',
'tours.walk.visit.skip': 'Omitir',
@@ -512,7 +514,9 @@ const tours: TranslationStrings = {
'tours.walk.visit.isVisited': 'Visitada este día',
'tours.walk.visit.isSkipped': 'Omitida este día',
'tours.walk.visit.fromDay': 'Abre el paseo desde un día del plan para marcar sus paradas de ese día.',
'tours.walk.visit.failed': 'No se pudo marcar la parada. Hace falta conexión; inténtalo de nuevo en un momento.',
'tours.walk.visit.failed': 'No se pudo marcar la parada. Vuelve a abrir el paseo e inténtalo otra vez.',
'tours.walk.visit.notSynced':
'Este paseo se añadió al día sin conexión. Podrás marcar sus paradas cuando se haya sincronizado.',
'tours.walk.themes': 'Tema del paseo',
'tours.walk.theme.culture': 'Cultura e historia',
'tours.walk.theme.parks': 'Parques y vistas',
+5 -1
View File
@@ -500,6 +500,8 @@ const tours: TranslationStrings = {
'tours.walk.totalComputed': 'Arvutatud',
'tours.walk.stations': 'Jalutuse peatused',
'tours.walk.stationNumbered': 'Peatus {number}',
'tours.walk.stationsUnread':
'Selle jalutuse peatusi ei õnnestunud laadida. Ava jalutus uuesti võrguühendusega, et neid näha ja ära märkida.',
'tours.walk.progress': '{visited} / {total} külastatud',
'tours.walk.visit.visited': 'Külastatud',
'tours.walk.visit.skip': 'Jäta vahele',
@@ -507,7 +509,9 @@ const tours: TranslationStrings = {
'tours.walk.visit.isVisited': 'Sel päeval külastatud',
'tours.walk.visit.isSkipped': 'Sel päeval vahele jäetud',
'tours.walk.visit.fromDay': 'Ava jalutus plaani päevast, et selle päeva peatused ära märkida.',
'tours.walk.visit.failed': 'Peatust ei õnnestunud märkida. Selleks on vaja ühendust; proovi kohe uuesti.',
'tours.walk.visit.failed': 'Peatust ei õnnestunud märkida. Ava jalutus uuesti ja proovi veel kord.',
'tours.walk.visit.notSynced':
'See jalutus lisati päevale võrguühenduseta. Selle peatusi saab ära märkida, kui see on sünkroonitud.',
'tours.walk.themes': 'Jalutuse teema',
'tours.walk.theme.culture': 'Kultuur ja ajalugu',
'tours.walk.theme.parks': 'Pargid ja vaated',
+5 -1
View File
@@ -515,6 +515,8 @@ const tours: TranslationStrings = {
'tours.walk.totalComputed': 'Calculé',
'tours.walk.stations': 'Étapes de la balade',
'tours.walk.stationNumbered': 'Étape {number}',
'tours.walk.stationsUnread':
"Les étapes de cette balade n'ont pas pu être chargées. Rouvre-la avec une connexion pour les voir et les cocher.",
'tours.walk.progress': '{visited} sur {total} visitées',
'tours.walk.visit.visited': 'Visitée',
'tours.walk.visit.skip': 'Passer',
@@ -522,7 +524,9 @@ const tours: TranslationStrings = {
'tours.walk.visit.isVisited': 'Visitée ce jour-là',
'tours.walk.visit.isSkipped': 'Passée ce jour-là',
'tours.walk.visit.fromDay': 'Ouvre la balade depuis un jour du plan pour cocher ses étapes ce jour-là.',
'tours.walk.visit.failed': "L'étape n'a pas pu être cochée. Il faut une connexion ; réessaie dans un instant.",
'tours.walk.visit.failed': "L'étape n'a pas pu être cochée. Rouvre la balade et réessaie.",
'tours.walk.visit.notSynced':
"Cette balade a été ajoutée au jour hors connexion. Ses étapes pourront être cochées une fois qu'elle sera synchronisée.",
'tours.walk.themes': 'Thème de la balade',
'tours.walk.theme.culture': 'Culture et histoire',
'tours.walk.theme.parks': 'Parcs et points de vue',
+5 -1
View File
@@ -515,6 +515,8 @@ const tours: TranslationStrings = {
'tours.walk.totalComputed': 'Υπολογισμένο',
'tours.walk.stations': 'Στάσεις της βόλτας',
'tours.walk.stationNumbered': 'Στάση {number}',
'tours.walk.stationsUnread':
'Δεν φορτώθηκαν οι στάσεις αυτής της βόλτας. Άνοιξέ την ξανά με σύνδεση για να τις δεις και να τις τσεκάρεις.',
'tours.walk.progress': '{visited} από {total} επισκέψεις',
'tours.walk.visit.visited': 'Επισκέφθηκα',
'tours.walk.visit.skip': 'Παράλειψη',
@@ -522,7 +524,9 @@ const tours: TranslationStrings = {
'tours.walk.visit.isVisited': 'Επισκέφθηκε αυτή τη μέρα',
'tours.walk.visit.isSkipped': 'Παραλείφθηκε αυτή τη μέρα',
'tours.walk.visit.fromDay': 'Άνοιξε τη βόλτα από μια μέρα του πλάνου για να τσεκάρεις τις στάσεις εκείνης της μέρας.',
'tours.walk.visit.failed': 'Η στάση δεν σημειώθηκε. Χρειάζεται σύνδεση· δοκίμασε ξανά σε λίγο.',
'tours.walk.visit.failed': 'Η στάση δεν σημειώθηκε. Άνοιξε ξανά τη βόλτα και δοκίμασε άλλη μία φορά.',
'tours.walk.visit.notSynced':
'Αυτή η βόλτα μπήκε στη μέρα χωρίς σύνδεση. Οι στάσεις της τσεκάρονται μόλις συγχρονιστεί.',
'tours.walk.themes': 'Θέμα βόλτας',
'tours.walk.theme.culture': 'Πολιτισμός και ιστορία',
'tours.walk.theme.parks': 'Πάρκα και θέα',
+5 -1
View File
@@ -507,6 +507,8 @@ const tours: TranslationStrings = {
'tours.walk.totalComputed': 'Számított',
'tours.walk.stations': 'A séta megállói',
'tours.walk.stationNumbered': '{number}. megálló',
'tours.walk.stationsUnread':
'A séta megállóit nem sikerült betölteni. Nyisd meg újra internetkapcsolattal, hogy lásd és kipipálhasd őket.',
'tours.walk.progress': '{total} megállóból {visited} meglátogatva',
'tours.walk.visit.visited': 'Meglátogatva',
'tours.walk.visit.skip': 'Kihagyás',
@@ -514,7 +516,9 @@ const tours: TranslationStrings = {
'tours.walk.visit.isVisited': 'Ezen a napon meglátogatva',
'tours.walk.visit.isSkipped': 'Ezen a napon kihagyva',
'tours.walk.visit.fromDay': 'Nyisd meg a sétát a terv egyik napjáról, hogy arra a napra kipipáld a megállókat.',
'tours.walk.visit.failed': 'A megállót nem sikerült megjelölni. Ehhez kapcsolat kell; próbáld újra kicsit később.',
'tours.walk.visit.failed': 'A megállót nem sikerült megjelölni. Nyisd meg újra a sétát, és próbáld meg még egyszer.',
'tours.walk.visit.notSynced':
'Ezt a sétát offline tetted erre a napra. A megállói a szinkronizálás után pipálhatók ki.',
'tours.walk.themes': 'A séta témája',
'tours.walk.theme.culture': 'Kultúra és történelem',
'tours.walk.theme.parks': 'Parkok és kilátás',
+5 -1
View File
@@ -499,6 +499,8 @@ const tours: TranslationStrings = {
'tours.walk.totalComputed': 'Dihitung',
'tours.walk.stations': 'Titik singgah rute',
'tours.walk.stationNumbered': 'Titik {number}',
'tours.walk.stationsUnread':
'Titik singgah rute ini tidak dapat dimuat. Buka lagi saat online untuk melihat dan mencentangnya.',
'tours.walk.progress': '{visited} dari {total} dikunjungi',
'tours.walk.visit.visited': 'Sudah dikunjungi',
'tours.walk.visit.skip': 'Lewati',
@@ -506,7 +508,9 @@ const tours: TranslationStrings = {
'tours.walk.visit.isVisited': 'Dikunjungi pada hari ini',
'tours.walk.visit.isSkipped': 'Dilewati pada hari ini',
'tours.walk.visit.fromDay': 'Buka rute dari salah satu hari di rencana untuk mencentang titiknya pada hari itu.',
'tours.walk.visit.failed': 'Titik tidak dapat ditandai. Perlu koneksi; coba lagi sebentar lagi.',
'tours.walk.visit.failed': 'Titik tidak dapat ditandai. Buka rute ini lagi lalu coba sekali lagi.',
'tours.walk.visit.notSynced':
'Rute ini ditambahkan ke hari itu saat offline. Titiknya bisa dicentang setelah tersinkron.',
'tours.walk.themes': 'Tema rute',
'tours.walk.theme.culture': 'Budaya dan sejarah',
'tours.walk.theme.parks': 'Taman dan pemandangan',
+5 -1
View File
@@ -506,6 +506,8 @@ const tours: TranslationStrings = {
'tours.walk.totalComputed': 'Calcolato',
'tours.walk.stations': 'Tappe del percorso',
'tours.walk.stationNumbered': 'Tappa {number}',
'tours.walk.stationsUnread':
'Non è stato possibile caricare le tappe di questo percorso. Riaprilo con una connessione per vederle e spuntarle.',
'tours.walk.progress': '{visited} su {total} visitate',
'tours.walk.visit.visited': 'Visitata',
'tours.walk.visit.skip': 'Salta',
@@ -513,7 +515,9 @@ const tours: TranslationStrings = {
'tours.walk.visit.isVisited': 'Visitata in questo giorno',
'tours.walk.visit.isSkipped': 'Saltata in questo giorno',
'tours.walk.visit.fromDay': 'Apri il percorso da un giorno del piano per spuntare le tappe di quel giorno.',
'tours.walk.visit.failed': 'Non è stato possibile segnare la tappa. Serve una connessione; riprova tra poco.',
'tours.walk.visit.failed': 'Non è stato possibile segnare la tappa. Riapri il percorso e riprova.',
'tours.walk.visit.notSynced':
'Questo percorso è stato aggiunto al giorno offline. Potrai spuntarne le tappe appena sarà sincronizzato.',
'tours.walk.themes': 'Tema del percorso',
'tours.walk.theme.culture': 'Cultura e storia',
'tours.walk.theme.parks': 'Parchi e panorami',
+5 -2
View File
@@ -491,6 +491,8 @@ const tours: TranslationStrings = {
'tours.walk.totalComputed': '計算値',
'tours.walk.stations': '立ち寄り先',
'tours.walk.stationNumbered': '立ち寄り先 {number}',
'tours.walk.stationsUnread':
'この街歩きの立ち寄り先を読み込めませんでした。オンラインの状態で開き直すと、表示してチェックできます。',
'tours.walk.progress': '{total} 件中 {visited} 件訪問済み',
'tours.walk.visit.visited': '訪問済み',
'tours.walk.visit.skip': 'スキップ',
@@ -498,8 +500,9 @@ const tours: TranslationStrings = {
'tours.walk.visit.isVisited': 'この日に訪問済み',
'tours.walk.visit.isSkipped': 'この日はスキップ',
'tours.walk.visit.fromDay': '計画の日から開くと、その日の立ち寄り先をチェックできます。',
'tours.walk.visit.failed':
'立ち寄り先をチェックできませんでした。接続が必要です。少ししてからもう一度お試しください。',
'tours.walk.visit.failed': '立ち寄り先をチェックできませんでした。街歩きを開き直して、もう一度お試しください。',
'tours.walk.visit.notSynced':
'この街歩きはオフラインでこの日に追加されました。同期が済むと立ち寄り先をチェックできます。',
'tours.walk.themes': '散策のテーマ',
'tours.walk.theme.culture': '文化と歴史',
'tours.walk.theme.parks': '公園と眺望',
+5 -1
View File
@@ -487,6 +487,8 @@ const tours: TranslationStrings = {
'tours.walk.totalComputed': '계산값',
'tours.walk.stations': '산책 정류지',
'tours.walk.stationNumbered': '정류지 {number}',
'tours.walk.stationsUnread':
'이 산책의 정류지를 불러오지 못했습니다. 온라인 상태에서 다시 열면 정류지를 보고 체크할 수 있습니다.',
'tours.walk.progress': '{total}곳 중 {visited}곳 방문',
'tours.walk.visit.visited': '방문함',
'tours.walk.visit.skip': '건너뛰기',
@@ -494,7 +496,9 @@ const tours: TranslationStrings = {
'tours.walk.visit.isVisited': '이날 방문함',
'tours.walk.visit.isSkipped': '이날 건너뜀',
'tours.walk.visit.fromDay': '계획의 날짜에서 열면 그날의 정류지를 체크할 수 있습니다.',
'tours.walk.visit.failed': '정류지를 표시하지 못했습니다. 연결이 필요하니 잠시 후 다시 시도하세요.',
'tours.walk.visit.failed': '정류지를 표시하지 못했습니다. 산책을 다시 열고 한 번 더 시도하세요.',
'tours.walk.visit.notSynced':
'이 산책은 오프라인 상태에서 이 날에 추가되었습니다. 동기화되면 정류지를 체크할 수 있습니다.',
'tours.walk.themes': '산책 테마',
'tours.walk.theme.culture': '문화와 역사',
'tours.walk.theme.parks': '공원과 전망',
+5 -2
View File
@@ -509,6 +509,8 @@ const tours: TranslationStrings = {
'tours.walk.totalComputed': 'Berekend',
'tours.walk.stations': 'Haltes van de wandeling',
'tours.walk.stationNumbered': 'Halte {number}',
'tours.walk.stationsUnread':
'De haltes van deze wandeling konden niet worden geladen. Open hem opnieuw met verbinding om ze te zien en af te vinken.',
'tours.walk.progress': '{visited} van {total} bezocht',
'tours.walk.visit.visited': 'Bezocht',
'tours.walk.visit.skip': 'Overslaan',
@@ -516,8 +518,9 @@ const tours: TranslationStrings = {
'tours.walk.visit.isVisited': 'Op deze dag bezocht',
'tours.walk.visit.isSkipped': 'Op deze dag overgeslagen',
'tours.walk.visit.fromDay': 'Open de wandeling vanuit een dag in het plan om de haltes voor die dag af te vinken.',
'tours.walk.visit.failed':
'De halte kon niet worden gemarkeerd. Daar is verbinding voor nodig; probeer het zo opnieuw.',
'tours.walk.visit.failed': 'De halte kon niet worden gemarkeerd. Open de wandeling opnieuw en probeer het nog eens.',
'tours.walk.visit.notSynced':
'Deze wandeling is offline aan de dag toegevoegd. De haltes kun je afvinken zodra ze gesynchroniseerd is.',
'tours.walk.themes': 'Thema van de wandeling',
'tours.walk.theme.culture': 'Cultuur en geschiedenis',
'tours.walk.theme.parks': 'Parken en uitzicht',
+5 -1
View File
@@ -514,6 +514,8 @@ const tours: TranslationStrings = {
'tours.walk.totalComputed': 'Obliczono',
'tours.walk.stations': 'Przystanki trasy',
'tours.walk.stationNumbered': 'Przystanek {number}',
'tours.walk.stationsUnread':
'Nie udało się wczytać przystanków tej trasy. Otwórz ją ponownie z połączeniem, aby je zobaczyć i odhaczyć.',
'tours.walk.progress': 'Odwiedzono {visited} z {total}',
'tours.walk.visit.visited': 'Odwiedzony',
'tours.walk.visit.skip': 'Pomiń',
@@ -521,7 +523,9 @@ const tours: TranslationStrings = {
'tours.walk.visit.isVisited': 'Odwiedzony tego dnia',
'tours.walk.visit.isSkipped': 'Pominięty tego dnia',
'tours.walk.visit.fromDay': 'Otwórz trasę z dnia w planie, aby odhaczyć przystanki na ten dzień.',
'tours.walk.visit.failed': 'Nie udało się oznaczyć przystanku. Potrzebne jest połączenie; spróbuj za chwilę.',
'tours.walk.visit.failed': 'Nie udało się oznaczyć przystanku. Otwórz trasę ponownie i spróbuj jeszcze raz.',
'tours.walk.visit.notSynced':
'Ta trasa została dodana do dnia offline. Przystanki będzie można odhaczyć, gdy się zsynchronizuje.',
'tours.walk.themes': 'Motyw trasy',
'tours.walk.theme.culture': 'Kultura i historia',
'tours.walk.theme.parks': 'Parki i widoki',
+5 -1
View File
@@ -517,6 +517,8 @@ const tours: TranslationStrings = {
'tours.walk.totalComputed': 'Расчёт',
'tours.walk.stations': 'Остановки прогулки',
'tours.walk.stationNumbered': 'Остановка {number}',
'tours.walk.stationsUnread':
'Не удалось загрузить остановки этой прогулки. Открой её снова при подключении к сети, чтобы увидеть и отметить их.',
'tours.walk.progress': 'Посещено {visited} из {total}',
'tours.walk.visit.visited': 'Посещено',
'tours.walk.visit.skip': 'Пропустить',
@@ -524,7 +526,9 @@ const tours: TranslationStrings = {
'tours.walk.visit.isVisited': 'Посещена в этот день',
'tours.walk.visit.isSkipped': 'Пропущена в этот день',
'tours.walk.visit.fromDay': 'Открой прогулку из дня в плане, чтобы отмечать остановки за этот день.',
'tours.walk.visit.failed': 'Не удалось отметить остановку. Нужна связь; попробуй чуть позже.',
'tours.walk.visit.failed': 'Не удалось отметить остановку. Открой прогулку заново и попробуй ещё раз.',
'tours.walk.visit.notSynced':
'Эта прогулка добавлена в день без сети. Остановки можно будет отмечать, когда она синхронизируется.',
'tours.walk.themes': 'Тема прогулки',
'tours.walk.theme.culture': 'Культура и история',
'tours.walk.theme.parks': 'Парки и виды',
+5 -1
View File
@@ -499,6 +499,8 @@ const tours: TranslationStrings = {
'tours.walk.totalComputed': 'Vypočítané',
'tours.walk.stations': 'Zastávky prechádzky',
'tours.walk.stationNumbered': 'Zastávka {number}',
'tours.walk.stationsUnread':
'Zastávky tejto prechádzky sa nepodarilo načítať. Otvor ju znova s pripojením, potom ich uvidíš a pôjde ich odškrtnúť.',
'tours.walk.progress': 'Navštívené {visited} z {total}',
'tours.walk.visit.visited': 'Navštívené',
'tours.walk.visit.skip': 'Preskočiť',
@@ -506,7 +508,9 @@ const tours: TranslationStrings = {
'tours.walk.visit.isVisited': 'Navštívené v tento deň',
'tours.walk.visit.isSkipped': 'Preskočené v tento deň',
'tours.walk.visit.fromDay': 'Otvor prechádzku z dňa v pláne, aby si odškrtol zastávky na ten deň.',
'tours.walk.visit.failed': 'Zastávku sa nepodarilo označiť. Je potrebné pripojenie; skús to o chvíľu znova.',
'tours.walk.visit.failed': 'Zastávku sa nepodarilo označiť. Otvor prechádzku znova a skús to ešte raz.',
'tours.walk.visit.notSynced':
'Táto prechádzka bola pridaná k dňu offline. Zastávky pôjde odškrtnúť, keď sa zosynchronizuje.',
'tours.walk.themes': 'Téma prechádzky',
'tours.walk.theme.culture': 'Kultúra a história',
'tours.walk.theme.parks': 'Parky a výhľady',
+5 -1
View File
@@ -498,6 +498,8 @@ const tours: TranslationStrings = {
'tours.walk.totalComputed': 'Beräknad',
'tours.walk.stations': 'Promenadens stopp',
'tours.walk.stationNumbered': 'Stopp {number}',
'tours.walk.stationsUnread':
'Promenadens stopp kunde inte läsas in. Öppna den igen med uppkoppling för att se dem och bocka av dem.',
'tours.walk.progress': '{visited} av {total} besökta',
'tours.walk.visit.visited': 'Besökt',
'tours.walk.visit.skip': 'Hoppa över',
@@ -505,7 +507,9 @@ const tours: TranslationStrings = {
'tours.walk.visit.isVisited': 'Besökt den här dagen',
'tours.walk.visit.isSkipped': 'Överhoppad den här dagen',
'tours.walk.visit.fromDay': 'Öppna promenaden från en dag i planen för att bocka av stoppen den dagen.',
'tours.walk.visit.failed': 'Stoppet kunde inte markeras. Det kräver en anslutning; försök igen om en stund.',
'tours.walk.visit.failed': 'Stoppet kunde inte markeras. Öppna promenaden igen och försök en gång till.',
'tours.walk.visit.notSynced':
'Den här promenaden lades till dagen offline. Stoppen kan bockas av när den har synkats.',
'tours.walk.themes': 'Promenadens tema',
'tours.walk.theme.culture': 'Kultur och historia',
'tours.walk.theme.parks': 'Parker och utsikter',
+3 -1
View File
@@ -481,6 +481,7 @@ const tours: TranslationStrings = {
'tours.walk.totalComputed': 'ค่าคำนวณ',
'tours.walk.stations': 'จุดแวะของทริป',
'tours.walk.stationNumbered': 'จุดแวะที่ {number}',
'tours.walk.stationsUnread': 'โหลดจุดแวะของทริปนี้ไม่ได้ เปิดทริปอีกครั้งขณะออนไลน์เพื่อดูและติ๊กจุดแวะ',
'tours.walk.progress': 'แวะแล้ว {visited} จาก {total}',
'tours.walk.visit.visited': 'แวะแล้ว',
'tours.walk.visit.skip': 'ข้าม',
@@ -488,7 +489,8 @@ const tours: TranslationStrings = {
'tours.walk.visit.isVisited': 'แวะแล้วในวันนี้',
'tours.walk.visit.isSkipped': 'ข้ามไปในวันนี้',
'tours.walk.visit.fromDay': 'เปิดทริปจากวันในแผนเพื่อติ๊กจุดแวะของวันนั้น',
'tours.walk.visit.failed': 'ทำเครื่องหมายจุดแวะไม่ได้ ต้องมีการเชื่อมต่อ ลองใหม่อีกครั้งในอีกสักครู่',
'tours.walk.visit.failed': 'ทำเครื่องหมายจุดแวะไม่ได้ เปิดทริปอีกครั้งแล้วลองใหม่',
'tours.walk.visit.notSynced': 'ทริปนี้ถูกเพิ่มลงในวันนั้นขณะออฟไลน์ ติ๊กจุดแวะได้เมื่อซิงค์เสร็จแล้ว',
'tours.walk.themes': 'ธีมของทริป',
'tours.walk.theme.culture': 'วัฒนธรรมและประวัติศาสตร์',
'tours.walk.theme.parks': 'สวนและจุดชมวิว',
+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 = 769;
const GENERAL_KEY_COUNT = 771;
function literalKeys(source: string): string[] {
const tree = ts.createSourceFile('locale.ts', source, ts.ScriptTarget.Latest, true);
+5 -1
View File
@@ -501,6 +501,8 @@ const tours: TranslationStrings = {
'tours.walk.totalComputed': 'Hesaplanan',
'tours.walk.stations': 'Yürüyüşün durakları',
'tours.walk.stationNumbered': 'Durak {number}',
'tours.walk.stationsUnread':
'Bu yürüyüşün durakları yüklenemedi. Görmek ve işaretlemek için yürüyüşü bağlantı varken yeniden aç.',
'tours.walk.progress': '{total} duraktan {visited} ziyaret edildi',
'tours.walk.visit.visited': 'Ziyaret edildi',
'tours.walk.visit.skip': 'Atla',
@@ -508,7 +510,9 @@ const tours: TranslationStrings = {
'tours.walk.visit.isVisited': 'Bu gün ziyaret edildi',
'tours.walk.visit.isSkipped': 'Bu gün atlandı',
'tours.walk.visit.fromDay': 'Duraklarını o gün için işaretlemek için yürüyüşü plandaki bir günden aç.',
'tours.walk.visit.failed': 'Durak işaretlenemedi. Bunun için bağlantı gerekir; birazdan yeniden dene.',
'tours.walk.visit.failed': 'Durak işaretlenemedi. Yürüyüşü yeniden aç ve bir kez daha dene.',
'tours.walk.visit.notSynced':
'Bu yürüyüş güne çevrimdışıyken eklendi. Durakları eşitlendikten sonra işaretlenebilir.',
'tours.walk.themes': 'Yürüyüş teması',
'tours.walk.theme.culture': 'Kültür ve tarih',
'tours.walk.theme.parks': 'Parklar ve manzaralar',
+5 -1
View File
@@ -513,6 +513,8 @@ const tours: TranslationStrings = {
'tours.walk.totalComputed': 'Розрахунок',
'tours.walk.stations': 'Зупинки прогулянки',
'tours.walk.stationNumbered': 'Зупинка {number}',
'tours.walk.stationsUnread':
'Не вдалося завантажити зупинки цієї прогулянки. Відкрий її знову з мережею, щоб побачити й відмітити їх.',
'tours.walk.progress': 'Відвідано {visited} з {total}',
'tours.walk.visit.visited': 'Відвідано',
'tours.walk.visit.skip': 'Пропустити',
@@ -520,7 +522,9 @@ const tours: TranslationStrings = {
'tours.walk.visit.isVisited': 'Відвідано цього дня',
'tours.walk.visit.isSkipped': 'Пропущено цього дня',
'tours.walk.visit.fromDay': 'Відкрий прогулянку з дня в плані, щоб відмічати зупинки на цей день.',
'tours.walk.visit.failed': "Не вдалося позначити зупинку. Потрібне з'єднання; спробуй трохи згодом.",
'tours.walk.visit.failed': 'Не вдалося позначити зупинку. Відкрий прогулянку знову й спробуй ще раз.',
'tours.walk.visit.notSynced':
'Цю прогулянку додано до дня без мережі. Зупинки можна буде відмічати, щойно вона синхронізується.',
'tours.walk.themes': 'Тема прогулянки',
'tours.walk.theme.culture': 'Культура та історія',
'tours.walk.theme.parks': 'Парки та краєвиди',
+5 -1
View File
@@ -498,6 +498,8 @@ const tours: TranslationStrings = {
'tours.walk.totalComputed': 'Đã tính',
'tours.walk.stations': 'Các điểm dừng',
'tours.walk.stationNumbered': 'Điểm dừng {number}',
'tours.walk.stationsUnread':
'Không tải được các điểm dừng của lộ trình này. Hãy mở lại khi có kết nối để xem và đánh dấu chúng.',
'tours.walk.progress': 'Đã ghé {visited}/{total}',
'tours.walk.visit.visited': 'Đã ghé',
'tours.walk.visit.skip': 'Bỏ qua',
@@ -505,7 +507,9 @@ const tours: TranslationStrings = {
'tours.walk.visit.isVisited': 'Đã ghé trong ngày này',
'tours.walk.visit.isSkipped': 'Đã bỏ qua trong ngày này',
'tours.walk.visit.fromDay': 'Mở lộ trình từ một ngày trong kế hoạch để đánh dấu các điểm dừng của ngày đó.',
'tours.walk.visit.failed': 'Không thể đánh dấu điểm dừng. Cần có kết nối; hãy thử lại sau giây lát.',
'tours.walk.visit.failed': 'Không thể đánh dấu điểm dừng. Hãy mở lại lộ trình và thử thêm lần nữa.',
'tours.walk.visit.notSynced':
'Lộ trình này được thêm vào ngày khi đang ngoại tuyến. Có thể đánh dấu các điểm dừng sau khi đã đồng bộ.',
'tours.walk.themes': 'Chủ đề lộ trình',
'tours.walk.theme.culture': 'Văn hóa và lịch sử',
'tours.walk.theme.parks': 'Công viên và cảnh đẹp',
+3 -1
View File
@@ -466,6 +466,7 @@ const tours: TranslationStrings = {
'tours.walk.totalComputed': '計算值',
'tours.walk.stations': '漫步站點',
'tours.walk.stationNumbered': '第 {number} 站',
'tours.walk.stationsUnread': '無法載入這次漫步的站點。請在連網時重新開啟,即可查看並勾選。',
'tours.walk.progress': '已到訪 {visited}/{total}',
'tours.walk.visit.visited': '已到訪',
'tours.walk.visit.skip': '略過',
@@ -473,7 +474,8 @@ const tours: TranslationStrings = {
'tours.walk.visit.isVisited': '當天已到訪',
'tours.walk.visit.isSkipped': '當天已略過',
'tours.walk.visit.fromDay': '從計畫中的某一天打開漫步,即可勾選當天的站點。',
'tours.walk.visit.failed': '無法標記該站點。需要網路連線,請稍後再試。',
'tours.walk.visit.failed': '無法標記該站點。請重新開啟漫步再試一次。',
'tours.walk.visit.notSynced': '這次漫步是在離線時加入當天的,同步完成後即可勾選站點。',
'tours.walk.themes': '漫步主題',
'tours.walk.theme.culture': '文化與歷史',
'tours.walk.theme.parks': '公園與景觀',
+3 -1
View File
@@ -467,6 +467,7 @@ const tours: TranslationStrings = {
'tours.walk.totalComputed': '计算值',
'tours.walk.stations': '漫步站点',
'tours.walk.stationNumbered': '第 {number} 站',
'tours.walk.stationsUnread': '无法加载这次漫步的站点。请在联网时重新打开,即可查看并勾选。',
'tours.walk.progress': '已到访 {visited}/{total}',
'tours.walk.visit.visited': '已到访',
'tours.walk.visit.skip': '跳过',
@@ -474,7 +475,8 @@ const tours: TranslationStrings = {
'tours.walk.visit.isVisited': '当天已到访',
'tours.walk.visit.isSkipped': '当天已跳过',
'tours.walk.visit.fromDay': '从计划中的某一天打开漫步,即可勾选当天的站点。',
'tours.walk.visit.failed': '无法标记该站点。需要网络连接,请稍后再试。',
'tours.walk.visit.failed': '无法标记该站点。请重新打开漫步再试一次。',
'tours.walk.visit.notSynced': '这次漫步是在离线时加入当天的,同步完成后即可勾选站点。',
'tours.walk.themes': '漫步主题',
'tours.walk.theme.culture': '文化与历史',
'tours.walk.theme.parks': '公园与景观',