1
0
Fork 0
mirror of https://github.com/seanmorley15/AdventureLog.git synced 2025-07-19 12:59:36 +02:00

Merge branch 'development' of github.com:seanmorley15/AdventureLog into development

This commit is contained in:
Sean Morley 2025-04-18 15:04:10 -04:00
commit 1ea4022e80
23 changed files with 986 additions and 169 deletions

16
.github/.docker-compose-database.yml vendored Normal file
View file

@ -0,0 +1,16 @@
services:
db:
image: postgis/postgis:15-3.3
container_name: adventurelog-db
restart: unless-stopped
ports:
- "127.0.0.1:5432:5432"
environment:
POSTGRES_DB: database
POSTGRES_USER: adventure
POSTGRES_PASSWORD: changeme123
volumes:
- postgres_data:/var/lib/postgresql/data/
volumes:
postgres_data:

61
.github/workflows/backend-test.yml vendored Normal file
View file

@ -0,0 +1,61 @@
name: Test Backend
on:
pull_request:
paths:
- 'backend/server/**'
- '.github/workflows/backend-test.yml'
push:
paths:
- 'backend/server/**'
- '.github/workflows/backend-test.yml'
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: set up python 3.12
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: install dependencies
run: |
sudo apt update -q
sudo apt install -y -q \
python3-gdal
- name: start database
run: |
docker compose -f .github/.docker-compose-database.yml up -d
- name: install python libreries
working-directory: backend/server
run: |
pip install -r requirements.txt
- name: run server
working-directory: backend/server
env:
PGHOST: "127.0.0.1"
PGDATABASE: "database"
PGUSER: "adventure"
PGPASSWORD: "changeme123"
SECRET_KEY: "changeme123"
DJANGO_ADMIN_USERNAME: "admin"
DJANGO_ADMIN_PASSWORD: "admin"
DJANGO_ADMIN_EMAIL: "admin@example.com"
PUBLIC_URL: "http://localhost:8000"
CSRF_TRUSTED_ORIGINS: "http://localhost:5173,http://localhost:8000"
DEBUG: "True"
FRONTEND_URL: "http://localhost:5173"
run: |
python manage.py migrate
python manage.py runserver &
- name: wait for backend to boot
run: >
curl -fisS --retry 60 --retry-delay 1 --retry-all-errors
http://localhost:8000/

29
.github/workflows/frontend-test.yml vendored Normal file
View file

@ -0,0 +1,29 @@
name: Test Frontend
on:
pull_request:
paths:
- "frontend/**"
- ".github/workflows/frontend-test.yml"
push:
paths:
- "frontend/**"
- ".github/workflows/frontend-test.yml"
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- name: install dependencies
working-directory: frontend
run: npm i
- name: build frontend
working-directory: frontend
run: npm run build

View file

@ -64,6 +64,6 @@ cat /code/adventurelog.txt
# Start Gunicorn in foreground # Start Gunicorn in foreground
exec gunicorn main.wsgi:application \ exec gunicorn main.wsgi:application \
--bind 0.0.0.0:8000 \ --bind [::]:8000 \
--workers 2 \ --workers 2 \
--timeout 120 --timeout 120

View file

@ -22,7 +22,7 @@ class CollectionViewSet(viewsets.ModelViewSet):
order_by = self.request.query_params.get('order_by', 'name') order_by = self.request.query_params.get('order_by', 'name')
order_direction = self.request.query_params.get('order_direction', 'asc') order_direction = self.request.query_params.get('order_direction', 'asc')
valid_order_by = ['name', 'upated_at', 'start_date'] valid_order_by = ['name', 'updated_at', 'start_date']
if order_by not in valid_order_by: if order_by not in valid_order_by:
order_by = 'updated_at' order_by = 'updated_at'

View file

@ -80,6 +80,7 @@ export default defineConfig({
link: "/docs/install/nginx_proxy_manager", link: "/docs/install/nginx_proxy_manager",
}, },
{ text: "Traefik", link: "/docs/install/traefik" }, { text: "Traefik", link: "/docs/install/traefik" },
{ text: "Caddy", link: "/docs/install/caddy" },
], ],
}, },
], ],

View file

@ -0,0 +1,67 @@
# Installation with Caddy
Caddy is a modern HTTP reverse proxy. It automatically integrates with Let's Encrypt (or other certificate providers) to generate TLS certificates for your site.
As an example, if you want to add Caddy to your Docker compose configuration, add the following service to your `docker-compose.yml`:
```yaml
services:
caddy:
image: docker.io/library/caddy:2
container_name: adventurelog-caddy
restart: unless-stopped
cap_add:
- NET_ADMIN
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ./caddy:/etc/caddy
- caddy_data:/data
- caddy_config:/config
web: ...
server: ...
db: ...
volumes:
caddy_data:
caddy_config:
```
Since all ingress traffic to the AdventureLog containsers now travels through Caddy, we can also remove the external ports configuration from those containsers in the `docker-compose.yml`. Just delete this configuration:
```yaml
web:
ports:
- "8016:80"
server:
ports:
- "8015:3000"
```
That's it for the Docker compose changes. Of course, there are other methods to run Caddy which are equally valid.
However, we also need to configure Caddy. For this, create a file `./caddy/Caddyfile` in which you configure the requests which are proxied to the frontend and backend respectively and what domain Caddy should request a certificate for:
```
adventurelog.example.com {
@frontend {
not path /media* /admin* /static* /accounts*
}
reverse_proxy @frontend web:3000
reverse_proxy server:80
}
```
Once configured, you can start up the containsers:
```bash
docker compose up
```
Your AdventureLog should now be up and running.

View file

@ -33,7 +33,7 @@ Here is a summary of the configuration options available in the `docker-compose.
| ------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------- | | ------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------- |
| `PUBLIC_SERVER_URL` | Yes | What the frontend SSR server uses to connect to the backend. | ```http://server:8000``` | | `PUBLIC_SERVER_URL` | Yes | What the frontend SSR server uses to connect to the backend. | ```http://server:8000``` |
| `ORIGIN` | Sometimes | Not needed if using HTTPS. If not, set it to the domain of what you will access the app from. | ```http://localhost:8015``` | | `ORIGIN` | Sometimes | Not needed if using HTTPS. If not, set it to the domain of what you will access the app from. | ```http://localhost:8015``` |
| `BODY_SIZE_LIMIT` | Yes | Used to set the maximum upload size to the server. Should be changed to prevent someone from uploading too much! Custom values must be set in **kilobytes**. | ```Infinity``` | | `BODY_SIZE_LIMIT` | Yes | Used to set the maximum upload size to the server. Should be changed to prevent someone from uploading too much! Custom values must be set in **bytes**. | ```Infinity``` |
### Backend Container (server) ### Backend Container (server)

View file

@ -12,3 +12,4 @@ AdventureLog can be installed in a variety of ways. The following are the most c
- [Nginx Proxy Manager](nginx_proxy_manager.md) 🛡 - [Nginx Proxy Manager](nginx_proxy_manager.md) 🛡
- [Traefik](traefik.md) 🚀 - [Traefik](traefik.md) 🚀
- [Caddy](caddy.md) 🔒

View file

@ -4,8 +4,7 @@ When you encounter issues with the login and registration pages being unresponsi
1. Check to make sure the backend container is running and accessible. 1. Check to make sure the backend container is running and accessible.
- Check the backend container logs to see if there are any errors or issues blocking the contianer from running. - Check the backend container logs to see if there are any errors or issues blocking the container from running.
2. Check the connection between the frontend and backend containers. 2. Check the connection between the frontend and backend containers.
- Attempt login with the browser console network tab open to see if there are any errors or issues with the connection between the frontend and backend containers. If there is a connection issue, the code will show an error like `Failed to load resource: net::ERR_CONNECTION_REFUSED`. If this is the case, check the `PUBLIC_SERVER_URL` in the frontend container and refer to the installation docs to ensure the correct URL is set. - Attempt login with the browser console network tab open to see if there are any errors or issues with the connection between the frontend and backend containers. If there is a connection issue, the code will show an error like `Failed to load resource: net::ERR_CONNECTION_REFUSED`. If this is the case, check the `PUBLIC_SERVER_URL` in the frontend container and refer to the installation docs to ensure the correct URL is set.

View file

@ -10,7 +10,7 @@ Welcome to AdventureLog! This guide will help you get started with AdventureLog
- **Visit**: a visit is added to an adventure. It contains a date and notes about when the adventure was visited. If an adventure is visited multiple times, multiple visits can be added. If there are no visits on an adventure or the date of all visits is in the future, the adventure is considered planned. If the date of the visit is in the past, the adventure is considered completed. - **Visit**: a visit is added to an adventure. It contains a date and notes about when the adventure was visited. If an adventure is visited multiple times, multiple visits can be added. If there are no visits on an adventure or the date of all visits is in the future, the adventure is considered planned. If the date of the visit is in the past, the adventure is considered completed.
- **Category**: a category is a way to group adventures together. For example, you could have a category for parks, a category for museums, and a category for restaurants. - **Category**: a category is a way to group adventures together. For example, you could have a category for parks, a category for museums, and a category for restaurants.
- **Tag**: a tag is a way to add additional information to an adventure. For example, you could have a tag for the type of cuisine at a restaurant or the type of art at a museum. Multiple tags can be added to an adventure. - **Tag**: a tag is a way to add additional information to an adventure. For example, you could have a tag for the type of cuisine at a restaurant or the type of art at a museum. Multiple tags can be added to an adventure.
- **Image**: an image is a photo that is added to an adventure. Images can be added to an adventure to provide a visual representation of the location or to capture a memory of the visit. These can be uploded from your device or with a service like [Immich](/docs/configuration/immich_integration) if the integration is enabled. - **Image**: an image is a photo that is added to an adventure. Images can be added to an adventure to provide a visual representation of the location or to capture a memory of the visit. These can be uploaded from your device or with a service like [Immich](/docs/configuration/immich_integration) if the integration is enabled.
- **Attachment**: an attachment is a file that is added to an adventure. Attachments can be added to an adventure to provide additional information, such as a map of the location or a brochure from the visit. - **Attachment**: an attachment is a file that is added to an adventure. Attachments can be added to an adventure to provide additional information, such as a map of the location or a brochure from the visit.
#### Collections #### Collections

View file

@ -18,7 +18,7 @@
"@iconify-json/mdi": "^1.1.67", "@iconify-json/mdi": "^1.1.67",
"@sveltejs/adapter-node": "^5.2.0", "@sveltejs/adapter-node": "^5.2.0",
"@sveltejs/adapter-vercel": "^5.4.1", "@sveltejs/adapter-vercel": "^5.4.1",
"@sveltejs/kit": "^2.8.3", "@sveltejs/kit": "^2.20.6",
"@sveltejs/vite-plugin-svelte": "^3.1.1", "@sveltejs/vite-plugin-svelte": "^3.1.1",
"@tailwindcss/typography": "^0.5.13", "@tailwindcss/typography": "^0.5.13",
"@types/node": "^22.5.4", "@types/node": "^22.5.4",

