feat: optimize routes around accommodation, confirm note deletions (#1123)

Optimize day routes around the accommodation

When a day has an accommodation set, the route optimizer now treats it as
the day's home base: it optimizes a loop that leaves the hotel and returns
to it, so the stop nearest the hotel comes first. On a transfer day -
checking out of one hotel and into another - the route runs from the first
hotel to the second instead.

The optimizer also gained a 2-opt pass on top of the nearest-neighbor
ordering, which removes the crossings the greedy pass used to leave behind.
A new display setting ("optimize route from accommodation", on by default)
lets you turn the anchoring off.

Confirm before deleting notes

Deleting a plan note or a collab note now asks for confirmation first. On
phones and tablets the edit and delete icons sit close together and were
easy to mis-tap, which deleted notes with no way back.
This commit is contained in:
Maurice
2026-06-07 12:52:06 +02:00
committed by GitHub
parent 093e069ccc
commit 49b3af8b0d
72 changed files with 504 additions and 26 deletions
+2
View File
@@ -39,6 +39,8 @@ const collab: TranslationStrings = {
'collab.notes.cancel': 'إلغاء',
'collab.notes.edit': 'تعديل',
'collab.notes.delete': 'حذف',
'collab.notes.confirmDeleteTitle': 'حذف الملاحظة؟',
'collab.notes.confirmDeleteBody': 'سيتم حذف هذه الملاحظة نهائيًا.',
'collab.notes.pin': 'تثبيت',
'collab.notes.unpin': 'إلغاء التثبيت',
'collab.notes.daysAgo': 'منذ {n} يوم',
+3
View File
@@ -9,6 +9,8 @@ const dayplan: TranslationStrings = {
'dayplan.confirmRemoveTimeBody':
'هذا المكان له وقت ثابت ({time}). نقله سيزيل الوقت ويسمح بالترتيب الحر.',
'dayplan.confirmRemoveTimeAction': 'إزالة الوقت ونقل',
'dayplan.confirmDeleteNoteTitle': 'حذف الملاحظة؟',
'dayplan.confirmDeleteNoteBody': 'سيتم حذف هذه الملاحظة نهائيًا.',
'dayplan.cannotDropOnTimed':
'لا يمكن وضع العناصر بين الإدخالات المرتبطة بوقت',
'dayplan.cannotBreakChronology':
@@ -29,6 +31,7 @@ const dayplan: TranslationStrings = {
'dayplan.routeError': 'فشل حساب المسار',
'dayplan.toast.needTwoPlaces': 'يلزم مكانان على الأقل لتحسين المسار',
'dayplan.toast.routeOptimized': 'تم تحسين المسار',
'dayplan.toast.routeOptimizedFromHotel': 'تم تحسين المسار انطلاقًا من مكان إقامتك',
'dayplan.toast.noGeoPlaces': 'لم يتم العثور على أماكن بإحداثيات لحساب المسار',
'dayplan.confirmed': 'مؤكد',
'dayplan.pendingRes': 'قيد الانتظار',
+3
View File
@@ -60,6 +60,9 @@ const settings: TranslationStrings = {
'settings.bookingLabelsHint':
'عرض أسماء المحطات/المطارات على الخريطة. عند الإيقاف، يتم عرض الرمز فقط.',
'settings.blurBookingCodes': 'إخفاء رموز الحجز',
'settings.optimizeFromAccommodation': 'تحسين المسار انطلاقًا من مكان الإقامة',
'settings.optimizeFromAccommodationHint':
'عند تحسين يوم ما، يبدأ المسار من الفندق الذي تستيقظ فيه وينتهي عند الفندق الذي تسجّل الوصول إليه في تلك الليلة.',
'settings.notifications': 'الإشعارات',
'settings.notifyTripInvite': 'دعوات الرحلات',
'settings.notifyBookingChange': 'تغييرات الحجز',
+2
View File
@@ -41,6 +41,8 @@ const collab: TranslationStrings = {
'collab.notes.cancel': 'Cancelar',
'collab.notes.edit': 'Editar',
'collab.notes.delete': 'Excluir',
'collab.notes.confirmDeleteTitle': 'Excluir nota?',
'collab.notes.confirmDeleteBody': 'Esta nota será excluída permanentemente.',
'collab.notes.pin': 'Fixar',
'collab.notes.unpin': 'Desafixar',
'collab.notes.daysAgo': 'há {n} d',
+4
View File
@@ -20,6 +20,8 @@ const dayplan: TranslationStrings = {
'dayplan.toast.needTwoPlaces':
'São necessários pelo menos dois lugares para otimizar a rota',
'dayplan.toast.routeOptimized': 'Rota otimizada',
'dayplan.toast.routeOptimizedFromHotel':
'Rota otimizada a partir da sua hospedagem',
'dayplan.toast.noGeoPlaces':
'Nenhum lugar com coordenadas para calcular a rota',
'dayplan.confirmed': 'Confirmada',
@@ -33,6 +35,8 @@ const dayplan: TranslationStrings = {
'dayplan.confirmRemoveTimeBody':
'Este lugar tem um horário fixo ({time}). Movê-lo removerá o horário e permitirá ordenação livre.',
'dayplan.confirmRemoveTimeAction': 'Remover horário e mover',
'dayplan.confirmDeleteNoteTitle': 'Excluir nota?',
'dayplan.confirmDeleteNoteBody': 'Esta nota será excluída permanentemente.',
'dayplan.cannotDropOnTimed':
'Itens não podem ser colocados entre entradas com horário fixo',
'dayplan.cannotBreakChronology':
+3
View File
@@ -62,6 +62,9 @@ const settings: TranslationStrings = {
'settings.temperature': 'Unidade de temperatura',
'settings.timeFormat': 'Formato de hora',
'settings.blurBookingCodes': 'Ocultar códigos de reserva',
'settings.optimizeFromAccommodation': 'Otimizar rota a partir da hospedagem',
'settings.optimizeFromAccommodationHint':
'Ao otimizar um dia, comece a rota no hotel onde você acorda e termine no hotel em que você faz check-in à noite.',
'settings.notifications': 'Notificações',
'settings.notifyTripInvite': 'Convites de viagem',
'settings.notifyBookingChange': 'Alterações de reserva',
+2
View File
@@ -36,6 +36,8 @@ const collab: TranslationStrings = {
'collab.notes.cancel': 'Zrušit',
'collab.notes.edit': 'Upravit',
'collab.notes.delete': 'Smazat',
'collab.notes.confirmDeleteTitle': 'Smazat poznámku?',
'collab.notes.confirmDeleteBody': 'Tato poznámka bude trvale smazána.',
'collab.notes.pin': 'Připnout',
'collab.notes.unpin': 'Odepnout',
'collab.notes.daysAgo': 'před {n} dny',
+4
View File
@@ -20,6 +20,8 @@ const dayplan: TranslationStrings = {
'dayplan.toast.needTwoPlaces':
'Pro optimalizaci trasy jsou potřeba alespoň dvě místa',
'dayplan.toast.routeOptimized': 'Trasa byla optimalizována',
'dayplan.toast.routeOptimizedFromHotel':
'Trasa byla optimalizována od vašeho ubytování',
'dayplan.toast.noGeoPlaces':
'Nebyla nalezena žádná místa se souřadnicemi pro výpočet trasy',
'dayplan.confirmed': 'Potvrzeno',
@@ -33,6 +35,8 @@ const dayplan: TranslationStrings = {
'dayplan.confirmRemoveTimeBody':
'Toto místo má pevný čas ({time}). Přesunutím se čas odebere a povolí se volné řazení.',
'dayplan.confirmRemoveTimeAction': 'Odebrat čas a přesunout',
'dayplan.confirmDeleteNoteTitle': 'Smazat poznámku?',
'dayplan.confirmDeleteNoteBody': 'Tato poznámka bude trvale smazána.',
'dayplan.cannotDropOnTimed':
'Položky nelze umístit mezi záznamy s pevným časem',
'dayplan.cannotBreakChronology':
+3
View File
@@ -63,6 +63,9 @@ const settings: TranslationStrings = {
'settings.temperature': 'Jednotky teploty',
'settings.timeFormat': 'Formát času',
'settings.blurBookingCodes': 'Skrýt rezervační kódy',
'settings.optimizeFromAccommodation': 'Optimalizovat trasu od ubytování',
'settings.optimizeFromAccommodationHint':
'Při optimalizaci dne začne trasa v hotelu, ve kterém se ráno probudíte, a skončí v hotelu, do kterého se večer ubytujete.',
'settings.notifications': 'Oznámení',
'settings.notifyTripInvite': 'Pozvánky na cesty',
'settings.notifyBookingChange': 'Změny rezervací',
+2
View File
@@ -41,6 +41,8 @@ const collab: TranslationStrings = {
'collab.notes.cancel': 'Abbrechen',
'collab.notes.edit': 'Bearbeiten',
'collab.notes.delete': 'Löschen',
'collab.notes.confirmDeleteTitle': 'Notiz löschen?',
'collab.notes.confirmDeleteBody': 'Diese Notiz wird dauerhaft gelöscht.',
'collab.notes.pin': 'Anheften',
'collab.notes.unpin': 'Loslösen',
'collab.notes.daysAgo': 'vor {n} T.',
+3
View File
@@ -9,6 +9,8 @@ const dayplan: TranslationStrings = {
'dayplan.confirmRemoveTimeBody':
'Dieser Ort hat eine feste Uhrzeit ({time}). Durch das Verschieben wird die Uhrzeit entfernt und der Ort kann frei sortiert werden.',
'dayplan.confirmRemoveTimeAction': 'Uhrzeit entfernen & verschieben',
'dayplan.confirmDeleteNoteTitle': 'Notiz löschen?',
'dayplan.confirmDeleteNoteBody': 'Diese Notiz wird dauerhaft gelöscht.',
'dayplan.cannotDropOnTimed':
'Orte können nicht zwischen zeitgebundene Einträge geschoben werden',
'dayplan.cannotBreakChronology':
@@ -32,6 +34,7 @@ const dayplan: TranslationStrings = {
'dayplan.toast.needTwoPlaces':
'Mindestens zwei Orte für Routenoptimierung nötig',
'dayplan.toast.routeOptimized': 'Route optimiert',
'dayplan.toast.routeOptimizedFromHotel': 'Route ab deiner Unterkunft optimiert',
'dayplan.toast.noGeoPlaces':
'Keine Orte mit Koordinaten für Routenberechnung gefunden',
'dayplan.confirmed': 'Bestätigt',
+3
View File
@@ -65,6 +65,9 @@ const settings: TranslationStrings = {
'settings.bookingLabelsHint':
'Zeigt Bahnhofs-/Flughafennamen auf der Karte. Wenn aus, wird nur das Icon angezeigt.',
'settings.blurBookingCodes': 'Buchungscodes verbergen',
'settings.optimizeFromAccommodation': 'Route ab der Unterkunft optimieren',
'settings.optimizeFromAccommodationHint':
'Beim Optimieren eines Tages startet die Route an der Unterkunft, in der du aufwachst, und endet an der, in die du am Abend eincheckst.',
'settings.notifications': 'Mitteilungen',
'settings.notifyTripInvite': 'Trip-Einladungen',
'settings.notifyBookingChange': 'Buchungsänderungen',
+2
View File
@@ -40,6 +40,8 @@ const collab: TranslationStrings = {
'collab.notes.cancel': 'Cancel',
'collab.notes.edit': 'Edit',
'collab.notes.delete': 'Delete',
'collab.notes.confirmDeleteTitle': 'Delete note?',
'collab.notes.confirmDeleteBody': 'This note will be permanently deleted.',
'collab.notes.pin': 'Pin',
'collab.notes.unpin': 'Unpin',
'collab.notes.daysAgo': '{n}d ago',
+3
View File
@@ -9,6 +9,8 @@ const dayplan: TranslationStrings = {
'dayplan.confirmRemoveTimeBody':
'This place has a fixed time ({time}). Moving it will remove the time and allow free sorting.',
'dayplan.confirmRemoveTimeAction': 'Remove time & move',
'dayplan.confirmDeleteNoteTitle': 'Delete note?',
'dayplan.confirmDeleteNoteBody': 'This note will be permanently deleted.',
'dayplan.cannotDropOnTimed':
'Items cannot be placed between time-bound entries',
'dayplan.cannotBreakChronology':
@@ -32,6 +34,7 @@ const dayplan: TranslationStrings = {
'dayplan.toast.needTwoPlaces':
'At least two places needed for route optimization',
'dayplan.toast.routeOptimized': 'Route optimized',
'dayplan.toast.routeOptimizedFromHotel': 'Route optimized from your accommodation',
'dayplan.toast.noGeoPlaces':
'No places with coordinates found for route calculation',
'dayplan.confirmed': 'Confirmed',
+3
View File
@@ -64,6 +64,9 @@ const settings: TranslationStrings = {
'settings.bookingLabelsHint':
'Show station / airport names on the map. When off, only the icon is shown.',
'settings.blurBookingCodes': 'Blur Booking Codes',
'settings.optimizeFromAccommodation': 'Optimize route from accommodation',
'settings.optimizeFromAccommodationHint':
'When optimizing a day, start the route at the hotel you wake up in and end it at the one you check into that evening.',
'settings.notifications': 'Notifications',
'settings.notifyTripInvite': 'Trip invitations',
'settings.notifyBookingChange': 'Booking changes',
+2
View File
@@ -41,6 +41,8 @@ const collab: TranslationStrings = {
'collab.notes.cancel': 'Cancelar',
'collab.notes.edit': 'Editar',
'collab.notes.delete': 'Eliminar',
'collab.notes.confirmDeleteTitle': '¿Eliminar nota?',
'collab.notes.confirmDeleteBody': 'Esta nota se eliminará de forma permanente.',
'collab.notes.pin': 'Fijar',
'collab.notes.unpin': 'Desfijar',
'collab.notes.daysAgo': 'hace {n} d',
+3
View File
@@ -20,6 +20,7 @@ const dayplan: TranslationStrings = {
'dayplan.toast.needTwoPlaces':
'Se necesitan al menos dos lugares para optimizar la ruta',
'dayplan.toast.routeOptimized': 'Ruta optimizada',
'dayplan.toast.routeOptimizedFromHotel': 'Ruta optimizada desde tu alojamiento',
'dayplan.toast.noGeoPlaces':
'No se encontraron lugares con coordenadas para calcular la ruta',
'dayplan.confirmed': 'Confirmado',
@@ -33,6 +34,8 @@ const dayplan: TranslationStrings = {
'dayplan.confirmRemoveTimeBody':
'Este lugar tiene una hora fija ({time}). Al moverlo se eliminará la hora y se permitirá el orden libre.',
'dayplan.confirmRemoveTimeAction': 'Eliminar hora y mover',
'dayplan.confirmDeleteNoteTitle': '¿Eliminar nota?',
'dayplan.confirmDeleteNoteBody': 'Esta nota se eliminará de forma permanente.',
'dayplan.cannotDropOnTimed':
'No se pueden colocar elementos entre entradas con hora fija',
'dayplan.cannotBreakChronology':
+3
View File
@@ -62,6 +62,9 @@ const settings: TranslationStrings = {
'settings.temperature': 'Unidad de temperatura',
'settings.timeFormat': 'Formato de hora',
'settings.blurBookingCodes': 'Difuminar códigos de reserva',
'settings.optimizeFromAccommodation': 'Optimizar la ruta desde el alojamiento',
'settings.optimizeFromAccommodationHint':
'Al optimizar un día, comienza la ruta en el hotel donde despiertas y termínala en aquel en el que te registras esa noche.',
'settings.notifications': 'Notificaciones',
'settings.notifyTripInvite': 'Invitaciones de viaje',
'settings.notifyBookingChange': 'Cambios en reservas',
+2
View File
@@ -42,6 +42,8 @@ const collab: TranslationStrings = {
'collab.notes.cancel': 'Annuler',
'collab.notes.edit': 'Modifier',
'collab.notes.delete': 'Supprimer',
'collab.notes.confirmDeleteTitle': 'Supprimer la note ?',
'collab.notes.confirmDeleteBody': 'Cette note sera définitivement supprimée.',
'collab.notes.pin': 'Épingler',
'collab.notes.unpin': 'Désépingler',
'collab.notes.daysAgo': 'il y a {n} j',
+5
View File
@@ -20,6 +20,8 @@ const dayplan: TranslationStrings = {
'dayplan.toast.needTwoPlaces':
"Au moins deux lieux nécessaires pour optimiser l'itinéraire",
'dayplan.toast.routeOptimized': 'Itinéraire optimisé',
'dayplan.toast.routeOptimizedFromHotel':
'Itinéraire optimisé depuis votre hébergement',
'dayplan.toast.noGeoPlaces':
"Aucun lieu avec des coordonnées trouvé pour le calcul d'itinéraire",
'dayplan.confirmed': 'Confirmé',
@@ -33,6 +35,9 @@ const dayplan: TranslationStrings = {
'dayplan.confirmRemoveTimeBody':
"Ce lieu a une heure fixe ({time}). Le déplacer supprimera l'heure et permettra un tri libre.",
'dayplan.confirmRemoveTimeAction': "Supprimer l'heure et déplacer",
'dayplan.confirmDeleteNoteTitle': 'Supprimer la note ?',
'dayplan.confirmDeleteNoteBody':
'Cette note sera définitivement supprimée.',
'dayplan.cannotDropOnTimed':
'Les éléments ne peuvent pas être placés entre des entrées à heure fixe',
'dayplan.cannotBreakChronology':
+4
View File
@@ -62,6 +62,10 @@ const settings: TranslationStrings = {
'settings.temperature': 'Unité de température',
'settings.timeFormat': "Format de l'heure",
'settings.blurBookingCodes': 'Masquer les codes de réservation',
'settings.optimizeFromAccommodation':
"Optimiser l'itinéraire depuis l'hébergement",
'settings.optimizeFromAccommodationHint':
"Lors de l'optimisation d'une journée, commencez l'itinéraire à l'hôtel où vous vous réveillez et terminez-le à celui où vous arrivez le soir.",
'settings.notifications': 'Notifications',
'settings.notifyTripInvite': 'Invitations de voyage',
'settings.notifyBookingChange': 'Modifications de réservation',
+2
View File
@@ -41,6 +41,8 @@ const collab: TranslationStrings = {
'collab.notes.cancel': 'Ακύρωση',
'collab.notes.edit': 'Επεξεργασία',
'collab.notes.delete': 'Διαγραφή',
'collab.notes.confirmDeleteTitle': 'Διαγραφή σημείωσης;',
'collab.notes.confirmDeleteBody': 'Αυτή η σημείωση θα διαγραφεί οριστικά.',
'collab.notes.pin': 'Καρφίτσωμα',
'collab.notes.unpin': 'Ξεκαρφίτσωμα',
'collab.notes.daysAgo': '{n}η πριν',
+5
View File
@@ -9,6 +9,9 @@ const dayplan: TranslationStrings = {
'dayplan.confirmRemoveTimeBody':
'Αυτό το μέρος έχει σταθερή ώρα ({time}). Η μετακίνησή του θα αφαιρέσει την ώρα και θα επιτρέψει ελεύθερη ταξινόμηση.',
'dayplan.confirmRemoveTimeAction': 'Αφαίρεση ώρας & μετακίνηση',
'dayplan.confirmDeleteNoteTitle': 'Διαγραφή σημείωσης;',
'dayplan.confirmDeleteNoteBody':
'Αυτή η σημείωση θα διαγραφεί οριστικά.',
'dayplan.cannotDropOnTimed':
'Τα στοιχεία δεν μπορούν να τοποθετηθούν μεταξύ καταχωρήσεων με ώρα',
'dayplan.cannotBreakChronology':
@@ -32,6 +35,8 @@ const dayplan: TranslationStrings = {
'dayplan.toast.needTwoPlaces':
'Χρειάζονται τουλάχιστον δύο μέρη για βελτιστοποίηση διαδρομής',
'dayplan.toast.routeOptimized': 'Η διαδρομή βελτιστοποιήθηκε',
'dayplan.toast.routeOptimizedFromHotel':
'Η διαδρομή βελτιστοποιήθηκε από το κατάλυμά σας',
'dayplan.toast.noGeoPlaces':
'Δεν βρέθηκαν μέρη με συντεταγμένες για τον υπολογισμό διαδρομής',
'dayplan.confirmed': 'Επιβεβαιωμένο',
+3
View File
@@ -66,6 +66,9 @@ const settings: TranslationStrings = {
'settings.bookingLabelsHint':
'Εμφάνιση ονομάτων σταθμών / αεροδρομίων στον χάρτη. Όταν είναι απενεργοποιημένο, εμφανίζεται μόνο το εικονίδιο.',
'settings.blurBookingCodes': 'Θόλωμα Κωδικών Κρατήσεων',
'settings.optimizeFromAccommodation': 'Βελτιστοποίηση διαδρομής από το κατάλυμα',
'settings.optimizeFromAccommodationHint':
'Κατά τη βελτιστοποίηση μιας ημέρας, ξεκινήστε τη διαδρομή από το ξενοδοχείο στο οποίο ξυπνάτε και τερματίστε την σε αυτό στο οποίο κάνετε check-in το ίδιο βράδυ.',
'settings.notifications': 'Ειδοποιήσεις',
'settings.notifyTripInvite': 'Προσκλήσεις ταξιδιού',
'settings.notifyBookingChange': 'Αλλαγές κρατήσεων',
+2
View File
@@ -42,6 +42,8 @@ const collab: TranslationStrings = {
'collab.notes.cancel': 'Mégse',
'collab.notes.edit': 'Szerkesztés',
'collab.notes.delete': 'Törlés',
'collab.notes.confirmDeleteTitle': 'Törli a jegyzetet?',
'collab.notes.confirmDeleteBody': 'Ez a jegyzet véglegesen törlődik.',
'collab.notes.pin': 'Kitűzés',
'collab.notes.unpin': 'Kitűzés eltávolítása',
'collab.notes.daysAgo': '{n} napja',
+4
View File
@@ -20,6 +20,8 @@ const dayplan: TranslationStrings = {
'dayplan.toast.needTwoPlaces':
'Legalább két hely szükséges az útvonal-optimalizáláshoz',
'dayplan.toast.routeOptimized': 'Útvonal optimalizálva',
'dayplan.toast.routeOptimizedFromHotel':
'Útvonal optimalizálva a szállásodtól',
'dayplan.toast.noGeoPlaces':
'Nem találhatók koordinátákkal rendelkező helyek az útvonalszámításhoz',
'dayplan.confirmed': 'Megerősítve',
@@ -33,6 +35,8 @@ const dayplan: TranslationStrings = {
'dayplan.confirmRemoveTimeBody':
'Ennek a helynek rögzített időpontja van ({time}). Az áthelyezéssel az időpont eltávolítódik és szabad rendezés válik lehetővé.',
'dayplan.confirmRemoveTimeAction': 'Időpont eltávolítása és áthelyezés',
'dayplan.confirmDeleteNoteTitle': 'Törli a jegyzetet?',
'dayplan.confirmDeleteNoteBody': 'Ez a jegyzet véglegesen törlődik.',
'dayplan.cannotDropOnTimed':
'Elemek nem helyezhetők rögzített időpontú bejegyzések közé',
'dayplan.cannotBreakChronology':
+3
View File
@@ -63,6 +63,9 @@ const settings: TranslationStrings = {
'settings.temperature': 'Hőmérséklet egység',
'settings.timeFormat': 'Időformátum',
'settings.blurBookingCodes': 'Foglalási kódok elrejtése',
'settings.optimizeFromAccommodation': 'Útvonal optimalizálása a szállástól',
'settings.optimizeFromAccommodationHint':
'A nap optimalizálásakor az útvonal annál a szállásnál kezdődjön, ahol felébredsz, és annál érjen véget, ahova este bejelentkezel.',
'settings.notifications': 'Értesítések',
'settings.notifyTripInvite': 'Utazási meghívók',
'settings.notifyBookingChange': 'Foglalási változások',
+2
View File
@@ -40,6 +40,8 @@ const collab: TranslationStrings = {
'collab.notes.cancel': 'Batal',
'collab.notes.edit': 'Edit',
'collab.notes.delete': 'Hapus',
'collab.notes.confirmDeleteTitle': 'Hapus catatan?',
'collab.notes.confirmDeleteBody': 'Catatan ini akan dihapus secara permanen.',
'collab.notes.pin': 'Sematkan',
'collab.notes.unpin': 'Lepas sematan',
'collab.notes.daysAgo': '{n}h lalu',
+4
View File
@@ -9,6 +9,8 @@ const dayplan: TranslationStrings = {
'dayplan.confirmRemoveTimeBody':
'Tempat ini memiliki waktu tetap ({time}). Memindahkannya akan menghapus waktu dan mengizinkan pengurutan bebas.',
'dayplan.confirmRemoveTimeAction': 'Hapus waktu & pindahkan',
'dayplan.confirmDeleteNoteTitle': 'Hapus catatan?',
'dayplan.confirmDeleteNoteBody': 'Catatan ini akan dihapus secara permanen.',
'dayplan.cannotDropOnTimed':
'Item tidak dapat ditempatkan di antara entri yang terikat waktu',
'dayplan.cannotBreakChronology':
@@ -30,6 +32,8 @@ const dayplan: TranslationStrings = {
'dayplan.toast.needTwoPlaces':
'Diperlukan minimal dua tempat untuk optimasi rute',
'dayplan.toast.routeOptimized': 'Rute dioptimalkan',
'dayplan.toast.routeOptimizedFromHotel':
'Rute dioptimalkan dari akomodasimu',
'dayplan.toast.noGeoPlaces':
'Tidak ditemukan tempat dengan koordinat untuk kalkulasi rute',
'dayplan.confirmed': 'Dikonfirmasi',
+3
View File
@@ -62,6 +62,9 @@ const settings: TranslationStrings = {
'settings.temperature': 'Satuan Suhu',
'settings.timeFormat': 'Format Waktu',
'settings.blurBookingCodes': 'Sembunyikan Kode Pemesanan',
'settings.optimizeFromAccommodation': 'Optimalkan rute dari akomodasi',
'settings.optimizeFromAccommodationHint':
'Saat mengoptimalkan suatu hari, mulai rute dari hotel tempatmu bangun pagi dan akhiri di hotel tempatmu check-in malam itu.',
'settings.notifications': 'Notifikasi',
'settings.notifyTripInvite': 'Undangan perjalanan',
'settings.notifyBookingChange': 'Perubahan pemesanan',
+2
View File
@@ -41,6 +41,8 @@ const collab: TranslationStrings = {
'collab.notes.cancel': 'Annulla',
'collab.notes.edit': 'Modifica',
'collab.notes.delete': 'Elimina',
'collab.notes.confirmDeleteTitle': 'Eliminare la nota?',
'collab.notes.confirmDeleteBody': 'Questa nota verrà eliminata definitivamente.',
'collab.notes.pin': 'Fissa',
'collab.notes.unpin': 'Rimuovi',
'collab.notes.daysAgo': '{n}g fa',
+5
View File
@@ -20,6 +20,8 @@ const dayplan: TranslationStrings = {
'dayplan.toast.needTwoPlaces':
"Servono almeno due luoghi per l'ottimizzazione del percorso",
'dayplan.toast.routeOptimized': 'Percorso ottimizzato',
'dayplan.toast.routeOptimizedFromHotel':
'Percorso ottimizzato a partire dal tuo alloggio',
'dayplan.toast.noGeoPlaces':
'Nessun luogo con coordinate trovato per il calcolo del percorso',
'dayplan.confirmed': 'Confermata',
@@ -33,6 +35,9 @@ const dayplan: TranslationStrings = {
'dayplan.confirmRemoveTimeBody':
"Questo luogo ha un orario fisso ({time}). Spostarlo rimuoverà l'orario e consentirà l'ordinamento libero.",
'dayplan.confirmRemoveTimeAction': 'Rimuovi orario e sposta',
'dayplan.confirmDeleteNoteTitle': 'Eliminare la nota?',
'dayplan.confirmDeleteNoteBody':
'Questa nota verrà eliminata definitivamente.',
'dayplan.cannotDropOnTimed':
'Gli elementi non possono essere posizionati tra voci con orario fisso',
'dayplan.cannotBreakChronology':
+3
View File
@@ -62,6 +62,9 @@ const settings: TranslationStrings = {
'settings.temperature': 'Unità di Temperatura',
'settings.timeFormat': 'Formato Ora',
'settings.blurBookingCodes': 'Nascondi codici di prenotazione',
'settings.optimizeFromAccommodation': "Ottimizza il percorso dall'alloggio",
'settings.optimizeFromAccommodationHint':
"Quando ottimizzi un giorno, fa iniziare il percorso dall'hotel in cui ti svegli e terminarlo in quello in cui fai il check-in quella sera.",
'settings.notifications': 'Notifiche',
'settings.notifyTripInvite': 'Inviti di viaggio',
'settings.notifyBookingChange': 'Modifiche alle prenotazioni',
+2
View File
@@ -40,6 +40,8 @@ const collab: TranslationStrings = {
'collab.notes.cancel': 'キャンセル',
'collab.notes.edit': '編集',
'collab.notes.delete': '削除',
'collab.notes.confirmDeleteTitle': 'メモを削除しますか?',
'collab.notes.confirmDeleteBody': 'このメモは完全に削除されます。',
'collab.notes.pin': '固定',
'collab.notes.unpin': '固定を解除',
'collab.notes.daysAgo': '{n}日前',
+3
View File
@@ -8,6 +8,8 @@ const dayplan: TranslationStrings = {
'dayplan.confirmRemoveTimeBody':
'この場所には固定時刻({time})があります。移動すると時刻が削除され、自由に並び替えできます。',
'dayplan.confirmRemoveTimeAction': '時刻を削除して移動',
'dayplan.confirmDeleteNoteTitle': 'メモを削除しますか?',
'dayplan.confirmDeleteNoteBody': 'このメモは完全に削除されます。',
'dayplan.cannotDropOnTimed': '時刻指定の項目の間には配置できません',
'dayplan.cannotBreakChronology': '時刻指定の項目や予約の時系列が崩れます',
'dayplan.addNote': 'メモを追加',
@@ -28,6 +30,7 @@ const dayplan: TranslationStrings = {
'dayplan.routeError': 'ルートの計算に失敗しました',
'dayplan.toast.needTwoPlaces': 'ルート最適化には2つ以上の場所が必要です',
'dayplan.toast.routeOptimized': 'ルートを最適化しました',
'dayplan.toast.routeOptimizedFromHotel': '宿泊先を起点にルートを最適化しました',
'dayplan.toast.noGeoPlaces': '座標付きの場所がありません',
'dayplan.confirmed': '確定',
'dayplan.pendingRes': '保留',
+3
View File
@@ -64,6 +64,9 @@ const settings: TranslationStrings = {
'settings.bookingLabelsHint':
'地図に駅・空港名を表示。オフ時はアイコンのみ。',
'settings.blurBookingCodes': '予約コードをぼかす',
'settings.optimizeFromAccommodation': '宿泊先を起点にルートを最適化',
'settings.optimizeFromAccommodationHint':
'その日を最適化する際、朝に目覚める宿泊先を起点にし、その晩にチェックインする宿泊先を終点としてルートを組みます。',
'settings.notifications': '通知',
'settings.notifyTripInvite': '旅行の招待',
'settings.notifyBookingChange': '予約の変更',
+2
View File
@@ -39,6 +39,8 @@ const collab: TranslationStrings = {
'collab.notes.cancel': '취소',
'collab.notes.edit': '편집',
'collab.notes.delete': '삭제',
'collab.notes.confirmDeleteTitle': '메모를 삭제할까요?',
'collab.notes.confirmDeleteBody': '이 메모가 영구적으로 삭제됩니다.',
'collab.notes.pin': '고정',
'collab.notes.unpin': '고정 해제',
'collab.notes.daysAgo': '{n}일 전',
+3
View File
@@ -9,6 +9,8 @@ const dayplan: TranslationStrings = {
'dayplan.confirmRemoveTimeBody':
'이 장소에 고정된 시간 ({time})이 있습니다. 이동하면 시간이 제거되고 자유 정렬이 허용됩니다.',
'dayplan.confirmRemoveTimeAction': '시간 제거 및 이동',
'dayplan.confirmDeleteNoteTitle': '메모를 삭제할까요?',
'dayplan.confirmDeleteNoteBody': '이 메모가 영구적으로 삭제됩니다.',
'dayplan.cannotDropOnTimed': '시간이 고정된 항목 사이에 배치할 수 없습니다',
'dayplan.cannotBreakChronology':
'이 작업은 시간 고정 항목과 예약의 시간 순서를 깨뜨립니다',
@@ -31,6 +33,7 @@ const dayplan: TranslationStrings = {
'dayplan.toast.needTwoPlaces':
'경로 최적화에는 최소 두 개의 장소가 필요합니다',
'dayplan.toast.routeOptimized': '경로가 최적화되었습니다',
'dayplan.toast.routeOptimizedFromHotel': '숙소를 기준으로 경로가 최적화되었습니다',
'dayplan.toast.noGeoPlaces': '경로 계산을 위한 좌표가 있는 장소가 없습니다',
'dayplan.confirmed': '확정됨',
'dayplan.pendingRes': '대기 중',
+3
View File
@@ -65,6 +65,9 @@ const settings: TranslationStrings = {
'settings.bookingLabelsHint':
'지도에 역 / 공항 이름을 표시합니다. 끄면 아이콘만 표시됩니다.',
'settings.blurBookingCodes': '예약 코드 흐리게',
'settings.optimizeFromAccommodation': '숙소 기준으로 경로 최적화',
'settings.optimizeFromAccommodationHint':
'하루 일정을 최적화할 때, 아침에 머무는 숙소에서 경로를 시작하고 그날 저녁에 체크인하는 숙소에서 경로를 끝냅니다.',
'settings.notifications': '알림',
'settings.notifyTripInvite': '여행 초대',
'settings.notifyBookingChange': '예약 변경',
+2
View File
@@ -39,6 +39,8 @@ const collab: TranslationStrings = {
'collab.notes.cancel': 'Annuleren',
'collab.notes.edit': 'Bewerken',
'collab.notes.delete': 'Verwijderen',
'collab.notes.confirmDeleteTitle': 'Notitie verwijderen?',
'collab.notes.confirmDeleteBody': 'Deze notitie wordt definitief verwijderd.',
'collab.notes.pin': 'Vastpinnen',
'collab.notes.unpin': 'Losmaken',
'collab.notes.daysAgo': '{n}d geleden',
+4
View File
@@ -20,6 +20,8 @@ const dayplan: TranslationStrings = {
'dayplan.toast.needTwoPlaces':
'Minimaal twee plaatsen nodig voor route-optimalisatie',
'dayplan.toast.routeOptimized': 'Route geoptimaliseerd',
'dayplan.toast.routeOptimizedFromHotel':
'Route geoptimaliseerd vanaf je accommodatie',
'dayplan.toast.noGeoPlaces':
'Geen plaatsen met coördinaten gevonden voor routeberekening',
'dayplan.confirmed': 'Bevestigd',
@@ -33,6 +35,8 @@ const dayplan: TranslationStrings = {
'dayplan.confirmRemoveTimeBody':
'Deze plek heeft een vast tijdstip ({time}). Verplaatsen verwijdert het tijdstip en maakt vrije sortering mogelijk.',
'dayplan.confirmRemoveTimeAction': 'Tijd verwijderen en verplaatsen',
'dayplan.confirmDeleteNoteTitle': 'Notitie verwijderen?',
'dayplan.confirmDeleteNoteBody': 'Deze notitie wordt definitief verwijderd.',
'dayplan.cannotDropOnTimed':
'Items kunnen niet tussen tijdgebonden items worden geplaatst',
'dayplan.cannotBreakChronology':
+3
View File
@@ -62,6 +62,9 @@ const settings: TranslationStrings = {
'settings.temperature': 'Temperatuureenheid',
'settings.timeFormat': 'Tijdnotatie',
'settings.blurBookingCodes': 'Boekingscodes vervagen',
'settings.optimizeFromAccommodation': 'Route optimaliseren vanaf accommodatie',
'settings.optimizeFromAccommodationHint':
'Begin bij het optimaliseren van een dag de route bij het hotel waar je wakker wordt en eindig bij het hotel waar je die avond incheckt.',
'settings.notifications': 'Meldingen',
'settings.notifyTripInvite': 'Reisuitnodigingen',
'settings.notifyBookingChange': 'Boekingswijzigingen',
+2
View File
@@ -40,6 +40,8 @@ const collab: TranslationStrings = {
'collab.notes.cancel': 'Anuluj',
'collab.notes.edit': 'Edytuj',
'collab.notes.delete': 'Usuń',
'collab.notes.confirmDeleteTitle': 'Usunąć notatkę?',
'collab.notes.confirmDeleteBody': 'Ta notatka zostanie trwale usunięta.',
'collab.notes.pin': 'Przypnij',
'collab.notes.unpin': 'Odepnij',
'collab.notes.daysAgo': '{n}d temu',
+4
View File
@@ -9,6 +9,8 @@ const dayplan: TranslationStrings = {
'dayplan.confirmRemoveTimeBody':
'To miejsce ma określoną godzinę ({time}). Przeniesienie go usunie godzinę i umożliwi swobodne sortowanie.',
'dayplan.confirmRemoveTimeAction': 'Usuń godzinę i przenieś',
'dayplan.confirmDeleteNoteTitle': 'Usunąć notatkę?',
'dayplan.confirmDeleteNoteBody': 'Ta notatka zostanie trwale usunięta.',
'dayplan.cannotDropOnTimed':
'Nie można umieszczać elementów pomiędzy wpisami z określoną godziną',
'dayplan.cannotBreakChronology':
@@ -30,6 +32,8 @@ const dayplan: TranslationStrings = {
'dayplan.toast.needTwoPlaces':
'Potrzeba co najmniej dwóch miejsc, aby zoptymalizować trasę',
'dayplan.toast.routeOptimized': 'Trasa została zoptymalizowana',
'dayplan.toast.routeOptimizedFromHotel':
'Trasa została zoptymalizowana względem Twojego zakwaterowania',
'dayplan.toast.noGeoPlaces':
'Nie znaleziono miejsc ze współrzędnymi do obliczenia trasy',
'dayplan.confirmed': 'Potwierdzono',
+3
View File
@@ -62,6 +62,9 @@ const settings: TranslationStrings = {
'settings.temperature': 'Jednostka temperatury',
'settings.timeFormat': 'Format czasu',
'settings.blurBookingCodes': 'Rozmyj kody rezerwacji',
'settings.optimizeFromAccommodation': 'Optymalizuj trasę od zakwaterowania',
'settings.optimizeFromAccommodationHint':
'Przy optymalizacji dnia rozpocznij trasę w hotelu, w którym się budzisz, a zakończ ją w tym, do którego się zameldujesz tego wieczoru.',
'settings.notifications': 'Powiadomienia',
'settings.notifyTripInvite': 'Zaproszenia do podróży',
'settings.notifyBookingChange': 'Zmiany w rezerwacjach',
+2
View File
@@ -41,6 +41,8 @@ const collab: TranslationStrings = {
'collab.notes.cancel': 'Отмена',
'collab.notes.edit': 'Редактировать',
'collab.notes.delete': 'Удалить',
'collab.notes.confirmDeleteTitle': 'Удалить заметку?',
'collab.notes.confirmDeleteBody': 'Эта заметка будет удалена безвозвратно.',
'collab.notes.pin': 'Закрепить',
'collab.notes.unpin': 'Открепить',
'collab.notes.daysAgo': '{n} дн. назад',
+4
View File
@@ -20,6 +20,8 @@ const dayplan: TranslationStrings = {
'dayplan.toast.needTwoPlaces':
'Для оптимизации маршрута нужно минимум два места',
'dayplan.toast.routeOptimized': 'Маршрут оптимизирован',
'dayplan.toast.routeOptimizedFromHotel':
'Маршрут оптимизирован от места проживания',
'dayplan.toast.noGeoPlaces':
'Не найдено мест с координатами для расчёта маршрута',
'dayplan.confirmed': 'Подтверждено',
@@ -33,6 +35,8 @@ const dayplan: TranslationStrings = {
'dayplan.confirmRemoveTimeBody':
'У этого места фиксированное время ({time}). При перемещении время будет удалено, и станет доступна свободная сортировка.',
'dayplan.confirmRemoveTimeAction': 'Удалить время и переместить',
'dayplan.confirmDeleteNoteTitle': 'Удалить заметку?',
'dayplan.confirmDeleteNoteBody': 'Эта заметка будет удалена безвозвратно.',
'dayplan.cannotDropOnTimed':
'Элементы нельзя размещать между записями с фиксированным временем',
'dayplan.cannotBreakChronology':
+3
View File
@@ -62,6 +62,9 @@ const settings: TranslationStrings = {
'settings.temperature': 'Единица температуры',
'settings.timeFormat': 'Формат времени',
'settings.blurBookingCodes': 'Скрыть коды бронирования',
'settings.optimizeFromAccommodation': 'Оптимизировать маршрут от места проживания',
'settings.optimizeFromAccommodationHint':
'При оптимизации дня маршрут начинается от отеля, в котором вы просыпаетесь, и заканчивается у того, в который вы заселяетесь вечером.',
'settings.notifications': 'Уведомления',
'settings.notifyTripInvite': 'Приглашения в поездку',
'settings.notifyBookingChange': 'Изменения бронирований',
+2
View File
@@ -40,6 +40,8 @@ const collab: TranslationStrings = {
'collab.notes.cancel': 'İptal etmek',
'collab.notes.edit': 'Düzenle',
'collab.notes.delete': 'Sil',
'collab.notes.confirmDeleteTitle': 'Not silinsin mi?',
'collab.notes.confirmDeleteBody': 'Bu not kalıcı olarak silinecek.',
'collab.notes.pin': 'Sabitle',
'collab.notes.unpin': 'Sabitlemeyi kaldır',
'collab.notes.daysAgo': '{n} gün önce',
+4
View File
@@ -9,6 +9,8 @@ const dayplan: TranslationStrings = {
'dayplan.confirmRemoveTimeBody':
'Bu yerin sabit bir saati var ({time}). Taşımak saati kaldırır ve serbest sıralamaya izin verir.',
'dayplan.confirmRemoveTimeAction': 'Saati kaldır ve taşı',
'dayplan.confirmDeleteNoteTitle': 'Not silinsin mi?',
'dayplan.confirmDeleteNoteBody': 'Bu not kalıcı olarak silinecek.',
'dayplan.cannotDropOnTimed':
'Öğeler saate bağlı girişler arasına yerleştirilemez',
'dayplan.cannotBreakChronology':
@@ -32,6 +34,8 @@ const dayplan: TranslationStrings = {
'dayplan.toast.needTwoPlaces':
'Rota optimizasyonu için en az iki yer gerekli',
'dayplan.toast.routeOptimized': 'Rota optimize edildi',
'dayplan.toast.routeOptimizedFromHotel':
'Rota konakladığınız yerden optimize edildi',
'dayplan.toast.noGeoPlaces': 'Rota için koordinatlı yer bulunamadı',
'dayplan.confirmed': 'Onaylandı',
'dayplan.pendingRes': 'Beklemede',
+3
View File
@@ -66,6 +66,9 @@ const settings: TranslationStrings = {
'settings.bookingLabelsHint':
'Haritada istasyon / havalimanı adlarını göster. Kapalıyken yalnızca simge görünür.',
'settings.blurBookingCodes': 'Rezervasyon Kodlarını Bulanıklaştır',
'settings.optimizeFromAccommodation': 'Rotayı konaklamadan optimize et',
'settings.optimizeFromAccommodationHint':
'Bir günü optimize ederken rotaya o sabah uyandığınız otelden başlayın ve akşam giriş yaptığınız otelde sonlandırın.',
'settings.notifications': 'Bildirimler',
'settings.notifyTripInvite': 'Seyahat davetleri',
'settings.notifyBookingChange': 'Rezervasyon değişiklikleri',
+2
View File
@@ -40,6 +40,8 @@ const collab: TranslationStrings = {
'collab.notes.cancel': 'Скасувати',
'collab.notes.edit': 'Редагувати',
'collab.notes.delete': 'Видалити',
'collab.notes.confirmDeleteTitle': 'Видалити нотатку?',
'collab.notes.confirmDeleteBody': 'Цю нотатку буде видалено назавжди.',
'collab.notes.pin': 'Закріпити',
'collab.notes.unpin': 'Відкріпити',
'collab.notes.daysAgo': '{n} дн. тому',
+3
View File
@@ -22,6 +22,7 @@ const dayplan: TranslationStrings = {
'dayplan.toast.needTwoPlaces':
'Для оптимизации маршрута нужно минимум два места',
'dayplan.toast.routeOptimized': 'Маршрут оптимизирован',
'dayplan.toast.routeOptimizedFromHotel': 'Маршрут оптимізовано від вашого житла',
'dayplan.toast.noGeoPlaces':
'Не знайдено місць з координатами для розрахунку маршруту',
'dayplan.confirmed': 'Подтверждено',
@@ -35,6 +36,8 @@ const dayplan: TranslationStrings = {
'dayplan.confirmRemoveTimeBody':
'У цього місця фіксований час ({time}). При переміщенні час буде видалено, і стане доступне вільне сортування.',
'dayplan.confirmRemoveTimeAction': 'Видалити час і перемістити',
'dayplan.confirmDeleteNoteTitle': 'Видалити нотатку?',
'dayplan.confirmDeleteNoteBody': 'Цю нотатку буде видалено назавжди.',
'dayplan.cannotDropOnTimed':
'Елементи не можна розміщувати між записами з фіксованим часом',
'dayplan.cannotBreakChronology':
+3
View File
@@ -63,6 +63,9 @@ const settings: TranslationStrings = {
'settings.temperature': 'Одиниця температури',
'settings.timeFormat': 'Формат часу',
'settings.blurBookingCodes': 'Приховати коди бронювання',
'settings.optimizeFromAccommodation': 'Оптимізувати маршрут від житла',
'settings.optimizeFromAccommodationHint':
'Під час оптимізації дня починайте маршрут від готелю, у якому ви прокидаєтеся, і завершуйте його тим, у який ви заселяєтеся ввечері.',
'settings.notifications': 'Сповіщення',
'settings.notifyTripInvite': 'Запрошення до поїздки',
'settings.notifyBookingChange': 'Зміни бронювань',
+2
View File
@@ -39,6 +39,8 @@ const collab: TranslationStrings = {
'collab.notes.cancel': '取消',
'collab.notes.edit': '編輯',
'collab.notes.delete': '刪除',
'collab.notes.confirmDeleteTitle': '刪除筆記?',
'collab.notes.confirmDeleteBody': '此筆記將被永久刪除。',
'collab.notes.pin': '置頂',
'collab.notes.unpin': '取消置頂',
'collab.notes.daysAgo': '{n} 天前',
+3
View File
@@ -19,6 +19,7 @@ const dayplan: TranslationStrings = {
'dayplan.routeError': '路線計算失敗',
'dayplan.toast.needTwoPlaces': '路線最佳化至少需要兩個地點',
'dayplan.toast.routeOptimized': '路線已最佳化',
'dayplan.toast.routeOptimizedFromHotel': '已從你的住宿地點最佳化路線',
'dayplan.toast.noGeoPlaces': '未找到有座標的地點用於路線計算',
'dayplan.confirmed': '已確認',
'dayplan.pendingRes': '待確認',
@@ -30,6 +31,8 @@ const dayplan: TranslationStrings = {
'dayplan.confirmRemoveTimeBody':
'此地點有固定時間({time})。移動後將移除時間並允許自由排序。',
'dayplan.confirmRemoveTimeAction': '移除時間並移動',
'dayplan.confirmDeleteNoteTitle': '刪除筆記?',
'dayplan.confirmDeleteNoteBody': '此筆記將被永久刪除。',
'dayplan.cannotDropOnTimed': '無法將專案放置在有固定時間的條目之間',
'dayplan.cannotBreakChronology': '這將打亂已計劃專案和預訂的時間順序',
'dayplan.mobile.addPlace': '新增地點',
+3
View File
@@ -59,6 +59,9 @@ const settings: TranslationStrings = {
'settings.temperature': '溫度單位',
'settings.timeFormat': '時間格式',
'settings.blurBookingCodes': '模糊預訂程式碼',
'settings.optimizeFromAccommodation': '從住宿地點最佳化路線',
'settings.optimizeFromAccommodationHint':
'最佳化某一天的行程時,路線從你早上起床的飯店出發,並在你當晚入住的飯店結束。',
'settings.notifications': '通知',
'settings.notifyTripInvite': '旅行邀請',
'settings.notifyBookingChange': '預訂變更',
+2
View File
@@ -39,6 +39,8 @@ const collab: TranslationStrings = {
'collab.notes.cancel': '取消',
'collab.notes.edit': '编辑',
'collab.notes.delete': '删除',
'collab.notes.confirmDeleteTitle': '删除备注?',
'collab.notes.confirmDeleteBody': '此备注将被永久删除。',
'collab.notes.pin': '置顶',
'collab.notes.unpin': '取消置顶',
'collab.notes.daysAgo': '{n} 天前',
+3
View File
@@ -19,6 +19,7 @@ const dayplan: TranslationStrings = {
'dayplan.routeError': '路线计算失败',
'dayplan.toast.needTwoPlaces': '路线优化至少需要两个地点',
'dayplan.toast.routeOptimized': '路线已优化',
'dayplan.toast.routeOptimizedFromHotel': '已根据您的住宿优化路线',
'dayplan.toast.noGeoPlaces': '未找到有坐标的地点用于路线计算',
'dayplan.confirmed': '已确认',
'dayplan.pendingRes': '待确认',
@@ -30,6 +31,8 @@ const dayplan: TranslationStrings = {
'dayplan.confirmRemoveTimeBody':
'此地点有固定时间({time})。移动后将移除时间并允许自由排序。',
'dayplan.confirmRemoveTimeAction': '移除时间并移动',
'dayplan.confirmDeleteNoteTitle': '删除备注?',
'dayplan.confirmDeleteNoteBody': '此备注将被永久删除。',
'dayplan.cannotDropOnTimed': '无法将项目放置在有固定时间的条目之间',
'dayplan.cannotBreakChronology': '这将打乱已计划项目和预订的时间顺序',
'dayplan.mobile.addPlace': '添加地点',
+3
View File
@@ -59,6 +59,9 @@ const settings: TranslationStrings = {
'settings.temperature': '温度单位',
'settings.timeFormat': '时间格式',
'settings.blurBookingCodes': '模糊预订代码',
'settings.optimizeFromAccommodation': '从住宿地优化路线',
'settings.optimizeFromAccommodationHint':
'优化某一天时,路线将从您醒来时所在的酒店出发,并在当晚入住的酒店结束。',
'settings.notifications': '通知',
'settings.notifyTripInvite': '旅行邀请',
'settings.notifyBookingChange': '预订变更',