feat(ui): unified toolbar design + redesigned budget widgets + polish

Trip planner now has a consistent rounded toolbar across bookings, lists,
budget and files. Each panel shows title, inline filter pills (with
counts where useful) and an accent action button on the right. Moved
per-tab controls into the toolbar — lists import, todo add, budget
currency/add-category, files trash/filters — and dropped the redundant
in-panel headers.

Budget sidebar redesigned: total-budget card with indigo-ringed avatars
and coloured split bar; settlement flows as paired avatar cards;
by-category donut rebuilt in SVG with per-category gradients. Both cards
now follow dark/light mode via a widgetTheme helper.

Todo: add-new-task is a portalled modal on desktop, the add-task input
bar is gone; new SORT BY section in the sidebar; inline category
creation in the task editor.

Reservations: pending / confirmed sections remember their collapsed
state per trip (localStorage).

Misc: per-trip connections toggle moved into the day-plan sidebar,
booking endpoints fixed to show on map for trains/cruises/cars as well,
label localStorage persistence, RESMODAL test updated to the new
airport-select flow.

i18n: the new booking / map / todo / budget strings are translated into
all 15 supported languages.
This commit is contained in:
Maurice
2026-04-17 23:25:38 +02:00
parent 5e9c8d2c43
commit 530550455d
22 changed files with 894 additions and 316 deletions
+15 -2
View File
@@ -1017,6 +1017,15 @@ const ar: Record<string, string | { name: string; category: string }[]> = {
'reservations.meta.flightNumber': 'رقم الرحلة',
'reservations.meta.from': 'من',
'reservations.meta.to': 'إلى',
'reservations.needsReview': 'مراجعة',
'reservations.needsReviewHint': 'تعذّر مطابقة المطار تلقائياً — يرجى تأكيد الموقع.',
'reservations.searchLocation': 'ابحث عن محطة، ميناء، عنوان...',
'airport.searchPlaceholder': 'رمز المطار أو المدينة (مثل FRA)',
'map.connections': 'الاتصالات',
'map.showConnections': 'عرض مسارات الحجوزات',
'map.hideConnections': 'إخفاء مسارات الحجوزات',
'settings.bookingLabels': 'تسميات مسارات الحجوزات',
'settings.bookingLabelsHint': 'عرض أسماء المحطات/المطارات على الخريطة. عند الإيقاف، يتم عرض الرمز فقط.',
'reservations.meta.trainNumber': 'رقم القطار',
'reservations.meta.platform': 'المنصة',
'reservations.meta.seat': 'المقعد',
@@ -1035,7 +1044,7 @@ const ar: Record<string, string | { name: string; category: string }[]> = {
'reservations.type.hotel': 'إقامة',
'reservations.type.restaurant': 'مطعم',
'reservations.type.train': 'قطار',
'reservations.type.car': 'سيارة مستأجرة',
'reservations.type.car': 'سيارة',
'reservations.type.cruise': 'رحلة بحرية',
'reservations.type.event': 'فعالية',
'reservations.type.tour': 'جولة',
@@ -1799,7 +1808,11 @@ const ar: Record<string, string | { name: string; category: string }[]> = {
'todo.unassigned': 'غير مُسنَد',
'todo.noCategory': 'بدون فئة',
'todo.hasDescription': 'له وصف',
'todo.addItem': 'إضافة مهمة جديدة...',
'todo.addItem': 'إضافة مهمة جديدة',
'todo.sidebar.sortBy': 'ترتيب حسب',
'todo.priority': 'الأولوية',
'todo.newCategoryLabel': 'جديد',
'budget.categoriesLabel': 'فئات',
'todo.newCategory': 'اسم الفئة',
'todo.addCategory': 'إضافة فئة',
'todo.newItem': 'مهمة جديدة',
+15 -2
View File
@@ -986,6 +986,15 @@ const br: Record<string, string | { name: string; category: string }[]> = {
'reservations.meta.flightNumber': 'Nº do voo',
'reservations.meta.from': 'De',
'reservations.meta.to': 'Para',
'reservations.needsReview': 'Verificar',
'reservations.needsReviewHint': 'Aeroporto não pôde ser identificado automaticamente — confirme o local.',
'reservations.searchLocation': 'Buscar estação, porto, endereço...',
'airport.searchPlaceholder': 'Código ou cidade do aeroporto (ex. FRA)',
'map.connections': 'Conexões',
'map.showConnections': 'Mostrar rotas de reservas',
'map.hideConnections': 'Ocultar rotas de reservas',
'settings.bookingLabels': 'Rótulos das rotas de reservas',
'settings.bookingLabelsHint': 'Mostra nomes de estações / aeroportos no mapa. Desativado, apenas o ícone aparece.',
'reservations.meta.trainNumber': 'Nº do trem',
'reservations.meta.platform': 'Plataforma',
'reservations.meta.seat': 'Assento',
@@ -1004,7 +1013,7 @@ const br: Record<string, string | { name: string; category: string }[]> = {
'reservations.type.hotel': 'Hospedagem',
'reservations.type.restaurant': 'Restaurante',
'reservations.type.train': 'Trem',
'reservations.type.car': 'Carro alugado',
'reservations.type.car': 'Carro',
'reservations.type.cruise': 'Cruzeiro',
'reservations.type.event': 'Evento',
'reservations.type.tour': 'Passeio',
@@ -1748,7 +1757,11 @@ const br: Record<string, string | { name: string; category: string }[]> = {
'todo.unassigned': 'Não atribuído',
'todo.noCategory': 'Sem categoria',
'todo.hasDescription': 'Com descrição',
'todo.addItem': 'Adicionar nova tarefa...',
'todo.addItem': 'Nova tarefa',
'todo.sidebar.sortBy': 'Ordenar por',
'todo.priority': 'Prioridade',
'todo.newCategoryLabel': 'nova',
'budget.categoriesLabel': 'categorias',
'todo.newCategory': 'Nome da categoria',
'todo.addCategory': 'Adicionar categoria',
'todo.newItem': 'Nova tarefa',
+15 -2
View File
@@ -1015,6 +1015,15 @@ const cs: Record<string, string | { name: string; category: string }[]> = {
'reservations.meta.flightNumber': 'Číslo letu',
'reservations.meta.from': 'Z',
'reservations.meta.to': 'Do',
'reservations.needsReview': 'Zkontrolovat',
'reservations.needsReviewHint': 'Letiště nebylo možné automaticky rozpoznat — potvrďte prosím místo.',
'reservations.searchLocation': 'Hledat stanici, přístav, adresu...',
'airport.searchPlaceholder': 'Kód letiště nebo město (např. FRA)',
'map.connections': 'Spojení',
'map.showConnections': 'Zobrazit trasy rezervací',
'map.hideConnections': 'Skrýt trasy rezervací',
'settings.bookingLabels': 'Popisky tras rezervací',
'settings.bookingLabelsHint': 'Zobrazuje názvy stanic / letišť na mapě. Pokud je vypnuto, zobrazí se pouze ikona.',
'reservations.meta.trainNumber': 'Číslo vlaku',
'reservations.meta.platform': 'Nástupiště',
'reservations.meta.seat': 'Sedadlo',
@@ -1033,7 +1042,7 @@ const cs: Record<string, string | { name: string; category: string }[]> = {
'reservations.type.hotel': 'Ubytování',
'reservations.type.restaurant': 'Restaurace',
'reservations.type.train': 'Vlak',
'reservations.type.car': 'Pronájem auta',
'reservations.type.car': 'Auto',
'reservations.type.cruise': 'Plavba',
'reservations.type.event': 'Událost',
'reservations.type.tour': 'Prohlídka',
@@ -1753,7 +1762,11 @@ const cs: Record<string, string | { name: string; category: string }[]> = {
'todo.unassigned': 'Nepřiřazeno',
'todo.noCategory': 'Bez kategorie',
'todo.hasDescription': 'Má popis',
'todo.addItem': 'Přidat nový úkol...',
'todo.addItem': 'Přidat nový úkol',
'todo.sidebar.sortBy': 'Řadit podle',
'todo.priority': 'Priorita',
'todo.newCategoryLabel': 'nová',
'budget.categoriesLabel': 'kategorie',
'todo.newCategory': 'Název kategorie',
'todo.addCategory': 'Přidat kategorii',
'todo.newItem': 'Nový úkol',
+6 -2
View File
@@ -1044,7 +1044,7 @@ const de: Record<string, string | { name: string; category: string }[]> = {
'reservations.type.hotel': 'Unterkunft',
'reservations.type.restaurant': 'Restaurant',
'reservations.type.train': 'Zug',
'reservations.type.car': 'Mietwagen',
'reservations.type.car': 'Auto',
'reservations.type.cruise': 'Kreuzfahrt',
'reservations.type.event': 'Veranstaltung',
'reservations.type.tour': 'Tour',
@@ -1765,7 +1765,11 @@ const de: Record<string, string | { name: string; category: string }[]> = {
'todo.unassigned': 'Nicht zugewiesen',
'todo.noCategory': 'Keine Kategorie',
'todo.hasDescription': 'Hat Beschreibung',
'todo.addItem': 'Neue Aufgabe hinzufügen...',
'todo.addItem': 'Neue Aufgabe hinzufügen',
'todo.sidebar.sortBy': 'Sortieren nach',
'todo.priority': 'Priorität',
'todo.newCategoryLabel': 'neu',
'budget.categoriesLabel': 'Kategorien',
'todo.newCategory': 'Kategoriename',
'todo.addCategory': 'Kategorie hinzufügen',
'todo.newItem': 'Neue Aufgabe',
+6 -2
View File
@@ -1097,7 +1097,7 @@ const en: Record<string, string | { name: string; category: string }[]> = {
'reservations.type.hotel': 'Accommodation',
'reservations.type.restaurant': 'Restaurant',
'reservations.type.train': 'Train',
'reservations.type.car': 'Rental Car',
'reservations.type.car': 'Car',
'reservations.type.cruise': 'Cruise',
'reservations.type.event': 'Event',
'reservations.type.tour': 'Tour',
@@ -1827,7 +1827,11 @@ const en: Record<string, string | { name: string; category: string }[]> = {
'todo.unassigned': 'Unassigned',
'todo.noCategory': 'No category',
'todo.hasDescription': 'Has description',
'todo.addItem': 'Add new task...',
'todo.addItem': 'Add new task',
'todo.sidebar.sortBy': 'Sort by',
'todo.priority': 'Priority',
'todo.newCategoryLabel': 'new',
'budget.categoriesLabel': 'categories',
'todo.newCategory': 'Category name',
'todo.addCategory': 'Add category',
'todo.newItem': 'New task',
+15 -2
View File
@@ -990,7 +990,7 @@ const es: Record<string, string> = {
'reservations.type.hotel': 'Alojamiento',
'reservations.type.restaurant': 'Restaurante',
'reservations.type.train': 'Tren',
'reservations.type.car': 'Coche de alquiler',
'reservations.type.car': 'Coche',
'reservations.type.cruise': 'Crucero',
'reservations.type.event': 'Evento',
'reservations.type.tour': 'Excursión',
@@ -1618,6 +1618,15 @@ const es: Record<string, string> = {
'reservations.meta.flightNumber': 'N° de vuelo',
'reservations.meta.from': 'Desde',
'reservations.meta.to': 'Hasta',
'reservations.needsReview': 'Revisar',
'reservations.needsReviewHint': 'No se pudo identificar el aeropuerto automáticamente — por favor confirma la ubicación.',
'reservations.searchLocation': 'Buscar estación, puerto, dirección...',
'airport.searchPlaceholder': 'Código o ciudad del aeropuerto (ej. FRA)',
'map.connections': 'Conexiones',
'map.showConnections': 'Mostrar rutas de reservas',
'map.hideConnections': 'Ocultar rutas de reservas',
'settings.bookingLabels': 'Etiquetas de rutas de reservas',
'settings.bookingLabelsHint': 'Muestra nombres de estaciones / aeropuertos en el mapa. Desactivado, solo se muestra el icono.',
'reservations.meta.trainNumber': 'N° de tren',
'reservations.meta.platform': 'Andén',
'reservations.meta.seat': 'Asiento',
@@ -1758,7 +1767,11 @@ const es: Record<string, string> = {
'todo.unassigned': 'Sin asignar',
'todo.noCategory': 'Sin categoría',
'todo.hasDescription': 'Con descripción',
'todo.addItem': 'Añadir nueva tarea...',
'todo.addItem': 'Nueva tarea',
'todo.sidebar.sortBy': 'Ordenar por',
'todo.priority': 'Prioridad',
'todo.newCategoryLabel': 'nueva',
'budget.categoriesLabel': 'categorías',
'todo.newCategory': 'Nombre de la categoría',
'todo.addCategory': 'Añadir categoría',
'todo.newItem': 'Nueva tarea',
+15 -2
View File
@@ -1013,6 +1013,15 @@ const fr: Record<string, string> = {
'reservations.meta.flightNumber': 'N° de vol',
'reservations.meta.from': 'De',
'reservations.meta.to': 'À',
'reservations.needsReview': 'Vérifier',
'reservations.needsReviewHint': 'L\'aéroport n\'a pas pu être identifié automatiquement — veuillez confirmer l\'emplacement.',
'reservations.searchLocation': 'Rechercher une gare, un port, une adresse…',
'airport.searchPlaceholder': 'Code ou ville de l\'aéroport (ex. FRA)',
'map.connections': 'Connexions',
'map.showConnections': 'Afficher les itinéraires',
'map.hideConnections': 'Masquer les itinéraires',
'settings.bookingLabels': 'Étiquettes des itinéraires',
'settings.bookingLabelsHint': 'Affiche les noms des gares / aéroports sur la carte. Si désactivé, seule l\'icône est affichée.',
'reservations.meta.trainNumber': 'N° de train',
'reservations.meta.platform': 'Quai',
'reservations.meta.seat': 'Place',
@@ -1031,7 +1040,7 @@ const fr: Record<string, string> = {
'reservations.type.hotel': 'Hébergement',
'reservations.type.restaurant': 'Restaurant',
'reservations.type.train': 'Train',
'reservations.type.car': 'Voiture de location',
'reservations.type.car': 'Voiture',
'reservations.type.cruise': 'Croisière',
'reservations.type.event': 'Événement',
'reservations.type.tour': 'Visite',
@@ -1752,7 +1761,11 @@ const fr: Record<string, string> = {
'todo.unassigned': 'Non assigné',
'todo.noCategory': 'Aucune catégorie',
'todo.hasDescription': 'Avec description',
'todo.addItem': 'Ajouter une tâche...',
'todo.addItem': 'Nouvelle tâche',
'todo.sidebar.sortBy': 'Trier par',
'todo.priority': 'Priorité',
'todo.newCategoryLabel': 'nouvelle',
'budget.categoriesLabel': 'catégories',
'todo.newCategory': 'Nom de la catégorie',
'todo.addCategory': 'Ajouter une catégorie',
'todo.newItem': 'Nouvelle tâche',
+15 -2
View File
@@ -1015,6 +1015,15 @@ const hu: Record<string, string | { name: string; category: string }[]> = {
'reservations.meta.flightNumber': 'Járatszám',
'reservations.meta.from': 'Honnan',
'reservations.meta.to': 'Hová',
'reservations.needsReview': 'Ellenőrzés',
'reservations.needsReviewHint': 'A repülőteret nem sikerült automatikusan azonosítani — erősítsd meg a helyet.',
'reservations.searchLocation': 'Állomás, kikötő, cím keresése...',
'airport.searchPlaceholder': 'Repülőtér kódja vagy város (pl. FRA)',
'map.connections': 'Kapcsolatok',
'map.showConnections': 'Foglalási útvonalak megjelenítése',
'map.hideConnections': 'Foglalási útvonalak elrejtése',
'settings.bookingLabels': 'Útvonal-címkék a foglalásokhoz',
'settings.bookingLabelsHint': 'Állomás- / repülőtér-nevek megjelenítése a térképen. Ha ki van kapcsolva, csak az ikon látszik.',
'reservations.meta.trainNumber': 'Vonatszám',
'reservations.meta.platform': 'Vágány',
'reservations.meta.seat': 'Ülés',
@@ -1033,7 +1042,7 @@ const hu: Record<string, string | { name: string; category: string }[]> = {
'reservations.type.hotel': 'Szálloda',
'reservations.type.restaurant': 'Étterem',
'reservations.type.train': 'Vonat',
'reservations.type.car': 'Autóbérlés',
'reservations.type.car': 'Autó',
'reservations.type.cruise': 'Hajóút',
'reservations.type.event': 'Esemény',
'reservations.type.tour': 'Túra',
@@ -1750,7 +1759,11 @@ const hu: Record<string, string | { name: string; category: string }[]> = {
'todo.unassigned': 'Nem hozzárendelt',
'todo.noCategory': 'Nincs kategória',
'todo.hasDescription': 'Van leírás',
'todo.addItem': 'Új feladat hozzáadása...',
'todo.addItem': 'Új feladat',
'todo.sidebar.sortBy': 'Rendezés',
'todo.priority': 'Prioritás',
'todo.newCategoryLabel': 'új',
'budget.categoriesLabel': 'kategóriák',
'todo.newCategory': 'Kategória neve',
'todo.addCategory': 'Kategória hozzáadása',
'todo.newItem': 'Új feladat',
+15 -2
View File
@@ -1070,6 +1070,15 @@ const id: Record<string, string | { name: string; category: string }[]> = {
'reservations.meta.flightNumber': 'No. Penerbangan',
'reservations.meta.from': 'Dari',
'reservations.meta.to': 'Ke',
'reservations.needsReview': 'Tinjau',
'reservations.needsReviewHint': 'Bandara tidak dapat dicocokkan otomatis — konfirmasi lokasi.',
'reservations.searchLocation': 'Cari stasiun, pelabuhan, alamat...',
'airport.searchPlaceholder': 'Kode bandara atau kota (mis. FRA)',
'map.connections': 'Koneksi',
'map.showConnections': 'Tampilkan rute pemesanan',
'map.hideConnections': 'Sembunyikan rute pemesanan',
'settings.bookingLabels': 'Label rute pemesanan',
'settings.bookingLabelsHint': 'Menampilkan nama stasiun / bandara di peta. Jika mati, hanya ikon ditampilkan.',
'reservations.meta.trainNumber': 'No. Kereta',
'reservations.meta.platform': 'Peron',
'reservations.meta.seat': 'Kursi',
@@ -1088,7 +1097,7 @@ const id: Record<string, string | { name: string; category: string }[]> = {
'reservations.type.hotel': 'Akomodasi',
'reservations.type.restaurant': 'Restoran',
'reservations.type.train': 'Kereta',
'reservations.type.car': 'Mobil Sewa',
'reservations.type.car': 'Mobil',
'reservations.type.cruise': 'Kapal Pesiar',
'reservations.type.event': 'Acara',
'reservations.type.tour': 'Tur',
@@ -1818,7 +1827,11 @@ const id: Record<string, string | { name: string; category: string }[]> = {
'todo.unassigned': 'Belum ditugaskan',
'todo.noCategory': 'Tanpa kategori',
'todo.hasDescription': 'Ada deskripsi',
'todo.addItem': 'Tambah tugas baru...',
'todo.addItem': 'Tugas baru',
'todo.sidebar.sortBy': 'Urutkan',
'todo.priority': 'Prioritas',
'todo.newCategoryLabel': 'baru',
'budget.categoriesLabel': 'kategori',
'todo.newCategory': 'Nama kategori',
'todo.addCategory': 'Tambah kategori',
'todo.newItem': 'Tugas baru',
+15 -2
View File
@@ -1014,6 +1014,15 @@ const it: Record<string, string | { name: string; category: string }[]> = {
'reservations.meta.flightNumber': 'N. volo',
'reservations.meta.from': 'Da',
'reservations.meta.to': 'A',
'reservations.needsReview': 'Verifica',
'reservations.needsReviewHint': 'L\'aeroporto non è stato riconosciuto automaticamente — conferma la posizione.',
'reservations.searchLocation': 'Cerca stazione, porto, indirizzo...',
'airport.searchPlaceholder': 'Codice o città dell\'aeroporto (es. FRA)',
'map.connections': 'Connessioni',
'map.showConnections': 'Mostra percorsi prenotati',
'map.hideConnections': 'Nascondi percorsi prenotati',
'settings.bookingLabels': 'Etichette percorsi prenotati',
'settings.bookingLabelsHint': 'Mostra i nomi di stazioni / aeroporti sulla mappa. Se disattivato, viene mostrata solo l\'icona.',
'reservations.meta.trainNumber': 'N. treno',
'reservations.meta.platform': 'Binario',
'reservations.meta.seat': 'Posto',
@@ -1032,7 +1041,7 @@ const it: Record<string, string | { name: string; category: string }[]> = {
'reservations.type.hotel': 'Alloggio',
'reservations.type.restaurant': 'Ristorante',
'reservations.type.train': 'Treno',
'reservations.type.car': 'Auto a noleggio',
'reservations.type.car': 'Auto',
'reservations.type.cruise': 'Crociera',
'reservations.type.event': 'Evento',
'reservations.type.tour': 'Tour',
@@ -1753,7 +1762,11 @@ const it: Record<string, string | { name: string; category: string }[]> = {
'todo.unassigned': 'Non assegnato',
'todo.noCategory': 'Nessuna categoria',
'todo.hasDescription': 'Ha descrizione',
'todo.addItem': 'Aggiungi nuova attività...',
'todo.addItem': 'Nuova attività',
'todo.sidebar.sortBy': 'Ordina per',
'todo.priority': 'Priorità',
'todo.newCategoryLabel': 'nuova',
'budget.categoriesLabel': 'categorie',
'todo.newCategory': 'Nome categoria',
'todo.addCategory': 'Aggiungi categoria',
'todo.newItem': 'Nuova attività',
+15 -2
View File
@@ -1013,6 +1013,15 @@ const nl: Record<string, string> = {
'reservations.meta.flightNumber': 'Vluchtnr.',
'reservations.meta.from': 'Van',
'reservations.meta.to': 'Naar',
'reservations.needsReview': 'Controleren',
'reservations.needsReviewHint': 'Luchthaven kon niet automatisch worden herkend — bevestig de locatie.',
'reservations.searchLocation': 'Station, haven, adres zoeken...',
'airport.searchPlaceholder': 'Luchthavencode of stad (bijv. FRA)',
'map.connections': 'Verbindingen',
'map.showConnections': 'Boekingsroutes tonen',
'map.hideConnections': 'Boekingsroutes verbergen',
'settings.bookingLabels': 'Routelabels voor boekingen',
'settings.bookingLabelsHint': 'Toon station- / luchthavennamen op de kaart. Indien uit, alleen het icoon.',
'reservations.meta.trainNumber': 'Treinnr.',
'reservations.meta.platform': 'Perron',
'reservations.meta.seat': 'Stoel',
@@ -1031,7 +1040,7 @@ const nl: Record<string, string> = {
'reservations.type.hotel': 'Accommodatie',
'reservations.type.restaurant': 'Restaurant',
'reservations.type.train': 'Trein',
'reservations.type.car': 'Huurauto',
'reservations.type.car': 'Auto',
'reservations.type.cruise': 'Cruise',
'reservations.type.event': 'Evenement',
'reservations.type.tour': 'Rondleiding',
@@ -1752,7 +1761,11 @@ const nl: Record<string, string> = {
'todo.unassigned': 'Niet toegewezen',
'todo.noCategory': 'Geen categorie',
'todo.hasDescription': 'Heeft beschrijving',
'todo.addItem': 'Nieuwe taak toevoegen...',
'todo.addItem': 'Nieuwe taak',
'todo.sidebar.sortBy': 'Sorteren op',
'todo.priority': 'Prioriteit',
'todo.newCategoryLabel': 'nieuw',
'budget.categoriesLabel': 'categorieën',
'todo.newCategory': 'Categorienaam',
'todo.addCategory': 'Categorie toevoegen',
'todo.newItem': 'Nieuwe taak',
+14 -1
View File
@@ -989,6 +989,15 @@ const pl: Record<string, string | { name: string; category: string }[]> = {
'reservations.type.restaurant': 'Restauracja',
'reservations.type.train': 'Pociąg',
'reservations.type.car': 'Samochód',
'reservations.needsReview': 'Sprawdź',
'reservations.needsReviewHint': 'Nie udało się automatycznie dopasować lotniska — potwierdź lokalizację.',
'reservations.searchLocation': 'Szukaj stacji, portu, adresu...',
'airport.searchPlaceholder': 'Kod lotniska lub miasto (np. FRA)',
'map.connections': 'Połączenia',
'map.showConnections': 'Pokaż trasy rezerwacji',
'map.hideConnections': 'Ukryj trasy rezerwacji',
'settings.bookingLabels': 'Etykiety tras rezerwacji',
'settings.bookingLabelsHint': 'Pokazuje nazwy stacji / lotnisk na mapie. Gdy wyłączone, wyświetlana jest tylko ikona.',
'reservations.type.cruise': 'Rejs',
'reservations.type.event': 'Wydarzenie',
'reservations.type.tour': 'Wycieczka',
@@ -1801,7 +1810,11 @@ const pl: Record<string, string | { name: string; category: string }[]> = {
'todo.unassigned': 'Nieprzypisane',
'todo.noCategory': 'Brak kategorii',
'todo.hasDescription': 'Ma opis',
'todo.addItem': 'Dodaj nowe zadanie...',
'todo.addItem': 'Nowe zadanie',
'todo.sidebar.sortBy': 'Sortuj wg',
'todo.priority': 'Priorytet',
'todo.newCategoryLabel': 'nowa',
'budget.categoriesLabel': 'kategorie',
'todo.newCategory': 'Nazwa kategorii',
'todo.addCategory': 'Dodaj kategorię',
'todo.newItem': 'Nowe zadanie',
+15 -2
View File
@@ -1013,6 +1013,15 @@ const ru: Record<string, string> = {
'reservations.meta.flightNumber': 'Номер рейса',
'reservations.meta.from': 'Откуда',
'reservations.meta.to': 'Куда',
'reservations.needsReview': 'Проверить',
'reservations.needsReviewHint': 'Аэропорт не удалось определить автоматически — подтвердите местоположение.',
'reservations.searchLocation': 'Искать станцию, порт, адрес...',
'airport.searchPlaceholder': 'Код аэропорта или город (напр. FRA)',
'map.connections': 'Соединения',
'map.showConnections': 'Показать маршруты бронирований',
'map.hideConnections': 'Скрыть маршруты бронирований',
'settings.bookingLabels': 'Подписи маршрутов бронирований',
'settings.bookingLabelsHint': 'Отображает названия станций / аэропортов на карте. Если выключено, показывается только значок.',
'reservations.meta.trainNumber': 'Номер поезда',
'reservations.meta.platform': 'Платформа',
'reservations.meta.seat': 'Место',
@@ -1031,7 +1040,7 @@ const ru: Record<string, string> = {
'reservations.type.hotel': 'Жильё',
'reservations.type.restaurant': 'Ресторан',
'reservations.type.train': 'Поезд',
'reservations.type.car': 'Аренда авто',
'reservations.type.car': 'Автомобиль',
'reservations.type.cruise': 'Круиз',
'reservations.type.event': 'Мероприятие',
'reservations.type.tour': 'Экскурсия',
@@ -1749,7 +1758,11 @@ const ru: Record<string, string> = {
'todo.unassigned': 'Не назначено',
'todo.noCategory': 'Без категории',
'todo.hasDescription': 'Есть описание',
'todo.addItem': 'Добавить новую задачу...',
'todo.addItem': 'Новая задача',
'todo.sidebar.sortBy': 'Сортировать по',
'todo.priority': 'Приоритет',
'todo.newCategoryLabel': 'новая',
'budget.categoriesLabel': 'категорий',
'todo.newCategory': 'Название категории',
'todo.addCategory': 'Добавить категорию',
'todo.newItem': 'Новая задача',
+15 -2
View File
@@ -1013,6 +1013,15 @@ const zh: Record<string, string> = {
'reservations.meta.flightNumber': '航班号',
'reservations.meta.from': '出发',
'reservations.meta.to': '到达',
'reservations.needsReview': '待确认',
'reservations.needsReviewHint': '无法自动匹配机场 — 请确认位置。',
'reservations.searchLocation': '搜索车站、港口、地址...',
'airport.searchPlaceholder': '机场代码或城市(如 FRA',
'map.connections': '连接',
'map.showConnections': '显示预订路线',
'map.hideConnections': '隐藏预订路线',
'settings.bookingLabels': '预订路线标签',
'settings.bookingLabelsHint': '在地图上显示车站 / 机场名称。关闭时仅显示图标。',
'reservations.meta.trainNumber': '车次',
'reservations.meta.platform': '站台',
'reservations.meta.seat': '座位',
@@ -1031,7 +1040,7 @@ const zh: Record<string, string> = {
'reservations.type.hotel': '住宿',
'reservations.type.restaurant': '餐厅',
'reservations.type.train': '火车',
'reservations.type.car': '车',
'reservations.type.car': '车',
'reservations.type.cruise': '邮轮',
'reservations.type.event': '活动',
'reservations.type.tour': '旅游团',
@@ -1749,7 +1758,11 @@ const zh: Record<string, string> = {
'todo.unassigned': '未分配',
'todo.noCategory': '无分类',
'todo.hasDescription': '有描述',
'todo.addItem': '添加新任务...',
'todo.addItem': '新建任务',
'todo.sidebar.sortBy': '排序方式',
'todo.priority': '优先级',
'todo.newCategoryLabel': '新建',
'budget.categoriesLabel': '类别',
'todo.newCategory': '分类名称',
'todo.addCategory': '添加分类',
'todo.newItem': '新任务',
+15 -2
View File
@@ -1069,6 +1069,15 @@ const zhTw: Record<string, string> = {
'reservations.meta.flightNumber': '航班號',
'reservations.meta.from': '出發',
'reservations.meta.to': '到達',
'reservations.needsReview': '待確認',
'reservations.needsReviewHint': '無法自動匹配機場 — 請確認位置。',
'reservations.searchLocation': '搜尋車站、港口、地址...',
'airport.searchPlaceholder': '機場代碼或城市(例如 FRA',
'map.connections': '連接',
'map.showConnections': '顯示預訂路線',
'map.hideConnections': '隱藏預訂路線',
'settings.bookingLabels': '預訂路線標籤',
'settings.bookingLabelsHint': '在地圖上顯示車站 / 機場名稱。關閉時僅顯示圖示。',
'reservations.meta.trainNumber': '車次',
'reservations.meta.platform': '站臺',
'reservations.meta.seat': '座位',
@@ -1087,7 +1096,7 @@ const zhTw: Record<string, string> = {
'reservations.type.hotel': '住宿',
'reservations.type.restaurant': '餐廳',
'reservations.type.train': '火車',
'reservations.type.car': '車',
'reservations.type.car': '車',
'reservations.type.cruise': '郵輪',
'reservations.type.event': '活動',
'reservations.type.tour': '旅遊團',
@@ -1766,7 +1775,11 @@ const zhTw: Record<string, string> = {
'todo.unassigned': '未指派',
'todo.noCategory': '無分類',
'todo.hasDescription': '有說明',
'todo.addItem': '新增任務...',
'todo.addItem': '新增任務',
'todo.sidebar.sortBy': '排序方式',
'todo.priority': '優先順序',
'todo.newCategoryLabel': '新增',
'budget.categoriesLabel': '類別',
'todo.newCategory': '分類名稱',
'todo.addCategory': '新增分類',
'todo.newItem': '新任務',