View file

@ -53,13 +53,13 @@ importers:
version: 1.1.67 version: 1.1.67
'@sveltejs/adapter-node': '@sveltejs/adapter-node':
specifier: ^5.2.0 specifier: ^5.2.0
version: 5.2.0(@sveltejs/kit@2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4))) version: 5.2.0(@sveltejs/kit@2.20.6(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))
'@sveltejs/adapter-vercel': '@sveltejs/adapter-vercel':
specifier: ^5.4.1 specifier: ^5.4.1
version: 5.4.1(@sveltejs/kit@2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4))) version: 5.4.1(@sveltejs/kit@2.20.6(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))
'@sveltejs/kit': '@sveltejs/kit':
specifier: ^2.8.3 specifier: ^2.20.6
version: 2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)) version: 2.20.6(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4))
'@sveltejs/vite-plugin-svelte': '@sveltejs/vite-plugin-svelte':
specifier: ^3.1.1 specifier: ^3.1.1
version: 3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)) version: 3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4))
@ -456,6 +456,9 @@ packages:
'@jridgewell/sourcemap-codec@1.4.15': '@jridgewell/sourcemap-codec@1.4.15':
resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
'@jridgewell/sourcemap-codec@1.5.0':
resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
'@jridgewell/trace-mapping@0.3.25': '@jridgewell/trace-mapping@0.3.25':
resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
@ -520,8 +523,8 @@ packages:
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
engines: {node: '>=14'} engines: {node: '>=14'}
'@polka/url@1.0.0-next.25': '@polka/url@1.0.0-next.29':
resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==}
'@rollup/plugin-commonjs@26.0.1': '@rollup/plugin-commonjs@26.0.1':
resolution: {integrity: sha512-UnsKoZK6/aGIH6AdkptXhNvhaqftcjq3zZdT+LY5Ftms6JR06nADcDsYp5hTU9E2lbJUEOhdlY5J4DNTneM+jQ==} resolution: {integrity: sha512-UnsKoZK6/aGIH6AdkptXhNvhaqftcjq3zZdT+LY5Ftms6JR06nADcDsYp5hTU9E2lbJUEOhdlY5J4DNTneM+jQ==}
@ -748,14 +751,14 @@ packages:
peerDependencies: peerDependencies:
'@sveltejs/kit': ^2.4.0 '@sveltejs/kit': ^2.4.0
'@sveltejs/kit@2.8.3': '@sveltejs/kit@2.20.6':
resolution: {integrity: sha512-DVBVwugfzzn0SxKA+eAmKqcZ7aHZROCHxH7/pyrOi+HLtQ721eEsctGb9MkhEuqj6q/9S/OFYdn37vdxzFPdvw==} resolution: {integrity: sha512-ImUkSQ//Xf4N9r0HHAe5vRA7RyQ7U1Ue1YUT235Ig+IiIqbsixEulHTHrP5LtBiC8xOkJoPZQ1VZ/nWHNOaGGw==}
engines: {node: '>=18.13'} engines: {node: '>=18.13'}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
'@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 || ^5.0.0
svelte: ^4.0.0 || ^5.0.0-next.0 svelte: ^4.0.0 || ^5.0.0-next.0
vite: ^5.0.3 vite: ^5.0.3 || ^6.0.0
'@sveltejs/vite-plugin-svelte-inspector@2.1.0': '@sveltejs/vite-plugin-svelte-inspector@2.1.0':
resolution: {integrity: sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==} resolution: {integrity: sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==}
@ -1151,8 +1154,8 @@ packages:
resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==}
engines: {node: '>=6'} engines: {node: '>=6'}
esm-env@1.0.0: esm-env@1.2.2:
resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==} resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==}
esniff@2.0.1: esniff@2.0.1:
resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==}
@ -1469,6 +1472,9 @@ packages:
magic-string@0.30.10: magic-string@0.30.10:
resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==}
magic-string@0.30.17:
resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
make-dir@3.1.0: make-dir@3.1.0:
resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
engines: {node: '>=8'} engines: {node: '>=8'}
@ -1550,8 +1556,8 @@ packages:
resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
engines: {node: '>=4'} engines: {node: '>=4'}
mrmime@2.0.0: mrmime@2.0.1:
resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==}
engines: {node: '>=10'} engines: {node: '>=10'}
ms@2.1.2: ms@2.1.2:
@ -1876,8 +1882,8 @@ packages:
set-blocking@2.0.0: set-blocking@2.0.0:
resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==}
set-cookie-parser@2.6.0: set-cookie-parser@2.7.1:
resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==}
set-value@2.0.1: set-value@2.0.1:
resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==}
@ -1898,8 +1904,8 @@ packages:
resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
engines: {node: '>=14'} engines: {node: '>=14'}
sirv@3.0.0: sirv@3.0.1:
resolution: {integrity: sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==} resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==}
engines: {node: '>=18'} engines: {node: '>=18'}
sorcery@0.11.1: sorcery@0.11.1:
@ -2490,7 +2496,7 @@ snapshots:
'@jridgewell/gen-mapping@0.3.5': '@jridgewell/gen-mapping@0.3.5':
dependencies: dependencies:
'@jridgewell/set-array': 1.2.1 '@jridgewell/set-array': 1.2.1
'@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/sourcemap-codec': 1.5.0
'@jridgewell/trace-mapping': 0.3.25 '@jridgewell/trace-mapping': 0.3.25
'@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/resolve-uri@3.1.2': {}
@ -2499,6 +2505,8 @@ snapshots:
'@jridgewell/sourcemap-codec@1.4.15': {} '@jridgewell/sourcemap-codec@1.4.15': {}
'@jridgewell/sourcemap-codec@1.5.0': {}
'@jridgewell/trace-mapping@0.3.25': '@jridgewell/trace-mapping@0.3.25':
dependencies: dependencies:
'@jridgewell/resolve-uri': 3.1.2 '@jridgewell/resolve-uri': 3.1.2
@ -2581,7 +2589,7 @@ snapshots:
'@pkgjs/parseargs@0.11.0': '@pkgjs/parseargs@0.11.0':
optional: true optional: true
'@polka/url@1.0.0-next.25': {} '@polka/url@1.0.0-next.29': {}
'@rollup/plugin-commonjs@26.0.1(rollup@4.24.0)': '@rollup/plugin-commonjs@26.0.1(rollup@4.24.0)':
dependencies: dependencies:
@ -2590,7 +2598,7 @@ snapshots:
estree-walker: 2.0.2 estree-walker: 2.0.2
glob: 10.4.2 glob: 10.4.2
is-reference: 1.2.1 is-reference: 1.2.1
magic-string: 0.30.10 magic-string: 0.30.17
optionalDependencies: optionalDependencies:
rollup: 4.24.0 rollup: 4.24.0
@ -2729,39 +2737,38 @@ snapshots:
'@rollup/rollup-win32-x64-msvc@4.31.0': '@rollup/rollup-win32-x64-msvc@4.31.0':
optional: true optional: true
'@sveltejs/adapter-node@5.2.0(@sveltejs/kit@2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))': '@sveltejs/adapter-node@5.2.0(@sveltejs/kit@2.20.6(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))':
dependencies: dependencies:
'@rollup/plugin-commonjs': 26.0.1(rollup@4.24.0) '@rollup/plugin-commonjs': 26.0.1(rollup@4.24.0)
'@rollup/plugin-json': 6.1.0(rollup@4.24.0) '@rollup/plugin-json': 6.1.0(rollup@4.24.0)
'@rollup/plugin-node-resolve': 15.2.3(rollup@4.24.0) '@rollup/plugin-node-resolve': 15.2.3(rollup@4.24.0)
'@sveltejs/kit': 2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)) '@sveltejs/kit': 2.20.6(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4))
rollup: 4.24.0 rollup: 4.24.0
'@sveltejs/adapter-vercel@5.4.1(@sveltejs/kit@2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))': '@sveltejs/adapter-vercel@5.4.1(@sveltejs/kit@2.20.6(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))':
dependencies: dependencies:
'@sveltejs/kit': 2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)) '@sveltejs/kit': 2.20.6(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4))
'@vercel/nft': 0.27.2 '@vercel/nft': 0.27.2
esbuild: 0.21.5 esbuild: 0.21.5
transitivePeerDependencies: transitivePeerDependencies:
- encoding - encoding
- supports-color - supports-color
'@sveltejs/kit@2.8.3(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4))': '@sveltejs/kit@2.20.6(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4))':
dependencies: dependencies:
'@sveltejs/vite-plugin-svelte': 3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)) '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4))
'@types/cookie': 0.6.0 '@types/cookie': 0.6.0
cookie: 0.6.0 cookie: 0.6.0
devalue: 5.1.1 devalue: 5.1.1
esm-env: 1.0.0 esm-env: 1.2.2
import-meta-resolve: 4.1.0 import-meta-resolve: 4.1.0
kleur: 4.1.5 kleur: 4.1.5
magic-string: 0.30.10 magic-string: 0.30.17
mrmime: 2.0.0 mrmime: 2.0.1
sade: 1.8.1 sade: 1.8.1
set-cookie-parser: 2.6.0 set-cookie-parser: 2.7.1
sirv: 3.0.0 sirv: 3.0.1
svelte: 4.2.19 svelte: 4.2.19
tiny-glob: 0.2.9
vite: 5.4.12(@types/node@22.5.4) vite: 5.4.12(@types/node@22.5.4)
'@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4))': '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4)))(svelte@4.2.19)(vite@5.4.12(@types/node@22.5.4))':
@ -3203,7 +3210,7 @@ snapshots:
escalade@3.1.2: {} escalade@3.1.2: {}
esm-env@1.0.0: {} esm-env@1.2.2: {}
esniff@2.0.1: esniff@2.0.1:
dependencies: dependencies:
@ -3511,6 +3518,10 @@ snapshots:
dependencies: dependencies:
'@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/sourcemap-codec': 1.4.15
magic-string@0.30.17:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.0
make-dir@3.1.0: make-dir@3.1.0:
dependencies: dependencies:
semver: 6.3.1 semver: 6.3.1
@ -3611,7 +3622,7 @@ snapshots:
mri@1.2.0: {} mri@1.2.0: {}
mrmime@2.0.0: {} mrmime@2.0.1: {}
ms@2.1.2: {} ms@2.1.2: {}
@ -3928,7 +3939,7 @@ snapshots:
set-blocking@2.0.0: {} set-blocking@2.0.0: {}
set-cookie-parser@2.6.0: {} set-cookie-parser@2.7.1: {}
set-value@2.0.1: set-value@2.0.1:
dependencies: dependencies:
@ -3947,15 +3958,15 @@ snapshots:
signal-exit@4.1.0: {} signal-exit@4.1.0: {}
sirv@3.0.0: sirv@3.0.1:
dependencies: dependencies:
'@polka/url': 1.0.0-next.25 '@polka/url': 1.0.0-next.29
mrmime: 2.0.0 mrmime: 2.0.1
totalist: 3.0.1 totalist: 3.0.1
sorcery@0.11.1: sorcery@0.11.1:
dependencies: dependencies:
'@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/sourcemap-codec': 1.5.0
buffer-crc32: 1.0.0 buffer-crc32: 1.0.0
minimist: 1.2.8 minimist: 1.2.8
sander: 0.5.1 sander: 0.5.1
@ -4079,7 +4090,7 @@ snapshots:
dependencies: dependencies:
'@types/pug': 2.0.10 '@types/pug': 2.0.10
detect-indent: 6.1.0 detect-indent: 6.1.0
magic-string: 0.30.10 magic-string: 0.30.17
sorcery: 0.11.1 sorcery: 0.11.1
strip-indent: 3.0.0 strip-indent: 3.0.0
svelte: 4.2.19 svelte: 4.2.19

