From 6f7ee806ae9876430a75feaddbbf03f8a253f156 Mon Sep 17 00:00:00 2001 From: HolgerHatGarKeineNode Date: Sun, 23 Nov 2025 20:45:29 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=8C=90=20Introduce=20dynamic=20domain-bas?= =?UTF-8?q?ed=20locale=20and=20country=20handling?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Added `DomainMiddleware` to dynamically set locale, language-country session, and app name based on domain. - Updated views and components to leverage `lang_country` session for language and region-specific content. - Enhanced country parameter retrieval with `config('app.domain_country')` as fallback. - Refined language filtering by scanning available language files dynamically. - Added language-specific assets and translations (`nl.json`, `es.json`) with improved language-region associations. - Updated `app-logo-icon` to display region-specific images or default SVGs. - Improved views with cleaner, dynamic rendering and session-aware functionalities. --- app/Http/Middleware/DomainMiddleware.php | 39 ++ bootstrap/app.php | 1 + config/app.php | 2 + lang/de.json | 19 +- lang/en.json | 19 +- lang/es.json | 19 +- lang/nl.json | 380 ++++++++++++++++++ lang/pt.json | 378 +++++++++++++++++ public/img/domains/lat.png | Bin 0 -> 5321 bytes public/img/domains/nl-NL.jpg | Bin 0 -> 13942 bytes .../views/components/app-logo-icon.blade.php | 55 ++- .../einundzwanzig/language-selector.blade.php | 16 +- .../livewire/auth/confirm-password.blade.php | 2 +- resources/views/livewire/auth/login.blade.php | 16 +- .../views/livewire/auth/register.blade.php | 2 +- .../livewire/auth/verify-email.blade.php | 2 +- .../views/livewire/cities/index.blade.php | 2 +- .../views/livewire/country/chooser.blade.php | 2 +- .../courses/create-edit-events.blade.php | 2 +- .../views/livewire/courses/index.blade.php | 2 +- .../livewire/courses/landingpage.blade.php | 2 +- resources/views/livewire/dashboard.blade.php | 2 +- .../views/livewire/lecturers/index.blade.php | 2 +- .../meetups/create-edit-events.blade.php | 2 +- .../views/livewire/meetups/index.blade.php | 2 +- .../meetups/landingpage-event.blade.php | 2 +- .../livewire/meetups/landingpage.blade.php | 2 +- .../views/livewire/meetups/map.blade.php | 2 +- .../views/livewire/settings/profile.blade.php | 15 +- .../views/livewire/venues/index.blade.php | 2 +- resources/views/livewire/welcome.blade.php | 6 +- routes/web.php | 7 +- 32 files changed, 962 insertions(+), 42 deletions(-) create mode 100644 app/Http/Middleware/DomainMiddleware.php create mode 100644 lang/nl.json create mode 100644 lang/pt.json create mode 100644 public/img/domains/lat.png create mode 100644 public/img/domains/nl-NL.jpg diff --git a/app/Http/Middleware/DomainMiddleware.php b/app/Http/Middleware/DomainMiddleware.php new file mode 100644 index 0000000..8ecf518 --- /dev/null +++ b/app/Http/Middleware/DomainMiddleware.php @@ -0,0 +1,39 @@ +getHost(); // Erkennt die aktuelle Domain (via CNAME) + + // domains + $domainArray = [ + 'portal.eenentwintig.net' => [ + 'locale' => 'nl', + 'lang_country' => 'nl-NL', + 'app_name' => 'EENENTWINTIG Portaal', + ], + ]; + + // App-Locale dynamisch setzen + if (isset($domainArray[$domain]['locale'])) { + session([ + 'lang_country' => $domainArray[$domain]['lang_country'], + ]); + config([ + 'app.name' => $domainArray[$domain]['app_name'], + 'app.domain_country' => $domainArray[$domain]['locale'], + ]); + App::setLocale($domainArray[$domain]['locale']); + } + + return $next($request); + } +} diff --git a/bootstrap/app.php b/bootstrap/app.php index 0575e3d..55ba99d 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -13,6 +13,7 @@ return Application::configure(basePath: dirname(__DIR__)) ) ->withMiddleware(function (Middleware $middleware) { $middleware->web(append: [ + \App\Http\Middleware\DomainMiddleware::class, \Stefro\LaravelLangCountry\Middleware\LangCountrySession::class, \App\Http\Middleware\SetTimezone::class, ]); diff --git a/config/app.php b/config/app.php index 13fbf34..6303e83 100644 --- a/config/app.php +++ b/config/app.php @@ -15,6 +15,8 @@ return [ 'name' => env('APP_NAME', 'Laravel'), + 'domain_country' => 'de', + /* |-------------------------------------------------------------------------- | Application Environment diff --git a/lang/de.json b/lang/de.json index 6819db3..892f0b2 100644 --- a/lang/de.json +++ b/lang/de.json @@ -440,5 +440,22 @@ "Öffnen/RSVP": "", "Über den Dozenten": "", "Über den Kurs": "", - "Über uns": "" + "Über uns": "", + "Details": "", + "Die Endzeit muss nach der Startzeit liegen.": "", + "Startdatum": "", + "An welchem Tag beginnt das Event?": "", + "Um wie viel Uhr beginnt das Event?": "", + "Enddatum": "", + "An welchem Tag endet das Event?": "", + "Um wie viel Uhr endet das Event?": "", + "Datum": "", + "An welchem Tag findet das Event statt?": "", + "Uhrzeit": "", + "Um wie viel Uhr startet das Event?": "", + "Zeitzone": "", + "Wähle deine Zeitzone aus...": "", + "Zeitzone erfolgreich aktualisiert": "", + "Wähle deine Zeitzone...": "", + "Suche Zeitzone...": "" } \ No newline at end of file diff --git a/lang/en.json b/lang/en.json index d11ed5c..2ede6e0 100644 --- a/lang/en.json +++ b/lang/en.json @@ -440,5 +440,22 @@ "Öffnen/RSVP": "Open/RSVP", "Über den Dozenten": "About the lecturer", "Über den Kurs": "About the course", - "Über uns": "About us" + "Über uns": "About us", + "Details": "Details", + "Die Endzeit muss nach der Startzeit liegen.": "The end time must be after the start time.", + "Startdatum": "Start date", + "An welchem Tag beginnt das Event?": "On which day does the event start?", + "Um wie viel Uhr beginnt das Event?": "At what time does the event start?", + "Enddatum": "End date", + "An welchem Tag endet das Event?": "On which day does the event end?", + "Um wie viel Uhr endet das Event?": "At what time does the event end?", + "Datum": "Date", + "An welchem Tag findet das Event statt?": "On which day does the event take place?", + "Uhrzeit": "Time", + "Um wie viel Uhr startet das Event?": "At what time does the event start?", + "Zeitzone": "Timezone", + "Wähle deine Zeitzone aus...": "Select your timezone...", + "Zeitzone erfolgreich aktualisiert": "Timezone successfully updated", + "Wähle deine Zeitzone...": "Choose your timezone...", + "Suche Zeitzone...": "Search timezone..." } \ No newline at end of file diff --git a/lang/es.json b/lang/es.json index 1002a6d..b6c0f7c 100644 --- a/lang/es.json +++ b/lang/es.json @@ -439,5 +439,22 @@ "Öffnen/RSVP": "Abrir/RSVP", "Über den Dozenten": "Sobre el profesor", "Über den Kurs": "Sobre el curso", - "Über uns": "Sobre nosotros" + "Über uns": "Sobre nosotros", + "Details": "Detalles", + "Die Endzeit muss nach der Startzeit liegen.": "La hora de finalización debe ser posterior a la hora de inicio.", + "Startdatum": "Fecha de inicio", + "An welchem Tag beginnt das Event?": "¿En qué día comienza el evento?", + "Um wie viel Uhr beginnt das Event?": "¿A qué hora comienza el evento?", + "Enddatum": "Fecha de finalización", + "An welchem Tag endet das Event?": "¿En qué día termina el evento?", + "Um wie viel Uhr endet das Event?": "¿A qué hora termina el evento?", + "Datum": "Fecha", + "An welchem Tag findet das Event statt?": "¿En qué día se lleva a cabo el evento?", + "Uhrzeit": "Hora", + "Um wie viel Uhr startet das Event?": "¿A qué hora comienza el evento?", + "Zeitzone": "Zona horaria", + "Wähle deine Zeitzone aus...": "Selecciona tu zona horaria...", + "Zeitzone erfolgreich aktualisiert": "Zona horaria actualizada exitosamente", + "Wähle deine Zeitzone...": "Elige tu zona horaria...", + "Suche Zeitzone...": "Buscar zona horaria..." } \ No newline at end of file diff --git a/lang/nl.json b/lang/nl.json new file mode 100644 index 0000000..e901ff3 --- /dev/null +++ b/lang/nl.json @@ -0,0 +1,380 @@ +{ + "Login - Bitcoin Meetups": "Inloggen - Bitcoin Meetups", + "Logge dich ein, um auf dein Bitcoin Meetup Konto zuzugreifen und aan der Community teilzunehmen.": "Log in om toegang te krijgen tot je Bitcoin Meetup-account en deel te nemen aan de community.", + "Dashboard - Bitcoin Meetups": "Dashboard - Bitcoin Meetups", + "Verwalte deine Bitcoin Meetups, Events und Einstellungen in deinem persönlichen Dashboard.": "Beheer je Bitcoin Meetups, evenementen en instellingen in je persoonlijke dashboard.", + "Willkommen bei Bitcoin Meetups": "Welkom bij Bitcoin Meetups", + "Entdecke die Bitcoin Community in deiner Nähe. Finde lokale Meetups und vernetze dich mit Gleichgesinnten.": "Ontdek de Bitcoin-community in je buurt. Vind lokale Meetups en netwerk met gelijkgestemden.", + "Follow the Rabbit - Bitcoin Journey": "Follow the Rabbit - Bitcoin Journey", + "Starte deine Bitcoin-Reise und entdecke spannende Inhalte rund um Bitcoin und Blockchain.": "Start je Bitcoin-reis en ontdek spannende inhoud over Bitcoin en Blockchain.", + "Neue Stadt hinzufügen - Bitcoin Meetups": "Nieuwe stad toevoegen - Bitcoin Meetups", + "Füge eine neue Stadt hinzu, um Bitcoin Meetups in deiner Region zu organisieren.": "Voeg een nieuwe stad toe om Bitcoin Meetups in je regio te organiseren.", + "Stadt bearbeiten - Bitcoin Meetups": "Stad bewerken - Bitcoin Meetups", + "Aktualisiere die Informationen für Bitcoin Meetup Standorte in deiner Stadt.": "Werk de informatie bij voor Bitcoin Meetup-locaties in je stad.", + "Städteübersicht - Bitcoin Meetups": "Stedenoverzicht - Bitcoin Meetups", + "Durchsuche alle Städte mit aktiven Bitcoin Meetups und finde Events in deiner Nähe.": "Doorzoek alle steden met actieve Bitcoin Meetups en vind evenementen in je buurt.", + "Neuen Kurs erstellen - Bitcoin Education": "Nieuwe cursus maken - Bitcoin Education", + "Erstelle einen neuen Bitcoin-Bildungskurs und teile dein Wissen mit der Community.": "Maak een nieuwe Bitcoin-educatiecursus en deel je kennis met de community.", + "Kursevents bearbeiten - Bitcoin Education": "Cursusevenementen bewerken - Bitcoin Education", + "Verwalte die Termine und Details deiner Bitcoin-Bildungsveranstaltungen.": "Beheer de data en details van je Bitcoin-educatie-evenementen.", + "Kurs bearbeiten - Bitcoin Education": "Cursus bewerken - Bitcoin Education", + "Aktualisiere die Inhalte und Informationen deines Bitcoin-Bildungskurses.": "Werk de inhoud en informatie van je Bitcoin-educatiecursus bij.", + "Bitcoin Kurse - Übersicht": "Bitcoin Cursussen - Overzicht", + "Entdecke unsere vielfältigen Bitcoin-Bildungsangebote und Workshops.": "Ontdek onze diverse Bitcoin-educatie-aanbiedingen en workshops.", + "Bitcoin Bildung & Kurse": "Bitcoin Educatie & Cursussen", + "Lerne alles über Bitcoin - von den Grundlagen bis zu fortgeschrittenen Themen.": "Leer alles over Bitcoin - van de basis tot geavanceerde onderwerpen.", + "Dozent werden - Bitcoin Education": "Docent worden - Bitcoin Education", + "Werde Bitcoin-Dozent und teile dein Expertenwissen mit der Community.": "Word Bitcoin-docent en deel je expertise met de community.", + "Dozentenprofil bearbeiten": "Docentenprofiel bewerken", + "Aktualisiere dein Profil als Bitcoin-Dozent und deine Kursangebote.": "Werk je profiel als Bitcoin-docent en je cursusaanbiedingen bij.", + "Bitcoin Dozenten - Übersicht": "Bitcoin Docenten - Overzicht", + "Lerne unsere erfahrenen Bitcoin-Dozenten und ihre Expertise kennen.": "Leer onze ervaren Bitcoin-docenten en hun expertise kennen.", + "Bitcoin Meetup Events verwalten": "Bitcoin Meetup Evenementen beheren", + "Erstelle und bearbeite Bitcoin Meetup Events für deine Community.": "Maak en bewerk Bitcoin Meetup-evenementen voor je community.", + "Meetup bearbeiten - Bitcoin Events": "Meetup bewerken - Bitcoin Evenementen", + "Aktualisiere die Details und Informationen deines Bitcoin Meetups.": "Werk de details en informatie van je Bitcoin Meetup bij.", + "Bitcoin Meetups - Alle Events": "Bitcoin Meetups - Alle Evenementen", + "Finde alle aktuellen Bitcoin Meetups und Events in deiner Region.": "Vind alle huidige Bitcoin Meetups en evenementen in je regio.", + "Bitcoin Meetups - Community Events": "Bitcoin Meetups - Community Evenementen", + "Entdecke Bitcoin Community Events und vernetze dich mit Gleichgesinnten.": "Ontdek Bitcoin Community-evenementen en netwerk met gelijkgestemden.", + "Bitcoin Event Details": "Bitcoin Evenement Details", + "Alle Informationen zum ausgewählten Bitcoin Meetup Event.": "Alle informatie over het geselecteerde Bitcoin Meetup-evenement.", + "Bitcoin Meetups Karte": "Bitcoin Meetups Kaart", + "Finde Bitcoin Meetups in deiner Nähe mit unserer interaktiven Karte.": "Vind Bitcoin Meetups in je buurt met onze interactieve kaart.", + "Erscheinungsbild - Einstellungen": "Uiterlijk - Instellingen", + "Passe das Erscheinungsbild deines Bitcoin Meetup Profils an.": "Pas het uiterlijk van je Bitcoin Meetup-profiel aan.", + "Konto löschen - Bitcoin Meetups": "Account verwijderen - Bitcoin Meetups", + "Informationen zum Löschen deines Bitcoin Meetup Kontos.": "Informatie over het verwijderen van je Bitcoin Meetup-account.", + "Passwort ändern - Bitcoin Meetups": "Wachtwoord wijzigen - Bitcoin Meetups", + "Ändere dein Passwort für mehr Sicherheit deines Bitcoin Meetup Kontos.": "Wijzig je wachtwoord voor meer beveiliging van je Bitcoin Meetup-account.", + "Profil bearbeiten - Bitcoin Meetups": "Profiel bewerken - Bitcoin Meetups", + "Aktualisiere deine persönlichen Informationen und Profileinstellungen.": "Werk je persoonlijke informatie en profielinstellingen bij.", + "Neuen Veranstaltungsort erstellen": "Nieuwe locatie maken", + "Füge einen neuen Ort für Bitcoin Meetups und Events hinzu.": "Voeg een nieuwe locatie toe voor Bitcoin Meetups en evenementen.", + "Veranstaltungsort bearbeiten": "Locatie bewerken", + "Aktualisiere die Details eines Bitcoin Meetup Veranstaltungsortes.": "Werk de details van een Bitcoin Meetup-locatie bij.", + "Veranstaltungsorte - Übersicht": "Locaties - Overzicht", + "Finde alle Veranstaltungsorte für Bitcoin Meetups und Events.": "Vind alle locaties voor Bitcoin Meetups en evenementen.", + "Willkommen": "Welkom", + "Toximalistisches Infotainment für bullische Bitcoiner.": "Toximalistisch infotainment voor bullische Bitcoiners.", + "no location set": "geen locatie ingesteld", + "BooksForPlebs": "BooksForPlebs", + "Lokale Buchausleihe für Bitcoin-Meetups.": "Lokale boekuitlening voor Bitcoin-Meetups.", + "Bitcoin - Rabbit Hole": "Bitcoin - Rabbit Hole", + "Dies ist ein großartiger Überblick über die Bitcoin-Kaninchenhöhle mit Zugängen zu Bereichen, die Bitcoin umfasst. Jedes Thema hat seine eigene Kaninchenhöhle, die durch Infografiken auf einfache und verständliche Weise visualisiert wird, mit QR-Codes, die zu erklärenden Videos und Artikeln führen. Viel Spaß auf Ihrer Entdeckungsreise!": "Dit is een geweldig overzicht van de Bitcoin-rabbithole met toegang tot gebieden die Bitcoin omvatten. Elk onderwerp heeft zijn eigen rabbithole, gevisualiseerd door infographics op een eenvoudige en begrijpelijke manier, met QR-codes die leiden naar uitleggende video's en artikelen. Veel plezier op je ontdekkingstocht!", + "Saved.": "Opgeslagen.", + "Sprache wählen": "Taal selecteren", + "Dashboard": "Dashboard", + "Search": "Zoeken", + "Repository": "Repository", + "Documentation": "Documentatie", + "Settings": "Instellingen", + "Log Out": "Uitloggen", + "Platform": "Platform", + "Success!": "Succes!", + "Copied into clipboard": "Gekopieerd naar klembord", + "App": "App", + "Meetups": "Meetups", + "Karte": "Kaart", + "Kurse": "Cursussen", + "Dozenten": "Docenten", + "Diverses": "Diversen", + "Orte/Gebiete": "Locaties/Gebieden", + "Städte/Gebiete": "Steden/Gebieden", + "Veranstaltungsorte": "Locaties", + "Sprache wechseln": "Taal wisselen", + "Land": "Land", + "Nächster Termin": "Volgende afspraak", + "Zusagen": "Bevestigingen", + "Vielleicht": "Misschien", + "Telegram": "Telegram", + "Website": "Website", + "Twitter": "Twitter", + "Matrix": "Matrix", + "Nostr": "Nostr", + "Simplex": "Simplex", + "Signal": "Signal", + "Details": "Details", + "Profile": "Profiel", + "Password": "Wachtwoord", + "Appearance": "Uiterlijk", + "Unauthorized": "Ongeautoriseerd", + "Payment Required": "Betaling vereist", + "Forbidden": "Verboden", + "Not Found": "Niet gevonden", + "Page Expired": "Pagina verlopen", + "Too Many Requests": "Te veel verzoeken", + "Server Error": "Serverfout", + "Service Unavailable": "Service niet beschikbaar", + "Confirm password": "Bevestig wachtwoord", + "This is a secure area of the application. Please confirm your password before continuing.": "Dit is een beveiligd gebied van de applicatie. Bevestig je wachtwoord voordat je doorgaat.", + "Confirm": "Bevestigen", + "A reset link will be sent if the account exists.": "Er wordt een resetlink verzonden als het account bestaat.", + "Forgot password": "Wachtwoord vergeten", + "Enter your email to receive a password reset link": "Voer je e-mail in om een wachtwoordherstel-link te ontvangen", + "Email Address": "E-mailadres", + "Email password reset link": "E-mail wachtwoordherstel-link", + "Or, return to": "Of, terug naar", + "log in": "inloggen", + "Willkommen zurück": "Welkom terug", + "Log in mit Nostr": "Inloggen met Nostr", + "Copy": "Kopiëren", + "Click to connect": "Klik om te verbinden", + "Create an account": "Account aanmaken", + "Enter your details below to create your account": "Voer je gegevens hieronder in om je account aan te maken", + "Name": "Naam", + "Full name": "Volledige naam", + "Email address": "E-mailadres", + "Create account": "Account aanmaken", + "Already have an account?": "Heb je al een account?", + "Log in": "Inloggen", + "Reset password": "Wachtwoord herstellen", + "Please enter your new password below": "Voer je nieuwe wachtwoord hieronder in", + "Email": "E-mail", + "Please verify your email address by clicking on the link we just emailed to you.": "Verifieer je e-mailadres door op de link te klikken die we net naar je hebben gemaild.", + "A new verification link has been sent to the email address you provided during registration.": "Een nieuwe verificatielink is verzonden naar het e-mailadres dat je tijdens de registratie hebt opgegeven.", + "Resend verification email": "Verificatie-e-mail opnieuw verzenden", + "Log out": "Uitloggen", + "City successfully created!": "Stad succesvol aangemaakt!", + "Create City": "Stad aanmaken", + "Basic Information": "Basisinformatie", + "Country": "Land", + "Select a country": "Selecteer een land", + "Coordinates": "Coördinaten", + "Latitude": "Breedtegraad", + "Longitude": "Lengtegraad", + "Demographics": "Demografie", + "Population": "Bevolking", + "Population Date": "Bevolkingsdatum", + "Cancel": "Annuleren", + "City successfully updated!": "Stad succesvol bijgewerkt!", + "Edit City": "Stad bewerken", + "Update City": "Stad bijwerken", + "Cities": "Steden", + "Search cities...": "Zoek steden...", + "Created By": "Aangemaakt door", + "Actions": "Acties", + "Edit": "Bewerken", + "Wähle dein Land...": "Selecteer je land...", + "Suche dein Land...": "Zoek je land...", + "Die Endzeit muss nach der Startzeit liegen.": "De eindtijd moet na de starttijd liggen.", + "Event erfolgreich aktualisiert!": "Evenement succesvol bijgewerkt!", + "Event erfolgreich erstellt!": "Evenement succesvol aangemaakt!", + "Event erfolgreich gelöscht!": "Evenement succesvol verwijderd!", + "Event bearbeiten": "Evenement bewerken", + "Neues Event erstellen": "Nieuw evenement aanmaken", + "Event Details": "Evenement Details", + "Startdatum": "Startdatum", + "An welchem Tag beginnt das Event?": "Op welke dag begint het evenement?", + "Startzeit": "Starttijd", + "Um wie viel Uhr beginnt das Event?": "Hoe laat begint het evenement?", + "Enddatum": "Einddatum", + "An welchem Tag endet das Event?": "Op welke dag eindigt het evenement?", + "Endzeit": "Eindtijd", + "Um wie viel Uhr endet das Event?": "Hoe laat eindigt het evenement?", + "Veranstaltungsort": "Locatie", + "Ort hinzufügen": "Locatie toevoegen", + "Veranstaltungsort auswählen": "Locatie selecteren", + "Suche nach Ort...": "Zoek naar locatie...", + "Wo findet das Event statt?": "Waar vindt het evenement plaats?", + "Link": "Link", + "Link zu weiteren Informationen oder zur Anmeldung": "Link naar meer informatie of registratie", + "Abbrechen": "Annuleren", + "Bist du sicher, dass du dieses Event löschen möchtest?": "Weet je zeker dat je dit evenement wilt verwijderen?", + "Event löschen": "Evenement verwijderen", + "Event aktualisieren": "Evenement bijwerken", + "Event erstellen": "Evenement aanmaken", + "Veranstaltungsort hinzufügen": "Locatie toevoegen", + "Füge einen neuen Veranstaltungsort zur Datenbank hinzu.": "Voeg een nieuwe locatie toe aan de database.", + "z.B. Bitcoin Zentrum München": "bijv. Bitcoin Centrum Amsterdam", + "Stadt": "Stad", + "Stadt auswählen": "Stad selecteren", + "Suche passende Stadt...": "Zoek passende stad...", + "Straße": "Straat", + "z.B. Hauptstraße 1": "bijv. Hoofdstraat 1", + "Ort erstellen": "Locatie aanmaken", + "Kurs erfolgreich erstellt!": "Cursus succesvol aangemaakt!", + "Neuen Kurs erstellen": "Nieuwe cursus aanmaken", + "Grundlegende Informationen": "Basisinformatie", + "Der Anzeigename für diesen Kurs": "De weergavenaam voor deze cursus", + "Dozent": "Docent", + "Dozent auswählen": "Docent selecteren", + "Suche passenden Dozenten...": "Zoek passende docent...", + "Der Dozent, der diesen Kurs leitet": "De docent die deze cursus leidt", + "Beschreibung": "Beschrijving", + "Ausführliche Beschreibung des Kurses": "Gedetailleerde beschrijving van de cursus", + "Kurs erstellen": "Cursus aanmaken", + "Kurs erfolgreich aktualisiert!": "Cursus succesvol bijgewerkt!", + "Kurs bearbeiten": "Cursus bewerken", + "ID": "ID", + "System-generierte ID (nur lesbar)": "Systeemgegenereerde ID (alleen-lezen)", + "Systeminformationen": "Systeemgegevens", + "Erstellt von": "Aangemaakt door", + "Unbekannt": "Onbekend", + "Ersteller des Kurses": "Maker van de cursus", + "Erstellt am": "Aangemaakt op", + "Wann dieser Kurs erstellt wurde": "Wanneer deze cursus werd aangemaakt", + "Aktualisiert am": "Bijgewerkt op", + "Letzte Änderungszeit": "Laatste wijzigingstijd", + "Kurs aktualisieren": "Cursus bijwerken", + "Suche nach Kursen...": "Zoek naar cursussen...", + "Neuer Kurs": "Nieuwe cursus", + "Aktionen": "Acties", + "Bearbeiten": "Bewerken", + "Über den Kurs": "Over de cursus", + "Über den Dozenten": "Over de docent", + "Kommende Veranstaltungen": "Aankomende evenementen", + "Anmeldungen": "Registraties", + "Details/Anmelden": "Details/Aanmelden", + "Meine nächsten Meetup Termine": "Mijn volgende Meetup-afspraken", + "Keine bevorstehenden Termine": "Geen aankomende afspraken", + "Meine Meetups": "Mijn Meetups", + "Meetup hinzufügen...": "Meetup toevoegen...", + "Meetup suchen...": "Meetup zoeken...", + "Meetup entfernen?": "Meetup verwijderen?", + "Möchtest du": "Wil je", + "aus deinen Meetups entfernen?": "uit je Meetups verwijderen?", + "Du kannst es jederzeit wieder hinzufügen.": "Je kunt het altijd weer toevoegen.", + "Entfernen": "Verwijderen", + "Keine Meetups zugeordnet": "Geen Meetups toegewezen", + "Dozent erfolgreich erstellt!": "Docent succesvol aangemaakt!", + "Neuen Dozenten erstellen": "Nieuwe docent aanmaken", + "Vollständiger Name des Dozenten": "Volledige naam van de docent", + "Untertitel": "Ondertitel", + "Kurze Berufsbezeichnung oder Rolle": "Korte beroepsaanduiding of rol", + "Status": "Status", + "Ist dieser Dozent aktiv?": "Is deze docent actief?", + "Einführung": "Introductie", + "Kurze Vorstellung (wird auf Kurs-Seiten angezeigt)": "Korte introductie (wordt getoond op cursuspagina's)", + "Ausführliche Beschreibung und Biografie": "Gedetailleerde beschrijving en biografie", + "Links & Soziale Medien": "Links & Sociale media", + "Webseite": "Website", + "Persönliche Webseite oder Portfolio": "Persoonlijke website of portfolio", + "Twitter Benutzername": "Twitter-gebruikersnaam", + "Twitter-Handle ohne @ Symbol": "Twitter-handle zonder @ symbool", + "Nostr öffentlicher Schlüssel": "Nostr publieke sleutel", + "Zahlungsinformationen": "Betaalinformatie", + "Lightning Adresse": "Lightning-adres", + "Lightning-Adresse für Zahlungen": "Lightning-adres voor betalingen", + "LNURL": "LNURL", + "LNURL für Lightning-Zahlungen": "LNURL voor Lightning-betalingen", + "Node ID": "Node ID", + "Lightning Node ID": "Lightning Node ID", + "PayNym": "PayNym", + "PayNym für Bitcoin-Zahlungen": "PayNym voor Bitcoin-betalingen", + "Dozenten erstellen": "Docenten aanmaken", + "Dozent erfolgreich aktualisiert!": "Docent succesvol bijgewerkt!", + "Dozent bearbeiten": "Docent bewerken", + "Ersteller des Dozenten": "Maker van de docent", + "Wann dieser Dozent erstellt wurde": "Wanneer deze docent werd aangemaakt", + "Dozent aktualisieren": "Docent bijwerken", + "Suche nach Dozenten...": "Zoek naar docenten...", + "Dozenten anlegen": "Docenten aanleggen", + "Links": "Links", + "Aktiv": "Actief", + "Inaktiv": "Inactief", + "weitere Termine": "meer afspraken", + "Datum": "Datum", + "An welchem Tag findet das Event statt?": "Op welke dag vindt het evenement plaats?", + "Uhrzeit": "Tijd", + "Um wie viel Uhr startet das Event?": "Hoe laat start het evenement?", + "Ort": "Locatie", + "z.B. Café Mustermann, Hauptstr. 1": "bijv. Café Voorbeeld, Hoofdstr. 1", + "Beschreibe das Event...": "Beschrijf het evenement...", + "Details über das Event": "Details over het evenement", + "Link zu weiteren Informationen": "Link naar meer informatie", + "Meetup erfolgreich erstellt!": "Meetup succesvol aangemaakt!", + "Neues Meetup erstellen": "Nieuwe Meetup aanmaken", + "Der Anzeigename für dieses Meetup": "De weergavenaam voor deze Meetup", + "Stadt hinzufügen": "Stad toevoegen", + "Die nächstgrößte Stadt oder Ort": "De dichtstbijzijnde stad of plaats", + "Auf Karte sichtbar": "Zichtbaar op kaart", + "Soll dieses Meetup auf der Karte angezeigt werden?": "Moet deze Meetup op de kaart worden weergegeven?", + "Kurze Beschreibung des Meetups": "Korte beschrijving van de Meetup", + "Offizielle Webseite oder Landingpage": "Officiële website of landingpagina", + "Telegram Link": "Telegram-link", + "Link zur Telegram-Gruppe oder zum Kanal": "Link naar Telegram-groep of kanaal", + "Matrix Gruppe": "Matrix-groep", + "Matrix-Raum Bezeichner oder Link": "Matrix-ruim-identifier of link", + "Nostr öffentlicher Schlüssel oder Bezeichner": "Nostr publieke sleutel of identifier", + "SimpleX": "SimpleX", + "SimpleX Chat Kontaktinformationen": "SimpleX-chatcontactinformatie", + "Signal Kontakt- of Gruppeninformationen": "Signalcontact- of groepsinformatie", + "Zusätzliche Informationen": "Aanvullende informatie", + "Gemeinschaft": "Gemeenschap", + "Keine": "Geen", + "Gemeinschafts- oder Organisationsname": "Gemeenschaps- of organisatienaam", + "Meetup erstellen": "Meetup aanmaken", + "Füge eine neue Stadt zur Datenbank hinzu.": "Voeg een nieuwe stad toe aan de database.", + "Stadtname": "Stadsnaam", + "z.B. Berlin": "bijv. Amsterdam", + "Land auswählen": "Land selecteren", + "Breitengrad": "Breedtegraad", + "Längengrad": "Lengtegraad", + "Stadt erstellen": "Stad aanmaken", + "Meetup erfolgreich aktualisiert!": "Meetup succesvol bijgewerkt!", + "Meetup bearbeiten": "Meetup bewerken", + "Ersteller des Meetups": "Maker van de Meetup", + "Wann dieses Meetup erstellt wurde": "Wanneer deze Meetup werd aangemaakt", + "Meetup aktualisieren": "Meetup bijwerken", + "Kalender-Stream-URL kopieren": "Kalender-stream-URL kopiëren", + "Suche nach Meetups...": "Zoek naar Meetups...", + "Mehr Informationen": "Meer informatie", + "Teilnahme": "Deelname", + "Du bist nicht eingloggt und musst deshalb den Namen selbst eintippen.": "Je bent niet ingelogd en moet daarom de naam zelf intypen.", + "Dein Name": "Je naam", + "Name eingeben": "Naam invoeren", + "Ich komme": "Ik kom", + "Absagen": "Afmelden", + "Zurück zum Meetup": "Terug naar Meetup", + "Über uns": "Over ons", + "Kontakt & Links": "Contact & Links", + "Standort": "Locatie", + "Zoom = STRG+Scroll": "Zoom = CTRL+Scroll", + "Öffnen/RSVP": "Openen/RSVP", + "Update the appearance settings for your account": "Werk de uiterlijk-instellingen bij voor je account", + "Light": "Licht", + "Dark": "Donker", + "System": "Systeem", + "Delete account": "Account verwijderen", + "Delete your account and all of its resources": "Verwijder je account en al zijn bronnen", + "Are you sure you want to delete your account?": "Weet je zeker dat je je account wilt verwijderen?", + "Once your account is deleted, all of its resources and data will be permanently deleted. Please enter your password to confirm you would like to permanently delete your account.": "Zodra je account wordt verwijderd, worden al zijn bronnen en gegevens permanent verwijderd. Voer je wachtwoord in om te bevestigen dat je je account permanent wilt verwijderen.", + "Update password": "Wachtwoord bijwerken", + "Ensure your account is using a long, random password to stay secure": "Zorg ervoor dat je account een lang, willekeurig wachtwoord gebruikt om veilig te blijven", + "Current password": "Huidige wachtwoord", + "New password": "Nieuw wachtwoord", + "Confirm Password": "Bevestig wachtwoord", + "Save": "Opslaan", + "Update your name and email address": "Werk je naam en e-mailadres bij", + "Your email address is unverified.": "Je e-mailadres is niet geverifieerd.", + "Click here to re-send the verification email.": "Klik hier om de verificatie-e-mail opnieuw te verzenden.", + "A new verification link has been sent to your email address.": "Een nieuwe verificatielink is verzonden naar je e-mailadres.", + "Zeitzone": "Tijdzone", + "Wähle deine Zeitzone aus...": "Selecteer je tijdzone...", + "Spracheinstellungen": "Taalinstellingen", + "Wähle deine Sprache aus...": "Selecteer je taal...", + "Zeitzone erfolgreich aktualisiert": "Tijdzone succesvol bijgewerkt", + "Wähle deine Zeitzone...": "Selecteer je tijdzone...", + "Suche Zeitzone...": "Zoek tijdzone...", + "Venue successfully created!": "Locatie succesvol aangemaakt!", + "Create Venue": "Locatie aanmaken", + "Venue Information": "Locatie-informatie", + "City": "Stad", + "Select a city": "Selecteer een stad", + "Street": "Straat", + "Venue successfully updated!": "Locatie succesvol bijgewerkt!", + "Edit Venue": "Locatie bewerken", + "Update Venue": "Locatie bijwerken", + "Venues": "Locaties", + "Search venues...": "Zoek locaties...", + "Bitcoin Meetups": "Bitcoin Meetups", + "Alle Meetups anzeigen": "Alle Meetups weergeven", + "Kartenansicht öffnen": "Kartenweergave openen", + "Login": "Inloggen", + "Verbinde dich mit Bitcoinern in deiner Nähe": "Verbind je met Bitcoiners in je buurt", + "Finde deine lokale Community": "Vind je lokale community", + "Manage your profile and account settings": "Beheer je profiel- en accountinstellingen", + "Logge dich ein, um auf dein Bitcoin Meetup Konto zuzugreifen und an der Community teilzunehmen.": "Log in om toegang te krijgen tot je Bitcoin Meetup-account en deel te nemen aan de community.", + "Signal Kontakt- oder Gruppeninformationen": "Signal contact- of groepsinformatie" +} diff --git a/lang/pt.json b/lang/pt.json new file mode 100644 index 0000000..921b7c9 --- /dev/null +++ b/lang/pt.json @@ -0,0 +1,378 @@ +{ + "Login - Bitcoin Meetups": "Login - Bitcoin Meetups", + "Logge dich ein, um auf dein Bitcoin Meetup Konto zuzugreifen und an der Community teilzunehmen.": "Faça login para acessar sua conta do Bitcoin Meetup e participar da comunidade.", + "Dashboard - Bitcoin Meetups": "Painel - Bitcoin Meetups", + "Verwalte deine Bitcoin Meetups, Events und Einstellungen in deinem persönlichen Dashboard.": "Gerencie seus Bitcoin Meetups, eventos e configurações em seu painel pessoal.", + "Willkommen bei Bitcoin Meetups": "Bem-vindo aos Bitcoin Meetups", + "Entdecke die Bitcoin Community in deiner Nähe. Finde lokale Meetups und vernetze dich mit Gleichgesinnten.": "Descubra a comunidade Bitcoin perto de você. Encontre meetups locais e conecte-se com pessoas de ideias semelhantes.", + "Follow the Rabbit - Bitcoin Journey": "Follow the Rabbit - Jornada Bitcoin", + "Starte deine Bitcoin-Reise und entdecke spannende Inhalte rund um Bitcoin und Blockchain.": "Inicie sua jornada Bitcoin e descubra conteúdos fascinantes sobre Bitcoin e Blockchain.", + "Neue Stadt hinzufügen - Bitcoin Meetups": "Adicionar nova cidade - Bitcoin Meetups", + "Füge eine neue Stadt hinzu, um Bitcoin Meetups in deiner Region zu organisieren.": "Adicione uma nova cidade para organizar Bitcoin Meetups em sua região.", + "Stadt bearbeiten - Bitcoin Meetups": "Editar cidade - Bitcoin Meetups", + "Aktualisiere die Informationen für Bitcoin Meetup Standorte in deiner Stadt.": "Atualize as informações para locais de Bitcoin Meetup em sua cidade.", + "Städteübersicht - Bitcoin Meetups": "Visão geral das cidades - Bitcoin Meetups", + "Durchsuche alle Städte mit aktiven Bitcoin Meetups und finde Events in deiner Nähe.": "Pesquise todas as cidades com Bitcoin Meetups ativos e encontre eventos perto de você.", + "Neuen Kurs erstellen - Bitcoin Education": "Criar novo curso - Educação Bitcoin", + "Erstelle einen neuen Bitcoin-Bildungskurs und teile dein Wissen mit der Community.": "Crie um novo curso de educação Bitcoin e compartilhe seu conhecimento com a comunidade.", + "Kursevents bearbeiten - Bitcoin Education": "Editar eventos do curso - Educação Bitcoin", + "Verwalte die Termine und Details deiner Bitcoin-Bildungsveranstaltungen.": "Gerencie as datas e detalhes de seus eventos educacionais Bitcoin.", + "Kurs bearbeiten - Bitcoin Education": "Editar curso - Educação Bitcoin", + "Aktualisiere die Inhalte und Informationen deines Bitcoin-Bildungskurses.": "Atualize os conteúdos e informações do seu curso educacional Bitcoin.", + "Bitcoin Kurse - Übersicht": "Cursos Bitcoin - Visão geral", + "Entdecke unsere vielfältigen Bitcoin-Bildungsangebote und Workshops.": "Descubra nossas diversas ofertas educacionais Bitcoin e workshops.", + "Bitcoin Bildung & Kurse": "Educação & Cursos Bitcoin", + "Lerne alles über Bitcoin - von den Grundlagen bis zu fortgeschrittenen Themen.": "Aprenda tudo sobre Bitcoin - dos fundamentos aos tópicos avançados.", + "Dozent werden - Bitcoin Education": "Torne-se professor - Educação Bitcoin", + "Werde Bitcoin-Dozent und teile dein Expertenwissen mit der Community.": "Torne-se um professor de Bitcoin e compartilhe seu conhecimento especializado com a comunidade.", + "Dozentenprofil bearbeiten": "Editar perfil do professor", + "Aktualisiere dein Profil als Bitcoin-Dozent und deine Kursangebote.": "Atualize seu perfil como professor de Bitcoin e suas ofertas de cursos.", + "Bitcoin Dozenten - Übersicht": "Professores Bitcoin - Visão geral", + "Lerne unsere erfahrenen Bitcoin-Dozenten und ihre Expertise kennen.": "Conheça nossos professores experientes de Bitcoin e sua expertise.", + "Bitcoin Meetup Events verwalten": "Gerenciar eventos Bitcoin Meetup", + "Erstelle und bearbeite Bitcoin Meetup Events für deine Community.": "Crie e edite eventos de Bitcoin Meetup para sua comunidade.", + "Meetup bearbeiten - Bitcoin Events": "Editar Meetup - Eventos Bitcoin", + "Aktualisiere die Details und Informationen deines Bitcoin Meetups.": "Atualize os detalhes e informações do seu Bitcoin Meetup.", + "Bitcoin Meetups - Alle Events": "Bitcoin Meetups - Todos os eventos", + "Finde alle aktuellen Bitcoin Meetups und Events in deiner Region.": "Encontre todos os atuais Bitcoin Meetups e eventos em sua região.", + "Bitcoin Meetups - Community Events": "Bitcoin Meetups - Eventos da comunidade", + "Entdecke Bitcoin Community Events und vernetze dich mit Gleichgesinnten.": "Descubra eventos da comunidade Bitcoin e conecte-se com pessoas de ideias semelhantes.", + "Bitcoin Event Details": "Detalhes do evento Bitcoin", + "Alle Informationen zum ausgewählten Bitcoin Meetup Event.": "Todas as informações sobre o evento selecionado de Bitcoin Meetup.", + "Bitcoin Meetups Karte": "Mapa de Bitcoin Meetups", + "Finde Bitcoin Meetups in deiner Nähe mit unserer interaktiven Karte.": "Encontre Bitcoin Meetups perto de você com nosso mapa interativo.", + "Erscheinungsbild - Einstellungen": "Aparência - Configurações", + "Passe das Erscheinungsbild deines Bitcoin Meetup Profils an.": "Personalize a aparência do seu perfil de Bitcoin Meetup.", + "Konto löschen - Bitcoin Meetups": "Excluir conta - Bitcoin Meetups", + "Informationen zum Löschen deines Bitcoin Meetup Kontos.": "Informações sobre como excluir sua conta de Bitcoin Meetup.", + "Passwort ändern - Bitcoin Meetups": "Alterar senha - Bitcoin Meetups", + "Ändere dein Passwort für mehr Sicherheit deines Bitcoin Meetup Kontos.": "Altere sua senha para maior segurança da sua conta de Bitcoin Meetup.", + "Profil bearbeiten - Bitcoin Meetups": "Editar perfil - Bitcoin Meetups", + "Aktualisiere deine persönlichen Informationen und Profileinstellungen.": "Atualize suas informações pessoais e configurações de perfil.", + "Neuen Veranstaltungsort erstellen": "Criar novo local de evento", + "Füge einen neuen Ort für Bitcoin Meetups und Events hinzu.": "Adicione um novo local para Bitcoin Meetups e eventos.", + "Veranstaltungsort bearbeiten": "Editar local de evento", + "Aktualisiere die Details eines Bitcoin Meetup Veranstaltungsortes.": "Atualize os detalhes de um local de evento de Bitcoin Meetup.", + "Veranstaltungsorte - Übersicht": "Locais de eventos - Visão geral", + "Finde alle Veranstaltungsorte für Bitcoin Meetups und Events.": "Encontre todos os locais para Bitcoin Meetups e eventos.", + "Willkommen": "Bem-vindo", + "Toximalistisches Infotainment für bullische Bitcoiner.": "Entretenimento informativo toximalista para bitcoiners bullish.", + "no location set": "nenhum local definido", + "BooksForPlebs": "BooksForPlebs", + "Lokale Buchausleihe für Bitcoin-Meetups.": "Empréstimo local de livros para Bitcoin Meetups.", + "Bitcoin - Rabbit Hole": "Bitcoin - Toca do Coelho", + "Dies ist ein großartiger Überblick über die Bitcoin-Kaninchenhöhle mit Zugängen zu Bereichen, die Bitcoin umfasst. Jedes Thema hat seine eigene Kaninchenhöhle, die durch Infografiken auf einfache und verständliche Weise visualisiert wird, mit QR-Codes, die zu erklärenden Videos und Artikeln führen. Viel Spaß auf Ihrer Entdeckungsreise!": "Este é uma grande visão geral do abismo do coelho Bitcoin com acesso a áreas que abrangem Bitcoin. Cada tópico tem seu próprio abismo do coelho, visualizado de forma simples e compreensível através de infográficos, com códigos QR que levam a vídeos e artigos explicativos. Divirta-se em sua jornada de descoberta!", + "Saved.": "Salvo.", + "Sprache wählen": "Escolher idioma", + "Dashboard": "Painel", + "Search": "Buscar", + "Repository": "Repositório", + "Documentation": "Documentação", + "Settings": "Configurações", + "Log Out": "Sair", + "Platform": "Plataforma", + "Success!": "Sucesso!", + "Copied into clipboard": "Copiado para a área de transferência", + "App": "App", + "Meetups": "Meetups", + "Karte": "Mapa", + "Kurse": "Cursos", + "Dozenten": "Professores", + "Diverses": "Diversos", + "Orte/Gebiete": "Locais/Áreas", + "Städte/Gebiete": "Cidades/Áreas", + "Veranstaltungsorte": "Locais de Eventos", + "Sprache wechseln": "Alterar idioma", + "Land": "País", + "Nächster Termin": "Próxima data", + "Zusagen": "Confirmações", + "Vielleicht": "Talvez", + "Telegram": "Telegram", + "Website": "Website", + "Twitter": "Twitter", + "Matrix": "Matrix", + "Nostr": "Nostr", + "Simplex": "Simplex", + "Signal": "Signal", + "Details": "Detalhes", + "Profile": "Perfil", + "Password": "Senha", + "Appearance": "Aparência", + "Unauthorized": "Não autorizado", + "Payment Required": "Pagamento obrigatório", + "Forbidden": "Proibido", + "Not Found": "Não encontrado", + "Page Expired": "Página expirada", + "Too Many Requests": "Muitas solicitações", + "Server Error": "Erro do servidor", + "Service Unavailable": "Serviço indisponível", + "Confirm password": "Confirmar senha", + "This is a secure area of the application. Please confirm your password before continuing.": "Esta é uma área segura da aplicação. Por favor, confirme sua senha antes de continuar.", + "Confirm": "Confirmar", + "A reset link will be sent if the account exists.": "Um link de redefinição será enviado se a conta existir.", + "Forgot password": "Esqueceu a senha", + "Enter your email to receive a password reset link": "Digite seu e-mail para receber um link de redefinição de senha", + "Email Address": "Endereço de e-mail", + "Email password reset link": "Enviar link de redefinição de senha por e-mail", + "Or, return to": "Ou, retornar para", + "log in": "fazer login", + "Willkommen zurück": "Bem-vindo de volta", + "Log in mit Nostr": "Fazer login com Nostr", + "Copy": "Copiar", + "Click to connect": "Clique para conectar", + "Create an account": "Criar uma conta", + "Enter your details below to create your account": "Digite seus detalhes abaixo para criar sua conta", + "Name": "Nome", + "Full name": "Nome completo", + "Email address": "Endereço de e-mail", + "Create account": "Criar conta", + "Already have an account?": "Já tem uma conta?", + "Log in": "Fazer login", + "Reset password": "Redefinir senha", + "Please enter your new password below": "Por favor, digite sua nova senha abaixo", + "Email": "E-mail", + "Please verify your email address by clicking on the link we just emailed to you.": "Por favor, verifique seu endereço de e-mail clicando no link que acabamos de enviar para você.", + "A new verification link has been sent to the email address you provided during registration.": "Um novo link de verificação foi enviado para o endereço de e-mail que você forneceu durante o registro.", + "Resend verification email": "Reenviar e-mail de verificação", + "Log out": "Sair", + "City successfully created!": "Cidade criada com sucesso!", + "Create City": "Criar Cidade", + "Basic Information": "Informações básicas", + "Country": "País", + "Select a country": "Selecione um país", + "Coordinates": "Coordenadas", + "Latitude": "Latitude", + "Longitude": "Longitude", + "Demographics": "Demografia", + "Population": "População", + "Population Date": "Data da população", + "Cancel": "Cancelar", + "City successfully updated!": "Cidade atualizada com sucesso!", + "Edit City": "Editar Cidade", + "Update City": "Atualizar Cidade", + "Cities": "Cidades", + "Search cities...": "Buscar cidades...", + "Created By": "Criado por", + "Actions": "Ações", + "Edit": "Editar", + "Wähle dein Land...": "Escolha seu país...", + "Suche dein Land...": "Busque seu país...", + "Die Endzeit muss nach der Startzeit liegen.": "A hora de fim deve ser após a hora de início.", + "Event erfolgreich aktualisiert!": "Evento atualizado com sucesso!", + "Event erfolgreich erstellt!": "Evento criado com sucesso!", + "Event erfolgreich gelöscht!": "Evento deletado com sucesso!", + "Event bearbeiten": "Editar evento", + "Neues Event erstellen": "Criar novo evento", + "Event Details": "Detalhes do evento", + "Startdatum": "Data de início", + "An welchem Tag beginnt das Event?": "Em que dia começa o evento?", + "Startzeit": "Hora de início", + "Um wie viel Uhr beginnt das Event?": "A que hora começa o evento?", + "Enddatum": "Data de fim", + "An welchem Tag endet das Event?": "Em que dia termina o evento?", + "Endzeit": "Hora de fim", + "Um wie viel Uhr endet das Event?": "A que hora termina o evento?", + "Veranstaltungsort": "Local do evento", + "Ort hinzufügen": "Adicionar local", + "Veranstaltungsort auswählen": "Selecionar local do evento", + "Suche nach Ort...": "Buscar por local...", + "Wo findet das Event statt?": "Onde acontece o evento?", + "Link": "Link", + "Link zu weiteren Informationen oder zur Anmeldung": "Link para mais informações ou inscrição", + "Abbrechen": "Cancelar", + "Bist du sicher, dass du dieses Event löschen möchtest?": "Tem certeza de que deseja deletar este evento?", + "Event löschen": "Deletar evento", + "Event aktualisieren": "Atualizar evento", + "Event erstellen": "Criar evento", + "Veranstaltungsort hinzufügen": "Adicionar local do evento", + "Füge einen neuen Veranstaltungsort zur Datenbank hinzu.": "Adicione um novo local do evento ao banco de dados.", + "z.B. Bitcoin Zentrum München": "Ex.: Centro Bitcoin München", + "Stadt": "Cidade", + "Stadt auswählen": "Selecionar cidade", + "Suche passende Stadt...": "Buscar cidade adequada...", + "Straße": "Rua", + "z.B. Hauptstraße 1": "Ex.: Rua Principal 1", + "Ort erstellen": "Criar local", + "Kurs erfolgreich erstellt!": "Curso criado com sucesso!", + "Neuen Kurs erstellen": "Criar novo curso", + "Grundlegende Informationen": "Informações básicas", + "Der Anzeigename für diesen Kurs": "O nome de exibição para este curso", + "Dozent": "Professor", + "Dozent auswählen": "Selecionar professor", + "Suche passenden Dozenten...": "Buscar professor adequado...", + "Der Dozent, der diesen Kurs leitet": "O professor que conduz este curso", + "Beschreibung": "Descrição", + "Ausführliche Beschreibung des Kurses": "Descrição detalhada do curso", + "Kurs erstellen": "Criar curso", + "Kurs erfolgreich aktualisiert!": "Curso atualizado com sucesso!", + "Kurs bearbeiten": "Editar curso", + "ID": "ID", + "System-generierte ID (nur lesbar)": "ID gerada pelo sistema (somente leitura)", + "Systeminformationen": "Informações do sistema", + "Erstellt von": "Criado por", + "Unbekannt": "Desconhecido", + "Ersteller des Kurses": "Criador do curso", + "Erstellt am": "Criado em", + "Wann dieser Kurs erstellt wurde": "Quando este curso foi criado", + "Aktualisiert am": "Atualizado em", + "Letzte Änderungszeit": "Última alteração", + "Kurs aktualisieren": "Atualizar curso", + "Suche nach Kursen...": "Buscar cursos...", + "Neuer Kurs": "Novo curso", + "Aktionen": "Ações", + "Bearbeiten": "Editar", + "Über den Kurs": "Sobre o curso", + "Über den Dozenten": "Sobre o professor", + "Kommende Veranstaltungen": "Próximos eventos", + "Anmeldungen": "Inscrições", + "Details/Anmelden": "Detalhes/Inscrever-se", + "Meine nächsten Meetup Termine": "Minhas próximas datas de Meetup", + "Keine bevorstehenden Termine": "Nenhuma data futura", + "Meine Meetups": "Meus Meetups", + "Meetup hinzufügen...": "Adicionar Meetup...", + "Meetup suchen...": "Buscar Meetup...", + "Meetup entfernen?": "Remover Meetup?", + "Möchtest du": "Você deseja", + "aus deinen Meetups entfernen?": "remover dos seus Meetups?", + "Du kannst es jederzeit wieder hinzufügen.": "Você pode adicioná-lo novamente a qualquer momento.", + "Entfernen": "Remover", + "Keine Meetups zugeordnet": "Nenhum Meetup associado", + "Dozent erfolgreich erstellt!": "Professor criado com sucesso!", + "Neuen Dozenten erstellen": "Criar novo professor", + "Vollständiger Name des Dozenten": "Nome completo do professor", + "Untertitel": "Subtítulo", + "Kurze Berufsbezeichnung oder Rolle": "Breve título profissional ou papel", + "Status": "Status", + "Ist dieser Dozent aktiv?": "Este professor está ativo?", + "Einführung": "Introdução", + "Kurze Vorstellung (wird auf Kurs-Seiten angezeigt)": "Apresentação curta (exibida nas páginas do curso)", + "Ausführliche Beschreibung und Biografie": "Descrição detalhada e biografia", + "Links & Soziale Medien": "Links e mídias sociais", + "Webseite": "Website", + "Persönliche Webseite oder Portfolio": "Website pessoal ou portfólio", + "Twitter Benutzername": "Nome de usuário no Twitter", + "Twitter-Handle ohne @ Symbol": "Handle do Twitter sem o símbolo @", + "Nostr öffentlicher Schlüssel": "Chave pública Nostr", + "Zahlungsinformationen": "Informações de pagamento", + "Lightning Adresse": "Endereço Lightning", + "Lightning-Adresse für Zahlungen": "Endereço Lightning para pagamentos", + "LNURL": "LNURL", + "LNURL für Lightning-Zahlungen": "LNURL para pagamentos Lightning", + "Node ID": "Node ID", + "Lightning Node ID": "Lightning Node ID", + "PayNym": "PayNym", + "PayNym für Bitcoin-Zahlungen": "PayNym para pagamentos Bitcoin", + "Dozenten erstellen": "Criar professores", + "Dozent erfolgreich aktualisiert!": "Professor atualizado com sucesso!", + "Dozent bearbeiten": "Editar professor", + "Ersteller des Dozenten": "Criador do professor", + "Wann dieser Dozent erstellt wurde": "Quando este professor foi criado", + "Dozent aktualisieren": "Atualizar professor", + "Suche nach Dozenten...": "Buscar professores...", + "Dozenten anlegen": "Criar professores", + "Links": "Links", + "Aktiv": "Ativo", + "Inaktiv": "Inativo", + "weitere Termine": "mais datas", + "Datum": "Data", + "An welchem Tag findet das Event statt?": "Em que dia ocorre o evento?", + "Uhrzeit": "Hora", + "Um wie viel Uhr startet das Event?": "A que hora começa o evento?", + "Ort": "Local", + "z.B. Café Mustermann, Hauptstr. 1": "Ex.: Café Mustermann, Rua Principal 1", + "Beschreibe das Event...": "Descreva o evento...", + "Details über das Event": "Detalhes sobre o evento", + "Link zu weiteren Informationen": "Link para mais informações", + "Meetup erfolgreich erstellt!": "Meetup criado com sucesso!", + "Neues Meetup erstellen": "Criar novo Meetup", + "Der Anzeigename für dieses Meetup": "O nome de exibição para este Meetup", + "Stadt hinzufügen": "Adicionar cidade", + "Die nächstgrößte Stadt oder Ort": "A próxima maior cidade ou local", + "Auf Karte sichtbar": "Visível no mapa", + "Soll dieses Meetup auf der Karte angezeigt werden?": "Este Meetup deve ser exibido no mapa?", + "Kurze Beschreibung des Meetups": "Descrição curta do Meetup", + "Offizielle Webseite oder Landingpage": "Página oficial ou landing page", + "Telegram Link": "Link do Telegram", + "Link zur Telegram-Gruppe oder zum Kanal": "Link para o grupo ou canal do Telegram", + "Matrix Gruppe": "Grupo Matrix", + "Matrix-Raum Bezeichner oder Link": "Identificador de sala Matrix ou link", + "Nostr öffentlicher Schlüssel oder Bezeichner": "Chave pública Nostr ou identificador", + "SimpleX": "SimpleX", + "SimpleX Chat Kontaktinformationen": "Informações de contato do SimpleX Chat", + "Signal Kontakt- oder Gruppeninformationen": "Informações de contato ou grupo do Signal", + "Zusätzliche Informationen": "Informações adicionais", + "Gemeinschaft": "Comunidade", + "Keine": "Nenhuma", + "Gemeinschafts- oder Organisationsname": "Nome da comunidade ou organização", + "Meetup erstellen": "Criar Meetup", + "Füge eine neue Stadt zur Datenbank hinzu.": "Adicione uma nova cidade ao banco de dados.", + "Stadtname": "Nome da cidade", + "z.B. Berlin": "Ex.: Berlin", + "Land auswählen": "Selecionar país", + "Breitengrad": "Latitude", + "Längengrad": "Longitude", + "Stadt erstellen": "Criar cidade", + "Meetup erfolgreich aktualisiert!": "Meetup atualizado com sucesso!", + "Meetup bearbeiten": "Editar Meetup", + "Ersteller des Meetups": "Criador do Meetup", + "Wann dieses Meetup erstellt wurde": "Quando este Meetup foi criado", + "Meetup aktualisieren": "Atualizar Meetup", + "Kalender-Stream-URL kopieren": "Copiar URL do stream de calendário", + "Suche nach Meetups...": "Buscar Meetups...", + "Mehr Informationen": "Mais informações", + "Teilnahme": "Participação", + "Du bist nicht eingloggt und musst deshalb den Namen selbst eintippen.": "Você não está logado e precisa digitar o nome manualmente.", + "Dein Name": "Seu nome", + "Name eingeben": "Digite o nome", + "Ich komme": "Eu vou", + "Absagen": "Desistir", + "Zurück zum Meetup": "Voltar ao Meetup", + "Über uns": "Sobre nós", + "Kontakt & Links": "Contato e links", + "Standort": "Localização", + "Zoom = STRG+Scroll": "Zoom = CTRL+Scroll", + "Öffnen/RSVP": "Abrir/RSVP", + "Update the appearance settings for your account": "Atualizar as configurações de aparência da sua conta", + "Light": "Claro", + "Dark": "Escuro", + "System": "Sistema", + "Delete account": "Deletar conta", + "Delete your account and all of its resources": "Deletar sua conta e todos os seus recursos", + "Are you sure you want to delete your account?": "Tem certeza de que deseja deletar sua conta?", + "Once your account is deleted, all of its resources and data will be permanently deleted. Please enter your password to confirm you would like to permanently delete your account.": "Depois que sua conta for deletada, todos os seus recursos e dados serão permanentemente deletados. Por favor, digite sua senha para confirmar que deseja permanetemente deletar sua conta.", + "Update password": "Atualizar senha", + "Ensure your account is using a long, random password to stay secure": "Garanta que sua conta esteja usando uma senha longa e aleatória para permanecer segura", + "Current password": "Senha atual", + "New password": "Nova senha", + "Confirm Password": "Confirmar senha", + "Save": "Salvar", + "Update your name and email address": "Atualize seu nome e endereço de e-mail", + "Your email address is unverified.": "Seu endereço de e-mail não foi verificado.", + "Click here to re-send the verification email.": "Clique aqui para reenviar o e-mail de verificação.", + "A new verification link has been sent to your email address.": "Um novo link de verificação foi enviado para seu endereço de e-mail.", + "Zeitzone": "Fuso horário", + "Wähle deine Zeitzone aus...": "Escolha seu fuso horário...", + "Spracheinstellungen": "Configurações de idioma", + "Wähle deine Sprache aus...": "Escolha seu idioma...", + "Zeitzone erfolgreich aktualisiert": "Fuso horário atualizado com sucesso", + "Wähle deine Zeitzone...": "Escolha seu fuso horário...", + "Suche Zeitzone...": "Buscar fuso horário...", + "Venue successfully created!": "Local criado com sucesso!", + "Create Venue": "Criar Local", + "Venue Information": "Informações do Local", + "City": "Cidade", + "Select a city": "Selecionar uma cidade", + "Street": "Rua", + "Venue successfully updated!": "Local atualizado com sucesso!", + "Edit Venue": "Editar Local", + "Update Venue": "Atualizar Local", + "Venues": "Locais", + "Search venues...": "Buscar locais...", + "Bitcoin Meetups": "Bitcoin Meetups", + "Alle Meetups anzeigen": "Mostrar todos os Meetups", + "Kartenansicht öffnen": "Abrir vista do mapa", + "Login": "Login", + "Verbinde dich mit Bitcoinern in deiner Nähe": "Conecte-se com bitcoiners perto de você", + "Finde deine lokale Community": "Encontre sua comunidade local", + "Manage your profile and account settings": "Gerencie seu perfil e configurações de conta" +} diff --git a/public/img/domains/lat.png b/public/img/domains/lat.png new file mode 100644 index 0000000000000000000000000000000000000000..f1c459eeab772ce3fc16c8c3b61c7b04da8f1274 GIT binary patch literal 5321 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

