From 3a66a433ca1873bdd8c8a1cf3f39bb1d89d2e9d8 Mon Sep 17 00:00:00 2001 From: Sean Morley Date: Wed, 16 Oct 2024 20:02:28 -0400 Subject: [PATCH 01/65] Conditional rendering to the country card to show visited status as a badge --- backend/server/worldtravel/serializers.py | 12 ++++++++- .../src/lib/components/CountryCard.svelte | 26 ++++++++++++++----- frontend/src/lib/types.ts | 2 ++ 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/backend/server/worldtravel/serializers.py b/backend/server/worldtravel/serializers.py index b6be995a..e3f70109 100644 --- a/backend/server/worldtravel/serializers.py +++ b/backend/server/worldtravel/serializers.py @@ -7,15 +7,25 @@ class CountrySerializer(serializers.ModelSerializer): return os.environ.get('PUBLIC_URL', 'http://127.0.0.1:8000').rstrip('/').replace("'", "") flag_url = serializers.SerializerMethodField() + num_regions = serializers.SerializerMethodField() + num_visits = serializers.SerializerMethodField() def get_flag_url(self, obj): public_url = self.get_public_url(obj) return public_url + '/media/' + 'flags/' + obj.country_code.lower() + '.png' + + def get_num_regions(self, obj): + # get the number of regions in the country + return Region.objects.filter(country=obj).count() + + def get_num_visits(self, obj): + return VisitedRegion.objects.filter(region__country=obj).count() class Meta: model = Country fields = '__all__' - read_only_fields = ['id', 'name', 'country_code', 'subregion', 'flag_url'] + read_only_fields = ['id', 'name', 'country_code', 'subregion', 'flag_url', 'num_regions', 'num_visits'] + class RegionSerializer(serializers.ModelSerializer): class Meta: diff --git a/frontend/src/lib/components/CountryCard.svelte b/frontend/src/lib/components/CountryCard.svelte index d75e3ed4..78304eca 100644 --- a/frontend/src/lib/components/CountryCard.svelte +++ b/frontend/src/lib/components/CountryCard.svelte @@ -23,12 +23,26 @@

{country.name}

