From 87b3b406a63dbf6d7b11a6e0663c3c29dea43936 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 24 Nov 2025 01:37:22 +0000 Subject: [PATCH 1/9] Initial plan From df2179b9d960648089a3f6b2f4caa96b558884fc Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 24 Nov 2025 01:45:29 +0000 Subject: [PATCH 2/9] Setup inlang paraglide with local plugins Co-authored-by: mufarodev <81554673+mufarodev@users.noreply.github.com> --- Cartesian.Frontend/package.json | 2 ++ Cartesian.Frontend/pnpm-lock.yaml | 29 +++++++++++++++++++ .../project.inlang/settings.json | 4 +-- Cartesian.Frontend/src/lib/paraglide | 1 + 4 files changed, 34 insertions(+), 2 deletions(-) create mode 120000 Cartesian.Frontend/src/lib/paraglide diff --git a/Cartesian.Frontend/package.json b/Cartesian.Frontend/package.json index c127644..bfd90b4 100644 --- a/Cartesian.Frontend/package.json +++ b/Cartesian.Frontend/package.json @@ -19,6 +19,8 @@ "devDependencies": { "@inlang/cli": "^3.0.0", "@inlang/paraglide-js": "2.4.0", + "@inlang/plugin-m-function-matcher": "^2.1.0", + "@inlang/plugin-message-format": "^4.0.0", "@internationalized/date": "^3.10.0", "@lucide/svelte": "^0.544.0", "@material/material-color-utilities": "^0.3.0", diff --git a/Cartesian.Frontend/pnpm-lock.yaml b/Cartesian.Frontend/pnpm-lock.yaml index 5a154e3..6973db0 100644 --- a/Cartesian.Frontend/pnpm-lock.yaml +++ b/Cartesian.Frontend/pnpm-lock.yaml @@ -51,6 +51,12 @@ importers: '@inlang/paraglide-js': specifier: 2.4.0 version: 2.4.0 + '@inlang/plugin-m-function-matcher': + specifier: ^2.1.0 + version: 2.1.0 + '@inlang/plugin-message-format': + specifier: ^4.0.0 + version: 4.0.0 '@internationalized/date': specifier: ^3.10.0 version: 3.10.0 @@ -402,6 +408,12 @@ packages: resolution: {integrity: sha512-T/m9uoev574/1JrhCnPcgK1xnAwkVMgaDev4LFthnmID8ubX2xjboSGO3IztwXWwO0aJoT1UJr89JCwjbwgnJQ==} hasBin: true + '@inlang/plugin-m-function-matcher@2.1.0': + resolution: {integrity: sha512-IAbG7rOl+rlTiZY7qj92we6lmII693lVthPtY9bFDkZ/Ig7FPSpae/TfLzqjf2KcR1nDdx1zRpSo6roDPeM85g==} + + '@inlang/plugin-message-format@4.0.0': + resolution: {integrity: sha512-zNpLxLTt+bDd3JLXj1ONzo+Q6AOzz2MfcgGo8XB6/bweGhFIndK3GU/q0iU4o7VI4KS1+OHNLpKwFcrAifwERQ==} + '@inlang/recommend-sherlock@0.2.1': resolution: {integrity: sha512-ckv8HvHy/iTqaVAEKrr+gnl+p3XFNwe5D2+6w6wJk2ORV2XkcRkKOJ/XsTUJbPSiyi4PI+p+T3bqbmNx/rDUlg==} @@ -1491,6 +1503,11 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} + flat@6.0.1: + resolution: {integrity: sha512-/3FfIa8mbrg3xE7+wAhWeV+bd7L2Mof+xtZb5dRDKZ+wDvYJK4WDYeIOuOhre5Yv5aQObZrlbRmk3RTSiuQBtw==} + engines: {node: '>=18'} + hasBin: true + for-each@0.3.5: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} @@ -3075,6 +3092,16 @@ snapshots: transitivePeerDependencies: - babel-plugin-macros + '@inlang/plugin-m-function-matcher@2.1.0': + dependencies: + '@inlang/sdk': 2.4.9 + transitivePeerDependencies: + - babel-plugin-macros + + '@inlang/plugin-message-format@4.0.0': + dependencies: + flat: 6.0.1 + '@inlang/recommend-sherlock@0.2.1': dependencies: comment-json: 4.4.1 @@ -4328,6 +4355,8 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 + flat@6.0.1: {} + for-each@0.3.5: dependencies: is-callable: 1.2.7 diff --git a/Cartesian.Frontend/project.inlang/settings.json b/Cartesian.Frontend/project.inlang/settings.json index ac2acf1..0d7cc4a 100644 --- a/Cartesian.Frontend/project.inlang/settings.json +++ b/Cartesian.Frontend/project.inlang/settings.json @@ -6,8 +6,8 @@ "pl" ], "modules": [ - "https://cdn.jsdelivr.net/npm/@inlang/plugin-message-format@4/dist/index.js", - "https://cdn.jsdelivr.net/npm/@inlang/plugin-m-function-matcher@2/dist/index.js" + "./node_modules/@inlang/plugin-message-format/dist/index.js", + "./node_modules/@inlang/plugin-m-function-matcher/dist/index.js" ], "plugin.inlang.messageFormat": { "pathPattern": "./messages/{locale}.json" diff --git a/Cartesian.Frontend/src/lib/paraglide b/Cartesian.Frontend/src/lib/paraglide new file mode 120000 index 0000000..c4820f8 --- /dev/null +++ b/Cartesian.Frontend/src/lib/paraglide @@ -0,0 +1 @@ +../paraglide \ No newline at end of file From e488e969f745f6703a04a87ffdb2b213bdbc29a2 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 24 Nov 2025 01:58:23 +0000 Subject: [PATCH 3/9] Add all translation strings and update frontend components to use translations Co-authored-by: mufarodev <81554673+mufarodev@users.noreply.github.com> --- Cartesian.Frontend/messages/en.json | 94 ++++++++++++++++++- Cartesian.Frontend/messages/pl.json | 94 ++++++++++++++++++- .../map/event-details-content.svelte | 8 +- .../lib/components/map/events-dialog.svelte | 37 ++++---- .../lib/components/map/map-point-cta.svelte | 3 +- .../components/map/new-event-overlay.svelte | 56 +++++------ .../lib/components/map/profile-dialog.svelte | 13 +-- .../src/lib/components/map/user-menu.svelte | 5 +- .../src/routes/(auth)/login/+page.svelte | 15 +-- .../src/routes/(auth)/register/+page.svelte | 19 ++-- 10 files changed, 267 insertions(+), 77 deletions(-) diff --git a/Cartesian.Frontend/messages/en.json b/Cartesian.Frontend/messages/en.json index d53ce47..362a6e1 100644 --- a/Cartesian.Frontend/messages/en.json +++ b/Cartesian.Frontend/messages/en.json @@ -37,5 +37,97 @@ "tag_religious": "Religious", "tag_study": "Study", "tag_market": "Market", - "tag_political": "Political" + "tag_political": "Political", + "common_close": "Close", + "common_cancel": "Cancel", + "common_discard": "Discard", + "common_save": "Save", + "common_delete": "Delete", + "common_add": "Add", + "common_edit": "Edit", + "common_search": "Search", + "common_searching": "Searching...", + "common_loading": "Loading...", + "event_new_title": "New Event", + "event_new_subtitle": "Create a public gathering", + "event_details_section": "Details", + "event_title_label": "Event Title", + "event_title_placeholder": "What are you planning?", + "event_description_placeholder": "Add details about your event...", + "event_images_label": "Images", + "event_location_section": "Location", + "event_location_required": "Location required", + "event_location_placeholder": "Search location...", + "event_location_searching": "Searching locations...", + "event_location_unknown": "Unknown location", + "event_schedule_section": "Schedule", + "event_schedule_simple": "Simple", + "event_schedule_advanced": "Advanced", + "event_start_time_placeholder": "Pick start time", + "event_end_time_placeholder": "Pick end time", + "event_window_title_placeholder": "Session Title", + "event_window_description_placeholder": "Optional description", + "event_window_default_title": "Event Window 1", + "event_add_window": "Add time window", + "event_categories_section": "Categories", + "event_categories_placeholder": "Filter categories...", + "event_publish": "Publish Event", + "event_publishing": "Publishing...", + "event_share": "Share event", + "event_participate": "Participate in event", + "event_dont_participate": "Don't participate", + "event_favorite": "Favorite", + "event_unfavorite": "Unfavorite", + "event_add_here": "Add event here", + "events_dialog_title": "Events", + "events_dialog_subtitle": "Manage your events and schedule", + "events_search_placeholder": "Search events...", + "events_tab_favorited": "Favorited", + "events_tab_created": "Created", + "events_tab_attending": "Attending", + "events_no_favorited": "No favorited events", + "events_no_created": "No created events", + "events_no_attending": "No attending events", + "events_no_search_results": "No events match your search query", + "events_favorited_empty": "Events you favorite will appear here", + "events_created_empty": "Events you create will appear here", + "events_attending_empty": "Events you attend will appear here", + "dialog_discard_title": "Discard changes?", + "dialog_discard_description": "Are you sure you want to discard your changes? This action cannot be undone.", + "dialog_discard_keep": "Keep Editing", + "dialog_account_required_title": "Account Required", + "profile_display_name_placeholder": "Your display name", + "auth_sign_in_title": "Sign in", + "auth_sign_in_subtitle": "Enter your credentials to continue", + "auth_sign_in_button": "Sign in", + "auth_signing_in": "Signing in...", + "auth_sign_up_title": "Create an account", + "auth_sign_up_subtitle": "Enter your details to get started", + "auth_sign_up_button": "Create account", + "auth_creating_account": "Creating account...", + "auth_no_account": "Don't have an account?", + "auth_have_account": "Already have an account?", + "auth_sign_up_link": "Sign up", + "auth_sign_in_link": "Sign in", + "form_label_email": "Email", + "form_label_password": "Password", + "form_label_username": "Username", + "form_label_confirm_password": "Confirm Password", + "toast_link_copied": "Link copied to clipboard", + "toast_event_published": "Event published successfully", + "toast_profile_updated": "Profile updated successfully", + "toast_profile_update_failed": "Failed to update profile", + "toast_passwords_dont_match": "Passwords do not match", + "toast_password_update_not_implemented": "Password update not implemented yet", + "toast_image_too_large": "Image must be smaller than 5MB", + "geolocate_aria_label": "Recenter map on my location", + "color_picker_placeholder": "#009FE7", + "date_picker_placeholder": "Pick a date", + "sidebar_toggle": "Toggle Sidebar", + "sidebar_title": "Sidebar", + "sidebar_description": "Displays the mobile sidebar.", + "user_menu_sign_in": "Sign in", + "user_menu_sign_up": "Sign up", + "landing_system_status": "System: Online", + "landing_location_status": "Loc: Global" } diff --git a/Cartesian.Frontend/messages/pl.json b/Cartesian.Frontend/messages/pl.json index b5fbf96..440e75b 100644 --- a/Cartesian.Frontend/messages/pl.json +++ b/Cartesian.Frontend/messages/pl.json @@ -37,5 +37,97 @@ "tag_religious": "Religia", "tag_study": "Nauka", "tag_market": "Targ", - "tag_political": "Polityka" + "tag_political": "Polityka", + "common_close": "Zamknij", + "common_cancel": "Anuluj", + "common_discard": "Odrzuć", + "common_save": "Zapisz", + "common_delete": "Usuń", + "common_add": "Dodaj", + "common_edit": "Edytuj", + "common_search": "Szukaj", + "common_searching": "Wyszukiwanie...", + "common_loading": "Ładowanie...", + "event_new_title": "Nowe wydarzenie", + "event_new_subtitle": "Utwórz publiczne spotkanie", + "event_details_section": "Szczegóły", + "event_title_label": "Tytuł wydarzenia", + "event_title_placeholder": "Co planujesz?", + "event_description_placeholder": "Dodaj szczegóły swojego wydarzenia...", + "event_images_label": "Obrazy", + "event_location_section": "Lokalizacja", + "event_location_required": "Lokalizacja wymagana", + "event_location_placeholder": "Wyszukaj lokalizację...", + "event_location_searching": "Wyszukiwanie lokalizacji...", + "event_location_unknown": "Nieznana lokalizacja", + "event_schedule_section": "Harmonogram", + "event_schedule_simple": "Prosty", + "event_schedule_advanced": "Zaawansowany", + "event_start_time_placeholder": "Wybierz czas rozpoczęcia", + "event_end_time_placeholder": "Wybierz czas zakończenia", + "event_window_title_placeholder": "Tytuł sesji", + "event_window_description_placeholder": "Opcjonalny opis", + "event_window_default_title": "Okno wydarzenia 1", + "event_add_window": "Dodaj okno czasowe", + "event_categories_section": "Kategorie", + "event_categories_placeholder": "Filtruj kategorie...", + "event_publish": "Opublikuj wydarzenie", + "event_publishing": "Publikowanie...", + "event_share": "Udostępnij wydarzenie", + "event_participate": "Weź udział w wydarzeniu", + "event_dont_participate": "Nie bierz udziału", + "event_favorite": "Ulubione", + "event_unfavorite": "Usuń z ulubionych", + "event_add_here": "Dodaj wydarzenie tutaj", + "events_dialog_title": "Wydarzenia", + "events_dialog_subtitle": "Zarządzaj swoimi wydarzeniami i harmonogramem", + "events_search_placeholder": "Wyszukaj wydarzenia...", + "events_tab_favorited": "Ulubione", + "events_tab_created": "Utworzone", + "events_tab_attending": "Uczestniczę", + "events_no_favorited": "Brak ulubionych wydarzeń", + "events_no_created": "Brak utworzonych wydarzeń", + "events_no_attending": "Brak wydarzeń, w których uczestniczysz", + "events_no_search_results": "Żadne wydarzenie nie pasuje do zapytania wyszukiwania", + "events_favorited_empty": "Wydarzenia, które polubisz, pojawią się tutaj", + "events_created_empty": "Wydarzenia, które utworzysz, pojawią się tutaj", + "events_attending_empty": "Wydarzenia, w których uczestniczysz, pojawią się tutaj", + "dialog_discard_title": "Odrzucić zmiany?", + "dialog_discard_description": "Czy na pewno chcesz odrzucić swoje zmiany? Tej czynności nie można cofnąć.", + "dialog_discard_keep": "Kontynuuj edycję", + "dialog_account_required_title": "Wymagane konto", + "profile_display_name_placeholder": "Twoja nazwa wyświetlana", + "auth_sign_in_title": "Zaloguj się", + "auth_sign_in_subtitle": "Wprowadź swoje dane, aby kontynuować", + "auth_sign_in_button": "Zaloguj się", + "auth_signing_in": "Logowanie...", + "auth_sign_up_title": "Utwórz konto", + "auth_sign_up_subtitle": "Wprowadź swoje dane, aby rozpocząć", + "auth_sign_up_button": "Utwórz konto", + "auth_creating_account": "Tworzenie konta...", + "auth_no_account": "Nie masz konta?", + "auth_have_account": "Masz już konto?", + "auth_sign_up_link": "Zarejestruj się", + "auth_sign_in_link": "Zaloguj się", + "form_label_email": "Email", + "form_label_password": "Hasło", + "form_label_username": "Nazwa użytkownika", + "form_label_confirm_password": "Potwierdź hasło", + "toast_link_copied": "Link skopiowany do schowka", + "toast_event_published": "Wydarzenie opublikowane pomyślnie", + "toast_profile_updated": "Profil zaktualizowany pomyślnie", + "toast_profile_update_failed": "Nie udało się zaktualizować profilu", + "toast_passwords_dont_match": "Hasła nie pasują", + "toast_password_update_not_implemented": "Aktualizacja hasła nie została jeszcze zaimplementowana", + "toast_image_too_large": "Obraz musi być mniejszy niż 5MB", + "geolocate_aria_label": "Wyśrodkuj mapę na moją lokalizację", + "color_picker_placeholder": "#009FE7", + "date_picker_placeholder": "Wybierz datę", + "sidebar_toggle": "Przełącz pasek boczny", + "sidebar_title": "Pasek boczny", + "sidebar_description": "Wyświetla mobilny pasek boczny.", + "user_menu_sign_in": "Zaloguj się", + "user_menu_sign_up": "Zarejestruj się", + "landing_system_status": "System: Online", + "landing_location_status": "Lok: Global" } diff --git a/Cartesian.Frontend/src/lib/components/map/event-details-content.svelte b/Cartesian.Frontend/src/lib/components/map/event-details-content.svelte index 79732fc..53d5e96 100644 --- a/Cartesian.Frontend/src/lib/components/map/event-details-content.svelte +++ b/Cartesian.Frontend/src/lib/components/map/event-details-content.svelte @@ -69,7 +69,7 @@ const url = new URL($page.url); url.searchParams.set("event", event.eventId.toString()); navigator.clipboard.writeText(url.toString()); - toast.success("Link copied to clipboard"); + toast.success(m.toast_link_copied()); } const favoriteQuery = createGetEventApiEventIdFavorite(event.eventId); @@ -166,17 +166,17 @@ onclick={toggleParticipation} disabled={participateMutation.isPending || unparticipateMutation.isPending} > - {isParticipating ? "Don't participate" : "Participate in event"} + {isParticipating ? m.event_dont_participate() : m.event_participate()} - @@ -450,18 +450,18 @@
{#snippet children({ props })} - Event Title + {m.event_title_label()}
@@ -478,7 +478,7 @@