View file

@ -196,7 +196,7 @@
<!-- svelte-ignore a11y-no-noninteractive-tabindex --> <!-- svelte-ignore a11y-no-noninteractive-tabindex -->
<ul <ul
tabindex="0" tabindex="0"
class="dropdown-content menu bg-base-100 rounded-box z-[1] w-52 p-2 shadow" class="dropdown-content menu bg-base-100 rounded-box z-[1] w-64 p-2 shadow"
> >
<button <button
class="btn btn-neutral mb-2" class="btn btn-neutral mb-2"

View file

@ -96,20 +96,15 @@
> >
<div class="card-body space-y-4"> <div class="card-body space-y-4">
<!-- Title and Type --> <!-- Title and Type -->
<div class="flex items-center justify-between"> <h2 class="text-2xl font-semibold">{lodging.name}</h2>
<h2 class="card-title text-lg font-semibold truncate">{lodging.name}</h2> <div>
<div class="flex items-center gap-2">
<div class="badge badge-secondary"> <div class="badge badge-secondary">
{$t(`lodging.${lodging.type}`) + ' ' + getLodgingIcon(lodging.type)} {$t(`lodging.${lodging.type}`) + ' ' + getLodgingIcon(lodging.type)}
</div> </div>
<!-- {#if hotel.type == 'plane' && hotel.flight_number}
<div class="badge badge-neutral-200">{hotel.flight_number}</div>
{/if} -->
</div>
</div>
{#if unlinked} {#if unlinked}
<div class="badge badge-error">{$t('adventures.out_of_range')}</div> <div class="badge badge-error">{$t('adventures.out_of_range')}</div>
{/if} {/if}
</div>
<!-- Location --> <!-- Location -->
<div class="space-y-2"> <div class="space-y-2">

View file

@ -54,7 +54,8 @@
sv: 'Svenska', sv: 'Svenska',
zh: '中文', zh: '中文',
pl: 'Polski', pl: 'Polski',
ko: '한국어' ko: '한국어',
no: "Norsk"
}; };
let query: string = ''; let query: string = '';

View file