- {#if country.subregion} -
{country.subregion}
- {/if} - {#if country.capital} -
{country.capital}
- {/if} +
+ {#if country.subregion} +
{country.subregion}
+ {/if} + {#if country.capital} +
+ {country.capital} +
+ {/if} + {#if country.num_visits > 0 && country.num_visits != country.num_regions} +
+ Visited {country.num_visits} time{country.num_visits > 1 ? 's' : ''} +
+ {:else if country.num_visits > 0 && country.num_visits === country.num_regions} +
Completed
+ {:else} +
Not Visited
+ {/if} +
+
diff --git a/frontend/src/lib/types.ts b/frontend/src/lib/types.ts index f02822e1..f70cd41e 100644 --- a/frontend/src/lib/types.ts +++ b/frontend/src/lib/types.ts @@ -46,6 +46,8 @@ export type Country = { subregion: string; flag_url: string; capital: string; + num_regions: number; + num_visits: number; }; export type Region = { From 8175daf77384ebfeee1ec0544c201712dffb121d Mon Sep 17 00:00:00 2001 From: Sean Morley Date: Wed, 16 Oct 2024 22:23:59 -0400 Subject: [PATCH 02/65] Filter countries by visit status --- .../src/lib/components/CountryCard.svelte | 2 +- frontend/src/routes/worldtravel/+page.svelte | 68 ++++++++++++++++--- 2 files changed, 61 insertions(+), 9 deletions(-) diff --git a/frontend/src/lib/components/CountryCard.svelte b/frontend/src/lib/components/CountryCard.svelte index 78304eca..a2574ccd 100644 --- a/frontend/src/lib/components/CountryCard.svelte +++ b/frontend/src/lib/components/CountryCard.svelte @@ -34,7 +34,7 @@ {/if} {#if country.num_visits > 0 && country.num_visits != country.num_regions}
- Visited {country.num_visits} time{country.num_visits > 1 ? 's' : ''} + Visited {country.num_visits} Region{country.num_visits > 1 ? 's' : ''}
{:else if country.num_visits > 0 && country.num_visits === country.num_regions}
Completed
diff --git a/frontend/src/routes/worldtravel/+page.svelte b/frontend/src/routes/worldtravel/+page.svelte index 48a1b54d..874991d1 100644 --- a/frontend/src/routes/worldtravel/+page.svelte +++ b/frontend/src/routes/worldtravel/+page.svelte @@ -3,25 +3,38 @@ import type { Country } from '$lib/types'; import type { PageData } from './$types'; - let searchQuery: string = ''; - - let filteredCountries: Country[] = []; - export let data: PageData; console.log(data); - const countries: Country[] = data.props?.countries || []; + let searchQuery: string = ''; + + let filteredCountries: Country[] = []; + const allCountries: Country[] = data.props?.countries || []; + + let filterOption: string = 'all'; $: { - // if query is empty, show all countries if (searchQuery === '') { - filteredCountries = countries; + filteredCountries = allCountries; } else { // otherwise, filter countries by name - filteredCountries = countries.filter((country) => + filteredCountries = allCountries.filter((country) => country.name.toLowerCase().includes(searchQuery.toLowerCase()) ); } + if (filterOption === 'partial') { + filteredCountries = filteredCountries.filter( + (country) => country.num_visits > 0 && country.num_visits < country.num_regions + ); + } else if (filterOption === 'complete') { + filteredCountries = filteredCountries.filter( + (country) => country.num_visits === country.num_regions + ); + } else if (filterOption === 'not') { + filteredCountries = filteredCountries.filter((country) => country.num_visits === 0); + } else { + filteredCountries = filteredCountries; + } } @@ -31,6 +44,38 @@ {filteredCountries.length} countries found

+
+ (filterOption = 'all')} + /> + (filterOption = 'partial')} + /> + (filterOption = 'complete')} + /> + (filterOption = 'not')} + /> +
+
+ {#if searchQuery.length > 0} + +
+ +
+ {/if}
+
{#each filteredCountries as country} From a9b42439cca64491ef6af7ae5b1d2871a945c9a5 Mon Sep 17 00:00:00 2001 From: Sean Morley Date: Wed, 16 Oct 2024 22:37:37 -0400 Subject: [PATCH 03/65] Filter worldtravel by subregion --- frontend/src/routes/worldtravel/+page.svelte | 86 ++++++++++++------- .../src/routes/worldtravel/[id]/+page.svelte | 34 +------- 2 files changed, 59 insertions(+), 61 deletions(-) diff --git a/frontend/src/routes/worldtravel/+page.svelte b/frontend/src/routes/worldtravel/+page.svelte index 874991d1..c7022f8b 100644 --- a/frontend/src/routes/worldtravel/+page.svelte +++ b/frontend/src/routes/worldtravel/+page.svelte @@ -10,8 +10,15 @@ let filteredCountries: Country[] = []; const allCountries: Country[] = data.props?.countries || []; + let worldSubregions: string[] = []; + + worldSubregions = [...new Set(allCountries.map((country) => country.subregion))]; + // remove blank subregions + worldSubregions = worldSubregions.filter((subregion) => subregion !== ''); + console.log(worldSubregions); let filterOption: string = 'all'; + let subRegionOption: string = ''; $: { if (searchQuery === '') { @@ -35,6 +42,12 @@ } else { filteredCountries = filteredCountries; } + + if (subRegionOption !== '') { + filteredCountries = filteredCountries.filter( + (country) => country.subregion === subRegionOption + ); + } } @@ -43,37 +56,44 @@

{filteredCountries.length} countries found

- -
- (filterOption = 'all')} - /> - (filterOption = 'partial')} - /> - (filterOption = 'complete')} - /> - (filterOption = 'not')} - /> +
+
+ (filterOption = 'all')} + /> + (filterOption = 'partial')} + /> + (filterOption = 'complete')} + /> + (filterOption = 'not')} + /> +
+
@@ -98,6 +118,10 @@ {/each}
+{#if filteredCountries.length === 0} +

No countries found

+{/if} + Countries | World Travel diff --git a/frontend/src/routes/worldtravel/[id]/+page.svelte b/frontend/src/routes/worldtravel/[id]/+page.svelte index 90cbfb0d..012284eb 100644 --- a/frontend/src/routes/worldtravel/[id]/+page.svelte +++ b/frontend/src/routes/worldtravel/[id]/+page.svelte @@ -1,31 +1,22 @@

Regions in {country?.name}

@@ -58,23 +49,6 @@ {/each}
- - {data.props && data.props.country ? `Regions in ${data.props.country.name}` : 'Regions'} Date: Thu, 17 Oct 2024 15:14:15 -0400 Subject: [PATCH 04/65] Change over to Voyager map styles --- frontend/src/lib/components/AdventureModal.svelte | 2 +- frontend/src/lib/components/PointSelectionModal.svelte | 2 +- frontend/src/routes/adventures/[id]/+page.svelte | 2 +- frontend/src/routes/collections/[id]/+page.svelte | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/src/lib/components/AdventureModal.svelte b/frontend/src/lib/components/AdventureModal.svelte index 33795d60..386af699 100644 --- a/frontend/src/lib/components/AdventureModal.svelte +++ b/frontend/src/lib/components/AdventureModal.svelte @@ -599,7 +599,7 @@
diff --git a/frontend/src/lib/components/PointSelectionModal.svelte b/frontend/src/lib/components/PointSelectionModal.svelte index 4b5860a0..f7f13330 100644 --- a/frontend/src/lib/components/PointSelectionModal.svelte +++ b/frontend/src/lib/components/PointSelectionModal.svelte @@ -110,7 +110,7 @@

Choose a Point

diff --git a/frontend/src/routes/adventures/[id]/+page.svelte b/frontend/src/routes/adventures/[id]/+page.svelte index 70b80751..c3d598d3 100644 --- a/frontend/src/routes/adventures/[id]/+page.svelte +++ b/frontend/src/routes/adventures/[id]/+page.svelte @@ -366,7 +366,7 @@
From c084f348d92401e52391d90fa7f17af68dff2169 Mon Sep 17 00:00:00 2001 From: Sean Morley Date: Thu, 17 Oct 2024 21:35:55 -0400 Subject: [PATCH 05/65] New login screen with featured images --- frontend/src/lib/index.ts | 8 +- frontend/src/lib/json/backgrounds.json | 24 ++++ frontend/src/routes/login/+page.svelte | 122 +++++++++++------- .../backgrounds/adventurelog_showcase_1.webp | Bin 0 -> 792924 bytes .../backgrounds/adventurelog_showcase_2.webp | Bin 0 -> 908482 bytes .../backgrounds/adventurelog_showcase_3.webp | Bin 0 -> 202178 bytes .../backgrounds/adventurelog_showcase_4.webp | Bin 0 -> 297970 bytes 7 files changed, 105 insertions(+), 49 deletions(-) create mode 100644 frontend/src/lib/json/backgrounds.json create mode 100644 frontend/static/backgrounds/adventurelog_showcase_1.webp create mode 100644 frontend/static/backgrounds/adventurelog_showcase_2.webp create mode 100644 frontend/static/backgrounds/adventurelog_showcase_3.webp create mode 100644 frontend/static/backgrounds/adventurelog_showcase_4.webp diff --git a/frontend/src/lib/index.ts b/frontend/src/lib/index.ts index ff6b9bb2..6e228d7a 100644 --- a/frontend/src/lib/index.ts +++ b/frontend/src/lib/index.ts @@ -1,4 +1,5 @@ import inspirationalQuotes from './json/quotes.json'; +import randomBackgrounds from './json/backgrounds.json'; import type { Adventure, Checklist, Collection, Note, Transportation, User } from './types'; export function getRandomQuote() { @@ -6,7 +7,7 @@ export function getRandomQuote() { const randomIndex = Math.floor(Math.random() * quotes.length); let quoteString = quotes[randomIndex].quote; let authorString = quotes[randomIndex].author; - return '"' + quoteString + '" - ' + authorString; + return { quote: quoteString, author: authorString }; } export function getFlag(size: number, country: string) { @@ -274,3 +275,8 @@ export function isAdventureVisited(adventure: Adventure) { }) ); } + +export function getRandomBackground() { + const randomIndex = Math.floor(Math.random() * randomBackgrounds.backgrounds.length); + return randomBackgrounds.backgrounds[randomIndex]; +} diff --git a/frontend/src/lib/json/backgrounds.json b/frontend/src/lib/json/backgrounds.json new file mode 100644 index 00000000..d1b60c53 --- /dev/null +++ b/frontend/src/lib/json/backgrounds.json @@ -0,0 +1,24 @@ +{ + "backgrounds": [ + { + "url": "backgrounds/adventurelog_showcase_1.webp", + "author": "Sean Morley", + "location": "Franconia Notch State Park, New Hampshire, USA" + }, + { + "url": "backgrounds/adventurelog_showcase_2.webp", + "author": "Sean Morley", + "location": "Tumbledown Mountain, Maine, USA" + }, + { + "url": "backgrounds/adventurelog_showcase_3.webp", + "author": "Sean Morley", + "location": "Philmont Scout Ranch, New Mexico, USA" + }, + { + "url": "backgrounds/adventurelog_showcase_4.webp", + "author": "Sean Morley", + "location": "Great Sand Dunes National Park, Colorado, USA" + } + ] +} diff --git a/frontend/src/routes/login/+page.svelte b/frontend/src/routes/login/+page.svelte index e22c3922..276aa549 100644 --- a/frontend/src/routes/login/+page.svelte +++ b/frontend/src/routes/login/+page.svelte @@ -1,18 +1,21 @@ + + + + + + diff --git a/frontend/src/lib/index.ts b/frontend/src/lib/index.ts index 6e228d7a..52073ad9 100644 --- a/frontend/src/lib/index.ts +++ b/frontend/src/lib/index.ts @@ -1,6 +1,14 @@ import inspirationalQuotes from './json/quotes.json'; import randomBackgrounds from './json/backgrounds.json'; -import type { Adventure, Checklist, Collection, Note, Transportation, User } from './types'; +import type { + Adventure, + Background, + Checklist, + Collection, + Note, + Transportation, + User +} from './types'; export function getRandomQuote() { const quotes = inspirationalQuotes.quotes; @@ -278,5 +286,5 @@ export function isAdventureVisited(adventure: Adventure) { export function getRandomBackground() { const randomIndex = Math.floor(Math.random() * randomBackgrounds.backgrounds.length); - return randomBackgrounds.backgrounds[randomIndex]; + return randomBackgrounds.backgrounds[randomIndex] as Background; } diff --git a/frontend/src/lib/types.ts b/frontend/src/lib/types.ts index f70cd41e..8e4dff13 100644 --- a/frontend/src/lib/types.ts +++ b/frontend/src/lib/types.ts @@ -162,3 +162,9 @@ export type ChecklistItem = { created_at: string; // ISO 8601 date string updated_at: string; // ISO 8601 date string }; + +export type Background = { + url: string; + author?: string; + location?: string; +}; diff --git a/frontend/src/routes/login/+page.server.ts b/frontend/src/routes/login/+page.server.ts index 8b634b4c..fcafe727 100644 --- a/frontend/src/routes/login/+page.server.ts +++ b/frontend/src/routes/login/+page.server.ts @@ -1,11 +1,22 @@ import { fail, redirect } from '@sveltejs/kit'; import type { Actions, PageServerLoad } from './$types'; +import { getRandomBackground, getRandomQuote } from '$lib'; const PUBLIC_SERVER_URL = process.env['PUBLIC_SERVER_URL']; export const load: PageServerLoad = async (event) => { if (event.locals.user) { return redirect(302, '/'); + } else { + const quote = getRandomQuote(); + const background = getRandomBackground(); + + return { + props: { + quote, + background + } + }; } }; diff --git a/frontend/src/routes/login/+page.svelte b/frontend/src/routes/login/+page.svelte index 276aa549..2e8b1c8c 100644 --- a/frontend/src/routes/login/+page.svelte +++ b/frontend/src/routes/login/+page.svelte @@ -7,21 +7,23 @@ console.log(data); import FileImageBox from '~icons/mdi/file-image-box'; - import Account from '~icons/mdi/account'; - import MapMarkerOutline from '~icons/mdi/map-marker-outline'; + + let isImageInfoModalOpen: boolean = false; import { page } from '$app/stores'; - import ImageDisplayModal from '$lib/components/ImageDisplayModal.svelte'; - let quote: { quote: string; author: string } = { quote: '', author: '' }; + import ImageInfoModal from '$lib/components/ImageInfoModal.svelte'; + import type { Background } from '$lib/types.js'; - let background = getRandomBackground(); + let quote: { quote: string; author: string } = data.props.quote; - onMount(async () => { - quote = getRandomQuote(); - }); + let background: Background = data.props.background; +{#if isImageInfoModalOpen} + (isImageInfoModalOpen = false)} /> +{/if} +
+ Login | AdventureLog Date: Mon, 21 Oct 2024 15:28:45 -0400 Subject: [PATCH 07/65] Update `apply_sorting` and `get_queryset` methods in `adventures/views.py` * Change `apply_sorting` method to reference `start_date` field instead of `date` field * Remove references to `date` field in `get_queryset` method --- backend/server/adventures/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/server/adventures/views.py b/backend/server/adventures/views.py index 5acb2a09..b6a82fe6 100644 --- a/backend/server/adventures/views.py +++ b/backend/server/adventures/views.py @@ -40,7 +40,7 @@ class AdventureViewSet(viewsets.ModelViewSet): order_direction = self.request.query_params.get('order_direction', 'asc') include_collections = self.request.query_params.get('include_collections', 'true') - valid_order_by = ['name', 'type', 'date', 'rating', 'updated_at'] + valid_order_by = ['name', 'type', 'start_date', 'rating', 'updated_at'] if order_by not in valid_order_by: order_by = 'name' @@ -1052,4 +1052,4 @@ class AdventureImageViewSet(viewsets.ModelViewSet): return AdventureImage.objects.filter(user_id=self.request.user) def perform_create(self, serializer): - serializer.save(user_id=self.request.user) \ No newline at end of file + serializer.save(user_id=self.request.user) From 53cfd276f2e279467c278b5c38a840d406aa8705 Mon Sep 17 00:00:00 2001 From: Sean Morley Date: Mon, 21 Oct 2024 15:52:57 -0400 Subject: [PATCH 08/65] Refactor adventure and map pages to display visit dates --- .../src/routes/adventures/[id]/+page.svelte | 68 ++++++------------- frontend/src/routes/map/+page.svelte | 40 +++++++++++ 2 files changed, 61 insertions(+), 47 deletions(-) diff --git a/frontend/src/routes/adventures/[id]/+page.svelte b/frontend/src/routes/adventures/[id]/+page.svelte index 70b80751..caa7cb16 100644 --- a/frontend/src/routes/adventures/[id]/+page.svelte +++ b/frontend/src/routes/adventures/[id]/+page.svelte @@ -1,18 +1,3 @@ - - +{#if isImageInfoModalOpen} + (isImageInfoModalOpen = false)} /> +{/if} +
- {#if !data.is_disabled} -
-
-

Signup

-
+
+
+ {#if !is_disabled} +

AdventureLog

+
+

Signup

+
-
-
- -
- -
- -
- -
- -
-
- - {#if $page.form?.message} -
{$page.form?.message}
- {/if} -
-
+
+
+ +
+ +
+ +
+ +
+ +
+ +
- {#if errors.message} -
- {errors.message} + + + +
- {/if} -
-
- {#if quote != ''} - {quote} - {/if} - -
-
-
- {:else} -
-
-

Signup is disabled for this server.

-

{data.message}

-
- - {#if errors.message} -
- {errors.message} + {#if $page.form?.message} +
{$page.form?.message}
+ {/if} + {:else} +
+
+

Registration is Disabled

+

{is_disabled_message}

+
{/if}
- {/if} + +
+
+ {#if quote != null} + {quote.quote} + {/if} +
{quote.author}
+
+
+
+
+ +
+
Signup + + From 874a3844776d6110d882d50c9cc71c3a897f209e Mon Sep 17 00:00:00 2001 From: Sean Morley Date: Mon, 21 Oct 2024 19:59:01 -0400 Subject: [PATCH 11/65] Migrate Django server to guicorn --- backend/entrypoint.sh | 4 ++-- backend/server/main/wsgi.py | 2 +- backend/server/requirements.txt | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/backend/entrypoint.sh b/backend/entrypoint.sh index cbb40db1..93089439 100644 --- a/backend/entrypoint.sh +++ b/backend/entrypoint.sh @@ -36,5 +36,5 @@ fi # Sync the countries and world travel regions python manage.py download-countries -# Start Django server -python manage.py runserver 0.0.0.0:8000 +# Start gunicorn +gunicorn main.wsgi:application --bind 0.0.0.0:8000 \ No newline at end of file diff --git a/backend/server/main/wsgi.py b/backend/server/main/wsgi.py index 71ca83e1..0a4407a6 100644 --- a/backend/server/main/wsgi.py +++ b/backend/server/main/wsgi.py @@ -11,7 +11,7 @@ import os from django.core.wsgi import get_wsgi_application -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "demo.settings") +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "main.settings") application = get_wsgi_application() # add this vercel variable diff --git a/backend/server/requirements.txt b/backend/server/requirements.txt index 225506d3..04584871 100644 --- a/backend/server/requirements.txt +++ b/backend/server/requirements.txt @@ -12,4 +12,5 @@ Pillow whitenoise django-resized django-geojson -setuptools \ No newline at end of file +setuptools +gunicorn==23.0.0 \ No newline at end of file From 78ab3870556303405c277798fc31fcdbb863d467 Mon Sep 17 00:00:00 2001 From: Sean Morley Date: Fri, 25 Oct 2024 14:20:51 -0400 Subject: [PATCH 12/65] Refactor Docusaurus configuration and frontend components - Update the title and logo in Docusaurus configuration - Add Discord and Support links to the navbar - Update the label and href for the GitHub link in the footer - Remove redundant code and comments in ImageInfoModal component - Update the text and link in ImageInfoModal component - Update the conditional statement in +page.svelte file - Comment out the unused code in settings page --- documentation/docusaurus.config.ts | 26 +++++++++++++++--- documentation/static/img/favicon.png | Bin 147916 -> 88890 bytes .../src/lib/components/ImageInfoModal.svelte | 23 ++++++++-------- frontend/src/routes/adventures/+page.svelte | 2 +- frontend/src/routes/settings/+page.svelte | 4 +-- 5 files changed, 36 insertions(+), 19 deletions(-) diff --git a/documentation/docusaurus.config.ts b/documentation/docusaurus.config.ts index 65399fb7..3524fc74 100644 --- a/documentation/docusaurus.config.ts +++ b/documentation/docusaurus.config.ts @@ -3,7 +3,7 @@ import type { Config } from "@docusaurus/types"; import type * as Preset from "@docusaurus/preset-classic"; const config: Config = { - title: "Adventure Log", + title: "AdventureLog", tagline: "Embark, Explore, Remember. 🗺️", favicon: "img/favicon.png", @@ -65,9 +65,9 @@ const config: Config = { // Replace with your project's social card image: "img/docusaurus-social-card.jpg", navbar: { - title: "Adventure Log Docs", + title: "AdventureLog Docs", logo: { - alt: "My Site Logo", + alt: "AdventureLog Logo", src: "img/favicon.png", }, items: [ @@ -79,10 +79,20 @@ const config: Config = { }, // { to: "/blog", label: "Blog", position: "left" }, { - href: "https://github.com/seanmorley15/adventurelog", + to: "https://github.com/seanmorley15/adventurelog", label: "GitHub", position: "right", }, + { + to: "https://discord.gg/wRbQ9Egr8C", + label: "Discord", + position: "right", + }, + { + to: "/support", + label: "Support 💖", + position: "right", + }, ], }, footer: { @@ -108,6 +118,14 @@ const config: Config = { label: "GitHub", href: "https://github.com/seanmorley15/adventurelog", }, + { + label: "Discord", + href: "https://discord.gg/wRbQ9Egr8C", + }, + { + label: "Support 💖", + to: "/support", + }, ], }, // { diff --git a/documentation/static/img/favicon.png b/documentation/static/img/favicon.png index a9ec22b4f53297a2fbb71735008d2e65d5f827ec..21325e542f619039a62e4dd1ab5dcf2765906ef9 100644 GIT binary patch literal 88890 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%0D3me8`QQ!GCc6(%v9=K+d!5C+ZVWuv2#lWOa|x}l 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 literal 147916 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ØqC=Ucb!HX9BuU+rG;8{3c88^8j5)CZ3Np z*3b6?l24A{HjlCKpo_JKA0hRgA*TR}6KDh~j9T{3tY^EiCmho$SNqKK7{ME#!Gqoa zE;k<|P~)S6q_=^?Cmr+;AHdIct_kRxEwijC^18k+(ymc@ilDzT z2k_hu3J}nZKuqCj$({f28g1{QCDjCu)@|M&V*9mS_$$xg`uaW2X~$pc7ODj%!g6Ot zhNXX-Lo!1zP^7C!y077rA3MVSC7@H{mxbg-0iBH6S!d23a-B8*c`3OI_;PWv5+$uR z17Zf$C^{uhe|{Iu%>g<)r)aF6!tqaKbju1ksWKYvRFz~_x(t@$P2(4Su?$@Soe$1h zD-o{N7GR661oaxQa(@t8Q8J}1Cuc!GH*G(?lP2DO%G#Ao{FVV-xF96fI|00+jkCQr z_CC0ed~^q%5czmt+5lZ!ZWW-(eHV_fD_4XA6`tg*Q+h-yeLk)78wD7y7S%fSZsuX3yu@!nj+p{yk*x}I#woyS^c=eFfg zjyjUdW5}#iZ?76}WehaxPoA^(r!BPldy#h|BV1~k%F0vkSsT0W?;soQh<3gB8c?81 z=FU}@V;s;g0`->*&>uYB`nzv_^XLBi8^q{Kz14MgvP*r?v?sIVUeC~}duVSE&|~E7Pf>W(h}IrE_1r}YmZKUTRm>QP6L55_ z#+KM^?^v@2%}NE-jj4(C$(E6jknQI)xiS3YF3t|`;pCGqq8MBs&{_9&{Y(Ha%1+_6 zV{G2bu)1>!uXQ3nI5GJ_-?A&MdtDd+wj#3Q<}v7c^%tp@0#Y&Y$OG|O&m9@Pla z2!TkYZ-toWj+Bg;wBe>-!0rc|=pL>Lub|}Hl>t+rvbh52)O;rkzbRIk99vr5>0$e| zkKnKF!to=?++8DYd%eYMH%R$jW8^lU`UmkA`Uj8j$&Yh5DFM9&q-r{(yZXG`d-m8` z{kSg+=&nbgvnAm3$51at-QXW_@ zgOi8CEO%w*Ty@Z`|F_O_>-{?USQOB;zdHWv3eatjx}GI#$=jCYOMw?5#i{C{1$3IS z$bu3e*D}5SU47sfppRAjE&{?jfG*hbnR0`OR)nbXx$r40lhX{yLI0qI-4C{r^tR!% za+Nm}(4~T<61lAS>6e>l(y|2f%j`|h9neqq2U2pU!NBtYbh&-1^0y^viNcbKe{jqM z><>BAaTx-^o+zbl-0vfAJ(GUA6}QQR4M`R&`^PHJD9n883v42H-pF$AI#i0{N2xH0 znv!rfT^an;iuULTm7U6HPNTSs?z1~M{OA$#5s4?)AjR=mWL7Q~GLhRkL3{fYD_aS? z_7EA3R>k$fTGHr&I{&5*M+TZitv>#a^|C&VXT@A+J?7 z5xKH~Y#n5+z>+ZQ>p`Fbwn)*MAJ+pHm4rRdaz7snvf(!)I5dI6SPP(Br&j~@F+k5& zM1?N!fc`;%r|)kg9o!M1S3u`93Qss&WE|18fL=*EPrnaeOhBh-eFgHBJ z+Wlu(zt=+^K7$ib!<;T(YM&}2Zn=jn$(vA%R52S|y0H zT*&dO&~2jO-pBFYDh@x|0pj~`6OwXN`RTk!LiPQo-7Fm0a=ipeae{DVfIAN%V|XMN zQR>z8xj9j1o|!=;nK{kfsCJb`z-Xl8xbuK6p-Ck&qj$171naz}rAB?&^I&)d*0GF4 z8)oPP>tqvd`Z_-PizfOfD^O<=Fk0)7i=oG`m5)fq5tvQ@4a)n*Z-ZM z2*on>oF6(R4L#$w=4mFy8(W9{?G0<(xuk5Si<)!j|FYYjsT3!BZOuN=`uoZ}c&Xd2 zv*K!^!i~Te?`6)h=D{;`?tF}`hkX={BjlbTV3n83EYNcjhvWTvMI1YSZJ4NK$=L#f z_SFfTEJJ(QHj=>|9Pe$QyVpc3y9i=R1L2DZ;9=e5X?Qsywt1&lbVMlqQ*j}gZ-x?pyol9mD#jw;A; z_E|T~@iKeKtars|QG*?$m{(GkjQ9ri?3><00rHQ21f-)aH2ob62eAli=y|lJ6Xtvx zJ5yETBKvrRm91m!eDMhy>nD<(i?H0H(yOy>Ln>vlbT3})G|@1}e5e*Ww8X*$;VwYcF&VBx(vfORCy39VO$k_@}Y_hCvfYhq0F@Th*5UQzB zpFy)<2E^oUa2@Afgp}Nf@C2({G1hhx5 z*E=Q(QnIFIjbvF3^@-24EO(otONO56aa+IiX@EX`)l{U+x_^81+?y%6%XhV|kA^qE z%GvN}6;FS(g+u_IiHfhnGDfgUgQ&+CuL7NO&c zrDM5&Y30>S_3+=Zjv7Xz6seoy;p5G}^Tu0WdvyW5yW9UAALD?|5jJM&qEURyfL=yu zcD%&g3yu+gq4v9~KQROLL~EaU06Xvd2eTSeda^F&{2u1#`7>lu}bhH>eaz8p{Zl?mqNuFLW%7r49WS zrGB%H#wo#xf0JxyGbROe9qCh!fiIwld<8*qA7{rQKK-abJXk~1yNfiTQ4L!Zb^|kG zLUJAzUVFA4qSTQk}sE1M7mrI1#oY!Aa!blpEyCU>y zB+d|-dklZ2i}v;i?Tw!JeP=}vx%Hwq7p@+pO~S_1Z2TI4K24H$ksxvMIa2|hJ@lF~ zoIJ-kvR!J8Ui{<*%22c4Kme6&eX*u>;TJ0y9bmQH5sK^jI8Eqw{&(9Gy zTi%R~b*oA|Dyw}Q(9?v{lYA|i@`d!$8A!-`i0KTu2P7p~wyyD^=H^7fiP|U<54ltf z6SuMet#A{AGatQEAKjx6{o@vpZNbAP(xiav*XO=Jdq8&xHZji`O<^=!m+!&gDr>?` z?qKhUgX5=b$fG+5McCfPN{!n0)ff4(RogyIzx71XYE~ zC7@rhTv&2{zJPAZ+_rQieb_00&a9kd8fqgmhYa=w(6=7ZQH>>cwLZPx!)CLF32#Va zk}->2s=B{9(yQtqOWMeWZJd6}Qf^CT!6|-YJ=7i7lh-v{4*W1e*ohFfM)1P{+~5p_ zAIYq|^!m%FKZonF?5VPqO75}QR52IOS;DrO?v%b||39Mw9RrP&+ctv@X0p_IR|`{q zztUeuB6(9jH%#|5axv%?I6h3#@3Kd}2@mU{#V(TVA|Ue|Gjxvor3_q}%D2e0RpE(l z?+VhhyLj>wAU@kh5wF3`JMg^_S=N_xZCT25*UpQYq1Q(ZOm?j$XS*>f;q-jTT}#tE zO;QFIsbF5P=q{%=;iWn#^^mt(bUCZX>qZC%DO^(bU#gT>Xxtt;)DEn~8 zrzm{&0B0+O#KzzlUi(BG{%C^a1p~yCcqM0p0i?C#t)0Xrpf9wdZsbW<2Xxug7Lb3v z-IDt}Qr!47!u$;V!E1N^?wjBE#aD9<{pA331$qT^W)KdtkQw@qwdC%zhkn%zy=*+2 zK5AVmQtvk<09s#iTT!SMxkxHX=1$74i800ZScFYW&usx}BQ;50g6(AsSE)wcD|>ma zDTiB`$$}YrTr0T~&@<_)i^Zc6y^v}>R*;T1G3d7O>}ifPT0=%Z_o5BYZR*5;bOTv_ zrxx`X9@PFPM-s*G{fZIqxec9p7so8xuG${>^8s{gvSBSO8B~drSMDO}ui@#B=#sZ7 z<7(mx#}c#0YRV8n=pkLy&;CUP^tuJ8iN>r7S{*T_^_3m=XL8PQGox?9W#yvqkaG0Q z?V|_|(cV18%H|mwYdsVmMUG4WXN-SJ+ubFg-v~fo_D!x1=yqgt-pJf%3h1mCDUIWb z8Tt~?pBE`k6x%9hxfTd3g|aF`uK_ykKxz09?xAz{0|j*N>;?ecezwkWi+QLa$O)j= z$6UlTM%9+YM?7syRwELl^dqM_ojAzRV5NX3V5nb}JOL6{_;V>&i;J9OPJAKqdHDuhM^)R{XC`5e*|m;N zRY8T0D_Mkh5r!;JQxDzrrYTV?UgA2J`&3Y)u;zUY8nGMJS^G4_}-8paIW;rbHWSx>D$$?o>f;I>W? ztQ}(Q?kU3dDV%_M2NAN=H31=oSg1E($Fr(WTxRHVSJRC>;d2J)GlZ}tWitEd#iY20 zuiyE5Z~W#jzM9gnFH(jsm@*0ILeerID7wi6#R6I5DLQw5gw00-5irS(5y;i<5<7EV zE4@nAS&`&43p5_-R9F(rM2^b2@SHU%L95D?veRW|*ZdJ3Z259TT9uu(wx$-)mB?kw z^y<^iiiBkGwucU8<8?rfRStHf>Q($08QGHA-VL1WZs6%h{P!KW#TJ~bExmO4EE4ZL z66g3Dqugc63pzGfjs02A@X*uwawXu=!j?T&$h^EhoD8)-B=0K$wW)k6M=xl zHwnzhMjjz{&QLT?(B2w|%U`&1gi(GV^XI-FB5;}_^+OjynQ~l=+RH{8*=VqfiH5@-wej(A3-t5%@#xEk@Yi?Y1uPF*P`Tp0Q3|Q> z^+tfkNWhjxEuw%%VCV1IUmR**UD)7u7`y)YH8%0sVbwAku~9S|aS2W)qb~v0!~-n3 zQxUGr&=t_LnDVOZr5lnPN8R!}*!#&Uj`vsK8OEZxP|VsEgXF6!z=Cp`KnQ{GcItve%8cA zByMjH&;w7|_qXSVUK>%fz68?8(e{zdlAEAKgG=RF$h8zzWOYlUkxGmMxa~u9?)1^# z9>8z)#8f92-E%!h_Hs*^e#(lF*!2Ylbi2%#EcX|vRmtz9NVC!q7e?DM7p-Ks{(22=-hj$Mh1nr5w1rFT+{+z;{S%lq)xo}utn zoA}C)bM}h0l6qa&y!1`i3=a+goik$fIp!&XHnjsQ1$1O?)NY5D1$32wElcinT+3Xf zDcJ>_0!ZK$_e9J2WPc5AMvK=@Ialur*>Hq{$1hTxRFcwJR(soRbfg>>|sfc%CvLY^J z7SPWJL(d=3Tx& zpWzMa7QznC8=v6*mv#}ZKGV&p=Er?$V4n-<-2G^9zzo-x1a9ob0a) z+nrwF>W0SgE&{q~8Aw0helN9Ew7LLQ);bxaOpN0^2SBetivlq@;s~PP=VbTLJ!s-! z*F$u=CgL)#$FVwU=C7DaiWxza^I(i7_FeHG)Al3$Lp&j&02PKQCIz{bkG0=MBFtT5{)1 zi^?4975S`$WqADA1;R4dokL#&`V>G9oQ6ohHd{U#?Eur1;wCfnQXjeo=-e#$p!Dna zPg|H@aPS^B0!f4N;GvZb#Zg zDpfN)kyNZd&e>wsGvB)Flg)=K26=r8tQWE^fN2lC2IyqDXCvupDxiCCibw!`@BIfj zdA0^*nw^U;wcO4|Bu6%D&iC8QRi$4mK)2hmW&TTeQDr{oOfNp0lKc3{RwK?L?ZC?( z;p}JyyC3C9hHGdz+cM7Qg=PXGBcK~SYmvFtfK0FH%Up857|>OE*M2{WB&nky$0rLn zLhPKPxf-FfH9~7;2)A*D%;}e8NAdi&;LTv5Y?;l@fS-ScesOkQ1%%aVDyK_qD}k+? z&!mSw53(=byA}m>ZFqk6fG)wq63{Q5XI|+AV$Slk|Lw~HdVOY^8=@7YxEi2qyl5>< z%gx7T=p~?&xDyMYx3&(k@!ALQJI^Xnlq;P9{cJ5y&LG9f-9M=wXW99bX04gI$aC!m zS_g@W&0m(ZO=ioYr`WnqJZ$8u@qwzmou5NbkmL&JS*(Cg&3PXWu>bxeDY+w4w-v-HBeDgmfI`2Tf>vd-no2u;iE`=gzkNu>~*mF zv4ecH1*cd=krwa+g3+1zdJJ3wZRrT0tE--#lb0FLO+S1_hOYQ)t~R*?Ym8sp3MfTfIgv=RszHn zP!|+biA{=V&pQ5bK%XZ4s`jHvX324?0!J|rFTaod_g};5!3K)N$k8%jsb!;O4^)J_ zCj*Y!cP;}I6Z{yRc6Fuu>;b(lRZD4CFTIP?!v>C?He~LeBtXw?0l5q*1xRsqmd3Oh`9;lHJ_lOvi*Hv`p1B0{C7@S;{`Q~#L3gkJ+p_?j z<}9wS?p>3Beo+toa)7QSr>dVk4(Kwr<~T^{r|eQwdVrnRM+mq7KcKN|0C9l~YwB&I zR!SHn zoCzuJ*$1!Vtt2DEhDLOKfJyPTho5k(_-E`6Y@vL;K&b=RqvJ42`PUo8MN zYevpjIeB3MHp&bOk#h(yh|%f*!Fmtw_EY5Hv1ak2c|aFD2Am|#rSLe`Ch9RbPdz)~XDhJ#=wqbB74>yV(2jYv?{(6}eUo zR`|Id9Fcyd=Db;Y02V>%zCsSub1xWQ+Hg(+I`sfd0A$b0*g;leH2Px=hSa&$x~-jJ z=Zl}9wRVamkBmS~-Rg2IZ_{I{#X2&=D97$2jT^|KEqwSFeEYjdqn22uhF%LvLL;3% zn#~5%#AKDG#BS{-s}Z~fgTa||=vA;#j&c$nT_3(5$hevvTMIo;M#MZfK;Siu&8_kl zre>+NFMp1jVa|PJM_R4Baf?!wado_rRBs%wkDwJ{Z6iQyGeY10F;cfHlD<5z1DI`~iJ$_}iXCt5jD>ajg)3(?g>Xzz+l2d{jh4H$J*DO)I(QMJfzh zJ}&2nZUK^PWDjntwxxpP?DNqNSL7=qa}uqczwJ;_yYm;+7Tiiu3&U>4^KbN zk;SVzfxyu;Ywja2v}$SA@Mk_z>cV?`Dxe!%S`*;#-Y8f}lJU-l1Q*o7=lw#<+%VvG z;n-&g-&sQ#a_#g{aGlqx5VCBIl<&p+4#&srnlY6Zqt%~@oNEdYqiP|Qhv<4HiI`yv0W zMnT*^bicF@21>e5>b;TXg-9zq9`9=gQ@$u2BBv0Pr{r7VK4^6*c-@GNfp8K{h6reZSKAKGh^svzot?NYrT{f~YKyTr@Kio&uTDw44 zMqS0YxVS)>9lM#y(1m9eAuTfap@UJ{hub{H*25EYwog%ndni1DOGEVC<@H?frXOr! zK{C36w~;OoCGcranxN$y=};=C=|<{7th}p;l92eA^E`5fnLg%>lwD-T5JuW17C^`5^7+16 z&8Pr<*8uteu2-mEx+1sXBA5-tj>Bc-Pz0<1BkpE>P$(|$Ku|5*6_ zr=*ZmKXb};x#-wt9slBhuF8xCUP@VJ(dGdC<5dZgpv|#TNrY_Gi`NCT`qeffr*|Z9 z2HPP6B`b=M7C9gt8AqkDQ>mRW2IyRCl)_d(cXL)VeKCs~9Iaya{WZiE(4}2cZzY;3 z9f{!TW4F`pftL-?w|@8Q-}?C_pff|i4xnExLpQEYvY!(;yvmPTG}9BAh4n)Zqa;GO za)SFmeE@IeDWdEML5tec^$ksBVk>|kfKldDgIyu8J6X!`O;~4M=1li`w-$Z(2Ts+VC;bI6*WjP$Uhw zMSv`ckR?8{sEKIU#NfFpm zY7tJDXH|=U>e4b+#eF;m0n}$HfF$EwyQh_ebAYbjs{-^`Og?tLNI*Y8f`NFp>*lLK zq?x)MC({-Ig@pv~MFO~^bLLM2Wc|BHMzlgz1-vPbdj0;Y7pLmJ&nUU;*djR~y7`tF zx*L>$E-G z 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—#HaILr$$kBN7nfxtV^{H?1TN?9 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 diff --git a/frontend/src/lib/components/ImageInfoModal.svelte b/frontend/src/lib/components/ImageInfoModal.svelte index fed5234a..c384143f 100644 --- a/frontend/src/lib/components/ImageInfoModal.svelte +++ b/frontend/src/lib/components/ImageInfoModal.svelte @@ -31,26 +31,25 @@

About This Background

-
- - {#if background.author != ''}

Photo by {background.author}

{/if} {#if background.location != ''}

Location: {background.location}

{/if} - +

+ + Join the Discord + + to share your own photos. Post them in the #travel-share channel. +

-
diff --git a/frontend/src/routes/adventures/+page.svelte b/frontend/src/routes/adventures/+page.svelte index 2e6c270c..575e5ebc 100644 --- a/frontend/src/routes/adventures/+page.svelte +++ b/frontend/src/routes/adventures/+page.svelte @@ -32,7 +32,7 @@ let typeString: string = ''; $: { - if (typeof window !== 'undefined') { + if (typeof window !== 'undefined' && typeString) { let url = new URL(window.location.href); url.searchParams.set('types', typeString); goto(url.toString(), { invalidateAll: true, replaceState: true }); diff --git a/frontend/src/routes/settings/+page.svelte b/frontend/src/routes/settings/+page.svelte index 61e2d57e..1fb314c5 100644 --- a/frontend/src/routes/settings/+page.svelte +++ b/frontend/src/routes/settings/+page.svelte @@ -186,7 +186,7 @@
-
+ For Debug Use: Server PK={user.pk} | Date Joined: {user.date_joined From ef3f2aee107795930c8afa9d054289d45cb80004 Mon Sep 17 00:00:00 2001 From: Sean Morley Date: Fri, 25 Oct 2024 22:57:10 -0400 Subject: [PATCH 13/65] =?UTF-8?q?Fast.=20Easy.=20Fun.=20Deployment=20?= =?UTF-8?q?=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/Dockerfile | 17 ++++++++++++----- backend/nginx.conf | 38 ++++++++++++++++++++++++++++++++++++++ docker-compose.yml | 39 +++++++++++++-------------------------- 3 files changed, 63 insertions(+), 31 deletions(-) create mode 100644 backend/nginx.conf diff --git a/backend/Dockerfile b/backend/Dockerfile index 6de10676..1dbe388a 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,5 +1,4 @@ -# Dockerfile - +# Use the official Python slim image as the base image FROM python:3.10-slim LABEL Developers="Sean Morley" @@ -11,9 +10,9 @@ ENV PYTHONUNBUFFERED 1 # Set the working directory WORKDIR /code -# Install system dependencies +# Install system dependencies (Nginx included) RUN apt-get update \ - && apt-get install -y git postgresql-client gdal-bin libgdal-dev \ + && apt-get install -y git postgresql-client gdal-bin libgdal-dev nginx \ && apt-get clean # Install Python dependencies @@ -24,10 +23,18 @@ RUN pip install -r requirements.txt # Copy the Django project code into the Docker image COPY ./server /code/ +# Copy Nginx configuration +COPY ./nginx.conf /etc/nginx/nginx.conf + # Collect static files RUN python3 manage.py collectstatic --noinput --verbosity 2 # Set the entrypoint script COPY ./entrypoint.sh /code/entrypoint.sh RUN chmod +x /code/entrypoint.sh -ENTRYPOINT ["/code/entrypoint.sh"] + +# Expose ports for NGINX and Gunicorn +EXPOSE 80 8000 + +# Command to start Nginx and Gunicorn +CMD ["bash", "-c", "service nginx start && /code/entrypoint.sh"] diff --git a/backend/nginx.conf b/backend/nginx.conf new file mode 100644 index 00000000..7e123c09 --- /dev/null +++ b/backend/nginx.conf @@ -0,0 +1,38 @@ +worker_processes 1; +events { + worker_connections 1024; +} + +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + + sendfile on; + keepalive_timeout 65; + + upstream django { + server server:8000; # Use the internal Docker networking + } + + server { + listen 80; # NGINX always listens on port 80 inside the container + server_name localhost; + + location / { + proxy_pass http://server:8000; # Explicitly forward to Django service + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + + location /static/ { + alias /code/staticfiles/; # Serve static files directly + } + + location /media/ { + alias /code/media/; # Serve media files directly + } + } +} diff --git a/docker-compose.yml b/docker-compose.yml index 8e5a91e9..fee119ba 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,15 +1,15 @@ services: web: - #build: ./frontend/ - image: ghcr.io/seanmorley15/adventurelog-frontend:latest + build: ./frontend/ + #image: ghcr.io/seanmorley15/adventurelog-frontend:latest container_name: adventurelog-frontend restart: unless-stopped environment: - - PUBLIC_SERVER_URL=http://server:8000 # MOST DOCKER USERS WILL NEVER NEED TO CHANGE THIS, EVEN IF YOU CHANGE THE PORTS - - ORIGIN=http://localhost:8080 - - BODY_SIZE_LIMIT=Infinity # This is measured in bytes + - PUBLIC_SERVER_URL=http://server:8000 # MOST DOCKER USERS WILL NOT NEED TO CHANGE THIS EVER EVEN IF YOU CHANGE THE OUTWARD PORT + - ORIGIN=http://localhost:8015 + - BODY_SIZE_LIMIT=Infinity ports: - - "8080:3000" + - "8015:3000" depends_on: - server @@ -25,43 +25,30 @@ services: - postgres_data:/var/lib/postgresql/data/ server: - #build: ./backend/ - image: ghcr.io/seanmorley15/adventurelog-backend:latest + build: ./backend/ + #image: ghcr.io/seanmorley15/adventurelog-backend:latest container_name: adventurelog-backend restart: unless-stopped environment: - PGHOST=db - PGDATABASE=database - PGUSER=adventure - - PGPASSWORD=changeme123 # This should be the same as the POSTGRES_PASSWORD in the db service + - PGPASSWORD=changeme123 - SECRET_KEY=changeme123 - DJANGO_ADMIN_USERNAME=admin - DJANGO_ADMIN_PASSWORD=admin - DJANGO_ADMIN_EMAIL=admin@example.com - - PUBLIC_URL='http://localhost:81' # NOTE: THIS IS THE PUBLIC URL TO THE **NGINX** SERVER USED FOR MEDIA FILES! - - CSRF_TRUSTED_ORIGINS=https://api.adventurelog.app,https://adventurelog.app # This is a comma separated list of trusted origins for CSRF, this should include where your frontend is hosted. + - PUBLIC_URL='http://localhost:8016' # Match the outward port, used for the creation of image urls + - CSRF_TRUSTED_ORIGINS=http://localhost:8016 # Comma separated list of trusted origins for CSRF - DEBUG=False - - FRONTEND_URL='http://localhost:8080' # This is the URL of the frontend server - #- DISABLE_REGISTRATION=True + - FRONTEND_URL='http://localhost:8015' # Used for email generation. This should be the url of the frontend ports: - - "8000:8000" + - "8016:80" # User can change this to any outward port without breaking the setup depends_on: - db volumes: - adventurelog_media:/code/media/ - nginx: - image: nginx:latest - container_name: adventurelog-nginx - restart: unless-stopped - ports: - - "81:80" - volumes: - - adventurelog_media:/app/media - - ./proxy/nginx.conf:/etc/nginx/conf.d/default.conf:ro - depends_on: - - server - volumes: postgres_data: adventurelog_media: From de873c9eb558d2b38ac3b949641cd7dc7e51bac8 Mon Sep 17 00:00:00 2001 From: Sean Morley Date: Sat, 26 Oct 2024 09:44:36 -0400 Subject: [PATCH 14/65] Add backend and frontend beta deployment workflows --- .github/workflows/backend-beta.yml | 46 +++++++++++++++++++++++ .github/workflows/frontend-beta.yml | 46 +++++++++++++++++++++++ documentation/docs/Installation/docker.md | 45 +++++++--------------- documentation/docusaurus.config.ts | 9 ----- 4 files changed, 105 insertions(+), 41 deletions(-) create mode 100644 .github/workflows/backend-beta.yml create mode 100644 .github/workflows/frontend-beta.yml diff --git a/.github/workflows/backend-beta.yml b/.github/workflows/backend-beta.yml new file mode 100644 index 00000000..a02bbaf1 --- /dev/null +++ b/.github/workflows/backend-beta.yml @@ -0,0 +1,46 @@ +name: Upload beta backend image to GHCR and Docker Hub + +on: + push: + branches: + - development + paths: + - "backend/**" + +env: + IMAGE_NAME: "adventurelog-backend" + +jobs: + upload: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Login to GitHub Container Registry + uses: docker/login-action@v1 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.ACCESS_TOKEN }} + + - name: Login to Docker Hub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: set lower case owner name + run: | + echo "REPO_OWNER=${OWNER,,}" >>${GITHUB_ENV} + env: + OWNER: "${{ github.repository_owner }}" + + - name: Build Docker images + run: docker buildx build --platform linux/amd64,linux/arm64 --push -t ghcr.io/$REPO_OWNER/$IMAGE_NAME:beta -t ${{ secrets.DOCKERHUB_USERNAME }}/$IMAGE_NAME:beta ./backend diff --git a/.github/workflows/frontend-beta.yml b/.github/workflows/frontend-beta.yml new file mode 100644 index 00000000..29597ae0 --- /dev/null +++ b/.github/workflows/frontend-beta.yml @@ -0,0 +1,46 @@ +name: Upload beta frontend image to GHCR and Docker Hub + +on: + push: + branches: + - development + paths: + - "frontend/**" + +env: + IMAGE_NAME: "adventurelog-frontend" + +jobs: + upload: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Login to GitHub Container Registry + uses: docker/login-action@v1 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.ACCESS_TOKEN }} + + - name: Login to Docker Hub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: set lower case owner name + run: | + echo "REPO_OWNER=${OWNER,,}" >>${GITHUB_ENV} + env: + OWNER: "${{ github.repository_owner }}" + + - name: Build Docker images + run: docker buildx build --platform linux/amd64,linux/arm64 --push -t ghcr.io/$REPO_OWNER/$IMAGE_NAME:beta -t ${{ secrets.DOCKERHUB_USERNAME }}/$IMAGE_NAME:beta ./frontend diff --git a/documentation/docs/Installation/docker.md b/documentation/docs/Installation/docker.md index 0c12fde9..9c2fa2b4 100644 --- a/documentation/docs/Installation/docker.md +++ b/documentation/docs/Installation/docker.md @@ -30,42 +30,23 @@ Here is a summary of the configuration options available in the `docker-compose. | Name | Required | Description | Default Value | | ------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------- | | `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 acess the app from. | http://localhost:8080 | +| `ORIGIN` | Sometimes | Not needed if using HTTPS. If not, set it to the domain of what you will acess 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 **kiliobytes**. | Infinity | ### Backend Container (server) -| Name | Required | Description | Default Value | -| ----------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------- | --------------------- | -| `PGHOST` | Yes | Databse host. | db | -| `PGDATABASE` | Yes | Database. | database | -| `PGUSER` | Yes | Database user. | adventure | -| `PGPASSWORD` | Yes | Database password. | changeme123 | -| `DJANGO_ADMIN_USERNAME` | Yes | Default username. | admin | -| `DJANGO_ADMIN_PASSWORD` | Yes | Default password, change after inital login. | admin | -| `DJANGO_ADMIN_EMAIL` | Yes | Default user's email. | admin@example.com | -| `PUBLIC_URL` | Yes | This is the publically accessible url to the **nginx** container. You should be able to acess nginx from this url where you access your app. | http://127.0.0.1:81 | -| `CSRF_TRUSTED_ORIGINS` | Yes | Need to be changed to the orgins where you use your backend server and frontend. These values are comma seperated. | Needs to be changed. | -| `FRONTEND_URL` | Yes | This is the publically accessible url to the **frontend** container. This link should be accessable for all users. Used for email generation. | http://localhost:3000 | - -### Proxy Container (nginx) Configuration - -In order to use media files in a production environment, you need to configure the `nginx` container to serve the media files. The container is already in the docker compose file but you need to do a few things to make it work. - -1. Create a directory called `proxy` in the same directory as the `docker-compose.yml` file. -2. Create a file called `nginx.conf` in the `proxy` directory. -3. Add the following configuration to the `nginx.conf` file: - -```nginx -server { - listen 80; - server_name localhost; - - location /media/ { - alias /app/media/; - } -} -``` +| Name | Required | Description | Default Value | +| ----------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------- | +| `PGHOST` | Yes | Databse host. | db | +| `PGDATABASE` | Yes | Database. | database | +| `PGUSER` | Yes | Database user. | adventure | +| `PGPASSWORD` | Yes | Database password. | changeme123 | +| `DJANGO_ADMIN_USERNAME` | Yes | Default username. | admin | +| `DJANGO_ADMIN_PASSWORD` | Yes | Default password, change after inital login. | admin | +| `DJANGO_ADMIN_EMAIL` | Yes | Default user's email. | admin@example.com | +| `PUBLIC_URL` | Yes | This needs to match the outward port of the server and be accessible from where the app is used. It is used for the creation of image urls. | 'http://localhost:8016' | +| `CSRF_TRUSTED_ORIGINS` | Yes | Need to be changed to the orgins where you use your backend server and frontend. These values are comma seperated. | http://localhost:8016 | +| `FRONTEND_URL` | Yes | This is the publically accessible url to the **frontend** container. This link should be accessable for all users. Used for email generation. | 'http://localhost:8015' | ## Running the Containers diff --git a/documentation/docusaurus.config.ts b/documentation/docusaurus.config.ts index 3524fc74..df03a831 100644 --- a/documentation/docusaurus.config.ts +++ b/documentation/docusaurus.config.ts @@ -88,11 +88,6 @@ const config: Config = { label: "Discord", position: "right", }, - { - to: "/support", - label: "Support 💖", - position: "right", - }, ], }, footer: { @@ -122,10 +117,6 @@ const config: Config = { label: "Discord", href: "https://discord.gg/wRbQ9Egr8C", }, - { - label: "Support 💖", - to: "/support", - }, ], }, // { From ae70c96ddcb0bf79bb6b944bcb8dbde82c4309e9 Mon Sep 17 00:00:00 2001 From: Sean Morley Date: Sat, 26 Oct 2024 09:47:46 -0400 Subject: [PATCH 15/65] Trigger workflows --- backend/server/adventures/serializers.py | 3 ++- frontend/src/lib/components/AdventureCard.svelte | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/server/adventures/serializers.py b/backend/server/adventures/serializers.py index f2a10de7..25b7d439 100644 --- a/backend/server/adventures/serializers.py +++ b/backend/server/adventures/serializers.py @@ -186,4 +186,5 @@ class CollectionSerializer(serializers.ModelSerializer): for user in instance.shared_with.all(): shared_uuids.append(str(user.uuid)) representation['shared_with'] = shared_uuids - return representation \ No newline at end of file + return representation + \ No newline at end of file diff --git a/frontend/src/lib/components/AdventureCard.svelte b/frontend/src/lib/components/AdventureCard.svelte index e6952f03..b30fb415 100644 --- a/frontend/src/lib/components/AdventureCard.svelte +++ b/frontend/src/lib/components/AdventureCard.svelte @@ -29,7 +29,6 @@ let isWarningModalOpen: boolean = false; export let adventure: Adventure; - let activityTypes: string[] = []; // makes it reactivty to changes so it updates automatically $: { From 6daacabc1b7265a07db9b39c4abadf9fbb20a956 Mon Sep 17 00:00:00 2001 From: Sean Morley Date: Sat, 26 Oct 2024 10:57:52 -0400 Subject: [PATCH 16/65] Refactor Docker Compose configuration and update environment variables --- README.md | 47 +++++++++++++--------------------------------- docker-compose.yml | 8 ++++---- 2 files changed, 17 insertions(+), 38 deletions(-) diff --git a/README.md b/README.md index 61be4448..ee8dcfe9 100644 --- a/README.md +++ b/README.md @@ -53,42 +53,23 @@ Here is a summary of the configuration options available in the `docker-compose. | Name | Required | Description | Default Value | | ------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------- | | `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 acess the app from. | http://localhost:8080 | +| `ORIGIN` | Sometimes | Not needed if using HTTPS. If not, set it to the domain of what you will acess 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 **kiliobytes**. | Infinity | ### Backend Container (server) -| Name | Required | Description | Default Value | -| ----------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------- | --------------------- | -| `PGHOST` | Yes | Databse host. | db | -| `PGDATABASE` | Yes | Database. | database | -| `PGUSER` | Yes | Database user. | adventure | -| `PGPASSWORD` | Yes | Database password. | changeme123 | -| `DJANGO_ADMIN_USERNAME` | Yes | Default username. | admin | -| `DJANGO_ADMIN_PASSWORD` | Yes | Default password, change after inital login. | admin | -| `DJANGO_ADMIN_EMAIL` | Yes | Default user's email. | admin@example.com | -| `PUBLIC_URL` | Yes | This is the publically accessible url to the **nginx** container. You should be able to acess nginx from this url where you access your app. | http://127.0.0.1:81 | -| `CSRF_TRUSTED_ORIGINS` | Yes | Need to be changed to the orgins where you use your backend server and frontend. These values are comma seperated. | Needs to be changed. | -| `FRONTEND_URL` | Yes | This is the publically accessible url to the **frontend** container. This link should be accessable for all users. Used for email generation. | http://localhost:3000 | - -### Proxy Container (nginx) Configuration - -In order to use media files in a production environment, you need to configure the `nginx` container to serve the media files. The container is already in the docker compose file but you need to do a few things to make it work. - -1. Create a directory called `proxy` in the same directory as the `docker-compose.yml` file. -2. Create a file called `nginx.conf` in the `proxy` directory. -3. Add the following configuration to the `nginx.conf` file: - -```nginx -server { - listen 80; - server_name localhost; - - location /media/ { - alias /app/media/; - } -} -``` +| Name | Required | Description | Default Value | +| ----------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------- | +| `PGHOST` | Yes | Databse host. | db | +| `PGDATABASE` | Yes | Database. | database | +| `PGUSER` | Yes | Database user. | adventure | +| `PGPASSWORD` | Yes | Database password. | changeme123 | +| `DJANGO_ADMIN_USERNAME` | Yes | Default username. | admin | +| `DJANGO_ADMIN_PASSWORD` | Yes | Default password, change after inital login. | admin | +| `DJANGO_ADMIN_EMAIL` | Yes | Default user's email. | admin@example.com | +| `PUBLIC_URL` | Yes | This needs to match the outward port of the server and be accessible from where the app is used. It is used for the creation of image urls. | 'http://localhost:8016' | +| `CSRF_TRUSTED_ORIGINS` | Yes | Need to be changed to the orgins where you use your backend server and frontend. These values are comma seperated. | http://localhost:8016 | +| `FRONTEND_URL` | Yes | This is the publically accessible url to the **frontend** container. This link should be accessable for all users. Used for email generation. | 'http://localhost:8015' | ## Running the Containers @@ -119,8 +100,6 @@ View all of your adventures on a map, with the ability to filter by visit status ![Region Page](screenshots/regions.png) -️ - # About AdventureLog AdventureLog is a Svelte Kit and Django application that utilizes a PostgreSQL database. Users can log the adventures they have experienced, as well as plan future ones. Key features include: diff --git a/docker-compose.yml b/docker-compose.yml index fee119ba..38d81e39 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,7 @@ services: web: - build: ./frontend/ - #image: ghcr.io/seanmorley15/adventurelog-frontend:latest + #build: ./frontend/ + image: ghcr.io/seanmorley15/adventurelog-frontend:latest container_name: adventurelog-frontend restart: unless-stopped environment: @@ -25,8 +25,8 @@ services: - postgres_data:/var/lib/postgresql/data/ server: - build: ./backend/ - #image: ghcr.io/seanmorley15/adventurelog-backend:latest + #build: ./backend/ + image: ghcr.io/seanmorley15/adventurelog-backend:latest container_name: adventurelog-backend restart: unless-stopped environment: From 6f8864a13dfc27fca6a45eb3f3f1597b2f8ff38f Mon Sep 17 00:00:00 2001 From: Sean Morley Date: Sat, 26 Oct 2024 19:43:27 -0400 Subject: [PATCH 17/65] Refactor Docker Compose configuration and add email backend documentation --- .../docs/Configuration/email_backend.md | 28 +++++++++++++++++++ .../src/routes/collections/[id]/+page.svelte | 7 +++-- 2 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 documentation/docs/Configuration/email_backend.md diff --git a/documentation/docs/Configuration/email_backend.md b/documentation/docs/Configuration/email_backend.md new file mode 100644 index 00000000..a8cb1d25 --- /dev/null +++ b/documentation/docs/Configuration/email_backend.md @@ -0,0 +1,28 @@ +--- +sidebar_position: 2 +--- + +# Change Email Backend + +To change the email backend, you can set the following variable in your docker-compose.yml under the server service: + +## Using Console (default) + +```yaml +environment: + - EMAIL_BACKEND='console' +``` + +## With SMTP + +```yaml +environment: + - EMAIL_BACKEND='email' + - EMAIL_HOST='smtp.gmail.com' + - EMAIL_USE_TLS=False + - EMAIL_PORT=587 + - EMAIL_USE_SSL=True + - EMAIL_HOST_USER='user' + - EMAIL_HOST_PASSWORD='password' + - DEFAULT_FROM_EMAIL='user@example.com' +``` diff --git a/frontend/src/routes/collections/[id]/+page.svelte b/frontend/src/routes/collections/[id]/+page.svelte index 4c586ef1..47b401f7 100644 --- a/frontend/src/routes/collections/[id]/+page.svelte +++ b/frontend/src/routes/collections/[id]/+page.svelte @@ -517,9 +517,12 @@ dateString ] || []} -

- Day {i + 1} - {adjustedDate.toLocaleDateString(undefined, { timeZone: 'UTC' })} +

+ Day {i + 1}

+

+ {adjustedDate.toLocaleDateString(undefined, { timeZone: 'UTC' })} +

{#if dayAdventures.length > 0} {#each dayAdventures as adventure} From 6cf62cfb82e7dad89dca14d73c2716287c62de83 Mon Sep 17 00:00:00 2001 From: Sean Morley Date: Sat, 26 Oct 2024 23:03:35 -0400 Subject: [PATCH 18/65] localization v1 --- frontend/package.json | 1 + frontend/pnpm-lock.yaml | 441 ++++++++++++++++++ frontend/src/app.d.ts | 1 + frontend/src/hooks.server.ts | 18 +- frontend/src/lib/components/AboutModal.svelte | 21 +- frontend/src/lib/components/Avatar.svelte | 18 +- frontend/src/lib/components/Navbar.svelte | 56 ++- frontend/src/locales/en.json | 44 ++ frontend/src/locales/es.json | 37 ++ frontend/src/routes/+layout.server.ts | 7 +- frontend/src/routes/+layout.svelte | 40 +- frontend/src/routes/+page.svelte | 41 +- 12 files changed, 661 insertions(+), 64 deletions(-) create mode 100644 frontend/src/locales/en.json create mode 100644 frontend/src/locales/es.json diff --git a/frontend/package.json b/frontend/package.json index d76804aa..92f93439 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -35,6 +35,7 @@ }, "type": "module", "dependencies": { + "svelte-i18n": "^4.0.1", "svelte-maplibre": "^0.9.8" } } diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index a93c391c..b2d74ae8 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -8,6 +8,9 @@ importers: .: dependencies: + svelte-i18n: + specifier: ^4.0.1 + version: 4.0.1(svelte@4.2.19) svelte-maplibre: specifier: ^0.9.8 version: 0.9.8(svelte@4.2.19) @@ -92,144 +95,297 @@ packages: '@antfu/utils@0.7.8': resolution: {integrity: sha512-rWQkqXRESdjXtc+7NRfK9lASQjpXJu1ayp7qi1d23zZorY+wBHVLHHoVcMsEnkqEBWTFqbztO7/QdJFzyEcLTg==} + '@esbuild/aix-ppc64@0.19.12': + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] + '@esbuild/android-arm64@0.19.12': + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm64@0.21.5': resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] + '@esbuild/android-arm@0.19.12': + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + '@esbuild/android-arm@0.21.5': resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} cpu: [arm] os: [android] + '@esbuild/android-x64@0.19.12': + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + '@esbuild/android-x64@0.21.5': resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] + '@esbuild/darwin-arm64@0.19.12': + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-arm64@0.21.5': resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-x64@0.19.12': + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + '@esbuild/darwin-x64@0.21.5': resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] + '@esbuild/freebsd-arm64@0.19.12': + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-arm64@0.21.5': resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-x64@0.19.12': + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + '@esbuild/freebsd-x64@0.21.5': resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] + '@esbuild/linux-arm64@0.19.12': + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm64@0.21.5': resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm@0.19.12': + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + '@esbuild/linux-arm@0.21.5': resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] + '@esbuild/linux-ia32@0.19.12': + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-ia32@0.21.5': resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] + '@esbuild/linux-loong64@0.19.12': + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-loong64@0.21.5': resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] + '@esbuild/linux-mips64el@0.19.12': + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-mips64el@0.21.5': resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] + '@esbuild/linux-ppc64@0.19.12': + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-ppc64@0.21.5': resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] + '@esbuild/linux-riscv64@0.19.12': + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-riscv64@0.21.5': resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] + '@esbuild/linux-s390x@0.19.12': + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-s390x@0.21.5': resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] + '@esbuild/linux-x64@0.19.12': + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + '@esbuild/linux-x64@0.21.5': resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] + '@esbuild/netbsd-x64@0.19.12': + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + '@esbuild/netbsd-x64@0.21.5': resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] + '@esbuild/openbsd-x64@0.19.12': + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + '@esbuild/openbsd-x64@0.21.5': resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] + '@esbuild/sunos-x64@0.19.12': + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + '@esbuild/sunos-x64@0.21.5': resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] + '@esbuild/win32-arm64@0.19.12': + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-arm64@0.21.5': resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] + '@esbuild/win32-ia32@0.19.12': + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-ia32@0.21.5': resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] + '@esbuild/win32-x64@0.19.12': + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + '@esbuild/win32-x64@0.21.5': resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] + '@formatjs/ecma402-abstract@2.2.1': + resolution: {integrity: sha512-O4ywpkdJybrjFc9zyL8qK5aklleIAi5O4nYhBVJaOFtCkNrnU+lKFeJOFC48zpsZQmR8Aok2V79hGpHnzbmFpg==} + + '@formatjs/fast-memoize@2.2.2': + resolution: {integrity: sha512-mzxZcS0g1pOzwZTslJOBTmLzDXseMLLvnh25ymRilCm8QLMObsQ7x/rj9GNrH0iUhZMlFisVOD6J1n6WQqpKPQ==} + + '@formatjs/icu-messageformat-parser@2.9.1': + resolution: {integrity: sha512-7AYk4tjnLi5wBkxst2w7qFj38JLMJoqzj7BhdEl7oTlsWMlqwgx4p9oMmmvpXWTSDGNwOKBRc1SfwMh5MOHeNg==} + + '@formatjs/icu-skeleton-parser@1.8.5': + resolution: {integrity: sha512-zRZ/e3B5qY2+JCLs7puTzWS1Jb+t/K+8Jur/gEZpA2EjWeLDE17nsx8thyo9P48Mno7UmafnPupV2NCJXX17Dg==} + + '@formatjs/intl-localematcher@0.5.6': + resolution: {integrity: sha512-roz1+Ba5e23AHX6KUAWmLEyTRZegM5YDuxuvkHCyK3RJddf/UXB2f+s7pOMm9ktfPGla0g+mQXOn5vsuYirnaA==} + '@iconify-json/mdi@1.1.67': resolution: {integrity: sha512-00nllHES8hyACwIfgySlQgAE6MKgpr2wsKfpifMiZWZ9aXC5l4Jb0lR3lJSWwXgOW6kzAOdzC3T+2VOfBBZ13A==} @@ -660,6 +816,10 @@ packages: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} + cli-color@2.0.4: + resolution: {integrity: sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==} + engines: {node: '>=0.10'} + code-red@1.0.4: resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} @@ -722,6 +882,10 @@ packages: resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} engines: {node: '>=12'} + d@1.0.2: + resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} + engines: {node: '>=0.12'} + daisyui@4.12.6: resolution: {integrity: sha512-Tz/rvi2ws7+7uh51JgGpsRqnASwI13t6Sz53ePaGkhLzhr4SQI4wwNxSypE8lj/d4gl/+lbHK1phIKUo+d2YNw==} engines: {node: '>=16.9.0'} @@ -778,9 +942,28 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + es5-ext@0.10.64: + resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} + engines: {node: '>=0.10'} + + es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + es6-promise@3.3.1: resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} + es6-symbol@3.1.4: + resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} + engines: {node: '>=0.12'} + + es6-weak-map@2.0.3: + resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} + + esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + esbuild@0.21.5: resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} @@ -793,16 +976,26 @@ packages: esm-env@1.0.0: resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==} + esniff@2.0.1: + resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} + engines: {node: '>=0.10'} + estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + event-emitter@0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} + ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + extend-shallow@2.0.1: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} engines: {node: '>=0.10.0'} @@ -945,6 +1138,9 @@ packages: resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} engines: {node: '>=12'} + intl-messageformat@10.7.3: + resolution: {integrity: sha512-AAo/3oyh7ROfPhDuh7DxTTydh97OC+lv7h1Eq5LuHWuLsUMKOhtzTYuyXlUReuwZ9vANDHo4CS1bGRrn7TZRtg==} + is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -988,6 +1184,9 @@ packages: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} engines: {node: '>=0.10.0'} + is-promise@2.2.2: + resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + is-reference@1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} @@ -1071,6 +1270,9 @@ packages: resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} engines: {node: 14 || >=16.14} + lru-queue@0.1.0: + resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} + magic-string@0.30.10: resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} @@ -1085,6 +1287,10 @@ packages: mdn-data@2.0.30: resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + memoizee@0.4.17: + resolution: {integrity: sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==} + engines: {node: '>=0.12'} + merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -1164,6 +1370,9 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -1538,6 +1747,13 @@ packages: peerDependencies: svelte: ^3.19.0 || ^4.0.0 + svelte-i18n@4.0.1: + resolution: {integrity: sha512-jaykGlGT5PUaaq04JWbJREvivlCnALtT+m87Kbm0fxyYHynkQaxQMnIKHLm2WeIuBRoljzwgyvz0Z6/CMwfdmQ==} + engines: {node: '>= 16'} + hasBin: true + peerDependencies: + svelte: ^3 || ^4 || ^5 + svelte-maplibre@0.9.8: resolution: {integrity: sha512-z6YyJv1sT8AHJuzuzd+30M9PQMllFnGBpHvSJ5BlwFQF/yP4xdJY9+ynF9ziywJIzGMjuvTiCeEXZSY0fhsTAA==} peerDependencies: @@ -1610,6 +1826,10 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + timers-ext@0.1.8: + resolution: {integrity: sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww==} + engines: {node: '>=0.12'} + tiny-glob@0.2.9: resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} @@ -1637,6 +1857,9 @@ packages: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} + type@2.7.3: + resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} + typescript@5.5.2: resolution: {integrity: sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==} engines: {node: '>=14.17'} @@ -1798,75 +2021,169 @@ snapshots: '@antfu/utils@0.7.8': {} + '@esbuild/aix-ppc64@0.19.12': + optional: true + '@esbuild/aix-ppc64@0.21.5': optional: true + '@esbuild/android-arm64@0.19.12': + optional: true + '@esbuild/android-arm64@0.21.5': optional: true + '@esbuild/android-arm@0.19.12': + optional: true + '@esbuild/android-arm@0.21.5': optional: true + '@esbuild/android-x64@0.19.12': + optional: true + '@esbuild/android-x64@0.21.5': optional: true + '@esbuild/darwin-arm64@0.19.12': + optional: true + '@esbuild/darwin-arm64@0.21.5': optional: true + '@esbuild/darwin-x64@0.19.12': + optional: true + '@esbuild/darwin-x64@0.21.5': optional: true + '@esbuild/freebsd-arm64@0.19.12': + optional: true + '@esbuild/freebsd-arm64@0.21.5': optional: true + '@esbuild/freebsd-x64@0.19.12': + optional: true + '@esbuild/freebsd-x64@0.21.5': optional: true + '@esbuild/linux-arm64@0.19.12': + optional: true + '@esbuild/linux-arm64@0.21.5': optional: true + '@esbuild/linux-arm@0.19.12': + optional: true + '@esbuild/linux-arm@0.21.5': optional: true + '@esbuild/linux-ia32@0.19.12': + optional: true + '@esbuild/linux-ia32@0.21.5': optional: true + '@esbuild/linux-loong64@0.19.12': + optional: true + '@esbuild/linux-loong64@0.21.5': optional: true + '@esbuild/linux-mips64el@0.19.12': + optional: true + '@esbuild/linux-mips64el@0.21.5': optional: true + '@esbuild/linux-ppc64@0.19.12': + optional: true + '@esbuild/linux-ppc64@0.21.5': optional: true + '@esbuild/linux-riscv64@0.19.12': + optional: true + '@esbuild/linux-riscv64@0.21.5': optional: true + '@esbuild/linux-s390x@0.19.12': + optional: true + '@esbuild/linux-s390x@0.21.5': optional: true + '@esbuild/linux-x64@0.19.12': + optional: true + '@esbuild/linux-x64@0.21.5': optional: true + '@esbuild/netbsd-x64@0.19.12': + optional: true + '@esbuild/netbsd-x64@0.21.5': optional: true + '@esbuild/openbsd-x64@0.19.12': + optional: true + '@esbuild/openbsd-x64@0.21.5': optional: true + '@esbuild/sunos-x64@0.19.12': + optional: true + '@esbuild/sunos-x64@0.21.5': optional: true + '@esbuild/win32-arm64@0.19.12': + optional: true + '@esbuild/win32-arm64@0.21.5': optional: true + '@esbuild/win32-ia32@0.19.12': + optional: true + '@esbuild/win32-ia32@0.21.5': optional: true + '@esbuild/win32-x64@0.19.12': + optional: true + '@esbuild/win32-x64@0.21.5': optional: true + '@formatjs/ecma402-abstract@2.2.1': + dependencies: + '@formatjs/fast-memoize': 2.2.2 + '@formatjs/intl-localematcher': 0.5.6 + tslib: 2.6.3 + + '@formatjs/fast-memoize@2.2.2': + dependencies: + tslib: 2.6.3 + + '@formatjs/icu-messageformat-parser@2.9.1': + dependencies: + '@formatjs/ecma402-abstract': 2.2.1 + '@formatjs/icu-skeleton-parser': 1.8.5 + tslib: 2.6.3 + + '@formatjs/icu-skeleton-parser@1.8.5': + dependencies: + '@formatjs/ecma402-abstract': 2.2.1 + tslib: 2.6.3 + + '@formatjs/intl-localematcher@0.5.6': + dependencies: + tslib: 2.6.3 + '@iconify-json/mdi@1.1.67': dependencies: '@iconify/types': 2.0.0 @@ -2323,6 +2640,14 @@ snapshots: chownr@2.0.0: {} + cli-color@2.0.4: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-iterator: 2.0.3 + memoizee: 0.4.17 + timers-ext: 0.1.8 + code-red@1.0.4: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 @@ -2379,6 +2704,11 @@ snapshots: dependencies: d3-array: 3.2.4 + d@1.0.2: + dependencies: + es5-ext: 0.10.64 + type: 2.7.3 + daisyui@4.12.6(postcss@8.4.38): dependencies: css-selector-tokenizer: 0.8.0 @@ -2418,8 +2748,59 @@ snapshots: emoji-regex@9.2.2: {} + es5-ext@0.10.64: + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.4 + esniff: 2.0.1 + next-tick: 1.1.0 + + es6-iterator@2.0.3: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-symbol: 3.1.4 + es6-promise@3.3.1: {} + es6-symbol@3.1.4: + dependencies: + d: 1.0.2 + ext: 1.7.0 + + es6-weak-map@2.0.3: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-iterator: 2.0.3 + es6-symbol: 3.1.4 + + esbuild@0.19.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 + esbuild@0.21.5: optionalDependencies: '@esbuild/aix-ppc64': 0.21.5 @@ -2450,12 +2831,24 @@ snapshots: esm-env@1.0.0: {} + esniff@2.0.1: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + event-emitter: 0.3.5 + type: 2.7.3 + estree-walker@2.0.2: {} estree-walker@3.0.3: dependencies: '@types/estree': 1.0.6 + event-emitter@0.3.5: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + execa@5.1.1: dependencies: cross-spawn: 7.0.3 @@ -2468,6 +2861,10 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 + ext@1.7.0: + dependencies: + type: 2.7.3 + extend-shallow@2.0.1: dependencies: is-extendable: 0.1.1 @@ -2615,6 +3012,13 @@ snapshots: internmap@2.0.3: {} + intl-messageformat@10.7.3: + dependencies: + '@formatjs/ecma402-abstract': 2.2.1 + '@formatjs/fast-memoize': 2.2.2 + '@formatjs/icu-messageformat-parser': 2.9.1 + tslib: 2.6.3 + is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 @@ -2649,6 +3053,8 @@ snapshots: dependencies: isobject: 3.0.1 + is-promise@2.2.2: {} + is-reference@1.2.1: dependencies: '@types/estree': 1.0.6 @@ -2710,6 +3116,10 @@ snapshots: lru-cache@10.2.2: {} + lru-queue@0.1.0: + dependencies: + es5-ext: 0.10.64 + magic-string@0.30.10: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 @@ -2750,6 +3160,17 @@ snapshots: mdn-data@2.0.30: {} + memoizee@0.4.17: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-weak-map: 2.0.3 + event-emitter: 0.3.5 + is-promise: 2.2.2 + lru-queue: 0.1.0 + next-tick: 1.1.0 + timers-ext: 0.1.8 + merge-stream@2.0.0: {} merge2@1.4.1: {} @@ -2815,6 +3236,8 @@ snapshots: nanoid@3.3.7: {} + next-tick@1.1.0: {} + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 @@ -3190,6 +3613,17 @@ snapshots: dependencies: svelte: 4.2.19 + svelte-i18n@4.0.1(svelte@4.2.19): + dependencies: + cli-color: 2.0.4 + deepmerge: 4.3.1 + esbuild: 0.19.12 + estree-walker: 2.0.2 + intl-messageformat: 10.7.3 + sade: 1.8.1 + svelte: 4.2.19 + tiny-glob: 0.2.9 + svelte-maplibre@0.9.8(svelte@4.2.19): dependencies: d3-geo: 3.1.1 @@ -3273,6 +3707,11 @@ snapshots: dependencies: any-promise: 1.3.0 + timers-ext@0.1.8: + dependencies: + es5-ext: 0.10.64 + next-tick: 1.1.0 + tiny-glob@0.2.9: dependencies: globalyzer: 0.1.0 @@ -3294,6 +3733,8 @@ snapshots: type-detect@4.0.8: {} + type@2.7.3: {} + typescript@5.5.2: {} typewise-core@1.2.0: {} diff --git a/frontend/src/app.d.ts b/frontend/src/app.d.ts index fe9063d5..166ff33a 100644 --- a/frontend/src/app.d.ts +++ b/frontend/src/app.d.ts @@ -16,6 +16,7 @@ declare global { uuid: string; public_profile: boolean; } | null; + locale: string; } // interface PageData {} // interface PageState {} diff --git a/frontend/src/hooks.server.ts b/frontend/src/hooks.server.ts index 8c882abc..6cc4f463 100644 --- a/frontend/src/hooks.server.ts +++ b/frontend/src/hooks.server.ts @@ -107,4 +107,20 @@ export const themeHook: Handle = async ({ event, resolve }) => { return await resolve(event); }; -export const handle = sequence(authHook, themeHook); +// hook to get the langauge cookie and set the locale +export const i18nHook: Handle = async ({ event, resolve }) => { + let lang = event.cookies.get('lang'); + if (!lang) { + lang = ''; // Set default locale + event.cookies.set('lang', lang, { + httpOnly: true, + sameSite: 'lax', + expires: new Date(Date.now() + 365 * 24 * 60 * 60 * 1000), // 1 year + path: '/' + }); + } + event.locals.locale = lang; // Store the locale in locals + return await resolve(event); +}; + +export const handle = sequence(authHook, themeHook, i18nHook); diff --git a/frontend/src/lib/components/AboutModal.svelte b/frontend/src/lib/components/AboutModal.svelte index 05a73bf8..409a5203 100644 --- a/frontend/src/lib/components/AboutModal.svelte +++ b/frontend/src/lib/components/AboutModal.svelte @@ -3,6 +3,7 @@ const dispatch = createEventDispatcher(); import { onMount } from 'svelte'; let modal: HTMLDialogElement; + import { t } from 'svelte-i18n'; import { appVersion, copyrightYear, versionChangelog } from '$lib/config'; onMount(() => { @@ -28,7 +29,7 @@ diff --git a/frontend/src/lib/components/Avatar.svelte b/frontend/src/lib/components/Avatar.svelte index c0742502..5f9c1c8e 100644 --- a/frontend/src/lib/components/Avatar.svelte +++ b/frontend/src/lib/components/Avatar.svelte @@ -1,5 +1,6 @@ - - - - +{#await localeLoaded} + +{:then} + + + +{/await} diff --git a/frontend/src/routes/+page.svelte b/frontend/src/routes/+page.svelte index ad1a655e..5587ee44 100644 --- a/frontend/src/routes/+page.svelte +++ b/frontend/src/routes/+page.svelte @@ -3,6 +3,7 @@ import AdventureOverlook from '$lib/assets/AdventureOverlook.webp'; import MapWithPins from '$lib/assets/MapWithPins.webp'; + import { t } from 'svelte-i18n'; export let data; @@ -18,35 +19,38 @@ class="text-3xl font-bold tracking-tighter sm:text-5xl xl:text-6xl/none bg-gradient-to-r from-primary to-secondary bg-clip-text text-transparent pb-4" > {data.user.first_name.charAt(0).toUpperCase() + data.user.first_name.slice(1)}, - Discover the World's Most Thrilling Adventures + {$t('home.hero_1')} {:else}

- Discover the World's Most Thrilling Adventures + {$t('home.hero_1')}

{/if} {:else}

- Discover the World's Most Thrilling Adventures + {$t('home.hero_1')}

{/if}

- Discover and plan your next adventure with AdventureLog. Explore breathtaking - destinations, create custom itineraries, and stay connected on the go. + {$t('home.hero_2')}

{#if data.user} {:else} - - + + {/if}
@@ -69,18 +73,17 @@
- Key Features + {$t('home.key_features')}

- Discover, Plan, and Explore with Ease + {$t('home.desc_1')}

- AdventureLog is designed to simplify your journey, providing you with the tools and - resources to plan, pack, and navigate your next unforgettable adventure. + {$t('home.desc_2')}

@@ -97,27 +100,25 @@
  • -

    Travel Log

    +

    {$t('home.feature_1')}

    - Keep track of your adventures with a personalized travel log and share your - experiences with friends and family. + {$t('home.feature_1_desc')}

  • -

    Trip Planning

    +

    {$t('home.feature_2')}

    - Easily create custom itineraries and get a day-by-day breakdown of your trip. + {$t('home.feature_2_desc')}

  • -

    Travel Map

    +

    {$t('home.feature_3')}

    - View your travels throughout the world with an interactive map and explore new - destinations. + {$t('home.feature_3_desc')}

  • From 91c0ec8c07d3899b7585d818b2e04e22bb0a8613 Mon Sep 17 00:00:00 2001 From: Sean Morley Date: Mon, 28 Oct 2024 13:56:57 -0400 Subject: [PATCH 19/65] localization v2 --- .vscode/settings.json | 28 +++++- frontend/src/hooks.server.ts | 14 +-- .../src/lib/components/AdventureCard.svelte | 62 ++++--------- frontend/src/lib/components/Avatar.svelte | 2 +- .../src/lib/components/CardCarousel.svelte | 3 +- frontend/src/lib/components/Navbar.svelte | 50 +++++++--- frontend/src/lib/index.ts | 9 -- frontend/src/lib/localization.ts | 0 frontend/src/locales/de.json | 93 +++++++++++++++++++ frontend/src/locales/en.json | 52 ++++++++++- frontend/src/locales/es.json | 79 +++++++++++++--- frontend/src/locales/fr.json | 90 ++++++++++++++++++ frontend/src/routes/+layout.svelte | 10 ++ frontend/src/routes/+page.server.ts | 10 ++ frontend/src/routes/adventures/+page.svelte | 7 ++ .../src/routes/adventures/[id]/+page.svelte | 7 +- frontend/src/routes/collections/+page.svelte | 6 ++ frontend/src/routes/map/+page.svelte | 11 ++- 18 files changed, 432 insertions(+), 101 deletions(-) create mode 100644 frontend/src/lib/localization.ts create mode 100644 frontend/src/locales/de.json create mode 100644 frontend/src/locales/fr.json diff --git a/.vscode/settings.json b/.vscode/settings.json index 23830fb4..11f6a2d0 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,29 @@ { - "git.ignoreLimitWarning": true + "git.ignoreLimitWarning": true, + "i18n-ally.localesPaths": [ + "frontend/src/locales", + "backend/server/backend/lib/python3.12/site-packages/allauth/locale", + "backend/server/backend/lib/python3.12/site-packages/dj_rest_auth/locale", + "backend/server/backend/lib/python3.12/site-packages/rest_framework/locale", + "backend/server/backend/lib/python3.12/site-packages/rest_framework_simplejwt/locale", + "backend/server/backend/lib/python3.12/site-packages/django/conf/locale", + "backend/server/backend/lib/python3.12/site-packages/django/contrib/messages", + "backend/server/backend/lib/python3.12/site-packages/allauth/templates/account/messages", + "backend/server/backend/lib/python3.12/site-packages/allauth/templates/mfa/messages", + "backend/server/backend/lib/python3.12/site-packages/allauth/templates/socialaccount/messages", + "backend/server/backend/lib/python3.12/site-packages/allauth/templates/usersessions/messages", + "backend/server/backend/lib/python3.12/site-packages/django/contrib/admindocs/locale", + "backend/server/backend/lib/python3.12/site-packages/django/contrib/auth/locale", + "backend/server/backend/lib/python3.12/site-packages/django/contrib/admin/locale", + "backend/server/backend/lib/python3.12/site-packages/django/contrib/contenttypes/locale", + "backend/server/backend/lib/python3.12/site-packages/django/contrib/flatpages/locale", + "backend/server/backend/lib/python3.12/site-packages/django/contrib/humanize/locale", + "backend/server/backend/lib/python3.12/site-packages/django/contrib/gis/locale", + "backend/server/backend/lib/python3.12/site-packages/django/contrib/redirects/locale", + "backend/server/backend/lib/python3.12/site-packages/django/contrib/postgres/locale", + "backend/server/backend/lib/python3.12/site-packages/django/contrib/sessions/locale", + "backend/server/backend/lib/python3.12/site-packages/django/contrib/sites/locale", + "backend/server/backend/lib/python3.12/site-packages/rest_framework/templates/rest_framework/docs/langs" + ], + "i18n-ally.keystyle": "nested" } diff --git a/frontend/src/hooks.server.ts b/frontend/src/hooks.server.ts index 6cc4f463..0c1f991d 100644 --- a/frontend/src/hooks.server.ts +++ b/frontend/src/hooks.server.ts @@ -109,17 +109,11 @@ export const themeHook: Handle = async ({ event, resolve }) => { // hook to get the langauge cookie and set the locale export const i18nHook: Handle = async ({ event, resolve }) => { - let lang = event.cookies.get('lang'); - if (!lang) { - lang = ''; // Set default locale - event.cookies.set('lang', lang, { - httpOnly: true, - sameSite: 'lax', - expires: new Date(Date.now() + 365 * 24 * 60 * 60 * 1000), // 1 year - path: '/' - }); + let locale = event.cookies.get('locale'); + if (!locale) { + return await resolve(event); } - event.locals.locale = lang; // Store the locale in locals + event.locals.locale = locale; // Store the locale in locals return await resolve(event); }; diff --git a/frontend/src/lib/components/AdventureCard.svelte b/frontend/src/lib/components/AdventureCard.svelte index b30fb415..00a84511 100644 --- a/frontend/src/lib/components/AdventureCard.svelte +++ b/frontend/src/lib/components/AdventureCard.svelte @@ -11,15 +11,14 @@ import MapMarker from '~icons/mdi/map-marker'; import { addToast } from '$lib/toasts'; import Link from '~icons/mdi/link-variant'; - import CheckBold from '~icons/mdi/check-bold'; - import FormatListBulletedSquare from '~icons/mdi/format-list-bulleted-square'; import LinkVariantRemove from '~icons/mdi/link-variant-remove'; import Plus from '~icons/mdi/plus'; import CollectionLink from './CollectionLink.svelte'; import DotsHorizontal from '~icons/mdi/dots-horizontal'; import DeleteWarning from './DeleteWarning.svelte'; - import { isAdventureVisited, typeToString } from '$lib'; + import { isAdventureVisited } from '$lib'; import CardCarousel from './CardCarousel.svelte'; + import { t } from 'svelte-i18n'; export let type: string; export let user: User | null; @@ -67,34 +66,13 @@ body: JSON.stringify({ collection: null }) }); if (res.ok) { - console.log('Adventure removed from collection'); - addToast('info', 'Adventure removed from collection successfully!'); + addToast('info', `${$t('adventures.collection_remove_success')}`); dispatch('delete', adventure.id); } else { - console.log('Error removing adventure from collection'); + addToast('error', `${$t('adventures.collection_remove_error')}`); } } - function changeType(newType: string) { - return async () => { - let res = await fetch(`/api/adventures/${adventure.id}/`, { - method: 'PATCH', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ type: newType }) - }); - if (res.ok) { - console.log('Adventure type changed'); - dispatch('typeChange', adventure.id); - addToast('info', 'Adventure type changed successfully!'); - adventure.type = newType; - } else { - console.log('Error changing adventure type'); - } - }; - } - async function linkCollection(event: CustomEvent) { let collectionId = event.detail; let res = await fetch(`/api/adventures/${adventure.id}`, { @@ -106,11 +84,11 @@ }); if (res.ok) { console.log('Adventure linked to collection'); - addToast('info', 'Adventure linked to collection successfully!'); + addToast('info', `${$t('adventures.collection_link_success')}`); isCollectionModalOpen = false; dispatch('delete', adventure.id); } else { - console.log('Error linking adventure to collection'); + addToast('error', `${$t('adventures.collection_link_error')}`); } } @@ -131,7 +109,7 @@ (isWarningModalOpen = false)} on:confirm={deleteAdventure} @@ -153,7 +131,7 @@
-
{typeToString(adventure.type)}
+
{$t(`adventures.activities.${adventure.type}`)}
{isAdventureVisited(adventure) ? 'Visited' : 'Planned'}
{adventure.is_public ? 'Public' : 'Private'}
@@ -198,30 +176,24 @@ {$t('adventures.open_details')} - {#if adventure.type == 'visited' && user?.pk == adventure.user_id} - - {/if} - {#if adventure.type == 'planned' && user?.pk == adventure.user_id} - - {/if} + {#if adventure.collection && user?.pk == adventure.user_id} {$t( + 'adventures.remove_from_collection' + )} {/if} {#if !adventure.collection} {$t('adventures.add_to_collection')} {/if} {$t('adventures.delete')} diff --git a/frontend/src/lib/components/Avatar.svelte b/frontend/src/lib/components/Avatar.svelte index 5f9c1c8e..4f95b6d7 100644 --- a/frontend/src/lib/components/Avatar.svelte +++ b/frontend/src/lib/components/Avatar.svelte @@ -15,7 +15,7 @@
{#if user.profile_pic} - User Profile + {$t('navbar.profile')} {:else} {letter} {/if} diff --git a/frontend/src/lib/components/CardCarousel.svelte b/frontend/src/lib/components/CardCarousel.svelte index ca9e6520..07718bd4 100644 --- a/frontend/src/lib/components/CardCarousel.svelte +++ b/frontend/src/lib/components/CardCarousel.svelte @@ -1,6 +1,7 @@ -

Country List

+

{$t('worldtravel.country_list')}

- {filteredCountries.length} countries found + {filteredCountries.length} + {$t('worldtravel.num_countries')}

@@ -62,7 +64,7 @@ class="join-item btn" type="radio" name="filter" - aria-label="All" + aria-label={$t('worldtravel.all')} checked on:click={() => (filterOption = 'all')} /> @@ -70,26 +72,26 @@ class="join-item btn" type="radio" name="filter" - aria-label="Partially Visited" + aria-label={$t('worldtravel.partially_visited')} on:click={() => (filterOption = 'partial')} /> (filterOption = 'complete')} /> (filterOption = 'not')} />
{#if searchQuery.length > 0}
- +
{/if}
@@ -119,7 +123,7 @@
{#if filteredCountries.length === 0} -

No countries found

+

{$t('worldtravel.no_countries_found')}

{/if} From 05076a6732ff72e41f56c8bf5b8f80437cea17ce Mon Sep 17 00:00:00 2001 From: Sean Morley Date: Tue, 29 Oct 2024 10:29:03 -0400 Subject: [PATCH 24/65] Refactor localization strings and add missing translations --- .../lib/components/ActivityComplete.svelte | 9 +- .../src/lib/components/AdventureModal.svelte | 125 +++--- frontend/src/lib/components/Navbar.svelte | 9 +- frontend/src/locales/de.json | 153 ++++++- frontend/src/locales/en.json | 76 +++- frontend/src/locales/es.json | 78 +++- frontend/src/locales/fr.json | 158 ++++++- frontend/src/locales/it.json | 110 ++++- frontend/src/locales/nl.json | 372 +++++++++++------ frontend/src/locales/sv.json | 387 +++++++++++------- frontend/src/locales/zh.json | 78 +++- frontend/src/routes/activities/+page.svelte | 7 +- frontend/src/routes/settings/+page.svelte | 92 ++--- frontend/src/routes/signup/+page.svelte | 27 +- frontend/src/routes/users/+page.svelte | 5 +- 15 files changed, 1245 insertions(+), 441 deletions(-) diff --git a/frontend/src/lib/components/ActivityComplete.svelte b/frontend/src/lib/components/ActivityComplete.svelte index 73f76e68..c3ef7f65 100644 --- a/frontend/src/lib/components/ActivityComplete.svelte +++ b/frontend/src/lib/components/ActivityComplete.svelte @@ -1,5 +1,6 @@ -

Settings Page

+

{$t('settings.settings_page')}

-

User Account Settings

+

{$t('settings.account_settings')}

- +
- +
- +
--> - +
-
+
- +
@@ -139,13 +135,13 @@
{/if} -

Password Change

+

{$t('settings.password_change')}

@@ -154,22 +150,22 @@ type="password" name="password2" id="password2" - placeholder="Confirm New Password" + placeholder={$t('settings.confirm_new_password')} class="block mb-2 input input-bordered w-full max-w-xs" /> - +
-

Email Change

+

{$t('settings.email_change')}

- + - +
diff --git a/frontend/src/routes/signup/+page.svelte b/frontend/src/routes/signup/+page.svelte index f726ecbe..fb3d7b0c 100644 --- a/frontend/src/routes/signup/+page.svelte +++ b/frontend/src/routes/signup/+page.svelte @@ -1,5 +1,6 @@ -

AdventureLog Users

+

AdventureLog {$t('navbar.users')}

{#each users as user (user.uuid)} @@ -16,7 +17,7 @@
{#if users.length === 0} -

No users found with public profiles.

+

{$t('users.no_users_found')}

{/if} From 83d06fc0a4b5917a88ef82b9b041c7078584e2a0 Mon Sep 17 00:00:00 2001 From: Sean Morley Date: Wed, 30 Oct 2024 15:11:00 -0400 Subject: [PATCH 25/65] Remove AUTHORS and MANIFEST.in files; add ReverseGeocodeViewSet and localization updates --- backend/AUTHORS | 1 - backend/LICENSE | 8 ++- backend/MANIFEST.in | 5 -- backend/server/adventures/urls.py | 3 +- backend/server/adventures/views.py | 40 +++++++++++++++ .../src/lib/components/AdventureLink.svelte | 8 +-- .../src/lib/components/AdventureModal.svelte | 51 +++++++++++-------- .../src/lib/components/CollectionLink.svelte | 7 +-- frontend/src/lib/components/NotFound.svelte | 6 +-- frontend/src/lib/types.ts | 7 +++ frontend/src/locales/en.json | 5 ++ frontend/src/locales/es.json | 7 ++- .../routes/collections/archived/+page.svelte | 3 +- 13 files changed, 109 insertions(+), 42 deletions(-) delete mode 100644 backend/AUTHORS delete mode 100644 backend/MANIFEST.in diff --git a/backend/AUTHORS b/backend/AUTHORS deleted file mode 100644 index c5ba2edd..00000000 --- a/backend/AUTHORS +++ /dev/null @@ -1 +0,0 @@ -http://github.com/iMerica/dj-rest-auth/contributors diff --git a/backend/LICENSE b/backend/LICENSE index 42a02920..01c7bc73 100644 --- a/backend/LICENSE +++ b/backend/LICENSE @@ -1,4 +1,10 @@ -The MIT License (MIT) +# Preface + +AdventureLog uses DjRestAuth, a Django REST Framework authentication backend for Django Rest Framework. DjRestAuth is licensed under the MIT License. + +--- + +## The MIT License (MIT) Copyright (c) 2014 iMerica https://github.com/iMerica/ diff --git a/backend/MANIFEST.in b/backend/MANIFEST.in deleted file mode 100644 index c2d42087..00000000 --- a/backend/MANIFEST.in +++ /dev/null @@ -1,5 +0,0 @@ -include AUTHORS -include LICENSE -include MANIFEST.in -include README.md -graft dj_rest_auth diff --git a/backend/server/adventures/urls.py b/backend/server/adventures/urls.py index 00e9cd43..3eec5984 100644 --- a/backend/server/adventures/urls.py +++ b/backend/server/adventures/urls.py @@ -1,6 +1,6 @@ from django.urls import include, path from rest_framework.routers import DefaultRouter -from .views import AdventureViewSet, ChecklistViewSet, CollectionViewSet, NoteViewSet, StatsViewSet, GenerateDescription, ActivityTypesView, TransportationViewSet, AdventureImageViewSet +from .views import AdventureViewSet, ChecklistViewSet, CollectionViewSet, NoteViewSet, StatsViewSet, GenerateDescription, ActivityTypesView, TransportationViewSet, AdventureImageViewSet, ReverseGeocodeViewSet router = DefaultRouter() router.register(r'adventures', AdventureViewSet, basename='adventures') @@ -12,6 +12,7 @@ router.register(r'transportations', TransportationViewSet, basename='transportat router.register(r'notes', NoteViewSet, basename='notes') router.register(r'checklists', ChecklistViewSet, basename='checklists') router.register(r'images', AdventureImageViewSet, basename='images') +router.register(r'reverse-geocode', ReverseGeocodeViewSet, basename='reverse-geocode') urlpatterns = [ diff --git a/backend/server/adventures/views.py b/backend/server/adventures/views.py index b6a82fe6..2131dff5 100644 --- a/backend/server/adventures/views.py +++ b/backend/server/adventures/views.py @@ -1,3 +1,4 @@ +import json import uuid import requests from django.db import transaction @@ -1053,3 +1054,42 @@ class AdventureImageViewSet(viewsets.ModelViewSet): def perform_create(self, serializer): serializer.save(user_id=self.request.user) + +class ReverseGeocodeViewSet(viewsets.ViewSet): + permission_classes = [IsAuthenticated] + + def extractIsoCode(self, data): + """ + Extract the ISO code from the response data. + Returns a dictionary containing the region name, country name, and ISO code if found. + """ + iso_code = None + if 'address' in data.keys(): + keys = data['address'].keys() + for key in keys: + if key.find("ISO") != -1: + iso_code = data['address'][key] + print(iso_code) + region = Region.objects.filter(id=iso_code).first() + visited_region = VisitedRegion.objects.filter(region=region).first() + is_visited = False + if visited_region: + is_visited = True + if region: + return {"id": iso_code, "region": region.name, "country": region.country.name, "is_visited": is_visited} + return {"error": "No region found"} + + @action(detail=False, methods=['get']) + def reverse_geocode(self, request): + lat = request.query_params.get('lat', '') + lon = request.query_params.get('lon', '') + print(lat, lon) + url = f"https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat={lat}&lon={lon}" + headers = {'User-Agent': 'AdventureLog Server'} + response = requests.get(url, headers=headers) + try: + data = response.json() + except requests.exceptions.JSONDecodeError: + return Response({"error": "Invalid response from geocoding service"}, status=400) + return Response(self.extractIsoCode(data)) + diff --git a/frontend/src/lib/components/AdventureLink.svelte b/frontend/src/lib/components/AdventureLink.svelte index b1bb85f1..db02e4e1 100644 --- a/frontend/src/lib/components/AdventureLink.svelte +++ b/frontend/src/lib/components/AdventureLink.svelte @@ -3,7 +3,7 @@ import type { Adventure, User } from '$lib/types'; import { createEventDispatcher } from 'svelte'; const dispatch = createEventDispatcher(); - import type { ActionResult } from '@sveltejs/kit'; + import { t } from 'svelte-i18n'; import { onMount } from 'svelte'; import AdventureCard from './AdventureCard.svelte'; let modal: HTMLDialogElement; @@ -51,7 +51,7 @@ diff --git a/frontend/src/lib/components/AdventureModal.svelte b/frontend/src/lib/components/AdventureModal.svelte index 68bbfe0c..7f5597bf 100644 --- a/frontend/src/lib/components/AdventureModal.svelte +++ b/frontend/src/lib/components/AdventureModal.svelte @@ -1,6 +1,12 @@

- No adventures found + {$t('adventures.no_adventures_found')}

{#if !error}

- There are no adventures to display. Add some using the plus button at the bottom right or - try changing filters! + {$t('adventures.adventure_not_found')}

{:else}

{error}

diff --git a/frontend/src/lib/types.ts b/frontend/src/lib/types.ts index 8e4dff13..4470ac30 100644 --- a/frontend/src/lib/types.ts +++ b/frontend/src/lib/types.ts @@ -168,3 +168,10 @@ export type Background = { author?: string; location?: string; }; + +export type ReverseGeocode = { + id: string; + region: string; + country: string; + is_visited: boolean; +}; diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index bff70106..f7575170 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -101,6 +101,8 @@ "wikipedia": "Wikipedia", "add_notes": "Add notes", "warning": "Warning", + "my_adventures": "My Adventures", + "no_linkable_adventures": "No adventures found that can be linked to this collection.", "add": "Add", "save_next": "Save & Next", "end_date": "End Date", @@ -136,6 +138,7 @@ "edit_collection": "Edit Collection", "unarchive": "Unarchive", "archive": "Archive", + "no_collections_found": "No collections found to add this adventure to.", "archived_collection_message": "Collection archived successfully!", "unarchived_collection_message": "Collection unarchived successfully!", "delete_collection_success": "Collection deleted successfully!", @@ -168,6 +171,8 @@ "adventure_update_error": "Failed to update adventure", "new_adventure": "New Adventure", "basic_information": "Basic Information", + "adventure_not_found": "There are no adventures to display. Add some using the plus button at the bottom right or try changing filters!", + "no_adventures_found": "No adventures found", "activities": { "general": "General 🌍", "outdoor": "Outdoor 🏞️", diff --git a/frontend/src/locales/es.json b/frontend/src/locales/es.json index 0c05a4bd..fef587c6 100644 --- a/frontend/src/locales/es.json +++ b/frontend/src/locales/es.json @@ -191,7 +191,12 @@ "warning": "Advertencia", "wiki_desc": "Extrae un extracto de un artículo de Wikipedia que coincide con el nombre de la aventura.", "wikipedia": "Wikipedia", - "add_an_activity": "Agregar una actividad" + "add_an_activity": "Agregar una actividad", + "adventure_not_found": "No hay aventuras que mostrar. \n¡Agregue algunos usando el botón más en la parte inferior derecha o intente cambiar los filtros!", + "no_adventures_found": "No se encontraron aventuras", + "no_collections_found": "No se encontraron colecciones para agregar esta aventura.", + "my_adventures": "mis aventuras", + "no_linkable_adventures": "No se encontraron aventuras que puedan vincularse a esta colección." }, "worldtravel": { "all": "Todo", diff --git a/frontend/src/routes/collections/archived/+page.svelte b/frontend/src/routes/collections/archived/+page.svelte index 4179f3c3..9f0222cb 100644 --- a/frontend/src/routes/collections/archived/+page.svelte +++ b/frontend/src/routes/collections/archived/+page.svelte @@ -2,6 +2,7 @@ import CollectionCard from '$lib/components/CollectionCard.svelte'; import NotFound from '$lib/components/NotFound.svelte'; import type { Collection } from '$lib/types'; + import { t } from 'svelte-i18n'; export let data: any; console.log(data); @@ -16,7 +17,7 @@
-

Archived Collections

+

{$t('adventures.archived_collections')}

{#if collections.length === 0} {/if} From 9d42dbac98f9877d0988459932a12cb7461063e2 Mon Sep 17 00:00:00 2001 From: Sean Morley Date: Wed, 30 Oct 2024 18:40:49 -0400 Subject: [PATCH 26/65] Add functionality to mark regions as visited in AdventureModal --- .../src/lib/components/AdventureModal.svelte | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/frontend/src/lib/components/AdventureModal.svelte b/frontend/src/lib/components/AdventureModal.svelte index 7f5597bf..c197990a 100644 --- a/frontend/src/lib/components/AdventureModal.svelte +++ b/frontend/src/lib/components/AdventureModal.svelte @@ -261,6 +261,22 @@ new_notes = ''; } + async function markVisited() { + console.log(reverseGeocodePlace); + if (reverseGeocodePlace) { + let res = await fetch(`/worldtravel?/markVisited`, { + method: 'POST', + body: JSON.stringify({ regionId: reverseGeocodePlace.id }) + }); + if (res.ok) { + reverseGeocodePlace.is_visited = true; + addToast('success', `Visit to ${reverseGeocodePlace.region} marked`); + } else { + addToast('error', `Failed to mark visit to ${reverseGeocodePlace.region}`); + } + } + } + async function reverseGeocode() { let res = await fetch( `/api/reverse-geocode/reverse_geocode/?lat=${adventure.latitude}&lon=${adventure.longitude}` @@ -612,10 +628,32 @@ it would also work to just use on:click on the MapLibre component itself. --> {#if reverseGeocodePlace}
-

{reverseGeocodePlace.id}

{reverseGeocodePlace.region}, {reverseGeocodePlace.country}

{reverseGeocodePlace.is_visited ? 'Visited' : 'Not Visited'}

+ {#if !reverseGeocodePlace.is_visited} + + {/if} {/if}
From 727daf0cfdf93f387766fdd628341387b3227566 Mon Sep 17 00:00:00 2001 From: Sean Morley Date: Thu, 31 Oct 2024 09:51:04 -0400 Subject: [PATCH 27/65] is visited --- backend/server/adventures/serializers.py | 17 +- .../src/lib/components/AdventureCard.svelte | 3 +- .../src/lib/components/AdventureModal.svelte | 16 +- frontend/src/lib/index.ts | 22 - frontend/src/lib/types.ts | 1 + frontend/src/locales/en.json | 3 + frontend/src/locales/es.json | 489 +++++++++--------- .../src/routes/collections/[id]/+page.svelte | 5 +- frontend/src/routes/map/+page.server.ts | 1 + frontend/src/routes/map/+page.svelte | 8 +- 10 files changed, 284 insertions(+), 281 deletions(-) diff --git a/backend/server/adventures/serializers.py b/backend/server/adventures/serializers.py index 25b7d439..0df0acbd 100644 --- a/backend/server/adventures/serializers.py +++ b/backend/server/adventures/serializers.py @@ -1,3 +1,4 @@ +from django.utils import timezone import os from .models import Adventure, AdventureImage, ChecklistItem, Collection, Note, Transportation, Checklist, Visit from rest_framework import serializers @@ -19,18 +20,28 @@ class AdventureImageSerializer(serializers.ModelSerializer): return representation class VisitSerializer(serializers.ModelSerializer): + class Meta: model = Visit fields = ['id', 'start_date', 'end_date', 'notes'] read_only_fields = ['id'] - + class AdventureSerializer(serializers.ModelSerializer): images = AdventureImageSerializer(many=True, read_only=True) visits = VisitSerializer(many=True, read_only=False) + is_visited = serializers.SerializerMethodField() class Meta: model = Adventure - fields = ['id', 'user_id', 'name', 'description', 'rating', 'activity_types', 'location', 'is_public', 'collection', 'created_at', 'updated_at', 'images', 'link', 'type', 'longitude', 'latitude', 'visits'] - read_only_fields = ['id', 'created_at', 'updated_at', 'user_id'] + fields = ['id', 'user_id', 'name', 'description', 'rating', 'activity_types', 'location', 'is_public', 'collection', 'created_at', 'updated_at', 'images', 'link', 'type', 'longitude', 'latitude', 'visits', 'is_visited'] + read_only_fields = ['id', 'created_at', 'updated_at', 'user_id', 'is_visited'] + + def get_is_visited(self, obj): + current_date = timezone.now().date() + for visit in obj.visits.all(): + if visit.start_date and visit.end_date and (visit.start_date <= current_date): + return True + return False + def to_representation(self, instance): representation = super().to_representation(instance) diff --git a/frontend/src/lib/components/AdventureCard.svelte b/frontend/src/lib/components/AdventureCard.svelte index d85a5e2d..25714d15 100644 --- a/frontend/src/lib/components/AdventureCard.svelte +++ b/frontend/src/lib/components/AdventureCard.svelte @@ -16,7 +16,6 @@ import CollectionLink from './CollectionLink.svelte'; import DotsHorizontal from '~icons/mdi/dots-horizontal'; import DeleteWarning from './DeleteWarning.svelte'; - import { isAdventureVisited } from '$lib'; import CardCarousel from './CardCarousel.svelte'; import { t } from 'svelte-i18n'; @@ -132,7 +131,7 @@
{$t(`adventures.activities.${adventure.type}`)}
- {isAdventureVisited(adventure) ? $t('adventures.visited') : $t('adventures.planned')} + {adventure.is_visited ? $t('adventures.visited') : $t('adventures.planned')}
{adventure.is_public ? $t('adventures.public') : $t('adventures.private')} diff --git a/frontend/src/lib/components/AdventureModal.svelte b/frontend/src/lib/components/AdventureModal.svelte index c197990a..f797e5b1 100644 --- a/frontend/src/lib/components/AdventureModal.svelte +++ b/frontend/src/lib/components/AdventureModal.svelte @@ -28,6 +28,7 @@ import ActivityComplete from './ActivityComplete.svelte'; import { appVersion } from '$lib/config'; import { ADVENTURE_TYPES } from '$lib'; + import RegionCard from './RegionCard.svelte'; let wikiError: string = ''; @@ -629,7 +630,11 @@ it would also work to just use on:click on the MapLibre component itself. --> {#if reverseGeocodePlace}

{reverseGeocodePlace.region}, {reverseGeocodePlace.country}

-

{reverseGeocodePlace.is_visited ? 'Visited' : 'Not Visited'}

+

+ {reverseGeocodePlace.is_visited + ? $t('adventures.visited') + : $t('adventures.not_visited')} +

{#if !reverseGeocodePlace.is_visited} {/if} diff --git a/frontend/src/lib/index.ts b/frontend/src/lib/index.ts index 5170910e..cab49d43 100644 --- a/frontend/src/lib/index.ts +++ b/frontend/src/lib/index.ts @@ -253,28 +253,6 @@ export let ADVENTURE_TYPES = [ { type: 'other', label: 'Other' } ]; -/** - * Checks if an adventure has been visited. - * - * This function determines if the `adventure.visits` array contains at least one visit - * with a `start_date` that is before the current date. - * - * @param adventure - The adventure object to check. - * @returns `true` if the adventure has been visited, otherwise `false`. - */ -export function isAdventureVisited(adventure: Adventure) { - const currentTime = Date.now(); - - // Check if any visit's start_date is before the current time. - return ( - adventure.visits && - adventure.visits.some((visit) => { - const visitStartTime = new Date(visit.start_date).getTime(); - return visit.start_date && visitStartTime <= currentTime; - }) - ); -} - export function getRandomBackground() { const randomIndex = Math.floor(Math.random() * randomBackgrounds.backgrounds.length); return randomBackgrounds.backgrounds[randomIndex] as Background; diff --git a/frontend/src/lib/types.ts b/frontend/src/lib/types.ts index 4470ac30..5c777450 100644 --- a/frontend/src/lib/types.ts +++ b/frontend/src/lib/types.ts @@ -37,6 +37,7 @@ export type Adventure = { is_public: boolean; created_at?: string | null; updated_at?: string | null; + is_visited?: boolean; }; export type Country = { diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index f7575170..657f8d68 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -139,6 +139,7 @@ "unarchive": "Unarchive", "archive": "Archive", "no_collections_found": "No collections found to add this adventure to.", + "not_visited": "Not Visited", "archived_collection_message": "Collection archived successfully!", "unarchived_collection_message": "Collection unarchived successfully!", "delete_collection_success": "Collection deleted successfully!", @@ -173,6 +174,8 @@ "basic_information": "Basic Information", "adventure_not_found": "There are no adventures to display. Add some using the plus button at the bottom right or try changing filters!", "no_adventures_found": "No adventures found", + "mark_region_as_visited": "Mark region {region}, {country} as visited?", + "mark_visited": "Mark Visited", "activities": { "general": "General 🌍", "outdoor": "Outdoor 🏞️", diff --git a/frontend/src/locales/es.json b/frontend/src/locales/es.json index fef587c6..e01d0fb5 100644 --- a/frontend/src/locales/es.json +++ b/frontend/src/locales/es.json @@ -1,245 +1,248 @@ { - "navbar": { - "adventures": "Aventuras", - "collections": "Colecciones", - "worldtravel": "Viajar por el Mundo", - "map": "Mapa", - "users": "Usuarios", - "search": "Buscar", - "profile": "Perfil", - "greeting": "Hola", - "my_adventures": "Mis Aventuras", - "my_activities": "Mis Actividades", - "shared_with_me": "Compartido Conmigo", - "settings": "Configuraciones", - "logout": "Cerrar Sesión", - "about": "Acerca de AdventureLog", - "documentation": "Documentación", - "discord": "Discord", - "theme_selection": "Selección de Tema", - "themes": { - "light": "Claro", - "dark": "Oscuro", - "night": "Noche", - "forest": "Bosque", - "aestetic-dark": "Estético Oscuro", - "aestetic-light": "Estético Claro", - "aqua": "Aqua" - } - }, - "about": { - "about": "Acerca de", - "license": "Licenciado bajo la Licencia GPL-3.0.", - "source_code": "Código Fuente", - "message": "Hecho con ❤️ en los Estados Unidos.", - "oss_attributions": "Atribuciones de Código Abierto", - "nominatim_1": "La búsqueda de ubicaciones y geocodificación es proporcionada por", - "nominatim_2": "Sus datos están licenciados bajo la licencia ODbL.", - "other_attributions": "Atribuciones adicionales se pueden encontrar en el archivo README.", - "close": "Cerrar" - }, - "home": { - "hero_1": "Descubre las Aventuras Más Emocionantes del Mundo", - "hero_2": "Descubre y planifica tu próxima aventura con AdventureLog. Explora destinos impresionantes, crea itinerarios personalizados y mantente conectado en todo momento.", - "go_to": "Ir a AdventureLog", - "key_features": "Características Clave", - "desc_1": "Descubre, Planifica y Explora Fácilmente", - "desc_2": "AdventureLog está diseñado para simplificar tu viaje, brindándote las herramientas y recursos para planificar, empacar y navegar tu próxima aventura inolvidable.", - "feature_1": "Registro de Viajes", - "feature_1_desc": "Mantén un registro de tus aventuras con un diario de viaje personalizado y comparte tus experiencias con amigos y familiares.", - "feature_2": "Planificación de Viajes", - "feature_2_desc": "Crea fácilmente itinerarios personalizados y obtén un desglose diario de tu viaje.", - "feature_3": "Mapa de Viaje", - "feature_3_desc": "Visualiza tus viajes por el mundo con un mapa interactivo y explora nuevos destinos." - }, - "adventures": { - "collection_remove_success": "¡Aventura eliminada de la colección con éxito!", - "collection_remove_error": "Error al eliminar la aventura de la colección", - "collection_link_success": "¡Aventura vinculada a la colección con éxito!", - "collection_link_error": "Error al vincular la aventura a la colección", - "adventure_delete_confirm": "¿Estás seguro de que quieres eliminar esta aventura? Esta acción no se puede deshacer.", - "open_details": "Abrir Detalles", - "edit_adventure": "Editar Aventura", - "remove_from_collection": "Eliminar de la Colección", - "add_to_collection": "Añadir a la Colección", - "delete": "Eliminar", - "activities": { - "activity": "Actividad 🏄", - "art_museums": "Arte", - "attraction": "Atracción 🎢", - "culture": "Cultura 🎭", - "dining": "Cenar 🍽️", - "event": "Evento 🎉", - "festivals": "Festivales 🎪", - "fitness": "Fitness 🏋️", - "general": "Generales 🌍", - "hiking": "Senderismo 🥾", - "historical_sites": "Sitios Históricos 🏛️", - "lodging": "Alojamiento 🛌", - "music_concerts": "Música", - "nightlife": "Vida nocturna 🌃", - "other": "Otro", - "outdoor": "Al aire libre 🏞️", - "shopping": "Compras 🛍️", - "spiritual_journeys": "Viajes espirituales 🧘‍♀️", - "transportation": "Transporte 🚗", - "volunteer_work": "Trabajo voluntario 🤝", - "water_sports": "Deportes acuáticos 🚤", - "wildlife": "Vida silvestre 🦒" - }, - "no_image_found": "No se encontró ninguna imagen", - "adventure_details": "Detalles de la aventura", - "adventure_type": "Tipo de aventura", - "collection": "Recopilación", - "homepage": "Página principal", - "latitude": "Latitud", - "longitude": "Longitud", - "not_found": "Aventura no encontrada", - "not_found_desc": "La aventura que buscabas no se pudo encontrar. \nPruebe una aventura diferente o vuelva a consultar más tarde.", - "visit": "Visita", - "visits": "Visitas", - "adventure": "Aventura", - "count_txt": "resultados que coinciden con su búsqueda", - "create_new": "Crear nuevo...", - "ascending": "Ascendente", - "collection_adventures": "Incluir aventuras de colección", - "date": "Fecha", - "descending": "Descendente", - "filter": "Filtrar", - "name": "Nombre", - "order_by": "Ordenar por", - "order_direction": "Dirección del pedido", - "rating": "Clasificación", - "sort": "Clasificar", - "sources": "Fuentes", - "updated": "Actualizado", - "category_filter": "Filtro de categoría", - "clear": "Claro", - "archived_collections": "Colecciones archivadas", - "close_filters": "Cerrar filtros", - "my_collections": "Mis colecciones", - "open_filters": "Abrir filtros", - "private": "Privado", - "public": "Público", - "archived_collection_message": "¡Colección archivada exitosamente!", - "delete_collection": "Eliminar colección", - "delete_collection_success": "¡Colección eliminada exitosamente!", - "delete_collection_warning": "¿Estás seguro de que deseas eliminar esta colección? \nEsto también eliminará todas las aventuras vinculadas. \nEsta acción no se puede deshacer.", - "unarchived_collection_message": "¡Colección desarchivada exitosamente!", - "archive": "Archivo", - "archived": "Archivado", - "edit_collection": "Editar colección", - "share": "Compartir", - "unarchive": "Desarchivar", - "cancel": "Cancelar", - "adventure_delete_success": "¡Aventura eliminada con éxito!", - "delete_adventure": "Eliminar aventura", - "planned": "Planificado", - "visited": "Visitado", - "dates": "Fechas", - "duration": "Duración", - "image_removed_error": "Error al eliminar la imagen", - "image_removed_success": "¡Imagen eliminada exitosamente!", - "image_upload_error": "Error al subir la imagen", - "image_upload_success": "¡Imagen cargada exitosamente!", - "no_image_url": "No se encontró ninguna imagen en esa URL.", - "start_before_end_error": "La fecha de inicio debe ser anterior a la fecha de finalización.", - "wiki_image_error": "Error al obtener la imagen de Wikipedia", - "actions": "Comportamiento", - "activity": "Actividad", - "see_adventures": "Ver Aventuras", - "activity_types": "Tipos de actividad", - "add": "Agregar", - "add_notes": "Agregar notas", - "adventure_create_error": "No se pudo crear la aventura", - "adventure_created": "Aventura creada", - "adventure_update_error": "No se pudo actualizar la aventura", - "adventure_updated": "Aventura actualizada", - "basic_information": "Información básica", - "category": "Categoría", - "clear_map": "Borrar mapa", - "copy_link": "Copiar enlace", - "date_constrain": "Restringir a las fechas de recolección", - "description": "Descripción", - "end_date": "Fecha de finalización", - "fetch_image": "Obtener imagen", - "generate_desc": "Generar descripción", - "image": "Imagen", - "image_fetch_failed": "No se pudo recuperar la imagen", - "link": "Enlace", - "location": "Ubicación", - "location_information": "Información de ubicación", - "my_images": "Mis imágenes", - "my_visits": "Mis visitas", - "new_adventure": "Nueva aventura", - "no_description_found": "No se encontró ninguna descripción", - "no_images": "Sin imágenes", - "no_location": "Por favor ingresa una ubicación", - "no_results": "No se encontraron resultados", - "no_start_date": "Por favor ingrese una fecha de inicio", - "public_adventure": "Aventura pública", - "remove": "Eliminar", - "save_next": "Ahorrar", - "search_for_location": "Buscar una ubicación", - "search_results": "Resultados de búsqueda", - "select_adventure_category": "Seleccionar categoría de aventura", - "share_adventure": "¡Comparte esta aventura!", - "start_date": "Fecha de inicio", - "upload_image": "Subir imagen", - "upload_images_here": "Sube imágenes aquí", - "url": "URL", - "warning": "Advertencia", - "wiki_desc": "Extrae un extracto de un artículo de Wikipedia que coincide con el nombre de la aventura.", - "wikipedia": "Wikipedia", - "add_an_activity": "Agregar una actividad", - "adventure_not_found": "No hay aventuras que mostrar. \n¡Agregue algunos usando el botón más en la parte inferior derecha o intente cambiar los filtros!", - "no_adventures_found": "No se encontraron aventuras", - "no_collections_found": "No se encontraron colecciones para agregar esta aventura.", - "my_adventures": "mis aventuras", - "no_linkable_adventures": "No se encontraron aventuras que puedan vincularse a esta colección." - }, - "worldtravel": { - "all": "Todo", - "all_subregions": "Todas las subregiones", - "clear_search": "Borrar búsqueda", - "completely_visited": "Completamente visitado", - "no_countries_found": "No se encontraron países", - "not_visited": "No visitado", - "num_countries": "países encontrados", - "partially_visited": "Parcialmente visitado", - "country_list": "Lista de países" - }, - "auth": { - "forgot_password": "¿Has olvidado tu contraseña?", - "login": "Acceso", - "login_error": "No se puede iniciar sesión con las credenciales proporcionadas.", - "password": "Contraseña", - "signup": "Inscribirse", - "username": "Nombre de usuario", - "confirm_password": "confirmar Contraseña", - "email": "Correo electrónico", - "first_name": "Nombre de pila", - "last_name": "Apellido", - "registration_disabled": "El registro está actualmente deshabilitado.", - "profile_picture": "Foto de perfil", - "public_profile": "Perfil público", - "public_tooltip": "Con un perfil público, los usuarios pueden compartir colecciones con usted y ver su perfil en la página de usuarios." - }, - "users": { - "no_users_found": "No se encontraron usuarios con perfiles públicos." - }, - "settings": { - "account_settings": "Configuración de cuenta de usuario", - "confirm_new_password": "Confirmar nueva contraseña", - "current_email": "Correo electrónico actual", - "email_change": "Cambiar correo electrónico", - "new_email": "Nuevo correo electrónico", - "new_password": "Nueva contraseña", - "no_email_set": "No hay correo electrónico configurado", - "password_change": "Cambiar la contraseña", - "settings_page": "Página de configuración", - "update": "Actualizar", - "update_error": "Error al actualizar la configuración", - "update_success": "¡La configuración se actualizó correctamente!" - } + "navbar": { + "adventures": "Aventuras", + "collections": "Colecciones", + "worldtravel": "Viajar por el Mundo", + "map": "Mapa", + "users": "Usuarios", + "search": "Buscar", + "profile": "Perfil", + "greeting": "Hola", + "my_adventures": "Mis Aventuras", + "my_activities": "Mis Actividades", + "shared_with_me": "Compartido Conmigo", + "settings": "Configuraciones", + "logout": "Cerrar Sesión", + "about": "Acerca de AdventureLog", + "documentation": "Documentación", + "discord": "Discord", + "theme_selection": "Selección de Tema", + "themes": { + "light": "Claro", + "dark": "Oscuro", + "night": "Noche", + "forest": "Bosque", + "aestetic-dark": "Estético Oscuro", + "aestetic-light": "Estético Claro", + "aqua": "Aqua" + } + }, + "about": { + "about": "Acerca de", + "license": "Licenciado bajo la Licencia GPL-3.0.", + "source_code": "Código Fuente", + "message": "Hecho con ❤️ en los Estados Unidos.", + "oss_attributions": "Atribuciones de Código Abierto", + "nominatim_1": "La búsqueda de ubicaciones y geocodificación es proporcionada por", + "nominatim_2": "Sus datos están licenciados bajo la licencia ODbL.", + "other_attributions": "Atribuciones adicionales se pueden encontrar en el archivo README.", + "close": "Cerrar" + }, + "home": { + "hero_1": "Descubre las Aventuras Más Emocionantes del Mundo", + "hero_2": "Descubre y planifica tu próxima aventura con AdventureLog. Explora destinos impresionantes, crea itinerarios personalizados y mantente conectado en todo momento.", + "go_to": "Ir a AdventureLog", + "key_features": "Características Clave", + "desc_1": "Descubre, Planifica y Explora Fácilmente", + "desc_2": "AdventureLog está diseñado para simplificar tu viaje, brindándote las herramientas y recursos para planificar, empacar y navegar tu próxima aventura inolvidable.", + "feature_1": "Registro de Viajes", + "feature_1_desc": "Mantén un registro de tus aventuras con un diario de viaje personalizado y comparte tus experiencias con amigos y familiares.", + "feature_2": "Planificación de Viajes", + "feature_2_desc": "Crea fácilmente itinerarios personalizados y obtén un desglose diario de tu viaje.", + "feature_3": "Mapa de Viaje", + "feature_3_desc": "Visualiza tus viajes por el mundo con un mapa interactivo y explora nuevos destinos." + }, + "adventures": { + "collection_remove_success": "¡Aventura eliminada de la colección con éxito!", + "collection_remove_error": "Error al eliminar la aventura de la colección", + "collection_link_success": "¡Aventura vinculada a la colección con éxito!", + "collection_link_error": "Error al vincular la aventura a la colección", + "adventure_delete_confirm": "¿Estás seguro de que quieres eliminar esta aventura? Esta acción no se puede deshacer.", + "open_details": "Abrir Detalles", + "edit_adventure": "Editar Aventura", + "remove_from_collection": "Eliminar de la Colección", + "add_to_collection": "Añadir a la Colección", + "delete": "Eliminar", + "activities": { + "activity": "Actividad 🏄", + "art_museums": "Arte", + "attraction": "Atracción 🎢", + "culture": "Cultura 🎭", + "dining": "Cenar 🍽️", + "event": "Evento 🎉", + "festivals": "Festivales 🎪", + "fitness": "Fitness 🏋️", + "general": "Generales 🌍", + "hiking": "Senderismo 🥾", + "historical_sites": "Sitios Históricos 🏛️", + "lodging": "Alojamiento 🛌", + "music_concerts": "Música", + "nightlife": "Vida nocturna 🌃", + "other": "Otro", + "outdoor": "Al aire libre 🏞️", + "shopping": "Compras 🛍️", + "spiritual_journeys": "Viajes espirituales 🧘‍♀️", + "transportation": "Transporte 🚗", + "volunteer_work": "Trabajo voluntario 🤝", + "water_sports": "Deportes acuáticos 🚤", + "wildlife": "Vida silvestre 🦒" + }, + "no_image_found": "No se encontró ninguna imagen", + "adventure_details": "Detalles de la aventura", + "adventure_type": "Tipo de aventura", + "collection": "Recopilación", + "homepage": "Página principal", + "latitude": "Latitud", + "longitude": "Longitud", + "not_found": "Aventura no encontrada", + "not_found_desc": "La aventura que buscabas no se pudo encontrar. \nPruebe una aventura diferente o vuelva a consultar más tarde.", + "visit": "Visita", + "visits": "Visitas", + "adventure": "Aventura", + "count_txt": "resultados que coinciden con su búsqueda", + "create_new": "Crear nuevo...", + "ascending": "Ascendente", + "collection_adventures": "Incluir aventuras de colección", + "date": "Fecha", + "descending": "Descendente", + "filter": "Filtrar", + "name": "Nombre", + "order_by": "Ordenar por", + "order_direction": "Dirección del pedido", + "rating": "Clasificación", + "sort": "Clasificar", + "sources": "Fuentes", + "updated": "Actualizado", + "category_filter": "Filtro de categoría", + "clear": "Claro", + "archived_collections": "Colecciones archivadas", + "close_filters": "Cerrar filtros", + "my_collections": "Mis colecciones", + "open_filters": "Abrir filtros", + "private": "Privado", + "public": "Público", + "archived_collection_message": "¡Colección archivada exitosamente!", + "delete_collection": "Eliminar colección", + "delete_collection_success": "¡Colección eliminada exitosamente!", + "delete_collection_warning": "¿Estás seguro de que deseas eliminar esta colección? \nEsto también eliminará todas las aventuras vinculadas. \nEsta acción no se puede deshacer.", + "unarchived_collection_message": "¡Colección desarchivada exitosamente!", + "archive": "Archivo", + "archived": "Archivado", + "edit_collection": "Editar colección", + "share": "Compartir", + "unarchive": "Desarchivar", + "cancel": "Cancelar", + "adventure_delete_success": "¡Aventura eliminada con éxito!", + "delete_adventure": "Eliminar aventura", + "planned": "Planificado", + "visited": "Visitado", + "dates": "Fechas", + "duration": "Duración", + "image_removed_error": "Error al eliminar la imagen", + "image_removed_success": "¡Imagen eliminada exitosamente!", + "image_upload_error": "Error al subir la imagen", + "image_upload_success": "¡Imagen cargada exitosamente!", + "no_image_url": "No se encontró ninguna imagen en esa URL.", + "start_before_end_error": "La fecha de inicio debe ser anterior a la fecha de finalización.", + "wiki_image_error": "Error al obtener la imagen de Wikipedia", + "actions": "Comportamiento", + "activity": "Actividad", + "see_adventures": "Ver Aventuras", + "activity_types": "Tipos de actividad", + "add": "Agregar", + "add_notes": "Agregar notas", + "adventure_create_error": "No se pudo crear la aventura", + "adventure_created": "Aventura creada", + "adventure_update_error": "No se pudo actualizar la aventura", + "adventure_updated": "Aventura actualizada", + "basic_information": "Información básica", + "category": "Categoría", + "clear_map": "Borrar mapa", + "copy_link": "Copiar enlace", + "date_constrain": "Restringir a las fechas de recolección", + "description": "Descripción", + "end_date": "Fecha de finalización", + "fetch_image": "Obtener imagen", + "generate_desc": "Generar descripción", + "image": "Imagen", + "image_fetch_failed": "No se pudo recuperar la imagen", + "link": "Enlace", + "location": "Ubicación", + "location_information": "Información de ubicación", + "my_images": "Mis imágenes", + "my_visits": "Mis visitas", + "new_adventure": "Nueva aventura", + "no_description_found": "No se encontró ninguna descripción", + "no_images": "Sin imágenes", + "no_location": "Por favor ingresa una ubicación", + "no_results": "No se encontraron resultados", + "no_start_date": "Por favor ingrese una fecha de inicio", + "public_adventure": "Aventura pública", + "remove": "Eliminar", + "save_next": "Ahorrar", + "search_for_location": "Buscar una ubicación", + "search_results": "Resultados de búsqueda", + "select_adventure_category": "Seleccionar categoría de aventura", + "share_adventure": "¡Comparte esta aventura!", + "start_date": "Fecha de inicio", + "upload_image": "Subir imagen", + "upload_images_here": "Sube imágenes aquí", + "url": "URL", + "warning": "Advertencia", + "wiki_desc": "Extrae un extracto de un artículo de Wikipedia que coincide con el nombre de la aventura.", + "wikipedia": "Wikipedia", + "add_an_activity": "Agregar una actividad", + "adventure_not_found": "No hay aventuras que mostrar. \n¡Agregue algunos usando el botón más en la parte inferior derecha o intente cambiar los filtros!", + "no_adventures_found": "No se encontraron aventuras", + "no_collections_found": "No se encontraron colecciones para agregar esta aventura.", + "my_adventures": "mis aventuras", + "no_linkable_adventures": "No se encontraron aventuras que puedan vincularse a esta colección.", + "mark_region_as_visited": "¿Marcar región {region}, {country} como visitada?", + "mark_visited": "Marcos visitó", + "not_visited": "No visitado" + }, + "worldtravel": { + "all": "Todo", + "all_subregions": "Todas las subregiones", + "clear_search": "Borrar búsqueda", + "completely_visited": "Completamente visitado", + "no_countries_found": "No se encontraron países", + "not_visited": "No visitado", + "num_countries": "países encontrados", + "partially_visited": "Parcialmente visitado", + "country_list": "Lista de países" + }, + "auth": { + "forgot_password": "¿Has olvidado tu contraseña?", + "login": "Acceso", + "login_error": "No se puede iniciar sesión con las credenciales proporcionadas.", + "password": "Contraseña", + "signup": "Inscribirse", + "username": "Nombre de usuario", + "confirm_password": "confirmar Contraseña", + "email": "Correo electrónico", + "first_name": "Nombre de pila", + "last_name": "Apellido", + "registration_disabled": "El registro está actualmente deshabilitado.", + "profile_picture": "Foto de perfil", + "public_profile": "Perfil público", + "public_tooltip": "Con un perfil público, los usuarios pueden compartir colecciones con usted y ver su perfil en la página de usuarios." + }, + "users": { + "no_users_found": "No se encontraron usuarios con perfiles públicos." + }, + "settings": { + "account_settings": "Configuración de cuenta de usuario", + "confirm_new_password": "Confirmar nueva contraseña", + "current_email": "Correo electrónico actual", + "email_change": "Cambiar correo electrónico", + "new_email": "Nuevo correo electrónico", + "new_password": "Nueva contraseña", + "no_email_set": "No hay correo electrónico configurado", + "password_change": "Cambiar la contraseña", + "settings_page": "Página de configuración", + "update": "Actualizar", + "update_error": "Error al actualizar la configuración", + "update_success": "¡La configuración se actualizó correctamente!" + } } diff --git a/frontend/src/routes/collections/[id]/+page.svelte b/frontend/src/routes/collections/[id]/+page.svelte index 47b401f7..e4316ea5 100644 --- a/frontend/src/routes/collections/[id]/+page.svelte +++ b/frontend/src/routes/collections/[id]/+page.svelte @@ -20,8 +20,7 @@ groupAdventuresByDate, groupNotesByDate, groupTransportationsByDate, - groupChecklistsByDate, - isAdventureVisited + groupChecklistsByDate } from '$lib'; import ChecklistCard from '$lib/components/ChecklistCard.svelte'; import ChecklistModal from '$lib/components/ChecklistModal.svelte'; @@ -45,7 +44,7 @@ $: { numAdventures = adventures.length; - numVisited = adventures.filter(isAdventureVisited).length; + numVisited = adventures.filter((adventure) => adventure.is_visited).length; } let notFound: boolean = false; diff --git a/frontend/src/routes/map/+page.server.ts b/frontend/src/routes/map/+page.server.ts index 7675a5da..919b1016 100644 --- a/frontend/src/routes/map/+page.server.ts +++ b/frontend/src/routes/map/+page.server.ts @@ -46,6 +46,7 @@ export const load = (async (event) => { name: adventure.name, visits: adventure.visits, type: adventure.type, + is_visited: adventure.is_visited }; }); diff --git a/frontend/src/routes/map/+page.svelte b/frontend/src/routes/map/+page.svelte index 6e91d768..0b8d9250 100644 --- a/frontend/src/routes/map/+page.svelte +++ b/frontend/src/routes/map/+page.svelte @@ -1,7 +1,6 @@

{$t('settings.settings_page')}

@@ -182,7 +182,7 @@
- - {#if newMarker.length > 0} +
+ {#if newMarker} - {:else} @@ -142,12 +104,13 @@ class="relative aspect-[9/16] max-h-[70vh] w-full sm:aspect-video sm:max-h-full" standardControls > - {#each filteredMarkers as marker} - {#if marker.is_visited} + {#each filteredAdventures as adventure} + {#if adventure.latitude && adventure.longitude} (clickedName = marker.name)} - class="grid h-8 w-8 place-items-center rounded-full border border-gray-200 bg-red-300 text-black shadow-md" + lngLat={[adventure.longitude, adventure.latitude]} + class="grid h-8 w-8 place-items-center rounded-full border border-gray-200 bg-{adventure.is_visited + ? 'red' + : 'blue'}-300 text-black shadow-md" > - + -
{marker.name}
-

Visited

+
{adventure.name}

- {$t(`adventures.activities.${marker.type}`)} + {adventure.is_visited ? $t('adventures.visited') : $t('adventures.planned')}

- {#if marker.visits && marker.visits.length > 0} -

- {#each marker.visits as visit} - {visit.start_date - ? new Date(visit.start_date).toLocaleDateString(undefined, { - timeZone: 'UTC' - }) - : ''} - {visit.end_date && visit.end_date !== '' && visit.end_date !== visit.start_date - ? ' - ' + - new Date(visit.end_date).toLocaleDateString(undefined, { - timeZone: 'UTC' - }) - : ''} -
- {/each} -

- {/if} -
-
- {:else} - (clickedName = marker.name)} - class="grid h-8 w-8 place-items-center rounded-full border border-gray-200 bg-blue-300 text-black shadow-2xl focus:outline-2 focus:outline-black" - > - - - - -
{marker.name}
-

Planned

- {$t(`adventures.activities.${marker.type}`)} + {$t(`adventures.activities.${adventure.type}`)}

- {#if marker.visits && marker.visits.length > 0} + {#if adventure.visits && adventure.visits.length > 0}

- {#each marker.visits as visit} + {#each adventure.visits as visit} {visit.start_date ? new Date(visit.start_date).toLocaleDateString(undefined, { timeZone: 'UTC' @@ -229,31 +160,31 @@ {/each} - {#each newMarker as marker} - - {/each} + {#if newMarker} + + {/if} - {#each allRegions as { longitude, latitude, name, region }} - (clickedName = name)} - class="grid h-8 w-8 place-items-center rounded-full border border-gray-200 bg-green-300 text-black shadow-md" - > - - - - - -

{name}
-

{region}

-
-
+ + + + +
{name}
+

{region.name}

+
+ + {/if} {/each} From 6137411b84caa96a3135c185933001fe13878eab Mon Sep 17 00:00:00 2001 From: Sean Morley Date: Sat, 2 Nov 2024 21:29:42 -0400 Subject: [PATCH 33/65] Update adventure type label handling and improve map marker display --- frontend/src/lib/index.ts | 12 ++++++---- frontend/src/routes/map/+page.svelte | 36 +++++++++++++--------------- 2 files changed, 23 insertions(+), 25 deletions(-) diff --git a/frontend/src/lib/index.ts b/frontend/src/lib/index.ts index 40d5ff99..958b2fa1 100644 --- a/frontend/src/lib/index.ts +++ b/frontend/src/lib/index.ts @@ -279,11 +279,13 @@ export let ADVENTURE_TYPE_ICONS = { other: '❓' }; -type AdventureType = keyof typeof ADVENTURE_TYPE_ICONS; - -export function getAdventureTypeLabel(type: AdventureType) { - const typeObj = ADVENTURE_TYPE_ICONS[type]; - return typeObj; +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() { diff --git a/frontend/src/routes/map/+page.svelte b/frontend/src/routes/map/+page.svelte index 89b03d5d..bcf26255 100644 --- a/frontend/src/routes/map/+page.svelte +++ b/frontend/src/routes/map/+page.svelte @@ -3,6 +3,7 @@ import { DefaultMarker, MapEvents, MapLibre, Popup, Marker } from 'svelte-maplibre'; import { t } from 'svelte-i18n'; import type { Adventure, VisitedRegion } from '$lib/types.js'; + import { getAdventureTypeLabel } from '$lib'; export let data; let createModalOpen: boolean = false; @@ -20,6 +21,14 @@ ); } + // Reset the longitude and latitude when the newMarker is set to null so new adventures are not created at the wrong location + $: { + if (!newMarker) { + newLongitude = null; + newLatitude = null; + } + } + console.log(data); let showVisited: boolean = true; @@ -110,24 +119,11 @@ lngLat={[adventure.longitude, adventure.latitude]} class="grid h-8 w-8 place-items-center rounded-full border border-gray-200 bg-{adventure.is_visited ? 'red' - : 'blue'}-300 text-black shadow-md" + : 'blue'}-300 text-black shadow-2xl focus:outline-2 focus:outline-black" > - - - + + {getAdventureTypeLabel(adventure.type)} +
{adventure.name}

@@ -167,7 +163,7 @@ {#each visitedRegions as region} {#if showGeo} -

{name}
-

{region.name}

+
{region.name}
+

{region.region}

{/if} From 172f07accae8f9335b6f5229d27946490f94924f Mon Sep 17 00:00:00 2001 From: Sean Morley Date: Sat, 2 Nov 2024 21:45:23 -0400 Subject: [PATCH 34/65] Add popup toggle and card carousel for adventure details in map view --- frontend/src/routes/map/+page.svelte | 77 ++++++++++++++++------------ 1 file changed, 44 insertions(+), 33 deletions(-) diff --git a/frontend/src/routes/map/+page.svelte b/frontend/src/routes/map/+page.svelte index bcf26255..d3ec5896 100644 --- a/frontend/src/routes/map/+page.svelte +++ b/frontend/src/routes/map/+page.svelte @@ -4,6 +4,8 @@ import { t } from 'svelte-i18n'; import type { Adventure, VisitedRegion } from '$lib/types.js'; import { getAdventureTypeLabel } from '$lib'; + import CardCarousel from '$lib/components/CardCarousel.svelte'; + import { goto } from '$app/navigation'; export let data; let createModalOpen: boolean = false; @@ -39,6 +41,8 @@ let newLongitude: number | null = null; let newLatitude: number | null = null; + let openPopupId: string | null = null; // Store the ID of the currently open popup + function addMarker(e: { detail: { lngLat: { lng: any; lat: any } } }) { newMarker = null; newMarker = { lngLat: e.detail.lngLat }; @@ -46,17 +50,17 @@ newLatitude = e.detail.lngLat.lat; } - // let markers = []; - - // $: { - // markers = data.props.markers; - // } - function createNewAdventure(event: CustomEvent) { adventures = [...adventures, event.detail]; newMarker = null; createModalOpen = false; } + + let isPopupOpen = false; + + function togglePopup() { + isPopupOpen = !isPopupOpen; + }

Adventure Map

@@ -73,7 +77,6 @@ Planned - {getAdventureTypeLabel(adventure.type)} - -
{adventure.name}
-

- {adventure.is_visited ? $t('adventures.visited') : $t('adventures.planned')} -

-

- {$t(`adventures.activities.${adventure.type}`)} -

- {#if adventure.visits && adventure.visits.length > 0} -

- {#each adventure.visits as visit} - {visit.start_date - ? new Date(visit.start_date).toLocaleDateString(undefined, { - timeZone: 'UTC' - }) - : ''} - {visit.end_date && visit.end_date !== '' && visit.end_date !== visit.start_date - ? ' - ' + - new Date(visit.end_date).toLocaleDateString(undefined, { - timeZone: 'UTC' - }) - : ''} -
- {/each} + {#if isPopupOpen} + (isPopupOpen = false)}> + +

{adventure.name}
+

+ {adventure.is_visited ? $t('adventures.visited') : $t('adventures.planned')}

- {/if} -
+

+ {$t(`adventures.activities.${adventure.type}`)} +

+ {#if adventure.visits && adventure.visits.length > 0} +

+ {#each adventure.visits as visit} + {visit.start_date + ? new Date(visit.start_date).toLocaleDateString(undefined, { + timeZone: 'UTC' + }) + : ''} + {visit.end_date && visit.end_date !== '' && visit.end_date !== visit.start_date + ? ' - ' + + new Date(visit.end_date).toLocaleDateString(undefined, { + timeZone: 'UTC' + }) + : ''} +
+ {/each} +

+ {/if} + + + {/if} {/if} {/each} From 4bbbc10097954d02434cbe077e0025263b0a6d85 Mon Sep 17 00:00:00 2001 From: Sean Morley Date: Sun, 3 Nov 2024 15:12:28 -0500 Subject: [PATCH 35/65] Bump version to 0.7.1, update COUNTRY_REGION_JSON_VERSION, and add nginx migration guide --- backend/server/main/settings.py | 2 +- documentation/docs/Usage/nginx_migration.md | 35 +++++++++++++++++++++ frontend/package.json | 2 +- frontend/src/lib/config.ts | 4 +-- frontend/src/routes/map/+page.svelte | 4 ++- 5 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 documentation/docs/Usage/nginx_migration.md diff --git a/backend/server/main/settings.py b/backend/server/main/settings.py index 76a661c3..986343eb 100644 --- a/backend/server/main/settings.py +++ b/backend/server/main/settings.py @@ -263,4 +263,4 @@ LOGGING = { } # https://github.com/dr5hn/countries-states-cities-database/tags -COUNTRY_REGION_JSON_VERSION = 'v2.4' \ No newline at end of file +COUNTRY_REGION_JSON_VERSION = 'v2.5' \ No newline at end of file diff --git a/documentation/docs/Usage/nginx_migration.md b/documentation/docs/Usage/nginx_migration.md new file mode 100644 index 00000000..4f071aa7 --- /dev/null +++ b/documentation/docs/Usage/nginx_migration.md @@ -0,0 +1,35 @@ +--- +sidebar_position: 2 +--- + +# AdventureLog v0.7.1 Migration Guide + +In order to make installation easier, the AdventureLog v0.7.1 release has **removed the need for a seperate nginx container** and cofig to serve the media files. Instead, the media files are now served by an instance of nginx running in the same container as the Django application. + +## Docker Compose Changes + +:::note + +You can also just use the new `docker-compose.yml` file in the repository and change the environment variables to match your setup. + +::: + +1. Remove the `nginx` service from your `docker-compose.yml` file. +2. Update the `PUBLIC_URL` environment variable in the `server` service (backend) to match the address of your **server**, instead of the previous nginx instance. For example, if your server is exposed to `https://localhost:8000`, set `PUBLIC_URL` to `http://localhost:8000`. If you are using a domain name, set `PUBLIC_URL` to `https://api.yourdomain.com` as an example. +3. Change port mapping for the `server` service. Right now it probally looks like this: + ```yaml + ports: + - "your-exposed-port:8000" + ``` + Change it to: + ```yaml + ports: + - "your-exposed-port:80" + ``` + This is because the nginx instance in the container is now serving the Django application on port 80. The port on the left side of the colon is the port on your host machine and this can be changed to whatever you want. The port on the right side of the colon is the port the Django application is running on in the container and should not be changed. + +That's it! You should now be able to run the application with the new configuration! This update also includes some performance enhancements so there should be a slight speed increase as well, especially with multiple users. + +Enjoy the new version of AdventureLog! 🎉 + +Report any bugs [GitHub repository](https://github.com/seanmorley15/adventurelog) or ask for help in the [Discord server](https://discord.gg/wRbQ9Egr8C). diff --git a/frontend/package.json b/frontend/package.json index 7842a948..b9aa1f47 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "adventurelog-frontend", - "version": "0.7.0", + "version": "0.7.1", "scripts": { "dev": "vite dev", "django": "cd .. && cd backend/server && python3 manage.py runserver", diff --git a/frontend/src/lib/config.ts b/frontend/src/lib/config.ts index 1319ff3f..15ee7ef2 100644 --- a/frontend/src/lib/config.ts +++ b/frontend/src/lib/config.ts @@ -1,4 +1,4 @@ -export let appVersion = 'Web v0.7.0'; -export let versionChangelog = 'https://github.com/seanmorley15/AdventureLog/releases/tag/v0.7.0'; +export let appVersion = 'Web v0.7.1'; +export let versionChangelog = 'https://github.com/seanmorley15/AdventureLog/releases/tag/v0.7.1'; export let appTitle = 'AdventureLog'; export let copyrightYear = '2024'; diff --git a/frontend/src/routes/map/+page.svelte b/frontend/src/routes/map/+page.svelte index d3ec5896..a8580c1b 100644 --- a/frontend/src/routes/map/+page.svelte +++ b/frontend/src/routes/map/+page.svelte @@ -130,7 +130,9 @@ {#if isPopupOpen} (isPopupOpen = false)}> - + {#if adventure.images && adventure.images.length > 0} + + {/if}
{adventure.name}

{adventure.is_visited ? $t('adventures.visited') : $t('adventures.planned')} From c0aaec1436bac592ab30b4e32017d94b10be9c3f Mon Sep 17 00:00:00 2001 From: Sean Morley Date: Sun, 3 Nov 2024 15:45:29 -0500 Subject: [PATCH 36/65] More settings localization --- documentation/docusaurus.config.ts | 6 +- frontend/src/locales/de.json | 33 +- frontend/src/locales/en.json | 12 +- frontend/src/locales/es.json | 509 +++++++++--------- frontend/src/locales/fr.json | 29 +- frontend/src/locales/it.json | 29 +- frontend/src/locales/nl.json | 28 +- frontend/src/locales/sv.json | 34 +- frontend/src/locales/zh.json | 29 +- .../settings/forgot-password/+page.server.ts | 2 +- .../settings/forgot-password/+page.svelte | 12 +- .../forgot-password/confirm/+page.server.ts | 8 +- .../forgot-password/confirm/+page.svelte | 17 +- 13 files changed, 464 insertions(+), 284 deletions(-) diff --git a/documentation/docusaurus.config.ts b/documentation/docusaurus.config.ts index df03a831..20657c15 100644 --- a/documentation/docusaurus.config.ts +++ b/documentation/docusaurus.config.ts @@ -15,8 +15,8 @@ const config: Config = { // GitHub pages deployment config. // If you aren't using GitHub pages, you don't need these. - organizationName: "facebook", // Usually your GitHub org/user name. - projectName: "docusaurus", // Usually your repo name. + organizationName: "seanmorley", // Usually your GitHub org/user name. + projectName: "adventurelog", // Usually your repo name. onBrokenLinks: "throw", onBrokenMarkdownLinks: "warn", @@ -40,7 +40,7 @@ const config: Config = { // Please change this to your repo. // Remove this to remove the "edit this page" links. editUrl: - "https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/", + "https://github.com/seanmorley15/AdventureLog/tree/main/documentation", }, // blog: { // showReadingTime: true, diff --git a/frontend/src/locales/de.json b/frontend/src/locales/de.json index 07444381..2fdf9155 100644 --- a/frontend/src/locales/de.json +++ b/frontend/src/locales/de.json @@ -149,7 +149,22 @@ "url": "URL", "warning": "Warnung", "wiki_desc": "Ruft einen Auszug aus einem Wikipedia-Artikel ab, der zum Namen des Abenteuers passt.", - "wikipedia": "Wikipedia" + "wikipedia": "Wikipedia", + "adventure_not_found": "Es sind keine Abenteuer zum Anzeigen vorhanden. \nFügen Sie einige über die Plus-Schaltfläche unten rechts hinzu oder versuchen Sie, die Filter zu ändern!", + "all": "Alle", + "error_updating_regions": "Fehler beim Aktualisieren der Regionen", + "mark_region_as_visited": "Region {region}, {country} als besucht markieren?", + "mark_visited": "Mark besucht", + "my_adventures": "Meine Abenteuer", + "no_adventures_found": "Keine Abenteuer gefunden", + "no_collections_found": "Es wurden keine Sammlungen gefunden, zu denen dieses Abenteuer hinzugefügt werden kann.", + "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", + "update_visited_regions": "Besuchte Regionen aktualisieren", + "update_visited_regions_disclaimer": "Dies kann je nach Anzahl der Abenteuer, die Sie besucht haben, eine Weile dauern.", + "visited_region_check": "Überprüfung der besuchten Region", + "visited_region_check_desc": "Wenn Sie diese Option auswählen, überprüft der Server alle von Ihnen besuchten Abenteuer und markiert die Regionen, in denen sie sich befinden, als im Rahmen von Weltreisen besucht." }, "home": { "desc_1": "Entdecken, planen und erkunden Sie mit Leichtigkeit", @@ -206,7 +221,8 @@ "signup": "Melden Sie sich an", "username": "Benutzername", "profile_picture": "Profilbild", - "public_profile": "Öffentliches Profil" + "public_profile": "Öffentliches Profil", + "public_tooltip": "Mit einem öffentlichen Profil können Benutzer Sammlungen mit Ihnen teilen und Ihr Profil auf der Benutzerseite anzeigen." }, "users": { "no_users_found": "Keine Benutzer mit öffentlichen Profilen gefunden." @@ -233,6 +249,17 @@ "settings_page": "Einstellungsseite", "update": "Aktualisieren", "update_error": "Fehler beim Aktualisieren der Einstellungen", - "update_success": "Einstellungen erfolgreich aktualisiert!" + "update_success": "Einstellungen erfolgreich aktualisiert!", + "change_password": "Kennwort ändern", + "confirm_new_password": "Bestätigen Sie das neue Passwort", + "invalid_token": "Token ist ungültig oder abgelaufen", + "login_redir": "Anschließend werden Sie zur Anmeldeseite weitergeleitet.", + "missing_email": "Bitte geben Sie eine E-Mail-Adresse ein", + "password_does_not_match": "Passwörter stimmen nicht überein", + "password_is_required": "Passwort ist erforderlich", + "possible_reset": "Wenn die von Ihnen angegebene E-Mail-Adresse mit einem Konto verknüpft ist, erhalten Sie eine E-Mail mit Anweisungen zum Zurücksetzen Ihres Passworts!", + "reset_password": "Passwort zurücksetzen", + "submit": "Einreichen", + "token_required": "Zum Zurücksetzen des Passworts sind Token und UID erforderlich." } } diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index 8caa73a3..46a6d1e5 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -250,6 +250,16 @@ "email_change": "Change Email", "current_email": "Current Email", "no_email_set": "No email set", - "new_email": "New Email" + "new_email": "New Email", + "change_password": "Change Password", + "login_redir": "You will then be redirected to the login page.", + "token_required": "Token and UID are required for password reset.", + "reset_password": "Reset Password", + "possible_reset": "If the email address you provided is associated with an account, you will receive an email with instructions to reset your password!", + "missing_email": "Please enter an email address", + "submit": "Submit", + "password_does_not_match": "Passwords do not match", + "password_is_required": "Password is required", + "invalid_token": "Token is invalid or has expired" } } diff --git a/frontend/src/locales/es.json b/frontend/src/locales/es.json index e01d0fb5..e2d80450 100644 --- a/frontend/src/locales/es.json +++ b/frontend/src/locales/es.json @@ -1,248 +1,265 @@ { - "navbar": { - "adventures": "Aventuras", - "collections": "Colecciones", - "worldtravel": "Viajar por el Mundo", - "map": "Mapa", - "users": "Usuarios", - "search": "Buscar", - "profile": "Perfil", - "greeting": "Hola", - "my_adventures": "Mis Aventuras", - "my_activities": "Mis Actividades", - "shared_with_me": "Compartido Conmigo", - "settings": "Configuraciones", - "logout": "Cerrar Sesión", - "about": "Acerca de AdventureLog", - "documentation": "Documentación", - "discord": "Discord", - "theme_selection": "Selección de Tema", - "themes": { - "light": "Claro", - "dark": "Oscuro", - "night": "Noche", - "forest": "Bosque", - "aestetic-dark": "Estético Oscuro", - "aestetic-light": "Estético Claro", - "aqua": "Aqua" - } - }, - "about": { - "about": "Acerca de", - "license": "Licenciado bajo la Licencia GPL-3.0.", - "source_code": "Código Fuente", - "message": "Hecho con ❤️ en los Estados Unidos.", - "oss_attributions": "Atribuciones de Código Abierto", - "nominatim_1": "La búsqueda de ubicaciones y geocodificación es proporcionada por", - "nominatim_2": "Sus datos están licenciados bajo la licencia ODbL.", - "other_attributions": "Atribuciones adicionales se pueden encontrar en el archivo README.", - "close": "Cerrar" - }, - "home": { - "hero_1": "Descubre las Aventuras Más Emocionantes del Mundo", - "hero_2": "Descubre y planifica tu próxima aventura con AdventureLog. Explora destinos impresionantes, crea itinerarios personalizados y mantente conectado en todo momento.", - "go_to": "Ir a AdventureLog", - "key_features": "Características Clave", - "desc_1": "Descubre, Planifica y Explora Fácilmente", - "desc_2": "AdventureLog está diseñado para simplificar tu viaje, brindándote las herramientas y recursos para planificar, empacar y navegar tu próxima aventura inolvidable.", - "feature_1": "Registro de Viajes", - "feature_1_desc": "Mantén un registro de tus aventuras con un diario de viaje personalizado y comparte tus experiencias con amigos y familiares.", - "feature_2": "Planificación de Viajes", - "feature_2_desc": "Crea fácilmente itinerarios personalizados y obtén un desglose diario de tu viaje.", - "feature_3": "Mapa de Viaje", - "feature_3_desc": "Visualiza tus viajes por el mundo con un mapa interactivo y explora nuevos destinos." - }, - "adventures": { - "collection_remove_success": "¡Aventura eliminada de la colección con éxito!", - "collection_remove_error": "Error al eliminar la aventura de la colección", - "collection_link_success": "¡Aventura vinculada a la colección con éxito!", - "collection_link_error": "Error al vincular la aventura a la colección", - "adventure_delete_confirm": "¿Estás seguro de que quieres eliminar esta aventura? Esta acción no se puede deshacer.", - "open_details": "Abrir Detalles", - "edit_adventure": "Editar Aventura", - "remove_from_collection": "Eliminar de la Colección", - "add_to_collection": "Añadir a la Colección", - "delete": "Eliminar", - "activities": { - "activity": "Actividad 🏄", - "art_museums": "Arte", - "attraction": "Atracción 🎢", - "culture": "Cultura 🎭", - "dining": "Cenar 🍽️", - "event": "Evento 🎉", - "festivals": "Festivales 🎪", - "fitness": "Fitness 🏋️", - "general": "Generales 🌍", - "hiking": "Senderismo 🥾", - "historical_sites": "Sitios Históricos 🏛️", - "lodging": "Alojamiento 🛌", - "music_concerts": "Música", - "nightlife": "Vida nocturna 🌃", - "other": "Otro", - "outdoor": "Al aire libre 🏞️", - "shopping": "Compras 🛍️", - "spiritual_journeys": "Viajes espirituales 🧘‍♀️", - "transportation": "Transporte 🚗", - "volunteer_work": "Trabajo voluntario 🤝", - "water_sports": "Deportes acuáticos 🚤", - "wildlife": "Vida silvestre 🦒" - }, - "no_image_found": "No se encontró ninguna imagen", - "adventure_details": "Detalles de la aventura", - "adventure_type": "Tipo de aventura", - "collection": "Recopilación", - "homepage": "Página principal", - "latitude": "Latitud", - "longitude": "Longitud", - "not_found": "Aventura no encontrada", - "not_found_desc": "La aventura que buscabas no se pudo encontrar. \nPruebe una aventura diferente o vuelva a consultar más tarde.", - "visit": "Visita", - "visits": "Visitas", - "adventure": "Aventura", - "count_txt": "resultados que coinciden con su búsqueda", - "create_new": "Crear nuevo...", - "ascending": "Ascendente", - "collection_adventures": "Incluir aventuras de colección", - "date": "Fecha", - "descending": "Descendente", - "filter": "Filtrar", - "name": "Nombre", - "order_by": "Ordenar por", - "order_direction": "Dirección del pedido", - "rating": "Clasificación", - "sort": "Clasificar", - "sources": "Fuentes", - "updated": "Actualizado", - "category_filter": "Filtro de categoría", - "clear": "Claro", - "archived_collections": "Colecciones archivadas", - "close_filters": "Cerrar filtros", - "my_collections": "Mis colecciones", - "open_filters": "Abrir filtros", - "private": "Privado", - "public": "Público", - "archived_collection_message": "¡Colección archivada exitosamente!", - "delete_collection": "Eliminar colección", - "delete_collection_success": "¡Colección eliminada exitosamente!", - "delete_collection_warning": "¿Estás seguro de que deseas eliminar esta colección? \nEsto también eliminará todas las aventuras vinculadas. \nEsta acción no se puede deshacer.", - "unarchived_collection_message": "¡Colección desarchivada exitosamente!", - "archive": "Archivo", - "archived": "Archivado", - "edit_collection": "Editar colección", - "share": "Compartir", - "unarchive": "Desarchivar", - "cancel": "Cancelar", - "adventure_delete_success": "¡Aventura eliminada con éxito!", - "delete_adventure": "Eliminar aventura", - "planned": "Planificado", - "visited": "Visitado", - "dates": "Fechas", - "duration": "Duración", - "image_removed_error": "Error al eliminar la imagen", - "image_removed_success": "¡Imagen eliminada exitosamente!", - "image_upload_error": "Error al subir la imagen", - "image_upload_success": "¡Imagen cargada exitosamente!", - "no_image_url": "No se encontró ninguna imagen en esa URL.", - "start_before_end_error": "La fecha de inicio debe ser anterior a la fecha de finalización.", - "wiki_image_error": "Error al obtener la imagen de Wikipedia", - "actions": "Comportamiento", - "activity": "Actividad", - "see_adventures": "Ver Aventuras", - "activity_types": "Tipos de actividad", - "add": "Agregar", - "add_notes": "Agregar notas", - "adventure_create_error": "No se pudo crear la aventura", - "adventure_created": "Aventura creada", - "adventure_update_error": "No se pudo actualizar la aventura", - "adventure_updated": "Aventura actualizada", - "basic_information": "Información básica", - "category": "Categoría", - "clear_map": "Borrar mapa", - "copy_link": "Copiar enlace", - "date_constrain": "Restringir a las fechas de recolección", - "description": "Descripción", - "end_date": "Fecha de finalización", - "fetch_image": "Obtener imagen", - "generate_desc": "Generar descripción", - "image": "Imagen", - "image_fetch_failed": "No se pudo recuperar la imagen", - "link": "Enlace", - "location": "Ubicación", - "location_information": "Información de ubicación", - "my_images": "Mis imágenes", - "my_visits": "Mis visitas", - "new_adventure": "Nueva aventura", - "no_description_found": "No se encontró ninguna descripción", - "no_images": "Sin imágenes", - "no_location": "Por favor ingresa una ubicación", - "no_results": "No se encontraron resultados", - "no_start_date": "Por favor ingrese una fecha de inicio", - "public_adventure": "Aventura pública", - "remove": "Eliminar", - "save_next": "Ahorrar", - "search_for_location": "Buscar una ubicación", - "search_results": "Resultados de búsqueda", - "select_adventure_category": "Seleccionar categoría de aventura", - "share_adventure": "¡Comparte esta aventura!", - "start_date": "Fecha de inicio", - "upload_image": "Subir imagen", - "upload_images_here": "Sube imágenes aquí", - "url": "URL", - "warning": "Advertencia", - "wiki_desc": "Extrae un extracto de un artículo de Wikipedia que coincide con el nombre de la aventura.", - "wikipedia": "Wikipedia", - "add_an_activity": "Agregar una actividad", - "adventure_not_found": "No hay aventuras que mostrar. \n¡Agregue algunos usando el botón más en la parte inferior derecha o intente cambiar los filtros!", - "no_adventures_found": "No se encontraron aventuras", - "no_collections_found": "No se encontraron colecciones para agregar esta aventura.", - "my_adventures": "mis aventuras", - "no_linkable_adventures": "No se encontraron aventuras que puedan vincularse a esta colección.", - "mark_region_as_visited": "¿Marcar región {region}, {country} como visitada?", - "mark_visited": "Marcos visitó", - "not_visited": "No visitado" - }, - "worldtravel": { - "all": "Todo", - "all_subregions": "Todas las subregiones", - "clear_search": "Borrar búsqueda", - "completely_visited": "Completamente visitado", - "no_countries_found": "No se encontraron países", - "not_visited": "No visitado", - "num_countries": "países encontrados", - "partially_visited": "Parcialmente visitado", - "country_list": "Lista de países" - }, - "auth": { - "forgot_password": "¿Has olvidado tu contraseña?", - "login": "Acceso", - "login_error": "No se puede iniciar sesión con las credenciales proporcionadas.", - "password": "Contraseña", - "signup": "Inscribirse", - "username": "Nombre de usuario", - "confirm_password": "confirmar Contraseña", - "email": "Correo electrónico", - "first_name": "Nombre de pila", - "last_name": "Apellido", - "registration_disabled": "El registro está actualmente deshabilitado.", - "profile_picture": "Foto de perfil", - "public_profile": "Perfil público", - "public_tooltip": "Con un perfil público, los usuarios pueden compartir colecciones con usted y ver su perfil en la página de usuarios." - }, - "users": { - "no_users_found": "No se encontraron usuarios con perfiles públicos." - }, - "settings": { - "account_settings": "Configuración de cuenta de usuario", - "confirm_new_password": "Confirmar nueva contraseña", - "current_email": "Correo electrónico actual", - "email_change": "Cambiar correo electrónico", - "new_email": "Nuevo correo electrónico", - "new_password": "Nueva contraseña", - "no_email_set": "No hay correo electrónico configurado", - "password_change": "Cambiar la contraseña", - "settings_page": "Página de configuración", - "update": "Actualizar", - "update_error": "Error al actualizar la configuración", - "update_success": "¡La configuración se actualizó correctamente!" - } + "navbar": { + "adventures": "Aventuras", + "collections": "Colecciones", + "worldtravel": "Viajar por el Mundo", + "map": "Mapa", + "users": "Usuarios", + "search": "Buscar", + "profile": "Perfil", + "greeting": "Hola", + "my_adventures": "Mis Aventuras", + "my_activities": "Mis Actividades", + "shared_with_me": "Compartido Conmigo", + "settings": "Configuraciones", + "logout": "Cerrar Sesión", + "about": "Acerca de AdventureLog", + "documentation": "Documentación", + "discord": "Discord", + "theme_selection": "Selección de Tema", + "themes": { + "light": "Claro", + "dark": "Oscuro", + "night": "Noche", + "forest": "Bosque", + "aestetic-dark": "Estético Oscuro", + "aestetic-light": "Estético Claro", + "aqua": "Aqua" + } + }, + "about": { + "about": "Acerca de", + "license": "Licenciado bajo la Licencia GPL-3.0.", + "source_code": "Código Fuente", + "message": "Hecho con ❤️ en los Estados Unidos.", + "oss_attributions": "Atribuciones de Código Abierto", + "nominatim_1": "La búsqueda de ubicaciones y geocodificación es proporcionada por", + "nominatim_2": "Sus datos están licenciados bajo la licencia ODbL.", + "other_attributions": "Atribuciones adicionales se pueden encontrar en el archivo README.", + "close": "Cerrar" + }, + "home": { + "hero_1": "Descubre las Aventuras Más Emocionantes del Mundo", + "hero_2": "Descubre y planifica tu próxima aventura con AdventureLog. Explora destinos impresionantes, crea itinerarios personalizados y mantente conectado en todo momento.", + "go_to": "Ir a AdventureLog", + "key_features": "Características Clave", + "desc_1": "Descubre, Planifica y Explora Fácilmente", + "desc_2": "AdventureLog está diseñado para simplificar tu viaje, brindándote las herramientas y recursos para planificar, empacar y navegar tu próxima aventura inolvidable.", + "feature_1": "Registro de Viajes", + "feature_1_desc": "Mantén un registro de tus aventuras con un diario de viaje personalizado y comparte tus experiencias con amigos y familiares.", + "feature_2": "Planificación de Viajes", + "feature_2_desc": "Crea fácilmente itinerarios personalizados y obtén un desglose diario de tu viaje.", + "feature_3": "Mapa de Viaje", + "feature_3_desc": "Visualiza tus viajes por el mundo con un mapa interactivo y explora nuevos destinos." + }, + "adventures": { + "collection_remove_success": "¡Aventura eliminada de la colección con éxito!", + "collection_remove_error": "Error al eliminar la aventura de la colección", + "collection_link_success": "¡Aventura vinculada a la colección con éxito!", + "collection_link_error": "Error al vincular la aventura a la colección", + "adventure_delete_confirm": "¿Estás seguro de que quieres eliminar esta aventura? Esta acción no se puede deshacer.", + "open_details": "Abrir Detalles", + "edit_adventure": "Editar Aventura", + "remove_from_collection": "Eliminar de la Colección", + "add_to_collection": "Añadir a la Colección", + "delete": "Eliminar", + "activities": { + "activity": "Actividad 🏄", + "art_museums": "Arte", + "attraction": "Atracción 🎢", + "culture": "Cultura 🎭", + "dining": "Cenar 🍽️", + "event": "Evento 🎉", + "festivals": "Festivales 🎪", + "fitness": "Fitness 🏋️", + "general": "Generales 🌍", + "hiking": "Senderismo 🥾", + "historical_sites": "Sitios Históricos 🏛️", + "lodging": "Alojamiento 🛌", + "music_concerts": "Música", + "nightlife": "Vida nocturna 🌃", + "other": "Otro", + "outdoor": "Al aire libre 🏞️", + "shopping": "Compras 🛍️", + "spiritual_journeys": "Viajes espirituales 🧘‍♀️", + "transportation": "Transporte 🚗", + "volunteer_work": "Trabajo voluntario 🤝", + "water_sports": "Deportes acuáticos 🚤", + "wildlife": "Vida silvestre 🦒" + }, + "no_image_found": "No se encontró ninguna imagen", + "adventure_details": "Detalles de la aventura", + "adventure_type": "Tipo de aventura", + "collection": "Recopilación", + "homepage": "Página principal", + "latitude": "Latitud", + "longitude": "Longitud", + "not_found": "Aventura no encontrada", + "not_found_desc": "La aventura que buscabas no se pudo encontrar. \nPruebe una aventura diferente o vuelva a consultar más tarde.", + "visit": "Visita", + "visits": "Visitas", + "adventure": "Aventura", + "count_txt": "resultados que coinciden con su búsqueda", + "create_new": "Crear nuevo...", + "ascending": "Ascendente", + "collection_adventures": "Incluir aventuras de colección", + "date": "Fecha", + "descending": "Descendente", + "filter": "Filtrar", + "name": "Nombre", + "order_by": "Ordenar por", + "order_direction": "Dirección del pedido", + "rating": "Clasificación", + "sort": "Clasificar", + "sources": "Fuentes", + "updated": "Actualizado", + "category_filter": "Filtro de categoría", + "clear": "Claro", + "archived_collections": "Colecciones archivadas", + "close_filters": "Cerrar filtros", + "my_collections": "Mis colecciones", + "open_filters": "Abrir filtros", + "private": "Privado", + "public": "Público", + "archived_collection_message": "¡Colección archivada exitosamente!", + "delete_collection": "Eliminar colección", + "delete_collection_success": "¡Colección eliminada exitosamente!", + "delete_collection_warning": "¿Estás seguro de que deseas eliminar esta colección? \nEsto también eliminará todas las aventuras vinculadas. \nEsta acción no se puede deshacer.", + "unarchived_collection_message": "¡Colección desarchivada exitosamente!", + "archive": "Archivo", + "archived": "Archivado", + "edit_collection": "Editar colección", + "share": "Compartir", + "unarchive": "Desarchivar", + "cancel": "Cancelar", + "adventure_delete_success": "¡Aventura eliminada con éxito!", + "delete_adventure": "Eliminar aventura", + "planned": "Planificado", + "visited": "Visitado", + "dates": "Fechas", + "duration": "Duración", + "image_removed_error": "Error al eliminar la imagen", + "image_removed_success": "¡Imagen eliminada exitosamente!", + "image_upload_error": "Error al subir la imagen", + "image_upload_success": "¡Imagen cargada exitosamente!", + "no_image_url": "No se encontró ninguna imagen en esa URL.", + "start_before_end_error": "La fecha de inicio debe ser anterior a la fecha de finalización.", + "wiki_image_error": "Error al obtener la imagen de Wikipedia", + "actions": "Comportamiento", + "activity": "Actividad", + "see_adventures": "Ver Aventuras", + "activity_types": "Tipos de actividad", + "add": "Agregar", + "add_notes": "Agregar notas", + "adventure_create_error": "No se pudo crear la aventura", + "adventure_created": "Aventura creada", + "adventure_update_error": "No se pudo actualizar la aventura", + "adventure_updated": "Aventura actualizada", + "basic_information": "Información básica", + "category": "Categoría", + "clear_map": "Borrar mapa", + "copy_link": "Copiar enlace", + "date_constrain": "Restringir a las fechas de recolección", + "description": "Descripción", + "end_date": "Fecha de finalización", + "fetch_image": "Obtener imagen", + "generate_desc": "Generar descripción", + "image": "Imagen", + "image_fetch_failed": "No se pudo recuperar la imagen", + "link": "Enlace", + "location": "Ubicación", + "location_information": "Información de ubicación", + "my_images": "Mis imágenes", + "my_visits": "Mis visitas", + "new_adventure": "Nueva aventura", + "no_description_found": "No se encontró ninguna descripción", + "no_images": "Sin imágenes", + "no_location": "Por favor ingresa una ubicación", + "no_results": "No se encontraron resultados", + "no_start_date": "Por favor ingrese una fecha de inicio", + "public_adventure": "Aventura pública", + "remove": "Eliminar", + "save_next": "Ahorrar", + "search_for_location": "Buscar una ubicación", + "search_results": "Resultados de búsqueda", + "select_adventure_category": "Seleccionar categoría de aventura", + "share_adventure": "¡Comparte esta aventura!", + "start_date": "Fecha de inicio", + "upload_image": "Subir imagen", + "upload_images_here": "Sube imágenes aquí", + "url": "URL", + "warning": "Advertencia", + "wiki_desc": "Extrae un extracto de un artículo de Wikipedia que coincide con el nombre de la aventura.", + "wikipedia": "Wikipedia", + "add_an_activity": "Agregar una actividad", + "adventure_not_found": "No hay aventuras que mostrar. \n¡Agregue algunos usando el botón más en la parte inferior derecha o intente cambiar los filtros!", + "no_adventures_found": "No se encontraron aventuras", + "no_collections_found": "No se encontraron colecciones para agregar esta aventura.", + "my_adventures": "mis aventuras", + "no_linkable_adventures": "No se encontraron aventuras que puedan vincularse a esta colección.", + "mark_region_as_visited": "¿Marcar región {region}, {country} como visitada?", + "mark_visited": "Marcos visitó", + "not_visited": "No visitado", + "all": "Todo", + "error_updating_regions": "Error al actualizar regiones", + "regions_updated": "regiones actualizadas", + "update_visited_regions": "Actualizar regiones visitadas", + "update_visited_regions_disclaimer": "Esto puede llevar un tiempo dependiendo de la cantidad de aventuras que hayas visitado.", + "visited_region_check": "Verificación de región visitada", + "visited_region_check_desc": "Al seleccionar esto, el servidor verificará todas sus aventuras visitadas y marcará las regiones en las que se encuentran como visitadas en viajes mundiales." + }, + "worldtravel": { + "all": "Todo", + "all_subregions": "Todas las subregiones", + "clear_search": "Borrar búsqueda", + "completely_visited": "Completamente visitado", + "no_countries_found": "No se encontraron países", + "not_visited": "No visitado", + "num_countries": "países encontrados", + "partially_visited": "Parcialmente visitado", + "country_list": "Lista de países" + }, + "auth": { + "forgot_password": "¿Has olvidado tu contraseña?", + "login": "Acceso", + "login_error": "No se puede iniciar sesión con las credenciales proporcionadas.", + "password": "Contraseña", + "signup": "Inscribirse", + "username": "Nombre de usuario", + "confirm_password": "confirmar Contraseña", + "email": "Correo electrónico", + "first_name": "Nombre de pila", + "last_name": "Apellido", + "registration_disabled": "El registro está actualmente deshabilitado.", + "profile_picture": "Foto de perfil", + "public_profile": "Perfil público", + "public_tooltip": "Con un perfil público, los usuarios pueden compartir colecciones con usted y ver su perfil en la página de usuarios." + }, + "users": { + "no_users_found": "No se encontraron usuarios con perfiles públicos." + }, + "settings": { + "account_settings": "Configuración de cuenta de usuario", + "confirm_new_password": "Confirmar nueva contraseña", + "current_email": "Correo electrónico actual", + "email_change": "Cambiar correo electrónico", + "new_email": "Nuevo correo electrónico", + "new_password": "Nueva contraseña", + "no_email_set": "No hay correo electrónico configurado", + "password_change": "Cambiar la contraseña", + "settings_page": "Página de configuración", + "update": "Actualizar", + "update_error": "Error al actualizar la configuración", + "update_success": "¡La configuración se actualizó correctamente!", + "change_password": "Cambiar la contraseña", + "login_redir": "Luego será redirigido a la página de inicio de sesión.", + "missing_email": "Por favor ingrese una dirección de correo electrónico", + "possible_reset": "Si la dirección de correo electrónico que proporcionó está asociada con una cuenta, recibirá un correo electrónico con instrucciones para restablecer su contraseña.", + "reset_password": "Restablecer contraseña", + "token_required": "Se requieren token y UID para restablecer la contraseña.", + "password_does_not_match": "Las contraseñas no coinciden", + "password_is_required": "Se requiere contraseña", + "submit": "Entregar", + "invalid_token": "El token no es válido o ha caducado" + } } diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index 33dd9b59..f3cc7d05 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -149,7 +149,22 @@ "url": "URL", "warning": "Avertissement", "wiki_desc": "Extrait un extrait de l'article Wikipédia correspondant au nom de l'aventure.", - "wikipedia": "Wikipédia" + "wikipedia": "Wikipédia", + "adventure_not_found": "Il n'y a aucune aventure à afficher. \nAjoutez-en en utilisant le bouton plus en bas à droite ou essayez de changer les filtres !", + "all": "Tous", + "error_updating_regions": "Erreur lors de la mise à jour des régions", + "mark_region_as_visited": "Marquer la région {region}, {country} comme visitée ?", + "mark_visited": "Mark a 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é", + "regions_updated": "régions mises à jour", + "update_visited_regions": "Mettre à jour les régions visitées", + "update_visited_regions_disclaimer": "Cela peut prendre un certain temps en fonction du nombre d'aventures que vous avez visitées.", + "visited_region_check": "Vérification de la région visitée", + "visited_region_check_desc": "En sélectionnant cette option, le serveur vérifiera toutes vos aventures visitées et marquera les régions dans lesquelles elles se trouvent comme visitées lors des voyages dans le monde." }, "home": { "desc_1": "Découvrez, planifiez et explorez en toute simplicité", @@ -235,6 +250,16 @@ "settings_page": "Page Paramètres", "update": "Mise à jour", "update_error": "Erreur lors de la mise à jour des paramètres", - "update_success": "Paramètres mis à jour avec succès !" + "update_success": "Paramètres mis à jour avec succès !", + "change_password": "Changer le mot de passe", + "invalid_token": "Le jeton n'est pas valide ou a expiré", + "login_redir": "Vous serez alors redirigé vers la page de connexion.", + "missing_email": "Veuillez entrer une adresse e-mail", + "password_does_not_match": "Les mots de passe ne correspondent pas", + "password_is_required": "Le mot de passe est requis", + "possible_reset": "Si l'adresse e-mail que vous avez fournie est associée à un compte, vous recevrez un e-mail avec des instructions pour réinitialiser votre mot de passe !", + "reset_password": "Réinitialiser le mot de passe", + "submit": "Soumettre", + "token_required": "Le jeton et l'UID sont requis pour la réinitialisation du mot de passe." } } diff --git a/frontend/src/locales/it.json b/frontend/src/locales/it.json index 9cc9e6a3..5192a578 100644 --- a/frontend/src/locales/it.json +++ b/frontend/src/locales/it.json @@ -149,7 +149,22 @@ "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" + "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!", + "all": "Tutto", + "error_updating_regions": "Errore durante l'aggiornamento delle regioni", + "mark_region_as_visited": "Contrassegnare la regione {regione}, {paese} come visitata?", + "mark_visited": "Marco ha visitato", + "my_adventures": "Le mie avventure", + "no_adventures_found": "Nessuna avventura trovata", + "no_collections_found": "Nessuna raccolta trovata a cui aggiungere questa avventura.", + "no_linkable_adventures": "Non è stata trovata alcuna avventura che possa essere collegata a questa raccolta.", + "not_visited": "Non visitato", + "regions_updated": "regioni aggiornate", + "update_visited_regions": "Aggiorna le regioni visitate", + "update_visited_regions_disclaimer": "L'operazione potrebbe richiedere del tempo a seconda del numero di avventure che hai visitato.", + "visited_region_check": "Controllo della regione visitata", + "visited_region_check_desc": "Selezionando questa opzione, il server controllerà tutte le avventure che hai visitato e contrassegnerà le regioni in cui si trovano come visitate nei viaggi per il mondo." }, "home": { "desc_1": "Scopri, pianifica ed esplora con facilità", @@ -235,6 +250,16 @@ "settings_page": "Pagina Impostazioni", "update": "Aggiornamento", "update_error": "Errore durante l'aggiornamento delle impostazioni", - "update_success": "Impostazioni aggiornate con successo!" + "update_success": "Impostazioni aggiornate con successo!", + "change_password": "Cambiare la password", + "invalid_token": "Il token non è valido o è scaduto", + "login_redir": "Verrai quindi reindirizzato alla pagina di accesso.", + "missing_email": "Inserisci un indirizzo email", + "password_does_not_match": "Le password non corrispondono", + "password_is_required": "È richiesta la password", + "possible_reset": "Se l'indirizzo email che hai fornito è associato a un account, riceverai un'email con le istruzioni per reimpostare la password!", + "reset_password": "Reimposta password", + "submit": "Invia", + "token_required": "Token e UID sono necessari per la reimpostazione della password." } } diff --git a/frontend/src/locales/nl.json b/frontend/src/locales/nl.json index 2a18f016..5871f8c6 100644 --- a/frontend/src/locales/nl.json +++ b/frontend/src/locales/nl.json @@ -149,7 +149,21 @@ "url": "URL", "warning": "Waarschuwing", "wiki_desc": "Haalt een fragment uit een Wikipedia-artikel dat overeenkomt met de naam van het avontuur.", - "wikipedia": "Wikipedia" + "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", + "error_updating_regions": "Fout bij updaten van regio's", + "mark_visited": "Mark 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", + "update_visited_regions": "Update bezochte regio's", + "update_visited_regions_disclaimer": "Dit kan even duren, afhankelijk van het aantal avonturen dat je hebt bezocht.", + "visited_region_check": "Regiocheck bezocht", + "visited_region_check_desc": "Door dit te selecteren, controleert de server al uw bezochte avonturen en markeert de regio's waarin ze zich bevinden als bezocht in de wereldreizen." }, "home": { "desc_1": "Ontdek, plan en verken met gemak", @@ -235,6 +249,16 @@ "settings_page": "Instellingenpagina", "update": "Update", "update_error": "Fout bij updaten van instellingen", - "update_success": "Instellingen succesvol bijgewerkt!" + "update_success": "Instellingen succesvol bijgewerkt!", + "change_password": "Wachtwoord wijzigen", + "invalid_token": "Token is ongeldig of verlopen", + "login_redir": "Vervolgens wordt u doorgestuurd naar de inlogpagina.", + "missing_email": "Voer een e-mailadres in", + "password_does_not_match": "Wachtwoorden komen niet overeen", + "password_is_required": "Wachtwoord is vereist", + "possible_reset": "Als het door u opgegeven e-mailadres aan een account is gekoppeld, ontvangt u een e-mail met instructies om uw wachtwoord opnieuw in te stellen!", + "reset_password": "Wachtwoord opnieuw instellen", + "submit": "Indienen", + "token_required": "Token en UID zijn vereist voor het opnieuw instellen van het wachtwoord." } } diff --git a/frontend/src/locales/sv.json b/frontend/src/locales/sv.json index f3fd1e9a..eabc4a55 100644 --- a/frontend/src/locales/sv.json +++ b/frontend/src/locales/sv.json @@ -148,7 +148,23 @@ "upload_images_here": "Ladda upp bilder här", "url": "URL", "warning": "Varning", - "wiki_desc": "Hämtar utdrag från Wikipedia-artikeln som matchar äventyrets namn." + "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_region_as_visited": "Markera region {region}, {country} som besökt?", + "mark_visited": "Mark besökte", + "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ökt", + "regions_updated": "regioner uppdaterade", + "update_visited_regions": "Uppdatera besökta regioner", + "update_visited_regions_disclaimer": "Detta kan ta ett tag beroende på antalet äventyr du har besökt.", + "visited_region_check": "Besökte Region Check", + "visited_region_check_desc": "Genom att välja detta kommer servern att kontrollera alla dina besökta äventyr och markera de regioner de befinner sig i som besökta i världsresor.", + "wikipedia": "Wikipedia" }, "home": { "desc_1": "Upptäck, planera och utforska med lätthet", @@ -215,7 +231,9 @@ "registration_disabled": "Registreringen är för närvarande inaktiverad.", "signup": "Registrera dig", "username": "Användarnamn", - "public_tooltip": "Med en offentlig profil kan användare dela samlingar med dig och se din profil på användarsidan." + "public_tooltip": "Med en offentlig profil kan användare dela samlingar med dig och se din profil på användarsidan.", + "profile_picture": "Profilbild", + "public_profile": "Offentlig profil" }, "users": { "no_users_found": "Inga användare hittades med offentliga profiler." @@ -232,6 +250,16 @@ "settings_page": "Inställningssida", "update": "Uppdatera", "update_error": "Fel vid uppdatering av inställningar", - "update_success": "Inställningarna har uppdaterats!" + "update_success": "Inställningarna har uppdaterats!", + "change_password": "Ändra lösenord", + "invalid_token": "Token är ogiltig eller har gått ut", + "login_redir": "Du kommer då att omdirigeras till inloggningssidan.", + "missing_email": "Vänligen ange en e-postadress", + "password_does_not_match": "Lösenord stämmer inte överens", + "password_is_required": "Lösenord krävs", + "possible_reset": "Om e-postadressen du angav är kopplad till ett konto kommer du att få ett e-postmeddelande med instruktioner för att återställa ditt lösenord!", + "reset_password": "Återställ lösenord", + "submit": "Överlämna", + "token_required": "Token och UID krävs för lösenordsåterställning." } } diff --git a/frontend/src/locales/zh.json b/frontend/src/locales/zh.json index c5685c9e..1db13e69 100644 --- a/frontend/src/locales/zh.json +++ b/frontend/src/locales/zh.json @@ -149,7 +149,22 @@ "url": "网址", "warning": "警告", "wiki_desc": "从维基百科文章中提取与冒险名称匹配的摘录。", - "wikipedia": "维基百科" + "wikipedia": "维基百科", + "adventure_not_found": "没有任何冒险可以展示。\n使用右下角的加号按钮添加一些或尝试更改过滤器!", + "all": "全部", + "error_updating_regions": "更新区域时出错", + "mark_region_as_visited": "将地区 {region}、{country} 标记为已访问?", + "mark_visited": "马克访问过", + "my_adventures": "我的冒险", + "no_adventures_found": "没有发现冒险", + "no_collections_found": "未找到可添加此冒险的集合。", + "no_linkable_adventures": "没有发现任何冒险可以链接到这个集合。", + "not_visited": "未访问过", + "regions_updated": "地区已更新", + "update_visited_regions": "更新访问过的地区", + "update_visited_regions_disclaimer": "这可能需要一段时间,具体取决于您访问过的冒险活动的数量。", + "visited_region_check": "访问地区检查", + "visited_region_check_desc": "通过选择此选项,服务器将检查您访问过的所有冒险活动,并将它们所在的区域标记为在世界旅行中访问过的区域。" }, "home": { "desc_1": "轻松发现、规划和探索", @@ -235,6 +250,16 @@ "settings_page": "设置页面", "update": "更新", "update_error": "更新设置时出错", - "update_success": "设置更新成功!" + "update_success": "设置更新成功!", + "change_password": "更改密码", + "invalid_token": "令牌无效或已过期", + "login_redir": "然后您将被重定向到登录页面。", + "missing_email": "请输入电子邮件地址", + "password_does_not_match": "密码不匹配", + "password_is_required": "需要密码", + "possible_reset": "如果您提供的电子邮件地址与帐户关联,您将收到一封电子邮件,其中包含重置密码的说明!", + "reset_password": "重置密码", + "submit": "提交", + "token_required": "重置密码需要令牌和 UID。" } } diff --git a/frontend/src/routes/settings/forgot-password/+page.server.ts b/frontend/src/routes/settings/forgot-password/+page.server.ts index 86dd7877..82fc3043 100644 --- a/frontend/src/routes/settings/forgot-password/+page.server.ts +++ b/frontend/src/routes/settings/forgot-password/+page.server.ts @@ -10,7 +10,7 @@ export const actions: Actions = { const email = formData.get('email') as string | null | undefined; if (!email) { - return fail(400, { message: 'Email is required' }); + return fail(400, { message: 'missing_email' }); } let res = await fetch(`${endpoint}/auth/password/reset/`, { diff --git a/frontend/src/routes/settings/forgot-password/+page.svelte b/frontend/src/routes/settings/forgot-password/+page.svelte index b9f27d03..873e7785 100644 --- a/frontend/src/routes/settings/forgot-password/+page.svelte +++ b/frontend/src/routes/settings/forgot-password/+page.svelte @@ -1,29 +1,29 @@ -

Reset Password

+

{$t('settings.reset_password')}

- +
- + {#if $page.form?.message}
- {$page.form?.message} + {$t(`settings.${$page.form?.message}`)}
{/if} {#if $page.form?.success}
- If the email address you provided is associated with an account, you will receive an email - with instructions to reset your password! + {$t('settings.possible_reset')}
{/if}
diff --git a/frontend/src/routes/settings/forgot-password/confirm/+page.server.ts b/frontend/src/routes/settings/forgot-password/confirm/+page.server.ts index 31fad8c4..9aeca230 100644 --- a/frontend/src/routes/settings/forgot-password/confirm/+page.server.ts +++ b/frontend/src/routes/settings/forgot-password/confirm/+page.server.ts @@ -25,11 +25,11 @@ export const actions: Actions = { const uid = formData.get('uid') as string; if (!new_password1 || !new_password2) { - return fail(400, { message: 'Password is required' }); + return fail(400, { message: 'settings.password_is_required' }); } if (new_password1 !== new_password2) { - return fail(400, { message: 'Passwords do not match' }); + return fail(400, { message: 'settings.password_does_not_match' }); } if (!token || !uid) { @@ -48,9 +48,7 @@ export const actions: Actions = { }) }); if (!response.ok) { - let responseJson = await response.json(); - const key = Object.keys(responseJson)[0]; - return fail(response.status, { message: responseJson[key] }); + return fail(response.status, { message: 'settings.invalid_token' }); } else { return redirect(302, '/login'); } diff --git a/frontend/src/routes/settings/forgot-password/confirm/+page.svelte b/frontend/src/routes/settings/forgot-password/confirm/+page.svelte index 5a9055c2..06bc156f 100644 --- a/frontend/src/routes/settings/forgot-password/confirm/+page.svelte +++ b/frontend/src/routes/settings/forgot-password/confirm/+page.svelte @@ -3,14 +3,15 @@ import { goto } from '$app/navigation'; import { page } from '$app/stores'; import type { PageData } from './$types'; + import { t } from 'svelte-i18n'; export let data: PageData; -

Change Password

+

{$t('settings.change_password')}

{#if data.props.token && data.props.uid} -

You will then be redirected to the login page.

+

{$t('settings.login_redir')}

@@ -34,13 +35,13 @@ class="input input-bordered w-full" id="new_password2" name="new_password2" - placeholder="Confirm Password" + placeholder={$t('settings.confirm_new_password')} />
- + {#if $page.form?.message}
- {$page.form?.message} + {$t($page.form?.message)}
{/if} @@ -48,10 +49,10 @@ {:else}
-

Token and UID are required for password reset.

+

{$t('settings.token_required')}

From 3df124b250cb3b764321b6021e37468976b498eb Mon Sep 17 00:00:00 2001 From: Sean Morley Date: Sun, 3 Nov 2024 22:55:38 -0500 Subject: [PATCH 37/65] Add i18n support for transportation, notes, checklist, and collection components --- .../src/lib/components/ChecklistCard.svelte | 17 ++-- .../src/lib/components/ChecklistModal.svelte | 36 ++++---- .../src/lib/components/EditCollection.svelte | 44 +++++---- .../lib/components/EditTransportation.svelte | 70 ++++++++------ .../src/lib/components/NewCollection.svelte | 36 +++++--- .../lib/components/NewTransportation.svelte | 92 +++++++++---------- frontend/src/lib/components/NoteCard.svelte | 15 +-- frontend/src/lib/components/NoteModal.svelte | 41 +++++---- .../lib/components/TransportationCard.svelte | 8 +- frontend/src/locales/en.json | 86 ++++++++++++++++- .../src/routes/collections/[id]/+page.svelte | 73 ++++++--------- 11 files changed, 305 insertions(+), 213 deletions(-) diff --git a/frontend/src/lib/components/ChecklistCard.svelte b/frontend/src/lib/components/ChecklistCard.svelte index 1cdd979f..40741d18 100644 --- a/frontend/src/lib/components/ChecklistCard.svelte +++ b/frontend/src/lib/components/ChecklistCard.svelte @@ -3,6 +3,7 @@ import type { Checklist, Collection, User } from '$lib/types'; import { createEventDispatcher } from 'svelte'; const dispatch = createEventDispatcher(); + import { t } from 'svelte-i18n'; import Launch from '~icons/mdi/launch'; import TrashCan from '~icons/mdi/trash-can'; @@ -21,10 +22,10 @@ method: 'DELETE' }); if (res.ok) { - addToast('success', 'Checklist deleted successfully'); + addToast('success', $t('checklist.checklist_deleted')); dispatch('delete', checklist.id); } else { - addToast('Failed to delete checklist', 'error'); + addToast($t('checklist.checklist_delete_error'), 'error'); } } @@ -38,9 +39,12 @@ {checklist.name}
-
Checklist
+
{$t('adventures.checklist')}
{#if checklist.items.length > 0} -

{checklist.items.length} {checklist.items.length > 1 ? 'Items' : 'Item'}

+

+ {checklist.items.length} + {checklist.items.length > 1 ? $t('checklist.items') : $t('checklist.item')} +

{/if} {#if checklist.date && checklist.date !== ''}
@@ -49,11 +53,8 @@
{/if}
- {#if checklist.user_id == user?.pk || (collection && user && collection.shared_with.includes(user.uuid))}
{#if items.length > 0}
-

Items

+

{$t('checklist.items')}

{/if} {#each items as item, i} @@ -202,7 +202,7 @@ class="btn btn-sm btn-error absolute right-0 mt-2.5 mr-4" on:click={() => removeItem(i)} > - Remove + {$t('adventures.remove')}
{/each} @@ -226,8 +226,8 @@
{/if} - - + + {#if collection.is_public} {/if} {:else}
- +
- + 0}
-

Items

+

{$t('checklist.items')}

{/if} {#each items as item, i} @@ -299,7 +299,7 @@
{/each} - +
{/if} diff --git a/frontend/src/lib/components/EditCollection.svelte b/frontend/src/lib/components/EditCollection.svelte index e46d251d..6c96bc8c 100644 --- a/frontend/src/lib/components/EditCollection.svelte +++ b/frontend/src/lib/components/EditCollection.svelte @@ -1,7 +1,8 @@ @@ -96,7 +97,7 @@