ZazPR%^C{QP!yUlI-UlBS8`^SY#Gf9 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 literal 0 HcmV?d00001 diff --git a/resources/views/components/app-logo-icon.blade.php b/resources/views/components/app-logo-icon.blade.php index 7f0a613..47ffe96 100644 --- a/resources/views/components/app-logo-icon.blade.php +++ b/resources/views/components/app-logo-icon.blade.php @@ -1,16 +1,45 @@ - - - +@php + $langCountry = session('lang_country', 'de-DE'); + $domainImage = asset('img/domains/'.$langCountry.'.jpg'); + if (!file_exists(public_path('img/domains/'.$langCountry.'.jpg'))) { + $langCountry = 'de-DE'; + } + $southAmericanCountries = [ + 'ar-AR', // Argentina + 'bo-BO', // Bolivia + 'br-BR', // Brazil + 'cl-CL', // Chile + 'co-CO', // Colombia + 'ec-EC', // Ecuador + 'gy-GY', // Guyana + 'py-PY', // Paraguay + 'pe-PE', // Peru + 'sr-SR', // Suriname + 'uy-UY', // Uruguay + 've-VE', // Venezuela + ]; + if (in_array($langCountry, $southAmericanCountries, true)) { + $domainImage = asset('img/domains/lat.png'); + } +@endphp + +@if($langCountry === 'de-DE') + + + + + + - - - - + +@else + {{ $langCountry }} +@endif diff --git a/resources/views/components/einundzwanzig/language-selector.blade.php b/resources/views/components/einundzwanzig/language-selector.blade.php index 71faf10..39dcecc 100644 --- a/resources/views/components/einundzwanzig/language-selector.blade.php +++ b/resources/views/components/einundzwanzig/language-selector.blade.php @@ -10,11 +10,25 @@ @php - $languages = [ + // Scan lang folder for available languages + $availableLanguages = collect(glob(base_path('lang/*.json'))) + ->map(fn($file) => pathinfo($file, PATHINFO_FILENAME)) + ->toArray(); + + $allLanguages = [ 'de' => ['name' => 'Deutsch', 'countries' => ['de-DE', 'de-AT', 'de-CH']], 'en' => ['name' => 'English', 'countries' => ['en-GB', 'en-US', 'en-AU', 'en-CA']], 'es' => ['name' => 'Español', 'countries' => ['es-ES', 'es-CL', 'es-CO']], + 'nl' => ['name' => 'Nederlands', 'countries' => ['nl-NL', 'nl-BE']], + 'pt' => ['name' => 'Português', 'countries' => ['pt-PT']], ]; + + // Filter languages based on available JSON files and allowed languages + $languages = array_filter($allLanguages, function($data, $key) use ($availableLanguages) { + return in_array($key, $availableLanguages) && + count(array_intersect($data['countries'], config('lang-country.allowed'))) > 0; + }, ARRAY_FILTER_USE_BOTH); + $currentLangCountry = session('lang_country', config('lang-country.fallback')); @endphp diff --git a/resources/views/livewire/auth/confirm-password.blade.php b/resources/views/livewire/auth/confirm-password.blade.php index fb75ef3..11e1ad5 100644 --- a/resources/views/livewire/auth/confirm-password.blade.php +++ b/resources/views/livewire/auth/confirm-password.blade.php @@ -32,7 +32,7 @@ class extends Component { session(['auth.password_confirmed_at' => time()]); - $this->redirectIntended(default: route('dashboard', ['country' => str(session('lang_country', 'de'))->after('-')->lower()], absolute: false), navigate: true); + $this->redirectIntended(default: route('dashboard', ['country' => str(session('lang_country', config('app.domain_country')))->after('-')->lower()], absolute: false), navigate: true); } }; ?> diff --git a/resources/views/livewire/auth/login.blade.php b/resources/views/livewire/auth/login.blade.php index 76e2fd2..6d7c70c 100644 --- a/resources/views/livewire/auth/login.blade.php +++ b/resources/views/livewire/auth/login.blade.php @@ -36,9 +36,12 @@ class extends Component { public ?string $url = null; public ?string $lnurl = null; public ?string $qrCode = null; + public string $currentLangCountry = 'de-DE'; public function mount(): void { + $this->currentLangCountry = session('lang_country'); + // Nur beim ersten Mount initialisieren if ($this->k1 === null) { $this->k1 = bin2hex(str()->random(32)); @@ -64,7 +67,7 @@ class extends Component { Auth::loginUsingId($user->id); Session::regenerate(); $this->redirectIntended( - default: route('dashboard', ['country' => str(session('lang_country', 'de'))->after('-')->lower()], absolute: false), + default: route('dashboard', ['country' => str(session('lang_country', config('app.domain_country')))->after('-')->lower()], absolute: false), navigate: true, ); return; @@ -85,9 +88,12 @@ class extends Component { RateLimiter::clear($this->throttleKey()); Session::regenerate(); + session([ + 'lang_country' => $this->currentLangCountry, + ]); $this->redirectIntended( - default: route('dashboard', ['country' => str(session('lang_country', 'de'))->after('-')->lower()], absolute: false), + default: route('dashboard', ['country' => str(session('lang_country', config('app.domain_country')))->after('-')->lower()], absolute: false), navigate: true ); } @@ -134,8 +140,12 @@ class extends Component { \App\Models\User::find(1) ->notify(new ModelCreatedNotification($user, 'users')); auth()->login($user); + Session::regenerate(); + session([ + 'lang_country' => $this->currentLangCountry, + ]); - return to_route('dashboard', ['country' => str(session('lang_country', 'de'))->after('-')->lower()]); + return to_route('dashboard', ['country' => str(session('lang_country', config('app.domain_country')))->after('-')->lower()]); } return true; diff --git a/resources/views/livewire/auth/register.blade.php b/resources/views/livewire/auth/register.blade.php index 795e595..83e8ab1 100644 --- a/resources/views/livewire/auth/register.blade.php +++ b/resources/views/livewire/auth/register.blade.php @@ -35,7 +35,7 @@ class extends Component { Auth::login($user); - $this->redirectIntended(route('dashboard', ['country' => str(session('lang_country', 'de'))->after('-')->lower()],absolute: false), navigate: true); + $this->redirectIntended(route('dashboard', ['country' => str(session('lang_country', config('app.domain_country')))->after('-')->lower()],absolute: false), navigate: true); } }; ?> diff --git a/resources/views/livewire/auth/verify-email.blade.php b/resources/views/livewire/auth/verify-email.blade.php index d363368..6a0ea49 100644 --- a/resources/views/livewire/auth/verify-email.blade.php +++ b/resources/views/livewire/auth/verify-email.blade.php @@ -17,7 +17,7 @@ class extends Component { public function sendVerification(): void { if (Auth::user()->hasVerifiedEmail()) { - $this->redirectIntended(default: route('dashboard', ['country' => str(session('lang_country', 'de'))->after('-')->lower()],absolute: false), navigate: true); + $this->redirectIntended(default: route('dashboard', ['country' => str(session('lang_country', config('app.domain_country')))->after('-')->lower()],absolute: false), navigate: true); return; } diff --git a/resources/views/livewire/cities/index.blade.php b/resources/views/livewire/cities/index.blade.php index 3e247ee..c4de172 100644 --- a/resources/views/livewire/cities/index.blade.php +++ b/resources/views/livewire/cities/index.blade.php @@ -17,7 +17,7 @@ class extends Component { public function mount(): void { - $this->country = request()->route('country'); + $this->country = request()->route('country', config('app.domain_country')); } public function with(): array diff --git a/resources/views/livewire/country/chooser.blade.php b/resources/views/livewire/country/chooser.blade.php index 9802699..fd742e3 100644 --- a/resources/views/livewire/country/chooser.blade.php +++ b/resources/views/livewire/country/chooser.blade.php @@ -9,7 +9,7 @@ new class extends Component { public function mount(): void { - $this->currentCountry = request()->route('country', 'de'); + $this->currentCountry = request()->route('country', config('app.domain_country')); $this->currentRouteName = request()->route()->getName(); $this->currentRouteParams = request()->route()->parameters(); } diff --git a/resources/views/livewire/courses/create-edit-events.blade.php b/resources/views/livewire/courses/create-edit-events.blade.php index 959f66b..20afdc1 100644 --- a/resources/views/livewire/courses/create-edit-events.blade.php +++ b/resources/views/livewire/courses/create-edit-events.blade.php @@ -37,7 +37,7 @@ class extends Component { public function mount(): void { - $this->country = request()->route('country'); + $this->country = request()->route('country', config('app.domain_country')); $timezone = auth()->user()->timezone ?? 'Europe/Berlin'; if ($this->event) { diff --git a/resources/views/livewire/courses/index.blade.php b/resources/views/livewire/courses/index.blade.php index e3f1d36..5df937f 100644 --- a/resources/views/livewire/courses/index.blade.php +++ b/resources/views/livewire/courses/index.blade.php @@ -17,7 +17,7 @@ class extends Component { public function mount(): void { - $this->country = request()->route('country'); + $this->country = request()->route('country', config('app.domain_country')); } public function with(): array diff --git a/resources/views/livewire/courses/landingpage.blade.php b/resources/views/livewire/courses/landingpage.blade.php index 76f892a..7b42676 100644 --- a/resources/views/livewire/courses/landingpage.blade.php +++ b/resources/views/livewire/courses/landingpage.blade.php @@ -17,7 +17,7 @@ class extends Component { public function mount(): void { - $this->country = request()->route('country'); + $this->country = request()->route('country', config('app.domain_country')); } public function with(): array diff --git a/resources/views/livewire/dashboard.blade.php b/resources/views/livewire/dashboard.blade.php index fb04b03..0fe61d1 100644 --- a/resources/views/livewire/dashboard.blade.php +++ b/resources/views/livewire/dashboard.blade.php @@ -18,7 +18,7 @@ class extends Component { public function mount(): void { - $this->country = request()->route('country'); + $this->country = request()->route('country', config('app.domain_country')); } public function addMeetup() diff --git a/resources/views/livewire/lecturers/index.blade.php b/resources/views/livewire/lecturers/index.blade.php index 17269e6..768aae8 100644 --- a/resources/views/livewire/lecturers/index.blade.php +++ b/resources/views/livewire/lecturers/index.blade.php @@ -17,7 +17,7 @@ class extends Component { public function mount(): void { - $this->country = request()->route('country'); + $this->country = request()->route('country', config('app.domain_country')); } public function with(): array diff --git a/resources/views/livewire/meetups/create-edit-events.blade.php b/resources/views/livewire/meetups/create-edit-events.blade.php index 5c6ff78..736b8ca 100644 --- a/resources/views/livewire/meetups/create-edit-events.blade.php +++ b/resources/views/livewire/meetups/create-edit-events.blade.php @@ -31,7 +31,7 @@ class extends Component { public function mount(): void { - $this->country = request()->route('country'); + $this->country = request()->route('country', config('app.domain_country')); $timezone = auth()->user()->timezone ?? 'Europe/Berlin'; if ($this->event) { diff --git a/resources/views/livewire/meetups/index.blade.php b/resources/views/livewire/meetups/index.blade.php index 83ffa64..2eff688 100644 --- a/resources/views/livewire/meetups/index.blade.php +++ b/resources/views/livewire/meetups/index.blade.php @@ -17,7 +17,7 @@ class extends Component { public function mount(): void { - $this->country = request()->route('country'); + $this->country = request()->route('country', config('app.domain_country')); } public function with(): array diff --git a/resources/views/livewire/meetups/landingpage-event.blade.php b/resources/views/livewire/meetups/landingpage-event.blade.php index fe5bfe5..317cb43 100644 --- a/resources/views/livewire/meetups/landingpage-event.blade.php +++ b/resources/views/livewire/meetups/landingpage-event.blade.php @@ -25,7 +25,7 @@ class extends Component { public function mount(): void { - $this->country = request()->route('country'); + $this->country = request()->route('country', config('app.domain_country')); $this->name = auth()->user()->name ?? ''; $this->loadAttendees(); } diff --git a/resources/views/livewire/meetups/landingpage.blade.php b/resources/views/livewire/meetups/landingpage.blade.php index 196d10b..a1176af 100644 --- a/resources/views/livewire/meetups/landingpage.blade.php +++ b/resources/views/livewire/meetups/landingpage.blade.php @@ -17,7 +17,7 @@ class extends Component { public function mount(): void { - $this->country = request()->route('country'); + $this->country = request()->route('country', config('app.domain_country')); } public function with(): array diff --git a/resources/views/livewire/meetups/map.blade.php b/resources/views/livewire/meetups/map.blade.php index 29bd86f..0d1d563 100644 --- a/resources/views/livewire/meetups/map.blade.php +++ b/resources/views/livewire/meetups/map.blade.php @@ -16,7 +16,7 @@ class extends Component { public function mount(): void { - $this->country = request()->route('country'); + $this->country = request()->route('country', config('app.domain_country')); $geoCountry = \Lwwcas\LaravelCountries\Models\Country::query() ->where('iso_alpha_2', str($this->country)->upper()) ->first() diff --git a/resources/views/livewire/settings/profile.blade.php b/resources/views/livewire/settings/profile.blade.php index 776a445..bf92acb 100644 --- a/resources/views/livewire/settings/profile.blade.php +++ b/resources/views/livewire/settings/profile.blade.php @@ -64,7 +64,7 @@ class extends Component { $user = Auth::user(); if ($user->hasVerifiedEmail()) { - $this->redirectIntended(default: route('dashboard', ['country' => str(session('lang_country', 'de'))->after('-')->lower()],absolute: false)); + $this->redirectIntended(default: route('dashboard', ['country' => str(session('lang_country', config('app.domain_country')))->after('-')->lower()],absolute: false)); return; } @@ -127,11 +127,22 @@ class extends Component {

@php - $languages = [ + // Scan lang folder for available languages + $availableLanguages = collect(glob(base_path('lang/*.json'))) + ->map(fn($file) => pathinfo($file, PATHINFO_FILENAME)) + ->toArray(); + + $allLanguages = [ 'de' => ['name' => 'Deutsch', 'countries' => ['de-DE', 'de-AT', 'de-CH']], 'en' => ['name' => 'English', 'countries' => ['en-GB', 'en-US', 'en-AU', 'en-CA']], 'es' => ['name' => 'Español', 'countries' => ['es-ES', 'es-CL', 'es-CO']], + 'nl' => ['name' => 'Nederlands', 'countries' => ['nl-NL', 'nl-BE']], + 'pt' => ['name' => 'Português', 'countries' => ['pt-PT', 'pt-BR']], ]; + + // Filter languages based on available JSON files + $languages = array_filter($allLanguages, fn($key) => in_array($key, $availableLanguages), ARRAY_FILTER_USE_KEY); + $currentLangCountry = session('lang_country', config('lang-country.fallback')); @endphp diff --git a/resources/views/livewire/venues/index.blade.php b/resources/views/livewire/venues/index.blade.php index 6e0035d..663a0af 100644 --- a/resources/views/livewire/venues/index.blade.php +++ b/resources/views/livewire/venues/index.blade.php @@ -17,7 +17,7 @@ class extends Component { public function mount(): void { - $this->country = request()->route('country'); + $this->country = request()->route('country', config('app.domain_country')); } public function with(): array diff --git a/resources/views/livewire/welcome.blade.php b/resources/views/livewire/welcome.blade.php index 8f07f12..75c3e4a 100644 --- a/resources/views/livewire/welcome.blade.php +++ b/resources/views/livewire/welcome.blade.php @@ -13,12 +13,12 @@ class extends Component { public function goToMeetups(): void { - $this->redirect(route('meetups.index', ['country' => str(session('lang_country', 'de'))->after('-')->lower()]), navigate: true); + $this->redirect(route('meetups.index', ['country' => str(session('lang_country', config('app.domain_country')))->after('-')->lower()]), navigate: true); } public function goToMap(): void { - $this->redirect(route('meetups.map', ['country' => str(session('lang_country', 'de'))->after('-')->lower()]), navigate: true); + $this->redirect(route('meetups.map', ['country' => str(session('lang_country', config('app.domain_country')))->after('-')->lower()]), navigate: true); } }; ?> @@ -60,7 +60,7 @@ class extends Component { {{ __('Kartenansicht öffnen') }} - {{ __('Login') }} diff --git a/routes/web.php b/routes/web.php index 247b1ff..1d4dc23 100644 --- a/routes/web.php +++ b/routes/web.php @@ -48,6 +48,12 @@ Route::middleware(['auth']) return redirect('/de/dashboard'); // Zu /de weiterleiten }); +Route::middleware([]) + ->prefix('/{country:code?}') + ->group(function () { + Volt::route('dashboard', 'dashboard')->name('dashboard'); + }); + Route::middleware([]) ->prefix('/{country:code}') ->group(function () { @@ -83,7 +89,6 @@ Route::middleware([]) Route::middleware(['auth']) ->prefix('/{country:code}') ->group(function () { - Volt::route('dashboard', 'dashboard')->name('dashboard'); Volt::route('meetup-create', 'meetups.create')->name('meetups.create'); Volt::route('meetup-edit/{meetup}', 'meetups.edit')->name('meetups.edit'); Volt::route('meetup/{meetup}/events/create', 'meetups.create-edit-events')->name('meetups.events.create');