mirror of
https://github.com/seanmorley15/AdventureLog.git
synced 2025-08-04 20:55:19 +02:00
Rename Adventures to Locations (#696)
* Refactor user_id to user in adventures and related models, views, and components - Updated all instances of user_id to user in the adventures app, including models, serializers, views, and frontend components. - Adjusted queries and filters to reflect the new user field naming convention. - Ensured consistency across the codebase for user identification in adventures, collections, notes, and transportation entities. - Modified frontend components to align with the updated data structure, ensuring proper access control and rendering based on user ownership. * Refactor adventure-related views and components to use "Location" terminology - Updated GlobalSearchView to replace AdventureSerializer with LocationSerializer. - Modified IcsCalendarGeneratorViewSet to use LocationSerializer instead of AdventureSerializer. - Created new LocationImageViewSet for managing location images, including primary image toggling and image deletion. - Introduced LocationViewSet for managing locations with enhanced filtering, sorting, and sharing capabilities. - Updated ReverseGeocodeViewSet to utilize LocationSerializer. - Added ActivityTypesView to retrieve distinct activity types from locations. - Refactored user views to replace AdventureSerializer with LocationSerializer. - Updated frontend components to reflect changes from "adventure" to "location", including AdventureCard, AdventureLink, AdventureModal, and others. - Adjusted API endpoints in frontend routes to align with new location-based structure. - Ensured all references to adventures are replaced with locations across the codebase. * refactor: rename adventures to locations across the application - Updated localization files to replace adventure-related terms with location-related terms. - Refactored TypeScript types and variables from Adventure to Location in various routes and components. - Adjusted UI elements and labels to reflect the change from adventures to locations. - Ensured all references to adventures in the codebase are consistent with the new location terminology. * Refactor code structure for improved readability and maintainability * feat: Implement location details page with server-side loading and deletion functionality - Added +page.server.ts to handle server-side loading of additional location info. - Created +page.svelte for displaying location details, including images, visits, and maps. - Integrated GPX file handling and rendering on the map. - Updated map route to link to locations instead of adventures. - Refactored profile and search routes to use LocationCard instead of AdventureCard. * docs: Update terminology from "Adventure" to "Location" and enhance project overview * docs: Clarify collection examples in usage documentation * feat: Enable credentials for GPX file fetch and add CORS_ALLOW_CREDENTIALS setting * Refactor adventure references to locations across the backend and frontend - Updated CategoryViewSet to reflect location context instead of adventures. - Modified ChecklistViewSet to include locations in retrieval logic. - Changed GlobalSearchView to search for locations instead of adventures. - Adjusted IcsCalendarGeneratorViewSet to handle locations instead of adventures. - Refactored LocationImageViewSet to remove unused import. - Updated LocationViewSet to clarify public access for locations. - Changed LodgingViewSet to reference locations instead of adventures. - Modified NoteViewSet to prevent listing all locations. - Updated RecommendationsViewSet to handle locations in parsing and response. - Adjusted ReverseGeocodeViewSet to search through user locations. - Updated StatsViewSet to count locations instead of adventures. - Changed TagsView to reflect activity types for locations. - Updated TransportationViewSet to reference locations instead of adventures. - Added new translations for search results related to locations in multiple languages. - Updated dashboard and profile pages to reflect location counts instead of adventure counts. - Adjusted search routes to handle locations instead of adventures. * Update banner image * style: Update stats component background and border for improved visibility * refactor: Rename AdventureCard and AdventureModal to LocationCard and LocationModal for consistency
This commit is contained in:
parent
5308ec21d6
commit
493a13995c
115 changed files with 3148 additions and 2759 deletions
|
@ -31,9 +31,9 @@
|
|||
section: 'main'
|
||||
},
|
||||
{
|
||||
path: '/adventures',
|
||||
path: '/locations',
|
||||
icon: MapMarker,
|
||||
label: 'navbar.my_adventures',
|
||||
label: 'locations.my_locations',
|
||||
section: 'main'
|
||||
},
|
||||
{
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
<script lang="ts">
|
||||
import type { Adventure } from '$lib/types';
|
||||
import type { Location } from '$lib/types';
|
||||
import ImageDisplayModal from './ImageDisplayModal.svelte';
|
||||
import { t } from 'svelte-i18n';
|
||||
|
||||
export let adventures: Adventure[] = [];
|
||||
export let adventures: Location[] = [];
|
||||
|
||||
let currentSlide = 0;
|
||||
let image_url: string | null = null;
|
||||
|
|
|
@ -10,8 +10,8 @@
|
|||
display_name: '',
|
||||
icon: '',
|
||||
id: '',
|
||||
user_id: '',
|
||||
num_adventures: 0
|
||||
user: '',
|
||||
num_locations: 0
|
||||
};
|
||||
|
||||
let isOpen: boolean = false;
|
||||
|
@ -44,7 +44,7 @@
|
|||
let dropdownRef: HTMLDivElement;
|
||||
|
||||
onMount(() => {
|
||||
categories = categories.sort((a, b) => (b.num_adventures || 0) - (a.num_adventures || 0));
|
||||
categories = categories.sort((a, b) => (b.num_locations || 0) - (a.num_locations || 0));
|
||||
const handleClickOutside = (event: MouseEvent) => {
|
||||
if (dropdownRef && !dropdownRef.contains(event.target as Node)) {
|
||||
isOpen = false;
|
||||
|
@ -105,7 +105,7 @@
|
|||
<!-- Sort the categories dynamically before rendering -->
|
||||
{#each categories
|
||||
.slice()
|
||||
.sort((a, b) => (b.num_adventures || 0) - (a.num_adventures || 0)) as category}
|
||||
.sort((a, b) => (b.num_locations || 0) - (a.num_locations || 0)) as category}
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-neutral flex items-center space-x-2"
|
||||
|
@ -113,7 +113,7 @@
|
|||
role="option"
|
||||
aria-selected={selected_category && selected_category.id === category.id}
|
||||
>
|
||||
<span>{category.display_name} {category.icon} ({category.num_adventures})</span>
|
||||
<span>{category.display_name} {category.icon} ({category.num_locations})</span>
|
||||
</button>
|
||||
{/each}
|
||||
</div>
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
let adventure_types: Category[] = [];
|
||||
|
||||
onMount(async () => {
|
||||
let categoryFetch = await fetch('/api/categories/categories');
|
||||
let categoryFetch = await fetch('/api/categories');
|
||||
let categoryData = await categoryFetch.json();
|
||||
adventure_types = categoryData;
|
||||
console.log(categoryData);
|
||||
|
@ -60,7 +60,7 @@
|
|||
/>
|
||||
<span>
|
||||
{type.display_name}
|
||||
{type.icon} ({type.num_adventures})
|
||||
{type.icon} ({type.num_locations})
|
||||
</span>
|
||||
</label>
|
||||
</li>
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
|
||||
async function loadCategories() {
|
||||
try {
|
||||
const res = await fetch('/api/categories/categories');
|
||||
const res = await fetch('/api/categories');
|
||||
if (res.ok) {
|
||||
categories = await res.json();
|
||||
}
|
||||
|
@ -334,7 +334,7 @@
|
|||
|
||||
{#if isChanged}
|
||||
<div class="alert alert-success mb-4">
|
||||
<span>{$t('categories.update_after_refresh')}</span>
|
||||
<span>{$t('categories.location_update_after_refresh')}</span>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
|
|
|
@ -99,7 +99,7 @@
|
|||
<Launch class="w-5 h-5" />
|
||||
{$t('notes.open')}
|
||||
</button>
|
||||
{#if checklist.user_id == user?.uuid || (collection && user && collection.shared_with?.includes(user.uuid))}
|
||||
{#if checklist.user == user?.uuid || (collection && user && collection.shared_with?.includes(user.uuid))}
|
||||
<button
|
||||
id="delete_adventure"
|
||||
data-umami-event="Delete Checklist"
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
let warning: string | null = '';
|
||||
|
||||
let isReadOnly =
|
||||
!(checklist && user?.uuid == checklist?.user_id) &&
|
||||
!(checklist && user?.uuid == checklist?.user) &&
|
||||
!(user && collection && collection.shared_with && collection.shared_with.includes(user.uuid)) &&
|
||||
!!checklist;
|
||||
let newStatus: boolean = false;
|
||||
|
@ -40,7 +40,7 @@
|
|||
name: newItem,
|
||||
is_checked: newStatus,
|
||||
id: '',
|
||||
user_id: '',
|
||||
user: '',
|
||||
checklist: 0,
|
||||
created_at: '',
|
||||
updated_at: ''
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<script lang="ts">
|
||||
import type {
|
||||
Adventure,
|
||||
Location,
|
||||
Transportation,
|
||||
Lodging,
|
||||
Note,
|
||||
|
@ -24,14 +24,14 @@
|
|||
import Filter from '~icons/mdi/filter-variant';
|
||||
|
||||
// Component imports
|
||||
import AdventureCard from './AdventureCard.svelte';
|
||||
import LocationCard from './LocationCard.svelte';
|
||||
import TransportationCard from './TransportationCard.svelte';
|
||||
import LodgingCard from './LodgingCard.svelte';
|
||||
import NoteCard from './NoteCard.svelte';
|
||||
import ChecklistCard from './ChecklistCard.svelte';
|
||||
|
||||
// Props
|
||||
export let adventures: Adventure[] = [];
|
||||
export let adventures: Location[] = [];
|
||||
export let transportations: Transportation[] = [];
|
||||
export let lodging: Lodging[] = [];
|
||||
export let notes: Note[] = [];
|
||||
|
@ -45,7 +45,7 @@
|
|||
let sortOption: string = 'name_asc';
|
||||
|
||||
// Filtered arrays
|
||||
let filteredAdventures: Adventure[] = [];
|
||||
let filteredAdventures: Location[] = [];
|
||||
let filteredTransportations: Transportation[] = [];
|
||||
let filteredLodging: Lodging[] = [];
|
||||
let filteredNotes: Note[] = [];
|
||||
|
@ -256,7 +256,7 @@
|
|||
<div class="hidden md:flex items-center gap-2">
|
||||
<div class="stats stats-horizontal bg-base-200/50 border border-base-300/50">
|
||||
<div class="stat py-2 px-3">
|
||||
<div class="stat-title text-xs">{$t('navbar.adventures')}</div>
|
||||
<div class="stat-title text-xs">{$t('locations.locations')}</div>
|
||||
<div class="stat-value text-sm text-info">{adventures.length}</div>
|
||||
</div>
|
||||
<div class="stat py-2 px-3">
|
||||
|
@ -380,7 +380,7 @@
|
|||
on:click={() => (filterOption = 'adventures')}
|
||||
>
|
||||
<Adventures class="w-3 h-3" />
|
||||
{$t('navbar.adventures')}
|
||||
{$t('locations.locations')}
|
||||
</button>
|
||||
<button
|
||||
class="tab tab-sm gap-2 {filterOption === 'transportation'
|
||||
|
@ -432,7 +432,7 @@
|
|||
</div>
|
||||
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4 mx-4">
|
||||
{#each filteredAdventures as adventure}
|
||||
<AdventureCard
|
||||
<LocationCard
|
||||
{user}
|
||||
on:edit={handleEditAdventure}
|
||||
on:delete={handleDeleteAdventure}
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
import ShareVariant from '~icons/mdi/share-variant';
|
||||
|
||||
import { goto } from '$app/navigation';
|
||||
import type { Adventure, Collection, User } from '$lib/types';
|
||||
import type { Location, Collection, User } from '$lib/types';
|
||||
import { addToast } from '$lib/toasts';
|
||||
import { t } from 'svelte-i18n';
|
||||
|
||||
|
@ -91,7 +91,7 @@
|
|||
>
|
||||
<!-- Image Carousel -->
|
||||
<div class="relative overflow-hidden rounded-t-2xl">
|
||||
<CardCarousel adventures={collection.adventures} />
|
||||
<CardCarousel adventures={collection.locations} />
|
||||
|
||||
<!-- Badge Overlay -->
|
||||
<div class="absolute top-4 left-4 flex flex-col gap-2">
|
||||
|
@ -119,8 +119,8 @@
|
|||
|
||||
<!-- Adventure Count -->
|
||||
<p class="text-sm text-base-content/70">
|
||||
{collection.adventures.length}
|
||||
{$t('navbar.adventures')}
|
||||
{collection.locations.length}
|
||||
{$t('locations.locations')}
|
||||
</p>
|
||||
|
||||
<!-- Date Range -->
|
||||
|
@ -170,7 +170,7 @@
|
|||
<Launch class="w-4 h-4" />
|
||||
{$t('adventures.open_details')}
|
||||
</button>
|
||||
{#if user && user.uuid == collection.user_id}
|
||||
{#if user && user.uuid == collection.user}
|
||||
<div class="dropdown dropdown-end">
|
||||
<button type="button" class="btn btn-square btn-sm btn-base-300">
|
||||
<DotsHorizontal class="w-5 h-5" />
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<script lang="ts">
|
||||
import type { Adventure, Collection } from '$lib/types';
|
||||
import type { Location, Collection } from '$lib/types';
|
||||
import { createEventDispatcher } from 'svelte';
|
||||
const dispatch = createEventDispatcher();
|
||||
import { onMount } from 'svelte';
|
||||
|
@ -172,7 +172,7 @@
|
|||
</div>
|
||||
{#if searchQuery}
|
||||
<h3 class="text-xl font-semibold text-base-content/70 mb-2">
|
||||
{$t('adventures.no_collections_found')}
|
||||
{$t('adventures.no_collections_to_add_location')}
|
||||
</h3>
|
||||
<p class="text-base-content/50 text-center max-w-md mb-6">
|
||||
{$t('collection.try_different_search')}
|
||||
|
@ -183,7 +183,7 @@
|
|||
</button>
|
||||
{:else}
|
||||
<h3 class="text-xl font-semibold text-base-content/70 mb-2">
|
||||
{$t('adventures.no_collections_found')}
|
||||
{$t('adventures.no_collections_to_add_location')}
|
||||
</h3>
|
||||
<p class="text-base-content/50 text-center max-w-md">
|
||||
{$t('adventures.create_collection_first')}
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
description: collectionToEdit?.description || '',
|
||||
start_date: collectionToEdit?.start_date || null,
|
||||
end_date: collectionToEdit?.end_date || null,
|
||||
user_id: collectionToEdit?.user_id || '',
|
||||
user: collectionToEdit?.user || '',
|
||||
is_public: collectionToEdit?.is_public || false,
|
||||
adventures: collectionToEdit?.adventures || [],
|
||||
link: collectionToEdit?.link || '',
|
||||
|
|
|
@ -3,10 +3,10 @@
|
|||
const dispatch = createEventDispatcher();
|
||||
import { onMount } from 'svelte';
|
||||
let modal: HTMLDialogElement;
|
||||
import type { Adventure } from '$lib/types';
|
||||
import type { Location } from '$lib/types';
|
||||
|
||||
export let image: string;
|
||||
export let adventure: Adventure | null = null;
|
||||
export let adventure: Location | null = null;
|
||||
|
||||
onMount(() => {
|
||||
modal = document.getElementById('my_modal_1') as HTMLDialogElement;
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
import { createEventDispatcher, onMount } from 'svelte';
|
||||
import { t } from 'svelte-i18n';
|
||||
import ImmichLogo from '$lib/assets/immich.svg';
|
||||
import type { Adventure, ImmichAlbum } from '$lib/types';
|
||||
import type { Location, ImmichAlbum } from '$lib/types';
|
||||
import { debounce } from '$lib';
|
||||
|
||||
let immichImages: any[] = [];
|
||||
|
@ -12,7 +12,7 @@
|
|||
let immichNextURL: string = '';
|
||||
let loading = false;
|
||||
|
||||
export let adventure: Adventure | null = null;
|
||||
export let adventure: Location | null = null;
|
||||
export let copyImmichLocally: boolean = false;
|
||||
|
||||
const dispatch = createEventDispatcher();
|
||||
|
@ -21,7 +21,7 @@
|
|||
let currentAlbum: string = '';
|
||||
|
||||
let selectedDate: string =
|
||||
(adventure as Adventure | null)?.visits
|
||||
(adventure as Location | null)?.visits
|
||||
.map((v) => new Date(v.end_date || v.start_date))
|
||||
.sort((a, b) => +b - +a)[0]
|
||||
?.toISOString()
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<script lang="ts">
|
||||
import { createEventDispatcher } from 'svelte';
|
||||
import { goto } from '$app/navigation';
|
||||
import type { Adventure, Collection, User } from '$lib/types';
|
||||
import type { Location, Collection, User } from '$lib/types';
|
||||
const dispatch = createEventDispatcher();
|
||||
|
||||
import Launch from '~icons/mdi/launch';
|
||||
|
@ -31,19 +31,19 @@
|
|||
let isCollectionModalOpen: boolean = false;
|
||||
let isWarningModalOpen: boolean = false;
|
||||
|
||||
export let adventure: Adventure;
|
||||
export let adventure: Location;
|
||||
let displayActivityTypes: string[] = [];
|
||||
let remainingCount = 0;
|
||||
|
||||
// Process activity types for display
|
||||
$: {
|
||||
if (adventure.activity_types) {
|
||||
if (adventure.activity_types.length <= 3) {
|
||||
displayActivityTypes = adventure.activity_types;
|
||||
if (adventure.tags) {
|
||||
if (adventure.tags.length <= 3) {
|
||||
displayActivityTypes = adventure.tags;
|
||||
remainingCount = 0;
|
||||
} else {
|
||||
displayActivityTypes = adventure.activity_types.slice(0, 3);
|
||||
remainingCount = adventure.activity_types.length - 3;
|
||||
displayActivityTypes = adventure.tags.slice(0, 3);
|
||||
remainingCount = adventure.tags.length - 3;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -77,11 +77,11 @@
|
|||
}
|
||||
|
||||
async function deleteAdventure() {
|
||||
let res = await fetch(`/api/adventures/${adventure.id}`, {
|
||||
let res = await fetch(`/api/locations/${adventure.id}`, {
|
||||
method: 'DELETE'
|
||||
});
|
||||
if (res.ok) {
|
||||
addToast('info', $t('adventures.adventure_delete_success'));
|
||||
addToast('info', $t('adventures.location_delete_success'));
|
||||
dispatch('delete', adventure.id);
|
||||
} else {
|
||||
console.log('Error deleting adventure');
|
||||
|
@ -98,7 +98,7 @@
|
|||
updatedCollections.push(collectionId);
|
||||
}
|
||||
|
||||
let res = await fetch(`/api/adventures/${adventure.id}`, {
|
||||
let res = await fetch(`/api/locations/${adventure.id}`, {
|
||||
method: 'PATCH',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
|
@ -109,16 +109,16 @@
|
|||
if (res.ok) {
|
||||
// Only update the adventure.collections after server confirms success
|
||||
adventure.collections = updatedCollections;
|
||||
addToast('info', `${$t('adventures.collection_link_success')}`);
|
||||
addToast('info', `${$t('adventures.collection_link_location_success')}`);
|
||||
} else {
|
||||
addToast('error', `${$t('adventures.collection_link_error')}`);
|
||||
addToast('error', `${$t('adventures.collection_link_location_error')}`);
|
||||
}
|
||||
}
|
||||
|
||||
async function removeFromCollection(event: CustomEvent<string>) {
|
||||
let collectionId = event.detail;
|
||||
if (!collectionId) {
|
||||
addToast('error', `${$t('adventures.collection_remove_error')}`);
|
||||
addToast('error', `${$t('adventures.collection_remove_location_error')}`);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -128,7 +128,7 @@
|
|||
(c) => String(c) !== String(collectionId)
|
||||
);
|
||||
|
||||
let res = await fetch(`/api/adventures/${adventure.id}`, {
|
||||
let res = await fetch(`/api/locations/${adventure.id}`, {
|
||||
method: 'PATCH',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
|
@ -139,9 +139,9 @@
|
|||
if (res.ok) {
|
||||
// Only update adventure.collections after server confirms success
|
||||
adventure.collections = updatedCollections;
|
||||
addToast('info', `${$t('adventures.collection_remove_success')}`);
|
||||
addToast('info', `${$t('adventures.collection_remove_location_success')}`);
|
||||
} else {
|
||||
addToast('error', `${$t('adventures.collection_remove_error')}`);
|
||||
addToast('error', `${$t('adventures.collection_remove_location_error')}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -166,9 +166,9 @@
|
|||
|
||||
{#if isWarningModalOpen}
|
||||
<DeleteWarning
|
||||
title={$t('adventures.delete_adventure')}
|
||||
title={$t('adventures.delete_location')}
|
||||
button_text="Delete"
|
||||
description={$t('adventures.adventure_delete_confirm')}
|
||||
description={$t('adventures.location_delete_confirm')}
|
||||
is_warning={false}
|
||||
on:close={() => (isWarningModalOpen = false)}
|
||||
on:confirm={deleteAdventure}
|
||||
|
@ -228,7 +228,7 @@
|
|||
<!-- Header Section -->
|
||||
<div class="space-y-3">
|
||||
<button
|
||||
on:click={() => goto(`/adventures/${adventure.id}`)}
|
||||
on:click={() => goto(`/locations/${adventure.id}`)}
|
||||
class="text-xl font-bold text-left hover:text-primary transition-colors duration-200 line-clamp-2 group-hover:underline"
|
||||
>
|
||||
{adventure.name}
|
||||
|
@ -274,13 +274,13 @@
|
|||
<div class="flex justify-between items-center">
|
||||
<button
|
||||
class="btn btn-neutral btn-sm flex-1 mr-2"
|
||||
on:click={() => goto(`/adventures/${adventure.id}`)}
|
||||
on:click={() => goto(`/locations/${adventure.id}`)}
|
||||
>
|
||||
<Launch class="w-4 h-4" />
|
||||
{$t('adventures.open_details')}
|
||||
</button>
|
||||
|
||||
{#if adventure.user_id == user?.uuid || (collection && user && collection.shared_with?.includes(user.uuid))}
|
||||
{#if (adventure.user && adventure.user.uuid == user?.uuid) || (collection && user && collection.shared_with?.includes(user.uuid))}
|
||||
<div class="dropdown dropdown-end">
|
||||
<div tabindex="0" role="button" class="btn btn-square btn-sm btn-base-300">
|
||||
<DotsHorizontal class="w-5 h-5" />
|
||||
|
@ -293,11 +293,11 @@
|
|||
<li>
|
||||
<button on:click={editAdventure} class="flex items-center gap-2">
|
||||
<FileDocumentEdit class="w-4 h-4" />
|
||||
{$t('adventures.edit_adventure')}
|
||||
{$t('adventures.edit_location')}
|
||||
</button>
|
||||
</li>
|
||||
|
||||
{#if user?.uuid == adventure.user_id}
|
||||
{#if user?.uuid == adventure.user?.uuid}
|
||||
<li>
|
||||
<button
|
||||
on:click={() => (isCollectionModalOpen = true)}
|
|
@ -2,12 +2,12 @@
|
|||
import { getBasemapUrl } from '$lib';
|
||||
import { appVersion } from '$lib/config';
|
||||
import { addToast } from '$lib/toasts';
|
||||
import type { Adventure, Lodging, GeocodeSearchResult, Point, ReverseGeocode } from '$lib/types';
|
||||
import type { Location, Lodging, GeocodeSearchResult, Point, ReverseGeocode } from '$lib/types';
|
||||
import { onMount } from 'svelte';
|
||||
import { t } from 'svelte-i18n';
|
||||
import { DefaultMarker, MapEvents, MapLibre } from 'svelte-maplibre';
|
||||
|
||||
export let item: Adventure | Lodging;
|
||||
export let item: Location | Lodging;
|
||||
export let triggerMarkVisted: boolean = false;
|
||||
|
||||
export let initialLatLng: { lat: number; lng: number } | null = null; // Used to pass the location from the map selection to the modal
|
||||
|
@ -366,7 +366,7 @@ it would also work to just use on:click on the MapLibre component itself. -->
|
|||
{reverseGeocodePlace.city
|
||||
? reverseGeocodePlace.city + ', '
|
||||
: ''}{reverseGeocodePlace.region}, {reverseGeocodePlace.country}
|
||||
{$t('adventures.will_be_marked')}
|
||||
{$t('adventures.will_be_marked_location')}
|
||||
</span>
|
||||
</div>
|
||||
{/if}
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
<script lang="ts">
|
||||
import type { Adventure, User } from '$lib/types';
|
||||
import type { Location, User } from '$lib/types';
|
||||
import { createEventDispatcher } from 'svelte';
|
||||
const dispatch = createEventDispatcher();
|
||||
import { t } from 'svelte-i18n';
|
||||
import { onMount } from 'svelte';
|
||||
import AdventureCard from './AdventureCard.svelte';
|
||||
import LocationCard from './LocationCard.svelte';
|
||||
let modal: HTMLDialogElement;
|
||||
|
||||
// Icons - following the worldtravel pattern
|
||||
|
@ -17,8 +17,8 @@
|
|||
import Public from '~icons/mdi/earth';
|
||||
import Private from '~icons/mdi/lock';
|
||||
|
||||
let adventures: Adventure[] = [];
|
||||
let filteredAdventures: Adventure[] = [];
|
||||
let adventures: Location[] = [];
|
||||
let filteredAdventures: Location[] = [];
|
||||
let searchQuery: string = '';
|
||||
let filterOption: string = 'all';
|
||||
let isLoading: boolean = true;
|
||||
|
@ -69,7 +69,7 @@
|
|||
modal.showModal();
|
||||
}
|
||||
|
||||
let res = await fetch(`/api/adventures/all/?include_collections=true`, {
|
||||
let res = await fetch(`/api/locations/all/?include_collections=true`, {
|
||||
method: 'GET'
|
||||
});
|
||||
|
||||
|
@ -77,7 +77,7 @@
|
|||
|
||||
// Filter out adventures that are already linked to the collections
|
||||
if (collectionId) {
|
||||
adventures = newAdventures.filter((adventure: Adventure) => {
|
||||
adventures = newAdventures.filter((adventure: Location) => {
|
||||
return !(adventure.collections ?? []).includes(collectionId);
|
||||
});
|
||||
} else {
|
||||
|
@ -91,7 +91,7 @@
|
|||
dispatch('close');
|
||||
}
|
||||
|
||||
function add(event: CustomEvent<Adventure>) {
|
||||
function add(event: CustomEvent<Location>) {
|
||||
adventures = adventures.filter((a) => a.id !== event.detail.id);
|
||||
dispatch('add', event.detail);
|
||||
}
|
||||
|
@ -134,7 +134,7 @@
|
|||
{filteredAdventures.length}
|
||||
{$t('worldtravel.of')}
|
||||
{totalAdventures}
|
||||
{$t('navbar.adventures')}
|
||||
{$t('locations.locations')}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -252,7 +252,7 @@
|
|||
</div>
|
||||
{#if searchQuery || filterOption !== 'all'}
|
||||
<h3 class="text-xl font-semibold text-base-content/70 mb-2">
|
||||
{$t('adventures.no_adventures_found')}
|
||||
{$t('adventures.no_locations_found')}
|
||||
</h3>
|
||||
<p class="text-base-content/50 text-center max-w-md mb-6">
|
||||
{$t('collection.try_different_search')}
|
||||
|
@ -274,7 +274,7 @@
|
|||
<!-- Adventures Grid -->
|
||||
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6 mb-6 p-4">
|
||||
{#each filteredAdventures as adventure}
|
||||
<AdventureCard {user} type="link" {adventure} on:link={add} />
|
||||
<LocationCard {user} type="link" {adventure} on:link={add} />
|
||||
{/each}
|
||||
</div>
|
||||
{/if}
|
|
@ -1,6 +1,6 @@
|
|||
<script lang="ts">
|
||||
import { createEventDispatcher, onMount } from 'svelte';
|
||||
import type { Adventure, Attachment, Category, Collection } from '$lib/types';
|
||||
import type { Location, Attachment, Category, Collection } from '$lib/types';
|
||||
import { addToast } from '$lib/toasts';
|
||||
import { deserialize } from '$app/forms';
|
||||
import { t } from 'svelte-i18n';
|
||||
|
@ -23,7 +23,6 @@
|
|||
|
||||
let images: { id: string; image: string; is_primary: boolean; immich_id: string | null }[] = [];
|
||||
let warningMessage: string = '';
|
||||
let constrainDates: boolean = false;
|
||||
|
||||
let categories: Category[] = [];
|
||||
|
||||
|
@ -97,62 +96,62 @@
|
|||
|
||||
let wikiError: string = '';
|
||||
|
||||
let adventure: Adventure = {
|
||||
let location: Location = {
|
||||
id: '',
|
||||
name: '',
|
||||
visits: [],
|
||||
link: null,
|
||||
description: null,
|
||||
activity_types: [],
|
||||
tags: [],
|
||||
rating: NaN,
|
||||
is_public: false,
|
||||
latitude: NaN,
|
||||
longitude: NaN,
|
||||
location: null,
|
||||
images: [],
|
||||
user_id: null,
|
||||
user: null,
|
||||
category: {
|
||||
id: '',
|
||||
name: '',
|
||||
display_name: '',
|
||||
icon: '',
|
||||
user_id: ''
|
||||
user: ''
|
||||
},
|
||||
attachments: []
|
||||
};
|
||||
|
||||
export let adventureToEdit: Adventure | null = null;
|
||||
export let locationToEdit: Location | null = null;
|
||||
|
||||
adventure = {
|
||||
id: adventureToEdit?.id || '',
|
||||
name: adventureToEdit?.name || '',
|
||||
link: adventureToEdit?.link || null,
|
||||
description: adventureToEdit?.description || null,
|
||||
activity_types: adventureToEdit?.activity_types || [],
|
||||
rating: adventureToEdit?.rating || NaN,
|
||||
is_public: adventureToEdit?.is_public || false,
|
||||
latitude: adventureToEdit?.latitude || NaN,
|
||||
longitude: adventureToEdit?.longitude || NaN,
|
||||
location: adventureToEdit?.location || null,
|
||||
images: adventureToEdit?.images || [],
|
||||
user_id: adventureToEdit?.user_id || null,
|
||||
visits: adventureToEdit?.visits || [],
|
||||
is_visited: adventureToEdit?.is_visited || false,
|
||||
category: adventureToEdit?.category || {
|
||||
location = {
|
||||
id: locationToEdit?.id || '',
|
||||
name: locationToEdit?.name || '',
|
||||
link: locationToEdit?.link || null,
|
||||
description: locationToEdit?.description || null,
|
||||
tags: locationToEdit?.tags || [],
|
||||
rating: locationToEdit?.rating || NaN,
|
||||
is_public: locationToEdit?.is_public || false,
|
||||
latitude: locationToEdit?.latitude || NaN,
|
||||
longitude: locationToEdit?.longitude || NaN,
|
||||
location: locationToEdit?.location || null,
|
||||
images: locationToEdit?.images || [],
|
||||
user: locationToEdit?.user || null,
|
||||
visits: locationToEdit?.visits || [],
|
||||
is_visited: locationToEdit?.is_visited || false,
|
||||
category: locationToEdit?.category || {
|
||||
id: '',
|
||||
name: '',
|
||||
display_name: '',
|
||||
icon: '',
|
||||
user_id: ''
|
||||
user: ''
|
||||
},
|
||||
|
||||
attachments: adventureToEdit?.attachments || []
|
||||
attachments: locationToEdit?.attachments || []
|
||||
};
|
||||
|
||||
onMount(async () => {
|
||||
modal = document.getElementById('my_modal_1') as HTMLDialogElement;
|
||||
modal.showModal();
|
||||
let categoryFetch = await fetch('/api/categories/categories');
|
||||
let categoryFetch = await fetch('/api/categories');
|
||||
if (categoryFetch.ok) {
|
||||
categories = await categoryFetch.json();
|
||||
} else {
|
||||
|
@ -183,15 +182,15 @@
|
|||
|
||||
let isLoading: boolean = false;
|
||||
|
||||
images = adventure.images || [];
|
||||
images = location.images || [];
|
||||
$: {
|
||||
if (!adventure.rating) {
|
||||
adventure.rating = NaN;
|
||||
if (!location.rating) {
|
||||
location.rating = NaN;
|
||||
}
|
||||
}
|
||||
|
||||
function deleteAttachment(event: CustomEvent<string>) {
|
||||
adventure.attachments = adventure.attachments.filter(
|
||||
location.attachments = location.attachments.filter(
|
||||
(attachment) => attachment.id !== event.detail
|
||||
);
|
||||
}
|
||||
|
@ -210,7 +209,7 @@
|
|||
});
|
||||
if (res.ok) {
|
||||
let newAttachment = (await res.json()) as Attachment;
|
||||
adventure.attachments = adventure.attachments.map((attachment) => {
|
||||
location.attachments = location.attachments.map((attachment) => {
|
||||
if (attachment.id === newAttachment.id) {
|
||||
return newAttachment;
|
||||
}
|
||||
|
@ -245,18 +244,18 @@
|
|||
|
||||
const formData = new FormData();
|
||||
formData.append('file', file);
|
||||
formData.append('adventure', adventure.id);
|
||||
formData.append('location', location.id);
|
||||
formData.append('name', attachmentName);
|
||||
|
||||
try {
|
||||
const res = await fetch('/adventures?/attachment', {
|
||||
const res = await fetch('/locations?/attachment', {
|
||||
method: 'POST',
|
||||
body: formData
|
||||
});
|
||||
|
||||
if (res.ok) {
|
||||
const newData = deserialize(await res.text()) as { data: Attachment };
|
||||
adventure.attachments = [...adventure.attachments, newData.data];
|
||||
location.attachments = [...location.attachments, newData.data];
|
||||
addToast('success', $t('adventures.attachment_upload_success'));
|
||||
attachmentName = '';
|
||||
} else {
|
||||
|
@ -273,7 +272,7 @@
|
|||
}
|
||||
}
|
||||
|
||||
let imageSearch: string = adventure.name || '';
|
||||
let imageSearch: string = location.name || '';
|
||||
|
||||
async function removeImage(id: string) {
|
||||
let res = await fetch(`/api/images/${id}/image_delete`, {
|
||||
|
@ -281,7 +280,7 @@
|
|||
});
|
||||
if (res.status === 204) {
|
||||
images = images.filter((image) => image.id !== id);
|
||||
adventure.images = images;
|
||||
location.images = images;
|
||||
addToast('success', $t('adventures.image_removed_success'));
|
||||
} else {
|
||||
addToast('error', $t('adventures.image_removed_error'));
|
||||
|
@ -291,7 +290,7 @@
|
|||
let isDetails: boolean = true;
|
||||
|
||||
function saveAndClose() {
|
||||
dispatch('save', adventure);
|
||||
dispatch('save', location);
|
||||
close();
|
||||
}
|
||||
|
||||
|
@ -308,7 +307,7 @@
|
|||
}
|
||||
return image;
|
||||
});
|
||||
adventure.images = images;
|
||||
location.images = images;
|
||||
} else {
|
||||
console.error('Error in makePrimaryImage:', res);
|
||||
}
|
||||
|
@ -326,9 +325,9 @@
|
|||
async function uploadImage(file: File) {
|
||||
let formData = new FormData();
|
||||
formData.append('image', file);
|
||||
formData.append('adventure', adventure.id);
|
||||
formData.append('location', location.id);
|
||||
|
||||
let res = await fetch(`/adventures?/image`, {
|
||||
let res = await fetch(`/locations?/image`, {
|
||||
method: 'POST',
|
||||
body: formData
|
||||
});
|
||||
|
@ -341,7 +340,7 @@
|
|||
immich_id: null
|
||||
};
|
||||
images = [...images, newImage];
|
||||
adventure.images = images;
|
||||
location.images = images;
|
||||
addToast('success', $t('adventures.image_upload_success'));
|
||||
} else {
|
||||
addToast('error', $t('adventures.image_upload_error'));
|
||||
|
@ -359,7 +358,7 @@
|
|||
let file = new File([data], 'image.jpg', { type: 'image/jpeg' });
|
||||
let formData = new FormData();
|
||||
formData.append('image', file);
|
||||
formData.append('adventure', adventure.id);
|
||||
formData.append('adventure', location.id);
|
||||
|
||||
await uploadImage(file);
|
||||
url = '';
|
||||
|
@ -383,8 +382,8 @@
|
|||
wikiImageError = '';
|
||||
let formData = new FormData();
|
||||
formData.append('image', file);
|
||||
formData.append('adventure', adventure.id);
|
||||
let res2 = await fetch(`/adventures?/image`, {
|
||||
formData.append('location', location.id);
|
||||
let res2 = await fetch(`/locations?/image`, {
|
||||
method: 'POST',
|
||||
body: formData
|
||||
});
|
||||
|
@ -397,7 +396,7 @@
|
|||
immich_id: null
|
||||
};
|
||||
images = [...images, newImage];
|
||||
adventure.images = images;
|
||||
location.images = images;
|
||||
addToast('success', $t('adventures.image_upload_success'));
|
||||
} else {
|
||||
addToast('error', $t('adventures.image_upload_error'));
|
||||
|
@ -417,10 +416,10 @@
|
|||
}
|
||||
|
||||
async function generateDesc() {
|
||||
let res = await fetch(`/api/generate/desc/?name=${adventure.name}`);
|
||||
let res = await fetch(`/api/generate/desc/?name=${location.name}`);
|
||||
let data = await res.json();
|
||||
if (data.extract?.length > 0) {
|
||||
adventure.description = data.extract;
|
||||
location.description = data.extract;
|
||||
wikiError = '';
|
||||
} else {
|
||||
wikiError = $t('adventures.no_description_found');
|
||||
|
@ -433,72 +432,72 @@
|
|||
isLoading = true;
|
||||
|
||||
// if category icon is empty, set it to the default icon
|
||||
if (adventure.category?.icon == '' || adventure.category?.icon == null) {
|
||||
if (adventure.category) {
|
||||
adventure.category.icon = '🌍';
|
||||
if (location.category?.icon == '' || location.category?.icon == null) {
|
||||
if (location.category) {
|
||||
location.category.icon = '🌍';
|
||||
}
|
||||
}
|
||||
|
||||
if (adventure.id === '') {
|
||||
if (adventure.category?.display_name == '') {
|
||||
if (location.id === '') {
|
||||
if (location.category?.display_name == '') {
|
||||
if (categories.some((category) => category.name === 'general')) {
|
||||
adventure.category = categories.find(
|
||||
location.category = categories.find(
|
||||
(category) => category.name === 'general'
|
||||
) as Category;
|
||||
} else {
|
||||
adventure.category = {
|
||||
location.category = {
|
||||
id: '',
|
||||
name: 'general',
|
||||
display_name: 'General',
|
||||
icon: '🌍',
|
||||
user_id: ''
|
||||
user: ''
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// add this collection to the adventure
|
||||
if (collection && collection.id) {
|
||||
adventure.collections = [collection.id];
|
||||
location.collections = [collection.id];
|
||||
}
|
||||
|
||||
let res = await fetch('/api/adventures', {
|
||||
let res = await fetch('/api/locations', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify(adventure)
|
||||
body: JSON.stringify(location)
|
||||
});
|
||||
let data = await res.json();
|
||||
if (data.id) {
|
||||
adventure = data as Adventure;
|
||||
location = data as Location;
|
||||
isDetails = false;
|
||||
warningMessage = '';
|
||||
addToast('success', $t('adventures.adventure_created'));
|
||||
addToast('success', $t('adventures.location_created'));
|
||||
} else {
|
||||
warningMessage = findFirstValue(data) as string;
|
||||
console.error(data);
|
||||
addToast('error', $t('adventures.adventure_create_error'));
|
||||
addToast('error', $t('adventures.location_create_error'));
|
||||
}
|
||||
} else {
|
||||
let res = await fetch(`/api/adventures/${adventure.id}`, {
|
||||
let res = await fetch(`/api/locations/${location.id}`, {
|
||||
method: 'PATCH',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify(adventure)
|
||||
body: JSON.stringify(location)
|
||||
});
|
||||
let data = await res.json();
|
||||
if (data.id) {
|
||||
adventure = data as Adventure;
|
||||
location = data as Location;
|
||||
isDetails = false;
|
||||
warningMessage = '';
|
||||
addToast('success', $t('adventures.adventure_updated'));
|
||||
addToast('success', $t('adventures.location_updated'));
|
||||
} else {
|
||||
warningMessage = Object.values(data)[0] as string;
|
||||
addToast('error', $t('adventures.adventure_update_error'));
|
||||
addToast('error', $t('adventures.location_update_error'));
|
||||
}
|
||||
}
|
||||
imageSearch = adventure.name;
|
||||
imageSearch = location.name;
|
||||
isLoading = false;
|
||||
}
|
||||
</script>
|
||||
|
@ -509,9 +508,9 @@
|
|||
<!-- svelte-ignore a11y-no-noninteractive-element-interactions -->
|
||||
<div class="modal-box w-11/12 max-w-3xl" role="dialog" on:keydown={handleKeydown} tabindex="0">
|
||||
<h3 class="font-bold text-2xl">
|
||||
{adventureToEdit ? $t('adventures.edit_adventure') : $t('adventures.new_adventure')}
|
||||
{locationToEdit ? $t('adventures.edit_location') : $t('adventures.new_location')}
|
||||
</h3>
|
||||
{#if adventure.id === '' || isDetails}
|
||||
{#if location.id === '' || isDetails}
|
||||
<div class="modal-action items-center">
|
||||
<form method="post" style="width: 100%;" on:submit={handleSubmit}>
|
||||
<!-- Grid layout for form fields -->
|
||||
|
@ -529,7 +528,7 @@
|
|||
type="text"
|
||||
id="name"
|
||||
name="name"
|
||||
bind:value={adventure.name}
|
||||
bind:value={location.name}
|
||||
class="input input-bordered w-full"
|
||||
required
|
||||
/>
|
||||
|
@ -539,7 +538,7 @@
|
|||
>{$t('adventures.category')}<span class="text-red-500">*</span></label
|
||||
><br />
|
||||
|
||||
<CategoryDropdown bind:categories bind:selected_category={adventure.category} />
|
||||
<CategoryDropdown bind:categories bind:selected_category={location.category} />
|
||||
</div>
|
||||
<div>
|
||||
<label for="rating">{$t('adventures.rating')}</label><br />
|
||||
|
@ -548,7 +547,7 @@
|
|||
min="0"
|
||||
max="5"
|
||||
hidden
|
||||
bind:value={adventure.rating}
|
||||
bind:value={location.rating}
|
||||
id="rating"
|
||||
name="rating"
|
||||
class="input input-bordered w-full max-w-xs mt-1"
|
||||
|
@ -558,48 +557,48 @@
|
|||
type="radio"
|
||||
name="rating-2"
|
||||
class="rating-hidden"
|
||||
checked={Number.isNaN(adventure.rating)}
|
||||
checked={Number.isNaN(location.rating)}
|
||||
/>
|
||||
<input
|
||||
type="radio"
|
||||
name="rating-2"
|
||||
class="mask mask-star-2 bg-orange-400"
|
||||
on:click={() => (adventure.rating = 1)}
|
||||
checked={adventure.rating === 1}
|
||||
on:click={() => (location.rating = 1)}
|
||||
checked={location.rating === 1}
|
||||
/>
|
||||
<input
|
||||
type="radio"
|
||||
name="rating-2"
|
||||
class="mask mask-star-2 bg-orange-400"
|
||||
on:click={() => (adventure.rating = 2)}
|
||||
checked={adventure.rating === 2}
|
||||
on:click={() => (location.rating = 2)}
|
||||
checked={location.rating === 2}
|
||||
/>
|
||||
<input
|
||||
type="radio"
|
||||
name="rating-2"
|
||||
class="mask mask-star-2 bg-orange-400"
|
||||
on:click={() => (adventure.rating = 3)}
|
||||
checked={adventure.rating === 3}
|
||||
on:click={() => (location.rating = 3)}
|
||||
checked={location.rating === 3}
|
||||
/>
|
||||
<input
|
||||
type="radio"
|
||||
name="rating-2"
|
||||
class="mask mask-star-2 bg-orange-400"
|
||||
on:click={() => (adventure.rating = 4)}
|
||||
checked={adventure.rating === 4}
|
||||
on:click={() => (location.rating = 4)}
|
||||
checked={location.rating === 4}
|
||||
/>
|
||||
<input
|
||||
type="radio"
|
||||
name="rating-2"
|
||||
class="mask mask-star-2 bg-orange-400"
|
||||
on:click={() => (adventure.rating = 5)}
|
||||
checked={adventure.rating === 5}
|
||||
on:click={() => (location.rating = 5)}
|
||||
checked={location.rating === 5}
|
||||
/>
|
||||
{#if adventure.rating}
|
||||
{#if location.rating}
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-sm btn-error ml-2"
|
||||
on:click={() => (adventure.rating = NaN)}
|
||||
on:click={() => (location.rating = NaN)}
|
||||
>
|
||||
{$t('adventures.remove')}
|
||||
</button>
|
||||
|
@ -613,16 +612,16 @@
|
|||
type="text"
|
||||
id="link"
|
||||
name="link"
|
||||
bind:value={adventure.link}
|
||||
bind:value={location.link}
|
||||
class="input input-bordered w-full"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<label for="description">{$t('adventures.description')}</label><br />
|
||||
<MarkdownEditor bind:text={adventure.description} />
|
||||
<MarkdownEditor bind:text={location.description} />
|
||||
<div class="mt-2">
|
||||
<div class="tooltip tooltip-right" data-tip={$t('adventures.wiki_desc')}>
|
||||
<div class="tooltip tooltip-right" data-tip={$t('adventures.wiki_location_desc')}>
|
||||
<button type="button" class="btn btn-neutral mt-2" on:click={generateDesc}
|
||||
>{$t('adventures.generate_desc')}</button
|
||||
>
|
||||
|
@ -630,17 +629,17 @@
|
|||
<p class="text-red-500">{wikiError}</p>
|
||||
</div>
|
||||
</div>
|
||||
{#if !adventureToEdit || (adventureToEdit.collections && adventureToEdit.collections.length === 0)}
|
||||
{#if !locationToEdit || (locationToEdit.collections && locationToEdit.collections.length === 0)}
|
||||
<div>
|
||||
<div class="form-control flex items-start mt-1">
|
||||
<label class="label cursor-pointer flex items-start space-x-2">
|
||||
<span class="label-text">{$t('adventures.public_adventure')}</span>
|
||||
<span class="label-text">{$t('adventures.public_location')}</span>
|
||||
<input
|
||||
type="checkbox"
|
||||
class="toggle toggle-primary"
|
||||
id="is_public"
|
||||
name="is_public"
|
||||
bind:checked={adventure.is_public}
|
||||
bind:checked={location.is_public}
|
||||
/>
|
||||
</label>
|
||||
</div>
|
||||
|
@ -649,27 +648,27 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<LocationDropdown bind:item={adventure} bind:triggerMarkVisted {initialLatLng} />
|
||||
<LocationDropdown bind:item={location} bind:triggerMarkVisted {initialLatLng} />
|
||||
|
||||
<div class="collapse collapse-plus bg-base-200 mb-4 overflow-visible">
|
||||
<input type="checkbox" />
|
||||
<div class="collapse-title text-xl font-medium">
|
||||
{$t('adventures.tags')} ({adventure.activity_types?.length || 0})
|
||||
{$t('adventures.tags')} ({location.tags?.length || 0})
|
||||
</div>
|
||||
<div class="collapse-content">
|
||||
<input
|
||||
type="text"
|
||||
id="activity_types"
|
||||
name="activity_types"
|
||||
id="tags"
|
||||
name="tags"
|
||||
hidden
|
||||
bind:value={adventure.activity_types}
|
||||
bind:value={location.tags}
|
||||
class="input input-bordered w-full"
|
||||
/>
|
||||
<ActivityComplete bind:activities={adventure.activity_types} />
|
||||
<ActivityComplete bind:activities={location.tags} />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<DateRangeCollapse type="adventure" {collection} bind:visits={adventure.visits} />
|
||||
<DateRangeCollapse type="adventure" {collection} bind:visits={location.visits} />
|
||||
|
||||
<div>
|
||||
<div class="mt-4">
|
||||
|
@ -711,11 +710,11 @@
|
|||
<div class="collapse collapse-plus bg-base-200 mb-4">
|
||||
<input type="checkbox" />
|
||||
<div class="collapse-title text-xl font-medium">
|
||||
{$t('adventures.attachments')} ({adventure.attachments?.length || 0})
|
||||
{$t('adventures.attachments')} ({location.attachments?.length || 0})
|
||||
</div>
|
||||
<div class="collapse-content">
|
||||
<div class="grid gap-4 sm:grid-cols-2 lg:grid-cols-3">
|
||||
{#each adventure.attachments as attachment}
|
||||
{#each location.attachments as attachment}
|
||||
<AttachmentCard
|
||||
{attachment}
|
||||
on:delete={deleteAttachment}
|
||||
|
@ -785,7 +784,7 @@
|
|||
<div class="collapse collapse-plus bg-base-200 mb-4">
|
||||
<input type="checkbox" checked />
|
||||
<div class="collapse-title text-xl font-medium">
|
||||
{$t('adventures.images')} ({adventure.images?.length || 0})
|
||||
{$t('adventures.images')} ({location.images?.length || 0})
|
||||
</div>
|
||||
<div class="collapse-content">
|
||||
<label for="image" class="block font-medium mb-2">
|
||||
|
@ -802,7 +801,7 @@
|
|||
multiple
|
||||
on:change={handleMultipleFiles}
|
||||
/>
|
||||
<input type="hidden" name="adventure" value={adventure.id} id="adventure" />
|
||||
<input type="hidden" name="adventure" value={location.id} id="adventure" />
|
||||
</form>
|
||||
|
||||
<div class="mb-4">
|
||||
|
@ -848,7 +847,7 @@
|
|||
|
||||
{#if immichIntegration}
|
||||
<ImmichSelect
|
||||
{adventure}
|
||||
adventure={location}
|
||||
on:fetchImage={(e) => {
|
||||
url = e.detail;
|
||||
fetchImage();
|
||||
|
@ -862,7 +861,7 @@
|
|||
immich_id: e.detail.immich_id
|
||||
};
|
||||
images = [...images, newImage];
|
||||
adventure.images = images;
|
||||
location.images = images;
|
||||
addToast('success', $t('adventures.image_upload_success'));
|
||||
}}
|
||||
/>
|
||||
|
@ -917,17 +916,17 @@
|
|||
</div>
|
||||
{/if}
|
||||
|
||||
{#if adventure.is_public && adventure.id}
|
||||
{#if location.is_public && location.id}
|
||||
<div class="bg-neutral p-4 mt-2 rounded-md shadow-sm text-neutral-content">
|
||||
<p class=" font-semibold">{$t('adventures.share_adventure')}</p>
|
||||
<p class=" font-semibold">{$t('adventures.share_location')}</p>
|
||||
<div class="flex items-center justify-between">
|
||||
<p class="text-card-foreground font-mono">
|
||||
{window.location.origin}/adventures/{adventure.id}
|
||||
{window.location.origin}/locations/{location.id}
|
||||
</p>
|
||||
<button
|
||||
type="button"
|
||||
on:click={() => {
|
||||
navigator.clipboard.writeText(`${window.location.origin}/adventures/${adventure.id}`);
|
||||
navigator.clipboard.writeText(`${window.location.origin}/locations/${location.id}`);
|
||||
}}
|
||||
class="inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 h-10 px-4 py-2"
|
||||
>
|
|
@ -156,7 +156,7 @@
|
|||
</div>
|
||||
|
||||
<!-- Reservation Info -->
|
||||
{#if lodging.user_id == user?.uuid || (collection && user && collection.shared_with?.includes(user.uuid))}
|
||||
{#if lodging.user == user?.uuid || (collection && user && collection.shared_with?.includes(user.uuid))}
|
||||
<div class="space-y-2">
|
||||
{#if lodging.reservation_number}
|
||||
<div class="flex items-center gap-2">
|
||||
|
@ -174,7 +174,7 @@
|
|||
{/if}
|
||||
|
||||
<!-- Actions -->
|
||||
{#if lodging.user_id == user?.uuid || (collection && user && collection.shared_with?.includes(user.uuid))}
|
||||
{#if lodging.user == user?.uuid || (collection && user && collection.shared_with?.includes(user.uuid))}
|
||||
<div class="pt-4 border-t border-base-300 flex justify-end gap-2">
|
||||
<button
|
||||
class="btn btn-neutral btn-sm flex items-center gap-1"
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
function initializeLodging(lodgingToEdit: Lodging | null): Lodging {
|
||||
return {
|
||||
id: lodgingToEdit?.id || '',
|
||||
user_id: lodgingToEdit?.user_id || '',
|
||||
user: lodgingToEdit?.user || '',
|
||||
name: lodgingToEdit?.name || '',
|
||||
type: lodgingToEdit?.type || 'other',
|
||||
description: lodgingToEdit?.description || '',
|
||||
|
|
|
@ -103,7 +103,7 @@
|
|||
|
||||
// Navigation items for better organization
|
||||
const navigationItems = [
|
||||
{ path: '/adventures', icon: MapMarker, label: 'navbar.adventures' },
|
||||
{ path: '/locations', icon: MapMarker, label: 'locations.locations' },
|
||||
{ path: '/collections', icon: FormatListBulletedSquare, label: 'navbar.collections' },
|
||||
{ path: '/worldtravel', icon: Earth, label: 'navbar.worldtravel' },
|
||||
{ path: '/map', icon: Map, label: 'navbar.map' },
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
<img src={Lost} alt="Lost" class="w-1/2" />
|
||||
</div>
|
||||
<h1 class="mt-4 text-3xl font-bold tracking-tight text-foreground sm:text-4xl">
|
||||
{$t('adventures.no_adventures_found')}
|
||||
{$t('adventures.no_locations_found')}
|
||||
</h1>
|
||||
{#if !error}
|
||||
<p class="mt-4 text-muted-foreground">
|
||||
|
|
|
@ -124,7 +124,7 @@
|
|||
<Launch class="w-5 h-5" />
|
||||
{$t('notes.open')}
|
||||
</button>
|
||||
{#if note.user_id == user?.uuid || (collection && user && collection.shared_with?.includes(user.uuid))}
|
||||
{#if note.user == user?.uuid || (collection && user && collection.shared_with?.includes(user.uuid))}
|
||||
<button
|
||||
id="delete_adventure"
|
||||
data-umami-event="Delete Adventure"
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
let constrainDates: boolean = false;
|
||||
|
||||
let isReadOnly =
|
||||
!(note && user?.uuid == note?.user_id) &&
|
||||
!(note && user?.uuid == note?.user) &&
|
||||
!(user && collection && collection.shared_with && collection.shared_with.includes(user.uuid)) &&
|
||||
!!note;
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<script lang="ts">
|
||||
// @ts-nocheck
|
||||
import type { Adventure, GeocodeSearchResult, Point } from '$lib/types';
|
||||
import type { Location, GeocodeSearchResult, Point } from '$lib/types';
|
||||
import { createEventDispatcher } from 'svelte';
|
||||
const dispatch = createEventDispatcher();
|
||||
import { onMount } from 'svelte';
|
||||
|
@ -13,7 +13,7 @@
|
|||
let markers: Point[] = [];
|
||||
|
||||
export let query: string | null = null;
|
||||
export let adventure: Adventure;
|
||||
export let adventure: Location;
|
||||
|
||||
if (query) {
|
||||
geocode();
|
||||
|
@ -83,7 +83,7 @@
|
|||
adventure.name = markers[0].name;
|
||||
}
|
||||
if (adventure.type == 'visited' || adventure.type == 'planned') {
|
||||
adventure.activity_types = [...adventure.activity_types, markers[0].activity_type];
|
||||
adventure.tags = [...adventure.tags, markers[0].activity_type];
|
||||
}
|
||||
dispatch('submit', adventure);
|
||||
close();
|
||||
|
|
|
@ -192,7 +192,7 @@
|
|||
</div>
|
||||
|
||||
<!-- Actions -->
|
||||
{#if transportation.user_id === user?.uuid || (collection && user && collection.shared_with?.includes(user.uuid))}
|
||||
{#if transportation.user === user?.uuid || (collection && user && collection.shared_with?.includes(user.uuid))}
|
||||
<div class="pt-4 border-t border-base-300 flex justify-end gap-2">
|
||||
<button
|
||||
class="btn btn-neutral btn-sm flex items-center gap-1"
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
flight_number: transportationToEdit?.flight_number || '',
|
||||
from_location: transportationToEdit?.from_location || '',
|
||||
to_location: transportationToEdit?.to_location || '',
|
||||
user_id: transportationToEdit?.user_id || '',
|
||||
user: transportationToEdit?.user || '',
|
||||
is_public: transportationToEdit?.is_public || false,
|
||||
collection: transportationToEdit?.collection || collection.id,
|
||||
created_at: transportationToEdit?.created_at || '',
|
||||
|
@ -182,11 +182,11 @@
|
|||
if (data.id) {
|
||||
transportation = data as Transportation;
|
||||
|
||||
addToast('success', $t('adventures.adventure_created'));
|
||||
addToast('success', $t('adventures.location_created'));
|
||||
dispatch('save', transportation);
|
||||
} else {
|
||||
console.error(data);
|
||||
addToast('error', $t('adventures.adventure_create_error'));
|
||||
addToast('error', $t('adventures.location_create_error'));
|
||||
}
|
||||
} else {
|
||||
let res = await fetch(`/api/transportations/${transportation.id}`, {
|
||||
|
@ -200,10 +200,10 @@
|
|||
if (data.id) {
|
||||
transportation = data as Transportation;
|
||||
|
||||
addToast('success', $t('adventures.adventure_updated'));
|
||||
addToast('success', $t('adventures.location_updated'));
|
||||
dispatch('save', transportation);
|
||||
} else {
|
||||
addToast('error', $t('adventures.adventure_update_error'));
|
||||
addToast('error', $t('adventures.location_update_error'));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,7 +4,7 @@ import randomBackgrounds from './json/backgrounds.json';
|
|||
// @ts-ignore
|
||||
import { DateTime } from 'luxon';
|
||||
import type {
|
||||
Adventure,
|
||||
Location,
|
||||
Background,
|
||||
Checklist,
|
||||
Collection,
|
||||
|
@ -34,26 +34,6 @@ export function checkLink(link: string) {
|
|||
}
|
||||
}
|
||||
|
||||
export async function exportData() {
|
||||
let res = await fetch('/api/adventures/all');
|
||||
let adventures = (await res.json()) as Adventure[];
|
||||
|
||||
res = await fetch('/api/collections/all');
|
||||
let collections = (await res.json()) as Collection[];
|
||||
|
||||
res = await fetch('/api/visitedregion');
|
||||
let visitedRegions = await res.json();
|
||||
|
||||
const data = {
|
||||
adventures,
|
||||
collections,
|
||||
visitedRegions
|
||||
};
|
||||
|
||||
const blob = new Blob([JSON.stringify(data)], { type: 'application/json' });
|
||||
return URL.createObjectURL(blob);
|
||||
}
|
||||
|
||||
export function isValidUrl(url: string) {
|
||||
try {
|
||||
new URL(url);
|
||||
|
@ -63,22 +43,22 @@ export function isValidUrl(url: string) {
|
|||
}
|
||||
}
|
||||
|
||||
export function groupAdventuresByDate(
|
||||
adventures: Adventure[],
|
||||
export function groupLocationsByDate(
|
||||
locations: Location[],
|
||||
startDate: Date,
|
||||
numberOfDays: number
|
||||
): Record<string, Adventure[]> {
|
||||
const groupedAdventures: Record<string, Adventure[]> = {};
|
||||
): Record<string, Location[]> {
|
||||
const groupedLocations: Record<string, Location[]> = {};
|
||||
|
||||
// Initialize all days in the range using DateTime
|
||||
for (let i = 0; i < numberOfDays; i++) {
|
||||
const currentDate = DateTime.fromJSDate(startDate).plus({ days: i });
|
||||
const dateString = currentDate.toISODate(); // 'YYYY-MM-DD'
|
||||
groupedAdventures[dateString] = [];
|
||||
groupedLocations[dateString] = [];
|
||||
}
|
||||
|
||||
adventures.forEach((adventure) => {
|
||||
adventure.visits.forEach((visit) => {
|
||||
locations.forEach((location) => {
|
||||
location.visits.forEach((visit: { start_date: string; end_date: string; timezone: any }) => {
|
||||
if (visit.start_date) {
|
||||
// Check if it's all-day: start has 00:00:00 AND (no end OR end also has 00:00:00)
|
||||
const startHasZeros = isAllDay(visit.start_date);
|
||||
|
@ -115,10 +95,10 @@ export function groupAdventuresByDate(
|
|||
const currentDate = DateTime.fromJSDate(startDate).plus({ days: i });
|
||||
const currentDateStr = currentDate.toISODate();
|
||||
|
||||
// Include the current day if it falls within the adventure date range
|
||||
// Include the current day if it falls within the location date range
|
||||
if (currentDateStr >= startDateStr && currentDateStr <= endDateStr) {
|
||||
if (groupedAdventures[currentDateStr]) {
|
||||
groupedAdventures[currentDateStr].push(adventure);
|
||||
if (groupedLocations[currentDateStr]) {
|
||||
groupedLocations[currentDateStr].push(location);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -126,7 +106,7 @@ export function groupAdventuresByDate(
|
|||
});
|
||||
});
|
||||
|
||||
return groupedAdventures;
|
||||
return groupedLocations;
|
||||
}
|
||||
|
||||
function getLocalDateString(date: Date): string {
|
||||
|
@ -426,15 +406,6 @@ export let TRANSPORTATION_TYPES_ICONS = {
|
|||
other: '❓'
|
||||
};
|
||||
|
||||
export function getAdventureTypeLabel(type: string) {
|
||||
// return the emoji ADVENTURE_TYPE_ICONS label for the given type if not found return ? emoji
|
||||
if (type in ADVENTURE_TYPE_ICONS) {
|
||||
return ADVENTURE_TYPE_ICONS[type as keyof typeof ADVENTURE_TYPE_ICONS];
|
||||
} else {
|
||||
return '❓';
|
||||
}
|
||||
}
|
||||
|
||||
export function getRandomBackground() {
|
||||
const today = new Date();
|
||||
|
||||
|
|
|
@ -14,12 +14,11 @@ export type User = {
|
|||
disable_password: boolean;
|
||||
};
|
||||
|
||||
export type Adventure = {
|
||||
export type Location = {
|
||||
id: string;
|
||||
user_id: string | null;
|
||||
name: string;
|
||||
location?: string | null;
|
||||
activity_types?: string[] | null;
|
||||
tags?: string[] | null;
|
||||
description?: string | null;
|
||||
rating?: number | null;
|
||||
link?: string | null;
|
||||
|
@ -45,13 +44,13 @@ export type Adventure = {
|
|||
is_visited?: boolean;
|
||||
category: Category | null;
|
||||
attachments: Attachment[];
|
||||
user?: User | null;
|
||||
user: User | null;
|
||||
city?: City | null;
|
||||
region?: Region | null;
|
||||
country?: Country | null;
|
||||
};
|
||||
|
||||
export type AdditionalAdventure = Adventure & {
|
||||
export type AdditionalLocation = Location & {
|
||||
sun_times: {
|
||||
date: string;
|
||||
visit_id: string;
|
||||
|
@ -96,7 +95,7 @@ export type City = {
|
|||
export type VisitedRegion = {
|
||||
id: number;
|
||||
region: string;
|
||||
user_id: string;
|
||||
user: string;
|
||||
longitude: number;
|
||||
latitude: number;
|
||||
name: string;
|
||||
|
@ -105,7 +104,7 @@ export type VisitedRegion = {
|
|||
export type VisitedCity = {
|
||||
id: number;
|
||||
city: string;
|
||||
user_id: string;
|
||||
user: string;
|
||||
longitude: number;
|
||||
latitude: number;
|
||||
name: string;
|
||||
|
@ -123,11 +122,11 @@ export type Point = {
|
|||
|
||||
export type Collection = {
|
||||
id: string;
|
||||
user_id: string;
|
||||
user: string;
|
||||
name: string;
|
||||
description: string;
|
||||
is_public: boolean;
|
||||
adventures: Adventure[];
|
||||
locations: Location[];
|
||||
created_at?: string | null;
|
||||
start_date: string | null;
|
||||
end_date: string | null;
|
||||
|
@ -153,7 +152,7 @@ export type GeocodeSearchResult = {
|
|||
|
||||
export type Transportation = {
|
||||
id: string;
|
||||
user_id: string;
|
||||
user: string;
|
||||
type: string;
|
||||
name: string;
|
||||
description: string | null;
|
||||
|
@ -179,7 +178,7 @@ export type Transportation = {
|
|||
|
||||
export type Note = {
|
||||
id: string;
|
||||
user_id: string;
|
||||
user: string;
|
||||
name: string;
|
||||
content: string | null;
|
||||
links: string[] | null;
|
||||
|
@ -192,7 +191,7 @@ export type Note = {
|
|||
|
||||
export type Checklist = {
|
||||
id: string;
|
||||
user_id: string;
|
||||
user: string;
|
||||
name: string;
|
||||
items: ChecklistItem[];
|
||||
date: string | null; // ISO 8601 date string
|
||||
|
@ -204,7 +203,7 @@ export type Checklist = {
|
|||
|
||||
export type ChecklistItem = {
|
||||
id: string;
|
||||
user_id: string;
|
||||
user: string;
|
||||
name: string;
|
||||
is_checked: boolean;
|
||||
checklist: number;
|
||||
|
@ -235,8 +234,8 @@ export type Category = {
|
|||
name: string;
|
||||
display_name: string;
|
||||
icon: string;
|
||||
user_id: string;
|
||||
num_adventures?: number | null;
|
||||
user: string;
|
||||
num_locations?: number | null;
|
||||
};
|
||||
|
||||
export type ImmichIntegration = {
|
||||
|
@ -277,15 +276,15 @@ export type ImmichAlbum = {
|
|||
export type Attachment = {
|
||||
id: string;
|
||||
file: string;
|
||||
adventure: string;
|
||||
location: string;
|
||||
extension: string;
|
||||
user_id: string;
|
||||
user: string;
|
||||
name: string;
|
||||
};
|
||||
|
||||
export type Lodging = {
|
||||
id: string;
|
||||
user_id: string;
|
||||
user: string;
|
||||
name: string;
|
||||
type: string;
|
||||
description: string | null;
|
||||
|
|
|
@ -14,18 +14,12 @@
|
|||
"adventures": {
|
||||
"activities": {},
|
||||
"add_to_collection": "Zur Sammlung hinzufügen",
|
||||
"adventure_delete_confirm": "Sind Sie sicher, dass Sie dieses Abenteuer löschen möchten? \nDiese Aktion kann nicht rückgängig gemacht werden.",
|
||||
"collection_link_error": "Fehler beim Verknüpfen des Abenteuers mit der Sammlung",
|
||||
"collection_link_success": "Abenteuer erfolgreich mit Sammlung verknüpft!",
|
||||
"collection_remove_error": "Beim Entfernen des Abenteuers aus der Sammlung ist ein Fehler aufgetreten",
|
||||
"collection_remove_success": "Abenteuer erfolgreich aus der Sammlung entfernt!",
|
||||
"delete": "Löschen",
|
||||
"edit_adventure": "Abenteuer bearbeiten",
|
||||
"no_image_found": "Kein Bild gefunden",
|
||||
"open_details": "Details",
|
||||
"remove_from_collection": "Aus Sammlung entfernen",
|
||||
"adventure": "Abenteuer",
|
||||
"adventure_delete_success": "Abenteuer erfolgreich gelöscht!",
|
||||
"archive": "Archiv",
|
||||
"archived": "Archiviert",
|
||||
"archived_collection_message": "Sammlung erfolgreich archiviert!",
|
||||
|
@ -39,7 +33,6 @@
|
|||
"count_txt": "Suchergebnisse",
|
||||
"date": "Datum",
|
||||
"dates": "Termine",
|
||||
"delete_adventure": "Abenteuer löschen",
|
||||
"delete_collection": "Sammlung löschen",
|
||||
"delete_collection_success": "Sammlung erfolgreich gelöscht!",
|
||||
"descending": "Absteigend",
|
||||
|
@ -56,8 +49,6 @@
|
|||
"my_collections": "Meine Sammlungen",
|
||||
"name": "Name",
|
||||
"no_image_url": "Unter dieser URL wurde kein Bild gefunden.",
|
||||
"not_found": "Abenteuer nicht gefunden",
|
||||
"not_found_desc": "Das von Ihnen gesuchte Abenteuer konnte nicht gefunden werden. \nBitte versuchen Sie ein anderes Abenteuer aus oder schauen Sie später noch mal vorbei.",
|
||||
"open_filters": "Filter öffnen",
|
||||
"order_by": "Sortieren nach",
|
||||
"order_direction": "Sortierreihenfolge",
|
||||
|
@ -80,10 +71,6 @@
|
|||
"activity_types": "Aktivitätstypen",
|
||||
"add": "Hinzufügen",
|
||||
"add_notes": "Notizen hinzufügen",
|
||||
"adventure_create_error": "Das Abenteuer konnte nicht erstellt werden",
|
||||
"adventure_created": "Abenteuer erstellt",
|
||||
"adventure_update_error": "Das Abenteuer konnte nicht aktualisiert werden",
|
||||
"adventure_updated": "Abenteuer aktualisiert",
|
||||
"basic_information": "Basisdaten",
|
||||
"category": "Kategorie",
|
||||
"clear_map": "Karte leeren",
|
||||
|
@ -100,23 +87,19 @@
|
|||
"location": "Standort",
|
||||
"location_information": "Standortinformationen",
|
||||
"my_images": "Meine Bilder",
|
||||
"new_adventure": "Neues Abenteuer",
|
||||
"no_description_found": "Keine Beschreibung gefunden",
|
||||
"no_images": "Keine Bilder",
|
||||
"no_location": "Bitte geben Sie einen Ort ein",
|
||||
"no_results": "Keine Ergebnisse gefunden",
|
||||
"public_adventure": "Öffentliches Abenteuer",
|
||||
"remove": "Entfernen",
|
||||
"save_next": "Speichern & weiter",
|
||||
"search_for_location": "Nach einem Ort suchen",
|
||||
"search_results": "Suchergebnisse",
|
||||
"see_adventures": "Siehe Abenteuer",
|
||||
"share_adventure": "Teilen Sie dieses Abenteuer!",
|
||||
"start_date": "Startdatum",
|
||||
"upload_image": "Bild hochladen",
|
||||
"url": "URL",
|
||||
"warning": "Warnung",
|
||||
"wiki_desc": "Ruft einen Auszug aus einem Wikipedia-Artikel ab, der zum Namen des Abenteuers passt.",
|
||||
"wikipedia": "Wikipedia",
|
||||
"adventure_not_found": "Keine Abenteuer vorhanden. \nFügen Sie welche über die Plus-Schaltfläche unten rechts hinzu oder versuchen Sie, die Filter zu ändern!",
|
||||
"all": "Alle",
|
||||
|
@ -124,7 +107,6 @@
|
|||
"mark_visited": "als besucht markieren",
|
||||
"my_adventures": "Meine Abenteuer",
|
||||
"no_adventures_found": "Keine Abenteuer gefunden",
|
||||
"no_collections_found": "Es wurden keine Sammlungen gefunden, die zu diesem Abenteuer hinzugefügt werden können.",
|
||||
"no_linkable_adventures": "Es wurden keine Abenteuer gefunden, die mit dieser Sammlung verknüpft werden können.",
|
||||
"not_visited": "Nicht besucht",
|
||||
"regions_updated": "Regionen aktualisiert",
|
||||
|
@ -181,10 +163,7 @@
|
|||
"starting_airport": "Startflughafen",
|
||||
"to": "Nach",
|
||||
"transportation_delete_confirm": "Sind Sie sicher, dass Sie diesen Transport löschen möchten? \nDies lässt sich nicht rückgängig machen.",
|
||||
"will_be_marked": "wird als besucht markiert, sobald das Abenteuer gespeichert wird.",
|
||||
"cities_updated": "Städte aktualisiert",
|
||||
"create_adventure": "Erstelle Abenteuer",
|
||||
"no_adventures_to_recommendations": "Keine Abenteuer gefunden. \nFügen Sie mindestens ein Abenteuer hinzu, um Empfehlungen zu erhalten.",
|
||||
"finding_recommendations": "Entdecken Sie verborgene Schätze für Ihr nächstes Abenteuer",
|
||||
"attachment": "Anhang",
|
||||
"attachment_delete_success": "Anhang gelöscht!",
|
||||
|
@ -246,7 +225,32 @@
|
|||
"name_location": "Name, Ort",
|
||||
"collection_contents": "Sammelinhalt",
|
||||
"check_in": "Einchecken",
|
||||
"check_out": "Kasse"
|
||||
"check_out": "Kasse",
|
||||
"collection_link_location_error": "Fehlerverknüpfungsort zur Sammlung",
|
||||
"collection_link_location_success": "Standort, die mit der Sammlung erfolgreich verknüpft sind!",
|
||||
"collection_locations": "Sammelorte einbeziehen",
|
||||
"collection_remove_location_error": "Fehler zur Entfernung des Standorts aus der Sammlung",
|
||||
"collection_remove_location_success": "Standort erfolgreich aus der Sammlung entfernt!",
|
||||
"create_location": "Standort erstellen",
|
||||
"delete_location": "Position löschen",
|
||||
"edit_location": "Standort bearbeiten",
|
||||
"location_create_error": "Der Standort erstellt nicht",
|
||||
"location_created": "Ort erstellt",
|
||||
"location_delete_confirm": "Sind Sie sicher, dass Sie diesen Ort löschen möchten? \nDiese Aktion kann nicht rückgängig gemacht werden.",
|
||||
"location_delete_success": "Standort erfolgreich gelöscht!",
|
||||
"location_not_found": "Ort nicht gefunden",
|
||||
"location_not_found_desc": "Der Ort, den Sie gesucht haben, konnte nicht gefunden werden. \nBitte probieren Sie einen anderen Ort aus oder schauen Sie später noch einmal vorbei.",
|
||||
"location_update_error": "Der Standort nicht aktualisiert",
|
||||
"location_updated": "Standort aktualisiert",
|
||||
"new_location": "Neuer Standort",
|
||||
"no_collections_to_add_location": "Keine Sammlungen, die diesen Ort hinzuzufügen.",
|
||||
"no_locations_to_recommendations": "Keine Standorte gefunden. \nFügen Sie mindestens einen Ort hinzu, um Empfehlungen zu erhalten.",
|
||||
"public_location": "Öffentliche Lage",
|
||||
"share_location": "Teilen Sie diesen Ort!",
|
||||
"visit_calendar": "Besuchen Sie den Kalender",
|
||||
"wiki_location_desc": "Zieht Auszug aus dem Wikipedia -Artikel, der dem Namen des Standorts entspricht.",
|
||||
"will_be_marked_location": "wird als besucht markiert, sobald der Standort gespeichert ist.",
|
||||
"no_locations_found": "Keine Standorte gefunden"
|
||||
},
|
||||
"home": {
|
||||
"desc_1": "Entdecken, planen und erkunden Sie mühelos",
|
||||
|
@ -317,10 +321,10 @@
|
|||
"public_tooltip": "Mit einem öffentlichen Profil können Benutzer Sammlungen mit Ihnen teilen und Ihr Profil auf der Benutzerseite anzeigen.",
|
||||
"new_password": "Neues Passwort",
|
||||
"or_3rd_party": "Oder melden Sie sich bei einem Drittanbieter an",
|
||||
"no_public_adventures": "Keine öffentlichen Abenteuer gefunden",
|
||||
"no_public_collections": "Keine öffentlichen Sammlungen gefunden",
|
||||
"user_adventures": "Benutzerabenteuer",
|
||||
"user_collections": "Benutzersammlungen"
|
||||
"user_collections": "Benutzersammlungen",
|
||||
"no_public_locations": "Keine öffentlichen Standorte gefunden",
|
||||
"user_locations": "Benutzerstandorte"
|
||||
},
|
||||
"users": {
|
||||
"no_users_found": "Keine Benutzer mit öffentlichem Profil gefunden."
|
||||
|
@ -568,7 +572,13 @@
|
|||
"search": {
|
||||
"adventurelog_results": "AdventureLog-Ergebnisse",
|
||||
"online_results": "Online-Ergebnisse",
|
||||
"public_adventures": "Öffentliche Abenteuer"
|
||||
"public_adventures": "Öffentliche Abenteuer",
|
||||
"cities": "Städte",
|
||||
"countries": "Länder",
|
||||
"found": "gefunden",
|
||||
"result": "Ergebnis",
|
||||
"results": "Ergebnisse",
|
||||
"try_searching_desc": "Versuchen Sie, nach Abenteuern, Sammlungen, Ländern, Regionen, Städten oder Nutzern zu suchen."
|
||||
},
|
||||
"map": {
|
||||
"add_adventure": "Neues Abenteuer hinzufügen",
|
||||
|
@ -579,13 +589,16 @@
|
|||
"show_visited_regions": "Besuchte Regionen anzeigen",
|
||||
"view_details": "Details anzeigen",
|
||||
"adventure_stats": "Abenteuerstatistiken",
|
||||
"adventures_shown": "Abenteuer gezeigt",
|
||||
"completion": "Fertigstellung",
|
||||
"display_options": "Anzeigenoptionen",
|
||||
"map_controls": "Kartensteuerungen",
|
||||
"marker_placed_on_map": "Marker auf der Karte platziert",
|
||||
"place_marker_desc": "Klicken Sie auf die Karte, um einen Marker zu platzieren, oder fügen Sie ein Abenteuer ohne Ort hinzu.",
|
||||
"regions": "Regionen"
|
||||
"regions": "Regionen",
|
||||
"add_location": "Neuen Standort hinzufügen",
|
||||
"add_location_at_marker": "Fügen Sie einen neuen Standort bei Marker hinzu",
|
||||
"location_map": "Standortkarte",
|
||||
"locations_shown": "Standorte gezeigt",
|
||||
"place_marker_desc_location": "Klicken Sie auf die Karte, um einen Marker zu platzieren."
|
||||
},
|
||||
"languages": {},
|
||||
"share": {
|
||||
|
@ -611,9 +624,9 @@
|
|||
"no_shared_adventures": "Dieser Benutzer hat noch keine öffentlichen Abenteuer geteilt.",
|
||||
"no_shared_collections": "Dieser Benutzer hat noch keine öffentlichen Sammlungen geteilt.",
|
||||
"planned_trips": "Geplante Reisen",
|
||||
"public_adventure_experiences": "Öffentliche Abenteuererlebnisse",
|
||||
"travel_statistics": "Reisestatistik",
|
||||
"your_journey_at_a_glance": "Ihre Abenteuerreise auf einen Blick"
|
||||
"your_journey_at_a_glance": "Ihre Abenteuerreise auf einen Blick",
|
||||
"public_location_experiences": "Öffentliche Standortlebnisse"
|
||||
},
|
||||
"categories": {
|
||||
"category_name": "Kategoriename",
|
||||
|
@ -622,9 +635,9 @@
|
|||
"manage_categories": "Kategorien verwalten",
|
||||
"no_categories_found": "Keine Kategorien gefunden.",
|
||||
"select_category": "Kategorie wählen",
|
||||
"update_after_refresh": "Die Abenteuerkarten werden aktualisiert, sobald Sie die Seite aktualisieren.",
|
||||
"add_new_category": "Neue Kategorie hinzufügen",
|
||||
"name_required": "Der Kategorienname ist erforderlich"
|
||||
"name_required": "Der Kategorienname ist erforderlich",
|
||||
"location_update_after_refresh": "Die Standortkarten werden aktualisiert, sobald Sie die Seite aktualisiert haben."
|
||||
},
|
||||
"dashboard": {
|
||||
"add_some": "Warum nicht gleich Ihr nächstes Abenteuer planen? Sie können ein neues Abenteuer hinzufügen, indem Sie auf den Button unten klicken.",
|
||||
|
@ -670,9 +683,9 @@
|
|||
"recomendations": {
|
||||
"recommendation": "Empfehlung",
|
||||
"recommendations": "Empfehlungen",
|
||||
"adventure_recommendations": "Abenteuerempfehlungen",
|
||||
"food": "Essen",
|
||||
"tourism": "Tourismus"
|
||||
"tourism": "Tourismus",
|
||||
"location_recommendations": "Standortempfehlungen"
|
||||
},
|
||||
"lodging": {
|
||||
"apartment": "Wohnung",
|
||||
|
@ -695,17 +708,19 @@
|
|||
"google_maps_integration_desc": "Verbinden Sie Ihr Google Maps-Konto, um hochwertige Suchergebnisse und Empfehlungen für Standort zu erhalten."
|
||||
},
|
||||
"calendar": {
|
||||
"all_categories": "Alle Kategorien",
|
||||
"all_day_event": "Ganztägige Veranstaltung",
|
||||
"calendar_overview": "Kalenderübersicht",
|
||||
"categories": "Kategorien",
|
||||
"day": "Tag",
|
||||
"events_scheduled": "Veranstaltungen geplant",
|
||||
"filter_by_category": "Filter nach Kategorie",
|
||||
"filtered_results": "Gefilterte Ergebnisse",
|
||||
"month": "Monat",
|
||||
"today": "Heute",
|
||||
"total_events": "Gesamtereignisse",
|
||||
"week": "Woche"
|
||||
},
|
||||
"locations": {
|
||||
"location": "Standort",
|
||||
"locations": "Standorte",
|
||||
"my_locations": "Meine Standorte"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -64,9 +64,9 @@
|
|||
"latest_travel_experiences": "Your latest travel experiences"
|
||||
},
|
||||
"adventures": {
|
||||
"collection_remove_success": "Adventure removed from collection successfully!",
|
||||
"collection_remove_error": "Error removing adventure from collection",
|
||||
"collection_link_success": "Adventure linked to collection successfully!",
|
||||
"collection_remove_location_success": "Location removed from collection successfully!",
|
||||
"collection_remove_location_error": "Error removing location from collection",
|
||||
"collection_link_location_success": "Location linked to collection successfully!",
|
||||
"invalid_date_range": "Invalid date range",
|
||||
"timezone": "Timezone",
|
||||
"no_visits": "No visits",
|
||||
|
@ -75,8 +75,8 @@
|
|||
"departure_date": "Departure Date",
|
||||
"arrival_date": "Arrival Date",
|
||||
"no_image_found": "No image found",
|
||||
"collection_link_error": "Error linking adventure to collection",
|
||||
"adventure_delete_confirm": "Are you sure you want to delete this adventure? This action cannot be undone.",
|
||||
"collection_link_location_error": "Error linking location to collection",
|
||||
"location_delete_confirm": "Are you sure you want to delete this location? This action cannot be undone.",
|
||||
"checklist_delete_confirm": "Are you sure you want to delete this checklist? This action cannot be undone.",
|
||||
"note_delete_confirm": "Are you sure you want to delete this note? This action cannot be undone.",
|
||||
"transportation_delete_confirm": "Are you sure you want to delete this transportation? This action cannot be undone.",
|
||||
|
@ -87,11 +87,12 @@
|
|||
"delete_lodging": "Delete Lodging",
|
||||
"open_details": "Open Details",
|
||||
"edit_adventure": "Edit Adventure",
|
||||
"edit_location": "Edit Location",
|
||||
"remove_from_collection": "Remove from Collection",
|
||||
"add_to_collection": "Add to Collection",
|
||||
"delete": "Delete",
|
||||
"not_found": "Adventure not found",
|
||||
"not_found_desc": "The adventure you were looking for could not be found. Please try a different adventure or check back later.",
|
||||
"location_not_found": "Location not found",
|
||||
"location_not_found_desc": "The location you were looking for could not be found. Please try a different location or check back later.",
|
||||
"homepage": "Homepage",
|
||||
"collection": "Collection",
|
||||
"longitude": "Longitude",
|
||||
|
@ -122,7 +123,7 @@
|
|||
"my_images": "My Images",
|
||||
"no_images": "No Images",
|
||||
"distance": "Distance",
|
||||
"share_adventure": "Share this Adventure!",
|
||||
"share_location": "Share this Location!",
|
||||
"share_collection": "Share this Collection!",
|
||||
"copy_link": "Copy Link",
|
||||
"sun_times": "Sun Times",
|
||||
|
@ -149,18 +150,19 @@
|
|||
"search_results": "Search results",
|
||||
"collection_no_start_end_date": "Adding a start and end date to the collection will unlock itinerary planning features in the collection page.",
|
||||
"no_results": "No results found",
|
||||
"wiki_desc": "Pulls excerpt from Wikipedia article matching the name of the adventure.",
|
||||
"wiki_location_desc": "Pulls excerpt from Wikipedia article matching the name of the location.",
|
||||
"attachments": "Attachments",
|
||||
"attachment": "Attachment",
|
||||
"images": "Images",
|
||||
"generate_desc": "Generate Description",
|
||||
"public_adventure": "Public Adventure",
|
||||
"public_location": "Public Location",
|
||||
"location_information": "Location Information",
|
||||
"link": "Link",
|
||||
"links": "Links",
|
||||
"description": "Description",
|
||||
"sources": "Sources",
|
||||
"collection_adventures": "Include Collection Adventures",
|
||||
"collection_locations": "Include Collection Locations",
|
||||
"filter": "Filter",
|
||||
"category_filter": "Category Filter",
|
||||
"category": "Category",
|
||||
|
@ -178,7 +180,7 @@
|
|||
"edit_collection": "Edit Collection",
|
||||
"unarchive": "Unarchive",
|
||||
"archive": "Archive",
|
||||
"no_collections_found": "No collections found to add this adventure to.",
|
||||
"no_collections_to_add_location": "No collections found to add this location to.",
|
||||
"create_collection_first": "Create a collection first to organize your adventures and memories.",
|
||||
"done": "Done",
|
||||
"adventures_available": "Adventures Available",
|
||||
|
@ -190,8 +192,8 @@
|
|||
"cancel": "Cancel",
|
||||
"delete_collection_warning": "Are you sure you want to delete this collection? This action cannot be undone.",
|
||||
"delete_collection": "Delete Collection",
|
||||
"delete_adventure": "Delete Adventure",
|
||||
"adventure_delete_success": "Adventure deleted successfully!",
|
||||
"delete_location": "Delete Location",
|
||||
"location_delete_success": "Location deleted successfully!",
|
||||
"visited": "Visited",
|
||||
"planned": "Planned",
|
||||
"duration": "Duration",
|
||||
|
@ -209,21 +211,22 @@
|
|||
"image_fetch_failed": "Failed to fetch image",
|
||||
"no_location": "Please enter a location",
|
||||
"no_description_found": "No description found",
|
||||
"adventure_created": "Adventure created",
|
||||
"adventure_create_error": "Failed to create adventure",
|
||||
"location_created": "Location created",
|
||||
"location_create_error": "Failed to create location",
|
||||
"lodging": "Lodging",
|
||||
"create_adventure": "Create Adventure",
|
||||
"adventure_updated": "Adventure updated",
|
||||
"adventure_update_error": "Failed to update adventure",
|
||||
"create_location": "Create Location",
|
||||
"location_updated": "Location updated",
|
||||
"location_update_error": "Failed to update location",
|
||||
"set_to_pin": "Set to Pin",
|
||||
"category_fetch_error": "Error fetching categories",
|
||||
"new_adventure": "New Adventure",
|
||||
"new_location": "New Location",
|
||||
"basic_information": "Basic Information",
|
||||
"no_adventures_to_recommendations": "No adventures found. Add at least one adventure to get recommendations.",
|
||||
"no_locations_to_recommendations": "No locations found. Add at least one location to get recommendations.",
|
||||
"display_name": "Display Name",
|
||||
"adventure_not_found": "There are no adventures to display. Add some using the plus button at the bottom right or try changing filters!",
|
||||
"collection_contents": "Collection Contents",
|
||||
"no_adventures_found": "No adventures found",
|
||||
"no_locations_found": "No locations found",
|
||||
"no_adventures_message": "Start documenting your adventures and planning new ones. Every journey has a story worth telling.",
|
||||
"mark_visited": "Mark Visited",
|
||||
"error_updating_regions": "Error updating regions",
|
||||
|
@ -248,6 +251,7 @@
|
|||
"checklists": "Checklists",
|
||||
"transportations": "Transportations",
|
||||
"adventure_calendar": "Adventure Calendar",
|
||||
"visit_calendar": "Visit Calendar",
|
||||
"day": "Day",
|
||||
"itineary_by_date": "Itinerary by Date",
|
||||
"nothing_planned": "Nothing planned for this day. Enjoy the journey!",
|
||||
|
@ -263,7 +267,7 @@
|
|||
"no_location_found": "No location found",
|
||||
"from": "From",
|
||||
"to": "To",
|
||||
"will_be_marked": "will be marked as visited once the adventure is saved.",
|
||||
"will_be_marked_location": "will be marked as visited once the location is saved.",
|
||||
"start": "Start",
|
||||
"end": "End",
|
||||
"emoji_picker": "Emoji Picker",
|
||||
|
@ -373,9 +377,9 @@
|
|||
"public_tooltip": "With a public profile, users can share collections with you and view your profile on the users page.",
|
||||
"new_password": "New Password (6+ characters)",
|
||||
"or_3rd_party": "Or login with a third-party service",
|
||||
"no_public_adventures": "No public adventures found",
|
||||
"no_public_locations": "No public locations found",
|
||||
"no_public_collections": "No public collections found",
|
||||
"user_adventures": "User Adventures",
|
||||
"user_locations": "User Locations",
|
||||
"user_collections": "User Collections"
|
||||
},
|
||||
"users": {
|
||||
|
@ -585,24 +589,33 @@
|
|||
"search": {
|
||||
"adventurelog_results": "AdventureLog Results",
|
||||
"public_adventures": "Public Adventures",
|
||||
"online_results": "Online Results"
|
||||
"online_results": "Online Results",
|
||||
"result": "Result",
|
||||
"results": "Results",
|
||||
"found": "found",
|
||||
"try_searching_desc": "Try searching for adventures, collections, countries, regions, cities, or users.",
|
||||
"countries": "Countries",
|
||||
"cities": "Cities"
|
||||
},
|
||||
"map": {
|
||||
"view_details": "View Details",
|
||||
"adventure_map": "Adventure Map",
|
||||
"location_map": "Location Map",
|
||||
"map_options": "Map Options",
|
||||
"show_visited_regions": "Show Visited Regions",
|
||||
"add_adventure_at_marker": "Add New Adventure at Marker",
|
||||
"add_location_at_marker": "Add New Location at Marker",
|
||||
"clear_marker": "Clear Marker",
|
||||
"add_adventure": "Add New Adventure",
|
||||
"add_location": "Add New Location",
|
||||
"adventure_stats": "Adventure Stats",
|
||||
"map_controls": "Map Controls",
|
||||
"regions": "Regions",
|
||||
"completion": "Completion",
|
||||
"display_options": "Display Options",
|
||||
"marker_placed_on_map": "Marker placed on map",
|
||||
"place_marker_desc": "Click on the map to place a marker, or add an adventure without location.",
|
||||
"adventures_shown": "adventures shown"
|
||||
"place_marker_desc_location": "Click on the map to place a marker.",
|
||||
"locations_shown": "locations shown"
|
||||
},
|
||||
"share": {
|
||||
"shared": "Shared",
|
||||
|
@ -628,7 +641,7 @@
|
|||
"planned_trips": "Planned trips",
|
||||
"discovered": "discovered",
|
||||
"explored": "explored",
|
||||
"public_adventure_experiences": "Public adventure experiences",
|
||||
"public_location_experiences": "Public location experiences",
|
||||
"no_shared_adventures": "This user hasn't shared any public adventures yet.",
|
||||
"no_shared_collections": "This user hasn't shared any public collections yet."
|
||||
},
|
||||
|
@ -637,7 +650,7 @@
|
|||
"no_categories_found": "No categories found.",
|
||||
"edit_category": "Edit Category",
|
||||
"icon": "Icon",
|
||||
"update_after_refresh": "The adventure cards will be updated once you refresh the page.",
|
||||
"location_update_after_refresh": "The location cards will be updated once you refresh the page.",
|
||||
"select_category": "Select Category",
|
||||
"category_name": "Category Name",
|
||||
"add_new_category": "Add New Category",
|
||||
|
@ -690,7 +703,7 @@
|
|||
"recomendations": {
|
||||
"recommendation": "Recommendation",
|
||||
"recommendations": "Recommendations",
|
||||
"adventure_recommendations": "Adventure Recommendations",
|
||||
"location_recommendations": "Location Recommendations",
|
||||
"food": "Food",
|
||||
"tourism": "Tourism"
|
||||
},
|
||||
|
@ -701,11 +714,13 @@
|
|||
"day": "Day",
|
||||
"events_scheduled": "events scheduled",
|
||||
"total_events": "Total Events",
|
||||
"all_categories": "All Categories",
|
||||
"calendar_overview": "Calendar Overview",
|
||||
"categories": "Categories",
|
||||
"filtered_results": "Filtered Results",
|
||||
"filter_by_category": "Filter by Category",
|
||||
"all_day_event": "All Day Event"
|
||||
},
|
||||
"locations": {
|
||||
"location": "Location",
|
||||
"locations": "Locations",
|
||||
"my_locations": "My Locations"
|
||||
}
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -14,18 +14,12 @@
|
|||
"adventures": {
|
||||
"activities": {},
|
||||
"add_to_collection": "Ajouter à la collection",
|
||||
"adventure_delete_confirm": "Êtes-vous sûr de vouloir supprimer cette aventure ? \nCette action ne peut pas être annulée.",
|
||||
"collection_link_error": "Erreur lors de la liaison de l'aventure à la collection",
|
||||
"collection_link_success": "Aventure liée à la collection avec succès !",
|
||||
"collection_remove_error": "Erreur lors de la suppression de l'aventure de la collection",
|
||||
"collection_remove_success": "Aventure supprimée de la collection avec succès !",
|
||||
"delete": "Supprimer",
|
||||
"edit_adventure": "Modifier l'aventure",
|
||||
"no_image_found": "Aucune image trouvée",
|
||||
"open_details": "Ouvrir les détails",
|
||||
"remove_from_collection": "Supprimer de la collection",
|
||||
"adventure": "Aventure",
|
||||
"adventure_delete_success": "Aventure supprimée avec succès !",
|
||||
"archive": "Archiver",
|
||||
"archived": "Archivée",
|
||||
"archived_collection_message": "Collection archivée avec succès !",
|
||||
|
@ -40,7 +34,6 @@
|
|||
"create_new": "Créer une nouvelle aventure...",
|
||||
"date": "Date",
|
||||
"dates": "Dates",
|
||||
"delete_adventure": "Supprimer l'aventure",
|
||||
"delete_collection": "Supprimer la collection",
|
||||
"delete_collection_success": "Collection supprimée avec succès !",
|
||||
"descending": "Descendant",
|
||||
|
@ -57,8 +50,6 @@
|
|||
"my_collections": "Mes collections",
|
||||
"name": "Nom",
|
||||
"no_image_url": "Aucune image trouvée à cette URL.",
|
||||
"not_found": "Aventure introuvable",
|
||||
"not_found_desc": "L'aventure que vous cherchez est introuvable. \nVeuillez essayer une autre aventure ou revenez plus tard.",
|
||||
"open_filters": "Ouvrir les filtres",
|
||||
"order_by": "Trier par",
|
||||
"order_direction": "Direction du tri",
|
||||
|
@ -81,10 +72,6 @@
|
|||
"activity_types": "Types d'activités",
|
||||
"add": "Ajouter",
|
||||
"add_notes": "Ajouter des notes",
|
||||
"adventure_create_error": "Échec de la création de l'aventure",
|
||||
"adventure_created": "Aventure créée",
|
||||
"adventure_update_error": "Échec de la mise à jour de l'aventure",
|
||||
"adventure_updated": "Aventure mise à jour",
|
||||
"basic_information": "Informations de base",
|
||||
"category": "Catégorie",
|
||||
"clear_map": "Effacer la carte",
|
||||
|
@ -100,23 +87,19 @@
|
|||
"location": "Lieu",
|
||||
"location_information": "Informations de localisation",
|
||||
"my_images": "Mes images",
|
||||
"new_adventure": "Nouvelle aventure",
|
||||
"no_description_found": "Aucune description trouvée",
|
||||
"no_images": "Aucune image",
|
||||
"no_location": "Veuillez entrer un emplacement",
|
||||
"no_results": "Aucun résultat trouvé",
|
||||
"public_adventure": "Aventure publique",
|
||||
"remove": "Retirer",
|
||||
"save_next": "Sauvegarder",
|
||||
"search_for_location": "Rechercher un lieu",
|
||||
"search_results": "Résultats de la recherche",
|
||||
"see_adventures": "Voir les aventures",
|
||||
"share_adventure": "Partagez cette aventure !",
|
||||
"start_date": "Date de début",
|
||||
"upload_image": "Télécharger une image",
|
||||
"url": "URL",
|
||||
"warning": "Avertissement",
|
||||
"wiki_desc": "Obtient un extrait de l'article Wikipédia correspondant au nom de l'aventure.",
|
||||
"wikipedia": "Wikipédia",
|
||||
"adventure_not_found": "Il n'y a aucune aventure à afficher. \nAjoutez-en en utilisant le bouton '+' en bas à droite ou essayez de changer les filtres !",
|
||||
"all": "Tous",
|
||||
|
@ -124,7 +107,6 @@
|
|||
"mark_visited": "Marquer comme visité",
|
||||
"my_adventures": "Mes aventures",
|
||||
"no_adventures_found": "Aucune aventure trouvée",
|
||||
"no_collections_found": "Aucune collection trouvée pour ajouter cette aventure.",
|
||||
"no_linkable_adventures": "Aucune aventure trouvée pouvant être liée à cette collection.",
|
||||
"not_visited": "Non visitée",
|
||||
"regions_updated": "régions mises à jour",
|
||||
|
@ -181,10 +163,7 @@
|
|||
"starting_airport": "Aéroport de départ",
|
||||
"to": "Vers",
|
||||
"transportation_delete_confirm": "Etes-vous sûr de vouloir supprimer ce transport ? \nCette action ne peut pas être annulée.",
|
||||
"will_be_marked": "sera marqué comme visité une fois l’aventure sauvegardée.",
|
||||
"cities_updated": "villes mises à jour",
|
||||
"create_adventure": "Créer une aventure",
|
||||
"no_adventures_to_recommendations": "Aucune aventure trouvée. \nAjoutez au moins une aventure pour obtenir des recommandations.",
|
||||
"finding_recommendations": "Découvrir des trésors cachés pour votre prochaine aventure",
|
||||
"attachment": "Pièce jointe",
|
||||
"attachment_delete_success": "Pièce jointe supprimée avec succès !",
|
||||
|
@ -246,7 +225,32 @@
|
|||
"name_location": "nom, emplacement",
|
||||
"collection_contents": "Contenu de la collection",
|
||||
"check_in": "Enregistrement",
|
||||
"check_out": "Vérifier"
|
||||
"check_out": "Vérifier",
|
||||
"collection_link_location_error": "Erreur liant l'emplacement à la collection",
|
||||
"collection_link_location_success": "Emplacement lié à la collection avec succès!",
|
||||
"collection_locations": "Inclure les emplacements de collecte",
|
||||
"collection_remove_location_error": "Erreur de suppression de l'emplacement de la collection",
|
||||
"collection_remove_location_success": "Emplacement retiré de la collection avec succès!",
|
||||
"create_location": "Créer un emplacement",
|
||||
"delete_location": "Supprimer l'emplacement",
|
||||
"edit_location": "Modifier l'emplacement",
|
||||
"location_create_error": "Échec de la création de l'emplacement",
|
||||
"location_created": "Emplacement créé",
|
||||
"location_delete_confirm": "Êtes-vous sûr de vouloir supprimer cet emplacement? \nCette action ne peut pas être annulée.",
|
||||
"location_delete_success": "Emplacement supprimé avec succès!",
|
||||
"location_not_found": "Emplacement introuvable",
|
||||
"location_not_found_desc": "L'emplacement que vous recherchiez n'a pas pu être trouvé. \nVeuillez essayer un autre emplacement ou revenir plus tard.",
|
||||
"location_update_error": "Échec de la mise à jour de l'emplacement",
|
||||
"location_updated": "Emplacement mis à jour",
|
||||
"new_location": "Nouvel emplacement",
|
||||
"no_collections_to_add_location": "Aucune collection n'a été trouvée pour ajouter cet emplacement à.",
|
||||
"no_locations_to_recommendations": "Aucun emplacement trouvé. \nAjoutez au moins un emplacement pour obtenir des recommandations.",
|
||||
"public_location": "Lieu public",
|
||||
"share_location": "Partagez cet emplacement!",
|
||||
"visit_calendar": "Visiter le calendrier",
|
||||
"wiki_location_desc": "Tire un extrait de l'article de Wikipedia correspondant au nom de l'emplacement.",
|
||||
"will_be_marked_location": "sera marqué comme visité une fois l'emplacement enregistré.",
|
||||
"no_locations_found": "Aucun emplacement trouvé"
|
||||
},
|
||||
"home": {
|
||||
"desc_1": "Découvrez, planifiez et explorez en toute simplicité",
|
||||
|
@ -317,10 +321,10 @@
|
|||
"public_tooltip": "Avec un profil public, les utilisateurs peuvent partager des collections avec vous et afficher votre profil sur la page des utilisateurs.",
|
||||
"new_password": "Nouveau mot de passe",
|
||||
"or_3rd_party": "Ou connectez-vous avec un service tiers",
|
||||
"no_public_adventures": "Aucune aventure publique trouvée",
|
||||
"no_public_collections": "Aucune collection publique trouvée",
|
||||
"user_adventures": "Aventures de l'utilisateur",
|
||||
"user_collections": "Collections de l'utilisateur"
|
||||
"user_collections": "Collections de l'utilisateur",
|
||||
"no_public_locations": "Aucun emplacement public trouvé",
|
||||
"user_locations": "Emplacements des utilisateurs"
|
||||
},
|
||||
"users": {
|
||||
"no_users_found": "Aucun utilisateur trouvé avec un profil public."
|
||||
|
@ -568,7 +572,13 @@
|
|||
"search": {
|
||||
"adventurelog_results": "Résultats dans AdventureLog",
|
||||
"online_results": "Résultats en ligne",
|
||||
"public_adventures": "Aventures publiques"
|
||||
"public_adventures": "Aventures publiques",
|
||||
"cities": "Villes",
|
||||
"countries": "Pays",
|
||||
"found": "trouvé",
|
||||
"result": "Résultat",
|
||||
"results": "Résultats",
|
||||
"try_searching_desc": "Essayez de rechercher des aventures, des collections, des pays, des régions, des villes ou des utilisateurs."
|
||||
},
|
||||
"map": {
|
||||
"add_adventure": "Ajouter une nouvelle aventure",
|
||||
|
@ -579,13 +589,16 @@
|
|||
"show_visited_regions": "Afficher les régions visitées",
|
||||
"view_details": "Afficher les détails",
|
||||
"adventure_stats": "Statistiques d'aventure",
|
||||
"adventures_shown": "aventures montrées",
|
||||
"completion": "Achèvement",
|
||||
"display_options": "Options d'affichage",
|
||||
"map_controls": "Contrôles de cartes",
|
||||
"marker_placed_on_map": "Marqueur placé sur la carte",
|
||||
"place_marker_desc": "Cliquez sur la carte pour placer un marqueur ou ajouter une aventure sans emplacement.",
|
||||
"regions": "Régions"
|
||||
"regions": "Régions",
|
||||
"add_location": "Ajouter un nouvel emplacement",
|
||||
"add_location_at_marker": "Ajouter un nouvel emplacement chez Marker",
|
||||
"location_map": "Carte de localisation",
|
||||
"locations_shown": "Emplacements montrés",
|
||||
"place_marker_desc_location": "Cliquez sur la carte pour placer un marqueur."
|
||||
},
|
||||
"languages": {},
|
||||
"share": {
|
||||
|
@ -611,9 +624,9 @@
|
|||
"no_shared_adventures": "Cet utilisateur n'a encore partagé aucune aventure publique.",
|
||||
"no_shared_collections": "Cet utilisateur n'a pas encore partagé de collections publiques.",
|
||||
"planned_trips": "Voyages prévus",
|
||||
"public_adventure_experiences": "Expériences d'aventure publique",
|
||||
"travel_statistics": "Statistiques de voyage",
|
||||
"your_journey_at_a_glance": "Votre voyage d'aventure en un coup d'œil"
|
||||
"your_journey_at_a_glance": "Votre voyage d'aventure en un coup d'œil",
|
||||
"public_location_experiences": "Expériences de localisation publique"
|
||||
},
|
||||
"categories": {
|
||||
"category_name": "Nom de la catégorie",
|
||||
|
@ -622,9 +635,9 @@
|
|||
"manage_categories": "Gérer les catégories",
|
||||
"no_categories_found": "Aucune catégorie trouvée.",
|
||||
"select_category": "Sélectionnez une catégorie",
|
||||
"update_after_refresh": "Les cartes d'aventure seront mises à jour une fois que vous aurez actualisé la page.",
|
||||
"add_new_category": "Ajouter une nouvelle catégorie",
|
||||
"name_required": "Le nom de catégorie est requis"
|
||||
"name_required": "Le nom de catégorie est requis",
|
||||
"location_update_after_refresh": "Les cartes de localisation seront mises à jour une fois que vous avez actualisé la page."
|
||||
},
|
||||
"dashboard": {
|
||||
"add_some": "Pourquoi ne pas commencer à planifier votre prochaine aventure ? \nVous pouvez ajouter une nouvelle aventure en cliquant sur le bouton ci-dessous.",
|
||||
|
@ -670,9 +683,9 @@
|
|||
"recomendations": {
|
||||
"recommendation": "Recommandation",
|
||||
"recommendations": "Recommandations",
|
||||
"adventure_recommendations": "Recommandations d'aventure",
|
||||
"food": "Nourriture",
|
||||
"tourism": "Tourisme"
|
||||
"tourism": "Tourisme",
|
||||
"location_recommendations": "Recommandations de localisation"
|
||||
},
|
||||
"lodging": {
|
||||
"apartment": "Appartement",
|
||||
|
@ -695,17 +708,19 @@
|
|||
"google_maps_integration_desc": "Connectez votre compte Google Maps pour obtenir des résultats de recherche et recommandations de recherche de haute qualité."
|
||||
},
|
||||
"calendar": {
|
||||
"all_categories": "Toutes les catégories",
|
||||
"all_day_event": "Événement toute la journée",
|
||||
"calendar_overview": "Aperçu du calendrier",
|
||||
"categories": "Catégories",
|
||||
"day": "Jour",
|
||||
"events_scheduled": "événements prévus",
|
||||
"filter_by_category": "Filtre par catégorie",
|
||||
"filtered_results": "Résultats filtrés",
|
||||
"month": "Mois",
|
||||
"today": "Aujourd'hui",
|
||||
"total_events": "Événements totaux",
|
||||
"week": "Semaine"
|
||||
},
|
||||
"locations": {
|
||||
"location": "Emplacement",
|
||||
"locations": "Lieux",
|
||||
"my_locations": "Mes emplacements"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -15,7 +15,6 @@
|
|||
"activities": {},
|
||||
"add_to_collection": "Aggiungi alla collezione",
|
||||
"adventure": "Avventura",
|
||||
"adventure_delete_confirm": "Sei sicuro di voler eliminare questa avventura? \nQuesta azione non può essere annullata.",
|
||||
"archive": "Archivio",
|
||||
"archived": "Archiviato",
|
||||
"archived_collection_message": "Collezione archiviata con successo!",
|
||||
|
@ -25,9 +24,6 @@
|
|||
"category_filter": "Filtro categoria",
|
||||
"clear": "Rimuovere",
|
||||
"collection": "Collezione",
|
||||
"collection_link_error": "Errore nel collegamento dell'avventura alla collezione",
|
||||
"collection_remove_error": "Errore durante la rimozione dell'avventura dalla collezione",
|
||||
"collection_remove_success": "Avventura rimossa con successo dalla collezione!",
|
||||
"count_txt": "risultati corrispondenti alla tua ricerca",
|
||||
"create_new": "Crea nuovo...",
|
||||
"date": "Data",
|
||||
|
@ -44,8 +40,6 @@
|
|||
"my_collections": "Le mie collezioni",
|
||||
"name": "Nome",
|
||||
"no_image_found": "Nessuna immagine trovata",
|
||||
"not_found": "Avventura non trovata",
|
||||
"not_found_desc": "L'avventura che stavi cercando non è stata trovata. \nProva un'avventura diversa o riprova più tardi.",
|
||||
"open_details": "Apri Dettagli",
|
||||
"open_filters": "Apri filtri",
|
||||
"order_by": "Ordina per",
|
||||
|
@ -62,11 +56,8 @@
|
|||
"updated": "Aggiornato",
|
||||
"visit": "Visita",
|
||||
"visits": "Visite",
|
||||
"adventure_delete_success": "Avventura eliminata con successo!",
|
||||
"collection_adventures": "Includi avventure dalle raccolte",
|
||||
"collection_link_success": "Avventura collegata alla collezione con successo!",
|
||||
"dates": "Date",
|
||||
"delete_adventure": "Elimina avventura",
|
||||
"duration": "Durata",
|
||||
"image_removed_error": "Errore durante la rimozione dell'immagine",
|
||||
"image_removed_success": "Immagine rimossa con successo!",
|
||||
|
@ -80,10 +71,6 @@
|
|||
"activity_types": "Tipi di attività",
|
||||
"add": "Aggiungere",
|
||||
"add_notes": "Aggiungi note",
|
||||
"adventure_create_error": "Impossibile creare l'avventura",
|
||||
"adventure_created": "Avventura creata",
|
||||
"adventure_update_error": "Impossibile aggiornare l'avventura",
|
||||
"adventure_updated": "Avventura aggiornata",
|
||||
"basic_information": "Informazioni di base",
|
||||
"category": "Categoria",
|
||||
"clear_map": "Libera mappa",
|
||||
|
@ -99,23 +86,19 @@
|
|||
"location": "Posizione",
|
||||
"location_information": "Informazioni sulla posizione",
|
||||
"my_images": "Le mie immagini",
|
||||
"new_adventure": "Nuova avventura",
|
||||
"no_description_found": "Nessuna descrizione trovata",
|
||||
"no_images": "Nessuna immagine",
|
||||
"no_location": "Inserisci una località",
|
||||
"no_results": "Nessun risultato trovato",
|
||||
"public_adventure": "Avventura pubblica",
|
||||
"remove": "Rimuovere",
|
||||
"save_next": "Salva",
|
||||
"search_for_location": "Cerca una posizione",
|
||||
"search_results": "Risultati della ricerca",
|
||||
"see_adventures": "Vedi Avventure",
|
||||
"share_adventure": "Condividi questa avventura!",
|
||||
"start_date": "Data di inizio",
|
||||
"upload_image": "Carica immagine",
|
||||
"url": "URL",
|
||||
"warning": "Avvertimento",
|
||||
"wiki_desc": "Estrae un estratto dall'articolo di Wikipedia corrispondente al nome dell'avventura.",
|
||||
"wiki_image_error": "Errore durante il recupero dell'immagine da Wikipedia",
|
||||
"wikipedia": "Wikipedia",
|
||||
"adventure_not_found": "Non ci sono avventure da visualizzare. \nAggiungine alcuni utilizzando il pulsante più in basso a destra o prova a cambiare i filtri!",
|
||||
|
@ -124,7 +107,6 @@
|
|||
"mark_visited": "Segna come visitato",
|
||||
"my_adventures": "Le mie avventure",
|
||||
"no_adventures_found": "Nessuna avventura trovata",
|
||||
"no_collections_found": "Nessuna collezione trovata a cui aggiungere questa avventura.",
|
||||
"no_linkable_adventures": "Non è stata trovata alcuna avventura che possa essere collegata a questa collezione.",
|
||||
"not_visited": "Non visitato",
|
||||
"regions_updated": "regioni aggiornate",
|
||||
|
@ -181,10 +163,7 @@
|
|||
"starting_airport": "Aeroporto di partenza",
|
||||
"to": "A",
|
||||
"transportation_delete_confirm": "Sei sicuro di voler eliminare questo trasporto? \nQuesta azione non può essere annullata.",
|
||||
"will_be_marked": "verrà contrassegnato come visitato una volta salvata l'avventura.",
|
||||
"cities_updated": "città aggiornate",
|
||||
"create_adventure": "Crea Avventura",
|
||||
"no_adventures_to_recommendations": "Nessuna avventura trovata. \nAggiungi almeno un'avventura per ricevere consigli.",
|
||||
"finding_recommendations": "Alla scoperta di tesori nascosti per la tua prossima avventura",
|
||||
"attachment": "Allegato",
|
||||
"attachment_delete_success": "Allegato eliminato con successo!",
|
||||
|
@ -246,7 +225,32 @@
|
|||
"name_location": "Nome, posizione",
|
||||
"collection_contents": "Contenuto di raccolta",
|
||||
"check_in": "Check -in",
|
||||
"check_out": "Guardare"
|
||||
"check_out": "Guardare",
|
||||
"collection_link_location_error": "Errore che collega la posizione alla raccolta",
|
||||
"collection_link_location_success": "Posizione collegata alla raccolta con successo!",
|
||||
"collection_locations": "Includi luoghi di raccolta",
|
||||
"collection_remove_location_error": "Errore di rimozione della posizione dalla raccolta",
|
||||
"collection_remove_location_success": "Posizione rimossa dalla raccolta con successo!",
|
||||
"create_location": "Crea posizione",
|
||||
"delete_location": "Elimina posizione",
|
||||
"edit_location": "Modifica posizione",
|
||||
"location_create_error": "Impossibile creare posizione",
|
||||
"location_created": "Posizione creata",
|
||||
"location_delete_confirm": "Sei sicuro di voler eliminare questa posizione? \nQuesta azione non può essere annullata.",
|
||||
"location_delete_success": "Posizione eliminata con successo!",
|
||||
"location_not_found": "Posizione non trovata",
|
||||
"location_not_found_desc": "Non è stato possibile trovare la posizione che stavi cercando. \nProva una posizione diversa o ricontrolla più tardi.",
|
||||
"location_update_error": "Impossibile aggiornare la posizione",
|
||||
"location_updated": "Posizione aggiornata",
|
||||
"new_location": "Nuova posizione",
|
||||
"no_collections_to_add_location": "Nessuna collezione trovata per aggiungere questa posizione a.",
|
||||
"no_locations_to_recommendations": "Nessuna posizione trovata. \nAggiungi almeno una posizione per ottenere consigli.",
|
||||
"public_location": "Posizione pubblica",
|
||||
"share_location": "Condividi questa posizione!",
|
||||
"visit_calendar": "Visita il calendario",
|
||||
"wiki_location_desc": "Estratto dall'articolo di Wikipedia che corrisponde al nome della posizione.",
|
||||
"will_be_marked_location": "sarà contrassegnato come visitato una volta salvata la posizione.",
|
||||
"no_locations_found": "Nessuna posizione trovata"
|
||||
},
|
||||
"home": {
|
||||
"desc_1": "Scopri, pianifica ed esplora con facilità",
|
||||
|
@ -317,10 +321,10 @@
|
|||
"public_tooltip": "Con un profilo pubblico, gli utenti possono condividere raccolte con te e visualizzare il tuo profilo nella pagina degli utenti.",
|
||||
"new_password": "Nuova password",
|
||||
"or_3rd_party": "Oppure accedi con un servizio di terze parti",
|
||||
"no_public_adventures": "Nessuna avventura pubblica trovata",
|
||||
"no_public_collections": "Nessuna collezione pubblica trovata",
|
||||
"user_adventures": "Avventure utente",
|
||||
"user_collections": "Collezioni utente"
|
||||
"user_collections": "Collezioni utente",
|
||||
"no_public_locations": "Nessuna posizione pubblica trovata",
|
||||
"user_locations": "Posizioni degli utenti"
|
||||
},
|
||||
"users": {
|
||||
"no_users_found": "Nessun utente trovato con profili pubblici."
|
||||
|
@ -568,7 +572,13 @@
|
|||
"search": {
|
||||
"adventurelog_results": "Risultati di AdventureLog",
|
||||
"online_results": "Risultati in linea",
|
||||
"public_adventures": "Avventure pubbliche"
|
||||
"public_adventures": "Avventure pubbliche",
|
||||
"cities": "Città",
|
||||
"countries": "Paesi",
|
||||
"found": "trovato",
|
||||
"result": "Risultato",
|
||||
"results": "Risultati",
|
||||
"try_searching_desc": "Prova a cercare avventure, collezioni, paesi, regioni, città o utenti."
|
||||
},
|
||||
"map": {
|
||||
"add_adventure": "Aggiungi nuova avventura",
|
||||
|
@ -579,13 +589,16 @@
|
|||
"show_visited_regions": "Mostra regioni visitate",
|
||||
"view_details": "Visualizza dettagli",
|
||||
"adventure_stats": "Statistiche di avventura",
|
||||
"adventures_shown": "Avventure mostrate",
|
||||
"completion": "Completamento",
|
||||
"display_options": "Opzioni di visualizzazione",
|
||||
"map_controls": "Controlli della mappa",
|
||||
"marker_placed_on_map": "Marcatore posizionato sulla mappa",
|
||||
"place_marker_desc": "Fai clic sulla mappa per posizionare un indicatore o aggiungi un'avventura senza posizione.",
|
||||
"regions": "Regioni"
|
||||
"regions": "Regioni",
|
||||
"add_location": "Aggiungi nuova posizione",
|
||||
"add_location_at_marker": "Aggiungi nuova posizione al marcatore",
|
||||
"location_map": "Mappa della posizione",
|
||||
"locations_shown": "posizioni mostrate",
|
||||
"place_marker_desc_location": "Fai clic sulla mappa per posizionare un indicatore."
|
||||
},
|
||||
"languages": {},
|
||||
"share": {
|
||||
|
@ -611,9 +624,9 @@
|
|||
"no_shared_adventures": "Questo utente non ha ancora condiviso avventure pubbliche.",
|
||||
"no_shared_collections": "Questo utente non ha ancora condiviso alcuna collezione pubblica.",
|
||||
"planned_trips": "Viaggi pianificati",
|
||||
"public_adventure_experiences": "Esperienze di avventura pubblica",
|
||||
"travel_statistics": "Statistiche di viaggio",
|
||||
"your_journey_at_a_glance": "Il tuo viaggio d'avventura a colpo d'occhio"
|
||||
"your_journey_at_a_glance": "Il tuo viaggio d'avventura a colpo d'occhio",
|
||||
"public_location_experiences": "Esperienze di posizione pubblica"
|
||||
},
|
||||
"categories": {
|
||||
"category_name": "Nome della categoria",
|
||||
|
@ -622,9 +635,9 @@
|
|||
"manage_categories": "Gestisci categorie",
|
||||
"no_categories_found": "Nessuna categoria trovata.",
|
||||
"select_category": "Seleziona Categoria",
|
||||
"update_after_refresh": "Le carte avventura verranno aggiornate una volta aggiornata la pagina.",
|
||||
"add_new_category": "Aggiungi nuova categoria",
|
||||
"name_required": "È richiesto il nome della categoria"
|
||||
"name_required": "È richiesto il nome della categoria",
|
||||
"location_update_after_refresh": "Le schede di posizione verranno aggiornate dopo aver aggiornato la pagina."
|
||||
},
|
||||
"dashboard": {
|
||||
"add_some": "Perché non iniziare a pianificare la tua prossima avventura? \nPuoi aggiungere una nuova avventura facendo clic sul pulsante in basso.",
|
||||
|
@ -670,9 +683,9 @@
|
|||
"recomendations": {
|
||||
"recommendation": "Raccomandazione",
|
||||
"recommendations": "Raccomandazioni",
|
||||
"adventure_recommendations": "Consigli di avventura",
|
||||
"food": "Cibo",
|
||||
"tourism": "Turismo"
|
||||
"tourism": "Turismo",
|
||||
"location_recommendations": "Raccomandazioni sulla posizione"
|
||||
},
|
||||
"lodging": {
|
||||
"apartment": "Appartamento",
|
||||
|
@ -695,17 +708,19 @@
|
|||
"google_maps_integration_desc": "Collega il tuo account Google Maps per ottenere risultati e consigli di ricerca sulla posizione di alta qualità."
|
||||
},
|
||||
"calendar": {
|
||||
"all_categories": "Tutte le categorie",
|
||||
"all_day_event": "Evento per tutto il giorno",
|
||||
"calendar_overview": "Panoramica del calendario",
|
||||
"categories": "Categorie",
|
||||
"day": "Giorno",
|
||||
"events_scheduled": "eventi programmati",
|
||||
"filter_by_category": "Filtro per categoria",
|
||||
"filtered_results": "Risultati filtrati",
|
||||
"month": "Mese",
|
||||
"today": "Oggi",
|
||||
"total_events": "Eventi totali",
|
||||
"week": "Settimana"
|
||||
},
|
||||
"locations": {
|
||||
"location": "Posizione",
|
||||
"locations": "Luoghi",
|
||||
"my_locations": "Le mie posizioni"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -22,13 +22,7 @@
|
|||
"add_to_collection": "컬렉션에 추가하세요",
|
||||
"adventure": "모험",
|
||||
"adventure_calendar": "모험 달력",
|
||||
"adventure_create_error": "모험을 만들지 못했습니다",
|
||||
"adventure_created": "모험 생성됨",
|
||||
"adventure_delete_confirm": "이 모험을 삭제 하시겠습니까? 이 행동은 취소 할 수 없습니다.",
|
||||
"adventure_delete_success": "모험이 성공적으로 삭제되었습니다!",
|
||||
"adventure_not_found": "표시할 모험이 없습니다. 오른쪽 하단의 플러스 버튼을 사용하여 추가하거나 필터를 변경하세요!",
|
||||
"adventure_update_error": "모험을 업데이트하지 못했습니다",
|
||||
"adventure_updated": "모험 업데이트됨",
|
||||
"all": "모두",
|
||||
"archive": "보관",
|
||||
"archived": "보관됨",
|
||||
|
@ -56,16 +50,11 @@
|
|||
"collection_adventures": "컬렉션 모험을 추가하세요",
|
||||
"collection_archived": "이 컬렉션은 보관되었습니다.",
|
||||
"collection_completed": "이 컬렉션을 완성했습니다!",
|
||||
"collection_link_error": "컬렉션에 모험 연결 중 오류",
|
||||
"collection_link_success": "컬렉션에 모험이 성공적으로 연결되었습니다!",
|
||||
"collection_remove_error": "컬렉션에서 모험을 제거 중 오류",
|
||||
"collection_remove_success": "컬렉션에서 모험이 제거되었습니다!",
|
||||
"collection_stats": "컬렉션 통계",
|
||||
"copied_to_clipboard": "클립 보드에 복사됨!",
|
||||
"copy_failed": "복사 실패",
|
||||
"copy_link": "링크 복사",
|
||||
"count_txt": "검색과 일치하는 결과",
|
||||
"create_adventure": "모험 생성",
|
||||
"create_new": "새로 만들기...",
|
||||
"date": "일자",
|
||||
"date_constrain": "컬렉션 일자로 제한",
|
||||
|
@ -74,7 +63,6 @@
|
|||
"day": "일",
|
||||
"days": "일",
|
||||
"delete": "삭제",
|
||||
"delete_adventure": "모험 삭제",
|
||||
"delete_checklist": "체크리스트 삭제",
|
||||
"delete_collection": "컬렉션 삭제",
|
||||
"delete_collection_success": "컬렉션이 성공적으로 삭제되었습니다!",
|
||||
|
@ -123,10 +111,7 @@
|
|||
"my_collections": "내 컬렉션",
|
||||
"my_images": "내 이미지",
|
||||
"name": "이름",
|
||||
"new_adventure": "새로운 모험",
|
||||
"no_adventures_found": "모험이 없습니다",
|
||||
"no_adventures_to_recommendations": "모험이 없습니다. 장소를 추천받으려면 최소 하나 이상의 모험을 등록해야 합니다.",
|
||||
"no_collections_found": "이 모험을 추가할 수 있는 컬렉션이 없습니다.",
|
||||
"no_description_found": "설명이 없습니다",
|
||||
"no_image_found": "이미지가 없습니다",
|
||||
"no_image_url": "해당 URL에 이미지가 없습니다.",
|
||||
|
@ -135,8 +120,6 @@
|
|||
"no_location": "위치를 입력하세요",
|
||||
"no_location_found": "위치가 없습니다",
|
||||
"no_results": "결과가 없습니다",
|
||||
"not_found": "모험이 없습니다",
|
||||
"not_found_desc": "당신이 찾고 있던 모험을 찾을 수 없었습니다. 다른 모험을 찾아보거나 나중에 다시 해 보세요.",
|
||||
"not_visited": "방문하지 않음",
|
||||
"note": "노트",
|
||||
"note_delete_confirm": "이 노트를 삭제 하시겠습니까? 이 행동은 취소 할 수 없습니다.",
|
||||
|
@ -151,7 +134,6 @@
|
|||
"preview": "미리보기",
|
||||
"private": "비공개",
|
||||
"public": "공개",
|
||||
"public_adventure": "공개 모험",
|
||||
"rating": "평가",
|
||||
"regions_updated": "지역이 업데이트되었습니다",
|
||||
"remove": "제거",
|
||||
|
@ -162,7 +144,6 @@
|
|||
"see_adventures": "모험 보기",
|
||||
"set_to_pin": "고정하기",
|
||||
"share": "공유",
|
||||
"share_adventure": "이 모험을 공유하세요!",
|
||||
"show": "보기",
|
||||
"sort": "정렬",
|
||||
"sources": "출처",
|
||||
|
@ -190,10 +171,8 @@
|
|||
"visited_region_check_desc": "이것을 선택하면 서버는 방문한 모든 모험을 확인하고 그 모험의 지역을 표시하여 세계 여행에서 방문 여부를 표시합니다.",
|
||||
"visits": "방문",
|
||||
"warning": "경고",
|
||||
"wiki_desc": "모험의 이름과 일치하는 글을 위키백과에서 가져옵니다.",
|
||||
"wiki_image_error": "위키백과 이미지 가져오기 오류",
|
||||
"wikipedia": "위키백과",
|
||||
"will_be_marked": "모험이 저장되면 방문했다고 표시합니다.",
|
||||
"checklists": "체크리스트",
|
||||
"cities_updated": "도시 업데이트됨",
|
||||
"clear": "초기화",
|
||||
|
@ -246,7 +225,32 @@
|
|||
"name_location": "이름, 위치",
|
||||
"collection_contents": "수집 내용",
|
||||
"check_in": "체크인",
|
||||
"check_out": "체크 아웃"
|
||||
"check_out": "체크 아웃",
|
||||
"collection_link_location_error": "오류 연결 위치 컬렉션",
|
||||
"collection_link_location_success": "컬렉션에 링크 된 위치!",
|
||||
"collection_locations": "수집 위치를 포함합니다",
|
||||
"collection_remove_location_error": "수집에서 위치를 제거하는 오류",
|
||||
"collection_remove_location_success": "컬렉션에서 제거 된 위치는 성공적으로!",
|
||||
"create_location": "위치를 만듭니다",
|
||||
"delete_location": "위치 삭제",
|
||||
"edit_location": "위치 편집",
|
||||
"location_create_error": "위치를 만들지 못했습니다",
|
||||
"location_created": "생성 된 위치",
|
||||
"location_delete_confirm": "이 위치를 삭제 하시겠습니까? \n이 조치는 취소 할 수 없습니다.",
|
||||
"location_delete_success": "위치가 성공적으로 삭제되었습니다!",
|
||||
"location_not_found": "위치를 찾을 수 없습니다",
|
||||
"location_not_found_desc": "당신이 찾고 있던 위치는 찾을 수 없습니다. \n다른 위치를 시도하거나 나중에 다시 확인하십시오.",
|
||||
"location_update_error": "위치를 업데이트하지 못했습니다",
|
||||
"location_updated": "위치 업데이트",
|
||||
"new_location": "새로운 위치",
|
||||
"no_collections_to_add_location": "이 위치를 추가하는 컬렉션은 없습니다.",
|
||||
"no_locations_to_recommendations": "발견 된 위치는 없습니다. \n권장 사항을 얻으려면 하나 이상의 위치를 추가하십시오.",
|
||||
"public_location": "공개 위치",
|
||||
"share_location": "이 위치를 공유하십시오!",
|
||||
"visit_calendar": "캘린더를 방문하십시오",
|
||||
"wiki_location_desc": "위치 이름과 일치하는 Wikipedia 기사에서 발췌 한 내용을 가져옵니다.",
|
||||
"will_be_marked_location": "위치가 저장되면 방문한대로 표시됩니다.",
|
||||
"no_locations_found": "발견 된 위치는 없습니다"
|
||||
},
|
||||
"auth": {
|
||||
"confirm_password": "비밀번호 확인",
|
||||
|
@ -265,10 +269,10 @@
|
|||
"registration_disabled": "현재 등록할 수 없습니다.",
|
||||
"signup": "가입",
|
||||
"username": "사용자 이름",
|
||||
"no_public_adventures": "공개 모험이 발견되지 않았습니다",
|
||||
"no_public_collections": "공개 컬렉션이 발견되지 않았습니다",
|
||||
"user_adventures": "사용자 모험",
|
||||
"user_collections": "사용자 수집"
|
||||
"user_collections": "사용자 수집",
|
||||
"no_public_locations": "공공 장소가 발견되지 않았습니다",
|
||||
"user_locations": "사용자 위치"
|
||||
},
|
||||
"categories": {
|
||||
"category_name": "카테고리 이름",
|
||||
|
@ -277,9 +281,9 @@
|
|||
"manage_categories": "카테고리 관리",
|
||||
"no_categories_found": "카테고리가 없습니다.",
|
||||
"select_category": "카테고리 선택",
|
||||
"update_after_refresh": "페이지를 새로고침해야 모험 카드가 업데이트됩니다.",
|
||||
"add_new_category": "새 카테고리를 추가하십시오",
|
||||
"name_required": "카테고리 이름이 필요합니다"
|
||||
"name_required": "카테고리 이름이 필요합니다",
|
||||
"location_update_after_refresh": "페이지를 새로 고치면 위치 카드가 업데이트됩니다."
|
||||
},
|
||||
"checklist": {
|
||||
"checklist_delete_error": "체크리스트 삭제 오류",
|
||||
|
@ -381,13 +385,16 @@
|
|||
"show_visited_regions": "방문한 지역 보기",
|
||||
"view_details": "상세 보기",
|
||||
"adventure_stats": "모험 통계",
|
||||
"adventures_shown": "모험 쇼",
|
||||
"completion": "완성",
|
||||
"display_options": "디스플레이 옵션",
|
||||
"map_controls": "맵 컨트롤",
|
||||
"marker_placed_on_map": "마커가지도에 배치되었습니다",
|
||||
"place_marker_desc": "지도를 클릭하여 마커를 배치하거나 위치없이 모험을 추가하십시오.",
|
||||
"regions": "지역"
|
||||
"regions": "지역",
|
||||
"add_location": "새로운 위치를 추가하십시오",
|
||||
"add_location_at_marker": "마커에 새 위치를 추가하십시오",
|
||||
"location_map": "위치지도",
|
||||
"locations_shown": "표시된 위치",
|
||||
"place_marker_desc_location": "지도를 클릭하여 마커를 배치하십시오."
|
||||
},
|
||||
"navbar": {
|
||||
"about": "Adventurelog 소개",
|
||||
|
@ -448,21 +455,27 @@
|
|||
"no_shared_adventures": "이 사용자는 아직 공개 모험을 공유하지 않았습니다.",
|
||||
"no_shared_collections": "이 사용자는 아직 공개 컬렉션을 공유하지 않았습니다.",
|
||||
"planned_trips": "계획된 여행",
|
||||
"public_adventure_experiences": "공개 모험 경험",
|
||||
"your_journey_at_a_glance": "당신의 모험 여행",
|
||||
"travel_statistics": "여행 통계"
|
||||
"travel_statistics": "여행 통계",
|
||||
"public_location_experiences": "공개 위치 경험"
|
||||
},
|
||||
"recomendations": {
|
||||
"recommendation": "추천",
|
||||
"recommendations": "권장 사항",
|
||||
"adventure_recommendations": "모험 추천",
|
||||
"food": "음식",
|
||||
"tourism": "관광 여행"
|
||||
"tourism": "관광 여행",
|
||||
"location_recommendations": "위치 권장 사항"
|
||||
},
|
||||
"search": {
|
||||
"adventurelog_results": "Adventurelog 결과",
|
||||
"online_results": "온라인 결과",
|
||||
"public_adventures": "공개 모험"
|
||||
"public_adventures": "공개 모험",
|
||||
"cities": "도시",
|
||||
"countries": "국가",
|
||||
"found": "설립하다",
|
||||
"result": "결과",
|
||||
"results": "결과",
|
||||
"try_searching_desc": "모험, 컬렉션, 국가, 지역, 도시 또는 사용자를 검색하십시오."
|
||||
},
|
||||
"settings": {
|
||||
"about_this_background": "이 배경에 대해",
|
||||
|
@ -694,17 +707,19 @@
|
|||
"google_maps_integration_desc": "Google지도 계정을 연결하여 고품질 위치 검색 결과 및 권장 사항을 얻으십시오."
|
||||
},
|
||||
"calendar": {
|
||||
"all_categories": "모든 카테고리",
|
||||
"all_day_event": "하루 종일 이벤트",
|
||||
"calendar_overview": "캘린더 개요",
|
||||
"categories": "카테고리",
|
||||
"day": "낮",
|
||||
"events_scheduled": "예약 된 이벤트",
|
||||
"filter_by_category": "카테고리 별 필터",
|
||||
"filtered_results": "필터링 된 결과",
|
||||
"month": "월",
|
||||
"today": "오늘",
|
||||
"total_events": "총 이벤트",
|
||||
"week": "주"
|
||||
},
|
||||
"locations": {
|
||||
"location": "위치",
|
||||
"locations": "위치",
|
||||
"my_locations": "내 위치"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -15,7 +15,6 @@
|
|||
"activities": {},
|
||||
"add_to_collection": "Toevoegen aan collectie",
|
||||
"adventure": "Avontuur",
|
||||
"adventure_delete_confirm": "Weet je zeker dat je dit avontuur wilt verwijderen? \nDeze actie kan niet ongedaan worden gemaakt.",
|
||||
"archive": "Archiveer",
|
||||
"archived": "Gearchiveerd",
|
||||
"archived_collection_message": "Collectie succesvol gearchiveerd!",
|
||||
|
@ -26,10 +25,6 @@
|
|||
"clear": "Leegmaken",
|
||||
"collection": "Collectie",
|
||||
"collection_adventures": "Inclusief collectie-avonturen",
|
||||
"collection_link_error": "Fout bij het koppelen van dit avontuur aan de collectie",
|
||||
"collection_link_success": "Avontuur succesvol gekoppeld aan collectie!",
|
||||
"collection_remove_error": "Fout bij verwijderen van dit avontuur uit de collectie",
|
||||
"collection_remove_success": "Avontuur is succesvol uit de collectie verwijderd!",
|
||||
"count_txt": "resultaten die overeenkomen met uw zoekopdracht",
|
||||
"create_new": "Maak nieuw...",
|
||||
"date": "Datum",
|
||||
|
@ -46,8 +41,6 @@
|
|||
"my_collections": "Mijn collecties",
|
||||
"name": "Naam",
|
||||
"no_image_found": "Geen afbeelding gevonden",
|
||||
"not_found": "Avontuur niet gevonden",
|
||||
"not_found_desc": "Het avontuur waar je naar op zoek was, kon niet worden gevonden. \nProbeer een ander avontuur of kom later nog eens terug.",
|
||||
"open_details": "Details openen",
|
||||
"open_filters": "Filters openen",
|
||||
"order_by": "Sorteer op",
|
||||
|
@ -64,9 +57,7 @@
|
|||
"updated": "Gewijzigd",
|
||||
"visit": "Bezoek",
|
||||
"visits": "Bezoeken",
|
||||
"adventure_delete_success": "Avontuur succesvol verwijderd!",
|
||||
"dates": "Datums",
|
||||
"delete_adventure": "Avontuur verwijderen",
|
||||
"duration": "Duur",
|
||||
"image_removed_error": "Fout bij het verwijderen van de afbeelding",
|
||||
"image_removed_success": "Afbeelding succesvol verwijderd!",
|
||||
|
@ -81,10 +72,6 @@
|
|||
"activity_types": "Activiteitstypen",
|
||||
"add": "Toevoegen",
|
||||
"add_notes": "Voeg opmerkingen toe",
|
||||
"adventure_create_error": "Kan geen avontuur aanmaken",
|
||||
"adventure_created": "Avontuur aangemaakt",
|
||||
"adventure_update_error": "Kan avontuur niet wijzigen",
|
||||
"adventure_updated": "Avontuur gewijzigd",
|
||||
"basic_information": "Basisinformatie",
|
||||
"category": "Categorie",
|
||||
"clear_map": "Kaart leegmaken",
|
||||
|
@ -100,23 +87,19 @@
|
|||
"location": "Locatie",
|
||||
"location_information": "Informatie over de locatie",
|
||||
"my_images": "Mijn afbeeldingen",
|
||||
"new_adventure": "Nieuw avontuur",
|
||||
"no_description_found": "Geen beschrijving gevonden",
|
||||
"no_images": "Geen afbeeldingen",
|
||||
"no_location": "Voer een locatie in",
|
||||
"no_results": "Geen resultaten gevonden",
|
||||
"public_adventure": "Openbaar avontuur",
|
||||
"remove": "Verwijderen",
|
||||
"save_next": "Opslaan & Volgende",
|
||||
"search_for_location": "Zoek een locatie",
|
||||
"search_results": "Zoekresultaten",
|
||||
"see_adventures": "Zie Avonturen",
|
||||
"share_adventure": "Deel dit avontuur!",
|
||||
"start_date": "Startdatum",
|
||||
"upload_image": "Afbeelding uploaden",
|
||||
"url": "URL",
|
||||
"warning": "Waarschuwing",
|
||||
"wiki_desc": "Haalt een fragment uit een Wikipedia-artikel dat overeenkomt met de naam van het avontuur.",
|
||||
"wikipedia": "Wikipedia",
|
||||
"adventure_not_found": "Er zijn geen avonturen om weer te geven. \nVoeg er een paar toe via de plusknop rechtsonder of probeer de filters te wijzigen!",
|
||||
"all": "Alle",
|
||||
|
@ -124,7 +107,6 @@
|
|||
"mark_visited": "Markeer als bezocht",
|
||||
"my_adventures": "Mijn avonturen",
|
||||
"no_adventures_found": "Geen avonturen gevonden",
|
||||
"no_collections_found": "Er zijn geen collecties gevonden waar dit avontuur aan kan worden toegevoegd.",
|
||||
"no_linkable_adventures": "Er zijn geen avonturen gevonden die aan deze collectie kunnen worden gekoppeld.",
|
||||
"not_visited": "Niet bezocht",
|
||||
"regions_updated": "regio's bijgewerkt",
|
||||
|
@ -181,10 +163,7 @@
|
|||
"to": "Naar",
|
||||
"transportation_delete_confirm": "Weet u zeker dat u dit transport wilt verwijderen? \nDeze actie kan niet ongedaan worden gemaakt.",
|
||||
"ending_airport": "Luchthaven van aankomst",
|
||||
"will_be_marked": "wordt gemarkeerd als bezocht zodra het avontuur is opgeslagen.",
|
||||
"cities_updated": "steden bijgewerkt",
|
||||
"create_adventure": "Creëer avontuur",
|
||||
"no_adventures_to_recommendations": "Geen avonturen gevonden. \nVoeg ten minste één avontuur toe om aanbevelingen te krijgen.",
|
||||
"finding_recommendations": "Ontdek verborgen juweeltjes voor je volgende avontuur",
|
||||
"attachment": "Bijlage",
|
||||
"attachment_delete_success": "Bijlage succesvol verwijderd!",
|
||||
|
@ -246,7 +225,32 @@
|
|||
"name_location": "naam, locatie",
|
||||
"collection_contents": "Collectie-inhoud",
|
||||
"check_in": "Inchecken",
|
||||
"check_out": "Uitchecken"
|
||||
"check_out": "Uitchecken",
|
||||
"collection_link_location_error": "Foutkoppelingslocatie naar verzameling",
|
||||
"collection_link_location_success": "Locatie gekoppeld aan het succesvol verzamelen!",
|
||||
"collection_locations": "Neem verzamellocaties op",
|
||||
"collection_remove_location_error": "Fout het verwijderen van locatie uit het verzamelen",
|
||||
"collection_remove_location_success": "Locatie verwijderd uit de collectie succesvol!",
|
||||
"create_location": "Locatie maken",
|
||||
"delete_location": "Verwijder locatie",
|
||||
"edit_location": "Locatie bewerken",
|
||||
"location_create_error": "Kan locatie niet maken",
|
||||
"location_created": "Locatie gemaakt",
|
||||
"location_delete_confirm": "Weet u zeker dat u deze locatie wilt verwijderen? \nDeze actie kan niet ongedaan worden gemaakt.",
|
||||
"location_delete_success": "Locatie verwijderd met succes!",
|
||||
"location_not_found": "Locatie niet gevonden",
|
||||
"location_not_found_desc": "De locatie waarnaar u op zoek was, kon niet worden gevonden. \nProbeer een andere locatie of kom later terug.",
|
||||
"location_update_error": "De locatie niet bijwerken",
|
||||
"location_updated": "Locatie bijgewerkt",
|
||||
"new_location": "Nieuwe locatie",
|
||||
"no_collections_to_add_location": "Geen collecties gevonden om deze locatie toe te voegen aan.",
|
||||
"no_locations_to_recommendations": "Geen locaties gevonden. \nVoeg minstens één locatie toe om aanbevelingen te krijgen.",
|
||||
"public_location": "Openbare locatie",
|
||||
"share_location": "Deel deze locatie!",
|
||||
"visit_calendar": "Bezoek de agenda",
|
||||
"wiki_location_desc": "Haalt fragment uit het Wikipedia -artikel dat overeenkomt met de naam van de locatie.",
|
||||
"will_be_marked_location": "wordt gemarkeerd als bezocht zodra de locatie is opgeslagen.",
|
||||
"no_locations_found": "Geen locaties gevonden"
|
||||
},
|
||||
"home": {
|
||||
"desc_1": "Ontdek, plan en verken met gemak",
|
||||
|
@ -317,10 +321,10 @@
|
|||
"public_tooltip": "Met een openbaar profiel kunnen gebruikers collecties met u delen en uw profiel bekijken op de gebruikerspagina.",
|
||||
"new_password": "Nieuw wachtwoord",
|
||||
"or_3rd_party": "Of log in met een service van derden",
|
||||
"no_public_adventures": "Geen openbare avonturen gevonden",
|
||||
"no_public_collections": "Geen openbare collecties gevonden",
|
||||
"user_adventures": "Gebruikersavonturen",
|
||||
"user_collections": "Gebruikerscollecties"
|
||||
"user_collections": "Gebruikerscollecties",
|
||||
"no_public_locations": "Geen openbare locaties gevonden",
|
||||
"user_locations": "Gebruikerslocaties"
|
||||
},
|
||||
"users": {
|
||||
"no_users_found": "Er zijn geen gebruikers gevonden met openbare profielen."
|
||||
|
@ -568,7 +572,13 @@
|
|||
"search": {
|
||||
"adventurelog_results": "AdventureLog resultaten",
|
||||
"online_results": "Online resultaten",
|
||||
"public_adventures": "Openbare avonturen"
|
||||
"public_adventures": "Openbare avonturen",
|
||||
"cities": "Steden",
|
||||
"countries": "Landen",
|
||||
"found": "gevonden",
|
||||
"result": "Resultaat",
|
||||
"results": "Resultaat",
|
||||
"try_searching_desc": "Probeer op zoek naar avonturen, collecties, landen, regio's, steden of gebruikers."
|
||||
},
|
||||
"map": {
|
||||
"add_adventure": "Voeg nieuw avontuur toe",
|
||||
|
@ -579,13 +589,16 @@
|
|||
"show_visited_regions": "Toon bezochte regio's",
|
||||
"view_details": "Details bekijken",
|
||||
"adventure_stats": "Avontuurstatistieken",
|
||||
"adventures_shown": "Avonturen getoond",
|
||||
"completion": "Voltooiing",
|
||||
"display_options": "Displayopties",
|
||||
"map_controls": "Kaartbesturing",
|
||||
"marker_placed_on_map": "Marker geplaatst op kaart",
|
||||
"place_marker_desc": "Klik op de kaart om een marker te plaatsen of voeg een avontuur toe zonder locatie.",
|
||||
"regions": "Gebieden"
|
||||
"regions": "Gebieden",
|
||||
"add_location": "Voeg een nieuwe locatie toe",
|
||||
"add_location_at_marker": "Voeg een nieuwe locatie toe bij Marker",
|
||||
"location_map": "Locatiekaart",
|
||||
"locations_shown": "Getoonde locaties",
|
||||
"place_marker_desc_location": "Klik op de kaart om een marker te plaatsen."
|
||||
},
|
||||
"languages": {},
|
||||
"share": {
|
||||
|
@ -611,9 +624,9 @@
|
|||
"no_shared_adventures": "Deze gebruiker heeft nog geen openbare avonturen gedeeld.",
|
||||
"no_shared_collections": "Deze gebruiker heeft nog geen openbare collecties gedeeld.",
|
||||
"planned_trips": "Geplande reizen",
|
||||
"public_adventure_experiences": "Publieke avontuurlijke ervaringen",
|
||||
"travel_statistics": "Reisstatistieken",
|
||||
"your_journey_at_a_glance": "Je avontuurlijke reis in één oogopslag"
|
||||
"your_journey_at_a_glance": "Je avontuurlijke reis in één oogopslag",
|
||||
"public_location_experiences": "Openbare locatie -ervaringen"
|
||||
},
|
||||
"categories": {
|
||||
"category_name": "Categorienaam",
|
||||
|
@ -622,9 +635,9 @@
|
|||
"manage_categories": "Beheer categorieën",
|
||||
"no_categories_found": "Geen categorieën gevonden.",
|
||||
"select_category": "Selecteer een categorie",
|
||||
"update_after_refresh": "De avonturenkaarten worden bijgewerkt zodra u de pagina vernieuwt.",
|
||||
"add_new_category": "Voeg een nieuwe categorie toe",
|
||||
"name_required": "Categorienaam is vereist"
|
||||
"name_required": "Categorienaam is vereist",
|
||||
"location_update_after_refresh": "De locatiekaarten worden bijgewerkt zodra u de pagina vernieuwt."
|
||||
},
|
||||
"dashboard": {
|
||||
"add_some": "Waarom begint u niet met het plannen van uw volgende avontuur? \nJe kunt een nieuw avontuur toevoegen door op de onderstaande knop te klikken.",
|
||||
|
@ -670,9 +683,9 @@
|
|||
"recomendations": {
|
||||
"recommendation": "Aanbeveling",
|
||||
"recommendations": "Aanbevelingen",
|
||||
"adventure_recommendations": "Avontuuraanbevelingen",
|
||||
"food": "Eten",
|
||||
"tourism": "Toerisme"
|
||||
"food": "Voedsel",
|
||||
"tourism": "Toerisme",
|
||||
"location_recommendations": "Locatieaanbevelingen"
|
||||
},
|
||||
"lodging": {
|
||||
"apartment": "Appartement",
|
||||
|
@ -695,17 +708,19 @@
|
|||
"google_maps_integration_desc": "Sluit uw Google Maps-account aan om zoekresultaten en aanbevelingen van hoge kwaliteit te krijgen."
|
||||
},
|
||||
"calendar": {
|
||||
"all_categories": "Alle categorieën",
|
||||
"all_day_event": "Evenement dat de hele dag duurt",
|
||||
"all_day_event": "De hele dag evenement",
|
||||
"calendar_overview": "Kalenderoverzicht",
|
||||
"categories": "Categorieën",
|
||||
"day": "Dag",
|
||||
"events_scheduled": "geplande evenementen",
|
||||
"filter_by_category": "Filter per categorie",
|
||||
"filtered_results": "Gefilterde resultaten",
|
||||
"month": "Maand",
|
||||
"today": "Vandaag",
|
||||
"total_events": "Totale gebeurtenissen",
|
||||
"week": "Week"
|
||||
},
|
||||
"locations": {
|
||||
"location": "Locatie",
|
||||
"locations": "Locaties",
|
||||
"my_locations": "Mijn locaties"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -64,12 +64,7 @@
|
|||
"start_your_journey": "Start reisen"
|
||||
},
|
||||
"adventures": {
|
||||
"collection_remove_success": "Eventyret ble fjernet fra samlingen!",
|
||||
"collection_remove_error": "Feil ved fjerning av eventyr fra samling",
|
||||
"collection_link_success": "Eventyret ble lagt til samlingen!",
|
||||
"no_image_found": "Ingen bilde funnet",
|
||||
"collection_link_error": "Feil ved lenking av eventyr til samling",
|
||||
"adventure_delete_confirm": "Er du sikker på at du vil slette dette eventyret? Denne handlingen kan ikke angres.",
|
||||
"checklist_delete_confirm": "Er du sikker på at du vil slette denne sjekklisten? Denne handlingen kan ikke angres.",
|
||||
"note_delete_confirm": "Er du sikker på at du vil slette dette notatet? Denne handlingen kan ikke angres.",
|
||||
"transportation_delete_confirm": "Er du sikker på at du vil slette dette transportmiddelet? Denne handlingen kan ikke angres.",
|
||||
|
@ -83,8 +78,6 @@
|
|||
"remove_from_collection": "Fjern fra samling",
|
||||
"add_to_collection": "Legg til i samling",
|
||||
"delete": "Slett",
|
||||
"not_found": "Fant ikke eventyret",
|
||||
"not_found_desc": "Eventyret du leter etter, ble ikke funnet. Vennligst prøv et annet eventyr eller kom tilbake senere.",
|
||||
"homepage": "Hjemmeside",
|
||||
"collection": "Samling",
|
||||
"longitude": "Lengdegrad",
|
||||
|
@ -109,7 +102,6 @@
|
|||
"rating": "Vurdering",
|
||||
"my_images": "Mine bilder",
|
||||
"no_images": "Ingen bilder",
|
||||
"share_adventure": "Del dette eventyret!",
|
||||
"copy_link": "Kopier lenke",
|
||||
"image": "Bilde",
|
||||
"upload_image": "Last opp bilde",
|
||||
|
@ -131,12 +123,10 @@
|
|||
"clear_map": "Tøm kart",
|
||||
"search_results": "Søkeresultater",
|
||||
"no_results": "Ingen resultater funnet",
|
||||
"wiki_desc": "Henter utdrag fra Wikipedia-artikkelen som samsvarer med navnet på eventyret.",
|
||||
"attachments": "Vedlegg",
|
||||
"attachment": "Vedlegg",
|
||||
"images": "Bilder",
|
||||
"generate_desc": "Generer beskrivelse",
|
||||
"public_adventure": "Offentlig eventyr",
|
||||
"location_information": "Plasseringsinformasjon",
|
||||
"link": "Lenke",
|
||||
"links": "Lenker",
|
||||
|
@ -157,15 +147,12 @@
|
|||
"edit_collection": "Rediger samling",
|
||||
"unarchive": "Fjern fra arkiv",
|
||||
"archive": "Arkiver",
|
||||
"no_collections_found": "Ingen samlinger funnet for å legge dette eventyret til.",
|
||||
"not_visited": "Ikke besøkt",
|
||||
"archived_collection_message": "Samlingen ble arkivert!",
|
||||
"unarchived_collection_message": "Samlingen ble fjernet fra arkivet!",
|
||||
"delete_collection_success": "Samlingen ble slettet!",
|
||||
"cancel": "Avbryt",
|
||||
"delete_collection": "Slett samling",
|
||||
"delete_adventure": "Slett eventyr",
|
||||
"adventure_delete_success": "Eventyret ble slettet!",
|
||||
"visited": "Besøkt",
|
||||
"planned": "Planlagt",
|
||||
"duration": "Varighet",
|
||||
|
@ -183,17 +170,10 @@
|
|||
"image_fetch_failed": "Kunne ikke hente bilde",
|
||||
"no_location": "Vennligst angi et sted",
|
||||
"no_description_found": "Fant ingen beskrivelse",
|
||||
"adventure_created": "Eventyr opprettet",
|
||||
"adventure_create_error": "Kunne ikke opprette eventyr",
|
||||
"lodging": "Overnatting",
|
||||
"create_adventure": "Opprett eventyr",
|
||||
"adventure_updated": "Eventyr oppdatert",
|
||||
"adventure_update_error": "Kunne ikke oppdatere eventyr",
|
||||
"set_to_pin": "Fest",
|
||||
"category_fetch_error": "Feil ved henting av kategorier",
|
||||
"new_adventure": "Nytt eventyr",
|
||||
"basic_information": "Grunnleggende informasjon",
|
||||
"no_adventures_to_recommendations": "Ingen eventyr funnet. Legg til minst ett eventyr for å få anbefalinger.",
|
||||
"display_name": "Visningsnavn",
|
||||
"adventure_not_found": "Det finnes ingen eventyr å vise. Legg til noen ved å trykke på plusstegnet nederst til høyre, eller prøv å endre filtre!",
|
||||
"no_adventures_found": "Ingen eventyr funnet",
|
||||
|
@ -233,7 +213,6 @@
|
|||
"no_location_found": "Ingen sted funnet",
|
||||
"from": "Fra",
|
||||
"to": "Til",
|
||||
"will_be_marked": "vil bli markert som besøkt når eventyret er lagret.",
|
||||
"start": "Start",
|
||||
"end": "Slutt",
|
||||
"emoji_picker": "Emoji-velger",
|
||||
|
@ -298,7 +277,32 @@
|
|||
"name_location": "Navn, plassering",
|
||||
"collection_contents": "Samlingsinnhold",
|
||||
"check_in": "Sjekk inn",
|
||||
"check_out": "Sjekk ut"
|
||||
"check_out": "Sjekk ut",
|
||||
"collection_link_location_error": "Feil koblingssted til samling",
|
||||
"collection_link_location_success": "Plassering knyttet til samlingen vellykket!",
|
||||
"collection_locations": "Inkluderer samlingssteder",
|
||||
"collection_remove_location_error": "Feil å fjerne plasseringen fra samlingen",
|
||||
"collection_remove_location_success": "Plassering fjernet fra samlingen med hell!",
|
||||
"create_location": "Skape sted",
|
||||
"delete_location": "Slett plassering",
|
||||
"edit_location": "Rediger plassering",
|
||||
"location_create_error": "Kunne ikke skape sted",
|
||||
"location_created": "Plassering opprettet",
|
||||
"location_delete_confirm": "Er du sikker på at du vil slette dette stedet? \nDenne handlingen kan ikke angres.",
|
||||
"location_delete_success": "Plassering slettet vellykket!",
|
||||
"location_not_found": "Plasseringen ikke funnet",
|
||||
"location_not_found_desc": "Plasseringen du lette etter ble ikke funnet. \nPrøv et annet sted eller sjekk tilbake senere.",
|
||||
"location_update_error": "Kunne ikke oppdatere plasseringen",
|
||||
"location_updated": "Plassering oppdatert",
|
||||
"new_location": "Ny beliggenhet",
|
||||
"no_collections_to_add_location": "Ingen samlinger funnet å legge dette stedet til.",
|
||||
"no_locations_to_recommendations": "Ingen steder funnet. \nLegg til minst ett sted for å få anbefalinger.",
|
||||
"public_location": "Offentlig beliggenhet",
|
||||
"share_location": "Del dette stedet!",
|
||||
"visit_calendar": "Besøk kalenderen",
|
||||
"wiki_location_desc": "Trekker utdrag fra Wikipedia -artikkelen som samsvarer med navnet på stedet.",
|
||||
"will_be_marked_location": "vil bli merket som besøkt når stedet er lagret.",
|
||||
"no_locations_found": "Ingen steder funnet"
|
||||
},
|
||||
"worldtravel": {
|
||||
"country_list": "Liste over land",
|
||||
|
@ -373,10 +377,10 @@
|
|||
"public_tooltip": "Med en offentlig profil kan brukere dele samlinger med deg og se profilen din på brukersiden.",
|
||||
"new_password": "Nytt passord (6+ tegn)",
|
||||
"or_3rd_party": "Eller logg inn med en tredjepartstjeneste",
|
||||
"no_public_adventures": "Ingen offentlige eventyr funnet",
|
||||
"no_public_collections": "Ingen offentlige samlinger funnet",
|
||||
"user_adventures": "Brukerens eventyr",
|
||||
"user_collections": "Brukerens samlinger"
|
||||
"user_collections": "Brukerens samlinger",
|
||||
"no_public_locations": "Ingen offentlige steder funnet",
|
||||
"user_locations": "Brukerplasser"
|
||||
},
|
||||
"users": {
|
||||
"no_users_found": "Ingen brukere med offentlig profil funnet."
|
||||
|
@ -585,7 +589,13 @@
|
|||
"search": {
|
||||
"adventurelog_results": "AdventureLog-resultater",
|
||||
"public_adventures": "Offentlige eventyr",
|
||||
"online_results": "Nettresultater"
|
||||
"online_results": "Nettresultater",
|
||||
"cities": "Byer",
|
||||
"countries": "Land",
|
||||
"found": "funnet",
|
||||
"result": "Resultat",
|
||||
"results": "Resultater",
|
||||
"try_searching_desc": "Prøv å søke etter eventyr, samlinger, land, regioner, byer eller brukere."
|
||||
},
|
||||
"map": {
|
||||
"view_details": "Vis detaljer",
|
||||
|
@ -596,13 +606,16 @@
|
|||
"clear_marker": "Fjern markør",
|
||||
"add_adventure": "Legg til nytt eventyr",
|
||||
"adventure_stats": "Eventyrstatistikk",
|
||||
"adventures_shown": "Eventyr vist",
|
||||
"completion": "Fullføring",
|
||||
"display_options": "Vis alternativer",
|
||||
"map_controls": "Kartkontroller",
|
||||
"marker_placed_on_map": "Markør plassert på kart",
|
||||
"place_marker_desc": "Klikk på kartet for å plassere en markør, eller legg til et eventyr uten beliggenhet.",
|
||||
"regions": "Regioner"
|
||||
"regions": "Regioner",
|
||||
"add_location": "Legg til nytt sted",
|
||||
"add_location_at_marker": "Legg til nytt sted på markør",
|
||||
"location_map": "Stedskart",
|
||||
"locations_shown": "steder vist",
|
||||
"place_marker_desc_location": "Klikk på kartet for å plassere en markør."
|
||||
},
|
||||
"share": {
|
||||
"shared": "Delt",
|
||||
|
@ -628,20 +641,20 @@
|
|||
"no_shared_adventures": "Denne brukeren har ikke delt noen offentlige eventyr ennå.",
|
||||
"no_shared_collections": "Denne brukeren har ikke delt noen offentlige samlinger ennå.",
|
||||
"planned_trips": "Planlagte turer",
|
||||
"public_adventure_experiences": "Offentlige eventyropplevelser",
|
||||
"travel_statistics": "Reisestatistikk",
|
||||
"your_journey_at_a_glance": "Din eventyrreise på et øyeblikk"
|
||||
"your_journey_at_a_glance": "Din eventyrreise på et øyeblikk",
|
||||
"public_location_experiences": "Offentlige beliggenhetsopplevelser"
|
||||
},
|
||||
"categories": {
|
||||
"manage_categories": "Administrer kategorier",
|
||||
"no_categories_found": "Ingen kategorier funnet.",
|
||||
"edit_category": "Rediger kategori",
|
||||
"icon": "Ikon",
|
||||
"update_after_refresh": "Eventyrkortene vil oppdateres når du oppdaterer siden.",
|
||||
"select_category": "Velg kategori",
|
||||
"category_name": "Kategorinavn",
|
||||
"add_new_category": "Legg til ny kategori",
|
||||
"name_required": "Kategorinavnet er påkrevd"
|
||||
"name_required": "Kategorinavnet er påkrevd",
|
||||
"location_update_after_refresh": "Stedskortene vil bli oppdatert når du oppdaterer siden."
|
||||
},
|
||||
"dashboard": {
|
||||
"welcome_back": "Velkommen tilbake",
|
||||
|
@ -687,25 +700,27 @@
|
|||
"recomendations": {
|
||||
"recommendation": "Anbefaling",
|
||||
"recommendations": "Anbefalinger",
|
||||
"adventure_recommendations": "Eventyranbefalinger",
|
||||
"food": "Mat",
|
||||
"tourism": "Turisme"
|
||||
"tourism": "Turisme",
|
||||
"location_recommendations": "Stedsanbefalinger"
|
||||
},
|
||||
"google_maps": {
|
||||
"google_maps_integration_desc": "Koble til Google Maps-kontoen din for å få søkeresultater og anbefalinger av høy kvalitet."
|
||||
},
|
||||
"calendar": {
|
||||
"all_categories": "Alle kategorier",
|
||||
"all_day_event": "Hele dagens arrangement",
|
||||
"calendar_overview": "Kalenderoversikt",
|
||||
"categories": "Kategorier",
|
||||
"day": "Dag",
|
||||
"events_scheduled": "hendelser planlagt",
|
||||
"filter_by_category": "Filter etter kategori",
|
||||
"filtered_results": "Filtrerte resultater",
|
||||
"month": "Måned",
|
||||
"today": "I dag",
|
||||
"total_events": "Total hendelser",
|
||||
"week": "Uke"
|
||||
},
|
||||
"locations": {
|
||||
"location": "Sted",
|
||||
"locations": "Lokasjoner",
|
||||
"my_locations": "Mine lokasjoner"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -64,19 +64,12 @@
|
|||
"start_your_journey": "Rozpocznij swoją podróż"
|
||||
},
|
||||
"adventures": {
|
||||
"collection_remove_success": "Podróż została pomyślnie usunięta z kolekcji!",
|
||||
"collection_remove_error": "Błąd podczas usuwania podróży z kolekcji",
|
||||
"collection_link_success": "Podróż została pomyślnie dodana do kolekcji!",
|
||||
"no_image_found": "Nie znaleziono obrazu",
|
||||
"collection_link_error": "Błąd podczas dodawania podróży do kolekcji",
|
||||
"adventure_delete_confirm": "Czy na pewno chcesz usunąć tę podróż? Ta operacja jest nieodwracalna.",
|
||||
"open_details": "Otwórz szczegóły",
|
||||
"edit_adventure": "Edytuj podróż",
|
||||
"remove_from_collection": "Usuń z kolekcji",
|
||||
"add_to_collection": "Dodaj do kolekcji",
|
||||
"delete": "Usuń",
|
||||
"not_found": "Podróż nie znaleziona",
|
||||
"not_found_desc": "Podróży, której szukasz, nie można znaleźć. Spróbuj poszukać innej podróży lub sprawdź później.",
|
||||
"homepage": "Strona główna",
|
||||
"collection": "Kolekcja",
|
||||
"longitude": "Długość geograficzna",
|
||||
|
@ -101,7 +94,6 @@
|
|||
"rating": "Ocena",
|
||||
"my_images": "Moje obrazy",
|
||||
"no_images": "Brak obrazów",
|
||||
"share_adventure": "Podziel się tą podróżą!",
|
||||
"copy_link": "Kopiuj link",
|
||||
"image": "Obraz",
|
||||
"upload_image": "Prześlij obraz",
|
||||
|
@ -122,9 +114,7 @@
|
|||
"clear_map": "Wyczyść mapę",
|
||||
"search_results": "Wyniki wyszukiwania",
|
||||
"no_results": "Nie znaleziono wyników",
|
||||
"wiki_desc": "Pobiera fragment artykułu z Wikipedii pasującego do nazwy podróży.",
|
||||
"generate_desc": "Generuj opis",
|
||||
"public_adventure": "Publiczna podróż",
|
||||
"location_information": "Informacje o lokalizacji",
|
||||
"link": "Link",
|
||||
"links": "Linki",
|
||||
|
@ -145,15 +135,12 @@
|
|||
"edit_collection": "Edytuj kolekcję",
|
||||
"unarchive": "Przywróć z archiwum",
|
||||
"archive": "Archiwizuj",
|
||||
"no_collections_found": "Nie znaleziono kolekcji, do których można dodać tę podróż.",
|
||||
"not_visited": "Nie odwiedzone",
|
||||
"archived_collection_message": "Kolekcja została pomyślnie zarchiwizowana!",
|
||||
"unarchived_collection_message": "Kolekcja została pomyślnie przywrócona z archiwum!",
|
||||
"delete_collection_success": "Kolekcja została pomyślnie usunięta!",
|
||||
"cancel": "Anuluj",
|
||||
"delete_collection": "Usuń kolekcję",
|
||||
"delete_adventure": "Usuń wyprawę",
|
||||
"adventure_delete_success": "Podróż została pomyślnie usunięta!",
|
||||
"visited": "Odwiedzona",
|
||||
"planned": "Planowana",
|
||||
"duration": "Czas trwania",
|
||||
|
@ -171,13 +158,8 @@
|
|||
"image_fetch_failed": "Nie udało się pobrać obrazu",
|
||||
"no_location": "Proszę podać lokalizację",
|
||||
"no_description_found": "Nie znaleziono opisu",
|
||||
"adventure_created": "Podróż została utworzona",
|
||||
"adventure_create_error": "Nie udało się stworzyć podróży",
|
||||
"adventure_updated": "Podróż została zaktualizowana",
|
||||
"adventure_update_error": "Nie udało się zaktualizować podróży",
|
||||
"set_to_pin": "Ustaw jako przypiętą",
|
||||
"category_fetch_error": "Błąd podczas pobierania kategorii",
|
||||
"new_adventure": "Nowa podróż",
|
||||
"basic_information": "Podstawowe informacje",
|
||||
"adventure_not_found": "Brak podróży do wyświetlenia. Dodaj je za pomocą przycisku plus w prawym dolnym rogu lub spróbuj zmienić filtry!",
|
||||
"no_adventures_found": "Brak podróży",
|
||||
|
@ -233,10 +215,7 @@
|
|||
"starting_airport": "Początkowe lotnisko",
|
||||
"to": "Do",
|
||||
"transportation_delete_confirm": "Czy na pewno chcesz usunąć ten transport? \nTej akcji nie można cofnąć.",
|
||||
"will_be_marked": "zostanie oznaczona jako odwiedzona po zapisaniu przygody.",
|
||||
"cities_updated": "miasta zaktualizowane",
|
||||
"create_adventure": "Stwórz przygodę",
|
||||
"no_adventures_to_recommendations": "Nie znaleziono żadnych przygód. \nDodaj co najmniej jedną przygodę, aby uzyskać rekomendacje.",
|
||||
"finding_recommendations": "Odkrywanie ukrytych klejnotów na następną przygodę",
|
||||
"attachment": "Załącznik",
|
||||
"attachment_delete_success": "Załącznik został pomyślnie usunięty!",
|
||||
|
@ -298,7 +277,32 @@
|
|||
"delete_collection_warning": "Czy na pewno chcesz usunąć tę kolekcję? \nTego działania nie można cofnąć.",
|
||||
"collection_contents": "Zawartość kolekcji",
|
||||
"check_in": "Zameldować się",
|
||||
"check_out": "Wymeldować się"
|
||||
"check_out": "Wymeldować się",
|
||||
"collection_link_location_error": "Błąd łączący lokalizację z kolekcją",
|
||||
"collection_link_location_success": "Lokalizacja powiązana z kolekcją pomyślnie!",
|
||||
"collection_locations": "Obejmują lokalizacje kolekcji",
|
||||
"collection_remove_location_error": "Lokalizacja usuwania błędów z kolekcji",
|
||||
"collection_remove_location_success": "Lokalizacja pomyślnie usunięta z kolekcji!",
|
||||
"create_location": "Utwórz lokalizację",
|
||||
"delete_location": "Usuń lokalizację",
|
||||
"edit_location": "Edytuj lokalizację",
|
||||
"location_create_error": "Nie udało się utworzyć lokalizacji",
|
||||
"location_created": "Utworzona lokalizacja",
|
||||
"location_delete_confirm": "Czy na pewno chcesz usunąć tę lokalizację? \nTego działania nie można cofnąć.",
|
||||
"location_delete_success": "Lokalizacja pomyślnie usunięta!",
|
||||
"location_not_found": "Nie znaleziono lokalizacji",
|
||||
"location_not_found_desc": "Nie można było znaleźć lokalizacji. \nWypróbuj inną lokalizację lub sprawdź później.",
|
||||
"location_update_error": "Nie udało się zaktualizować lokalizacji",
|
||||
"location_updated": "Zaktualizowana lokalizacja",
|
||||
"new_location": "Nowa lokalizacja",
|
||||
"no_collections_to_add_location": "Brak kolekcji dodawania tej lokalizacji do.",
|
||||
"no_locations_to_recommendations": "Nie znaleziono żadnych lokalizacji. \nDodaj co najmniej jedną lokalizację, aby uzyskać zalecenia.",
|
||||
"public_location": "Lokalizacja publiczna",
|
||||
"share_location": "Udostępnij tę lokalizację!",
|
||||
"visit_calendar": "Odwiedź kalendarz",
|
||||
"wiki_location_desc": "Wyciąga fragment artykułu Wikipedii pasujący do nazwy lokalizacji.",
|
||||
"will_be_marked_location": "zostanie oznaczone jako odwiedzone po zapisaniu lokalizacji.",
|
||||
"no_locations_found": "Nie znaleziono żadnych lokalizacji"
|
||||
},
|
||||
"worldtravel": {
|
||||
"country_list": "Lista krajów",
|
||||
|
@ -373,10 +377,10 @@
|
|||
"public_tooltip": "Dzięki publicznemu profilowi użytkownicy mogą dzielić się z Tobą kolekcjami i oglądać Twój profil na stronie użytkowników.",
|
||||
"new_password": "Nowe hasło",
|
||||
"or_3rd_party": "Lub zaloguj się za pomocą usługi strony trzeciej",
|
||||
"no_public_adventures": "Nie znaleziono publicznych przygód",
|
||||
"no_public_collections": "Nie znaleziono publicznych kolekcji",
|
||||
"user_adventures": "Przygody użytkowników",
|
||||
"user_collections": "Kolekcje użytkowników"
|
||||
"user_collections": "Kolekcje użytkowników",
|
||||
"no_public_locations": "Nie znaleziono żadnych lokalizacji publicznych",
|
||||
"user_locations": "Lokalizacje użytkowników"
|
||||
},
|
||||
"users": {
|
||||
"no_users_found": "Nie znaleziono użytkowników z publicznymi profilami."
|
||||
|
@ -568,7 +572,13 @@
|
|||
"search": {
|
||||
"adventurelog_results": "Wyniki AdventureLog",
|
||||
"public_adventures": "Publiczne podróże",
|
||||
"online_results": "Wyniki online"
|
||||
"online_results": "Wyniki online",
|
||||
"cities": "Miasta",
|
||||
"countries": "Kraje",
|
||||
"found": "znaleziony",
|
||||
"result": "Wynik",
|
||||
"results": "Wyniki",
|
||||
"try_searching_desc": "Spróbuj szukać przygód, kolekcji, krajów, regionów, miast lub użytkowników."
|
||||
},
|
||||
"map": {
|
||||
"view_details": "Zobacz szczegóły",
|
||||
|
@ -579,13 +589,16 @@
|
|||
"clear_marker": "Usuń znacznik",
|
||||
"add_adventure": "Dodaj nową podróż",
|
||||
"adventure_stats": "Statystyki przygodowe",
|
||||
"adventures_shown": "Pokazane przygody",
|
||||
"completion": "Ukończenie",
|
||||
"display_options": "Opcje wyświetlania",
|
||||
"map_controls": "Sterowanie mapą",
|
||||
"marker_placed_on_map": "Marker umieszczony na mapie",
|
||||
"place_marker_desc": "Kliknij mapę, aby umieścić znacznik lub dodać przygodę bez lokalizacji.",
|
||||
"regions": "Regiony"
|
||||
"regions": "Regiony",
|
||||
"add_location": "Dodaj nową lokalizację",
|
||||
"add_location_at_marker": "Dodaj nową lokalizację na znaczniku",
|
||||
"location_map": "Mapa lokalizacji",
|
||||
"locations_shown": "Pokazane lokalizacje",
|
||||
"place_marker_desc_location": "Kliknij mapę, aby umieścić znacznik."
|
||||
},
|
||||
"share": {
|
||||
"shared": "Udostępnione",
|
||||
|
@ -611,20 +624,20 @@
|
|||
"no_shared_adventures": "Ten użytkownik nie podzielił się jeszcze żadnymi publicznymi przygodami.",
|
||||
"no_shared_collections": "Ten użytkownik nie udostępnił jeszcze żadnych publicznych kolekcji.",
|
||||
"planned_trips": "Planowane wycieczki",
|
||||
"public_adventure_experiences": "Public Adventure Doświadczenia",
|
||||
"travel_statistics": "Statystyka podróży",
|
||||
"your_journey_at_a_glance": "Twoja przygodowa podróż na pierwszy rzut oka"
|
||||
"your_journey_at_a_glance": "Twoja przygodowa podróż na pierwszy rzut oka",
|
||||
"public_location_experiences": "Doświadczenia lokalizacji publicznej"
|
||||
},
|
||||
"categories": {
|
||||
"manage_categories": "Zarządzaj kategoriami",
|
||||
"no_categories_found": "Brak kategorii.",
|
||||
"edit_category": "Edytuj kategorię",
|
||||
"icon": "Ikona",
|
||||
"update_after_refresh": "Karty podróży zostaną zaktualizowane po odświeżeniu strony.",
|
||||
"select_category": "Wybierz kategorię",
|
||||
"category_name": "Nazwa kategorii",
|
||||
"add_new_category": "Dodaj nową kategorię",
|
||||
"name_required": "Nazwa kategorii jest wymagana"
|
||||
"name_required": "Nazwa kategorii jest wymagana",
|
||||
"location_update_after_refresh": "Karty lokalizacji zostaną zaktualizowane po odświeżeniu strony."
|
||||
},
|
||||
"dashboard": {
|
||||
"add_some": "Dlaczego nie zacząć planować kolejnej przygody? \nMożesz dodać nową przygodę, klikając przycisk poniżej.",
|
||||
|
@ -670,9 +683,9 @@
|
|||
"recomendations": {
|
||||
"recommendation": "Zalecenie",
|
||||
"recommendations": "Zalecenia",
|
||||
"adventure_recommendations": "Zalecenia przygodowe",
|
||||
"food": "Żywność",
|
||||
"tourism": "Turystyka"
|
||||
"tourism": "Turystyka",
|
||||
"location_recommendations": "Zalecenia dotyczące lokalizacji"
|
||||
},
|
||||
"lodging": {
|
||||
"apartment": "Apartament",
|
||||
|
@ -695,17 +708,19 @@
|
|||
"google_maps_integration_desc": "Połącz swoje konto Google Maps, aby uzyskać wysokiej jakości wyniki wyszukiwania i zalecenia dotyczące lokalizacji."
|
||||
},
|
||||
"calendar": {
|
||||
"all_categories": "Wszystkie kategorie",
|
||||
"all_day_event": "Wydarzenie przez cały dzień",
|
||||
"calendar_overview": "Przegląd kalendarza",
|
||||
"categories": "Kategorie",
|
||||
"day": "Dzień",
|
||||
"events_scheduled": "Zaplanowane wydarzenia",
|
||||
"filter_by_category": "Filtr według kategorii",
|
||||
"filtered_results": "Przefiltrowane wyniki",
|
||||
"month": "Miesiąc",
|
||||
"today": "Dzisiaj",
|
||||
"total_events": "Całkowite zdarzenia",
|
||||
"week": "Tydzień"
|
||||
},
|
||||
"locations": {
|
||||
"location": "Lokalizacja",
|
||||
"locations": "Lokalizacje",
|
||||
"my_locations": "Moje lokalizacje"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -64,9 +64,6 @@
|
|||
"start_your_journey": "Начните свое путешествие"
|
||||
},
|
||||
"adventures": {
|
||||
"collection_remove_success": "Приключение успешно удалено из коллекции!",
|
||||
"collection_remove_error": "Ошибка удаления приключения из коллекции",
|
||||
"collection_link_success": "Приключение успешно связано с коллекцией!",
|
||||
"invalid_date_range": "Недопустимый диапазон дат",
|
||||
"timezone": "Часовой пояс",
|
||||
"no_visits": "Нет посещений",
|
||||
|
@ -75,8 +72,6 @@
|
|||
"departure_date": "Дата отправления",
|
||||
"arrival_date": "Дата прибытия",
|
||||
"no_image_found": "Изображение не найдено",
|
||||
"collection_link_error": "Ошибка связывания приключения с коллекцией",
|
||||
"adventure_delete_confirm": "Вы уверены, что хотите удалить это приключение? Это действие нельзя отменить.",
|
||||
"checklist_delete_confirm": "Вы уверены, что хотите удалить этот контрольный список? Это действие нельзя отменить.",
|
||||
"note_delete_confirm": "Вы уверены, что хотите удалить эту заметку? Это действие нельзя отменить.",
|
||||
"transportation_delete_confirm": "Вы уверены, что хотите удалить этот транспорт? Это действие нельзя отменить.",
|
||||
|
@ -90,8 +85,6 @@
|
|||
"remove_from_collection": "Убрать из коллекции",
|
||||
"add_to_collection": "Добавить в коллекцию",
|
||||
"delete": "Удалить",
|
||||
"not_found": "Приключение не найдено",
|
||||
"not_found_desc": "Приключение, которое вы искали, не найдено. Попробуйте другое приключение или проверьте позже.",
|
||||
"homepage": "Главная страница",
|
||||
"collection": "Коллекция",
|
||||
"longitude": "Долгота",
|
||||
|
@ -120,7 +113,6 @@
|
|||
"my_images": "Мои изображения",
|
||||
"no_images": "Нет изображений",
|
||||
"distance": "Расстояние",
|
||||
"share_adventure": "Поделиться этим приключением!",
|
||||
"copy_link": "Копировать ссылку",
|
||||
"sun_times": "Время солнца",
|
||||
"sunrise": "Восход",
|
||||
|
@ -146,12 +138,10 @@
|
|||
"search_results": "Результаты поиска",
|
||||
"collection_no_start_end_date": "Добавление дат начала и окончания коллекции разблокирует функции планирования маршрута на странице коллекции.",
|
||||
"no_results": "Результаты не найдены",
|
||||
"wiki_desc": "Извлекает отрывок из статьи Википедии, соответствующей названию приключения.",
|
||||
"attachments": "Вложения",
|
||||
"attachment": "Вложение",
|
||||
"images": "Изображения",
|
||||
"generate_desc": "Сгенерировать описание",
|
||||
"public_adventure": "Публичное приключение",
|
||||
"location_information": "Информация о местоположении",
|
||||
"link": "Ссылка",
|
||||
"links": "Ссылки",
|
||||
|
@ -172,15 +162,12 @@
|
|||
"edit_collection": "Редактировать коллекцию",
|
||||
"unarchive": "Разархивировать",
|
||||
"archive": "Архивировать",
|
||||
"no_collections_found": "Не найдено коллекций для добавления этого приключения.",
|
||||
"not_visited": "Не посещено",
|
||||
"archived_collection_message": "Коллекция успешно архивирована!",
|
||||
"unarchived_collection_message": "Коллекция успешно разархивирована!",
|
||||
"delete_collection_success": "Коллекция успешно удалена!",
|
||||
"cancel": "Отмена",
|
||||
"delete_collection": "Удалить коллекцию",
|
||||
"delete_adventure": "Удалить приключение",
|
||||
"adventure_delete_success": "Приключение успешно удалено!",
|
||||
"visited": "Посещено",
|
||||
"planned": "Запланировано",
|
||||
"duration": "Продолжительность",
|
||||
|
@ -198,17 +185,10 @@
|
|||
"image_fetch_failed": "Не удалось получить изображение",
|
||||
"no_location": "Пожалуйста, введите местоположение",
|
||||
"no_description_found": "Описание не найдено",
|
||||
"adventure_created": "Приключение создано",
|
||||
"adventure_create_error": "Не удалось создать приключение",
|
||||
"lodging": "Жильё",
|
||||
"create_adventure": "Создать приключение",
|
||||
"adventure_updated": "Приключение обновлено",
|
||||
"adventure_update_error": "Не удалось обновить приключение",
|
||||
"set_to_pin": "Установить как булавку",
|
||||
"category_fetch_error": "Ошибка получения категорий",
|
||||
"new_adventure": "Новое приключение",
|
||||
"basic_information": "Основная информация",
|
||||
"no_adventures_to_recommendations": "Приключения не найдены. Добавьте хотя бы одно приключение, чтобы получить рекомендации.",
|
||||
"display_name": "Отображаемое имя",
|
||||
"adventure_not_found": "Нет приключений для отображения. Добавьте их, используя кнопку плюс в правом нижнем углу, или попробуйте изменить фильтры!",
|
||||
"no_adventures_found": "Приключения не найдены",
|
||||
|
@ -250,7 +230,6 @@
|
|||
"no_location_found": "Местоположение не найдено",
|
||||
"from": "От",
|
||||
"to": "До",
|
||||
"will_be_marked": "будет отмечено как посещённое после сохранения приключения.",
|
||||
"start": "Начало",
|
||||
"end": "Конец",
|
||||
"emoji_picker": "Выбор эмодзи",
|
||||
|
@ -298,7 +277,32 @@
|
|||
"name_location": "имя, местоположение",
|
||||
"collection_contents": "Содержание коллекции",
|
||||
"check_in": "Регистрироваться",
|
||||
"check_out": "Проверить"
|
||||
"check_out": "Проверить",
|
||||
"collection_link_location_error": "Ошибка связывания местоположения с сбором",
|
||||
"collection_link_location_success": "Местоположение, связанное с коллекцией успешно!",
|
||||
"collection_locations": "Включите места для сбора",
|
||||
"collection_remove_location_error": "Ошибка удаления местоположения из сбора",
|
||||
"collection_remove_location_success": "Место удалено из коллекции успешно!",
|
||||
"create_location": "Создать местоположение",
|
||||
"delete_location": "Удалить местоположение",
|
||||
"edit_location": "Редактировать местоположение",
|
||||
"location_create_error": "Не удалось создать местоположение",
|
||||
"location_created": "Место создано",
|
||||
"location_delete_confirm": "Вы уверены, что хотите удалить это место? \nЭто действие не может быть отменено.",
|
||||
"location_delete_success": "Место удалено успешно!",
|
||||
"location_not_found": "Местоположение не найдено",
|
||||
"location_not_found_desc": "Место, которое вы искали, не было найдено. \nПожалуйста, попробуйте другое место или проверьте позже.",
|
||||
"location_update_error": "Не удалось обновить местоположение",
|
||||
"location_updated": "Место обновлено",
|
||||
"new_location": "Новое место",
|
||||
"no_collections_to_add_location": "Коллекции не обнаружили, чтобы добавить это место.",
|
||||
"no_locations_to_recommendations": "Никаких мест не найдено. \nДобавьте хотя бы одно место, чтобы получить рекомендации.",
|
||||
"public_location": "Общественное местоположение",
|
||||
"share_location": "Поделитесь этим расположением!",
|
||||
"visit_calendar": "Посетите календарь",
|
||||
"wiki_location_desc": "Вытягивает отрывок из статьи Википедии, соответствующей названию места.",
|
||||
"will_be_marked_location": "будет отмечен по посещению после сохранения местоположения.",
|
||||
"no_locations_found": "Никаких мест не найдено"
|
||||
},
|
||||
"worldtravel": {
|
||||
"country_list": "Список стран",
|
||||
|
@ -373,10 +377,10 @@
|
|||
"public_tooltip": "С публичным профилем пользователи могут делиться с вами коллекциями и просматривать ваш профиль на странице пользователей.",
|
||||
"new_password": "Новый пароль (6+ символов)",
|
||||
"or_3rd_party": "Или войти через сторонний сервис",
|
||||
"no_public_adventures": "Публичные приключения не найдены",
|
||||
"no_public_collections": "Публичные коллекции не найдены",
|
||||
"user_adventures": "Приключения пользователя",
|
||||
"user_collections": "Коллекции пользователя"
|
||||
"user_collections": "Коллекции пользователя",
|
||||
"no_public_locations": "Общественных мест не найдено",
|
||||
"user_locations": "Пользовательские местоположения"
|
||||
},
|
||||
"users": {
|
||||
"no_users_found": "Пользователи с публичными профилями не найдены."
|
||||
|
@ -585,7 +589,13 @@
|
|||
"search": {
|
||||
"adventurelog_results": "Результаты AdventureLog",
|
||||
"public_adventures": "Публичные приключения",
|
||||
"online_results": "Онлайн результаты"
|
||||
"online_results": "Онлайн результаты",
|
||||
"cities": "Города",
|
||||
"countries": "Страны",
|
||||
"found": "найденный",
|
||||
"result": "Результат",
|
||||
"results": "Результаты",
|
||||
"try_searching_desc": "Попробуйте искать приключения, коллекции, страны, регионы, города или пользователей."
|
||||
},
|
||||
"map": {
|
||||
"view_details": "Подробности",
|
||||
|
@ -596,13 +606,16 @@
|
|||
"clear_marker": "Очистить маркер",
|
||||
"add_adventure": "Добавить новое приключение",
|
||||
"adventure_stats": "Приключенческая статистика",
|
||||
"adventures_shown": "Приключения показаны",
|
||||
"completion": "Завершение",
|
||||
"display_options": "Параметры отображения",
|
||||
"map_controls": "Карта управления",
|
||||
"marker_placed_on_map": "Маркер размещен на карте",
|
||||
"place_marker_desc": "Нажмите на карту, чтобы разместить маркер, или добавить приключение без местоположения.",
|
||||
"regions": "Регионы"
|
||||
"regions": "Регионы",
|
||||
"add_location": "Добавить новое место",
|
||||
"add_location_at_marker": "Добавить новое место в маркере",
|
||||
"location_map": "Карта местоположения",
|
||||
"locations_shown": "Места показаны",
|
||||
"place_marker_desc_location": "Нажмите на карту, чтобы разместить маркер."
|
||||
},
|
||||
"share": {
|
||||
"shared": "Поделено",
|
||||
|
@ -628,20 +641,20 @@
|
|||
"no_shared_adventures": "Этот пользователь еще не поделился публичными приключениями.",
|
||||
"no_shared_collections": "Этот пользователь еще не поделился публичными коллекциями.",
|
||||
"planned_trips": "Запланированные поездки",
|
||||
"public_adventure_experiences": "Общественные приключения",
|
||||
"travel_statistics": "Статистика путешествий",
|
||||
"your_journey_at_a_glance": "Ваше приключенческое путешествие с первого взгляда"
|
||||
"your_journey_at_a_glance": "Ваше приключенческое путешествие с первого взгляда",
|
||||
"public_location_experiences": "Общественное местоположение"
|
||||
},
|
||||
"categories": {
|
||||
"manage_categories": "Управление категориями",
|
||||
"no_categories_found": "Категории не найдены.",
|
||||
"edit_category": "Редактировать категорию",
|
||||
"icon": "Иконка",
|
||||
"update_after_refresh": "Карточки приключений будут обновлены после обновления страницы.",
|
||||
"select_category": "Выбрать категорию",
|
||||
"category_name": "Название категории",
|
||||
"add_new_category": "Добавить новую категорию",
|
||||
"name_required": "Требуется название категории"
|
||||
"name_required": "Требуется название категории",
|
||||
"location_update_after_refresh": "Карты местоположения будут обновлены после обновления страницы."
|
||||
},
|
||||
"dashboard": {
|
||||
"welcome_back": "Добро пожаловать обратно",
|
||||
|
@ -690,22 +703,24 @@
|
|||
"recomendations": {
|
||||
"recommendation": "Рекомендация",
|
||||
"recommendations": "Рекомендации",
|
||||
"adventure_recommendations": "Рекомендации приключений",
|
||||
"food": "Еда",
|
||||
"tourism": "Туризм"
|
||||
"tourism": "Туризм",
|
||||
"location_recommendations": "Рекомендации местоположения"
|
||||
},
|
||||
"calendar": {
|
||||
"all_categories": "Все категории",
|
||||
"all_day_event": "Событие на весь день",
|
||||
"calendar_overview": "Обзор календаря",
|
||||
"categories": "Категории",
|
||||
"day": "День",
|
||||
"events_scheduled": "События запланированы",
|
||||
"filter_by_category": "Фильтр по категории",
|
||||
"filtered_results": "Отфильтрованные результаты",
|
||||
"month": "Месяц",
|
||||
"today": "Сегодня",
|
||||
"total_events": "Общее количество событий",
|
||||
"week": "Неделя"
|
||||
},
|
||||
"locations": {
|
||||
"location": "Расположение",
|
||||
"locations": "Локации",
|
||||
"my_locations": "Мои локации"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -15,8 +15,6 @@
|
|||
"activities": {},
|
||||
"add_to_collection": "Lägg till i samlingen",
|
||||
"adventure": "Äventyr",
|
||||
"adventure_delete_confirm": "Är du säker på att du vill ta bort det här äventyret? \nDenna åtgärd kan inte ångras.",
|
||||
"adventure_delete_success": "Äventyret har raderats!",
|
||||
"archive": "Arkiv",
|
||||
"archived": "Arkiverad",
|
||||
"archived_collection_message": "Samlingen har arkiverats!",
|
||||
|
@ -27,16 +25,11 @@
|
|||
"clear": "Rensa",
|
||||
"collection": "Samling",
|
||||
"collection_adventures": "Inkludera samlingsäventyr",
|
||||
"collection_link_error": "Det gick inte att länka äventyr till samling",
|
||||
"collection_link_success": "Äventyr kopplat till samling framgångsrikt!",
|
||||
"collection_remove_error": "Det gick inte att ta bort äventyr från samlingen",
|
||||
"collection_remove_success": "Äventyret har tagits bort från samlingen!",
|
||||
"count_txt": "resultat som matchar din sökning",
|
||||
"create_new": "Skapa nytt...",
|
||||
"date": "Datum",
|
||||
"dates": "Datum",
|
||||
"delete": "Radera",
|
||||
"delete_adventure": "Ta bort äventyr",
|
||||
"delete_collection": "Ta bort samling",
|
||||
"delete_collection_success": "Samlingen har raderats!",
|
||||
"descending": "Fallande",
|
||||
|
@ -50,8 +43,6 @@
|
|||
"my_collections": "Mina samlingar",
|
||||
"name": "Namn",
|
||||
"no_image_found": "Ingen bild hittades",
|
||||
"not_found": "Äventyret hittades inte",
|
||||
"not_found_desc": "Äventyret du letade efter kunde inte hittas. \nProva ett annat äventyr eller kom tillbaka senare.",
|
||||
"open_details": "Öppna Detaljer",
|
||||
"open_filters": "Öppna filter",
|
||||
"order_by": "Sortera efter",
|
||||
|
@ -81,10 +72,6 @@
|
|||
"activity_types": "Aktivitetstyper",
|
||||
"add": "Tillägga",
|
||||
"add_notes": "Lägg till anteckningar",
|
||||
"adventure_create_error": "Det gick inte att skapa äventyr",
|
||||
"adventure_created": "Äventyr skapat",
|
||||
"adventure_update_error": "Det gick inte att uppdatera äventyret",
|
||||
"adventure_updated": "Äventyr uppdaterat",
|
||||
"basic_information": "Grundläggande information",
|
||||
"category": "Kategori",
|
||||
"clear_map": "Rensa karta",
|
||||
|
@ -100,30 +87,25 @@
|
|||
"location": "Plats",
|
||||
"location_information": "Platsinformation",
|
||||
"my_images": "Mina bilder",
|
||||
"new_adventure": "Nytt äventyr",
|
||||
"no_description_found": "Ingen beskrivning hittades",
|
||||
"no_images": "Inga bilder",
|
||||
"no_location": "Vänligen ange en plats",
|
||||
"no_results": "Inga resultat hittades",
|
||||
"public_adventure": "Offentligt äventyr",
|
||||
"remove": "Ta bort",
|
||||
"save_next": "Spara",
|
||||
"search_for_location": "Sök efter en plats",
|
||||
"search_results": "Sökresultat",
|
||||
"see_adventures": "Se äventyr",
|
||||
"share_adventure": "Dela detta äventyr!",
|
||||
"start_date": "Startdatum",
|
||||
"upload_image": "Ladda upp bild",
|
||||
"url": "URL",
|
||||
"warning": "Varning",
|
||||
"wiki_desc": "Hämtar utdrag från Wikipedia-artikeln som matchar äventyrets namn.",
|
||||
"adventure_not_found": "Det finns inga äventyr att visa upp. \nLägg till några med hjälp av plusknappen längst ner till höger eller prova att byta filter!",
|
||||
"all": "Alla",
|
||||
"error_updating_regions": "Fel vid uppdatering av regioner",
|
||||
"mark_visited": "Markera som besökt",
|
||||
"my_adventures": "Mina äventyr",
|
||||
"no_adventures_found": "Inga äventyr hittades",
|
||||
"no_collections_found": "Inga samlingar hittades att lägga till detta äventyr till.",
|
||||
"no_linkable_adventures": "Inga äventyr hittades som kan kopplas till denna samling.",
|
||||
"not_visited": "Ej besökta",
|
||||
"regions_updated": "regioner uppdaterade",
|
||||
|
@ -181,10 +163,7 @@
|
|||
"starting_airport": "Startar flygplats",
|
||||
"to": "Till",
|
||||
"transportation_delete_confirm": "Är du säker på att du vill ta bort denna transport? \nDenna åtgärd kan inte ångras.",
|
||||
"will_be_marked": "kommer att markeras som besökt när äventyret har sparats.",
|
||||
"cities_updated": "städer uppdaterade",
|
||||
"create_adventure": "Skapa äventyr",
|
||||
"no_adventures_to_recommendations": "Inga äventyr hittades. \nLägg till minst ett äventyr för att få rekommendationer.",
|
||||
"finding_recommendations": "Upptäck dolda pärlor för ditt nästa äventyr",
|
||||
"attachment": "Fastsättning",
|
||||
"attachment_delete_success": "Bilagan har raderats!",
|
||||
|
@ -246,7 +225,32 @@
|
|||
"name_location": "namn, plats",
|
||||
"collection_contents": "Insamlingsinnehåll",
|
||||
"check_in": "Checka in",
|
||||
"check_out": "Checka ut"
|
||||
"check_out": "Checka ut",
|
||||
"collection_link_location_error": "Fel som länkar plats till insamling",
|
||||
"collection_link_location_success": "Plats kopplad till samling framgångsrikt!",
|
||||
"collection_locations": "Inkludera insamlingsplatser",
|
||||
"collection_remove_location_error": "Fel att ta bort platsen från samlingen",
|
||||
"collection_remove_location_success": "Plats tas bort från samlingen framgångsrikt!",
|
||||
"create_location": "Skapa plats",
|
||||
"delete_location": "Radera plats",
|
||||
"edit_location": "Redigera plats",
|
||||
"location_create_error": "Det gick inte att skapa plats",
|
||||
"location_created": "Plats skapad",
|
||||
"location_delete_confirm": "Är du säker på att du vill ta bort den här platsen? \nDenna åtgärd kan inte ångras.",
|
||||
"location_delete_success": "Plats raderas framgångsrikt!",
|
||||
"location_not_found": "Plats hittades inte",
|
||||
"location_not_found_desc": "Platsen du letade efter kunde inte hittas. \nFörsök med en annan plats eller kom tillbaka senare.",
|
||||
"location_update_error": "Det gick inte att uppdatera platsen",
|
||||
"location_updated": "Plats uppdaterad",
|
||||
"new_location": "Ny plats",
|
||||
"no_collections_to_add_location": "Inga samlingar som hittats för att lägga till den här platsen till.",
|
||||
"no_locations_to_recommendations": "Inga platser hittades. \nLägg till minst en plats för att få rekommendationer.",
|
||||
"public_location": "Allmän plats",
|
||||
"share_location": "Dela den här platsen!",
|
||||
"visit_calendar": "Besök kalendern",
|
||||
"wiki_location_desc": "Drar utdrag från Wikipedia -artikeln som matchar namnet på platsen.",
|
||||
"will_be_marked_location": "kommer att markeras som besöks när platsen har sparats.",
|
||||
"no_locations_found": "Inga platser hittades"
|
||||
},
|
||||
"home": {
|
||||
"desc_1": "Upptäck, planera och utforska med lätthet",
|
||||
|
@ -373,10 +377,10 @@
|
|||
"public_profile": "Offentlig profil",
|
||||
"new_password": "Nytt lösenord",
|
||||
"or_3rd_party": "Eller logga in med en tredjepartstjänst",
|
||||
"no_public_adventures": "Inga offentliga äventyr hittades",
|
||||
"no_public_collections": "Inga offentliga samlingar hittades",
|
||||
"user_adventures": "Användaräventyr",
|
||||
"user_collections": "Användarsamlingar"
|
||||
"user_collections": "Användarsamlingar",
|
||||
"no_public_locations": "Inga offentliga platser hittades",
|
||||
"user_locations": "Användarplatser"
|
||||
},
|
||||
"users": {
|
||||
"no_users_found": "Inga användare hittades med offentliga profiler."
|
||||
|
@ -568,7 +572,13 @@
|
|||
"search": {
|
||||
"adventurelog_results": "AdventureLog-resultat",
|
||||
"online_results": "Online resultat",
|
||||
"public_adventures": "Offentliga äventyr"
|
||||
"public_adventures": "Offentliga äventyr",
|
||||
"cities": "Städer",
|
||||
"countries": "Länder",
|
||||
"found": "funnna",
|
||||
"result": "Resultat",
|
||||
"results": "Resultat",
|
||||
"try_searching_desc": "Försök att söka efter äventyr, samlingar, länder, regioner, städer eller användare."
|
||||
},
|
||||
"map": {
|
||||
"add_adventure": "Lägg till nytt äventyr",
|
||||
|
@ -579,13 +589,16 @@
|
|||
"show_visited_regions": "Visa besökta regioner",
|
||||
"view_details": "Visa detaljer",
|
||||
"adventure_stats": "Äventyrsstatistik",
|
||||
"adventures_shown": "Äventyr visas",
|
||||
"completion": "Komplettering",
|
||||
"display_options": "Visningsalternativ",
|
||||
"map_controls": "Kartkontroller",
|
||||
"marker_placed_on_map": "Markör placerad på kartan",
|
||||
"place_marker_desc": "Klicka på kartan för att placera en markör, eller lägg till ett äventyr utan plats.",
|
||||
"regions": "Regioner"
|
||||
"regions": "Regioner",
|
||||
"add_location": "Lägg till en ny plats",
|
||||
"add_location_at_marker": "Lägg till en ny plats på Marker",
|
||||
"location_map": "Platskarta",
|
||||
"locations_shown": "Visas",
|
||||
"place_marker_desc_location": "Klicka på kartan för att placera en markör."
|
||||
},
|
||||
"languages": {},
|
||||
"share": {
|
||||
|
@ -611,9 +624,9 @@
|
|||
"no_shared_adventures": "Den här användaren har inte delat några offentliga äventyr än.",
|
||||
"no_shared_collections": "Den här användaren har inte delat några offentliga samlingar än.",
|
||||
"planned_trips": "Planerade resor",
|
||||
"public_adventure_experiences": "Allmänt äventyrsupplevelser",
|
||||
"travel_statistics": "Resestatistik",
|
||||
"your_journey_at_a_glance": "Din äventyrsresa med en överblick"
|
||||
"your_journey_at_a_glance": "Din äventyrsresa med en överblick",
|
||||
"public_location_experiences": "Allmän platsupplevelser"
|
||||
},
|
||||
"categories": {
|
||||
"category_name": "Kategorinamn",
|
||||
|
@ -622,9 +635,9 @@
|
|||
"manage_categories": "Hantera kategorier",
|
||||
"no_categories_found": "Inga kategorier hittades.",
|
||||
"select_category": "Välj Kategori",
|
||||
"update_after_refresh": "Äventyrskorten kommer att uppdateras när du uppdaterar sidan.",
|
||||
"add_new_category": "Lägg till en ny kategori",
|
||||
"name_required": "Kategorinamn krävs"
|
||||
"name_required": "Kategorinamn krävs",
|
||||
"location_update_after_refresh": "Platskorten kommer att uppdateras när du uppdaterar sidan."
|
||||
},
|
||||
"dashboard": {
|
||||
"add_some": "Varför inte börja planera ditt nästa äventyr? \nDu kan lägga till ett nytt äventyr genom att klicka på knappen nedan.",
|
||||
|
@ -670,9 +683,9 @@
|
|||
"recomendations": {
|
||||
"recommendation": "Rekommendation",
|
||||
"recommendations": "Rekommendationer",
|
||||
"adventure_recommendations": "Äventyrsrekommendationer",
|
||||
"food": "Mat",
|
||||
"tourism": "Turism"
|
||||
"tourism": "Turism",
|
||||
"location_recommendations": "Platsrekommendationer"
|
||||
},
|
||||
"lodging": {
|
||||
"apartment": "Lägenhet",
|
||||
|
@ -695,17 +708,19 @@
|
|||
"google_maps_integration_desc": "Anslut ditt Google Maps-konto för att få sökresultat och rekommendationer av hög kvalitet."
|
||||
},
|
||||
"calendar": {
|
||||
"all_categories": "Alla kategorier",
|
||||
"all_day_event": "Hela dagen",
|
||||
"calendar_overview": "Kalenderöversikt",
|
||||
"categories": "Kategorier",
|
||||
"day": "Dag",
|
||||
"events_scheduled": "Händelser planerade",
|
||||
"filter_by_category": "Filter efter kategori",
|
||||
"filtered_results": "Filtrerade resultat",
|
||||
"month": "Månad",
|
||||
"today": "I dag",
|
||||
"total_events": "Totala evenemang",
|
||||
"week": "Vecka"
|
||||
},
|
||||
"locations": {
|
||||
"location": "Plats",
|
||||
"locations": "Plats",
|
||||
"my_locations": "Mina platser"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -64,12 +64,7 @@
|
|||
"start_your_journey": "开始您的旅程"
|
||||
},
|
||||
"adventures": {
|
||||
"collection_remove_success": "成功从合集中移除冒险!",
|
||||
"collection_remove_error": "从合集中移除冒险时出错",
|
||||
"collection_link_success": "成功将冒险链接到合集!",
|
||||
"no_image_found": "未找到图片",
|
||||
"collection_link_error": "链接冒险到合集时出错",
|
||||
"adventure_delete_confirm": "您确定要删除此冒险吗?此操作无法撤销。",
|
||||
"checklist_delete_confirm": "您确定要删除此检查清单吗?此操作无法撤销。",
|
||||
"note_delete_confirm": "您确定要删除此笔记吗?此操作无法撤销。",
|
||||
"transportation_delete_confirm": "您确定要删除此交通工具吗?此操作无法撤销。",
|
||||
|
@ -83,8 +78,6 @@
|
|||
"remove_from_collection": "从合集中移除",
|
||||
"add_to_collection": "添加到合集",
|
||||
"delete": "删除",
|
||||
"not_found": "未找到冒险",
|
||||
"not_found_desc": "未找到你要查找的冒险。请尝试其他冒险或稍后再试。",
|
||||
"homepage": "主页",
|
||||
"collection": "合集",
|
||||
"longitude": "经度",
|
||||
|
@ -109,7 +102,6 @@
|
|||
"rating": "评分",
|
||||
"my_images": "我的图片",
|
||||
"no_images": "没有图片",
|
||||
"share_adventure": "分享此冒险!",
|
||||
"copy_link": "复制链接",
|
||||
"image": "图片",
|
||||
"upload_image": "上传图片",
|
||||
|
@ -130,12 +122,10 @@
|
|||
"clear_map": "清除地图",
|
||||
"search_results": "搜索结果",
|
||||
"no_results": "未找到结果",
|
||||
"wiki_desc": "从与冒险名称匹配的维基百科文章中提取摘录。",
|
||||
"attachments": "附件",
|
||||
"attachment": "附件",
|
||||
"images": "图片",
|
||||
"generate_desc": "生成描述",
|
||||
"public_adventure": "公开冒险",
|
||||
"location_information": "位置信息",
|
||||
"link": "链接",
|
||||
"links": "链接",
|
||||
|
@ -156,15 +146,12 @@
|
|||
"edit_collection": "编辑合集",
|
||||
"unarchive": "取消归档",
|
||||
"archive": "归档",
|
||||
"no_collections_found": "未找到可添加此冒险的合集。",
|
||||
"not_visited": "未访问",
|
||||
"archived_collection_message": "成功归档合集!",
|
||||
"unarchived_collection_message": "成功取消归档合集!",
|
||||
"delete_collection_success": "成功删除合集!",
|
||||
"cancel": "取消",
|
||||
"delete_collection": "删除合集",
|
||||
"delete_adventure": "删除冒险",
|
||||
"adventure_delete_success": "成功删除冒险!",
|
||||
"visited": "已访问",
|
||||
"planned": "计划中",
|
||||
"duration": "持续时间",
|
||||
|
@ -182,17 +169,10 @@
|
|||
"image_fetch_failed": "获取图片失败",
|
||||
"no_location": "请输入位置",
|
||||
"no_description_found": "未找到描述",
|
||||
"adventure_created": "冒险已创建",
|
||||
"adventure_create_error": "创建冒险失败",
|
||||
"lodging": "住宿",
|
||||
"create_adventure": "创建冒险",
|
||||
"adventure_updated": "冒险已更新",
|
||||
"adventure_update_error": "更新冒险失败",
|
||||
"set_to_pin": "设置为图钉",
|
||||
"category_fetch_error": "获取类别时出错",
|
||||
"new_adventure": "新冒险",
|
||||
"basic_information": "基本信息",
|
||||
"no_adventures_to_recommendations": "未找到冒险。添加至少一个冒险以获得推荐。",
|
||||
"display_name": "显示名称",
|
||||
"adventure_not_found": "没找到任何冒险。使用右下角的加号按钮添加一些,或尝试更改筛选条件!",
|
||||
"no_adventures_found": "未找到冒险",
|
||||
|
@ -232,7 +212,6 @@
|
|||
"no_location_found": "未找到位置",
|
||||
"from": "从",
|
||||
"to": "到",
|
||||
"will_be_marked": "将在冒险保存后标记为已访问。",
|
||||
"start": "开始",
|
||||
"end": "结束",
|
||||
"emoji_picker": "表情符号选择器",
|
||||
|
@ -298,7 +277,32 @@
|
|||
"name_location": "名称,位置",
|
||||
"collection_contents": "收集内容",
|
||||
"check_in": "报到",
|
||||
"check_out": "查看"
|
||||
"check_out": "查看",
|
||||
"collection_link_location_error": "链接位置到集合的错误",
|
||||
"collection_link_location_success": "成功链接到收集的位置!",
|
||||
"collection_locations": "包括收集位置",
|
||||
"collection_remove_location_error": "从集合中删除位置的错误",
|
||||
"collection_remove_location_success": "成功从收藏中删除的位置!",
|
||||
"create_location": "创建位置",
|
||||
"delete_location": "删除位置",
|
||||
"edit_location": "编辑位置",
|
||||
"location_create_error": "无法创建位置",
|
||||
"location_created": "创建的位置",
|
||||
"location_delete_confirm": "您确定要删除此位置吗?\n该动作不能撤消。",
|
||||
"location_delete_success": "位置成功删除了!",
|
||||
"location_not_found": "找不到位置",
|
||||
"location_not_found_desc": "找不到您寻找的位置。\n请尝试其他位置或稍后再检查。",
|
||||
"location_update_error": "无法更新位置",
|
||||
"location_updated": "位置更新",
|
||||
"new_location": "新位置",
|
||||
"no_collections_to_add_location": "没有发现将此位置添加到。",
|
||||
"no_locations_to_recommendations": "找不到位置。\n添加至少一个位置以获取建议。",
|
||||
"public_location": "公共位置",
|
||||
"share_location": "分享这个位置!",
|
||||
"visit_calendar": "访问日历",
|
||||
"wiki_location_desc": "从Wikipedia文章中提取摘录,符合该位置的名称。",
|
||||
"will_be_marked_location": "保存位置后,将被标记为访问。",
|
||||
"no_locations_found": "找不到位置"
|
||||
},
|
||||
"auth": {
|
||||
"forgot_password": "忘记密码?",
|
||||
|
@ -317,10 +321,10 @@
|
|||
"public_tooltip": "通过公开个人资料,用户可以与您共享合集,并在用户页面查看您的资料。",
|
||||
"new_password": "新密码(6个字符以上)",
|
||||
"or_3rd_party": "或使用第三方服务登录",
|
||||
"no_public_adventures": "未找到公开冒险",
|
||||
"no_public_collections": "未找到公开合集",
|
||||
"user_adventures": "用户冒险",
|
||||
"user_collections": "用户合集"
|
||||
"user_collections": "用户合集",
|
||||
"no_public_locations": "找不到公共场所",
|
||||
"user_locations": "用户位置"
|
||||
},
|
||||
"worldtravel": {
|
||||
"all": "全部",
|
||||
|
@ -568,7 +572,13 @@
|
|||
"search": {
|
||||
"adventurelog_results": "AdventureLog 结果",
|
||||
"online_results": "在线结果",
|
||||
"public_adventures": "已公开的冒险"
|
||||
"public_adventures": "已公开的冒险",
|
||||
"cities": "城市",
|
||||
"countries": "国家",
|
||||
"found": "成立",
|
||||
"result": "结果",
|
||||
"results": "结果",
|
||||
"try_searching_desc": "尝试搜索冒险,收藏,国家,地区,城市或用户。"
|
||||
},
|
||||
"map": {
|
||||
"add_adventure": "添加新冒险",
|
||||
|
@ -579,13 +589,16 @@
|
|||
"show_visited_regions": "显示访问过的地区",
|
||||
"view_details": "查看详情",
|
||||
"adventure_stats": "冒险统计",
|
||||
"adventures_shown": "展示的冒险",
|
||||
"completion": "完成",
|
||||
"display_options": "显示选项",
|
||||
"map_controls": "地图控件",
|
||||
"marker_placed_on_map": "放置在地图上的标记",
|
||||
"place_marker_desc": "单击地图以放置标记,或在没有位置的情况下添加冒险。",
|
||||
"regions": "地区"
|
||||
"regions": "地区",
|
||||
"add_location": "添加新位置",
|
||||
"add_location_at_marker": "在标记处添加新位置",
|
||||
"location_map": "位置图",
|
||||
"locations_shown": "显示的位置",
|
||||
"place_marker_desc_location": "单击地图以放置标记。"
|
||||
},
|
||||
"languages": {},
|
||||
"share": {
|
||||
|
@ -611,9 +624,9 @@
|
|||
"no_shared_adventures": "该用户尚未分享任何公共冒险。",
|
||||
"no_shared_collections": "该用户尚未共享任何公共收藏。",
|
||||
"planned_trips": "计划的旅行",
|
||||
"public_adventure_experiences": "公共冒险经验",
|
||||
"travel_statistics": "旅行统计",
|
||||
"your_journey_at_a_glance": "您一眼的冒险之旅"
|
||||
"your_journey_at_a_glance": "您一眼的冒险之旅",
|
||||
"public_location_experiences": "公共位置经验"
|
||||
},
|
||||
"categories": {
|
||||
"category_name": "类别名称",
|
||||
|
@ -622,9 +635,9 @@
|
|||
"manage_categories": "管理类别",
|
||||
"no_categories_found": "未找到类别。",
|
||||
"select_category": "选择类别",
|
||||
"update_after_refresh": "刷新页面后,冒险卡将更新。",
|
||||
"add_new_category": "添加新类别",
|
||||
"name_required": "需要类别名称"
|
||||
"name_required": "需要类别名称",
|
||||
"location_update_after_refresh": "刷新页面后,将更新位置卡。"
|
||||
},
|
||||
"dashboard": {
|
||||
"add_some": "为什么不开始计划你的下一次冒险呢?\n您可以通过单击下面的按钮添加新的冒险。",
|
||||
|
@ -670,9 +683,9 @@
|
|||
"recomendations": {
|
||||
"recommendation": "推荐",
|
||||
"recommendations": "建议",
|
||||
"adventure_recommendations": "冒险建议",
|
||||
"food": "食物",
|
||||
"tourism": "旅游"
|
||||
"tourism": "旅游",
|
||||
"location_recommendations": "位置建议"
|
||||
},
|
||||
"lodging": {
|
||||
"campground": "露营地",
|
||||
|
@ -695,17 +708,19 @@
|
|||
"google_maps_integration_desc": "连接您的Google Maps帐户以获取高质量的位置搜索结果和建议。"
|
||||
},
|
||||
"calendar": {
|
||||
"all_categories": "所有类别",
|
||||
"all_day_event": "全天活动",
|
||||
"calendar_overview": "日历概述",
|
||||
"categories": "类别",
|
||||
"day": "天",
|
||||
"events_scheduled": "预定事件",
|
||||
"filter_by_category": "按类别过滤",
|
||||
"filtered_results": "过滤结果",
|
||||
"month": "月",
|
||||
"today": "今天",
|
||||
"total_events": "总事件",
|
||||
"week": "星期"
|
||||
},
|
||||
"locations": {
|
||||
"location": "地点",
|
||||
"locations": "位置",
|
||||
"my_locations": "我的位置"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -102,7 +102,7 @@
|
|||
<div class="flex flex-col sm:flex-row gap-4 pt-4">
|
||||
{#if data.user}
|
||||
<button
|
||||
on:click={() => goto('/adventures')}
|
||||
on:click={() => goto('/locations')}
|
||||
class="btn btn-primary btn-lg gap-3 shadow-lg hover:shadow-xl transition-all duration-300 group"
|
||||
>
|
||||
<PlayIcon class="w-5 h-5 group-hover:scale-110 transition-transform" />
|
||||
|
|
|
@ -8,7 +8,7 @@ export const POST: RequestHandler = async (event) => {
|
|||
let allActivities: string[] = [];
|
||||
let csrfToken = await fetchCSRFToken();
|
||||
let sessionId = event.cookies.get('sessionid');
|
||||
let res = await event.fetch(`${endpoint}/api/activity-types/types/`, {
|
||||
let res = await event.fetch(`${endpoint}/api/tags/types/`, {
|
||||
headers: {
|
||||
'X-CSRFToken': csrfToken,
|
||||
Cookie: `csrftoken=${csrfToken}; sessionid=${sessionId}`
|
||||
|
|
|
@ -1,99 +1,5 @@
|
|||
import { redirect } from '@sveltejs/kit';
|
||||
import type { PageServerLoad } from './$types';
|
||||
const PUBLIC_SERVER_URL = process.env['PUBLIC_SERVER_URL'];
|
||||
import type { Adventure } from '$lib/types';
|
||||
|
||||
import type { Actions } from '@sveltejs/kit';
|
||||
import { fetchCSRFToken } from '$lib/index.server';
|
||||
|
||||
const serverEndpoint = PUBLIC_SERVER_URL || 'http://localhost:8000';
|
||||
|
||||
export const load = (async (event) => {
|
||||
if (!event.locals.user) {
|
||||
return redirect(302, '/login');
|
||||
} else {
|
||||
let count = 0;
|
||||
let adventures: Adventure[] = [];
|
||||
|
||||
let typeString = event.url.searchParams.get('types');
|
||||
|
||||
// If no type is specified, default to 'all'
|
||||
if (!typeString) {
|
||||
typeString = 'all';
|
||||
}
|
||||
|
||||
const include_collections = event.url.searchParams.get('include_collections') || 'false';
|
||||
const order_by = event.url.searchParams.get('order_by') || 'updated_at';
|
||||
const order_direction = event.url.searchParams.get('order_direction') || 'asc';
|
||||
const page = event.url.searchParams.get('page') || '1';
|
||||
const is_visited = event.url.searchParams.get('is_visited') || 'all';
|
||||
|
||||
let initialFetch = await event.fetch(
|
||||
`${serverEndpoint}/api/adventures/filtered?types=${typeString}&order_by=${order_by}&order_direction=${order_direction}&include_collections=${include_collections}&page=${page}&is_visited=${is_visited}`,
|
||||
{
|
||||
headers: {
|
||||
Cookie: `sessionid=${event.cookies.get('sessionid')}`
|
||||
},
|
||||
credentials: 'include'
|
||||
}
|
||||
);
|
||||
|
||||
if (!initialFetch.ok) {
|
||||
let error_message = await initialFetch.json();
|
||||
console.error(error_message);
|
||||
console.error('Failed to fetch visited adventures');
|
||||
return redirect(302, '/login');
|
||||
} else {
|
||||
let res = await initialFetch.json();
|
||||
let visited = res.results as Adventure[];
|
||||
|
||||
count = res.count;
|
||||
adventures = [...adventures, ...visited];
|
||||
}
|
||||
|
||||
return {
|
||||
props: {
|
||||
adventures,
|
||||
count
|
||||
}
|
||||
};
|
||||
}
|
||||
}) satisfies PageServerLoad;
|
||||
|
||||
export const actions: Actions = {
|
||||
image: async (event) => {
|
||||
let formData = await event.request.formData();
|
||||
let csrfToken = await fetchCSRFToken();
|
||||
let sessionId = event.cookies.get('sessionid');
|
||||
let res = await fetch(`${serverEndpoint}/api/images/`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
Cookie: `csrftoken=${csrfToken}; sessionid=${sessionId}`,
|
||||
'X-CSRFToken': csrfToken,
|
||||
Referer: event.url.origin // Include Referer header
|
||||
},
|
||||
body: formData
|
||||
});
|
||||
let data = await res.json();
|
||||
return data;
|
||||
},
|
||||
attachment: async (event) => {
|
||||
let formData = await event.request.formData();
|
||||
let csrfToken = await fetchCSRFToken();
|
||||
let sessionId = event.cookies.get('sessionid');
|
||||
let res = await fetch(`${serverEndpoint}/api/attachments/`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
Cookie: `csrftoken=${csrfToken}; sessionid=${sessionId}`,
|
||||
'X-CSRFToken': csrfToken,
|
||||
Referer: event.url.origin // Include Referer header
|
||||
},
|
||||
body: formData
|
||||
});
|
||||
let data = await res.json();
|
||||
|
||||
console.log(res);
|
||||
console.log(data);
|
||||
return data;
|
||||
}
|
||||
};
|
||||
export const load = (async (_event) => {
|
||||
return redirect(301, '/locations');
|
||||
}) satisfies import('./$types').PageServerLoad;
|
||||
|
|
|
@ -1,76 +1,7 @@
|
|||
import type { PageServerLoad } from './$types';
|
||||
const PUBLIC_SERVER_URL = process.env['PUBLIC_SERVER_URL'];
|
||||
import type { AdditionalAdventure, Adventure, Collection } from '$lib/types';
|
||||
const endpoint = PUBLIC_SERVER_URL || 'http://localhost:8000';
|
||||
import { redirect } from '@sveltejs/kit';
|
||||
|
||||
export const load = (async (event) => {
|
||||
const id = event.params as { id: string };
|
||||
let request = await fetch(`${endpoint}/api/adventures/${id.id}/additional-info/`, {
|
||||
headers: {
|
||||
Cookie: `sessionid=${event.cookies.get('sessionid')}`
|
||||
},
|
||||
credentials: 'include'
|
||||
});
|
||||
if (!request.ok) {
|
||||
console.error('Failed to fetch adventure ' + id.id);
|
||||
return {
|
||||
props: {
|
||||
adventure: null
|
||||
}
|
||||
};
|
||||
} else {
|
||||
let adventure = (await request.json()) as AdditionalAdventure;
|
||||
|
||||
return {
|
||||
props: {
|
||||
adventure
|
||||
}
|
||||
};
|
||||
}
|
||||
return redirect(301, `/locations/${id.id}`);
|
||||
}) satisfies PageServerLoad;
|
||||
|
||||
import { redirect, type Actions } from '@sveltejs/kit';
|
||||
import { fetchCSRFToken } from '$lib/index.server';
|
||||
|
||||
const serverEndpoint = PUBLIC_SERVER_URL || 'http://localhost:8000';
|
||||
|
||||
export const actions: Actions = {
|
||||
delete: async (event) => {
|
||||
const id = event.params as { id: string };
|
||||
const adventureId = id.id;
|
||||
|
||||
if (!event.locals.user) {
|
||||
return redirect(302, '/login');
|
||||
}
|
||||
if (!adventureId) {
|
||||
return {
|
||||
status: 400,
|
||||
error: new Error('Bad request')
|
||||
};
|
||||
}
|
||||
|
||||
let csrfToken = await fetchCSRFToken();
|
||||
|
||||
let res = await fetch(`${serverEndpoint}/api/adventures/${event.params.id}`, {
|
||||
method: 'DELETE',
|
||||
headers: {
|
||||
Referer: event.url.origin, // Include Referer header
|
||||
Cookie: `sessionid=${event.cookies.get('sessionid')};
|
||||
csrftoken=${csrfToken}`,
|
||||
'X-CSRFToken': csrfToken
|
||||
},
|
||||
credentials: 'include'
|
||||
});
|
||||
console.log(res);
|
||||
if (!res.ok) {
|
||||
return {
|
||||
status: res.status,
|
||||
error: new Error('Failed to delete adventure')
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
status: 204
|
||||
};
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import type { Adventure } from '$lib/types';
|
||||
import type { Location } from '$lib/types';
|
||||
import type { PageServerLoad } from './$types';
|
||||
import { formatDateInTimezone, formatAllDayDate } from '$lib/dateUtils';
|
||||
import { isAllDay } from '$lib';
|
||||
|
@ -8,12 +8,12 @@ const endpoint = PUBLIC_SERVER_URL || 'http://localhost:8000';
|
|||
|
||||
export const load = (async (event) => {
|
||||
let sessionId = event.cookies.get('sessionid');
|
||||
let visitedFetch = await fetch(`${endpoint}/api/adventures/all/?include_collections=true`, {
|
||||
let visitedFetch = await fetch(`${endpoint}/api/locations/all/?include_collections=true`, {
|
||||
headers: {
|
||||
Cookie: `sessionid=${sessionId}`
|
||||
}
|
||||
});
|
||||
let adventures = (await visitedFetch.json()) as Adventure[];
|
||||
let adventures = (await visitedFetch.json()) as Location[];
|
||||
|
||||
// Get user's local timezone as fallback
|
||||
const userTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
return marked(markdown);
|
||||
};
|
||||
|
||||
let adventures = data.props.adventures;
|
||||
let locations = data.props.adventures;
|
||||
let allDates = data.props.dates;
|
||||
let filteredDates = [...allDates];
|
||||
|
||||
|
@ -174,7 +174,7 @@
|
|||
</script>
|
||||
|
||||
<svelte:head>
|
||||
<title>{$t('adventures.adventure_calendar')} - AdventureLog</title>
|
||||
<title>{$t('adventures.visit_calendar')} - AdventureLog</title>
|
||||
</svelte:head>
|
||||
|
||||
<div class="min-h-screen bg-gradient-to-br from-base-200 via-base-100 to-base-200">
|
||||
|
@ -196,7 +196,7 @@
|
|||
</div>
|
||||
<div>
|
||||
<h1 class="text-3xl font-bold text-primary bg-clip-text">
|
||||
{$t('adventures.adventure_calendar')}
|
||||
{$t('adventures.visit_calendar')}
|
||||
</h1>
|
||||
<p class="text-sm text-base-content/60">
|
||||
{filteredDates.length}
|
||||
|
@ -214,8 +214,8 @@
|
|||
<div class="stat-value text-lg text-primary">{allDates.length}</div>
|
||||
</div>
|
||||
<div class="stat py-2 px-4">
|
||||
<div class="stat-title text-xs">{$t('navbar.adventures')}</div>
|
||||
<div class="stat-value text-lg text-secondary">{adventures.length}</div>
|
||||
<div class="stat-title text-xs">{$t('locations.locations')}</div>
|
||||
<div class="stat-value text-lg text-secondary">{locations.length}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -229,7 +229,7 @@
|
|||
/>
|
||||
<input
|
||||
type="text"
|
||||
placeholder="Search adventures or locations..."
|
||||
placeholder={$t('adventures.search_for_location')}
|
||||
class="input input-bordered w-full pl-10 pr-10 bg-base-100/80"
|
||||
bind:value={searchFilter}
|
||||
/>
|
||||
|
@ -298,8 +298,8 @@
|
|||
|
||||
<div class="grid grid-cols-2 gap-4">
|
||||
<div class="stat p-0">
|
||||
<div class="stat-title text-xs">{$t('navbar.adventures')}</div>
|
||||
<div class="stat-value text-lg text-primary">{adventures.length}</div>
|
||||
<div class="stat-title text-xs">{$t('locations.locations')}</div>
|
||||
<div class="stat-value text-lg text-primary">{locations.length}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
@ -418,7 +418,7 @@
|
|||
|
||||
{#if selectedEvent.extendedProps.adventureId}
|
||||
<a
|
||||
href={`/adventures/${selectedEvent.extendedProps.adventureId}`}
|
||||
href={`/locations/${selectedEvent.extendedProps.adventureId}`}
|
||||
class="btn btn-neutral btn-block mt-4"
|
||||
>
|
||||
{$t('map.view_details')}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import { redirect } from '@sveltejs/kit';
|
||||
import type { PageServerLoad } from './$types';
|
||||
const PUBLIC_SERVER_URL = process.env['PUBLIC_SERVER_URL'];
|
||||
import type { Adventure, Collection } from '$lib/types';
|
||||
import type { Location, Collection } from '$lib/types';
|
||||
|
||||
import type { Actions } from '@sveltejs/kit';
|
||||
import { fetchCSRFToken } from '$lib/index.server';
|
||||
|
@ -16,7 +16,7 @@ export const load = (async (event) => {
|
|||
let next = null;
|
||||
let previous = null;
|
||||
let count = 0;
|
||||
let collections: Adventure[] = [];
|
||||
let collections: Location[] = [];
|
||||
let sessionId = event.cookies.get('sessionid');
|
||||
|
||||
// Get sorting parameters from URL
|
||||
|
@ -38,7 +38,7 @@ export const load = (async (event) => {
|
|||
return redirect(302, '/login');
|
||||
} else {
|
||||
let res = await initialFetch.json();
|
||||
let visited = res.results as Adventure[];
|
||||
let visited = res.results as Location[];
|
||||
next = res.next;
|
||||
previous = res.previous;
|
||||
count = res.count;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import { redirect } from '@sveltejs/kit';
|
||||
import type { PageServerLoad } from './$types';
|
||||
const PUBLIC_SERVER_URL = process.env['PUBLIC_SERVER_URL'];
|
||||
import type { Adventure, Collection } from '$lib/types';
|
||||
import type { Location, Collection } from '$lib/types';
|
||||
const endpoint = PUBLIC_SERVER_URL || 'http://localhost:8000';
|
||||
|
||||
export const load = (async (event) => {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<script lang="ts">
|
||||
import type { Adventure, Checklist, Collection, Lodging, Note, Transportation } from '$lib/types';
|
||||
import type { Location, Checklist, Collection, Lodging, Note, Transportation } from '$lib/types';
|
||||
import { onMount, onDestroy } from 'svelte';
|
||||
import type { PageData } from './$types';
|
||||
import { marked } from 'marked'; // Import the markdown parser
|
||||
|
@ -15,8 +15,8 @@
|
|||
import DayGrid from '@event-calendar/day-grid';
|
||||
|
||||
import Plus from '~icons/mdi/plus';
|
||||
import AdventureCard from '$lib/components/AdventureCard.svelte';
|
||||
import AdventureLink from '$lib/components/AdventureLink.svelte';
|
||||
import LocationCard from '$lib/components/LocationCard.svelte';
|
||||
import AdventureLink from '$lib/components/LocationLink.svelte';
|
||||
import { MapLibre, Marker, Popup, LineLayer, GeoJSON } from 'svelte-maplibre';
|
||||
import TransportationCard from '$lib/components/TransportationCard.svelte';
|
||||
import NoteCard from '$lib/components/NoteCard.svelte';
|
||||
|
@ -25,7 +25,7 @@
|
|||
const userTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
|
||||
|
||||
import {
|
||||
groupAdventuresByDate,
|
||||
groupLocationsByDate,
|
||||
groupNotesByDate,
|
||||
groupTransportationsByDate,
|
||||
groupChecklistsByDate,
|
||||
|
@ -39,7 +39,7 @@
|
|||
|
||||
import ChecklistCard from '$lib/components/ChecklistCard.svelte';
|
||||
import ChecklistModal from '$lib/components/ChecklistModal.svelte';
|
||||
import AdventureModal from '$lib/components/AdventureModal.svelte';
|
||||
import LocationModal from '$lib/components/LocationModal.svelte';
|
||||
import TransportationModal from '$lib/components/TransportationModal.svelte';
|
||||
import CardCarousel from '$lib/components/CardCarousel.svelte';
|
||||
import { goto } from '$app/navigation';
|
||||
|
@ -242,14 +242,14 @@
|
|||
let currentView: string = 'itinerary';
|
||||
let currentItineraryView: string = 'date';
|
||||
|
||||
let adventures: Adventure[] = [];
|
||||
let adventures: Location[] = [];
|
||||
|
||||
$: lineData = createLineData(orderedItems);
|
||||
|
||||
// Function to create GeoJSON line data from ordered items
|
||||
function createLineData(
|
||||
items: Array<{
|
||||
item: Adventure | Transportation | Lodging | Note | Checklist;
|
||||
item: Location | Transportation | Lodging | Note | Checklist;
|
||||
start: string;
|
||||
end: string;
|
||||
}>
|
||||
|
@ -333,7 +333,7 @@
|
|||
}
|
||||
|
||||
let orderedItems: Array<{
|
||||
item: Adventure | Transportation | Lodging;
|
||||
item: Location | Transportation | Lodging;
|
||||
type: 'adventure' | 'transportation' | 'lodging';
|
||||
start: string; // ISO date string
|
||||
end: string; // ISO date string
|
||||
|
@ -417,7 +417,7 @@
|
|||
onMount(() => {
|
||||
if (data.props.adventure) {
|
||||
collection = data.props.adventure;
|
||||
adventures = collection.adventures as Adventure[];
|
||||
adventures = collection.locations as Location[];
|
||||
} else {
|
||||
notFound = true;
|
||||
}
|
||||
|
@ -461,7 +461,7 @@
|
|||
adventures = adventures.filter((a) => a.id !== event.detail);
|
||||
}
|
||||
|
||||
async function addAdventure(event: CustomEvent<Adventure>) {
|
||||
async function addAdventure(event: CustomEvent<Location>) {
|
||||
console.log(event.detail);
|
||||
if (adventures.find((a) => a.id === event.detail.id)) {
|
||||
return;
|
||||
|
@ -477,7 +477,7 @@
|
|||
}
|
||||
}
|
||||
|
||||
let res = await fetch(`/api/adventures/${adventure.id}/`, {
|
||||
let res = await fetch(`/api/locations/${adventure.id}/`, {
|
||||
method: 'PATCH',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
|
@ -498,7 +498,7 @@
|
|||
function recomendationToAdventure(recomendation: any) {
|
||||
adventureToEdit = {
|
||||
id: '',
|
||||
user_id: null,
|
||||
user: null,
|
||||
name: recomendation.name,
|
||||
latitude: recomendation.latitude,
|
||||
longitude: recomendation.longitude,
|
||||
|
@ -513,27 +513,27 @@
|
|||
icon: osmTagToEmoji(recomendation.tag),
|
||||
id: '',
|
||||
name: recomendation.tag,
|
||||
user_id: ''
|
||||
user: ''
|
||||
},
|
||||
attachments: []
|
||||
};
|
||||
isAdventureModalOpen = true;
|
||||
isLocationModalOpen = true;
|
||||
}
|
||||
|
||||
let adventureToEdit: Adventure | null = null;
|
||||
let adventureToEdit: Location | null = null;
|
||||
let transportationToEdit: Transportation | null = null;
|
||||
let isShowingLodgingModal: boolean = false;
|
||||
let lodgingToEdit: Lodging | null = null;
|
||||
let isAdventureModalOpen: boolean = false;
|
||||
let isLocationModalOpen: boolean = false;
|
||||
let isNoteModalOpen: boolean = false;
|
||||
let noteToEdit: Note | null;
|
||||
let checklistToEdit: Checklist | null;
|
||||
|
||||
let newType: string;
|
||||
|
||||
function editAdventure(event: CustomEvent<Adventure>) {
|
||||
function editAdventure(event: CustomEvent<Location>) {
|
||||
adventureToEdit = event.detail;
|
||||
isAdventureModalOpen = true;
|
||||
isLocationModalOpen = true;
|
||||
}
|
||||
|
||||
function editTransportation(event: CustomEvent<Transportation>) {
|
||||
|
@ -546,7 +546,7 @@
|
|||
isShowingLodgingModal = true;
|
||||
}
|
||||
|
||||
function saveOrCreateAdventure(event: CustomEvent<Adventure>) {
|
||||
function saveOrCreateAdventure(event: CustomEvent<Location>) {
|
||||
if (adventures.find((adventure) => adventure.id === event.detail.id)) {
|
||||
adventures = adventures.map((adventure) => {
|
||||
if (adventure.id === event.detail.id) {
|
||||
|
@ -557,7 +557,7 @@
|
|||
} else {
|
||||
adventures = [event.detail, ...adventures];
|
||||
}
|
||||
isAdventureModalOpen = false;
|
||||
isLocationModalOpen = false;
|
||||
}
|
||||
|
||||
let isPopupOpen = false;
|
||||
|
@ -585,7 +585,7 @@
|
|||
console.log(filteredRecomendations);
|
||||
console.log(selectedRecomendationTag);
|
||||
}
|
||||
async function getRecomendations(adventure: Adventure) {
|
||||
async function getRecomendations(adventure: Location) {
|
||||
recomendationsData = null;
|
||||
selectedRecomendationTag = '';
|
||||
loadingRecomendations = true;
|
||||
|
@ -688,10 +688,10 @@
|
|||
/>
|
||||
{/if}
|
||||
|
||||
{#if isAdventureModalOpen}
|
||||
<AdventureModal
|
||||
{adventureToEdit}
|
||||
on:close={() => (isAdventureModalOpen = false)}
|
||||
{#if isLocationModalOpen}
|
||||
<LocationModal
|
||||
locationToEdit={adventureToEdit}
|
||||
on:close={() => (isLocationModalOpen = false)}
|
||||
on:save={saveOrCreateAdventure}
|
||||
{collection}
|
||||
/>
|
||||
|
@ -748,7 +748,7 @@
|
|||
</div>
|
||||
{/if}
|
||||
{#if collection && collection.id}
|
||||
{#if data.user && data.user.uuid && (data.user.uuid == collection.user_id || (collection.shared_with && collection.shared_with.includes(data.user.uuid))) && !collection.is_archived}
|
||||
{#if data.user && data.user.uuid && (data.user.uuid == collection.user || (collection.shared_with && collection.shared_with.includes(data.user.uuid))) && !collection.is_archived}
|
||||
<div class="fixed bottom-4 right-4 z-[999]">
|
||||
<div class="flex flex-row items-center justify-center gap-4">
|
||||
<div class="dropdown dropdown-top dropdown-end z-[999]">
|
||||
|
@ -760,7 +760,7 @@
|
|||
tabindex="0"
|
||||
class="dropdown-content z-[1] menu p-4 shadow bg-base-300 text-base-content rounded-box w-52 gap-4"
|
||||
>
|
||||
{#if collection.user_id === data.user.uuid}
|
||||
{#if collection.user === data.user.uuid}
|
||||
<p class="text-center font-bold text-lg">{$t('adventures.link_new')}</p>
|
||||
<button
|
||||
class="btn btn-primary"
|
||||
|
@ -768,18 +768,18 @@
|
|||
isShowingLinkModal = true;
|
||||
}}
|
||||
>
|
||||
{$t('adventures.adventure')}</button
|
||||
{$t('locations.location')}</button
|
||||
>
|
||||
{/if}
|
||||
<p class="text-center font-bold text-lg">{$t('adventures.add_new')}</p>
|
||||
<button
|
||||
class="btn btn-primary"
|
||||
on:click={() => {
|
||||
isAdventureModalOpen = true;
|
||||
isLocationModalOpen = true;
|
||||
adventureToEdit = null;
|
||||
}}
|
||||
>
|
||||
{$t('adventures.adventure')}</button
|
||||
{$t('locations.location')}</button
|
||||
>
|
||||
|
||||
<button
|
||||
|
@ -1032,7 +1032,7 @@
|
|||
{@const dateString = adjustedDate.toISOString().split('T')[0]}
|
||||
|
||||
{@const dayAdventures =
|
||||
groupAdventuresByDate(adventures, new Date(collection.start_date), numberOfDays + 1)[
|
||||
groupLocationsByDate(adventures, new Date(collection.start_date), numberOfDays + 1)[
|
||||
dateString
|
||||
] || []}
|
||||
{@const dayTransportations =
|
||||
|
@ -1069,7 +1069,7 @@
|
|||
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
|
||||
{#if dayAdventures.length > 0}
|
||||
{#each dayAdventures as adventure}
|
||||
<AdventureCard
|
||||
<LocationCard
|
||||
user={data.user}
|
||||
on:edit={editAdventure}
|
||||
on:delete={deleteAdventure}
|
||||
|
@ -1224,7 +1224,7 @@
|
|||
</div>
|
||||
</div>
|
||||
{#if orderedItem.type === 'adventure' && orderedItem.item && 'images' in orderedItem.item}
|
||||
<AdventureCard
|
||||
<LocationCard
|
||||
user={data.user}
|
||||
on:edit={editAdventure}
|
||||
on:delete={deleteAdventure}
|
||||
|
@ -1323,7 +1323,7 @@
|
|||
{/if}
|
||||
<button
|
||||
class="btn btn-neutral btn-wide btn-sm mt-4"
|
||||
on:click={() => goto(`/adventures/${adventure.id}`)}
|
||||
on:click={() => goto(`/locations/${adventure.id}`)}
|
||||
>{$t('map.view_details')}</button
|
||||
>
|
||||
</Popup>
|
||||
|
@ -1418,7 +1418,7 @@
|
|||
<div class="card bg-base-200 shadow-xl my-8 mx-auto w-10/12">
|
||||
<div class="card-body">
|
||||
<h2 class="card-title text-3xl justify-center mb-4">
|
||||
{$t('adventures.adventure_calendar')}
|
||||
{$t('adventures.visit_calendar')}
|
||||
</h2>
|
||||
<Calendar {plugins} {options} />
|
||||
</div>
|
||||
|
@ -1428,7 +1428,7 @@
|
|||
<div class="card bg-base-200 shadow-xl my-8 mx-auto w-10/12">
|
||||
<div class="card-body">
|
||||
<h2 class="card-title text-3xl justify-center mb-4">
|
||||
{$t('recomendations.adventure_recommendations')}
|
||||
{$t('recomendations.location_recommendations')}
|
||||
</h2>
|
||||
{#each adventures as adventure}
|
||||
{#if adventure.longitude && adventure.latitude}
|
||||
|
@ -1439,7 +1439,7 @@
|
|||
{/each}
|
||||
{#if adventures.length == 0}
|
||||
<div class="alert alert-info">
|
||||
<p class="text-center text-lg">{$t('adventures.no_adventures_to_recommendations')}</p>
|
||||
<p class="text-center text-lg">{$t('adventures.no_locations_to_recommendations')}</p>
|
||||
</div>
|
||||
{/if}
|
||||
<div class="mt-4">
|
||||
|
@ -1526,7 +1526,7 @@
|
|||
<button
|
||||
class="btn btn-neutral btn-wide btn-sm mt-4"
|
||||
on:click={() => recomendationToAdventure(recomendation)}
|
||||
>{$t('adventures.create_adventure')}</button
|
||||
>{$t('adventures.create_location')}</button
|
||||
>
|
||||
</Popup>
|
||||
{/if}
|
||||
|
@ -1558,7 +1558,7 @@
|
|||
class="btn btn-primary"
|
||||
on:click={() => recomendationToAdventure(recomendation)}
|
||||
>
|
||||
{$t('adventures.create_adventure')}
|
||||
{$t('adventures.create_location')}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -1587,8 +1587,8 @@
|
|||
<div class="hero-content text-center">
|
||||
<div class="max-w-md">
|
||||
<img src={Lost} alt="Lost" class="w-64 mx-auto mb-8 opacity-80" />
|
||||
<h1 class="text-5xl font-bold text-primary mb-4">{$t('adventures.not_found')}</h1>
|
||||
<p class="text-lg opacity-70 mb-8">{$t('adventures.not_found_desc')}</p>
|
||||
<h1 class="text-5xl font-bold text-primary mb-4">{$t('adventures.location_not_found')}</h1>
|
||||
<p class="text-lg opacity-70 mb-8">{$t('adventures.location_not_found_desc')}</p>
|
||||
<button class="btn btn-primary btn-lg" on:click={() => goto('/')}>
|
||||
{$t('adventures.homepage')}
|
||||
</button>
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import { redirect } from '@sveltejs/kit';
|
||||
import type { PageServerLoad } from './$types';
|
||||
const PUBLIC_SERVER_URL = process.env['PUBLIC_SERVER_URL'];
|
||||
import type { Adventure } from '$lib/types';
|
||||
import type { Location } from '$lib/types';
|
||||
|
||||
const serverEndpoint = PUBLIC_SERVER_URL || 'http://localhost:8000';
|
||||
|
||||
|
@ -9,9 +9,9 @@ export const load = (async (event) => {
|
|||
if (!event.locals.user) {
|
||||
return redirect(302, '/login');
|
||||
} else {
|
||||
let adventures: Adventure[] = [];
|
||||
let adventures: Location[] = [];
|
||||
|
||||
let initialFetch = await event.fetch(`${serverEndpoint}/api/adventures/`, {
|
||||
let initialFetch = await event.fetch(`${serverEndpoint}/api/locations/`, {
|
||||
headers: {
|
||||
Cookie: `sessionid=${event.cookies.get('sessionid')}`
|
||||
},
|
||||
|
@ -41,7 +41,7 @@ export const load = (async (event) => {
|
|||
return redirect(302, '/login');
|
||||
} else {
|
||||
let res = await initialFetch.json();
|
||||
let visited = res.results as Adventure[];
|
||||
let visited = res.results as Location[];
|
||||
// only get the first 3 adventures or less if there are less than 3
|
||||
adventures = visited.slice(0, 3);
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<script lang="ts">
|
||||
import AdventureCard from '$lib/components/AdventureCard.svelte';
|
||||
import LocationCard from '$lib/components/LocationCard.svelte';
|
||||
import type { PageData } from './$types';
|
||||
import { t } from 'svelte-i18n';
|
||||
import { onMount } from 'svelte';
|
||||
|
@ -51,9 +51,9 @@
|
|||
: user?.username}!
|
||||
</h1>
|
||||
<p class="text-lg text-base-content/60 mt-2">
|
||||
{#if stats.adventure_count > 0}
|
||||
{#if stats.location_count > 0}
|
||||
{$t('dashboard.welcome_text_1')}
|
||||
<span class="font-semibold text-primary">{stats.adventure_count}</span>
|
||||
<span class="font-semibold text-primary">{stats.location_count}</span>
|
||||
{$t('dashboard.welcome_text_2')}
|
||||
{:else}
|
||||
{$t('dashboard.welcome_text_3')}
|
||||
|
@ -66,11 +66,11 @@
|
|||
<!-- Quick Action -->
|
||||
<div class="flex flex-col sm:flex-row gap-3">
|
||||
<a
|
||||
href="/adventures"
|
||||
href="/locations"
|
||||
class="btn btn-primary btn-lg gap-2 shadow-lg hover:shadow-xl transition-all duration-300"
|
||||
>
|
||||
<Plus class="w-5 h-5" />
|
||||
{$t('map.add_adventure')}
|
||||
{$t('map.add_location')}
|
||||
</a>
|
||||
<a href="/worldtravel" class="btn btn-outline btn-lg gap-2">
|
||||
<FlagCheckeredVariantIcon class="w-5 h-5" />
|
||||
|
@ -169,16 +169,16 @@
|
|||
<p class="text-base-content/60">{$t('home.latest_travel_experiences')}</p>
|
||||
</div>
|
||||
</div>
|
||||
<a href="/adventures" class="btn btn-ghost gap-2">
|
||||
<a href="/locations" class="btn btn-ghost gap-2">
|
||||
{$t('dashboard.view_all')}
|
||||
<span class="badge badge-primary">{stats.adventure_count}</span>
|
||||
<span class="badge badge-primary">{stats.location_count}</span>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-6">
|
||||
{#each recentAdventures as adventure}
|
||||
<div class="adventure-card">
|
||||
<AdventureCard {adventure} user={data.user} readOnly />
|
||||
<LocationCard {adventure} user={data.user} readOnly />
|
||||
</div>
|
||||
{/each}
|
||||
</div>
|
||||
|
@ -208,11 +208,11 @@
|
|||
|
||||
<div class="flex flex-col sm:flex-row gap-4 justify-center">
|
||||
<a
|
||||
href="/adventures"
|
||||
href="/locations"
|
||||
class="btn btn-primary btn-lg gap-2 shadow-lg hover:shadow-xl transition-all duration-300"
|
||||
>
|
||||
<Plus class="w-5 h-5" />
|
||||
{$t('map.add_adventure')}
|
||||
{$t('map.add_location')}
|
||||
</a>
|
||||
<a href="/worldtravel" class="btn btn-outline btn-lg gap-2">
|
||||
<FlagCheckeredVariantIcon class="w-5 h-5" />
|
||||
|
|
|
@ -1,22 +0,0 @@
|
|||
const PUBLIC_SERVER_URL = process.env['PUBLIC_SERVER_URL'];
|
||||
const endpoint = PUBLIC_SERVER_URL || 'http://localhost:8000';
|
||||
|
||||
/** @type {import('./$types').RequestHandler} */
|
||||
export async function GET(event) {
|
||||
let sessionid = event.cookies.get('sessionid');
|
||||
let fileName = event.params.file;
|
||||
let res = await fetch(`${endpoint}/media/attachments/${fileName}`, {
|
||||
method: 'GET',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
Cookie: `sessionid=${sessionid}`
|
||||
}
|
||||
});
|
||||
let data = await res.text();
|
||||
return new Response(data, {
|
||||
status: res.status,
|
||||
headers: {
|
||||
'Content-Type': 'application/xml'
|
||||
}
|
||||
});
|
||||
}
|
99
frontend/src/routes/locations/+page.server.ts
Normal file
99
frontend/src/routes/locations/+page.server.ts
Normal file
|
@ -0,0 +1,99 @@
|
|||
import { redirect } from '@sveltejs/kit';
|
||||
import type { PageServerLoad } from './$types';
|
||||
const PUBLIC_SERVER_URL = process.env['PUBLIC_SERVER_URL'];
|
||||
import type { Location } from '$lib/types';
|
||||
|
||||
import type { Actions } from '@sveltejs/kit';
|
||||
import { fetchCSRFToken } from '$lib/index.server';
|
||||
|
||||
const serverEndpoint = PUBLIC_SERVER_URL || 'http://localhost:8000';
|
||||
|
||||
export const load = (async (event) => {
|
||||
if (!event.locals.user) {
|
||||
return redirect(302, '/login');
|
||||
} else {
|
||||
let count = 0;
|
||||
let adventures: Location[] = [];
|
||||
|
||||
let typeString = event.url.searchParams.get('types');
|
||||
|
||||
// If no type is specified, default to 'all'
|
||||
if (!typeString) {
|
||||
typeString = 'all';
|
||||
}
|
||||
|
||||
const include_collections = event.url.searchParams.get('include_collections') || 'false';
|
||||
const order_by = event.url.searchParams.get('order_by') || 'updated_at';
|
||||
const order_direction = event.url.searchParams.get('order_direction') || 'asc';
|
||||
const page = event.url.searchParams.get('page') || '1';
|
||||
const is_visited = event.url.searchParams.get('is_visited') || 'all';
|
||||
|
||||
let initialFetch = await event.fetch(
|
||||
`${serverEndpoint}/api/locations/filtered?types=${typeString}&order_by=${order_by}&order_direction=${order_direction}&include_collections=${include_collections}&page=${page}&is_visited=${is_visited}`,
|
||||
{
|
||||
headers: {
|
||||
Cookie: `sessionid=${event.cookies.get('sessionid')}`
|
||||
},
|
||||
credentials: 'include'
|
||||
}
|
||||
);
|
||||
|
||||
if (!initialFetch.ok) {
|
||||
let error_message = await initialFetch.json();
|
||||
console.error(error_message);
|
||||
console.error('Failed to fetch visited adventures');
|
||||
return redirect(302, '/login');
|
||||
} else {
|
||||
let res = await initialFetch.json();
|
||||
let visited = res.results as Location[];
|
||||
|
||||
count = res.count;
|
||||
adventures = [...adventures, ...visited];
|
||||
}
|
||||
|
||||
return {
|
||||
props: {
|
||||
adventures,
|
||||
count
|
||||
}
|
||||
};
|
||||
}
|
||||
}) satisfies PageServerLoad;
|
||||
|
||||
export const actions: Actions = {
|
||||
image: async (event) => {
|
||||
let formData = await event.request.formData();
|
||||
let csrfToken = await fetchCSRFToken();
|
||||
let sessionId = event.cookies.get('sessionid');
|
||||
let res = await fetch(`${serverEndpoint}/api/images/`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
Cookie: `csrftoken=${csrfToken}; sessionid=${sessionId}`,
|
||||
'X-CSRFToken': csrfToken,
|
||||
Referer: event.url.origin // Include Referer header
|
||||
},
|
||||
body: formData
|
||||
});
|
||||
let data = await res.json();
|
||||
return data;
|
||||
},
|
||||
attachment: async (event) => {
|
||||
let formData = await event.request.formData();
|
||||
let csrfToken = await fetchCSRFToken();
|
||||
let sessionId = event.cookies.get('sessionid');
|
||||
let res = await fetch(`${serverEndpoint}/api/attachments/`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
Cookie: `csrftoken=${csrfToken}; sessionid=${sessionId}`,
|
||||
'X-CSRFToken': csrfToken,
|
||||
Referer: event.url.origin // Include Referer header
|
||||
},
|
||||
body: formData
|
||||
});
|
||||
let data = await res.json();
|
||||
|
||||
console.log(res);
|
||||
console.log(data);
|
||||
return data;
|
||||
}
|
||||
};
|
|
@ -2,12 +2,12 @@
|
|||
import { enhance, deserialize } from '$app/forms';
|
||||
import { goto } from '$app/navigation';
|
||||
import { page } from '$app/stores';
|
||||
import AdventureCard from '$lib/components/AdventureCard.svelte';
|
||||
import AdventureModal from '$lib/components/AdventureModal.svelte';
|
||||
import LocationCard from '$lib/components/LocationCard.svelte';
|
||||
import LocationModal from '$lib/components/LocationModal.svelte';
|
||||
import CategoryFilterDropdown from '$lib/components/CategoryFilterDropdown.svelte';
|
||||
import CategoryModal from '$lib/components/CategoryModal.svelte';
|
||||
import NotFound from '$lib/components/NotFound.svelte';
|
||||
import type { Adventure, Category } from '$lib/types';
|
||||
import type { Location, Category } from '$lib/types';
|
||||
import { t } from 'svelte-i18n';
|
||||
|
||||
import Plus from '~icons/mdi/plus';
|
||||
|
@ -23,7 +23,7 @@
|
|||
|
||||
export let data: any;
|
||||
|
||||
let adventures: Adventure[] = data.props.adventures || [];
|
||||
let adventures: Location[] = data.props.adventures || [];
|
||||
|
||||
let currentSort = {
|
||||
order_by: '',
|
||||
|
@ -41,8 +41,8 @@
|
|||
|
||||
let is_category_modal_open: boolean = false;
|
||||
let typeString: string = '';
|
||||
let adventureToEdit: Adventure | null = null;
|
||||
let isAdventureModalOpen: boolean = false;
|
||||
let adventureToEdit: Location | null = null;
|
||||
let isLocationModalOpen: boolean = false;
|
||||
let sidebarOpen = false;
|
||||
|
||||
// Reactive statements
|
||||
|
@ -130,7 +130,7 @@
|
|||
adventures = adventures.filter((adventure) => adventure.id !== event.detail);
|
||||
}
|
||||
|
||||
function saveOrCreate(event: CustomEvent<Adventure>) {
|
||||
function saveOrCreate(event: CustomEvent<Location>) {
|
||||
if (adventures.find((adventure) => adventure.id === event.detail.id)) {
|
||||
adventures = adventures.map((adventure) => {
|
||||
if (adventure.id === event.detail.id) {
|
||||
|
@ -141,12 +141,12 @@
|
|||
} else {
|
||||
adventures = [event.detail, ...adventures];
|
||||
}
|
||||
isAdventureModalOpen = false;
|
||||
isLocationModalOpen = false;
|
||||
}
|
||||
|
||||
function editAdventure(event: CustomEvent<Adventure>) {
|
||||
function editAdventure(event: CustomEvent<Location>) {
|
||||
adventureToEdit = event.detail;
|
||||
isAdventureModalOpen = true;
|
||||
isLocationModalOpen = true;
|
||||
}
|
||||
|
||||
function toggleSidebar() {
|
||||
|
@ -163,14 +163,14 @@
|
|||
</script>
|
||||
|
||||
<svelte:head>
|
||||
<title>{$t('navbar.adventures')}</title>
|
||||
<title>{$t('locations.locations')}</title>
|
||||
<meta name="description" content="View your completed and planned adventures." />
|
||||
</svelte:head>
|
||||
|
||||
{#if isAdventureModalOpen}
|
||||
<AdventureModal
|
||||
{adventureToEdit}
|
||||
on:close={() => (isAdventureModalOpen = false)}
|
||||
{#if isLocationModalOpen}
|
||||
<LocationModal
|
||||
locationToEdit={adventureToEdit}
|
||||
on:close={() => (isLocationModalOpen = false)}
|
||||
on:save={saveOrCreate}
|
||||
/>
|
||||
{/if}
|
||||
|
@ -198,11 +198,11 @@
|
|||
</div>
|
||||
<div>
|
||||
<h1 class="text-3xl font-bold bg-clip-text text-primary">
|
||||
{$t('navbar.my_adventures')}
|
||||
{$t('locations.my_locations')}
|
||||
</h1>
|
||||
<p class="text-sm text-base-content/60">
|
||||
{count}
|
||||
{$t('navbar.adventures')} • {getVisitedCount()}
|
||||
{$t('locations.locations')} • {getVisitedCount()}
|
||||
{$t('adventures.visited')} • {getPlannedCount()}
|
||||
{$t('adventures.planned')}
|
||||
</p>
|
||||
|
@ -241,7 +241,7 @@
|
|||
<Compass class="w-16 h-16 text-base-content/30" />
|
||||
</div>
|
||||
<h3 class="text-xl font-semibold text-base-content/70 mb-2">
|
||||
{$t('adventures.no_adventures_found')}
|
||||
{$t('adventures.no_locations_found')}
|
||||
</h3>
|
||||
<p class="text-base-content/50 text-center max-w-md">
|
||||
{$t('adventures.no_adventures_message')}
|
||||
|
@ -250,11 +250,11 @@
|
|||
class="btn btn-primary btn-wide mt-6 gap-2"
|
||||
on:click={() => {
|
||||
adventureToEdit = null;
|
||||
isAdventureModalOpen = true;
|
||||
isLocationModalOpen = true;
|
||||
}}
|
||||
>
|
||||
<Plus class="w-5 h-5" />
|
||||
{$t('adventures.create_adventure')}
|
||||
{$t('adventures.create_location')}
|
||||
</button>
|
||||
</div>
|
||||
{:else}
|
||||
|
@ -263,7 +263,7 @@
|
|||
class="grid grid-cols-1 sm:grid-cols-1 md:grid-cols-2 lg:grid-cols-2 xl:grid-cols-3 gap-6"
|
||||
>
|
||||
{#each adventures as adventure}
|
||||
<AdventureCard
|
||||
<LocationCard
|
||||
user={data.user}
|
||||
{adventure}
|
||||
on:delete={deleteAdventure}
|
||||
|
@ -470,7 +470,7 @@
|
|||
class="checkbox checkbox-primary"
|
||||
checked={currentSort.includeCollections}
|
||||
/>
|
||||
<span class="label-text">{$t('adventures.collection_adventures')}</span>
|
||||
<span class="label-text">{$t('adventures.collection_locations')}</span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
|
@ -503,12 +503,12 @@
|
|||
<button
|
||||
class="btn btn-primary gap-2 w-full"
|
||||
on:click={() => {
|
||||
isAdventureModalOpen = true;
|
||||
isLocationModalOpen = true;
|
||||
adventureToEdit = null;
|
||||
}}
|
||||
>
|
||||
<Compass class="w-5 h-5" />
|
||||
{$t('adventures.adventure')}
|
||||
{$t('locations.location')}
|
||||
</button>
|
||||
</ul>
|
||||
</div>
|
76
frontend/src/routes/locations/[id]/+page.server.ts
Normal file
76
frontend/src/routes/locations/[id]/+page.server.ts
Normal file
|
@ -0,0 +1,76 @@
|
|||
import type { PageServerLoad } from './$types';
|
||||
const PUBLIC_SERVER_URL = process.env['PUBLIC_SERVER_URL'];
|
||||
import type { AdditionalLocation, Location, Collection } from '$lib/types';
|
||||
const endpoint = PUBLIC_SERVER_URL || 'http://localhost:8000';
|
||||
|
||||
export const load = (async (event) => {
|
||||
const id = event.params as { id: string };
|
||||
let request = await fetch(`${endpoint}/api/locations/${id.id}/additional-info/`, {
|
||||
headers: {
|
||||
Cookie: `sessionid=${event.cookies.get('sessionid')}`
|
||||
},
|
||||
credentials: 'include'
|
||||
});
|
||||
if (!request.ok) {
|
||||
console.error('Failed to fetch adventure ' + id.id);
|
||||
return {
|
||||
props: {
|
||||
adventure: null
|
||||
}
|
||||
};
|
||||
} else {
|
||||
let adventure = (await request.json()) as AdditionalLocation;
|
||||
|
||||
return {
|
||||
props: {
|
||||
adventure
|
||||
}
|
||||
};
|
||||
}
|
||||
}) satisfies PageServerLoad;
|
||||
|
||||
import { redirect, type Actions } from '@sveltejs/kit';
|
||||
import { fetchCSRFToken } from '$lib/index.server';
|
||||
|
||||
const serverEndpoint = PUBLIC_SERVER_URL || 'http://localhost:8000';
|
||||
|
||||
export const actions: Actions = {
|
||||
delete: async (event) => {
|
||||
const id = event.params as { id: string };
|
||||
const adventureId = id.id;
|
||||
|
||||
if (!event.locals.user) {
|
||||
return redirect(302, '/login');
|
||||
}
|
||||
if (!adventureId) {
|
||||
return {
|
||||
status: 400,
|
||||
error: new Error('Bad request')
|
||||
};
|
||||
}
|
||||
|
||||
let csrfToken = await fetchCSRFToken();
|
||||
|
||||
let res = await fetch(`${serverEndpoint}/api/locations/${event.params.id}`, {
|
||||
method: 'DELETE',
|
||||
headers: {
|
||||
Referer: event.url.origin, // Include Referer header
|
||||
Cookie: `sessionid=${event.cookies.get('sessionid')};
|
||||
csrftoken=${csrfToken}`,
|
||||
'X-CSRFToken': csrfToken
|
||||
},
|
||||
credentials: 'include'
|
||||
});
|
||||
console.log(res);
|
||||
if (!res.ok) {
|
||||
return {
|
||||
status: res.status,
|
||||
error: new Error('Failed to delete adventure')
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
status: 204
|
||||
};
|
||||
}
|
||||
}
|
||||
};
|
|
@ -1,5 +1,5 @@
|
|||
<script lang="ts">
|
||||
import type { AdditionalAdventure } from '$lib/types';
|
||||
import type { AdditionalLocation } from '$lib/types';
|
||||
import { onMount } from 'svelte';
|
||||
import type { PageData } from './$types';
|
||||
import { goto } from '$app/navigation';
|
||||
|
@ -16,7 +16,7 @@
|
|||
import LightbulbOn from '~icons/mdi/lightbulb-on';
|
||||
import WeatherSunset from '~icons/mdi/weather-sunset';
|
||||
import ClipboardList from '~icons/mdi/clipboard-list';
|
||||
import AdventureModal from '$lib/components/AdventureModal.svelte';
|
||||
import LocationModal from '$lib/components/LocationModal.svelte';
|
||||
import ImageDisplayModal from '$lib/components/ImageDisplayModal.svelte';
|
||||
import AttachmentCard from '$lib/components/AttachmentCard.svelte';
|
||||
import { getBasemapUrl, isAllDay } from '$lib';
|
||||
|
@ -45,7 +45,9 @@
|
|||
const promises = gpxfiles.map(async (gpxfile) => {
|
||||
try {
|
||||
const gpxFileName = gpxfile.split('/').pop();
|
||||
const res = await fetch('/gpx/' + gpxFileName);
|
||||
const res = await fetch(gpxfile, {
|
||||
credentials: 'include'
|
||||
});
|
||||
|
||||
if (!res.ok) {
|
||||
console.error(`Failed to fetch GPX file: ${gpxFileName}`);
|
||||
|
@ -77,7 +79,7 @@
|
|||
export let data: PageData;
|
||||
console.log(data);
|
||||
|
||||
let adventure: AdditionalAdventure;
|
||||
let adventure: AdditionalLocation;
|
||||
let currentSlide = 0;
|
||||
|
||||
function goToSlide(index: number) {
|
||||
|
@ -106,7 +108,7 @@
|
|||
await getGpxFiles();
|
||||
});
|
||||
|
||||
async function saveEdit(event: CustomEvent<AdditionalAdventure>) {
|
||||
async function saveEdit(event: CustomEvent<AdditionalLocation>) {
|
||||
adventure = event.detail;
|
||||
isEditModalOpen = false;
|
||||
geojson = null;
|
||||
|
@ -119,8 +121,8 @@
|
|||
<div class="hero-content text-center">
|
||||
<div class="max-w-md">
|
||||
<img src={Lost} alt="Lost" class="w-64 mx-auto mb-8 opacity-80" />
|
||||
<h1 class="text-5xl font-bold text-primary mb-4">{$t('adventures.not_found')}</h1>
|
||||
<p class="text-lg opacity-70 mb-8">{$t('adventures.not_found_desc')}</p>
|
||||
<h1 class="text-5xl font-bold text-primary mb-4">{$t('adventures.location_not_found')}</h1>
|
||||
<p class="text-lg opacity-70 mb-8">{$t('adventures.location_not_found_desc')}</p>
|
||||
<button class="btn btn-primary btn-lg" on:click={() => goto('/')}>
|
||||
{$t('adventures.homepage')}
|
||||
</button>
|
||||
|
@ -130,8 +132,8 @@
|
|||
{/if}
|
||||
|
||||
{#if isEditModalOpen}
|
||||
<AdventureModal
|
||||
adventureToEdit={adventure}
|
||||
<LocationModal
|
||||
locationToEdit={adventure}
|
||||
on:close={() => (isEditModalOpen = false)}
|
||||
on:save={saveEdit}
|
||||
/>
|
||||
|
@ -150,7 +152,7 @@
|
|||
{/if}
|
||||
|
||||
{#if adventure}
|
||||
{#if data.user && data.user.uuid == adventure.user_id}
|
||||
{#if data.user?.uuid && adventure.user?.uuid && data.user.uuid === adventure.user.uuid}
|
||||
<div class="fixed bottom-6 right-6 z-50">
|
||||
<button
|
||||
class="btn btn-primary btn-circle w-16 h-16 shadow-xl hover:shadow-2xl transition-all duration-300 hover:scale-110"
|
||||
|
@ -649,11 +651,11 @@
|
|||
<div class="card-body">
|
||||
<h3 class="card-title text-lg mb-4">ℹ️ {$t('adventures.basic_information')}</h3>
|
||||
<div class="space-y-3">
|
||||
{#if adventure.activity_types && adventure.activity_types?.length > 0}
|
||||
{#if adventure.tags && adventure.tags?.length > 0}
|
||||
<div>
|
||||
<div class="text-sm opacity-70 mb-1">{$t('adventures.tags')}</div>
|
||||
<div class="flex flex-wrap gap-1">
|
||||
{#each adventure.activity_types as activity}
|
||||
{#each adventure.tags as activity}
|
||||
<span class="badge badge-sm badge-outline">{activity}</span>
|
||||
{/each}
|
||||
</div>
|
|
@ -1,7 +1,7 @@
|
|||
import { redirect } from '@sveltejs/kit';
|
||||
import type { PageServerLoad } from './$types';
|
||||
const PUBLIC_SERVER_URL = process.env['PUBLIC_SERVER_URL'];
|
||||
import type { Adventure, VisitedRegion } from '$lib/types';
|
||||
import type { Location, VisitedRegion } from '$lib/types';
|
||||
const endpoint = PUBLIC_SERVER_URL || 'http://localhost:8000';
|
||||
|
||||
export const load = (async (event) => {
|
||||
|
@ -9,7 +9,7 @@ export const load = (async (event) => {
|
|||
return redirect(302, '/login');
|
||||
} else {
|
||||
let sessionId = event.cookies.get('sessionid');
|
||||
let visitedFetch = await fetch(`${endpoint}/api/adventures/all/?include_collections=true`, {
|
||||
let visitedFetch = await fetch(`${endpoint}/api/locations/all/?include_collections=true`, {
|
||||
headers: {
|
||||
Cookie: `sessionid=${sessionId}`
|
||||
}
|
||||
|
@ -22,7 +22,7 @@ export const load = (async (event) => {
|
|||
});
|
||||
|
||||
let visitedRegions = (await visitedRegionsFetch.json()) as VisitedRegion[];
|
||||
let adventures = (await visitedFetch.json()) as Adventure[];
|
||||
let adventures = (await visitedFetch.json()) as Location[];
|
||||
|
||||
if (!visitedRegionsFetch.ok) {
|
||||
console.error('Failed to fetch visited regions');
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
<script lang="ts">
|
||||
import AdventureModal from '$lib/components/AdventureModal.svelte';
|
||||
import LocationModal from '$lib/components/LocationModal.svelte';
|
||||
import { DefaultMarker, MapEvents, MapLibre, Popup, Marker } from 'svelte-maplibre';
|
||||
import { t } from 'svelte-i18n';
|
||||
import type { Adventure, VisitedRegion } from '$lib/types.js';
|
||||
import type { Location, VisitedRegion } from '$lib/types.js';
|
||||
import CardCarousel from '$lib/components/CardCarousel.svelte';
|
||||
import { goto } from '$app/navigation';
|
||||
import { getBasemapUrl } from '$lib';
|
||||
|
@ -17,7 +17,7 @@
|
|||
import Pin from '~icons/mdi/map-marker';
|
||||
import Calendar from '~icons/mdi/calendar';
|
||||
import Category from '~icons/mdi/shape';
|
||||
import Location from '~icons/mdi/crosshairs-gps';
|
||||
import LocationIcon from '~icons/mdi/crosshairs-gps';
|
||||
|
||||
export let data;
|
||||
|
||||
|
@ -28,7 +28,7 @@
|
|||
export let initialLatLng: { lat: number; lng: number } | null = null;
|
||||
|
||||
let visitedRegions: VisitedRegion[] = data.props.visitedRegions;
|
||||
let adventures: Adventure[] = data.props.adventures;
|
||||
let adventures: Location[] = data.props.adventures;
|
||||
|
||||
let filteredAdventures = adventures;
|
||||
|
||||
|
@ -123,13 +123,13 @@
|
|||
</div>
|
||||
<div>
|
||||
<h1 class="text-3xl font-bold bg-clip-text text-primary">
|
||||
{$t('map.adventure_map')}
|
||||
{$t('map.location_map')}
|
||||
</h1>
|
||||
<p class="text-sm text-base-content/60">
|
||||
{filteredAdventures.length}
|
||||
{$t('worldtravel.of')}
|
||||
{totalAdventures}
|
||||
{$t('map.adventures_shown')}
|
||||
{$t('map.locations_shown')}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -137,7 +137,7 @@
|
|||
|
||||
<!-- Quick Stats -->
|
||||
<div class="hidden md:flex items-center gap-2">
|
||||
<div class="stats stats-horizontal bg-base-100 shadow-lg">
|
||||
<div class="stats stats-horizontal bg-base-200/50 border border-base-300/50">
|
||||
<div class="stat py-2 px-4">
|
||||
<div class="stat-title text-xs">{$t('adventures.visited')}</div>
|
||||
<div class="stat-value text-lg text-success">{visitedAdventures}</div>
|
||||
|
@ -157,7 +157,7 @@
|
|||
{#if newMarker}
|
||||
<button type="button" class="btn btn-primary btn-sm gap-2" on:click={newAdventure}>
|
||||
<Plus class="w-4 h-4" />
|
||||
{$t('map.add_adventure_at_marker')}
|
||||
{$t('map.add_location_at_marker')}
|
||||
</button>
|
||||
<button type="button" class="btn btn-ghost btn-sm gap-2" on:click={clearMarker}>
|
||||
<Clear class="w-4 h-4" />
|
||||
|
@ -170,7 +170,7 @@
|
|||
on:click={() => (createModalOpen = true)}
|
||||
>
|
||||
<Plus class="w-4 h-4" />
|
||||
{$t('map.add_adventure')}
|
||||
{$t('map.add_location')}
|
||||
</button>
|
||||
{/if}
|
||||
</div>
|
||||
|
@ -262,13 +262,13 @@
|
|||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
<Location class="w-4 h-4" />
|
||||
<LocationIcon class="w-4 h-4" />
|
||||
{$t('adventures.open_in_maps')}
|
||||
</a>
|
||||
{/if}
|
||||
<button
|
||||
class="btn btn-primary btn-sm gap-2"
|
||||
on:click={() => goto(`/adventures/${adventure.id}`)}
|
||||
on:click={() => goto(`/locations/${adventure.id}`)}
|
||||
>
|
||||
<Eye class="w-4 h-4" />
|
||||
{$t('map.view_details')}
|
||||
|
@ -293,7 +293,7 @@
|
|||
lngLat={[region.longitude, region.latitude]}
|
||||
class="grid h-8 w-8 place-items-center rounded-full border border-gray-200 bg-green-300 hover:bg-green-400 text-black shadow-lg cursor-pointer transition-transform hover:scale-110"
|
||||
>
|
||||
<Location class="w-5 h-5 text-green-700" />
|
||||
<LocationIcon class="w-5 h-5 text-green-700" />
|
||||
<Popup openOn="click" offset={[0, -10]}>
|
||||
<div class="space-y-2">
|
||||
<div class="text-lg text-black font-bold">{region.name}</div>
|
||||
|
@ -405,7 +405,7 @@
|
|||
class="checkbox checkbox-accent checkbox-sm"
|
||||
/>
|
||||
<span class="label-text flex items-center gap-2">
|
||||
<Location class="w-4 h-4" />
|
||||
<LocationIcon class="w-4 h-4" />
|
||||
{$t('map.show_visited_regions')} ({totalRegions})
|
||||
</span>
|
||||
</label>
|
||||
|
@ -427,7 +427,7 @@
|
|||
</div>
|
||||
<button type="button" class="btn btn-primary w-full gap-2" on:click={newAdventure}>
|
||||
<Plus class="w-4 h-4" />
|
||||
{$t('map.add_adventure_at_marker')}
|
||||
{$t('map.add_location_at_marker')}
|
||||
</button>
|
||||
<button type="button" class="btn btn-ghost w-full gap-2" on:click={clearMarker}>
|
||||
<Clear class="w-4 h-4" />
|
||||
|
@ -437,7 +437,7 @@
|
|||
{:else}
|
||||
<div class="space-y-3">
|
||||
<p class="text-sm text-base-content/60">
|
||||
{$t('map.place_marker_desc')}
|
||||
{$t('map.place_marker_desc_location')}
|
||||
</p>
|
||||
<button
|
||||
type="button"
|
||||
|
@ -445,7 +445,7 @@
|
|||
on:click={() => (createModalOpen = true)}
|
||||
>
|
||||
<Plus class="w-4 h-4" />
|
||||
{$t('map.add_adventure')}
|
||||
{$t('map.add_location')}
|
||||
</button>
|
||||
</div>
|
||||
{/if}
|
||||
|
@ -457,7 +457,7 @@
|
|||
</div>
|
||||
|
||||
{#if createModalOpen}
|
||||
<AdventureModal
|
||||
<LocationModal
|
||||
on:close={() => (createModalOpen = false)}
|
||||
on:save={createNewAdventure}
|
||||
{initialLatLng}
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
<script lang="ts">
|
||||
export let data;
|
||||
import AdventureCard from '$lib/components/AdventureCard.svelte';
|
||||
import LocationCard from '$lib/components/LocationCard.svelte';
|
||||
import CollectionCard from '$lib/components/CollectionCard.svelte';
|
||||
import type { Adventure, Collection, User } from '$lib/types.js';
|
||||
import type { Location, Collection, User } from '$lib/types.js';
|
||||
import { t } from 'svelte-i18n';
|
||||
import { onMount } from 'svelte';
|
||||
import { gsap } from 'gsap';
|
||||
|
@ -23,7 +23,7 @@
|
|||
visited_country_count: number;
|
||||
total_regions: number;
|
||||
trips_count: number;
|
||||
adventure_count: number;
|
||||
location_count: number;
|
||||
visited_region_count: number;
|
||||
total_countries: number;
|
||||
visited_city_count: number;
|
||||
|
@ -31,7 +31,7 @@
|
|||
} | null;
|
||||
|
||||
const user: User = data.user;
|
||||
const adventures: Adventure[] = data.adventures;
|
||||
const adventures: Location[] = data.adventures;
|
||||
const collections: Collection[] = data.collections;
|
||||
stats = data.stats || null;
|
||||
|
||||
|
@ -48,34 +48,34 @@
|
|||
|
||||
// Achievement levels
|
||||
$: achievementLevel =
|
||||
(stats?.adventure_count ?? 0) >= 100
|
||||
(stats?.location_count ?? 0) >= 100
|
||||
? 'Legendary Explorer'
|
||||
: (stats?.adventure_count ?? 0) >= 75
|
||||
: (stats?.location_count ?? 0) >= 75
|
||||
? 'World Wanderer'
|
||||
: (stats?.adventure_count ?? 0) >= 50
|
||||
: (stats?.location_count ?? 0) >= 50
|
||||
? 'Explorer Master'
|
||||
: (stats?.adventure_count ?? 0) >= 35
|
||||
: (stats?.location_count ?? 0) >= 35
|
||||
? 'Globetrotter'
|
||||
: (stats?.adventure_count ?? 0) >= 25
|
||||
: (stats?.location_count ?? 0) >= 25
|
||||
? 'Seasoned Traveler'
|
||||
: (stats?.adventure_count ?? 0) >= 15
|
||||
: (stats?.location_count ?? 0) >= 15
|
||||
? 'Adventure Seeker'
|
||||
: (stats?.adventure_count ?? 0) >= 10
|
||||
: (stats?.location_count ?? 0) >= 10
|
||||
? 'Trailblazer'
|
||||
: (stats?.adventure_count ?? 0) >= 5
|
||||
: (stats?.location_count ?? 0) >= 5
|
||||
? 'Journey Starter'
|
||||
: (stats?.adventure_count ?? 0) >= 1
|
||||
: (stats?.location_count ?? 0) >= 1
|
||||
? 'Travel Enthusiast'
|
||||
: 'New Explorer';
|
||||
|
||||
$: achievementColor =
|
||||
(stats?.adventure_count ?? 0) >= 50
|
||||
(stats?.location_count ?? 0) >= 50
|
||||
? 'text-warning'
|
||||
: (stats?.adventure_count ?? 0) >= 25
|
||||
: (stats?.location_count ?? 0) >= 25
|
||||
? 'text-success'
|
||||
: (stats?.adventure_count ?? 0) >= 10
|
||||
: (stats?.location_count ?? 0) >= 10
|
||||
? 'text-info'
|
||||
: (stats?.adventure_count ?? 0) >= 5
|
||||
: (stats?.location_count ?? 0) >= 5
|
||||
? 'text-secondary'
|
||||
: 'text-primary';
|
||||
</script>
|
||||
|
@ -159,7 +159,7 @@
|
|||
{/if}
|
||||
|
||||
<!-- User rank achievement -->
|
||||
{#if stats && stats.adventure_count > 0}
|
||||
{#if stats && stats.location_count > 0}
|
||||
<div class="flex items-center justify-center gap-2 text-base-content/70">
|
||||
<Award class="w-5 h-5" />
|
||||
<span class={`text-lg ${achievementColor}`}>{achievementLevel}</span>
|
||||
|
@ -189,9 +189,9 @@
|
|||
<div class="flex items-center justify-between">
|
||||
<div>
|
||||
<div class="text-primary/70 font-medium text-sm uppercase tracking-wide">
|
||||
{$t('navbar.adventures')}
|
||||
{$t('locations.locations')}
|
||||
</div>
|
||||
<div class="text-4xl font-bold text-primary">{stats.adventure_count}</div>
|
||||
<div class="text-4xl font-bold text-primary">{stats.location_count}</div>
|
||||
<div class="text-primary/60 mt-2 flex items-center gap-1">
|
||||
<TrendingUp class="w-4 h-4" />
|
||||
{achievementLevel}
|
||||
|
@ -331,14 +331,14 @@
|
|||
<Airplane class="w-6 h-6 text-primary" />
|
||||
</div>
|
||||
<div>
|
||||
<h2 class="text-3xl font-bold">{$t('auth.user_adventures')}</h2>
|
||||
<p class="text-base-content/60">{$t('profile.public_adventure_experiences')}</p>
|
||||
<h2 class="text-3xl font-bold">{$t('auth.user_locations')}</h2>
|
||||
<p class="text-base-content/60">{$t('profile.public_location_experiences')}</p>
|
||||
</div>
|
||||
</div>
|
||||
{#if adventures && adventures.length > 0}
|
||||
<div class="badge badge-primary badge-lg">
|
||||
{adventures.length}
|
||||
{adventures.length === 1 ? $t('adventures.adventure') : $t('navbar.adventures')}
|
||||
{adventures.length === 1 ? $t('locations.location') : $t('locations.locations')}
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
|
@ -350,7 +350,7 @@
|
|||
<Airplane class="w-16 h-16 text-base-content/30" />
|
||||
</div>
|
||||
<h3 class="text-xl font-bold text-base-content/70 mb-2">
|
||||
{$t('auth.no_public_adventures')}
|
||||
{$t('auth.no_public_locations')}
|
||||
</h3>
|
||||
<p class="text-base-content/50">{$t('profile.no_shared_adventures')}</p>
|
||||
</div>
|
||||
|
@ -359,7 +359,7 @@
|
|||
<div class="grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-6">
|
||||
{#each adventures as adventure}
|
||||
<div class="adventure-card">
|
||||
<AdventureCard {adventure} user={null} />
|
||||
<LocationCard {adventure} user={null} />
|
||||
</div>
|
||||
{/each}
|
||||
</div>
|
||||
|
|
|
@ -33,7 +33,7 @@ export const load = (async (event) => {
|
|||
let data = await res.json();
|
||||
|
||||
return {
|
||||
adventures: data.adventures,
|
||||
locations: data.locations,
|
||||
collections: data.collections,
|
||||
users: data.users,
|
||||
countries: data.countries,
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<script lang="ts">
|
||||
import AdventureCard from '$lib/components/AdventureCard.svelte';
|
||||
import LocationCard from '$lib/components/LocationCard.svelte';
|
||||
import RegionCard from '$lib/components/RegionCard.svelte';
|
||||
import CityCard from '$lib/components/CityCard.svelte';
|
||||
import CountryCard from '$lib/components/CountryCard.svelte';
|
||||
|
@ -9,7 +9,7 @@
|
|||
import type { PageData } from './$types';
|
||||
import { t } from 'svelte-i18n';
|
||||
import type {
|
||||
Adventure,
|
||||
Location,
|
||||
Collection,
|
||||
User,
|
||||
Country,
|
||||
|
@ -27,7 +27,7 @@
|
|||
$: query = $page.url.searchParams.get('query') ?? '';
|
||||
|
||||
// Assign updated results from data, so when data changes, the displayed items update:
|
||||
$: adventures = data.adventures as Adventure[];
|
||||
$: locations = data.locations as Location[];
|
||||
$: collections = data.collections as Collection[];
|
||||
$: users = data.users as User[];
|
||||
$: countries = data.countries as Country[];
|
||||
|
@ -38,7 +38,7 @@
|
|||
|
||||
// new stats
|
||||
$: totalResults =
|
||||
adventures.length +
|
||||
locations.length +
|
||||
collections.length +
|
||||
users.length +
|
||||
countries.length +
|
||||
|
@ -64,11 +64,13 @@
|
|||
<h1
|
||||
class="text-3xl font-bold bg-gradient-to-r from-primary to-secondary bg-clip-text text-transparent"
|
||||
>
|
||||
Search{query ? `: ${query}` : ''}
|
||||
{$t('navbar.search')}{query ? `: ${query}` : ''}
|
||||
</h1>
|
||||
{#if hasResults}
|
||||
<p class="text-sm text-base-content/60">
|
||||
{totalResults} result{totalResults !== 1 ? 's' : ''} found
|
||||
{totalResults}
|
||||
{totalResults !== 1 ? $t('search.results') : $t('search.result')}
|
||||
{$t('search.found')}
|
||||
</p>
|
||||
{/if}
|
||||
</div>
|
||||
|
@ -87,22 +89,22 @@
|
|||
{$t('adventures.no_results')}
|
||||
</h3>
|
||||
<p class="text-base-content/50 text-center max-w-md">
|
||||
Try searching for adventures, collections, countries, regions, cities, or users.
|
||||
{$t('search.try_searching_desc')}
|
||||
</p>
|
||||
</div>
|
||||
{:else}
|
||||
{#if adventures.length > 0}
|
||||
{#if locations.length > 0}
|
||||
<div class="mb-12">
|
||||
<div class="flex items-center gap-3 mb-6">
|
||||
<div class="p-2 bg-primary/10 rounded-lg">
|
||||
<SearchIcon class="w-6 h-6 text-primary" />
|
||||
</div>
|
||||
<h2 class="text-2xl font-bold">Adventures</h2>
|
||||
<div class="badge badge-primary">{adventures.length}</div>
|
||||
<h2 class="text-2xl font-bold">{$t('locations.locations')}</h2>
|
||||
<div class="badge badge-primary">{locations.length}</div>
|
||||
</div>
|
||||
<div class="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6">
|
||||
{#each adventures as adventure}
|
||||
<AdventureCard {adventure} user={null} />
|
||||
{#each locations as adventure}
|
||||
<LocationCard {adventure} user={null} />
|
||||
{/each}
|
||||
</div>
|
||||
</div>
|
||||
|
@ -115,7 +117,7 @@
|
|||
<!-- you can replace with a CollectionIcon -->
|
||||
<SearchIcon class="w-6 h-6 text-secondary" />
|
||||
</div>
|
||||
<h2 class="text-2xl font-bold">Collections</h2>
|
||||
<h2 class="text-2xl font-bold">{$t('navbar.collections')}</h2>
|
||||
<div class="badge badge-secondary">{collections.length}</div>
|
||||
</div>
|
||||
<div class="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6">
|
||||
|
@ -133,7 +135,7 @@
|
|||
<!-- you can replace with a GlobeIcon -->
|
||||
<SearchIcon class="w-6 h-6 text-accent" />
|
||||
</div>
|
||||
<h2 class="text-2xl font-bold">Countries</h2>
|
||||
<h2 class="text-2xl font-bold">{$t('search.countries')}</h2>
|
||||
<div class="badge badge-accent">{countries.length}</div>
|
||||
</div>
|
||||
<div class="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6">
|
||||
|
@ -151,7 +153,7 @@
|
|||
<!-- MapIcon -->
|
||||
<SearchIcon class="w-6 h-6 text-info" />
|
||||
</div>
|
||||
<h2 class="text-2xl font-bold">Regions</h2>
|
||||
<h2 class="text-2xl font-bold">{$t('map.regions')}</h2>
|
||||
<div class="badge badge-info">{regions.length}</div>
|
||||
</div>
|
||||
<div class="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6">
|
||||
|
@ -172,7 +174,7 @@
|
|||
<!-- CityIcon -->
|
||||
<SearchIcon class="w-6 h-6 text-warning" />
|
||||
</div>
|
||||
<h2 class="text-2xl font-bold">Cities</h2>
|
||||
<h2 class="text-2xl font-bold">{$t('search.cities')}</h2>
|
||||
<div class="badge badge-warning">{cities.length}</div>
|
||||
</div>
|
||||
<div class="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6">
|
||||
|
@ -190,7 +192,7 @@
|
|||
<!-- UserIcon -->
|
||||
<SearchIcon class="w-6 h-6 text-success" />
|
||||
</div>
|
||||
<h2 class="text-2xl font-bold">Users</h2>
|
||||
<h2 class="text-2xl font-bold">{$t('navbar.users')}</h2>
|
||||
<div class="badge badge-success">{users.length}</div>
|
||||
</div>
|
||||
<div class="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6">
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue