feat(collections): import a whole trip's places into a list (#1903)

* feat(collections): preview which of a trip's places a list already holds

The bulk import endpoint has been there since the select-mode copy, but nothing
calls it and it only reports duplicates after the fact. A dialog needs the verdict
up front, so /:id/importable/:tripId returns the trip's places with the duplicate
check the import itself applies, plus whether any day holds the place.

* feat(collections): import a whole trip's places into a list

Two steps: pick a trip, then tick its places. Places already on the list are
greyed out and unpickable, and the ones no day holds start selected — those are
the plans a trip left behind, which is the reason to import at all. Sorted so a
mostly-saved trip reads as the two that are left rather than a wall of grey.

* feat(collections): reach the trip import from the filter row and an empty list

* i18n(collections): translate the trip import into all locales

* fix(collections): stop the label dialog's buttons wrapping mid-word

Three actions in a max-w-sm footer wrapped into two lines each. The assign
button also painted white text on the accent, which disappears on a light one.

* docs(collections): document the trip import
This commit is contained in:
Maurice
2026-08-12 11:54:36 +02:00
committed by GitHub
parent b0fd73681b
commit b842d74a5d
37 changed files with 1286 additions and 11 deletions
@@ -314,3 +314,28 @@ export const collectionMembershipSchema = z.object({
lists: z.array(z.object({ collection_id: z.number(), name: z.string(), place_id: z.number() })),
});
export type CollectionMembership = z.infer<typeof collectionMembershipSchema>;
/** One trip place as offered by the import preview. `already_in_list` is the SAME dedup
* verdict the bulk import applies (name, or coordinates within tolerance), resolved on the
* server so the dialog can never disagree with what the write path then does. `scheduled`
* is false for a place no day holds — the ones a trip left behind, which is exactly what
* the import is for, so the dialog pre-selects them. */
export const collectionImportablePlaceSchema = z.object({
place_id: z.number(),
name: z.string(),
address: z.string().nullable(),
lat: z.number().nullable(),
lng: z.number().nullable(),
category_id: z.number().nullable(),
image_url: z.string().nullable(),
already_in_list: z.boolean(),
scheduled: z.boolean(),
day_number: z.number().nullable(),
date: z.string().nullable(),
});
export type CollectionImportablePlace = z.infer<typeof collectionImportablePlaceSchema>;
export const collectionImportablesResponseSchema = z.object({
places: z.array(collectionImportablePlaceSchema),
});
export type CollectionImportablesResponse = z.infer<typeof collectionImportablesResponseSchema>;
+20
View File
@@ -36,6 +36,26 @@ const collection: TranslationStrings = {
'collections.addPlace': 'إضافة مكان',
'collections.addPlaceSearch': 'ابحث عن مكان…',
'collections.addPlaceHint': 'ابحث لإضافة مكان إلى هذه القائمة',
'collections.importFromTrip': 'استيراد من رحلة',
'collections.importTitle': 'استيراد من رحلة',
'collections.importDoneTitle': 'اكتمل الاستيراد',
'collections.importPickTripHint': 'اختر رحلة وانقل أماكنها إلى {name}.',
'collections.importNoTrips': 'لا توجد رحلات بعد',
'collections.importPlacesCount': '{count} أماكن',
'collections.importSearchPlaces': 'البحث عن أماكن…',
'collections.importOnlyNew': 'الجديد فقط',
'collections.importSelectAll': 'تحديد الكل',
'collections.importClearSelection': 'إلغاء التحديد',
'collections.importAlreadySaved': 'محفوظ بالفعل',
'collections.importUnscheduled': 'بدون يوم',
'collections.importOnDay': 'اليوم {count}',
'collections.importSelectedCount': 'تم تحديد {count}',
'collections.importAction': 'استيراد {count}',
'collections.importEmptyTrip': 'لا تحتوي هذه الرحلة على أماكن بعد',
'collections.importNothingNew': 'كل شيء من هذه الرحلة موجود بالفعل في القائمة',
'collections.importDone': 'تمت إضافة {count} أماكن',
'collections.importDoneSkipped': '{count} كانت موجودة بالفعل وبقيت كما هي',
'collections.importDoneClean': 'جميعها الآن في {name}',
'collections.sort.default': 'افتراضي',
'collections.sort.nameAsc': 'الاسم (أ–ي)',
'collections.coordinates': 'الإحداثيات',
+20
View File
@@ -36,6 +36,26 @@ const collection: TranslationStrings = {
'collections.addPlace': 'Adicionar um lugar',
'collections.addPlaceSearch': 'Pesquisar um lugar…',
'collections.addPlaceHint': 'Pesquise para adicionar um lugar a esta lista',
'collections.importFromTrip': 'Importar de uma viagem',
'collections.importTitle': 'Importar de uma viagem',
'collections.importDoneTitle': 'Importação concluída',
'collections.importPickTripHint': 'Escolha uma viagem e leve os lugares dela para {name}.',
'collections.importNoTrips': 'Nenhuma viagem ainda',
'collections.importPlacesCount': '{count} lugares',
'collections.importSearchPlaces': 'Buscar lugares…',
'collections.importOnlyNew': 'Apenas novos',
'collections.importSelectAll': 'Selecionar tudo',
'collections.importClearSelection': 'Limpar seleção',
'collections.importAlreadySaved': 'Já salvo',
'collections.importUnscheduled': 'Sem dia',
'collections.importOnDay': 'Dia {count}',
'collections.importSelectedCount': '{count} selecionados',
'collections.importAction': 'Importar {count}',
'collections.importEmptyTrip': 'Esta viagem ainda não tem lugares',
'collections.importNothingNew': 'Tudo desta viagem já está nesta lista',
'collections.importDone': '{count} lugares adicionados',
'collections.importDoneSkipped': '{count} já estavam na lista e ficaram como estavam',
'collections.importDoneClean': 'Agora estão todos em {name}',
'collections.sort.default': 'Padrão',
'collections.sort.nameAsc': 'Nome (A–Z)',
'collections.coordinates': 'Coordenadas',
+20
View File
@@ -36,6 +36,26 @@ const collection: TranslationStrings = {
'collections.addPlace': 'Afegir un lloc',
'collections.addPlaceSearch': 'Cercar un lloc…',
'collections.addPlaceHint': 'Cerca per afegir un lloc a aquesta llista',
'collections.importFromTrip': 'Importa des d’un viatge',
'collections.importTitle': 'Importa des d’un viatge',
'collections.importDoneTitle': 'Importació acabada',
'collections.importPickTripHint': 'Tria un viatge i porta’n els llocs a {name}.',
'collections.importNoTrips': 'Encara no hi ha viatges',
'collections.importPlacesCount': '{count} llocs',
'collections.importSearchPlaces': 'Cerca llocs…',
'collections.importOnlyNew': 'Només nous',
'collections.importSelectAll': 'Selecciona-ho tot',
'collections.importClearSelection': 'Esborra la selecció',
'collections.importAlreadySaved': 'Ja desat',
'collections.importUnscheduled': 'Sense dia',
'collections.importOnDay': 'Dia {count}',
'collections.importSelectedCount': '{count} seleccionats',
'collections.importAction': 'Importa {count}',
'collections.importEmptyTrip': 'Aquest viatge encara no té llocs',
'collections.importNothingNew': 'Tot aquest viatge ja és en aquesta llista',
'collections.importDone': 'S’han afegit {count} llocs',
'collections.importDoneSkipped': '{count} ja hi eren i s’han deixat igual',
'collections.importDoneClean': 'Ara són tots a {name}',
'collections.sort.default': 'Predeterminat',
'collections.sort.nameAsc': 'Nom (A–Z)',
'collections.coordinates': 'Coordenades',
+20
View File
@@ -36,6 +36,26 @@ const collection: TranslationStrings = {
'collections.addPlace': 'Přidat místo',
'collections.addPlaceSearch': 'Hledat místo…',
'collections.addPlaceHint': 'Vyhledejte a přidejte místo do tohoto seznamu',
'collections.importFromTrip': 'Importovat z cesty',
'collections.importTitle': 'Importovat z cesty',
'collections.importDoneTitle': 'Import dokončen',
'collections.importPickTripHint': 'Vyber cestu a přenes její místa do {name}.',
'collections.importNoTrips': 'Zatím žádné cesty',
'collections.importPlacesCount': '{count} míst',
'collections.importSearchPlaces': 'Hledat místa…',
'collections.importOnlyNew': 'Jen nová',
'collections.importSelectAll': 'Vybrat vše',
'collections.importClearSelection': 'Zrušit výběr',
'collections.importAlreadySaved': 'Již uloženo',
'collections.importUnscheduled': 'Bez dne',
'collections.importOnDay': 'Den {count}',
'collections.importSelectedCount': 'Vybráno: {count}',
'collections.importAction': 'Importovat {count}',
'collections.importEmptyTrip': 'Tato cesta zatím nemá žádná místa',
'collections.importNothingNew': 'Vše z této cesty už na seznamu je',
'collections.importDone': 'Přidáno {count} míst',
'collections.importDoneSkipped': '{count} už na seznamu bylo a zůstalo beze změny',
'collections.importDoneClean': 'Teď jsou všechna v {name}',
'collections.sort.default': 'Výchozí',
'collections.sort.nameAsc': 'Název (A–Z)',
'collections.coordinates': 'Souřadnice',
+20
View File
@@ -36,6 +36,26 @@ const collection: TranslationStrings = {
'collections.addPlace': 'Ort hinzufügen',
'collections.addPlaceSearch': 'Nach einem Ort suchen…',
'collections.addPlaceHint': 'Suchen, um einen Ort zur Liste hinzuzufügen',
'collections.importFromTrip': 'Aus einer Reise übernehmen',
'collections.importTitle': 'Aus einer Reise übernehmen',
'collections.importDoneTitle': 'Übernahme abgeschlossen',
'collections.importPickTripHint': 'Wähle eine Reise und übernimm ihre Orte in {name}.',
'collections.importNoTrips': 'Noch keine Reisen',
'collections.importPlacesCount': '{count} Orte',
'collections.importSearchPlaces': 'Orte durchsuchen…',
'collections.importOnlyNew': 'Nur neue',
'collections.importSelectAll': 'Alle auswählen',
'collections.importClearSelection': 'Auswahl aufheben',
'collections.importAlreadySaved': 'Schon gespeichert',
'collections.importUnscheduled': 'Ohne Tag',
'collections.importOnDay': 'Tag {count}',
'collections.importSelectedCount': '{count} ausgewählt',
'collections.importAction': '{count} übernehmen',
'collections.importEmptyTrip': 'Diese Reise hat noch keine Orte',
'collections.importNothingNew': 'Alles aus dieser Reise steht schon auf der Liste',
'collections.importDone': '{count} Orte hinzugefügt',
'collections.importDoneSkipped': '{count} standen schon auf der Liste und blieben unverändert',
'collections.importDoneClean': 'Sie stehen jetzt alle in {name}',
'collections.sort.default': 'Standard',
'collections.sort.nameAsc': 'Name (A–Z)',
'collections.coordinates': 'Koordinaten',
+20
View File
@@ -36,6 +36,26 @@ const collection: TranslationStrings = {
'collections.addPlace': 'Add a place',
'collections.addPlaceSearch': 'Search for a place…',
'collections.addPlaceHint': 'Search to add a place to this list',
'collections.importFromTrip': 'Import from a trip',
'collections.importTitle': 'Import from a trip',
'collections.importDoneTitle': 'Import finished',
'collections.importPickTripHint': 'Pick a trip and take its places into {name}.',
'collections.importNoTrips': 'No trips yet',
'collections.importPlacesCount': '{count} places',
'collections.importSearchPlaces': 'Search places…',
'collections.importOnlyNew': 'Only new',
'collections.importSelectAll': 'Select all',
'collections.importClearSelection': 'Clear selection',
'collections.importAlreadySaved': 'Already saved',
'collections.importUnscheduled': 'Unscheduled',
'collections.importOnDay': 'Day {count}',
'collections.importSelectedCount': '{count} selected',
'collections.importAction': 'Import {count}',
'collections.importEmptyTrip': 'This trip has no places yet',
'collections.importNothingNew': 'Everything from this trip is already on this list',
'collections.importDone': '{count} places added',
'collections.importDoneSkipped': '{count} were already on the list and stayed as they were',
'collections.importDoneClean': 'They are all in {name} now',
'collections.sort.default': 'Default',
'collections.sort.nameAsc': 'Name (A–Z)',
'collections.coordinates': 'Coordinates',
+20
View File
@@ -36,6 +36,26 @@ const collection: TranslationStrings = {
'collections.addPlace': 'Añadir un lugar',
'collections.addPlaceSearch': 'Buscar un lugar…',
'collections.addPlaceHint': 'Busca para añadir un lugar a esta lista',
'collections.importFromTrip': 'Importar de un viaje',
'collections.importTitle': 'Importar de un viaje',
'collections.importDoneTitle': 'Importación terminada',
'collections.importPickTripHint': 'Elige un viaje y lleva sus lugares a {name}.',
'collections.importNoTrips': 'Aún no hay viajes',
'collections.importPlacesCount': '{count} lugares',
'collections.importSearchPlaces': 'Buscar lugares…',
'collections.importOnlyNew': 'Solo nuevos',
'collections.importSelectAll': 'Seleccionar todo',
'collections.importClearSelection': 'Quitar selección',
'collections.importAlreadySaved': 'Ya guardado',
'collections.importUnscheduled': 'Sin día',
'collections.importOnDay': 'Día {count}',
'collections.importSelectedCount': '{count} seleccionados',
'collections.importAction': 'Importar {count}',
'collections.importEmptyTrip': 'Este viaje aún no tiene lugares',
'collections.importNothingNew': 'Todo este viaje ya está en la lista',
'collections.importDone': 'Se añadieron {count} lugares',
'collections.importDoneSkipped': '{count} ya estaban en la lista y se quedaron igual',
'collections.importDoneClean': 'Ahora están todos en {name}',
'collections.sort.default': 'Predeterminado',
'collections.sort.nameAsc': 'Nombre (A–Z)',
'collections.coordinates': 'Coordenadas',
+20
View File
@@ -36,6 +36,26 @@ const collection: TranslationStrings = {
'collections.addPlace': 'Ajouter un lieu',
'collections.addPlaceSearch': 'Rechercher un lieu…',
'collections.addPlaceHint': 'Recherchez pour ajouter un lieu à cette liste',
'collections.importFromTrip': 'Importer depuis un voyage',
'collections.importTitle': 'Importer depuis un voyage',
'collections.importDoneTitle': 'Import terminé',
'collections.importPickTripHint': 'Choisissez un voyage et récupérez ses lieux dans {name}.',
'collections.importNoTrips': 'Aucun voyage pour l’instant',
'collections.importPlacesCount': '{count} lieux',
'collections.importSearchPlaces': 'Rechercher des lieux…',
'collections.importOnlyNew': 'Nouveaux seulement',
'collections.importSelectAll': 'Tout sélectionner',
'collections.importClearSelection': 'Effacer la sélection',
'collections.importAlreadySaved': 'Déjà enregistré',
'collections.importUnscheduled': 'Sans jour',
'collections.importOnDay': 'Jour {count}',
'collections.importSelectedCount': '{count} sélectionnés',
'collections.importAction': 'Importer {count}',
'collections.importEmptyTrip': 'Ce voyage n’a pas encore de lieux',
'collections.importNothingNew': 'Tout ce voyage figure déjà dans cette liste',
'collections.importDone': '{count} lieux ajoutés',
'collections.importDoneSkipped': '{count} y étaient déjà et n’ont pas bougé',
'collections.importDoneClean': 'Ils sont tous dans {name} maintenant',
'collections.sort.default': 'Par défaut',
'collections.sort.nameAsc': 'Nom (A–Z)',
'collections.coordinates': 'Coordonnées',
+20
View File
@@ -36,6 +36,26 @@ const collection: TranslationStrings = {
'collections.addPlace': 'Προσθήκη τόπου',
'collections.addPlaceSearch': 'Αναζήτηση τόπου…',
'collections.addPlaceHint': 'Αναζητήστε για να προσθέσετε έναν τόπο σε αυτήν τη λίστα',
'collections.importFromTrip': 'Εισαγωγή από ταξίδι',
'collections.importTitle': 'Εισαγωγή από ταξίδι',
'collections.importDoneTitle': 'Η εισαγωγή ολοκληρώθηκε',
'collections.importPickTripHint': 'Διάλεξε ένα ταξίδι και πέρασε τα μέρη του στη λίστα {name}.',
'collections.importNoTrips': 'Δεν υπάρχουν ακόμη ταξίδια',
'collections.importPlacesCount': '{count} μέρη',
'collections.importSearchPlaces': 'Αναζήτηση μερών…',
'collections.importOnlyNew': 'Μόνο νέα',
'collections.importSelectAll': 'Επιλογή όλων',
'collections.importClearSelection': 'Καθαρισμός επιλογής',
'collections.importAlreadySaved': 'Ήδη αποθηκευμένο',
'collections.importUnscheduled': 'Χωρίς ημέρα',
'collections.importOnDay': 'Ημέρα {count}',
'collections.importSelectedCount': 'Επιλέχθηκαν {count}',
'collections.importAction': 'Εισαγωγή {count}',
'collections.importEmptyTrip': 'Αυτό το ταξίδι δεν έχει ακόμη μέρη',
'collections.importNothingNew': 'Όλα από αυτό το ταξίδι είναι ήδη στη λίστα',
'collections.importDone': 'Προστέθηκαν {count} μέρη',
'collections.importDoneSkipped': '{count} ήταν ήδη στη λίστα και έμειναν ως είχαν',
'collections.importDoneClean': 'Είναι όλα τώρα στη λίστα {name}',
'collections.sort.default': 'Προεπιλογή',
'collections.sort.nameAsc': 'Όνομα (Α–Ω)',
'collections.coordinates': 'Συντεταγμένες',
+20
View File
@@ -36,6 +36,26 @@ const collection: TranslationStrings = {
'collections.addPlace': 'Hely hozzáadása',
'collections.addPlaceSearch': 'Hely keresése…',
'collections.addPlaceHint': 'Keressen, hogy helyet adjon a listához',
'collections.importFromTrip': 'Importálás egy utazásból',
'collections.importTitle': 'Importálás egy utazásból',
'collections.importDoneTitle': 'Az importálás kész',
'collections.importPickTripHint': 'Válassz egy utazást, és vedd át a helyeit ide: {name}.',
'collections.importNoTrips': 'Még nincs utazás',
'collections.importPlacesCount': '{count} hely',
'collections.importSearchPlaces': 'Helyek keresése…',
'collections.importOnlyNew': 'Csak az újak',
'collections.importSelectAll': 'Összes kijelölése',
'collections.importClearSelection': 'Kijelölés törlése',
'collections.importAlreadySaved': 'Már mentve',
'collections.importUnscheduled': 'Nap nélkül',
'collections.importOnDay': '{count}. nap',
'collections.importSelectedCount': '{count} kijelölve',
'collections.importAction': '{count} importálása',
'collections.importEmptyTrip': 'Ennek az utazásnak még nincsenek helyei',
'collections.importNothingNew': 'Ebből az utazásból már minden rajta van a listán',
'collections.importDone': '{count} hely hozzáadva',
'collections.importDoneSkipped': '{count} már a listán volt, és változatlan maradt',
'collections.importDoneClean': 'Most már mind itt van: {name}',
'collections.sort.default': 'Alapértelmezett',
'collections.sort.nameAsc': 'Név (A–Z)',
'collections.coordinates': 'Koordináták',
+20
View File
@@ -36,6 +36,26 @@ const collection: TranslationStrings = {
'collections.addPlace': 'Tambah tempat',
'collections.addPlaceSearch': 'Cari tempat…',
'collections.addPlaceHint': 'Cari untuk menambahkan tempat ke daftar ini',
'collections.importFromTrip': 'Impor dari perjalanan',
'collections.importTitle': 'Impor dari perjalanan',
'collections.importDoneTitle': 'Impor selesai',
'collections.importPickTripHint': 'Pilih perjalanan dan bawa tempatnya ke {name}.',
'collections.importNoTrips': 'Belum ada perjalanan',
'collections.importPlacesCount': '{count} tempat',
'collections.importSearchPlaces': 'Cari tempat…',
'collections.importOnlyNew': 'Hanya yang baru',
'collections.importSelectAll': 'Pilih semua',
'collections.importClearSelection': 'Hapus pilihan',
'collections.importAlreadySaved': 'Sudah tersimpan',
'collections.importUnscheduled': 'Tanpa hari',
'collections.importOnDay': 'Hari {count}',
'collections.importSelectedCount': '{count} dipilih',
'collections.importAction': 'Impor {count}',
'collections.importEmptyTrip': 'Perjalanan ini belum punya tempat',
'collections.importNothingNew': 'Semua dari perjalanan ini sudah ada di daftar',
'collections.importDone': '{count} tempat ditambahkan',
'collections.importDoneSkipped': '{count} sudah ada di daftar dan dibiarkan apa adanya',
'collections.importDoneClean': 'Semuanya kini ada di {name}',
'collections.sort.default': 'Bawaan',
'collections.sort.nameAsc': 'Nama (A–Z)',
'collections.coordinates': 'Koordinat',
+20
View File
@@ -36,6 +36,26 @@ const collection: TranslationStrings = {
'collections.addPlace': 'Aggiungi un luogo',
'collections.addPlaceSearch': 'Cerca un luogo…',
'collections.addPlaceHint': 'Cerca per aggiungere un luogo a questo elenco',
'collections.importFromTrip': 'Importa da un viaggio',
'collections.importTitle': 'Importa da un viaggio',
'collections.importDoneTitle': 'Importazione completata',
'collections.importPickTripHint': 'Scegli un viaggio e porta i suoi luoghi in {name}.',
'collections.importNoTrips': 'Ancora nessun viaggio',
'collections.importPlacesCount': '{count} luoghi',
'collections.importSearchPlaces': 'Cerca luoghi…',
'collections.importOnlyNew': 'Solo nuovi',
'collections.importSelectAll': 'Seleziona tutto',
'collections.importClearSelection': 'Azzera selezione',
'collections.importAlreadySaved': 'Già salvato',
'collections.importUnscheduled': 'Senza giorno',
'collections.importOnDay': 'Giorno {count}',
'collections.importSelectedCount': '{count} selezionati',
'collections.importAction': 'Importa {count}',
'collections.importEmptyTrip': 'Questo viaggio non ha ancora luoghi',
'collections.importNothingNew': 'Tutto questo viaggio è già in questa lista',
'collections.importDone': 'Aggiunti {count} luoghi',
'collections.importDoneSkipped': '{count} erano già in lista e sono rimasti com’erano',
'collections.importDoneClean': 'Ora sono tutti in {name}',
'collections.sort.default': 'Predefinito',
'collections.sort.nameAsc': 'Nome (A–Z)',
'collections.coordinates': 'Coordinate',
+20
View File
@@ -36,6 +36,26 @@ const collection: TranslationStrings = {
'collections.addPlace': '場所を追加',
'collections.addPlaceSearch': '場所を検索…',
'collections.addPlaceHint': '検索してこのリストに場所を追加',
'collections.importFromTrip': '旅行から取り込む',
'collections.importTitle': '旅行から取り込む',
'collections.importDoneTitle': '取り込みが完了しました',
'collections.importPickTripHint': '旅行を選んで、その場所を{name}に取り込みます。',
'collections.importNoTrips': 'まだ旅行がありません',
'collections.importPlacesCount': '{count}件の場所',
'collections.importSearchPlaces': '場所を検索…',
'collections.importOnlyNew': '新しいものだけ',
'collections.importSelectAll': 'すべて選択',
'collections.importClearSelection': '選択を解除',
'collections.importAlreadySaved': '保存済み',
'collections.importUnscheduled': '日程なし',
'collections.importOnDay': '{count}日目',
'collections.importSelectedCount': '{count}件選択中',
'collections.importAction': '{count}件を取り込む',
'collections.importEmptyTrip': 'この旅行にはまだ場所がありません',
'collections.importNothingNew': 'この旅行の場所はすべてリストにあります',
'collections.importDone': '{count}件の場所を追加しました',
'collections.importDoneSkipped': '{count}件はすでにリストにあり、そのままにしました',
'collections.importDoneClean': 'すべて{name}に入りました',
'collections.sort.default': 'デフォルト',
'collections.sort.nameAsc': '名前順(A–Z)',
'collections.coordinates': '座標',
+20
View File
@@ -36,6 +36,26 @@ const collection: TranslationStrings = {
'collections.addPlace': '장소 추가',
'collections.addPlaceSearch': '장소 검색…',
'collections.addPlaceHint': '검색하여 이 목록에 장소 추가',
'collections.importFromTrip': '여행에서 가져오기',
'collections.importTitle': '여행에서 가져오기',
'collections.importDoneTitle': '가져오기 완료',
'collections.importPickTripHint': '여행을 골라 그곳의 장소를 {name}(으)로 가져옵니다.',
'collections.importNoTrips': '아직 여행이 없습니다',
'collections.importPlacesCount': '장소 {count}개',
'collections.importSearchPlaces': '장소 검색…',
'collections.importOnlyNew': '새 항목만',
'collections.importSelectAll': '전체 선택',
'collections.importClearSelection': '선택 해제',
'collections.importAlreadySaved': '이미 저장됨',
'collections.importUnscheduled': '날짜 없음',
'collections.importOnDay': '{count}일차',
'collections.importSelectedCount': '{count}개 선택됨',
'collections.importAction': '{count}개 가져오기',
'collections.importEmptyTrip': '이 여행에는 아직 장소가 없습니다',
'collections.importNothingNew': '이 여행의 장소는 모두 목록에 있습니다',
'collections.importDone': '장소 {count}개를 추가했습니다',
'collections.importDoneSkipped': '{count}개는 이미 목록에 있어 그대로 두었습니다',
'collections.importDoneClean': '이제 모두 {name}에 있습니다',
'collections.sort.default': '기본',
'collections.sort.nameAsc': '이름순 (A–Z)',
'collections.coordinates': '좌표',
+20
View File
@@ -36,6 +36,26 @@ const collection: TranslationStrings = {
'collections.addPlace': 'Plaats toevoegen',
'collections.addPlaceSearch': 'Zoek een plaats…',
'collections.addPlaceHint': 'Zoek om een plaats aan deze lijst toe te voegen',
'collections.importFromTrip': 'Importeren uit een reis',
'collections.importTitle': 'Importeren uit een reis',
'collections.importDoneTitle': 'Import klaar',
'collections.importPickTripHint': 'Kies een reis en haal de plekken ervan naar {name}.',
'collections.importNoTrips': 'Nog geen reizen',
'collections.importPlacesCount': '{count} plekken',
'collections.importSearchPlaces': 'Plekken zoeken…',
'collections.importOnlyNew': 'Alleen nieuwe',
'collections.importSelectAll': 'Alles selecteren',
'collections.importClearSelection': 'Selectie wissen',
'collections.importAlreadySaved': 'Al opgeslagen',
'collections.importUnscheduled': 'Zonder dag',
'collections.importOnDay': 'Dag {count}',
'collections.importSelectedCount': '{count} geselecteerd',
'collections.importAction': '{count} importeren',
'collections.importEmptyTrip': 'Deze reis heeft nog geen plekken',
'collections.importNothingNew': 'Alles uit deze reis staat al op deze lijst',
'collections.importDone': '{count} plekken toegevoegd',
'collections.importDoneSkipped': '{count} stonden er al op en zijn ongewijzigd gebleven',
'collections.importDoneClean': 'Ze staan nu allemaal in {name}',
'collections.sort.default': 'Standaard',
'collections.sort.nameAsc': 'Naam (A–Z)',
'collections.coordinates': 'Coördinaten',
+20
View File
@@ -36,6 +36,26 @@ const collection: TranslationStrings = {
'collections.addPlace': 'Dodaj miejsce',
'collections.addPlaceSearch': 'Wyszukaj miejsce…',
'collections.addPlaceHint': 'Wyszukaj, aby dodać miejsce do tej listy',
'collections.importFromTrip': 'Importuj z podróży',
'collections.importTitle': 'Importuj z podróży',
'collections.importDoneTitle': 'Import zakończony',
'collections.importPickTripHint': 'Wybierz podróż i przenieś jej miejsca do {name}.',
'collections.importNoTrips': 'Brak podróży',
'collections.importPlacesCount': '{count} miejsc',
'collections.importSearchPlaces': 'Szukaj miejsc…',
'collections.importOnlyNew': 'Tylko nowe',
'collections.importSelectAll': 'Zaznacz wszystko',
'collections.importClearSelection': 'Wyczyść zaznaczenie',
'collections.importAlreadySaved': 'Już zapisane',
'collections.importUnscheduled': 'Bez dnia',
'collections.importOnDay': 'Dzień {count}',
'collections.importSelectedCount': 'Zaznaczono: {count}',
'collections.importAction': 'Importuj {count}',
'collections.importEmptyTrip': 'Ta podróż nie ma jeszcze miejsc',
'collections.importNothingNew': 'Wszystko z tej podróży jest już na liście',
'collections.importDone': 'Dodano {count} miejsc',
'collections.importDoneSkipped': '{count} było już na liście i zostało bez zmian',
'collections.importDoneClean': 'Teraz wszystkie są w {name}',
'collections.sort.default': 'Domyślnie',
'collections.sort.nameAsc': 'Nazwa (A–Z)',
'collections.coordinates': 'Współrzędne',
+20
View File
@@ -36,6 +36,26 @@ const collection: TranslationStrings = {
'collections.addPlace': 'Добавить место',
'collections.addPlaceSearch': 'Поиск места…',
'collections.addPlaceHint': 'Найдите, чтобы добавить место в этот список',
'collections.importFromTrip': 'Импорт из поездки',
'collections.importTitle': 'Импорт из поездки',
'collections.importDoneTitle': 'Импорт завершён',
'collections.importPickTripHint': 'Выберите поездку и перенесите её места в список {name}.',
'collections.importNoTrips': 'Поездок пока нет',
'collections.importPlacesCount': '{count} мест',
'collections.importSearchPlaces': 'Поиск мест…',
'collections.importOnlyNew': 'Только новые',
'collections.importSelectAll': 'Выбрать все',
'collections.importClearSelection': 'Снять выделение',
'collections.importAlreadySaved': 'Уже сохранено',
'collections.importUnscheduled': 'Без дня',
'collections.importOnDay': 'День {count}',
'collections.importSelectedCount': 'Выбрано: {count}',
'collections.importAction': 'Импортировать {count}',
'collections.importEmptyTrip': 'В этой поездке пока нет мест',
'collections.importNothingNew': 'Всё из этой поездки уже есть в списке',
'collections.importDone': 'Добавлено мест: {count}',
'collections.importDoneSkipped': '{count} уже были в списке и остались без изменений',
'collections.importDoneClean': 'Теперь все они в списке {name}',
'collections.sort.default': 'По умолчанию',
'collections.sort.nameAsc': 'Название (А–Я)',
'collections.coordinates': 'Координаты',
+20
View File
@@ -36,6 +36,26 @@ const collection: TranslationStrings = {
'collections.addPlace': 'Lägg till en plats',
'collections.addPlaceSearch': 'Sök efter en plats…',
'collections.addPlaceHint': 'Sök för att lägga till en plats i listan',
'collections.importFromTrip': 'Importera från en resa',
'collections.importTitle': 'Importera från en resa',
'collections.importDoneTitle': 'Importen är klar',
'collections.importPickTripHint': 'Välj en resa och ta med dess platser till {name}.',
'collections.importNoTrips': 'Inga resor än',
'collections.importPlacesCount': '{count} platser',
'collections.importSearchPlaces': 'Sök platser…',
'collections.importOnlyNew': 'Bara nya',
'collections.importSelectAll': 'Markera alla',
'collections.importClearSelection': 'Rensa markering',
'collections.importAlreadySaved': 'Redan sparad',
'collections.importUnscheduled': 'Utan dag',
'collections.importOnDay': 'Dag {count}',
'collections.importSelectedCount': '{count} markerade',
'collections.importAction': 'Importera {count}',
'collections.importEmptyTrip': 'Den här resan har inga platser än',
'collections.importNothingNew': 'Allt från den här resan finns redan i listan',
'collections.importDone': '{count} platser tillagda',
'collections.importDoneSkipped': '{count} fanns redan i listan och lämnades som de var',
'collections.importDoneClean': 'Nu finns de alla i {name}',
'collections.sort.default': 'Standard',
'collections.sort.nameAsc': 'Namn (A–Ö)',
'collections.coordinates': 'Koordinater',
+20
View File
@@ -36,6 +36,26 @@ const collection: TranslationStrings = {
'collections.addPlace': 'Yer ekle',
'collections.addPlaceSearch': 'Yer ara…',
'collections.addPlaceHint': 'Bu listeye yer eklemek için arayın',
'collections.importFromTrip': 'Bir geziden içe aktar',
'collections.importTitle': 'Bir geziden içe aktar',
'collections.importDoneTitle': 'İçe aktarma tamamlandı',
'collections.importPickTripHint': 'Bir gezi seç ve oradaki yerleri {name} listesine aktar.',
'collections.importNoTrips': 'Henüz gezi yok',
'collections.importPlacesCount': '{count} yer',
'collections.importSearchPlaces': 'Yer ara…',
'collections.importOnlyNew': 'Yalnızca yeniler',
'collections.importSelectAll': 'Tümünü seç',
'collections.importClearSelection': 'Seçimi temizle',
'collections.importAlreadySaved': 'Zaten kayıtlı',
'collections.importUnscheduled': 'Günsüz',
'collections.importOnDay': '{count}. gün',
'collections.importSelectedCount': '{count} seçildi',
'collections.importAction': '{count} yeri aktar',
'collections.importEmptyTrip': 'Bu gezide henüz yer yok',
'collections.importNothingNew': 'Bu gezideki her şey zaten bu listede',
'collections.importDone': '{count} yer eklendi',
'collections.importDoneSkipped': '{count} zaten listedeydi ve olduğu gibi bırakıldı',
'collections.importDoneClean': 'Artık hepsi {name} listesinde',
'collections.sort.default': 'Varsayılan',
'collections.sort.nameAsc': 'Ad (A–Z)',
'collections.coordinates': 'Koordinatlar',
+20
View File
@@ -36,6 +36,26 @@ const collection: TranslationStrings = {
'collections.addPlace': 'Додати місце',
'collections.addPlaceSearch': 'Пошук місця…',
'collections.addPlaceHint': 'Знайдіть, щоб додати місце до цього списку',
'collections.importFromTrip': 'Імпорт із подорожі',
'collections.importTitle': 'Імпорт із подорожі',
'collections.importDoneTitle': 'Імпорт завершено',
'collections.importPickTripHint': 'Вибери подорож і перенеси її місця до списку {name}.',
'collections.importNoTrips': 'Подорожей поки немає',
'collections.importPlacesCount': '{count} місць',
'collections.importSearchPlaces': 'Пошук місць…',
'collections.importOnlyNew': 'Лише нові',
'collections.importSelectAll': 'Вибрати все',
'collections.importClearSelection': 'Зняти вибір',
'collections.importAlreadySaved': 'Уже збережено',
'collections.importUnscheduled': 'Без дня',
'collections.importOnDay': 'День {count}',
'collections.importSelectedCount': 'Вибрано: {count}',
'collections.importAction': 'Імпортувати {count}',
'collections.importEmptyTrip': 'У цій подорожі ще немає місць',
'collections.importNothingNew': 'Усе з цієї подорожі вже є у списку',
'collections.importDone': 'Додано місць: {count}',
'collections.importDoneSkipped': '{count} уже були у списку й лишилися без змін',
'collections.importDoneClean': 'Тепер усі вони у списку {name}',
'collections.sort.default': 'За замовчуванням',
'collections.sort.nameAsc': 'Назва (А–Я)',
'collections.coordinates': 'Координати',
+20
View File
@@ -36,6 +36,26 @@ const collection: TranslationStrings = {
'collections.addPlace': 'Thêm địa điểm',
'collections.addPlaceSearch': 'Tìm địa điểm…',
'collections.addPlaceHint': 'Tìm để thêm địa điểm vào danh sách này',
'collections.importFromTrip': 'Nhập từ một chuyến đi',
'collections.importTitle': 'Nhập từ một chuyến đi',
'collections.importDoneTitle': 'Đã nhập xong',
'collections.importPickTripHint': 'Chọn một chuyến đi và mang các địa điểm của nó vào {name}.',
'collections.importNoTrips': 'Chưa có chuyến đi nào',
'collections.importPlacesCount': '{count} địa điểm',
'collections.importSearchPlaces': 'Tìm địa điểm…',
'collections.importOnlyNew': 'Chỉ cái mới',
'collections.importSelectAll': 'Chọn tất cả',
'collections.importClearSelection': 'Bỏ chọn',
'collections.importAlreadySaved': 'Đã lưu rồi',
'collections.importUnscheduled': 'Chưa xếp ngày',
'collections.importOnDay': 'Ngày {count}',
'collections.importSelectedCount': 'Đã chọn {count}',
'collections.importAction': 'Nhập {count}',
'collections.importEmptyTrip': 'Chuyến đi này chưa có địa điểm nào',
'collections.importNothingNew': 'Mọi thứ trong chuyến đi này đã có trong danh sách',
'collections.importDone': 'Đã thêm {count} địa điểm',
'collections.importDoneSkipped': '{count} đã có sẵn trong danh sách và được giữ nguyên',
'collections.importDoneClean': 'Giờ tất cả đều nằm trong {name}',
'collections.sort.default': 'Mặc định',
'collections.sort.nameAsc': 'Tên (A–Z)',
'collections.coordinates': 'Tọa độ',
+20
View File
@@ -36,6 +36,26 @@ const collection: TranslationStrings = {
'collections.addPlace': '新增地點',
'collections.addPlaceSearch': '搜尋地點…',
'collections.addPlaceHint': '搜尋以將地點加入此清單',
'collections.importFromTrip': '從行程匯入',
'collections.importTitle': '從行程匯入',
'collections.importDoneTitle': '匯入完成',
'collections.importPickTripHint': '選擇一次行程,把其中的地點帶到{name}。',
'collections.importNoTrips': '還沒有行程',
'collections.importPlacesCount': '{count} 個地點',
'collections.importSearchPlaces': '搜尋地點…',
'collections.importOnlyNew': '僅新增',
'collections.importSelectAll': '全選',
'collections.importClearSelection': '清除選擇',
'collections.importAlreadySaved': '已儲存',
'collections.importUnscheduled': '未排入行程',
'collections.importOnDay': '第 {count} 天',
'collections.importSelectedCount': '已選 {count} 個',
'collections.importAction': '匯入 {count} 個',
'collections.importEmptyTrip': '這次行程還沒有地點',
'collections.importNothingNew': '這次行程的地點都已在清單中',
'collections.importDone': '已新增 {count} 個地點',
'collections.importDoneSkipped': '{count} 個已在清單中,保持原樣',
'collections.importDoneClean': '現在它們都在{name}裡',
'collections.sort.default': '預設',
'collections.sort.nameAsc': '名稱 (A–Z)',
'collections.coordinates': '座標',
+20
View File
@@ -36,6 +36,26 @@ const collection: TranslationStrings = {
'collections.addPlace': '添加地点',
'collections.addPlaceSearch': '搜索地点…',
'collections.addPlaceHint': '搜索以将地点添加到此清单',
'collections.importFromTrip': '从行程导入',
'collections.importTitle': '从行程导入',
'collections.importDoneTitle': '导入完成',
'collections.importPickTripHint': '选择一次行程,把其中的地点带到{name}。',
'collections.importNoTrips': '还没有行程',
'collections.importPlacesCount': '{count} 个地点',
'collections.importSearchPlaces': '搜索地点…',
'collections.importOnlyNew': '仅新增',
'collections.importSelectAll': '全选',
'collections.importClearSelection': '清除选择',
'collections.importAlreadySaved': '已保存',
'collections.importUnscheduled': '未排入日程',
'collections.importOnDay': '第 {count} 天',
'collections.importSelectedCount': '已选 {count} 个',
'collections.importAction': '导入 {count} 个',
'collections.importEmptyTrip': '这次行程还没有地点',
'collections.importNothingNew': '这次行程的地点都已在列表中',
'collections.importDone': '已添加 {count} 个地点',
'collections.importDoneSkipped': '{count} 个已在列表中,保持原样',
'collections.importDoneClean': '现在它们都在{name}里',
'collections.sort.default': '默认',
'collections.sort.nameAsc': '名称 (A–Z)',
'collections.coordinates': '坐标',