@ -62,7 +62,7 @@
if (modal) { if (modal) {
modal.showModal(); modal.showModal();
} }
let res = await fetch(`/auth/users/`); let res = await fetch(`/auth/users`);
if (res.ok) { if (res.ok) {
let data = await res.json(); let data = await res.json();
allUsers = data; allUsers = data;

View file

@ -110,9 +110,8 @@
> >
<div class="card-body space-y-4"> <div class="card-body space-y-4">
<!-- Title and Type --> <!-- Title and Type -->
<div class="flex items-center justify-between">
<h2 class="card-title text-lg font-semibold truncate">{transportation.name}</h2> <h2 class="card-title text-lg font-semibold truncate">{transportation.name}</h2>
<div class="flex items-center gap-2"> <div>
<div class="badge badge-secondary"> <div class="badge badge-secondary">
{$t(`transportation.modes.${transportation.type}`) + {$t(`transportation.modes.${transportation.type}`) +
' ' + ' ' +
@ -121,11 +120,10 @@
{#if transportation.type == 'plane' && transportation.flight_number} {#if transportation.type == 'plane' && transportation.flight_number}
<div class="badge badge-neutral-200">{transportation.flight_number}</div> <div class="badge badge-neutral-200">{transportation.flight_number}</div>
{/if} {/if}
</div>
</div>
{#if unlinked} {#if unlinked}
<div class="badge badge-error">{$t('adventures.out_of_range')}</div> <div class="badge badge-error">{$t('adventures.out_of_range')}</div>
{/if} {/if}
</div>
<!-- Locations --> <!-- Locations -->
<div class="space-y-2"> <div class="space-y-2">

View file

@ -1,7 +1,7 @@
{ {
"about": { "about": {
"about": "Di", "about": "Di",
"close": "Vicino", "close": "Chiudi",
"license": "Concesso in licenza con la licenza GPL-3.0.", "license": "Concesso in licenza con la licenza GPL-3.0.",
"message": "Realizzato con ❤️ negli Stati Uniti.", "message": "Realizzato con ❤️ negli Stati Uniti.",
"nominatim_1": "La ricerca della posizione e la geocodifica sono fornite da", "nominatim_1": "La ricerca della posizione e la geocodifica sono fornite da",
@ -13,10 +13,10 @@
"adventures": { "adventures": {
"activities": { "activities": {
"activity": "Attività 🏄", "activity": "Attività 🏄",
"art_museums": "Arte", "art_museums": "Arte e Musei",
"attraction": "Attrazione 🎢", "attraction": "Attrazione 🎢",
"culture": "Cultura 🎭", "culture": "Cultura 🎭",
"dining": "Pranzo 🍽️", "dining": "Mangiare 🍽️",
"event": "Evento 🎉", "event": "Evento 🎉",
"festivals": "Festival 🎪", "festivals": "Festival 🎪",
"fitness": "Forma fisica 🏋️", "fitness": "Forma fisica 🏋️",
@ -35,34 +35,34 @@
"water_sports": "Sport acquatici 🚤", "water_sports": "Sport acquatici 🚤",
"wildlife": "Fauna selvatica 🦒" "wildlife": "Fauna selvatica 🦒"
}, },
"add_to_collection": "Aggiungi alla raccolta", "add_to_collection": "Aggiungi alla collezione",
"adventure": "Avventura", "adventure": "Avventura",
"adventure_delete_confirm": "Sei sicuro di voler eliminare questa avventura? \nQuesta azione non può essere annullata.", "adventure_delete_confirm": "Sei sicuro di voler eliminare questa avventura? \nQuesta azione non può essere annullata.",
"adventure_details": "Dettagli dell'avventura", "adventure_details": "Dettagli dell'avventura",
"adventure_type": "Tipo di avventura", "adventure_type": "Tipo di avventura",
"archive": "Archivio", "archive": "Archivio",
"archived": "Archiviato", "archived": "Archiviato",
"archived_collection_message": "Raccolta archiviata con successo!", "archived_collection_message": "Collezione archiviata con successo!",
"archived_collections": "Collezioni archiviate", "archived_collections": "Collezioni archiviate",
"ascending": "Ascendente", "ascending": "Ascendente",
"cancel": "Cancellare", "cancel": "Cancellare",
"category_filter": "Filtro categoria", "category_filter": "Filtro categoria",
"clear": "Chiaro", "clear": "Rimuovere",
"close_filters": "Chiudi filtri", "close_filters": "Chiudi filtri",
"collection": "Collezione", "collection": "Collezione",
"collection_link_error": "Errore nel collegamento dell'avventura alla raccolta", "collection_link_error": "Errore nel collegamento dell'avventura alla collezione",
"collection_remove_error": "Errore durante la rimozione dell'avventura dalla raccolta", "collection_remove_error": "Errore durante la rimozione dell'avventura dalla collezione",
"collection_remove_success": "Avventura rimossa con successo dalla raccolta!", "collection_remove_success": "Avventura rimossa con successo dalla collezione!",
"count_txt": "risultati corrispondenti alla tua ricerca", "count_txt": "risultati corrispondenti alla tua ricerca",
"create_new": "Crea nuovo...", "create_new": "Crea nuovo...",
"date": "Data", "date": "Data",
"delete": "Eliminare", "delete": "Eliminare",
"delete_collection": "Elimina raccolta", "delete_collection": "Elimina collezione",
"delete_collection_success": "Raccolta eliminata con successo!", "delete_collection_success": "Collezione eliminata con successo!",
"delete_collection_warning": "Sei sicuro di voler eliminare questa raccolta? \nCiò eliminerà anche tutte le avventure collegate. \nQuesta azione non può essere annullata.", "delete_collection_warning": "Sei sicuro di voler eliminare questa collezione? \nCiò eliminerà anche tutte le avventure collegate. \nQuesta azione non può essere annullata.",
"descending": "Discendente", "descending": "Discendente",
"edit_adventure": "Modifica Avventura", "edit_adventure": "Modifica Avventura",
"edit_collection": "Modifica raccolta", "edit_collection": "Modifica collezione",
"filter": "Filtro", "filter": "Filtro",
"homepage": "Home page", "homepage": "Home page",
"latitude": "Latitudine", "latitude": "Latitudine",
@ -79,18 +79,18 @@
"private": "Privato", "private": "Privato",
"public": "Pubblico", "public": "Pubblico",
"rating": "Valutazione", "rating": "Valutazione",
"remove_from_collection": "Rimuovi dalla raccolta", "remove_from_collection": "Rimuovi dalla collezione",
"share": "Condividere", "share": "Condividere",
"sort": "Ordinare", "sort": "Ordinare",
"sources": "Fonti", "sources": "Fonti",
"unarchive": "Annulla l'archiviazione", "unarchive": "Annulla l'archiviazione",
"unarchived_collection_message": "Raccolta annullata con successo!", "unarchived_collection_message": "Collezione disarchiviata con successo!",
"updated": "Aggiornato", "updated": "Aggiornato",
"visit": "Visita", "visit": "Visita",
"visits": "Visite", "visits": "Visite",
"adventure_delete_success": "Avventura eliminata con successo!", "adventure_delete_success": "Avventura eliminata con successo!",
"collection_adventures": "Includi avventure di raccolta", "collection_adventures": "Includi avventure dalle raccolte",
"collection_link_success": "Avventura collegata alla raccolta con successo!", "collection_link_success": "Avventura collegata alla collezione con successo!",
"dates": "Date", "dates": "Date",
"delete_adventure": "Elimina avventura", "delete_adventure": "Elimina avventura",
"duration": "Durata", "duration": "Durata",
@ -114,9 +114,9 @@
"adventure_updated": "Avventura aggiornata", "adventure_updated": "Avventura aggiornata",
"basic_information": "Informazioni di base", "basic_information": "Informazioni di base",
"category": "Categoria", "category": "Categoria",
"clear_map": "Mappa chiara", "clear_map": "Libera mappa",
"copy_link": "Copia collegamento", "copy_link": "Copia collegamento",
"date_constrain": "Vincolare alle date di raccolta", "date_constrain": "Vincolare alle date di collezione",
"description": "Descrizione", "description": "Descrizione",
"end_date": "Data di fine", "end_date": "Data di fine",
"fetch_image": "Recupera immagine", "fetch_image": "Recupera immagine",
@ -140,7 +140,7 @@
"search_for_location": "Cerca una posizione", "search_for_location": "Cerca una posizione",
"search_results": "Risultati della ricerca", "search_results": "Risultati della ricerca",
"see_adventures": "Vedi Avventure", "see_adventures": "Vedi Avventure",
"select_adventure_category": "Seleziona la categoria Avventura", "select_adventure_category": "Seleziona la categoria per l'avventura",
"share_adventure": "Condividi questa avventura!", "share_adventure": "Condividi questa avventura!",
"start_date": "Data di inizio", "start_date": "Data di inizio",
"upload_image": "Carica immagine", "upload_image": "Carica immagine",
@ -154,11 +154,11 @@
"all": "Tutto", "all": "Tutto",
"error_updating_regions": "Errore durante l'aggiornamento delle regioni", "error_updating_regions": "Errore durante l'aggiornamento delle regioni",
"mark_region_as_visited": "Contrassegnare la regione {regione}, {paese} come visitata?", "mark_region_as_visited": "Contrassegnare la regione {regione}, {paese} come visitata?",
"mark_visited": "Marco ha visitato", "mark_visited": "Segna come visitato",
"my_adventures": "Le mie avventure", "my_adventures": "Le mie avventure",
"no_adventures_found": "Nessuna avventura trovata", "no_adventures_found": "Nessuna avventura trovata",
"no_collections_found": "Nessuna raccolta trovata a cui aggiungere questa avventura.", "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 raccolta.", "no_linkable_adventures": "Non è stata trovata alcuna avventura che possa essere collegata a questa collezione.",
"not_visited": "Non visitato", "not_visited": "Non visitato",
"regions_updated": "regioni aggiornate", "regions_updated": "regioni aggiornate",
"update_visited_regions": "Aggiorna le regioni visitate", "update_visited_regions": "Aggiorna le regioni visitate",
@ -168,20 +168,20 @@
"add_new": "Aggiungi nuovo...", "add_new": "Aggiungi nuovo...",
"checklist": "Lista di controllo", "checklist": "Lista di controllo",
"checklists": "Liste di controllo", "checklists": "Liste di controllo",
"collection_archived": "Questa raccolta è stata archiviata.", "collection_archived": "Questa collezione è stata archiviata.",
"collection_completed": "Hai completato questa raccolta!", "collection_completed": "Hai completato questa collezione!",
"collection_stats": "Statistiche della raccolta", "collection_stats": "Statistiche della collezione",
"days": "giorni", "days": "giorni",
"itineary_by_date": "Itinerario per data", "itineary_by_date": "Itinerario per data",
"keep_exploring": "Continua a esplorare!", "keep_exploring": "Continua a esplorare!",
"link_new": "Collegamento Nuovo...", "link_new": "Collega Nuovo...",
"linked_adventures": "Avventure collegate", "linked_adventures": "Avventure collegate",
"links": "Collegamenti", "links": "Collegamenti",
"no_end_date": "Inserisci una data di fine", "no_end_date": "Inserisci una data di fine",
"note": "Nota", "note": "Nota",
"notes": "Note", "notes": "Note",
"nothing_planned": "Niente in programma per questa giornata. \nBuon viaggio!", "nothing_planned": "Niente in programma per questa giornata. \nBuon viaggio!",
"transportation": "Trasporti", "transportation": "Trasporto",
"transportations": "Trasporti", "transportations": "Trasporti",
"visit_link": "Visita il collegamento", "visit_link": "Visita il collegamento",
"day": "Giorno", "day": "Giorno",
@ -194,9 +194,9 @@
"adventure_calendar": "Calendario delle avventure", "adventure_calendar": "Calendario delle avventure",
"emoji_picker": "Selettore di emoji", "emoji_picker": "Selettore di emoji",
"hide": "Nascondere", "hide": "Nascondere",
"show": "Spettacolo", "show": "Mostrare",
"download_calendar": "Scarica Calendario", "download_calendar": "Scarica Calendario",
"md_instructions": "Scrivi qui il tuo ribasso...", "md_instructions": "Scrivi qui in markdown...",
"preview": "Anteprima", "preview": "Anteprima",
"checklist_delete_confirm": "Sei sicuro di voler eliminare questa lista di controllo? \nQuesta azione non può essere annullata.", "checklist_delete_confirm": "Sei sicuro di voler eliminare questa lista di controllo? \nQuesta azione non può essere annullata.",
"clear_location": "Cancella posizione", "clear_location": "Cancella posizione",
@ -205,7 +205,7 @@
"delete_note": "Elimina nota", "delete_note": "Elimina nota",
"delete_transportation": "Elimina trasporto", "delete_transportation": "Elimina trasporto",
"end": "FINE", "end": "FINE",
"ending_airport": "Fine dell'aeroporto", "ending_airport": "Aeroporto di arrivo",
"flight_information": "Informazioni sul volo", "flight_information": "Informazioni sul volo",
"from": "Da", "from": "Da",
"no_location_found": "Nessuna posizione trovata", "no_location_found": "Nessuna posizione trovata",
@ -213,7 +213,7 @@
"out_of_range": "Non nell'intervallo di date dell'itinerario", "out_of_range": "Non nell'intervallo di date dell'itinerario",
"show_region_labels": "Mostra etichette regione", "show_region_labels": "Mostra etichette regione",
"start": "Inizio", "start": "Inizio",
"starting_airport": "Inizio aeroporto", "starting_airport": "Aeroporto di partenza",
"to": "A", "to": "A",
"transportation_delete_confirm": "Sei sicuro di voler eliminare questo trasporto? \nQuesta azione non può essere annullata.", "transportation_delete_confirm": "Sei sicuro di voler eliminare questo trasporto? \nQuesta azione non può essere annullata.",
"show_map": "Mostra mappa", "show_map": "Mostra mappa",
@ -221,7 +221,7 @@
"cities_updated": "città aggiornate", "cities_updated": "città aggiornate",
"create_adventure": "Crea Avventura", "create_adventure": "Crea Avventura",
"no_adventures_to_recommendations": "Nessuna avventura trovata. \nAggiungi almeno un'avventura per ricevere consigli.", "no_adventures_to_recommendations": "Nessuna avventura trovata. \nAggiungi almeno un'avventura per ricevere consigli.",
"finding_recommendations": "Alla scoperta di gemme nascoste per la tua prossima avventura", "finding_recommendations": "Alla scoperta di tesori nascosti per la tua prossima avventura",
"attachment": "Allegato", "attachment": "Allegato",
"attachment_delete_success": "Allegato eliminato con successo!", "attachment_delete_success": "Allegato eliminato con successo!",
"attachment_name": "Nome dell'allegato", "attachment_name": "Nome dell'allegato",
@ -247,11 +247,11 @@
"region": "Regione", "region": "Regione",
"welcome_map_info": "Avventure pubbliche su questo server", "welcome_map_info": "Avventure pubbliche su questo server",
"reservation_number": "Numero di prenotazione", "reservation_number": "Numero di prenotazione",
"open_in_maps": "Aperto in mappe", "open_in_maps": "Aprire in Mappe",
"all_day": "Tutto il giorno", "all_day": "Tutto il giorno",
"collection_no_start_end_date": "L'aggiunta di una data di inizio e fine alla raccolta sbloccherà le funzionalità di pianificazione dell'itinerario nella pagina di raccolta.", "collection_no_start_end_date": "L'aggiunta di una data di inizio e fine alla collezione sbloccherà le funzionalità di pianificazione dell'itinerario nella pagina della collezione.",
"date_itinerary": "Itinerario della data", "date_itinerary": "Data dell'itinerario",
"no_ordered_items": "Aggiungi articoli con date alla collezione per vederli qui.", "no_ordered_items": "Aggiungi elementi con date alla collezione per vederli qui.",
"ordered_itinerary": "Itinerario ordinato" "ordered_itinerary": "Itinerario ordinato"
}, },
"home": { "home": {
@ -272,9 +272,9 @@
"about": "Informazioni su AdventureLog", "about": "Informazioni su AdventureLog",
"adventures": "Avventure", "adventures": "Avventure",
"collections": "Collezioni", "collections": "Collezioni",
"discord": "Discordia", "discord": "Discord",
"documentation": "Documentazione", "documentation": "Documentazione",
"greeting": "CIAO", "greeting": "Ciao",
"logout": "Esci", "logout": "Esci",
"map": "Mappa", "map": "Mappa",
"my_adventures": "Le mie avventure", "my_adventures": "Le mie avventure",
@ -295,7 +295,7 @@
}, },
"users": "Utenti", "users": "Utenti",
"worldtravel": "Viaggio nel mondo", "worldtravel": "Viaggio nel mondo",
"my_tags": "I miei tag", "my_tags": "Le mie tag",
"tag": "Etichetta", "tag": "Etichetta",
"language_selection": "Lingua", "language_selection": "Lingua",
"support": "Supporto", "support": "Supporto",
@ -319,7 +319,7 @@
"public_tooltip": "Con un profilo pubblico, gli utenti possono condividere raccolte con te e visualizzare il tuo profilo nella pagina degli utenti.", "public_tooltip": "Con un profilo pubblico, gli utenti possono condividere raccolte con te e visualizzare il tuo profilo nella pagina degli utenti.",
"email_required": "L'e-mail è obbligatoria", "email_required": "L'e-mail è obbligatoria",
"both_passwords_required": "Sono necessarie entrambe le password", "both_passwords_required": "Sono necessarie entrambe le password",
"new_password": "Nuova parola d'ordine", "new_password": "Nuova password",
"reset_failed": "Impossibile reimpostare la password", "reset_failed": "Impossibile reimpostare la password",
"or_3rd_party": "Oppure accedi con un servizio di terze parti", "or_3rd_party": "Oppure accedi con un servizio di terze parti",
"no_public_adventures": "Nessuna avventura pubblica trovata", "no_public_adventures": "Nessuna avventura pubblica trovata",
@ -349,7 +349,7 @@
"region_failed_visited": "Impossibile contrassegnare la regione come visitata", "region_failed_visited": "Impossibile contrassegnare la regione come visitata",
"region_stats": "Statistiche della regione", "region_stats": "Statistiche della regione",
"regions_in": "Regioni dentro", "regions_in": "Regioni dentro",
"removed": "RIMOSSO", "removed": "Rimosso",
"view_cities": "Visualizza città", "view_cities": "Visualizza città",
"visit_remove_failed": "Impossibile rimuovere la visita", "visit_remove_failed": "Impossibile rimuovere la visita",
"visit_to": "Visita a" "visit_to": "Visita a"
@ -360,7 +360,7 @@
"current_email": "E-mail corrente", "current_email": "E-mail corrente",
"email_change": "Cambia e-mail", "email_change": "Cambia e-mail",
"new_email": "Nuova e-mail", "new_email": "Nuova e-mail",
"new_password": "Nuova parola d'ordine", "new_password": "Nuova password",
"no_email_set": "Nessuna e-mail impostata", "no_email_set": "Nessuna e-mail impostata",
"password_change": "Cambiare la password", "password_change": "Cambiare la password",
"settings_page": "Pagina Impostazioni", "settings_page": "Pagina Impostazioni",
@ -378,7 +378,7 @@
"submit": "Invia", "submit": "Invia",
"token_required": "Token e UID sono necessari per la reimpostazione della password.", "token_required": "Token e UID sono necessari per la reimpostazione della password.",
"about_this_background": "A proposito di questo contesto", "about_this_background": "A proposito di questo contesto",
"join_discord": "Unisciti alla Discordia", "join_discord": "Unisciti a Discord",
"join_discord_desc": "per condividere le tue foto. \nPubblicateli in", "join_discord_desc": "per condividere le tue foto. \nPubblicateli in",
"photo_by": "Foto di", "photo_by": "Foto di",
"change_password_error": "Impossibile modificare la password. \nPassword attuale non valida o nuova password non valida.", "change_password_error": "Impossibile modificare la password. \nPassword attuale non valida o nuova password non valida.",
@ -412,7 +412,7 @@
"not_verified": "Non verificato", "not_verified": "Non verificato",
"primary": "Primario", "primary": "Primario",
"recovery_codes": "Codici di ripristino", "recovery_codes": "Codici di ripristino",
"recovery_codes_desc": "Questi sono i tuoi codici di ripristino. \nTeneteli al sicuro. \nNon potrai vederli più.", "recovery_codes_desc": "Questi sono i tuoi codici di ripristino. \nTienili al sicuro. \nNon potrai vederli più.",
"reset_session_error": "Esci, effettua nuovamente l'accesso per aggiornare la sessione e riprova.", "reset_session_error": "Esci, effettua nuovamente l'accesso per aggiornare la sessione e riprova.",
"verified": "Verificato", "verified": "Verificato",
"verify_email_success": "Verifica email inviata con successo!", "verify_email_success": "Verifica email inviata con successo!",
@ -431,7 +431,7 @@
"no_verified_email_warning": "È necessario disporre di un indirizzo e-mail verificato per abilitare l'autenticazione a due fattori.", "no_verified_email_warning": "È necessario disporre di un indirizzo e-mail verificato per abilitare l'autenticazione a due fattori.",
"social_auth_desc": "Abilita o disabilita i provider di autenticazione social e OIDC per il tuo account. \nQueste connessioni ti consentono di accedere con provider di identità di autenticazione self-hosted come Authentik o provider di terze parti come GitHub.", "social_auth_desc": "Abilita o disabilita i provider di autenticazione social e OIDC per il tuo account. \nQueste connessioni ti consentono di accedere con provider di identità di autenticazione self-hosted come Authentik o provider di terze parti come GitHub.",
"social_auth_desc_2": "Queste impostazioni sono gestite nel server AdventureLog e devono essere abilitate manualmente dall'amministratore.", "social_auth_desc_2": "Queste impostazioni sono gestite nel server AdventureLog e devono essere abilitate manualmente dall'amministratore.",
"social_oidc_auth": "Autenticazione sociale e OIDC", "social_oidc_auth": "Autenticazione social e OIDC",
"add_email": "Aggiungi e-mail", "add_email": "Aggiungi e-mail",
"password_too_short": "La password deve contenere almeno 6 caratteri", "password_too_short": "La password deve contenere almeno 6 caratteri",
"disable_password": "Disabilita la password", "disable_password": "Disabilita la password",
@ -444,40 +444,40 @@
"password_enabled_error": "Errore che abilita l'autenticazione della password." "password_enabled_error": "Errore che abilita l'autenticazione della password."
}, },
"checklist": { "checklist": {
"add_item": "Aggiungi articolo", "add_item": "Aggiungi elemento",
"checklist_delete_error": "Errore durante l'eliminazione della lista di controllo", "checklist_delete_error": "Errore durante l'eliminazione della lista di controllo",
"checklist_deleted": "Lista di controllo eliminata con successo!", "checklist_deleted": "Lista di controllo eliminata con successo!",
"checklist_editor": "Redattore della lista di controllo", "checklist_editor": "Redattore della lista di controllo",
"checklist_public": "Questa lista di controllo è pubblica perché è in una raccolta pubblica.", "checklist_public": "Questa lista di controllo è pubblica perché è in una collezione pubblica.",
"editing_checklist": "Lista di controllo per la modifica", "editing_checklist": "Lista di controllo per la modifica",
"failed_to_save": "Impossibile salvare la lista di controllo", "failed_to_save": "Impossibile salvare la lista di controllo",
"item": "Articolo", "item": "Elemento",
"item_already_exists": "L'articolo esiste già", "item_already_exists": "L'elemento esiste già",
"item_cannot_be_empty": "L'articolo non può essere vuoto", "item_cannot_be_empty": "L'elemento non può essere vuoto",
"items": "Elementi", "items": "Elementi",
"save": "Salva", "save": "Salva",
"new_item": "Nuovo articolo", "new_item": "Nuovo elemento",
"checklist_viewer": "Visualizzatore della lista di controllo", "checklist_viewer": "Visualizzatore della lista di controllo",
"new_checklist": "Nuova lista di controllo" "new_checklist": "Nuova lista di controllo"
}, },
"collection": { "collection": {
"edit_collection": "Modifica raccolta", "edit_collection": "Modifica collezione",
"error_creating_collection": "Errore durante la creazione della raccolta", "error_creating_collection": "Errore durante la creazione della collezione",
"error_editing_collection": "Errore durante la modifica della raccolta", "error_editing_collection": "Errore durante la modifica della collezione",
"new_collection": "Nuova collezione", "new_collection": "Nuova collezione",
"collection_created": "Collezione creata con successo!", "collection_created": "Collezione creata con successo!",
"collection_edit_success": "Raccolta modificata con successo!", "collection_edit_success": "Collezione modificata con successo!",
"create": "Creare", "create": "Creare",
"public_collection": "Collezione pubblica" "public_collection": "Collezione pubblica"
}, },
"notes": { "notes": {
"add_a_link": "Aggiungi un collegamento", "add_a_link": "Aggiungi un collegamento",
"content": "Contenuto", "content": "Contenuto",
"editing_note": "Nota di modifica", "editing_note": "Editor di modifica nota",
"failed_to_save": "Impossibile salvare la nota", "failed_to_save": "Impossibile salvare la nota",
"note_delete_error": "Errore durante l'eliminazione della nota", "note_delete_error": "Errore durante l'eliminazione della nota",
"note_deleted": "Nota eliminata con successo!", "note_deleted": "Nota eliminata con successo!",
"note_editor": "Redattore della nota", "note_editor": "Editor della nota",
"note_public": "Questa nota è pubblica perché è in una collezione pubblica.", "note_public": "Questa nota è pubblica perché è in una collezione pubblica.",
"open": "Aprire", "open": "Aprire",
"save": "Salva", "save": "Salva",
@ -513,7 +513,7 @@
"transportation_deleted": "Trasporto eliminato con successo!", "transportation_deleted": "Trasporto eliminato con successo!",
"transportation_edit_success": "Trasporti modificati con successo!", "transportation_edit_success": "Trasporti modificati con successo!",
"type": "Tipo", "type": "Tipo",
"ending_airport_desc": "Immettere il codice aeroportuale finale (ad es. LAX)", "ending_airport_desc": "Immettere il codice dell'aroporto di arrivo (ad es. LAX)",
"fetch_location_information": "Informazioni sulla posizione di recupero", "fetch_location_information": "Informazioni sulla posizione di recupero",
"starting_airport_desc": "Immettere il codice dell'aeroporto di partenza (ad es. JFK)" "starting_airport_desc": "Immettere il codice dell'aeroporto di partenza (ad es. JFK)"
}, },
@ -535,17 +535,17 @@
"share": { "share": {
"no_users_shared": "Nessun utente condiviso con", "no_users_shared": "Nessun utente condiviso con",
"not_shared_with": "Non condiviso con", "not_shared_with": "Non condiviso con",
"share_desc": "Condividi questa raccolta con altri utenti.", "share_desc": "Condividi questa collezione con altri utenti.",
"shared": "Condiviso", "shared": "Condiviso",
"shared_with": "Condiviso con", "shared_with": "Condiviso con",
"unshared": "Non condiviso", "unshared": "Non condiviso",
"with": "con", "with": "con",
"go_to_settings": "Vai alle impostazioni", "go_to_settings": "Vai alle impostazioni",
"no_shared_found": "Nessuna raccolta trovata condivisa con te.", "no_shared_found": "Nessuna collezione trovata condivisa con te.",
"set_public": "Per consentire agli utenti di condividere con te, è necessario che il tuo profilo sia impostato su pubblico." "set_public": "Per consentire agli utenti di condividere con te, è necessario che il tuo profilo sia impostato su pubblico."
}, },
"profile": { "profile": {
"member_since": "Membro da allora", "member_since": "Membro da",
"user_stats": "Statistiche utente", "user_stats": "Statistiche utente",
"visited_countries": "Paesi visitati", "visited_countries": "Paesi visitati",
"visited_regions": "Regioni visitate", "visited_regions": "Regioni visitate",
@ -607,12 +607,12 @@
"bnb": "Bed and Breakfast", "bnb": "Bed and Breakfast",
"cabin": "Cabina", "cabin": "Cabina",
"campground": "Campeggio", "campground": "Campeggio",
"check_in": "Check -in", "check_in": "Check-in",
"check_out": "Guardare", "check_out": "Check-out",
"date_and_time": "Data", "date_and_time": "Data e ora",
"edit": "Modificare", "edit": "Modificare",
"edit_lodging": "Modifica alloggio", "edit_lodging": "Modifica alloggio",
"error_editing_lodging": "Alloggio di modifica degli errori", "error_editing_lodging": "Errore nella modifica dell'alloggio",
"hostel": "Ostello", "hostel": "Ostello",
"hotel": "Hotel", "hotel": "Hotel",
"house": "Casa", "house": "Casa",
@ -621,11 +621,11 @@
"other": "Altro", "other": "Altro",
"provide_start_date": "Si prega di fornire una data di inizio", "provide_start_date": "Si prega di fornire una data di inizio",
"reservation_number": "Numero di prenotazione", "reservation_number": "Numero di prenotazione",
"resort": "Ricorrere", "resort": "Resort",
"start": "Inizio", "start": "Inizio",
"type": "Tipo", "type": "Tipo",
"villa": "Villa", "villa": "Villa",
"lodging_delete_error": "Errore di eliminazione dell'alloggio", "lodging_delete_error": "Errore nell'eliminazione dell'alloggio",
"lodging_deleted": "Alloggio eliminato con successo!", "lodging_deleted": "Alloggio eliminato con successo!",
"lodging_edit_success": "Alloggio modificato con successo!", "lodging_edit_success": "Alloggio modificato con successo!",
"lodging_type": "Tipo di alloggio", "lodging_type": "Tipo di alloggio",

View file

@ -0,0 +1,631 @@
{
"navbar": {
"adventures": "Eventyr",
"collections": "Samlinger",
"worldtravel": "Verdensreiser",
"map": "Kart",
"users": "Brukere",
"search": "Søk",
"profile": "Profil",
"greeting": "Hei",
"my_adventures": "Mine Eventyr",
"my_tags": "Mine Tags",
"tag": "Tag",
"shared_with_me": "Delt med meg",
"settings": "Innstillinger",
"logout": "Logg ut",
"about": "Om AdventureLog",
"documentation": "Dokumentasjon",
"discord": "Discord",
"language_selection": "Språk",
"support": "Støtte",
"calendar": "Kalender",
"theme_selection": "Tema-valg",
"admin_panel": "Admin Panel",
"themes": {
"light": "Lyst",
"dark": "Mørkt",
"night": "Natt",
"forest": "Skog",
"aestheticLight": "Estetisk Lyst",
"aestheticDark": "Estetisk Mørkt",
"aqua": "Aqua",
"northernLights": "Nordlys"
}
},
"about": {
"about": "Om",
"license": "Lisensiert under GPL-3.0-lisensen.",
"source_code": "Kildekode",
"message": "Laget med ❤️ i USA.",
"oss_attributions": "Open Source-attribusjoner",
"nominatim_1": "Stedsøk og geokoding leveres av",
"nominatim_2": "Deres data er lisensiert under ODbL-lisensen.",
"other_attributions": "Ytterligere attribusjoner finnes i README-filen.",
"close": "Lukk"
},
"home": {
"hero_1": "Oppdag verdens mest spennende eventyr",
"hero_2": "Oppdag og planlegg ditt neste eventyr med AdventureLog. Utforsk fantastiske destinasjoner, lag tilpassede reiseplaner, og hold kontakten på farten.",
"go_to": "Gå til AdventureLog",
"key_features": "Nøkkelfunksjoner",
"desc_1": "Oppdag, planlegg og utforsk med letthet",
"desc_2": "AdventureLog er designet for å forenkle reisen din, og gir deg verktøy og ressurser til å planlegge, pakke og navigere ditt neste uforglemmelige eventyr.",
"feature_1": "Reiselogg",
"feature_1_desc": "Før en personlig reiselogg for eventyrene dine og del opplevelsene dine med venner og familie.",
"feature_2": "Reiseplanlegging",
"feature_2_desc": "Lag enkelt tilpassede reiseplaner og få en dag-for-dag oversikt over turen din.",
"feature_3": "Reisekart",
"feature_3_desc": "Se reisene dine over hele verden med et interaktivt kart og utforsk nye destinasjoner."
},
"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.",
"lodging_delete_confirm": "Er du sikker på at du vil slette dette overnattingsstedet? Denne handlingen kan ikke angres.",
"delete_checklist": "Slett sjekkliste",
"delete_note": "Slett notat",
"delete_transportation": "Slett transport",
"delete_lodging": "Slett overnatting",
"open_details": "Åpne detaljer",
"edit_adventure": "Rediger eventyr",
"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",
"adventure_details": "Eventyrdetaljer",
"collection": "Samling",
"adventure_type": "Eventyrtype",
"longitude": "Lengdegrad",
"latitude": "Breddegrad",
"visit": "Besøk",
"visits": "Besøk",
"create_new": "Opprett nytt...",
"adventure": "Eventyr",
"count_txt": "resultater som samsvarer med søket ditt",
"sort": "Sorter",
"order_by": "Sorter etter",
"order_direction": "Sorteringsretning",
"ascending": "Stigende",
"descending": "Synkende",
"updated": "Oppdatert",
"name": "Navn",
"date": "Dato",
"activity_types": "Aktivitetstyper",
"tags": "Tags",
"add_a_tag": "Legg til en tag",
"date_constrain": "Begrens til samlingsdatoer",
"rating": "Vurdering",
"my_images": "Mine bilder",
"add_an_activity": "Legg til en aktivitet",
"show_region_labels": "Vis regionetiketter",
"no_images": "Ingen bilder",
"upload_images_here": "Last opp bilder her",
"share_adventure": "Del dette eventyret!",
"copy_link": "Kopier lenke",
"image": "Bilde",
"upload_image": "Last opp bilde",
"open_in_maps": "Åpne i kart",
"url": "URL",
"fetch_image": "Hent bilde",
"wikipedia": "Wikipedia",
"add_notes": "Legg til notater",
"warning": "Advarsel",
"my_adventures": "Mine eventyr",
"no_linkable_adventures": "Ingen eventyr funnet som kan legges til denne samlingen.",
"add": "Legg til",
"save_next": "Lagre og fortsett",
"end_date": "Sluttdato",
"my_visits": "Mine besøk",
"start_date": "Startdato",
"remove": "Fjern",
"location": "Plassering",
"search_for_location": "Søk etter sted",
"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",
"primary": "Primær",
"view_attachment": "Vis vedlegg",
"generate_desc": "Generer beskrivelse",
"public_adventure": "Offentlig eventyr",
"location_information": "Plasseringsinformasjon",
"link": "Lenke",
"links": "Lenker",
"description": "Beskrivelse",
"sources": "Kilder",
"collection_adventures": "Inkluder eventyr i samlinger",
"filter": "Filter",
"category_filter": "Kategorifilter",
"category": "Kategori",
"select_adventure_category": "Velg eventyrkategori",
"clear": "Tøm",
"my_collections": "Mine samlinger",
"open_filters": "Åpne filtre",
"close_filters": "Lukk filtre",
"archived_collections": "Arkiverte samlinger",
"share": "Del",
"private": "Privat",
"public": "Offentlig",
"archived": "Arkivert",
"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!",
"delete_collection_warning": "Er du sikker på at du vil slette denne samlingen? Dette vil også slette alle lenkede eventyr. Denne handlingen kan ikke angres.",
"cancel": "Avbryt",
"of": "av",
"delete_collection": "Slett samling",
"delete_adventure": "Slett eventyr",
"adventure_delete_success": "Eventyret ble slettet!",
"visited": "Besøkt",
"planned": "Planlagt",
"duration": "Varighet",
"all": "Alle",
"image_removed_success": "Bilde ble fjernet!",
"image_removed_error": "Feil ved fjerning av bilde",
"no_image_url": "Finner ikke bilde på den oppgitte URL-en.",
"image_upload_success": "Bilde opplastet!",
"image_upload_error": "Feil ved opplasting av bilde",
"dates": "Datoer",
"wiki_image_error": "Feil ved henting av bilde fra Wikipedia",
"start_before_end_error": "Startdato må være før sluttdato",
"activity": "Aktivitet",
"actions": "Handlinger",
"no_end_date": "Vennligst angi en sluttdato",
"see_adventures": "Se eventyr",
"image_fetch_failed": "Kunne ikke hente bilde",
"no_location": "Vennligst angi et sted",
"no_start_date": "Vennligst angi en startdato",
"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",
"mark_region_as_visited": "Merk regionen {region}, {country} som besøkt?",
"mark_visited": "Merk som besøkt",
"error_updating_regions": "Feil ved oppdatering av regioner",
"regions_updated": "regioner oppdatert",
"cities_updated": "byer oppdatert",
"visited_region_check": "Sjekk besøkte regioner",
"visited_region_check_desc": "Ved å markere denne, vil serveren sjekke alle dine besøkte eventyr og markere regionene de befinner seg i som besøkt i verdensreiser.",
"update_visited_regions": "Oppdater besøkte regioner",
"update_visited_regions_disclaimer": "Dette kan ta litt tid avhengig av hvor mange eventyr du har besøkt.",
"link_new": "Lenk ny...",
"add_new": "Legg til ny...",
"transportation": "Transport",
"note": "Notat",
"checklist": "Sjekkliste",
"collection_archived": "Denne samlingen er arkivert.",
"visit_link": "Besøk lenke",
"collection_completed": "Du har fullført denne samlingen!",
"collection_stats": "Samlingsstatistikk",
"keep_exploring": "Fortsett å utforske!",
"linked_adventures": "Lenkede eventyr",
"notes": "Notater",
"checklists": "Sjekklister",
"transportations": "Transportmidler",
"adventure_calendar": "Eventyrkalender",
"day": "Dag",
"itineary_by_date": "Reiseplan etter dato",
"nothing_planned": "Ingenting planlagt denne dagen. Nyt reisen!",
"copied_to_clipboard": "Kopiert til utklippstavlen!",
"copy_failed": "Kopiering mislyktes",
"show": "Vis",
"hide": "Skjul",
"clear_location": "Fjern sted",
"starting_airport": "Avreiseflyplass",
"ending_airport": "Ankomsflyplass",
"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",
"show_map": "Vis kart",
"emoji_picker": "Emoji-velger",
"download_calendar": "Last ned kalender",
"date_information": "Dato-informasjon",
"flight_information": "Flyinformasjon",
"out_of_range": "Ikke i reiseplandatoer",
"preview": "Forhåndsvisning",
"finding_recommendations": "Oppdager skjulte perler for ditt neste eventyr",
"location_details": "Stedsdetaljer",
"city": "By",
"region": "Region",
"md_instructions": "Skriv markdown her...",
"days": "dager",
"attachment_upload_success": "Vedlegg lastet opp!",
"attachment_upload_error": "Feil ved opplasting av vedlegg",
"upload": "Last opp",
"attachment_delete_success": "Vedlegg slettet!",
"attachment_update_success": "Vedlegg oppdatert!",
"attachment_name": "Vedleggsnavn",
"gpx_tip": "Last opp GPX-filer i vedlegg for å se dem på kartet!",
"welcome_map_info": "Offentlige eventyr på denne serveren",
"attachment_update_error": "Feil ved oppdatering av vedlegg",
"activities": {
"general": "Generelt 🌍",
"outdoor": "Utendørs 🏞️",
"lodging": "Overnatting 🛌",
"dining": "Servering 🍽️",
"activity": "Aktivitet 🏄",
"attraction": "Attraksjon 🎢",
"shopping": "Shopping 🛍️",
"nightlife": "Uteliv 🌃",
"event": "Arrangement 🎉",
"transportation": "Transport 🚗",
"culture": "Kultur 🎭",
"water_sports": "Vannsport 🚤",
"hiking": "Fotturer 🥾",
"wildlife": "Dyreliv 🦒",
"historical_sites": "Historiske steder 🏛️",
"music_concerts": "Musikk og konserter 🎶",
"fitness": "Trening 🏋️",
"art_museums": "Kunst og museer 🎨",
"festivals": "Festivaler 🎪",
"spiritual_journeys": "Spirituelle reiser 🧘‍♀️",
"volunteer_work": "Frivillig arbeid 🤝",
"other": "Annet"
},
"lodging_information": "Overnattingsinformasjon",
"price": "Pris",
"reservation_number": "Reservasjonsnummer"
},
"worldtravel": {
"country_list": "Liste over land",
"num_countries": "land funnet",
"all": "Alle",
"partially_visited": "Delvis besøkt",
"not_visited": "Ikke besøkt",
"completely_visited": "Fullstendig besøkt",
"all_subregions": "Alle underregioner",
"clear_search": "Tøm søk",
"no_countries_found": "Ingen land funnet",
"view_cities": "Vis byer",
"no_cities_found": "Ingen byer funnet",
"visit_to": "Besøk i",
"region_failed_visited": "Kunne ikke markere region som besøkt",
"failed_to_mark_visit": "Kunne ikke markere besøk i",
"visit_remove_failed": "Kunne ikke fjerne besøk",
"removed": "fjernet",
"failed_to_remove_visit": "Kunne ikke fjerne besøk i",
"marked_visited": "markert som besøkt",
"regions_in": "Regioner i",
"region_stats": "Regionstatistikk",
"all_visited": "Du har besøkt alle regionene i",
"cities": "byer"
},
"auth": {
"username": "Brukernavn",
"password": "Passord",
"forgot_password": "Glemt passord?",
"signup": "Registrer deg",
"login_error": "Kan ikke logge inn med oppgitte legitimasjon.",
"login": "Logg inn",
"email": "E-post",
"first_name": "Fornavn",
"last_name": "Etternavn",
"confirm_password": "Bekreft passord",
"registration_disabled": "Registrering er for øyeblikket deaktivert.",
"profile_picture": "Profilbilde",
"public_profile": "Offentlig profil",
"public_tooltip": "Med en offentlig profil kan brukere dele samlinger med deg og se profilen din på brukersiden.",
"email_required": "E-post kreves",
"new_password": "Nytt passord (6+ tegn)",
"both_passwords_required": "Begge passord er påkrevd",
"reset_failed": "Kunne ikke tilbakestille passord",
"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"
},
"users": {
"no_users_found": "Ingen brukere med offentlig profil funnet."
},
"settings": {
"update_error": "Feil ved oppdatering av innstillinger",
"update_success": "Innstillinger oppdatert!",
"settings_page": "Innstillingsside",
"account_settings": "Brukerkontoinnstillinger",
"update": "Oppdater",
"no_verified_email_warning": "Du må ha en verifisert e-postadresse for å aktivere tofaktorautentisering.",
"password_change": "Bytt passord",
"new_password": "Nytt passord",
"confirm_new_password": "Bekreft nytt passord",
"email_change": "Bytt e-post",
"current_email": "Nåværende e-post",
"no_email_set": "Ingen e-post angitt",
"new_email": "Ny e-post",
"change_password": "Bytt passord",
"login_redir": "Du blir da omdirigert til innloggingssiden.",
"token_required": "Token og UID kreves for tilbakestilling av passord.",
"reset_password": "Tilbakestill passord",
"possible_reset": "Hvis e-postadressen du oppga er knyttet til en konto, vil du motta en e-post med instruksjoner om å tilbakestille passordet ditt!",
"missing_email": "Vennligst skriv inn en e-postadresse",
"submit": "Send inn",
"password_does_not_match": "Passordene samsvarer ikke",
"password_is_required": "Passord er påkrevd",
"invalid_token": "Token er ugyldig eller utløpt",
"about_this_background": "Om denne bakgrunnen",
"photo_by": "Foto av",
"join_discord": "Bli med på Discord",
"join_discord_desc": "for å dele dine egne bilder. Legg dem ut i #travel-share-kanalen.",
"current_password": "Nåværende passord",
"change_password_error": "Kan ikke endre passord. Ugyldig nåværende passord eller ugyldig nytt passord.",
"password_change_lopout_warning": "Du vil bli logget ut etter å ha endret passordet.",
"generic_error": "En feil oppsto under behandlingen av forespørselen din.",
"email_removed": "E-post fjernet!",
"email_removed_error": "Feil ved fjerning av e-post",
"verify_email_success": "E-postbekreftelse sendt!",
"verify_email_error": "Feil ved e-postbekreftelse. Prøv igjen om noen minutter.",
"email_added": "E-post lagt til!",
"email_added_error": "Feil ved legging til e-post",
"email_set_primary": "E-post satt som primær!",
"email_set_primary_error": "Feil ved innstilling av primær e-post",
"verified": "Verifisert",
"primary": "Primær",
"not_verified": "Ikke verifisert",
"make_primary": "Gjør til primær",
"verify": "Verifiser",
"no_emai_set": "Ingen e-post angitt",
"error_change_password": "Feil ved endring av passord. Sjekk ditt nåværende passord og prøv igjen.",
"mfa_disabled": "Tofaktorautentisering er deaktivert!",
"mfa_page_title": "Tofaktorautentisering",
"enable_mfa": "Aktiver MFA",
"disable_mfa": "Deaktiver MFA",
"mfa_not_enabled": "MFA er ikke aktivert",
"mfa_enabled": "Tofaktorautentisering er aktivert!",
"copy": "Kopier",
"recovery_codes": "Gjenopprettingskoder",
"recovery_codes_desc": "Dette er dine gjenopprettingskoder. Oppbevar dem trygt. Du vil ikke kunne se dem igjen.",
"reset_session_error": "Logg ut og logg inn igjen for å oppdatere økten din, og prøv igjen.",
"authenticator_code": "Autentiseringskode",
"email_verified": "E-post verifisert!",
"email_verified_success": "E-posten din er verifisert. Du kan nå logge inn.",
"email_verified_error": "Feil ved verifisering av e-post",
"email_verified_erorr_desc": "E-posten din kunne ikke verifiseres. Vennligst prøv igjen.",
"invalid_code": "Ugyldig MFA-kode",
"invalid_credentials": "Ugyldig brukernavn eller passord",
"mfa_required": "Tofaktorautentisering er påkrevd",
"required": "Dette feltet er påkrevd",
"add_email_blocked": "Du kan ikke legge til en e-postadresse på en konto som er beskyttet av tofaktorautentisering.",
"duplicate_email": "Denne e-postadressen er allerede i bruk.",
"csrf_failed": "Kunne ikke hente CSRF-token",
"email_taken": "Denne e-postadressen er allerede i bruk.",
"username_taken": "Dette brukernavnet er allerede i bruk.",
"administration_settings": "Administrasjonsinnstillinger",
"launch_administration_panel": "Åpne administrasjonspanelet",
"social_oidc_auth": "Social og OIDC-autentisering",
"social_auth_desc": "Aktiver eller deaktiver sosiale og OIDC-autentiseringsleverandører for kontoen din. Disse koblingene lar deg logge inn med selvhostede autentiseringstjenester som Authentik eller tredjepartsleverandører som GitHub.",
"social_auth_desc_2": "Disse innstillingene administreres på AdventureLog-serveren og må aktiveres manuelt av administratoren.",
"documentation_link": "Dokumentasjonslenke",
"launch_account_connections": "Åpne kontotilkoblinger",
"password_too_short": "Passordet må være minst 6 tegn",
"add_email": "Legg til e-post",
"password_disable": "Deaktiver passordautentisering",
"password_disable_desc": "Å deaktivere passordautentisering vil hindre deg fra å logge inn med et passord. Du må bruke en sosial eller OIDC-leverandør for å logge inn. Skulle leverandøren din fjernes, vil passordautentisering automatisk bli gjenaktivert, selv om denne innstillingen er deaktivert.",
"disable_password": "Deaktiver passord",
"password_enabled": "Passordautentisering er aktivert",
"password_disabled": "Passordautentisering er deaktivert",
"password_disable_warning": "Akkurat nå er passordautentisering deaktivert. Innlogging via en sosial eller OIDC-leverandør er påkrevd.",
"password_disabled_error": "Feil ved deaktivering av passordautentisering. Sørg for at en sosial eller OIDC-leverandør er koblet til kontoen din.",
"password_enabled_error": "Feil ved aktivering av passordautentisering."
},
"collection": {
"collection_created": "Samling opprettet!",
"error_creating_collection": "Feil ved oppretting av samling",
"new_collection": "Ny samling",
"create": "Opprett",
"collection_edit_success": "Samling redigert!",
"error_editing_collection": "Feil ved redigering av samling",
"edit_collection": "Rediger samling",
"public_collection": "Offentlig samling"
},
"notes": {
"note_deleted": "Notat slettet!",
"note_delete_error": "Feil ved sletting av notat",
"open": "Åpne",
"failed_to_save": "Kunne ikke lagre notat",
"note_editor": "Notatredigerer",
"note_viewer": "Notatviser",
"editing_note": "Redigerer notat",
"content": "Innhold",
"save": "Lagre",
"note_public": "Dette notatet er offentlig fordi det er i en offentlig samling.",
"add_a_link": "Legg til en lenke",
"invalid_url": "Ugyldig URL"
},
"checklist": {
"checklist_deleted": "Sjekkliste slettet!",
"checklist_delete_error": "Feil ved sletting av sjekkliste",
"failed_to_save": "Kunne ikke lagre sjekkliste",
"checklist_editor": "Sjekklisteredigerer",
"checklist_viewer": "Sjekklisteviser",
"editing_checklist": "Redigerer sjekkliste",
"new_checklist": "Ny sjekkliste",
"item": "Punkt",
"items": "Punkter",
"add_item": "Legg til punkt",
"new_item": "Nytt punkt",
"save": "Lagre",
"checklist_public": "Denne sjekklisten er offentlig fordi den er i en offentlig samling.",
"item_cannot_be_empty": "Punktet kan ikke være tomt",
"item_already_exists": "Punktet finnes allerede"
},
"transportation": {
"transportation_deleted": "Transport slettet!",
"transportation_delete_error": "Feil ved sletting av transport",
"provide_start_date": "Vennligst angi en startdato",
"transport_type": "Transporttype",
"type": "Type",
"transportation_added": "Transport lagt til!",
"error_editing_transportation": "Feil ved redigering av transport",
"new_transportation": "Ny transport",
"date_time": "Startdato og -tid",
"end_date_time": "Sluttdato og -tid",
"flight_number": "Flynummer",
"from_location": "Fra sted",
"to_location": "Til sted",
"fetch_location_information": "Hent stedsinformasjon",
"starting_airport_desc": "Skriv inn avreiseflyplasskode (f.eks. JFK)",
"ending_airport_desc": "Skriv inn ankomsflyplasskode (f.eks. LAX)",
"edit": "Rediger",
"modes": {
"car": "Bil",
"plane": "Fly",
"train": "Tog",
"bus": "Buss",
"boat": "Båt",
"bike": "Sykkel",
"walking": "Går",
"other": "Annet"
},
"transportation_edit_success": "Transport redigert!",
"edit_transportation": "Rediger transport",
"start": "Start",
"date_and_time": "Dato og tid"
},
"lodging": {
"lodging_deleted": "Overnatting slettet!",
"lodging_delete_error": "Feil ved sletting av overnatting",
"provide_start_date": "Vennligst angi en startdato",
"lodging_type": "Overnattingstype",
"type": "Type",
"lodging_added": "Overnatting lagt til!",
"error_editing_lodging": "Feil ved redigering av overnatting",
"new_lodging": "Ny overnatting",
"check_in": "Innsjekking",
"check_out": "Utsjekking",
"edit": "Rediger",
"lodging_edit_success": "Overnatting redigert!",
"edit_lodging": "Rediger overnatting",
"start": "Start",
"date_and_time": "Dato og tid",
"hotel": "Hotell",
"hostel": "Hostell",
"resort": "Resort",
"bnb": "Bed & Breakfast",
"campground": "Campingplass",
"cabin": "Hytte",
"apartment": "Leilighet",
"house": "Hus",
"villa": "Villa",
"motel": "Motell",
"other": "Annet",
"reservation_number": "Reservasjonsnummer",
"current_timezone": "Gjeldende tidssone"
},
"search": {
"adventurelog_results": "AdventureLog-resultater",
"public_adventures": "Offentlige eventyr",
"online_results": "Nettresultater"
},
"map": {
"view_details": "Vis detaljer",
"adventure_map": "Eventyrkart",
"map_options": "Kartalternativer",
"show_visited_regions": "Vis besøkte regioner",
"add_adventure_at_marker": "Legg til nytt eventyr ved markøren",
"clear_marker": "Fjern markør",
"add_adventure": "Legg til nytt eventyr"
},
"share": {
"shared": "Delt",
"with": "med",
"unshared": "Udelt",
"share_desc": "Del denne samlingen med andre brukere.",
"shared_with": "Delt med",
"no_users_shared": "Ingen brukere delt med",
"not_shared_with": "Ikke delt med",
"no_shared_found": "Ingen samlinger funnet som er delt med deg.",
"set_public": "For å la brukere dele med deg, må profilen din være offentlig.",
"go_to_settings": "Gå til innstillinger"
},
"languages": {},
"profile": {
"member_since": "Medlem siden",
"user_stats": "Brukerstatistikk",
"visited_countries": "Besøkte land",
"visited_regions": "Besøkte regioner",
"visited_cities": "Besøkte byer"
},
"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"
},
"dashboard": {
"welcome_back": "Velkommen tilbake",
"countries_visited": "Land besøkt",
"total_adventures": "Totalt antall eventyr",
"total_visited_regions": "Totalt antall besøkte regioner",
"total_visited_cities": "Totalt antall besøkte byer",
"recent_adventures": "Nylige eventyr",
"no_recent_adventures": "Ingen nylige eventyr?",
"add_some": "Hvorfor ikke begynne å planlegge ditt neste eventyr? Du kan legge til et nytt eventyr ved å klikke på knappen nedenfor."
},
"immich": {
"immich": "Immich",
"integration_fetch_error": "Feil ved henting av data fra Immich-integrasjonen",
"integration_missing": "Immich-integrasjonen mangler på backend",
"query_required": "Forespørsel er påkrevd",
"server_down": "Immich-serveren er nede eller utilgjengelig",
"no_items_found": "Ingen elementer funnet",
"imageid_required": "Bilde-ID er påkrevd",
"load_more": "Last mer",
"immich_updated": "Immich-innstillinger oppdatert!",
"immich_enabled": "Immich-integrasjon aktivert!",
"immich_error": "Feil ved oppdatering av Immich-integrasjon",
"immich_disabled": "Immich-integrasjon deaktivert!",
"immich_desc": "Integrer Immich-kontoen din med AdventureLog for å søke i bildebiblioteket ditt og importere bilder til eventyrene dine.",
"integration_enabled": "Integrasjon aktivert",
"disable": "Deaktiver",
"server_url": "Immich-server-URL",
"api_note": "Merk: dette må være URL-en til Immich API-serveren, så den slutter sannsynligvis med /api, med mindre du har en tilpasset konfig.",
"api_key": "Immich API-nøkkel",
"enable_immich": "Aktiver Immich",
"update_integration": "Oppdater integrasjon",
"immich_integration": "Immich-integrasjon",
"localhost_note": "Merk: localhost vil sannsynligvis ikke fungere med mindre du har satt opp docker-nettverk. Det anbefales å bruke serverens IP-adresse eller domenenavn.",
"documentation": "Immich-integrasjonsdokumentasjon"
},
"recomendations": {
"address": "Adresse",
"phone": "Telefon",
"contact": "Kontakt",
"website": "Nettsted",
"recommendation": "Anbefaling"
}
}

View file

@ -15,8 +15,9 @@
register('sv', () => import('../locales/sv.json')); register('sv', () => import('../locales/sv.json'));
register('pl', () => import('../locales/pl.json')); register('pl', () => import('../locales/pl.json'));
register('ko', () => import('../locales/ko.json')); register('ko', () => import('../locales/ko.json'));
register('no', () => import('../locales/no.json'));
let locales = ['en', 'es', 'fr', 'de', 'it', 'zh', 'nl', 'sv', 'pl', 'ko']; let locales = ['en', 'es', 'fr', 'de', 'it', 'zh', 'nl', 'sv', 'pl', 'ko', 'no'];
if (browser) { if (browser) {
init({ init({

View file

@ -1,6 +1,6 @@
<script lang="ts"> <script lang="ts">
import type { Adventure, Checklist, Collection, Lodging, Note, Transportation } from '$lib/types'; import type { Adventure, Checklist, Collection, Lodging, Note, Transportation } from '$lib/types';
import { onMount } from 'svelte'; import { onMount, onDestroy } from 'svelte';
import type { PageData } from './$types'; import type { PageData } from './$types';
import { marked } from 'marked'; // Import the markdown parser import { marked } from 'marked'; // Import the markdown parser
@ -297,6 +297,17 @@
let isShowingTransportationModal: boolean = false; let isShowingTransportationModal: boolean = false;
let isShowingChecklistModal: boolean = false; let isShowingChecklistModal: boolean = false;
function handleHashChange() {
const hash = window.location.hash.replace('#', '');
if (hash) {
currentView = hash
} else if (!collection.start_date) {
currentView = 'all';
} else {
currentView = 'itinerary';
}
}
onMount(() => { onMount(() => {
if (data.props.adventure) { if (data.props.adventure) {
collection = data.props.adventure; collection = data.props.adventure;
@ -328,11 +339,12 @@
if (collection.checklists) { if (collection.checklists) {
checklists = collection.checklists; checklists = collection.checklists;
} }
if (!collection.start_date) { window.addEventListener('hashchange', handleHashChange);
currentView = 'all'; handleHashChange();
} else { });
currentView = 'itinerary';
} onDestroy(() => {
window.removeEventListener('hashchange', handleHashChange);
}); });
function deleteAdventure(event: CustomEvent<string>) { function deleteAdventure(event: CustomEvent<string>) {
@ -766,41 +778,35 @@
<!-- svelte-ignore a11y-missing-attribute --> <!-- svelte-ignore a11y-missing-attribute -->
{#if collection.start_date} {#if collection.start_date}
<a <a
href="#itinerary"
role="tab" role="tab"
class="tab {currentView === 'itinerary' ? 'tab-active' : ''}" class="tab {currentView === 'itinerary' ? 'tab-active' : ''}"
tabindex="0" tabindex="0">Itinerary</a
on:click={() => (currentView = 'itinerary')}
on:keydown={(e) => e.key === 'Enter' && (currentView = 'itinerary')}>Itinerary</a
> >
{/if} {/if}
<a <a
href="#all"
role="tab" role="tab"
class="tab {currentView === 'all' ? 'tab-active' : ''}" class="tab {currentView === 'all' ? 'tab-active' : ''}"
tabindex="0" tabindex="0">All Linked Items</a
on:click={() => (currentView = 'all')}
on:keydown={(e) => e.key === 'Enter' && (currentView = 'all')}>All Linked Items</a
> >
<a <a
href="#calendar"
role="tab" role="tab"
class="tab {currentView === 'calendar' ? 'tab-active' : ''}" class="tab {currentView === 'calendar' ? 'tab-active' : ''}"
tabindex="0" tabindex="0">Calendar</a
on:click={() => (currentView = 'calendar')}
on:keydown={(e) => e.key === 'Enter' && (currentView = 'calendar')}>Calendar</a
> >
<a <a
href="#map"
role="tab" role="tab"
class="tab {currentView === 'map' ? 'tab-active' : ''}" class="tab {currentView === 'map' ? 'tab-active' : ''}"
tabindex="0" tabindex="0">Map</a
on:click={() => (currentView = 'map')}
on:keydown={(e) => e.key === 'Enter' && (currentView = 'map')}>Map</a
> >
<a <a
href="#recommendations"
role="tab" role="tab"
class="tab {currentView === 'recommendations' ? 'tab-active' : ''}" class="tab {currentView === 'recommendations' ? 'tab-active' : ''}"
tabindex="0" tabindex="0">Recommendations</a
on:click={() => (currentView = 'recommendations')}
on:keydown={(e) => e.key === 'Enter' && (currentView = 'recommendations')}
>Recommendations</a
> >
</div> </div>
</div> </div>

View file

@ -9,7 +9,7 @@ export const load = (async (event) => {
return redirect(302, '/login'); return redirect(302, '/login');
} }
const res = await fetch(`${serverEndpoint}/auth/users/`, { const res = await fetch(`${serverEndpoint}/auth/users`, {
headers: { headers: {
Cookie: `sessionid=${sessionId}` Cookie: `sessionid=${sessionId}`
} }