feat(planner): open places and day routes in CoMaps

Add CoMaps, the offline OpenStreetMap navigator, alongside the existing
map integrations. A geolocated place gains a CoMaps entry in its
navigation menu, and a day's route toolbar gains a button that hands the
day's bookended stops to CoMaps in that day's travel mode.

CoMaps' route link carries only a start and a destination, so a two-stop
day goes as a route and a longer one as named pins rather than silently
losing the stops in between. Links use the https form so a device without
CoMaps installed lands on comaps.at instead of a dead scheme.

The hotel-bookend logic behind the Google Maps export was duplicated
between desktop and mobile; both now share dayExportStops so the two
links cannot disagree about which hotel legs are real.

Addresses discussion #1904
This commit is contained in:
Konstantinos Thermos
2026-08-14 10:24:14 +03:00
parent 813b9886b3
commit 8065af28ef
59 changed files with 429 additions and 52 deletions
+1
View File
@@ -16,6 +16,7 @@ const mobileTrip: TranslationStrings = {
'mobileTrip.filesNext': 'الملف التالي',
'mobileTrip.filesPrev': 'الملف السابق',
'mobileTrip.googleMaps': 'Google Maps',
'mobileTrip.coMaps': 'CoMaps',
'mobileTrip.icsDownload': 'تنزيل .ics',
'mobileTrip.icsSubscribe': 'الاشتراك في التقويم',
'mobileTrip.icsSubscribeSub': 'تحديث تلقائي في تطبيق التقويم لديك',
+1
View File
@@ -47,6 +47,7 @@ const planner: TranslationStrings = {
'planner.route': 'المسار',
'planner.optimize': 'تحسين',
'planner.openGoogleMaps': 'فتح في Google Maps',
'planner.openCoMaps': 'فتح في CoMaps',
'planner.selectDayHint': 'اختر يومًا من القائمة اليسرى لعرض خطة اليوم',
'planner.noPlacesForDay': 'لا توجد أماكن لهذا اليوم بعد',
'planner.addPlacesLink': 'إضافة أماكن ←',
+1
View File
@@ -16,6 +16,7 @@ const mobileTrip: TranslationStrings = {
'mobileTrip.filesNext': 'Próximo arquivo',
'mobileTrip.filesPrev': 'Arquivo anterior',
'mobileTrip.googleMaps': 'Google Maps',
'mobileTrip.coMaps': 'CoMaps',
'mobileTrip.icsDownload': 'Baixar .ics',
'mobileTrip.icsSubscribe': 'Assinar calendário',
'mobileTrip.icsSubscribeSub': 'Atualiza automaticamente no seu app de calendário',
+1
View File
@@ -47,6 +47,7 @@ const planner: TranslationStrings = {
'planner.route': 'Rota',
'planner.optimize': 'Otimizar',
'planner.openGoogleMaps': 'Abrir no Google Maps',
'planner.openCoMaps': 'Abrir no CoMaps',
'planner.selectDayHint': 'Selecione um dia na lista à esquerda para ver o plano do dia',
'planner.noPlacesForDay': 'Nenhum lugar neste dia ainda',
'planner.addPlacesLink': 'Adicionar lugares →',
+1
View File
@@ -16,6 +16,7 @@ const mobileTrip: TranslationStrings = {
'mobileTrip.filesNext': 'Fitxer següent',
'mobileTrip.filesPrev': 'Fitxer anterior',
'mobileTrip.googleMaps': 'Google Maps',
'mobileTrip.coMaps': 'CoMaps',
'mobileTrip.icsDownload': 'Baixa .ics',
'mobileTrip.icsSubscribe': 'Subscriu-te al calendari',
'mobileTrip.icsSubscribeSub': "S'actualitza automàticament a la teva app de calendari",
+1
View File
@@ -48,6 +48,7 @@ const planner: TranslationStrings = {
'planner.route': 'Ruta',
'planner.optimize': 'Optimitza',
'planner.openGoogleMaps': 'Obre a Google Maps',
'planner.openCoMaps': 'Obre a CoMaps',
'planner.selectDayHint': "Selecciona un dia de la llista de l'esquerra per veure el seu pla",
'planner.noPlacesForDay': 'Encara no hi ha llocs per a aquest dia',
'planner.addPlacesLink': 'Afegeix llocs →',
+1
View File
@@ -16,6 +16,7 @@ const mobileTrip: TranslationStrings = {
'mobileTrip.filesNext': 'Další soubor',
'mobileTrip.filesPrev': 'Předchozí soubor',
'mobileTrip.googleMaps': 'Google Maps',
'mobileTrip.coMaps': 'CoMaps',
'mobileTrip.icsDownload': 'Stáhnout .ics',
'mobileTrip.icsSubscribe': 'Přihlásit se k odběru kalendáře',
'mobileTrip.icsSubscribeSub': 'Automaticky se aktualizuje ve vaší kalendářové aplikaci',
+1
View File
@@ -47,6 +47,7 @@ const planner: TranslationStrings = {
'planner.route': 'Trasa',
'planner.optimize': 'Optimalizovat',
'planner.openGoogleMaps': 'Otevřít v Google Mapách',
'planner.openCoMaps': 'Otevřít v CoMaps',
'planner.selectDayHint': 'Vyberte den ze seznamu vlevo pro zobrazení denního plánu',
'planner.noPlacesForDay': 'Zatím žádná místa pro tento den',
'planner.addPlacesLink': 'Přidat místa →',
+1
View File
@@ -16,6 +16,7 @@ const mobileTrip: TranslationStrings = {
'mobileTrip.filesNext': 'Nächste Datei',
'mobileTrip.filesPrev': 'Vorherige Datei',
'mobileTrip.googleMaps': 'Google Maps',
'mobileTrip.coMaps': 'CoMaps',
'mobileTrip.icsDownload': '.ics herunterladen',
'mobileTrip.icsSubscribe': 'Kalender abonnieren',
'mobileTrip.icsSubscribeSub': 'Aktualisiert sich automatisch in deiner Kalender-App',
+1
View File
@@ -47,6 +47,7 @@ const planner: TranslationStrings = {
'planner.route': 'Route',
'planner.optimize': 'Optimieren',
'planner.openGoogleMaps': 'In Google Maps öffnen',
'planner.openCoMaps': 'In CoMaps öffnen',
'planner.selectDayHint': 'Wähle einen Tag aus der linken Liste um den Tagesplan zu sehen',
'planner.noPlacesForDay': 'Noch keine Orte für diesen Tag',
'planner.addPlacesLink': 'Orte hinzufügen →',
+1
View File
@@ -16,6 +16,7 @@ const mobileTrip: TranslationStrings = {
'mobileTrip.filesNext': 'Next file',
'mobileTrip.filesPrev': 'Previous file',
'mobileTrip.googleMaps': 'Google Maps',
'mobileTrip.coMaps': 'CoMaps',
'mobileTrip.icsDownload': 'Download .ics',
'mobileTrip.icsSubscribe': 'Subscribe to calendar',
'mobileTrip.icsSubscribeSub': 'Auto-updates in your calendar app',
+1
View File
@@ -47,6 +47,7 @@ const planner: TranslationStrings = {
'planner.route': 'Route',
'planner.optimize': 'Optimize',
'planner.openGoogleMaps': 'Open in Google Maps',
'planner.openCoMaps': 'Open in CoMaps',
'planner.selectDayHint': 'Select a day from the left list to see the day plan',
'planner.noPlacesForDay': 'No places for this day yet',
'planner.addPlacesLink': 'Add places →',
+1
View File
@@ -16,6 +16,7 @@ const mobileTrip: TranslationStrings = {
'mobileTrip.filesNext': 'Archivo siguiente',
'mobileTrip.filesPrev': 'Archivo anterior',
'mobileTrip.googleMaps': 'Google Maps',
'mobileTrip.coMaps': 'CoMaps',
'mobileTrip.icsDownload': 'Descargar .ics',
'mobileTrip.icsSubscribe': 'Suscribirse al calendario',
'mobileTrip.icsSubscribeSub': 'Se actualiza automáticamente en tu app de calendario',
+1
View File
@@ -48,6 +48,7 @@ const planner: TranslationStrings = {
'planner.route': 'Ruta',
'planner.optimize': 'Optimizar',
'planner.openGoogleMaps': 'Abrir en Google Maps',
'planner.openCoMaps': 'Abrir en CoMaps',
'planner.selectDayHint': 'Selecciona un día de la lista izquierda para ver su plan',
'planner.noPlacesForDay': 'Aún no hay lugares para este día',
'planner.addPlacesLink': 'Añadir lugares →',
+1
View File
@@ -16,6 +16,7 @@ const mobileTrip: TranslationStrings = {
'mobileTrip.filesNext': 'Fichier suivant',
'mobileTrip.filesPrev': 'Fichier précédent',
'mobileTrip.googleMaps': 'Google Maps',
'mobileTrip.coMaps': 'CoMaps',
'mobileTrip.icsDownload': 'Télécharger le .ics',
'mobileTrip.icsSubscribe': "S'abonner au calendrier",
'mobileTrip.icsSubscribeSub': 'Se met à jour automatiquement dans votre application calendrier',
+1
View File
@@ -47,6 +47,7 @@ const planner: TranslationStrings = {
'planner.route': 'Itinéraire',
'planner.optimize': 'Optimiser',
'planner.openGoogleMaps': 'Ouvrir dans Google Maps',
'planner.openCoMaps': 'Ouvrir dans CoMaps',
'planner.selectDayHint': 'Sélectionnez un jour dans la liste de gauche pour voir le plan du jour',
'planner.noPlacesForDay': 'Aucun lieu pour ce jour',
'planner.addPlacesLink': 'Ajouter des lieux →',
+1
View File
@@ -16,6 +16,7 @@ const mobileTrip: TranslationStrings = {
'mobileTrip.filesNext': 'Επόμενο αρχείο',
'mobileTrip.filesPrev': 'Προηγούμενο αρχείο',
'mobileTrip.googleMaps': 'Google Maps',
'mobileTrip.coMaps': 'CoMaps',
'mobileTrip.icsDownload': 'Λήψη .ics',
'mobileTrip.icsSubscribe': 'Εγγραφή στο ημερολόγιο',
'mobileTrip.icsSubscribeSub': 'Ενημερώνεται αυτόματα στην εφαρμογή ημερολογίου σας',
+1
View File
@@ -48,6 +48,7 @@ const planner: TranslationStrings = {
'planner.route': 'Διαδρομή',
'planner.optimize': 'Βελτιστοποίηση',
'planner.openGoogleMaps': 'Άνοιγμα στο Google Maps',
'planner.openCoMaps': 'Άνοιγμα στο CoMaps',
'planner.selectDayHint': 'Επιλέξτε μια ημέρα από την αριστερή λίστα για να δείτε το πρόγραμμα',
'planner.noPlacesForDay': 'Δεν υπάρχουν τοποθεσίες για αυτή την ημέρα ακόμη',
'planner.addPlacesLink': 'Προσθήκη τοποθεσιών \u2192',
+1
View File
@@ -16,6 +16,7 @@ const mobileTrip: TranslationStrings = {
'mobileTrip.filesNext': 'Következő fájl',
'mobileTrip.filesPrev': 'Előző fájl',
'mobileTrip.googleMaps': 'Google Maps',
'mobileTrip.coMaps': 'CoMaps',
'mobileTrip.icsDownload': '.ics letöltése',
'mobileTrip.icsSubscribe': 'Feliratkozás a naptárra',
'mobileTrip.icsSubscribeSub': 'Automatikusan frissül a naptáralkalmazásodban',
+1
View File
@@ -47,6 +47,7 @@ const planner: TranslationStrings = {
'planner.route': 'Útvonal',
'planner.optimize': 'Optimalizálás',
'planner.openGoogleMaps': 'Megnyitás a Google Térképben',
'planner.openCoMaps': 'Megnyitás a CoMaps-ben',
'planner.selectDayHint': 'Válassz egy napot a bal oldali listából a napi terv megtekintéséhez',
'planner.noPlacesForDay': 'Még nincsenek helyek erre a napra',
'planner.addPlacesLink': 'Helyek hozzáadása →',
+1
View File
@@ -16,6 +16,7 @@ const mobileTrip: TranslationStrings = {
'mobileTrip.filesNext': 'File berikutnya',
'mobileTrip.filesPrev': 'File sebelumnya',
'mobileTrip.googleMaps': 'Google Maps',
'mobileTrip.coMaps': 'CoMaps',
'mobileTrip.icsDownload': 'Unduh .ics',
'mobileTrip.icsSubscribe': 'Berlangganan kalender',
'mobileTrip.icsSubscribeSub': 'Otomatis diperbarui di aplikasi kalender kamu',
+1
View File
@@ -48,6 +48,7 @@ const planner: TranslationStrings = {
'planner.route': 'Rute',
'planner.optimize': 'Optimalkan',
'planner.openGoogleMaps': 'Buka di Google Maps',
'planner.openCoMaps': 'Buka di CoMaps',
'planner.selectDayHint': 'Pilih hari dari daftar kiri untuk melihat rencana hari',
'planner.noPlacesForDay': 'Belum ada tempat untuk hari ini',
'planner.addPlacesLink': 'Tambah tempat →',
+1
View File
@@ -16,6 +16,7 @@ const mobileTrip: TranslationStrings = {
'mobileTrip.filesNext': 'File successivo',
'mobileTrip.filesPrev': 'File precedente',
'mobileTrip.googleMaps': 'Google Maps',
'mobileTrip.coMaps': 'CoMaps',
'mobileTrip.icsDownload': 'Scarica .ics',
'mobileTrip.icsSubscribe': 'Abbonati al calendario',
'mobileTrip.icsSubscribeSub': 'Si aggiorna automaticamente nella tua app calendario',
+1
View File
@@ -47,6 +47,7 @@ const planner: TranslationStrings = {
'planner.route': 'Percorso',
'planner.optimize': 'Ottimizza',
'planner.openGoogleMaps': 'Apri in Google Maps',
'planner.openCoMaps': 'Apri in CoMaps',
'planner.selectDayHint': "Seleziona un giorno dall'elenco a sinistra per vedere il programma",
'planner.noPlacesForDay': 'Ancora nessun luogo per questo giorno',
'planner.addPlacesLink': 'Aggiungi luoghi →',
+1
View File
@@ -16,6 +16,7 @@ const mobileTrip: TranslationStrings = {
'mobileTrip.filesNext': '次のファイル',
'mobileTrip.filesPrev': '前のファイル',
'mobileTrip.googleMaps': 'Google Maps',
'mobileTrip.coMaps': 'CoMaps',
'mobileTrip.icsDownload': '.ics をダウンロード',
'mobileTrip.icsSubscribe': 'カレンダーを購読',
'mobileTrip.icsSubscribeSub': 'カレンダーアプリで自動的に更新されます',
+1
View File
@@ -47,6 +47,7 @@ const planner: TranslationStrings = {
'planner.route': 'ルート',
'planner.optimize': '最適化',
'planner.openGoogleMaps': 'Googleマップで開く',
'planner.openCoMaps': 'CoMapsで開く',
'planner.selectDayHint': '左の一覧から日を選択すると、日別計画が表示されます',
'planner.noPlacesForDay': 'この日の場所はまだありません',
'planner.addPlacesLink': '場所を追加 →',
+1
View File
@@ -16,6 +16,7 @@ const mobileTrip: TranslationStrings = {
'mobileTrip.filesNext': '다음 파일',
'mobileTrip.filesPrev': '이전 파일',
'mobileTrip.googleMaps': 'Google Maps',
'mobileTrip.coMaps': 'CoMaps',
'mobileTrip.icsDownload': '.ics 다운로드',
'mobileTrip.icsSubscribe': '캘린더 구독',
'mobileTrip.icsSubscribeSub': '캘린더 앱에서 자동으로 업데이트됩니다',
+1
View File
@@ -47,6 +47,7 @@ const planner: TranslationStrings = {
'planner.route': '경로',
'planner.optimize': '최적화',
'planner.openGoogleMaps': 'Google Maps에서 열기',
'planner.openCoMaps': 'CoMaps에서 열기',
'planner.selectDayHint': '왼쪽 목록에서 날을 선택하여 일별 계획을 보세요',
'planner.noPlacesForDay': '이 날에 아직 장소가 없습니다',
'planner.addPlacesLink': '장소 추가 →',
+1
View File
@@ -16,6 +16,7 @@ const mobileTrip: TranslationStrings = {
'mobileTrip.filesNext': 'Volgend bestand',
'mobileTrip.filesPrev': 'Vorig bestand',
'mobileTrip.googleMaps': 'Google Maps',
'mobileTrip.coMaps': 'CoMaps',
'mobileTrip.icsDownload': '.ics downloaden',
'mobileTrip.icsSubscribe': 'Abonneren op kalender',
'mobileTrip.icsSubscribeSub': 'Wordt automatisch bijgewerkt in je agenda-app',
+1
View File
@@ -47,6 +47,7 @@ const planner: TranslationStrings = {
'planner.route': 'Route',
'planner.optimize': 'Optimaliseren',
'planner.openGoogleMaps': 'Openen in Google Maps',
'planner.openCoMaps': 'Openen in CoMaps',
'planner.selectDayHint': 'Selecteer een dag uit de lijst links om het dagplan te bekijken',
'planner.noPlacesForDay': 'Nog geen plaatsen voor deze dag',
'planner.addPlacesLink': 'Plaatsen toevoegen →',
+1
View File
@@ -16,6 +16,7 @@ const mobileTrip: TranslationStrings = {
'mobileTrip.filesNext': 'Następny plik',
'mobileTrip.filesPrev': 'Poprzedni plik',
'mobileTrip.googleMaps': 'Google Maps',
'mobileTrip.coMaps': 'CoMaps',
'mobileTrip.icsDownload': 'Pobierz .ics',
'mobileTrip.icsSubscribe': 'Subskrybuj kalendarz',
'mobileTrip.icsSubscribeSub': 'Automatycznie aktualizuje się w aplikacji kalendarza',
+1
View File
@@ -47,6 +47,7 @@ const planner: TranslationStrings = {
'planner.route': 'Trasa',
'planner.optimize': 'Optymalizuj',
'planner.openGoogleMaps': 'Otwórz w Google Maps',
'planner.openCoMaps': 'Otwórz w CoMaps',
'planner.selectDayHint': 'Wybierz dzień z listy po lewej, aby zobaczyć jego plan',
'planner.noPlacesForDay': 'Brak miejsc dla tego dnia',
'planner.addPlacesLink': 'Dodaj miejsca →',
+1
View File
@@ -16,6 +16,7 @@ const mobileTrip: TranslationStrings = {
'mobileTrip.filesNext': 'Следующий файл',
'mobileTrip.filesPrev': 'Предыдущий файл',
'mobileTrip.googleMaps': 'Google Maps',
'mobileTrip.coMaps': 'CoMaps',
'mobileTrip.icsDownload': 'Скачать .ics',
'mobileTrip.icsSubscribe': 'Подписаться на календарь',
'mobileTrip.icsSubscribeSub': 'Автоматически обновляется в вашем календаре',
+1
View File
@@ -47,6 +47,7 @@ const planner: TranslationStrings = {
'planner.route': 'Маршрут',
'planner.optimize': 'Оптимизировать',
'planner.openGoogleMaps': 'Открыть в Google Maps',
'planner.openCoMaps': 'Открыть в CoMaps',
'planner.selectDayHint': 'Выберите день из списка слева для просмотра плана дня',
'planner.noPlacesForDay': 'На этот день мест пока нет',
'planner.addPlacesLink': 'Добавить места →',
+1
View File
@@ -16,6 +16,7 @@ const mobileTrip: TranslationStrings = {
'mobileTrip.filesNext': 'Nästa fil',
'mobileTrip.filesPrev': 'Föregående fil',
'mobileTrip.googleMaps': 'Google Maps',
'mobileTrip.coMaps': 'CoMaps',
'mobileTrip.icsDownload': 'Ladda ner .ics',
'mobileTrip.icsSubscribe': 'Prenumerera på kalender',
'mobileTrip.icsSubscribeSub': 'Uppdateras automatiskt i din kalenderapp',
+1
View File
@@ -47,6 +47,7 @@ const planner: TranslationStrings = {
'planner.route': 'Rutt',
'planner.optimize': 'Optimera',
'planner.openGoogleMaps': 'Öppna i Google Maps',
'planner.openCoMaps': 'Öppna i CoMaps',
'planner.selectDayHint': 'Välj en dag i listan till vänster för att se dagsplanen',
'planner.noPlacesForDay': 'Det finns inga platser för denna dagen ännu',
'planner.addPlacesLink': 'Lägg till platser →',
+1
View File
@@ -16,6 +16,7 @@ const mobileTrip: TranslationStrings = {
'mobileTrip.filesNext': 'Sonraki dosya',
'mobileTrip.filesPrev': 'Önceki dosya',
'mobileTrip.googleMaps': 'Google Maps',
'mobileTrip.coMaps': 'CoMaps',
'mobileTrip.icsDownload': '.ics indir',
'mobileTrip.icsSubscribe': 'Takvime abone ol',
'mobileTrip.icsSubscribeSub': 'Takvim uygulamanızda otomatik güncellenir',
+1
View File
@@ -47,6 +47,7 @@ const planner: TranslationStrings = {
'planner.route': 'Rota',
'planner.optimize': 'Optimize et',
'planner.openGoogleMaps': "Google Haritalar'da aç",
'planner.openCoMaps': "CoMaps'te aç",
'planner.selectDayHint': 'Gün planını görmek için soldaki listeden bir gün seçin',
'planner.noPlacesForDay': 'Bu gün için henüz yer yok',
'planner.addPlacesLink': 'Yer ekle →',
+1
View File
@@ -16,6 +16,7 @@ const mobileTrip: TranslationStrings = {
'mobileTrip.filesNext': 'Наступний файл',
'mobileTrip.filesPrev': 'Попередній файл',
'mobileTrip.googleMaps': 'Google Maps',
'mobileTrip.coMaps': 'CoMaps',
'mobileTrip.icsDownload': 'Завантажити .ics',
'mobileTrip.icsSubscribe': 'Підписатися на календар',
'mobileTrip.icsSubscribeSub': 'Автоматично оновлюється у вашому календарі',
+1
View File
@@ -47,6 +47,7 @@ const planner: TranslationStrings = {
'planner.route': 'Маршрут',
'planner.optimize': 'Оптимізувати',
'planner.openGoogleMaps': 'Відкрити в Google Maps',
'planner.openCoMaps': 'Відкрити в CoMaps',
'planner.selectDayHint': 'Оберіть день зі списку ліворуч для перегляду плану дня',
'planner.noPlacesForDay': 'На цей день місць поки немає',
'planner.addPlacesLink': 'Додати місця →',
+1
View File
@@ -16,6 +16,7 @@ const mobileTrip: TranslationStrings = {
'mobileTrip.filesNext': 'Tập tin tiếp theo',
'mobileTrip.filesPrev': 'Tập tin trước',
'mobileTrip.googleMaps': 'Google Maps',
'mobileTrip.coMaps': 'CoMaps',
'mobileTrip.icsDownload': 'Tải xuống .ics',
'mobileTrip.icsSubscribe': 'Đăng ký lịch',
'mobileTrip.icsSubscribeSub': 'Tự động cập nhật trong ứng dụng lịch của bạn',
+1
View File
@@ -47,6 +47,7 @@ const planner: TranslationStrings = {
'planner.route': 'Tuyến đường',
'planner.optimize': 'Tối ưu hóa',
'planner.openGoogleMaps': 'Mở trong Google Maps',
'planner.openCoMaps': 'Mở trong CoMaps',
'planner.selectDayHint': 'Chọn một ngày từ danh sách bên trái để xem kế hoạch trong ngày',
'planner.noPlacesForDay': 'Chưa có địa điểm nào cho ngày này',
'planner.addPlacesLink': 'Thêm địa điểm →',
+1
View File
@@ -16,6 +16,7 @@ const mobileTrip: TranslationStrings = {
'mobileTrip.filesNext': '下一個檔案',
'mobileTrip.filesPrev': '上一個檔案',
'mobileTrip.googleMaps': 'Google Maps',
'mobileTrip.coMaps': 'CoMaps',
'mobileTrip.icsDownload': '下載 .ics',
'mobileTrip.icsSubscribe': '訂閱行事曆',
'mobileTrip.icsSubscribeSub': '在你的行事曆應用程式中自動更新',
+1
View File
@@ -47,6 +47,7 @@ const planner: TranslationStrings = {
'planner.route': '路線',
'planner.optimize': '最佳化',
'planner.openGoogleMaps': '在 Google Maps 中開啟',
'planner.openCoMaps': '在 CoMaps 中開啟',
'planner.selectDayHint': '從左側列表選擇一天以檢視日程計劃',
'planner.noPlacesForDay': '當天暫無地點',
'planner.addPlacesLink': '新增地點 →',
+1
View File
@@ -16,6 +16,7 @@ const mobileTrip: TranslationStrings = {
'mobileTrip.filesNext': '下一个文件',
'mobileTrip.filesPrev': '上一个文件',
'mobileTrip.googleMaps': 'Google Maps',
'mobileTrip.coMaps': 'CoMaps',
'mobileTrip.icsDownload': '下载 .ics',
'mobileTrip.icsSubscribe': '订阅日历',
'mobileTrip.icsSubscribeSub': '在你的日历应用中自动更新',
+1
View File
@@ -47,6 +47,7 @@ const planner: TranslationStrings = {
'planner.route': '路线',
'planner.optimize': '优化',
'planner.openGoogleMaps': '在 Google Maps 中打开',
'planner.openCoMaps': '在 CoMaps 中打开',
'planner.selectDayHint': '从左侧列表选择一天以查看日程计划',
'planner.noPlacesForDay': '当天暂无地点',
'planner.addPlacesLink': '添加地点 →',