1
0
Fork 0
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:
Sean Morley 2025-06-25 11:49:34 -04:00 committed by GitHub
parent 5308ec21d6
commit 493a13995c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
115 changed files with 3148 additions and 2759 deletions

View file

@ -31,9 +31,9 @@
section: 'main'
},
{
path: '/adventures',
path: '/locations',
icon: MapMarker,
label: 'navbar.my_adventures',
label: 'locations.my_locations',
section: 'main'
},
{

View file

@ -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;

View file

@ -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>

View file

@ -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>

View file

@ -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}

View file

@ -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"

View file

@ -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: ''

View file

@ -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}

View file

@ -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" />

View file

@ -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')}

View file

@ -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 || '',

View file

@ -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;

View file

@ -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()

View file

@ -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)}

View file

@ -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}

View file

@ -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}

View file

@ -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"
>

View file

@ -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"

View file

@ -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 || '',

View file

@ -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' },

View file

@ -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">

View file

@ -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"

View file

@ -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;

View file

@ -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();

View file

@ -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"

View file

@ -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'));
}
}
}

View file

@ -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();

View file

@ -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;

View file

@ -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"
}
}

View file

@ -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

View file

@ -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 laventure 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"
}
}

View file

@ -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"
}
}

View file

@ -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": "내 위치"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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": "Мои локации"
}
}

View file

@ -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"
}
}

View file

@ -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": "我的位置"
}
}

View file

@ -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" />

View file

@ -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}`

View file

@ -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;

View file

@ -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
};
}
}
};

View file

@ -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;

View file

@ -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')}

View file

@ -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;

View file

@ -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) => {

View file

@ -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>

View file

@ -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);
}

View file

@ -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" />

View file

@ -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'
}
});
}

View 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;
}
};

View file

@ -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>

View 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
};
}
}
};

View file

@ -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>

View file

@ -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');

View file

@ -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}

View file

@ -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>

View file

@ -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,

View file

@ -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">